vitest 0.0.34 → 0.0.38
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.gh.md +17 -4
- package/dist/chunk-4OVO6RD6.js +1 -0
- package/dist/chunk-CUG6SVUZ.js +1 -0
- package/dist/chunk-F27UALKJ.js +1 -0
- package/dist/chunk-XPSQDVUG.js +1 -0
- package/dist/global-CKRMAXWF.js +1 -0
- package/dist/happy-dom-RNJZR3YC.js +1 -0
- package/dist/index.d.ts +73 -6
- package/dist/index.js +1 -4
- package/dist/jsdom-6QAZGE6T.js +1 -0
- package/dist/node/cli.d.ts +5 -1
- package/dist/node/cli.js +7 -86
- package/dist/node/entry.d.ts +1 -1
- package/dist/node/entry.js +19 -12
- package/dist/{types.d.ts → types-d3253f2d.d.ts} +72 -21
- package/package.json +9 -4
- package/dist/constants.d.ts +0 -4
- package/dist/constants.js +0 -24
- package/dist/context.d.ts +0 -2
- package/dist/context.js +0 -4
- package/dist/integrations/chai/index.d.ts +0 -3
- package/dist/integrations/chai/index.js +0 -3
- package/dist/integrations/chai/jest-expect.d.ts +0 -2
- package/dist/integrations/chai/jest-expect.js +0 -67
- package/dist/integrations/chai/setup.d.ts +0 -2
- package/dist/integrations/chai/setup.js +0 -11
- package/dist/integrations/chai/snapshot/index.d.ts +0 -8
- package/dist/integrations/chai/snapshot/index.js +0 -27
- package/dist/integrations/chai/snapshot/manager.d.ts +0 -30
- package/dist/integrations/chai/snapshot/manager.js +0 -77
- package/dist/integrations/chai/snapshot/utils/jest-config-helper.d.ts +0 -3
- package/dist/integrations/chai/snapshot/utils/jest-config-helper.js +0 -39
- package/dist/integrations/chai/snapshot/utils/jest-reporters-lite.d.ts +0 -2
- package/dist/integrations/chai/snapshot/utils/jest-reporters-lite.js +0 -71
- package/dist/integrations/chai/snapshot/utils/jest-test-result-helper.d.ts +0 -6
- package/dist/integrations/chai/snapshot/utils/jest-test-result-helper.js +0 -66
- package/dist/integrations/chai/snapshot/utils/types.d.ts +0 -29
- package/dist/integrations/chai/snapshot/utils/types.js +0 -1
- package/dist/integrations/chai/types.d.ts +0 -3
- package/dist/integrations/chai/types.js +0 -1
- package/dist/integrations/global.d.ts +0 -1
- package/dist/integrations/global.js +0 -8
- package/dist/integrations/jsdom/index.d.ts +0 -5
- package/dist/integrations/jsdom/index.js +0 -21
- package/dist/integrations/jsdom/keys.d.ts +0 -1
- package/dist/integrations/jsdom/keys.js +0 -220
- package/dist/integrations/sinon.d.ts +0 -3
- package/dist/integrations/sinon.js +0 -5
- package/dist/node/node.d.ts +0 -23
- package/dist/node/node.js +0 -161
- package/dist/reporters/default.d.ts +0 -24
- package/dist/reporters/default.js +0 -149
- package/dist/reporters/error.d.ts +0 -9
- package/dist/reporters/error.js +0 -182
- package/dist/run/index.d.ts +0 -8
- package/dist/run/index.js +0 -274
- package/dist/suite.d.ts +0 -56
- package/dist/suite.js +0 -142
- package/dist/types.js +0 -1
- package/dist/utils/hook.d.ts +0 -5
- package/dist/utils/hook.js +0 -14
package/README.gh.md
CHANGED
|
@@ -17,7 +17,7 @@ A blazing fast unit test framework powered by Vite.
|
|
|
17
17
|
|
|
18
18
|
> ⚠️ **DISCLAIMER**: Vitest is still in development and not stable yet. It's not recommended to use it in production.
|
|
19
19
|
|
|
20
|
-
> Vitest requires Vite v2.7
|
|
20
|
+
> Vitest requires Vite v2.7 and Node v16
|
|
21
21
|
|
|
22
22
|
[**Join the Discord!**](https://discord.com/invite/2zYZNngd7y)
|
|
23
23
|
|
|
@@ -117,7 +117,7 @@ To get TypeScript working with the global APIs, add `vitest/global` to the `type
|
|
|
117
117
|
|
|
118
118
|
## Browser Mocking
|
|
119
119
|
|
|
120
|
-
Pass `--
|
|
120
|
+
Pass `--dom` option in CLI to enable browser mocking. Or the `dom` flag in the config.
|
|
121
121
|
|
|
122
122
|
```ts
|
|
123
123
|
// vite.config.ts
|
|
@@ -125,7 +125,20 @@ import { defineConfig } from 'vite'
|
|
|
125
125
|
|
|
126
126
|
export default defineConfig({
|
|
127
127
|
test: {
|
|
128
|
-
|
|
128
|
+
dom: true
|
|
129
|
+
}
|
|
130
|
+
})
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Vitest by default uses [jsdom](https://github.com/jsdom/jsdom) for mocking, but it also support [happy-dom](https://github.com/capricorn86/happy-dom), a faster alternative to jsdom. You can configure it with:
|
|
134
|
+
|
|
135
|
+
```ts
|
|
136
|
+
// vite.config.ts
|
|
137
|
+
import { defineConfig } from 'vite'
|
|
138
|
+
|
|
139
|
+
export default defineConfig({
|
|
140
|
+
test: {
|
|
141
|
+
dom: 'happy-dom'
|
|
129
142
|
}
|
|
130
143
|
})
|
|
131
144
|
```
|
|
@@ -161,7 +174,7 @@ For convenience, we also provide a shorthand for passing `--coverage` option to
|
|
|
161
174
|
$ vitest --coverage
|
|
162
175
|
```
|
|
163
176
|
|
|
164
|
-
For more configuration
|
|
177
|
+
For more configuration available, please refer to [c8](https://github.com/bcoe/c8)'s documentation.
|
|
165
178
|
|
|
166
179
|
## Filtering
|
|
167
180
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as k,b as F,f as d}from"./chunk-XPSQDVUG.js";d();var O=["**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}"],R=["**/node_modules/**","**/dist/**"],G=["suite","test","describe","it","chai","expect","assert","sinon","spy","mock","stub","beforeAll","afterAll","beforeEach","afterEach"],C=5e3;d();d();var g={suites:[],currentSuite:null};var y=h("");function s(){return g.currentSuite||y}function x(t,r=()=>{},u){let c=[],i=[],e={name:t,mode:u,hooks:{beforeAll:[],afterAll:[],beforeEach:[],afterEach:[]}},n=j((f,p,a,T)=>{c.push({name:f,mode:a,concurrent:T,suite:{},state:a!=="run"&&a!=="only"?a:void 0,fn:p})}),o={name:t,mode:u,test:n,collect:A,clear:E,on:l};function l(f,...p){e.hooks[f].push(...p)}function E(){c.length=0,i.length=0}async function A(f){i.length=0,r&&await r(n);let p=[...i,...c],a=F(k({},e),{tasks:p,file:f});return p.forEach(T=>{T.suite=a,f&&(T.file=f)}),a}return g.currentSuite=o,g.suites.push(o),o}function b(t){return{timeout:t??C}}function j(t){function r(n,o){t(n,o,"run")}r.concurrent=u,r.skip=c,r.only=i,r.todo=e;function u(n,o,l){t(n,o,"run",b(l))}u.skip=(n,o,l)=>t(n,o,"skip",b(l)),u.only=(n,o,l)=>t(n,o,"only",b(l)),u.todo=e;function c(n,o){t(n,o,"skip")}c.concurrent=u.skip;function i(n,o){t(n,o,"only")}i.concurrent=u.only;function e(n){t(n,()=>{},"todo")}return e.concurrent=e,r}var M=function(){function t(e,n){return s().test(e,n)}function r(e,n,o){return s().test.concurrent(e,n,o)}r.skip=(e,n,o)=>s().test.concurrent.skip(e,n,o),r.only=(e,n,o)=>s().test.concurrent.only(e,n,o),r.todo=e=>s().test.concurrent.todo(e);function u(e,n){return s().test.skip(e,n)}u.concurrent=(e,n,o)=>s().test.skip.concurrent(e,n,o);function c(e,n){return s().test.only(e,n)}c.concurrent=(e,n,o)=>s().test.only.concurrent(e,n,o);function i(e){return s().test.todo(e)}return i.concurrent=e=>s().test.todo.concurrent(e),t.concurrent=r,t.skip=u,t.only=c,t.todo=i,t}();function h(t,r){return x(t,r,"run")}h.skip=(t,r)=>x(t,r,"skip");h.only=(t,r)=>x(t,r,"only");h.todo=t=>x(t,void 0,"todo");var H=h,I=M,P=t=>s().on("beforeAll",t),Q=t=>s().on("afterAll",t),_=t=>s().on("beforeEach",t),z=t=>s().on("afterEach",t);function D(){g.suites.length=0,y.clear(),g.currentSuite=y}export{g as a,O as b,R as c,G as d,y as e,M as f,h as g,H as h,I as i,P as j,Q as k,_ as l,z as m,D as n};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{e as r,f as a,g as s,h as l,i as c,j as d,k as u,l as p,m as f,n as m}from"./chunk-4OVO6RD6.js";import{d as i,f as e}from"./chunk-XPSQDVUG.js";var T={};i(T,{afterAll:()=>u,afterEach:()=>f,assert:()=>g,beforeAll:()=>d,beforeEach:()=>p,chai:()=>x,clearContext:()=>m,defaultSuite:()=>r,describe:()=>l,expect:()=>C,it:()=>c,mock:()=>b,should:()=>v,sinon:()=>t,spy:()=>k,stub:()=>S,suite:()=>s,test:()=>a});e();e();e();import x from"chai";import{assert as g,should as v,expect as C}from"chai";e();import t from"sinon";var{mock:b,spy:k,stub:S}=t;t.fn=t.spy;export{x as a,g as b,v as c,C as d,t as e,b as f,k as g,S as h,T as i};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{f as e}from"./chunk-XPSQDVUG.js";e();var t=["DOMException","URL","URLSearchParams","EventTarget","NamedNodeMap","Node","Attr","Element","DocumentFragment","DOMImplementation","Document","XMLDocument","CharacterData","Text","CDATASection","ProcessingInstruction","Comment","DocumentType","NodeList","HTMLCollection","HTMLOptionsCollection","DOMStringMap","DOMTokenList","StyleSheetList","HTMLElement","HTMLHeadElement","HTMLTitleElement","HTMLBaseElement","HTMLLinkElement","HTMLMetaElement","HTMLStyleElement","HTMLBodyElement","HTMLHeadingElement","HTMLParagraphElement","HTMLHRElement","HTMLPreElement","HTMLUListElement","HTMLOListElement","HTMLLIElement","HTMLMenuElement","HTMLDListElement","HTMLDivElement","HTMLAnchorElement","HTMLAreaElement","HTMLBRElement","HTMLButtonElement","HTMLCanvasElement","HTMLDataElement","HTMLDataListElement","HTMLDetailsElement","HTMLDialogElement","HTMLDirectoryElement","HTMLFieldSetElement","HTMLFontElement","HTMLFormElement","HTMLHtmlElement","HTMLImageElement","HTMLInputElement","HTMLLabelElement","HTMLLegendElement","HTMLMapElement","HTMLMarqueeElement","HTMLMediaElement","HTMLMeterElement","HTMLModElement","HTMLOptGroupElement","HTMLOptionElement","HTMLOutputElement","HTMLPictureElement","HTMLProgressElement","HTMLQuoteElement","HTMLScriptElement","HTMLSelectElement","HTMLSlotElement","HTMLSourceElement","HTMLSpanElement","HTMLTableCaptionElement","HTMLTableCellElement","HTMLTableColElement","HTMLTableElement","HTMLTimeElement","HTMLTableRowElement","HTMLTableSectionElement","HTMLTemplateElement","HTMLTextAreaElement","HTMLUnknownElement","HTMLFrameElement","HTMLFrameSetElement","HTMLIFrameElement","HTMLEmbedElement","HTMLObjectElement","HTMLParamElement","HTMLVideoElement","HTMLAudioElement","HTMLTrackElement","SVGElement","SVGGraphicsElement","SVGSVGElement","SVGTitleElement","SVGAnimatedString","SVGNumber","SVGStringList","Event","CloseEvent","CustomEvent","MessageEvent","ErrorEvent","HashChangeEvent","PopStateEvent","StorageEvent","ProgressEvent","PageTransitionEvent","UIEvent","FocusEvent","InputEvent","MouseEvent","KeyboardEvent","TouchEvent","CompositionEvent","WheelEvent","BarProp","External","Location","History","Screen","Performance","Navigator","PluginArray","MimeTypeArray","Plugin","MimeType","FileReader","Blob","File","FileList","ValidityState","DOMParser","XMLSerializer","FormData","XMLHttpRequestEventTarget","XMLHttpRequestUpload","XMLHttpRequest","WebSocket","NodeFilter","NodeIterator","TreeWalker","AbstractRange","Range","StaticRange","Selection","Storage","CustomElementRegistry","ShadowRoot","MutationObserver","MutationRecord","Headers","AbortController","AbortSignal"],n=["addEventListener","alert","atob","blur","btoa","close","confirm","createPopup","dispatchEvent","document","focus","frames","getComputedStyle","history","innerHeight","innerWidth","length","location","moveBy","moveTo","name","navigator","open","outerHeight","outerWidth","pageXOffset","pageYOffset","parent","postMessage","print","prompt","removeEventListener","resizeBy","resizeTo","screen","screenLeft","screenTop","screenX","screenY","scroll","scrollBy","scrollLeft","scrollTo","scrollTop","scrollX","scrollY","self","stop","top","window"],m=t.concat(n);export{m as a};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var f=Object.create;var a=Object.defineProperty,l=Object.defineProperties,_=Object.getOwnPropertyDescriptor,h=Object.getOwnPropertyDescriptors,c=Object.getOwnPropertyNames,e=Object.getOwnPropertySymbols,d=Object.getPrototypeOf,i=Object.prototype.hasOwnProperty,s=Object.prototype.propertyIsEnumerable;var p=(r,t,m)=>t in r?a(r,t,{enumerable:!0,configurable:!0,writable:!0,value:m}):r[t]=m,U=(r,t)=>{for(var m in t||(t={}))i.call(t,m)&&p(r,m,t[m]);if(e)for(var m of e(t))s.call(t,m)&&p(r,m,t[m]);return r},b=(r,t)=>l(r,h(t)),n=r=>a(r,"__esModule",{value:!0});var u=(r,t)=>()=>(r&&(t=r(r=0)),t);var g=(r,t)=>()=>(t||r((t={exports:{}}).exports,t),t.exports),j=(r,t)=>{n(r);for(var m in t)a(r,m,{get:t[m],enumerable:!0})},x=(r,t,m)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of c(t))!i.call(r,o)&&o!=="default"&&a(r,o,{get:()=>t[o],enumerable:!(m=_(t,o))||m.enumerable});return r},k=r=>x(n(a(r!=null?f(d(r)):{},"default",r&&r.__esModule&&"default"in r?{get:()=>r.default,enumerable:!0}:{value:r,enumerable:!0})),r);import{fileURLToPath as L}from"url";import P from"path";var R,y,T=u(()=>{R=L(import.meta.url),y=P.dirname(R)});export{U as a,b,g as c,j as d,k as e,T as f};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{i as l}from"./chunk-CUG6SVUZ.js";import{d as r}from"./chunk-4OVO6RD6.js";import{f as i}from"./chunk-XPSQDVUG.js";i();function a(){r.forEach(o=>{globalThis[o]=l[o]})}export{a as registerApiGlobally};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as c}from"./chunk-F27UALKJ.js";import{f as n}from"./chunk-XPSQDVUG.js";n();import{Window as p}from"happy-dom";function a(o){let e=new p,r=c.concat(Object.getOwnPropertyNames(e)).filter(t=>!t.startsWith("_")).filter(t=>!(t in o));for(let t of r)o[t]=e[t];return{dom:e,restore(){e.happyDOM.cancelAsync(),r.forEach(t=>delete o[t])}}}export{a as setupHappyDOM};
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,73 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
export
|
|
4
|
-
export
|
|
5
|
-
|
|
1
|
+
import * as pretty_format from 'pretty-format';
|
|
2
|
+
import { S as SuiteCollector, T as TestFunction, a as TestFactory, b as Suite, U as UserOptions } from './types-d3253f2d';
|
|
3
|
+
export { C as ConcurrentOptions, F as File, G as GlobalContext, H as HookListener, h as Reporter, R as ResolvedConfig, c as RunMode, g as RunnerContext, b as Suite, S as SuiteCollector, e as Task, d as TaskState, f as TestCollector, a as TestFactory, T as TestFunction, U as UserOptions } from './types-d3253f2d';
|
|
4
|
+
export { assert, default as chai, expect, should } from 'chai';
|
|
5
|
+
import sinon from 'sinon';
|
|
6
|
+
export { default as sinon } from 'sinon';
|
|
7
|
+
import '@antfu/utils';
|
|
8
|
+
import 'jest-snapshot';
|
|
9
|
+
import 'jest-snapshot/build/State';
|
|
10
|
+
|
|
11
|
+
declare const defaultSuite: SuiteCollector;
|
|
12
|
+
declare const test: {
|
|
13
|
+
(name: string, fn: TestFunction): void;
|
|
14
|
+
concurrent: {
|
|
15
|
+
(name: string, fn: TestFunction, timeout?: number | undefined): void;
|
|
16
|
+
skip(name: string, fn: TestFunction, timeout?: number | undefined): void;
|
|
17
|
+
only(name: string, fn: TestFunction, timeout?: number | undefined): void;
|
|
18
|
+
todo(name: string): void;
|
|
19
|
+
};
|
|
20
|
+
skip: {
|
|
21
|
+
(name: string, fn: TestFunction): void;
|
|
22
|
+
concurrent(name: string, fn: TestFunction, timeout?: number | undefined): void;
|
|
23
|
+
};
|
|
24
|
+
only: {
|
|
25
|
+
(name: string, fn: TestFunction): void;
|
|
26
|
+
concurrent(name: string, fn: TestFunction, timeout?: number | undefined): void;
|
|
27
|
+
};
|
|
28
|
+
todo: {
|
|
29
|
+
(name: string): void;
|
|
30
|
+
concurrent(name: string): void;
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
declare function suite(suiteName: string, factory?: TestFactory): SuiteCollector;
|
|
34
|
+
declare namespace suite {
|
|
35
|
+
var skip: (suiteName: string, factory?: TestFactory | undefined) => SuiteCollector;
|
|
36
|
+
var only: (suiteName: string, factory?: TestFactory | undefined) => SuiteCollector;
|
|
37
|
+
var todo: (suiteName: string) => SuiteCollector;
|
|
38
|
+
}
|
|
39
|
+
declare const describe: typeof suite;
|
|
40
|
+
declare const it: {
|
|
41
|
+
(name: string, fn: TestFunction): void;
|
|
42
|
+
concurrent: {
|
|
43
|
+
(name: string, fn: TestFunction, timeout?: number | undefined): void;
|
|
44
|
+
skip(name: string, fn: TestFunction, timeout?: number | undefined): void;
|
|
45
|
+
only(name: string, fn: TestFunction, timeout?: number | undefined): void;
|
|
46
|
+
todo(name: string): void;
|
|
47
|
+
};
|
|
48
|
+
skip: {
|
|
49
|
+
(name: string, fn: TestFunction): void;
|
|
50
|
+
concurrent(name: string, fn: TestFunction, timeout?: number | undefined): void;
|
|
51
|
+
};
|
|
52
|
+
only: {
|
|
53
|
+
(name: string, fn: TestFunction): void;
|
|
54
|
+
concurrent(name: string, fn: TestFunction, timeout?: number | undefined): void;
|
|
55
|
+
};
|
|
56
|
+
todo: {
|
|
57
|
+
(name: string): void;
|
|
58
|
+
concurrent(name: string): void;
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
declare const beforeAll: (fn: Suite['hooks']['beforeAll'][0]) => void;
|
|
62
|
+
declare const afterAll: (fn: Suite['hooks']['afterAll'][0]) => void;
|
|
63
|
+
declare const beforeEach: (fn: Suite['hooks']['beforeEach'][0]) => void;
|
|
64
|
+
declare const afterEach: (fn: Suite['hooks']['afterEach'][0]) => void;
|
|
65
|
+
declare function clearContext(): void;
|
|
66
|
+
|
|
67
|
+
declare const mock: sinon.SinonMockStatic;
|
|
68
|
+
declare const spy: sinon.SinonSpyStatic;
|
|
69
|
+
declare const stub: sinon.SinonStubStatic;
|
|
70
|
+
|
|
6
71
|
declare module 'vite' {
|
|
7
72
|
interface UserConfig {
|
|
8
73
|
/**
|
|
@@ -35,7 +100,9 @@ declare global {
|
|
|
35
100
|
toHaveBeenCalledWith(...args: any[]): void;
|
|
36
101
|
}
|
|
37
102
|
interface ExpectStatic {
|
|
38
|
-
addSnapshotSerializer:
|
|
103
|
+
addSnapshotSerializer: pretty_format.Plugin;
|
|
39
104
|
}
|
|
40
105
|
}
|
|
41
106
|
}
|
|
107
|
+
|
|
108
|
+
export { afterAll, afterEach, beforeAll, beforeEach, clearContext, defaultSuite, describe, it, mock, spy, stub, suite, test };
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export * from './suite';
|
|
3
|
-
export * from './integrations/chai';
|
|
4
|
-
export * from './integrations/sinon';
|
|
1
|
+
import{a as k,b as l,c as m,d as n,e as o,f as p,g as q,h as r}from"./chunk-CUG6SVUZ.js";import{e as a,f as b,g as c,h as d,i as e,j as f,k as g,l as h,m as i,n as j}from"./chunk-4OVO6RD6.js";import"./chunk-XPSQDVUG.js";export{g as afterAll,i as afterEach,l as assert,f as beforeAll,h as beforeEach,k as chai,j as clearContext,a as defaultSuite,d as describe,n as expect,e as it,p as mock,m as should,o as sinon,q as spy,r as stub,c as suite,b as test};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as s}from"./chunk-F27UALKJ.js";import{f as n}from"./chunk-XPSQDVUG.js";n();import{JSDOM as i}from"jsdom";function u(e){let r=new i("<!DOCTYPE html>",{pretendToBeVisual:!0,runScripts:"dangerously",url:"http://localhost:3000"}),o=s.concat(Object.getOwnPropertyNames(r.window)).filter(t=>!t.startsWith("_")).filter(t=>!(t in e));for(let t of o)e[t]=r.window[t];return{dom:r,restore(){o.forEach(t=>delete e[t])}}}export{u as setupJSDOM};
|
package/dist/node/cli.d.ts
CHANGED
package/dist/node/cli.js
CHANGED
|
@@ -1,86 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
import {
|
|
8
|
-
console.log(c.yellow(c.bold('\nVitest is currently in closed beta exclusively for Sponsors')));
|
|
9
|
-
console.log(c.magenta(`Become a Sponsor of ${c.underline('https://github.com/sponsors/patak-js')} or ${c.underline('https://github.com/sponsors/antfu')} \nto access the source code and issues tracker 💖\n`));
|
|
10
|
-
// TODO: use bundler
|
|
11
|
-
const version = '0.0.0';
|
|
12
|
-
sade('vitest [filter]', true)
|
|
13
|
-
.version(version)
|
|
14
|
-
.describe('A blazing fast unit test framework powered by Vite.')
|
|
15
|
-
.option('-r, --root', 'root path', process.cwd())
|
|
16
|
-
.option('-c, --config', 'path to config file')
|
|
17
|
-
.option('-w, --watch', 'watch mode', false)
|
|
18
|
-
.option('-u, --update', 'update snapshot', false)
|
|
19
|
-
.option('--global', 'inject apis globally', false)
|
|
20
|
-
.option('--dev', 'dev mode', false)
|
|
21
|
-
.option('--jsdom', 'mock browser api using JSDOM', false)
|
|
22
|
-
.action(async (filters, argv) => {
|
|
23
|
-
process.env.VITEST = 'true';
|
|
24
|
-
const defaultInline = [
|
|
25
|
-
'vue',
|
|
26
|
-
'@vue',
|
|
27
|
-
'diff',
|
|
28
|
-
];
|
|
29
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
30
|
-
const root = resolve(argv.root || process.cwd());
|
|
31
|
-
const configPath = argv.config
|
|
32
|
-
? resolve(root, argv.config)
|
|
33
|
-
: await findUp(['vitest.config.ts', 'vitest.config.js', 'vitest.config.mjs', 'vite.config.ts', 'vite.config.js', 'vite.config.mjs'], { cwd: root });
|
|
34
|
-
const options = argv;
|
|
35
|
-
options.config = configPath;
|
|
36
|
-
options.root = root;
|
|
37
|
-
options.filters = filters
|
|
38
|
-
? Array.isArray(filters)
|
|
39
|
-
? filters
|
|
40
|
-
: [filters]
|
|
41
|
-
: undefined;
|
|
42
|
-
process.__vitest__ = {
|
|
43
|
-
options,
|
|
44
|
-
};
|
|
45
|
-
await startViteNode({
|
|
46
|
-
root,
|
|
47
|
-
files: [
|
|
48
|
-
resolve(__dirname, argv.dev ? '../../src/node/entry.ts' : './entry.js'),
|
|
49
|
-
],
|
|
50
|
-
config: configPath,
|
|
51
|
-
defaultConfig: {
|
|
52
|
-
optimizeDeps: {
|
|
53
|
-
exclude: [
|
|
54
|
-
'vitest',
|
|
55
|
-
],
|
|
56
|
-
},
|
|
57
|
-
},
|
|
58
|
-
shouldExternalize(id, server) {
|
|
59
|
-
var _a, _b, _c, _d;
|
|
60
|
-
const inline = ['vitest', ...defaultInline, ...((_b = (_a = server.config.test) === null || _a === void 0 ? void 0 : _a.deps) === null || _b === void 0 ? void 0 : _b.inline) || []];
|
|
61
|
-
const external = ((_d = (_c = server.config.test) === null || _c === void 0 ? void 0 : _c.deps) === null || _d === void 0 ? void 0 : _d.external) || [];
|
|
62
|
-
for (const ex of inline) {
|
|
63
|
-
if (typeof ex === 'string') {
|
|
64
|
-
if (id.includes(`/node_modules/${ex}/`))
|
|
65
|
-
return false;
|
|
66
|
-
}
|
|
67
|
-
else {
|
|
68
|
-
if (ex.test(id))
|
|
69
|
-
return false;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
for (const ex of external) {
|
|
73
|
-
if (typeof ex === 'string') {
|
|
74
|
-
if (id.includes(`/node_modules/${ex}/`))
|
|
75
|
-
return true;
|
|
76
|
-
}
|
|
77
|
-
else {
|
|
78
|
-
if (ex.test(id))
|
|
79
|
-
return true;
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
return id.includes('/node_modules/');
|
|
83
|
-
},
|
|
84
|
-
});
|
|
85
|
-
})
|
|
86
|
-
.parse(process.argv);
|
|
1
|
+
import{f as g}from"../chunk-XPSQDVUG.js";g();import{fileURLToPath as H}from"url";import{resolve as w,dirname as Q}from"path";import{findUp as G}from"find-up";import K from"sade";import v from"picocolors";var C="0.0.38";g();import{createServer as L,mergeConfig as J}from"vite";g();import{builtinModules as F,createRequire as A}from"module";import{fileURLToPath as D,pathToFileURL as N}from"url";import{dirname as E,resolve as V}from"path";import W from"vm";var $={"/@vite/client":{injectQuery:e=>e,createHotContext(){return{accept:()=>{},prune:()=>{}}},updateStyle(){}}};async function T({moduleCache:e,root:s,files:r,fetch:i,inline:p,external:c}){let h=[];for(let t of r)h.push(await u(`/@fs/${b(V(t))}`,[]));return h;async function y(t,n,o){o=[...o,t];let a=async f=>{if(o.includes(f)){if(!e.get(f))throw new Error(`Circular dependency detected
|
|
2
|
+
Stack:
|
|
3
|
+
${[...o,f].reverse().map(I=>`- ${I}`).join(`
|
|
4
|
+
`)}`);return e.get(f).exports}return u(f,o)};if(t in $)return $[t];let d=await i(t);if(!d)throw new Error(`failed to load ${t}`);let m=N(n),l={};_(t,{transformResult:d,exports:l});let j=D(m),R={require:A(m),__filename:j,__dirname:E(j),__vite_ssr_import__:a,__vite_ssr_dynamic_import__:a,__vite_ssr_exports__:l,__vite_ssr_exportAll__:f=>q(l,f),__vite_ssr_import_meta__:{url:m}};return await W.runInThisContext(`async (${Object.keys(R).join(",")}) => { ${d.code} }`,{filename:n,lineOffset:0})(...Object.values(R)),l}function _(t,n){e.has(t)?Object.assign(e.get(t),n):e.set(t,n)}function x(t){for(let n of p)if(typeof n=="string"){if(t.includes(`/node_modules/${n}/`))return!1}else if(n.test(t))return!1;for(let n of c)if(typeof n=="string"){if(t.includes(`/node_modules/${n}/`))return!0}else if(n.test(t))return!0;return t.includes("/node_modules/")}async function u(t,n){var m,l;let o=k(t);if(F.includes(o))return import(o);let a=U(o,s);if(x(a))return a.match(/^\w:\//)?import(`/${a}`):import(a);if((m=e.get(a))==null?void 0:m.promise)return(l=e.get(a))==null?void 0:l.promise;let d=y(o,a,n);return _(a,{promise:d}),await d}function q(t,n){for(let o in n)if(o!=="default")try{Object.defineProperty(t,o,{enumerable:!0,configurable:!0,get(){return n[o]}})}catch{}}}function k(e){return e&&e.startsWith("/@id/__x00__")&&(e=`\0${e.slice("/@id/__x00__".length)}`),e&&e.startsWith("/@id/")&&(e=e.slice("/@id/".length)),e.startsWith("__vite-browser-external:")&&(e=e.slice("__vite-browser-external:".length)),e}function U(e,s){let r=b(e).startsWith("/@fs/")?e.slice(4):e.startsWith(E(s))?e:e.startsWith("/")?b(V(s,e.slice(1))):e;return r.startsWith("//")&&(r=r.slice(1)),r}function b(e){return e.replace(/\\/g,"/")}var M=new Map;async function P(e){var h,y,_,x;process.exitCode=0;let s=e.root||process.cwd();process.chdir(s);let r=e.files||e._;e.shouldExternalize=e.shouldExternalize||(u=>u.includes("/node_modules/"));let i=await L(J(e.defaultConfig||{},{logLevel:"error",clearScreen:!1,configFile:e.config,root:s,resolve:{}}));await i.pluginContainer.buildStart({}),process.__vite_node__={server:i,moduleCache:M};let p=["vitest/dist","vitest/src","vue","@vue","diff"],c={root:i.config.root,files:r,fetch:u=>B(i,u),inline:[...p,...((y=(h=i.config.test)==null?void 0:h.deps)==null?void 0:y.inline)||[]],external:((x=(_=i.config.test)==null?void 0:_.deps)==null?void 0:x.external)||[],moduleCache:M};try{await T(c)}catch(u){throw process.exitCode=1,u}finally{process.__vite_node__.watch||await i.close()}}async function B(e,s){if(s.match(/\.(?:[cm]?[jt]sx?|json)$/))return await e.transformRequest(s,{ssr:!0});{let r=await e.transformRequest(s);return r?await e.ssrTransform(r.code,r.map,s):void 0}}K("vitest [filter]",!0).version(C).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("--dev","dev mode",!1).option("--dom","mock browser api using jsdom or happy-dom","").action(async(e,s)=>{process.env.VITEST="true",console.log(v.yellow(v.bold(`
|
|
5
|
+
Vitest is currently in closed beta exclusively for Sponsors`))),console.log(v.magenta(`Become a Sponsor of ${v.underline("https://github.com/sponsors/patak-js")} or ${v.underline("https://github.com/sponsors/antfu")}
|
|
6
|
+
to access the source code and issues tracker \u{1F496}
|
|
7
|
+
`));let r=Q(H(import.meta.url)),i=w(s.root||process.cwd()),p=s.config?w(i,s.config):await G(["vitest.config.ts","vitest.config.js","vitest.config.mjs","vite.config.ts","vite.config.js","vite.config.mjs"],{cwd:i}),c=s;c.config=p,c.root=i,c.filters=e?Array.isArray(e)?e:[e]:void 0,process.__vitest__={options:c},await P({root:i,files:[w(r,s.dev?"../../src/node/entry.ts":"./entry.js")],config:p,defaultConfig:{optimizeDeps:{exclude:["vitest"]}}})}).parse(process.argv);
|
package/dist/node/entry.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
|
package/dist/node/entry.js
CHANGED
|
@@ -1,12 +1,19 @@
|
|
|
1
|
-
import { run } from
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
1
|
+
import{a as F,b as I,c as K,e as q,n as z}from"../chunk-4OVO6RD6.js";import{a as A,c as Se,e as ye,f as c}from"../chunk-XPSQDVUG.js";var Y=Se((it,V)=>{c();"use strict";V.exports=t=>{let e=/^\\\\\?\\/.test(t),n=/[^\u0000-\u0080]+/.test(t);return e||n?t:t.replace(/\\/g,"/")}});c();c();c();import ne from"jest-snapshot";c();import Me from"chai";import xe from"jest-snapshot";c();import we from"@jest/test-result";var{makeEmptyAggregatedTestResult:ke}=we,P=t=>{let e=ke().snapshot;return e.didUpdate=t.updateSnapshot==="all",e},G=t=>{let e={added:0,fileDeleted:!1,matched:0,unchecked:0,uncheckedKeys:[],unmatched:0,updated:0},n=t.getUncheckedCount(),o=t.getUncheckedKeys();n&&t.removeUncheckedKeys();let r=t.save();return e.fileDeleted=r.deleted,e.added=t.added,e.matched=t.matched,e.unmatched=t.unmatched,e.updated=t.updated,e.unchecked=r.deleted?0:n,e.uncheckedKeys=Array.from(o),e},J=(t,e,n)=>{e.added&&t.filesAdded++,e.fileDeleted&&t.filesRemoved++,e.unmatched&&t.filesUnmatched++,e.updated&&t.filesUpdated++,t.added+=e.added,t.matched+=e.matched,t.unchecked+=e.unchecked,e.uncheckedKeys&&e.uncheckedKeys.length>0&&t.uncheckedKeysByFile.push({filePath:n,keys:e.uncheckedKeys}),t.unmatched+=e.unmatched,t.updated+=e.updated,t.total+=e.added+e.matched+e.unmatched+e.updated};c();var Q=ye(Y());import C,{isAbsolute as $e}from"path";import{pluralize as m}from"jest-util";import g from"picocolors";var _=(t,e)=>{$e(e)&&(e=C.relative(t,e));let n=C.dirname(e),o=C.basename(e);return(0,Q.default)(g.dim(n+C.sep)+g.bold(o))},$=" \u203A ",X=" \u21B3 ",E=" \u2022 ",ve=t=>g.bold(g.red(t)),Z=t=>g.bold(g.yellow(t)),Ce=t=>g.bold(g.green(t)),j=g.dim,ee=t=>g.bold(g.green(t)),be=g.bold,Te=t=>g.bold(g.green(t)),B="re-run mocha with `--update` to update them",te=(t,e)=>{let n=[];if(n.push(be("Snapshot Summary")),e.added&&n.push(`${Ce(`${$+m("snapshot",e.added)} written `)}from ${m("test suite",e.filesAdded)}.`),e.unmatched&&n.push(`${ve(`${$}${m("snapshot",e.unmatched)} failed`)} from ${m("test suite",e.filesUnmatched)}. ${j(`Inspect your code changes or ${B} to update them.`)}`),e.updated&&n.push(`${Te(`${$+m("snapshot",e.updated)} updated `)}from ${m("test suite",e.filesUpdated)}.`),e.filesRemoved&&(e.didUpdate?n.push(`${ee(`${$}${m("snapshot file",e.filesRemoved)} removed `)}from ${m("test suite",e.filesRemoved)}.`):n.push(`${Z(`${$}${m("snapshot file",e.filesRemoved)} obsolete `)}from ${m("test suite",e.filesRemoved)}. ${j(`To remove ${e.filesRemoved===1?"it":"them all"}, ${B}.`)}`)),e.filesRemovedList&&e.filesRemovedList.length){let[o,...r]=e.filesRemovedList;n.push(` ${X} ${E}${_(t,o)}`),r.forEach(s=>{n.push(` ${E}${_(t,s)}`)})}return e.unchecked&&(e.didUpdate?n.push(`${ee(`${$}${m("snapshot",e.unchecked)} removed `)}from ${m("test suite",e.uncheckedKeysByFile.length)}.`):n.push(`${Z(`${$}${m("snapshot",e.unchecked)} obsolete `)}from ${m("test suite",e.uncheckedKeysByFile.length)}. ${j(`To remove ${e.unchecked===1?"it":"them all"}, ${B}.`)}`),e.uncheckedKeysByFile.forEach(o=>{n.push(` ${X}${_(t,o.filePath)}`),o.keys.forEach(r=>{n.push(` ${E}${r}`)})})),n};var{expect:Re}=Me,{SnapshotState:Oe}=xe,D=class{snapshotState=null;snapshotSummary;snapshotOptions;context=null;testFile="";snapshotResolver;rootDir;constructor({rootDir:e,update:n,snapshotResolver:o=null}){this.rootDir=e,this.snapshotResolver=o;let r=process.env,s=!!r.CI,i=n||r.UPDATE_SNAPSHOT;this.snapshotOptions={updateSnapshot:s&&!i?"none":i?"all":"new"},this.snapshotSummary=P(this.snapshotOptions)}onFileChanged(){!this.context||(this.snapshotState!==null&&this.saveSnap(),this.testFile=this.context.file,this.snapshotState=new Oe(this.snapshotResolver.resolveSnapshotPath(this.testFile),this.snapshotOptions))}setTask(e){var n;this.setContext({file:((n=e.file)==null?void 0:n.filepath)||e.name,title:e.name,fullTitle:[e.suite.name,e.name].filter(Boolean).join(" > ")})}setContext(e){!e.title||!e.file||(this.context=e,this.testFile!==e.file&&this.onFileChanged())}assert(e,n){if(!this.snapshotState||!this.context)return;let{actual:o,expected:r,key:s,pass:i}=this.snapshotState.match({testName:this.context.fullTitle||this.context.title||this.context.file,received:e,isInline:!1});i||Re(o.trim()).equals(r?r.trim():"",n||`Snapshot name: \`${s}\``)}clear(){this.snapshotSummary=P(this.snapshotOptions)}saveSnap(){if(!this.testFile||!this.snapshotState)return;let e=G(this.snapshotState);J(this.snapshotSummary,e,this.testFile),this.testFile="",this.snapshotState=null}report(){let e=te(this.rootDir,this.snapshotSummary);if(e.length>1)return e}};var{addSerializer:Ae}=ne,b;function T(){return b}async function oe(t){let{root:e}=t;return b=new D({rootDir:e,update:t.update}),b.snapshotResolver=await ne.buildSnapshotResolver({transform:[],rootDir:e}),function(n,o){for(let r of["matchSnapshot","toMatchSnapshot"])o.addMethod(n.Assertion.prototype,r,function(s){let i=o.flag(this,"object");b.assert(i,s)});n.expect.addSnapshotSerializer=Ae}}c();import{slash as Fe}from"@antfu/utils";c();async function M(t){let e={};for(let r of t){let s={filepath:r,suites:[],collected:!1};z();try{await import(r);let i=[q,...F.suites];for(let a of i)F.currentSuite=a,s.suites.push(await a.collect(s));s.collected=!0}catch(i){s.error=i,s.collected=!1,process.exitCode=1}e[r]=s}let o=Object.values(e).reduce((r,s)=>r.concat(s.suites),[]);return L(o),o.forEach(r=>{r.mode==="skip"?r.tasks.forEach(s=>s.mode==="run"&&(s.mode="skip")):L(r.tasks),r.tasks.forEach(s=>s.mode==="skip"&&(s.state="skip"))}),e}async function se(t){var w;let{reporter:e,snapshotManager:n,filesMap:o}=t;await((w=e.onWatcherStart)==null?void 0:w.call(e,t));let r,s=new Set,i=new Set,{server:a,moduleCache:d}=process.__vite_node__;a.watcher.on("change",async h=>{h=Fe(h),ie(h,t,s,i),i.forEach(S=>d.delete(S)),i.clear(),s.size!==0&&(clearTimeout(r),r=setTimeout(async()=>{var v,l,H;if(s.size===0)return;n.clear();let S=Array.from(s);s.clear(),await((v=e.onWatcherRerun)==null?void 0:v.call(e,S,h,t)),S.forEach(ge=>d.delete(ge));let k=await M(S);Object.assign(o,k),await N(k,t),n.saveSnap(),await((l=e.onFinished)==null?void 0:l.call(e,t,Object.values(k))),await((H=e.onWatcherStart)==null?void 0:H.call(e,t))},100))}),await new Promise(()=>{})}function ie(t,e,n=new Set,o=new Set){if(o.has(t)||n.has(t))return n;if(o.add(t),t in e.filesMap)return n.add(t),n;let r=process.__vite_node__.server.moduleGraph.getModuleById(t);return r&&r.importers.forEach(s=>{s.id&&ie(s.id,e,n,o)}),n}c();c();import x from"chai";import Pe from"sinon-chai";import _e from"chai-subset";c();function re(){return(t,e)=>{let n=t.Assertion.prototype;e.addMethod(n,"toEqual",function(o){return this.eql(o)}),e.addMethod(n,"toStrictEqual",function(o){return this.equal(o)}),e.addMethod(n,"toBe",function(o){return this.equal(o)}),e.addMethod(n,"toMatchObject",function(o){return this.containSubset(o)}),e.addMethod(n,"toMatch",function(o){return typeof o=="string"?this.include(o):this.match(o)}),e.addMethod(n,"toContain",function(o){return this.contain(o)}),e.addMethod(n,"toBeTruthy",function(){let o=e.flag(this,"object");this.assert(Boolean(o),"expected #{this} to be truthy","expected #{this} to not be truthy",o)}),e.addMethod(n,"toBeFalsy",function(){let o=e.flag(this,"object");this.assert(!o,"expected #{this} to be falsy","expected #{this} to not be falsy",o)}),e.addMethod(n,"toBeNaN",function(){return this.be.NaN}),e.addMethod(n,"toBeUndefined",function(){return this.be.undefined}),e.addMethod(n,"toBeNull",function(){return this.be.null}),e.addMethod(n,"toBeDefined",function(){return this.not.be.undefined}),e.addMethod(n,"toBeInstanceOf",function(o){return this.instanceOf(o)}),e.addMethod(n,"toHaveBeenCalledTimes",function(o){return this.callCount(o)}),e.addMethod(n,"toHaveBeenCalledOnce",function(){return this.callCount(1)}),e.addMethod(n,"toHaveBeenCalled",function(){return this.called}),e.addMethod(n,"toHaveBeenCalled",function(){return this.called}),e.addMethod(n,"toHaveBeenCalledWith",function(...o){return this.calledWith(...o)})}}async function ae(t){x.use(Pe),x.use(re()),x.use(_e),x.use(await oe(t))}c();import{performance as ue}from"perf_hooks";import{relative as Je}from"path";import u from"picocolors";import U from"listr";c();import{promises as Ee,existsSync as je}from"fs";import y from"picocolors";import{createPatch as Ge}from"diff";import{notNullish as Be}from"@antfu/utils";import{SourceMapConsumer as De}from"source-map";async function R(t){var i;if(!(t instanceof Error)){console.error(t);return}let{moduleCache:e}=process.__vite_node__,n=t,o=!1,s=Ie(n.stack||"").find(a=>e.has(a.file));if(s){let a=(i=e.get(s.file))==null?void 0:i.transformResult,d=await Le(a==null?void 0:a.map,s);if(d&&je(s.file)){let w=await Ee.readFile(s.file,"utf-8");console.error(`${y.red(`${y.bold(n.name)}: ${n.message}`)}`),console.log(y.gray(`${s.file}:${d.line}:${d.column}`)),console.log(y.yellow(Ue(w,d))),o=!0}}o||console.error(n),n.showDiff&&console.error(y.gray(Ke(ce(n.actual),ce(n.expected))))}function Le(t,{line:e,column:n}){return new Promise(o=>{if(!t)return o(null);De.with(t,null,r=>{let s=r.originalPositionFor({line:e,column:n});s.line!=null&&s.column!=null?o(s):o(null)})})}var le=/\r?\n/;function Ne(t,e){if(typeof e=="number")return e;let n=t.split(le),{line:o,column:r}=e,s=0;for(let i=0;i<o-1;i++)s+=n[i].length+1;return s+r}function Ue(t,e=0,n,o=2){e=Ne(t,e),n=n||e;let r=t.split(le),s=0,i=[];for(let a=0;a<r.length;a++)if(s+=r[a].length+1,s>=e){for(let d=a-o;d<=a+o||n>s;d++){if(d<0||d>=r.length)continue;let w=d+1;i.push(`${y.gray(`${w}${" ".repeat(Math.max(3-String(w).length,0))}|`)} ${r[d]}`);let h=r[d].length;if(d===a){let S=e-(s-h)+1,k=Math.max(1,n>s?h-S:n-e);i.push(`${y.gray(" |")} ${" ".repeat(S)}${"^".repeat(k)}`)}else if(d>a){if(n>s){let S=Math.max(Math.min(n-s,h),1);i.push(`${y.gray(" |")} ${"^".repeat(S)}`)}s+=h+1}}break}return i.join(`
|
|
2
|
+
`)}function ce(t){return String(t)}var We=/at (.*) \((.+):(\d+):(\d+)\)$/,He=/at ()(.+):(\d+):(\d+)$/;function Ie(t){return t.split(`
|
|
3
|
+
`).map(o=>{let r=o.trim(),s=r.match(We)||r.match(He);if(!s)return null;let i=s[2];return i.startsWith("file://")&&(i=i.slice(7)),{method:s[1],file:s[2],line:parseInt(s[3]),column:parseInt(s[4])}}).filter(Be)}function Ke(t,e){let n=2048;return t.length>n&&(t=`${t.substring(0,n)} ... Lines skipped`),e.length>n&&(e=`${e.substring(0,n)} ... Lines skipped`),qe(t,e)}function qe(t,e){let n=" ";function o(i){return i[0]==="+"?n+y.green(`${i[0]} ${i.slice(1)}`):i[0]==="-"?n+y.red(`${i[0]} ${i.slice(1)}`):i.match(/@@/)?"--":i.match(/\\ No newline/)?null:n+i}let s=Ge("string",t,e).split(`
|
|
4
|
+
`).splice(5);return`
|
|
5
|
+
${n}${y.red("- actual")}
|
|
6
|
+
${n}${y.green("+ expected")}
|
|
7
|
+
|
|
8
|
+
${s.map(o).filter(ze).join(`
|
|
9
|
+
`)}`}function ze(t){return typeof t!="undefined"&&t!==null}var Ve="\u2716 ",W=class{start=0;end=0;listr=null;listrPromise=null;taskMap=new Map;cwd=process.cwd();relative(e){return Je(this.cwd,e)}onStart(e){this.cwd=e.root,console.log(u.green(`Running tests under ${u.gray(this.cwd)}
|
|
10
|
+
`))}onCollected(e){this.start=ue.now(),this.taskMap=new Map,e.reduce((s,i)=>s.concat(i.suites.flatMap(a=>a.tasks)),[]).forEach(s=>{let i={};i.promise=new Promise((a,d)=>{i.resolve=a,i.reject=d}),this.taskMap.set(s,i)});let o=s=>s.map(i=>({title:i.name,skip:()=>i.mode==="skip",task:async()=>{var a;return await((a=this.taskMap.get(i))==null?void 0:a.promise)}})),r={exitOnError:!1};this.listr=new U(e.map(s=>({title:this.relative(s.filepath),task:()=>{if(s.error)throw s.error;let i=s.suites.filter(a=>a.tasks.length);if(!i.length)throw new Error("No tasks found");return new U(i.flatMap(a=>a.name?[{title:a.name,skip:()=>a.mode!=="run",task:()=>new U(o(a.tasks),r)}]:o(a.tasks)),r)}})),r),this.listrPromise=this.listr.run().catch(()=>{})}onTaskEnd(e){var n,o;e.state==="fail"?(n=this.taskMap.get(e))==null||n.reject(e.error):(o=this.taskMap.get(e))==null||o.resolve()}async onFinished(e,n=e.files){var v;await this.listrPromise,this.end=ue.now(),console.log();let o=e.snapshotManager.report();o&&console.log(o.join(`
|
|
11
|
+
`));let r=n.flatMap(l=>l.suites),s=r.flatMap(l=>l.tasks),i=n.filter(l=>l.error),a=r.filter(l=>l.error),d=s.filter(l=>l.state==="pass"||l.state==="fail"),w=s.filter(l=>l.state==="pass"),h=s.filter(l=>l.state==="fail"),S=s.filter(l=>l.state==="skip"),k=s.filter(l=>l.state==="todo");if(i.length){console.error(u.red(u.bold(`
|
|
12
|
+
Failed to parse ${i.length} files:`)));for(let l of i)console.error(u.red(`- ${l.filepath}`));console.log();for(let l of i)await R(l.error),console.log()}if(a.length){console.error(u.bold(u.red(`
|
|
13
|
+
Failed to run ${a.length} suites:`)));for(let l of a)console.error(u.red(`
|
|
14
|
+
- ${(v=l.file)==null?void 0:v.filepath} > ${l.name}`)),await R(l.error),console.log()}if(h.length){console.error(u.bold(u.red(`
|
|
15
|
+
Failed Tests (${h.length})`)));for(let l of h)console.error(`${u.red(`
|
|
16
|
+
${Ve+u.inverse(" FAIL ")}`)} ${[l.suite.name,l.name].filter(Boolean).join(" > ")}`),await R(l.error),console.log()}console.log(u.bold(u.green(`Passed ${w.length} / ${d.length}`))),h.length&&console.log(u.bold(u.red(`Failed ${h.length} / ${d.length}`))),S.length&&console.log(u.yellow(`Skipped ${S.length}`)),k.length&&console.log(u.dim(`Todo ${k.length}`)),console.log(`Time ${(this.end-this.start).toFixed(2)}ms`)}async onWatcherStart(e){await this.listrPromise;let n=e.tasks.filter(o=>o.state==="fail");n.length?console.log(`
|
|
17
|
+
${u.bold(u.inverse(u.red(" FAIL ")))}${u.red(` ${n.length} tests failed. Watching for file changes...`)}`):console.log(`
|
|
18
|
+
${u.bold(u.inverse(u.green(" PASS ")))}${u.green(" Watching for file changes...")}`)}async onWatcherRerun(e,n){await this.listrPromise,console.clear(),console.log(u.blue("Re-running tests...")+u.dim(` [ ${this.relative(n)} ]
|
|
19
|
+
`))}onSnapshotUpdate(){}};async function de(t){return await ae(t),t.global&&(await import("../global-CKRMAXWF.js")).registerApiGlobally(),t.dom==="happy-dom"?(await import("../happy-dom-RNJZR3YC.js")).setupHappyDOM(globalThis):t.dom&&(await import("../jsdom-6QAZGE6T.js")).setupJSDOM(globalThis),{filesMap:{},get files(){return Object.values(this.filesMap)},get suites(){return Object.values(this.filesMap).reduce((n,o)=>n.concat(o.suites),[])},get tasks(){return this.suites.reduce((n,o)=>n.concat(o.tasks),[])},config:t,reporter:t.reporter||new W,snapshotManager:T()}}c();import Ye from"fast-glob";async function he(t){var n;let e=await Ye(t.includes||I,{absolute:!0,cwd:t.root,ignore:t.excludes||K});return((n=t.filters)==null?void 0:n.length)&&(e=e.filter(o=>t.filters.some(r=>o.includes(r)))),e}async function O(t,e,n){await Promise.all(t.hooks[e].map(o=>o(...n)))}async function fe(t,e){var o,r,s;let{reporter:n}=e;if((o=T())==null||o.setTask(t),await((r=n.onTaskBegin)==null?void 0:r.call(n,t,e)),t.mode==="run"){try{await O(t.suite,"beforeEach",[t,t.suite]),await t.fn(),t.state="pass"}catch(i){t.state="fail",t.error=i,process.exitCode=1}try{await O(t.suite,"afterEach",[t,t.suite])}catch(i){t.state="fail",t.error=i,process.exitCode=1}}await((s=n.onTaskEnd)==null?void 0:s.call(n,t,e))}function L(t){t.some(e=>e.mode==="only")&&t.forEach(e=>{e.mode==="run"?e.mode="skip":e.mode==="only"&&(e.mode="run")})}async function pe(t,e){var o,r;let{reporter:n}=e;if(await((o=n.onSuiteBegin)==null?void 0:o.call(n,t,e)),t.mode==="skip")t.status="skip";else if(t.mode==="todo")t.status="todo";else try{await O(t,"beforeAll",[t]);for(let s of Qe(t.tasks))if(s[0].concurrent)await Promise.all(s.map(i=>fe(i,e)));else for(let i of s)await fe(i,e);await O(t,"afterAll",[t])}catch(s){t.error=s,t.status="fail",process.exitCode=1}await((r=n.onSuiteEnd)==null?void 0:r.call(n,t,e))}function Qe(t){let e=[],n=[];for(let o of t)e.length===0||!!o.concurrent==!!e[0].concurrent?e.push(o):(n.push(e),e=[o]);return e.length>0&&n.push(e),n}async function Xe(t,e){var r,s;let{reporter:n}=e;if(t.suites.filter(i=>i.mode==="run").length!==0){if(await((r=n.onFileBegin)==null?void 0:r.call(n,t,e)),e.config.parallel)await Promise.all(t.suites.map(i=>pe(i,e)));else for(let i of t.suites)await pe(i,e);await((s=n.onFileEnd)==null?void 0:s.call(n,t,e))}}async function N(t,e){var o;let{reporter:n}=e;await((o=n.onCollected)==null?void 0:o.call(n,Object.values(t),e));for(let r of Object.values(t))await Xe(r,e)}async function me(t){var a,d;t.watch&&(process.__vite_node__.watch=!0);let e=await he(t);if(!e.length){console.error("No test files found"),process.exitCode=1;return}let n=await de(t),{filesMap:o,snapshotManager:r,reporter:s}=n;await((a=s.onStart)==null?void 0:a.call(s,t));let i=await M(e);Object.assign(o,i),await N(o,n),r.saveSnap(),await((d=s.onFinished)==null?void 0:d.call(s,n)),t.watch&&await se(n)}if(!process.__vite_node__||!process.__vitest__)throw new Error("Vitest can only run in vite-node environment, please use the CLI to start the process");var Ze=process.__vite_node__.server.config.test||{},et=process.__vitest__.options||{},tt=A(A({},et),Ze);await me(tt);var nt=setTimeout(()=>{process.exit()},500);nt.unref();
|
|
@@ -1,6 +1,56 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { Awaitable } from '@antfu/utils';
|
|
2
|
+
import { SnapshotStateType, SnapshotResolver } from 'jest-snapshot';
|
|
3
|
+
import { SnapshotStateOptions } from 'jest-snapshot/build/State';
|
|
4
|
+
|
|
5
|
+
interface UncheckedSnapshot {
|
|
6
|
+
filePath: string;
|
|
7
|
+
keys: Array<string>;
|
|
8
|
+
}
|
|
9
|
+
interface SnapshotSummary {
|
|
10
|
+
added: number;
|
|
11
|
+
didUpdate: boolean;
|
|
12
|
+
failure: boolean;
|
|
13
|
+
filesAdded: number;
|
|
14
|
+
filesRemoved: number;
|
|
15
|
+
filesRemovedList: Array<string>;
|
|
16
|
+
filesUnmatched: number;
|
|
17
|
+
filesUpdated: number;
|
|
18
|
+
matched: number;
|
|
19
|
+
total: number;
|
|
20
|
+
unchecked: number;
|
|
21
|
+
uncheckedKeysByFile: Array<UncheckedSnapshot>;
|
|
22
|
+
unmatched: number;
|
|
23
|
+
updated: number;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
interface Context {
|
|
27
|
+
file: string;
|
|
28
|
+
title?: string;
|
|
29
|
+
fullTitle?: string;
|
|
30
|
+
}
|
|
31
|
+
declare class SnapshotManager {
|
|
32
|
+
snapshotState: SnapshotStateType | null;
|
|
33
|
+
snapshotSummary: SnapshotSummary;
|
|
34
|
+
snapshotOptions: SnapshotStateOptions;
|
|
35
|
+
context: Context | null;
|
|
36
|
+
testFile: string;
|
|
37
|
+
snapshotResolver: SnapshotResolver | null;
|
|
38
|
+
rootDir: string;
|
|
39
|
+
constructor({ rootDir, update, snapshotResolver, }: {
|
|
40
|
+
rootDir: string;
|
|
41
|
+
update?: boolean;
|
|
42
|
+
snapshotResolver?: SnapshotResolver | null;
|
|
43
|
+
});
|
|
44
|
+
onFileChanged(): void;
|
|
45
|
+
setTask(task: Task): void;
|
|
46
|
+
setContext(context: Context): void;
|
|
47
|
+
assert(received: unknown, message: string): void;
|
|
48
|
+
clear(): void;
|
|
49
|
+
saveSnap(): void;
|
|
50
|
+
report(): string[] | undefined;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
interface UserOptions {
|
|
4
54
|
/**
|
|
5
55
|
* Include globs for test files
|
|
6
56
|
*
|
|
@@ -26,11 +76,11 @@ export interface UserOptions {
|
|
|
26
76
|
*/
|
|
27
77
|
global?: boolean;
|
|
28
78
|
/**
|
|
29
|
-
* Use `
|
|
79
|
+
* Use `jsdom` or `happy-dom` to mock browser APIs
|
|
30
80
|
*
|
|
31
81
|
* @default false
|
|
32
82
|
*/
|
|
33
|
-
|
|
83
|
+
dom?: boolean | 'jsdom' | 'happy-dom';
|
|
34
84
|
/**
|
|
35
85
|
* Run tests files in parallel
|
|
36
86
|
*
|
|
@@ -58,16 +108,16 @@ export interface UserOptions {
|
|
|
58
108
|
*/
|
|
59
109
|
reporter?: Reporter;
|
|
60
110
|
}
|
|
61
|
-
|
|
111
|
+
interface ResolvedConfig extends Required<UserOptions> {
|
|
62
112
|
filters?: string[];
|
|
63
113
|
config?: string;
|
|
64
114
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
115
|
+
declare type RunMode = 'run' | 'skip' | 'only' | 'todo';
|
|
116
|
+
declare type TaskState = RunMode | 'pass' | 'fail';
|
|
117
|
+
interface ConcurrentOptions {
|
|
68
118
|
timeout: number;
|
|
69
119
|
}
|
|
70
|
-
|
|
120
|
+
interface Task {
|
|
71
121
|
name: string;
|
|
72
122
|
mode: RunMode;
|
|
73
123
|
concurrent?: ConcurrentOptions;
|
|
@@ -77,7 +127,7 @@ export interface Task {
|
|
|
77
127
|
state?: TaskState;
|
|
78
128
|
error?: unknown;
|
|
79
129
|
}
|
|
80
|
-
|
|
130
|
+
declare type TestFunction = () => Awaitable<void>;
|
|
81
131
|
interface ConcurrentCollector {
|
|
82
132
|
(name: string, fn: TestFunction, timeout?: number): void;
|
|
83
133
|
only: (name: string, fn: TestFunction, timeout?: number) => void;
|
|
@@ -96,15 +146,15 @@ interface TodoCollector {
|
|
|
96
146
|
(name: string): void;
|
|
97
147
|
concurrent: (name: string) => void;
|
|
98
148
|
}
|
|
99
|
-
|
|
149
|
+
interface TestCollector {
|
|
100
150
|
(name: string, fn: TestFunction): void;
|
|
101
151
|
concurrent: ConcurrentCollector;
|
|
102
152
|
only: OnlyCollector;
|
|
103
153
|
skip: SkipCollector;
|
|
104
154
|
todo: TodoCollector;
|
|
105
155
|
}
|
|
106
|
-
|
|
107
|
-
|
|
156
|
+
declare type HookListener<T extends any[]> = (...args: T) => Awaitable<void>;
|
|
157
|
+
interface Suite {
|
|
108
158
|
name: string;
|
|
109
159
|
mode: RunMode;
|
|
110
160
|
tasks: Task[];
|
|
@@ -118,7 +168,7 @@ export interface Suite {
|
|
|
118
168
|
afterEach: HookListener<[Task, Suite]>[];
|
|
119
169
|
};
|
|
120
170
|
}
|
|
121
|
-
|
|
171
|
+
interface SuiteCollector {
|
|
122
172
|
readonly name: string;
|
|
123
173
|
readonly mode: RunMode;
|
|
124
174
|
test: TestCollector;
|
|
@@ -126,14 +176,14 @@ export interface SuiteCollector {
|
|
|
126
176
|
clear: () => void;
|
|
127
177
|
on: <T extends keyof Suite['hooks']>(name: T, ...fn: Suite['hooks'][T]) => void;
|
|
128
178
|
}
|
|
129
|
-
|
|
130
|
-
|
|
179
|
+
declare type TestFactory = (test: (name: string, fn: TestFunction) => void) => Awaitable<void>;
|
|
180
|
+
interface File {
|
|
131
181
|
filepath: string;
|
|
132
182
|
suites: Suite[];
|
|
133
183
|
collected: boolean;
|
|
134
184
|
error?: unknown;
|
|
135
185
|
}
|
|
136
|
-
|
|
186
|
+
interface RunnerContext {
|
|
137
187
|
filesMap: Record<string, File>;
|
|
138
188
|
files: File[];
|
|
139
189
|
suites: Suite[];
|
|
@@ -142,11 +192,11 @@ export interface RunnerContext {
|
|
|
142
192
|
reporter: Reporter;
|
|
143
193
|
snapshotManager: SnapshotManager;
|
|
144
194
|
}
|
|
145
|
-
|
|
195
|
+
interface GlobalContext {
|
|
146
196
|
suites: SuiteCollector[];
|
|
147
197
|
currentSuite: SuiteCollector | null;
|
|
148
198
|
}
|
|
149
|
-
|
|
199
|
+
interface Reporter {
|
|
150
200
|
onStart?: (config: ResolvedConfig) => Awaitable<void>;
|
|
151
201
|
onCollected?: (files: File[], ctx: RunnerContext) => Awaitable<void>;
|
|
152
202
|
onFinished?: (ctx: RunnerContext, files?: File[]) => Awaitable<void>;
|
|
@@ -159,4 +209,5 @@ export interface Reporter {
|
|
|
159
209
|
onWatcherStart?: (ctx: RunnerContext) => Awaitable<void>;
|
|
160
210
|
onWatcherRerun?: (files: string[], trigger: string, ctx: RunnerContext) => Awaitable<void>;
|
|
161
211
|
}
|
|
162
|
-
|
|
212
|
+
|
|
213
|
+
export { ConcurrentOptions as C, File as F, GlobalContext as G, HookListener as H, ResolvedConfig as R, SuiteCollector as S, TestFunction as T, UserOptions as U, TestFactory as a, Suite as b, RunMode as c, TaskState as d, Task as e, TestCollector as f, RunnerContext as g, Reporter as h };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vitest",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.38",
|
|
4
4
|
"description": "A blazing fast unit test framework powered by Vite",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"vite",
|
|
@@ -8,6 +8,9 @@
|
|
|
8
8
|
"test",
|
|
9
9
|
"jest"
|
|
10
10
|
],
|
|
11
|
+
"engines": {
|
|
12
|
+
"node": ">=16.0.0"
|
|
13
|
+
},
|
|
11
14
|
"homepage": "https://github.com/antfu/vitest#readme",
|
|
12
15
|
"bugs": {
|
|
13
16
|
"url": "https://github.com/antfu/vitest/issues"
|
|
@@ -40,7 +43,8 @@
|
|
|
40
43
|
],
|
|
41
44
|
"scripts": {
|
|
42
45
|
"prepare": "esmo scripts/generate-types.ts",
|
|
43
|
-
"build": "
|
|
46
|
+
"build": "tsup --dts --minify",
|
|
47
|
+
"dev": "tsup --watch src",
|
|
44
48
|
"lint": "eslint \"{src,test}/**/*.ts\"",
|
|
45
49
|
"prepublishOnly": "nr build",
|
|
46
50
|
"release": "bumpp --commit --push --tag && esmo scripts/publish.ts",
|
|
@@ -48,8 +52,7 @@
|
|
|
48
52
|
"test:core": "node bin/vitest.mjs --dev -r test/core",
|
|
49
53
|
"test:vue": "node bin/vitest.mjs --dev -r test/vue",
|
|
50
54
|
"test:react": "node bin/vitest.mjs --dev -r test/react",
|
|
51
|
-
"coverage": "node bin/vitest.mjs --dev -r test/core --coverage"
|
|
52
|
-
"watch": "tsc -p src/tsconfig.json --watch"
|
|
55
|
+
"coverage": "node bin/vitest.mjs --dev -r test/core --coverage"
|
|
53
56
|
},
|
|
54
57
|
"dependencies": {
|
|
55
58
|
"@antfu/utils": "^0.3.0",
|
|
@@ -62,6 +65,7 @@
|
|
|
62
65
|
"diff": "^5.0.0",
|
|
63
66
|
"fast-glob": "^3.2.7",
|
|
64
67
|
"find-up": "^6.2.0",
|
|
68
|
+
"happy-dom": "^2.24.4",
|
|
65
69
|
"jest-snapshot": "^27.4.2",
|
|
66
70
|
"jest-util": "^27.4.2",
|
|
67
71
|
"jsdom": "^19.0.0",
|
|
@@ -90,6 +94,7 @@
|
|
|
90
94
|
"esno": "^0.12.1",
|
|
91
95
|
"npm-run-all": "^4.1.5",
|
|
92
96
|
"rimraf": "^3.0.2",
|
|
97
|
+
"tsup": "^5.10.3",
|
|
93
98
|
"typescript": "^4.5.2",
|
|
94
99
|
"vite": "^2.7.1"
|
|
95
100
|
}
|
package/dist/constants.d.ts
DELETED
package/dist/constants.js
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
export const defaultIncludes = ['**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'];
|
|
2
|
-
export const defaultExcludes = ['**/node_modules/**', '**/dist/**'];
|
|
3
|
-
export const globalApis = [
|
|
4
|
-
// suite
|
|
5
|
-
'suite',
|
|
6
|
-
'test',
|
|
7
|
-
'describe',
|
|
8
|
-
'it',
|
|
9
|
-
// chai
|
|
10
|
-
'chai',
|
|
11
|
-
'expect',
|
|
12
|
-
'assert',
|
|
13
|
-
// sinon
|
|
14
|
-
'sinon',
|
|
15
|
-
'spy',
|
|
16
|
-
'mock',
|
|
17
|
-
'stub',
|
|
18
|
-
// hooks
|
|
19
|
-
'beforeAll',
|
|
20
|
-
'afterAll',
|
|
21
|
-
'beforeEach',
|
|
22
|
-
'afterEach',
|
|
23
|
-
];
|
|
24
|
-
export const defaultConcurrentTimeout = 5000;
|
package/dist/context.d.ts
DELETED
package/dist/context.js
DELETED