vitest 0.0.35 → 0.0.39

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.
Files changed (64) hide show
  1. package/README.gh.md +32 -3
  2. package/dist/chunk-7SGHSD2B.js +1 -0
  3. package/dist/chunk-F27UALKJ.js +1 -0
  4. package/dist/chunk-SAR64N7W.js +1 -0
  5. package/dist/chunk-TUQVO6ML.js +1 -0
  6. package/dist/chunk-XPSQDVUG.js +1 -0
  7. package/dist/global-PFX5FMYU.js +1 -0
  8. package/dist/happy-dom-RNJZR3YC.js +1 -0
  9. package/dist/index.d.ts +108 -6
  10. package/dist/index.js +1 -4
  11. package/dist/jsdom-6QAZGE6T.js +1 -0
  12. package/dist/node/cli.d.ts +5 -1
  13. package/dist/node/cli.js +7 -86
  14. package/dist/node/entry.d.ts +1 -1
  15. package/dist/node/entry.js +19 -12
  16. package/dist/{types.d.ts → types-91b8a38d.d.ts} +75 -26
  17. package/package.json +8 -4
  18. package/dist/constants.d.ts +0 -4
  19. package/dist/constants.js +0 -24
  20. package/dist/context.d.ts +0 -2
  21. package/dist/context.js +0 -4
  22. package/dist/integrations/chai/index.d.ts +0 -3
  23. package/dist/integrations/chai/index.js +0 -3
  24. package/dist/integrations/chai/jest-expect.d.ts +0 -2
  25. package/dist/integrations/chai/jest-expect.js +0 -67
  26. package/dist/integrations/chai/setup.d.ts +0 -2
  27. package/dist/integrations/chai/setup.js +0 -11
  28. package/dist/integrations/chai/snapshot/index.d.ts +0 -8
  29. package/dist/integrations/chai/snapshot/index.js +0 -27
  30. package/dist/integrations/chai/snapshot/manager.d.ts +0 -30
  31. package/dist/integrations/chai/snapshot/manager.js +0 -77
  32. package/dist/integrations/chai/snapshot/utils/jest-config-helper.d.ts +0 -3
  33. package/dist/integrations/chai/snapshot/utils/jest-config-helper.js +0 -39
  34. package/dist/integrations/chai/snapshot/utils/jest-reporters-lite.d.ts +0 -2
  35. package/dist/integrations/chai/snapshot/utils/jest-reporters-lite.js +0 -71
  36. package/dist/integrations/chai/snapshot/utils/jest-test-result-helper.d.ts +0 -6
  37. package/dist/integrations/chai/snapshot/utils/jest-test-result-helper.js +0 -66
  38. package/dist/integrations/chai/snapshot/utils/types.d.ts +0 -29
  39. package/dist/integrations/chai/snapshot/utils/types.js +0 -1
  40. package/dist/integrations/chai/types.d.ts +0 -3
  41. package/dist/integrations/chai/types.js +0 -1
  42. package/dist/integrations/dom/happy-dom.d.ts +0 -5
  43. package/dist/integrations/dom/happy-dom.js +0 -18
  44. package/dist/integrations/dom/jsdom.d.ts +0 -5
  45. package/dist/integrations/dom/jsdom.js +0 -21
  46. package/dist/integrations/dom/keys.d.ts +0 -1
  47. package/dist/integrations/dom/keys.js +0 -220
  48. package/dist/integrations/global.d.ts +0 -1
  49. package/dist/integrations/global.js +0 -8
  50. package/dist/integrations/sinon.d.ts +0 -3
  51. package/dist/integrations/sinon.js +0 -5
  52. package/dist/node/node.d.ts +0 -27
  53. package/dist/node/node.js +0 -167
  54. package/dist/reporters/default.d.ts +0 -24
  55. package/dist/reporters/default.js +0 -149
  56. package/dist/reporters/error.d.ts +0 -9
  57. package/dist/reporters/error.js +0 -183
  58. package/dist/run/index.d.ts +0 -8
  59. package/dist/run/index.js +0 -271
  60. package/dist/suite.d.ts +0 -56
  61. package/dist/suite.js +0 -142
  62. package/dist/types.js +0 -1
  63. package/dist/utils/hook.d.ts +0 -5
  64. 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.0 or above
20
+ > Vitest requires Vite v2.7 and Node v16
21
21
 
22
22
  [**Join the Discord!**](https://discord.com/invite/2zYZNngd7y)
23
23
 
@@ -174,7 +174,7 @@ For convenience, we also provide a shorthand for passing `--coverage` option to
174
174
  $ vitest --coverage
175
175
  ```
176
176
 
177
- For more configuration avaliable, please refer to [c8](https://github.com/bcoe/c8)'s documentation.
177
+ For more configuration available, please refer to [c8](https://github.com/bcoe/c8)'s documentation.
178
178
 
179
179
  ## Filtering
180
180
 
@@ -271,8 +271,36 @@ describe('suite', () => {
271
271
  })
272
272
  ```
273
273
 
274
- You can also use `.skip`, `.only`, and `.todo` with concurrent tasks. All the following combinations are valid:
274
+ If you use `.concurrent` in a suite, every tasks in it will be run in parallel
275
+ ```ts
276
+ // The two tasks marked with concurrent will be run in parallel
277
+ describe.concurrent('suite', () => {
278
+ it('concurrent task 1', () => {
279
+ assert.equal(Math.sqrt(4), 3)
280
+ })
281
+ it('concurrent task 2', () => {
282
+ assert.equal(Math.sqrt(4), 3)
283
+ })
284
+ // No effect, same as not using .concurrent
285
+ it.concurrent('concurrent task 3', () => {
286
+ assert.equal(Math.sqrt(4), 3)
287
+ })
288
+ })
289
+ ```
290
+
291
+ You can also use `.skip`, `.only`, and `.todo` with concurrent suite and tasks. All the following combinations are valid:
275
292
  ```js
293
+ describe.concurrent(...)
294
+
295
+ describe.skip.concurrent(...)
296
+ describe.concurrent.skip(...)
297
+
298
+ describe.only.concurrent(...)
299
+ describe.concurrent.only(...)
300
+
301
+ describe.todo.concurrent(...)
302
+ describe.concurrent.todo(...)
303
+
276
304
  it.concurrent(...)
277
305
 
278
306
  it.skip.concurrent(...)
@@ -285,6 +313,7 @@ it.todo.concurrent(...)
285
313
  it.concurrent.todo(...)
286
314
  ```
287
315
 
316
+
288
317
  ## Sponsors
289
318
 
290
319
  <p align="center">
@@ -0,0 +1 @@
1
+ import{a as F,b as h,f as y}from"./chunk-XPSQDVUG.js";y();y();var d={suites:[],currentSuite:null};var S=R(),k=S("");function c(){return d.currentSuite||k}function l(o,e=()=>{},r,i){let s=[],t=[],n={name:o,mode:r,hooks:{beforeAll:[],afterAll:[],beforeEach:[],afterEach:[]}},u=E((f,a,p,g)=>{s.push({name:f,mode:p,computeMode:g??i??"serial",suite:{},state:p!=="run"&&p!=="only"?p:void 0,fn:a})}),T={name:o,mode:r,test:u,collect:b,clear:C,on:x};function x(f,...a){n.hooks[f].push(...a)}function C(){s.length=0,t.length=0}async function b(f){t.length=0,e&&await e(u);let a=[...t,...s],p=h(F({},n),{tasks:a,file:f});return a.forEach(g=>{g.suite=p,f&&(g.file=f)}),p}return d.currentSuite=T,d.suites.push(T),T}function E(o){function e(n,u){o(n,u,"run")}e.concurrent=r,e.skip=i,e.only=s,e.todo=t;function r(n,u){o(n,u,"run","concurrent")}r.skip=(n,u)=>o(n,u,"skip","concurrent"),r.only=(n,u)=>o(n,u,"only","concurrent"),r.todo=t;function i(n,u){o(n,u,"skip")}i.concurrent=r.skip;function s(n,u){o(n,u,"only")}s.concurrent=r.only;function t(n){o(n,()=>{},"todo")}return t.concurrent=t,e}var A=function(){function o(t,n){return c().test(t,n)}function e(t,n){return c().test.concurrent(t,n)}e.skip=(t,n)=>c().test.concurrent.skip(t,n),e.only=(t,n)=>c().test.concurrent.only(t,n),e.todo=t=>c().test.concurrent.todo(t);function r(t,n){return c().test.skip(t,n)}r.concurrent=(t,n)=>c().test.skip.concurrent(t,n);function i(t,n){return c().test.only(t,n)}i.concurrent=(t,n)=>c().test.only.concurrent(t,n);function s(t){return c().test.todo(t)}return s.concurrent=t=>c().test.todo.concurrent(t),o.concurrent=e,o.skip=r,o.only=i,o.todo=s,o}();function R(){function o(t,n){return l(t,n,"run")}function e(t,n){return l(t,n,"run","concurrent")}e.skip=(t,n)=>l(t,n,"skip","concurrent"),e.only=(t,n)=>l(t,n,"only","concurrent"),e.todo=t=>l(t,void 0,"todo");function r(t,n){return l(t,n,"skip")}r.concurrent=e.skip;function i(t,n){return l(t,n,"only")}i.concurrent=e.only;function s(t){return l(t,void 0,"todo")}return s.concurrent=e.todo,o.concurrent=e,o.skip=r,o.only=i,o.todo=s,o}var v=S,w=A,B=o=>c().on("beforeAll",o),H=o=>c().on("afterAll",o),P=o=>c().on("beforeEach",o),Q=o=>c().on("afterEach",o);function j(){d.suites.length=0,k.clear(),d.currentSuite=k}export{d as a,S as b,k as c,A as d,v as e,w as f,B as g,H as h,P as i,Q as j,j as k};
@@ -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
+ import{f as s}from"./chunk-XPSQDVUG.js";s();var c=["**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}"],o=["**/node_modules/**","**/dist/**"],l=["suite","test","describe","it","chai","expect","assert","sinon","spy","mock","stub","beforeAll","afterAll","beforeEach","afterEach"];export{c as a,o as b,l as c};
@@ -0,0 +1 @@
1
+ import{b as r,c as a,d as s,e as l,f as c,g as d,h as u,i as p,j as f,k as x}from"./chunk-7SGHSD2B.js";import{d as i,f as e}from"./chunk-XPSQDVUG.js";var h={};i(h,{afterAll:()=>u,afterEach:()=>f,assert:()=>v,beforeAll:()=>d,beforeEach:()=>p,chai:()=>g,clearContext:()=>x,defaultSuite:()=>a,describe:()=>l,expect:()=>C,it:()=>c,mock:()=>k,should:()=>m,sinon:()=>t,spy:()=>S,stub:()=>T,suite:()=>r,test:()=>s});e();e();e();import g from"chai";import{assert as v,should as m,expect as C}from"chai";e();import t from"sinon";var{mock:k,spy:S,stub:T}=t;t.fn=t.spy;export{g as a,v as b,m as c,C as d,t as e,k as f,S as g,T as h,h as i};
@@ -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 r}from"./chunk-TUQVO6ML.js";import{c as l}from"./chunk-SAR64N7W.js";import"./chunk-7SGHSD2B.js";import{f as i}from"./chunk-XPSQDVUG.js";i();function a(){l.forEach(o=>{globalThis[o]=r[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,108 @@
1
- import { UserOptions } from './types';
2
- export * from './types';
3
- export * from './suite';
4
- export * from './integrations/chai';
5
- export * from './integrations/sinon';
1
+ import * as pretty_format from 'pretty-format';
2
+ import { T as TestFactory, S as SuiteCollector, a as TestFunction, b as Suite, U as UserOptions } from './types-91b8a38d';
3
+ export { C as ComputeMode, 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, T as TestFactory, a as TestFunction, U as UserOptions } from './types-91b8a38d';
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 suite: {
12
+ (suiteName: string, factory?: TestFactory | undefined): SuiteCollector;
13
+ concurrent: {
14
+ (suiteName: string, factory?: TestFactory | undefined): SuiteCollector;
15
+ skip(suiteName: string, factory?: TestFactory | undefined): SuiteCollector;
16
+ only(suiteName: string, factory?: TestFactory | undefined): SuiteCollector;
17
+ todo(suiteName: string): SuiteCollector;
18
+ };
19
+ skip: {
20
+ (suiteName: string, factory?: TestFactory | undefined): SuiteCollector;
21
+ concurrent: (suiteName: string, factory?: TestFactory | undefined) => SuiteCollector;
22
+ };
23
+ only: {
24
+ (suiteName: string, factory?: TestFactory | undefined): SuiteCollector;
25
+ concurrent: (suiteName: string, factory?: TestFactory | undefined) => SuiteCollector;
26
+ };
27
+ todo: {
28
+ (suiteName: string): SuiteCollector;
29
+ concurrent: (suiteName: string) => SuiteCollector;
30
+ };
31
+ };
32
+ declare const defaultSuite: SuiteCollector;
33
+ declare const test: {
34
+ (name: string, fn: TestFunction): void;
35
+ concurrent: {
36
+ (name: string, fn: TestFunction): void;
37
+ skip(name: string, fn: TestFunction): void;
38
+ only(name: string, fn: TestFunction): void;
39
+ todo(name: string): void;
40
+ };
41
+ skip: {
42
+ (name: string, fn: TestFunction): void;
43
+ concurrent(name: string, fn: TestFunction): void;
44
+ };
45
+ only: {
46
+ (name: string, fn: TestFunction): void;
47
+ concurrent(name: string, fn: TestFunction): void;
48
+ };
49
+ todo: {
50
+ (name: string): void;
51
+ concurrent(name: string): void;
52
+ };
53
+ };
54
+ declare const describe: {
55
+ (suiteName: string, factory?: TestFactory | undefined): SuiteCollector;
56
+ concurrent: {
57
+ (suiteName: string, factory?: TestFactory | undefined): SuiteCollector;
58
+ skip(suiteName: string, factory?: TestFactory | undefined): SuiteCollector;
59
+ only(suiteName: string, factory?: TestFactory | undefined): SuiteCollector;
60
+ todo(suiteName: string): SuiteCollector;
61
+ };
62
+ skip: {
63
+ (suiteName: string, factory?: TestFactory | undefined): SuiteCollector;
64
+ concurrent: (suiteName: string, factory?: TestFactory | undefined) => SuiteCollector;
65
+ };
66
+ only: {
67
+ (suiteName: string, factory?: TestFactory | undefined): SuiteCollector;
68
+ concurrent: (suiteName: string, factory?: TestFactory | undefined) => SuiteCollector;
69
+ };
70
+ todo: {
71
+ (suiteName: string): SuiteCollector;
72
+ concurrent: (suiteName: string) => SuiteCollector;
73
+ };
74
+ };
75
+ declare const it: {
76
+ (name: string, fn: TestFunction): void;
77
+ concurrent: {
78
+ (name: string, fn: TestFunction): void;
79
+ skip(name: string, fn: TestFunction): void;
80
+ only(name: string, fn: TestFunction): void;
81
+ todo(name: string): void;
82
+ };
83
+ skip: {
84
+ (name: string, fn: TestFunction): void;
85
+ concurrent(name: string, fn: TestFunction): void;
86
+ };
87
+ only: {
88
+ (name: string, fn: TestFunction): void;
89
+ concurrent(name: string, fn: TestFunction): void;
90
+ };
91
+ todo: {
92
+ (name: string): void;
93
+ concurrent(name: string): void;
94
+ };
95
+ };
96
+ declare const beforeAll: (fn: Suite['hooks']['beforeAll'][0]) => void;
97
+ declare const afterAll: (fn: Suite['hooks']['afterAll'][0]) => void;
98
+ declare const beforeEach: (fn: Suite['hooks']['beforeEach'][0]) => void;
99
+ declare const afterEach: (fn: Suite['hooks']['afterEach'][0]) => void;
100
+ declare function clearContext(): void;
101
+
102
+ declare const mock: sinon.SinonMockStatic;
103
+ declare const spy: sinon.SinonSpyStatic;
104
+ declare const stub: sinon.SinonStubStatic;
105
+
6
106
  declare module 'vite' {
7
107
  interface UserConfig {
8
108
  /**
@@ -35,7 +135,9 @@ declare global {
35
135
  toHaveBeenCalledWith(...args: any[]): void;
36
136
  }
37
137
  interface ExpectStatic {
38
- addSnapshotSerializer: import('pretty-format').Plugin;
138
+ addSnapshotSerializer: pretty_format.Plugin;
39
139
  }
40
140
  }
41
141
  }
142
+
143
+ export { afterAll, afterEach, beforeAll, beforeEach, clearContext, defaultSuite, describe, it, mock, spy, stub, suite, test };
package/dist/index.js CHANGED
@@ -1,4 +1 @@
1
- export * from './types';
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-TUQVO6ML.js";import{b as a,c as b,d as c,e as d,f as e,g as f,h as g,i as h,j as i,k as j}from"./chunk-7SGHSD2B.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,b 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,a as suite,c 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};
@@ -1,4 +1,8 @@
1
- import type { UserOptions } from '../types';
1
+ import { U as UserOptions } from '../types-91b8a38d';
2
+ import '@antfu/utils';
3
+ import 'jest-snapshot';
4
+ import 'jest-snapshot/build/State';
5
+
2
6
  declare global {
3
7
  namespace NodeJS {
4
8
  interface Process {
package/dist/node/cli.js CHANGED
@@ -1,86 +1,7 @@
1
- /* eslint-disable no-console */
2
- import { fileURLToPath } from 'url';
3
- import { resolve, dirname } from 'path';
4
- import { findUp } from 'find-up';
5
- import sade from 'sade';
6
- import c from 'picocolors';
7
- import { run as startViteNode } from './node.js';
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('--dom', 'mock browser api using jsdom or happy-dom', '')
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.39";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);
@@ -1 +1 @@
1
- export {};
1
+
@@ -1,12 +1,19 @@
1
- import { run } from '../run';
2
- if (!process.__vite_node__ || !process.__vitest__)
3
- throw new Error('Vitest can only run in vite-node environment, please use the CLI to start the process');
4
- const inlineOptions = process.__vite_node__.server.config.test || {};
5
- const cliOptions = process.__vitest__.options || {};
6
- const options = Object.assign(Object.assign({}, cliOptions), inlineOptions);
7
- await run(options);
8
- const timer = setTimeout(() => {
9
- // TODO: warn user and maybe error out
10
- process.exit();
11
- }, 500);
12
- timer.unref();
1
+ import{a as q,b as z}from"../chunk-SAR64N7W.js";import{a as F,c as I,k as K}from"../chunk-7SGHSD2B.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),o=/[^\u0000-\u0080]+/.test(t);return e||o?t:t.replace(/\\/g,"/")}});c();c();c();import oe 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},o=t.getUncheckedCount(),n=t.getUncheckedKeys();o&&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:o,e.uncheckedKeys=Array.from(n),e},J=(t,e,o)=>{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:o,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 o=C.dirname(e),n=C.basename(e);return(0,Q.default)(g.dim(o+C.sep)+g.bold(n))},$=" \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 o=[];if(o.push(be("Snapshot Summary")),e.added&&o.push(`${Ce(`${$+m("snapshot",e.added)} written `)}from ${m("test suite",e.filesAdded)}.`),e.unmatched&&o.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&&o.push(`${Te(`${$+m("snapshot",e.updated)} updated `)}from ${m("test suite",e.filesUpdated)}.`),e.filesRemoved&&(e.didUpdate?o.push(`${ee(`${$}${m("snapshot file",e.filesRemoved)} removed `)}from ${m("test suite",e.filesRemoved)}.`):o.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[n,...r]=e.filesRemovedList;o.push(` ${X} ${E}${_(t,n)}`),r.forEach(s=>{o.push(` ${E}${_(t,s)}`)})}return e.unchecked&&(e.didUpdate?o.push(`${ee(`${$}${m("snapshot",e.unchecked)} removed `)}from ${m("test suite",e.uncheckedKeysByFile.length)}.`):o.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(n=>{o.push(` ${X}${_(t,n.filePath)}`),n.keys.forEach(r=>{o.push(` ${E}${r}`)})})),o};var{expect:Re}=Me,{SnapshotState:Oe}=xe,D=class{snapshotState=null;snapshotSummary;snapshotOptions;context=null;testFile="";snapshotResolver;rootDir;constructor({rootDir:e,update:o,snapshotResolver:n=null}){this.rootDir=e,this.snapshotResolver=n;let r=process.env,s=!!r.CI,i=o||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 o;this.setContext({file:((o=e.file)==null?void 0:o.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,o){if(!this.snapshotState||!this.context)return;let{actual:n,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(n.trim()).equals(r?r.trim():"",o||`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}=oe,b;function T(){return b}async function ne(t){let{root:e}=t;return b=new D({rootDir:e,update:t.update}),b.snapshotResolver=await oe.buildSnapshotResolver({transform:[],rootDir:e}),function(o,n){for(let r of["matchSnapshot","toMatchSnapshot"])n.addMethod(o.Assertion.prototype,r,function(s){let i=n.flag(this,"object");b.assert(i,s)});o.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};K();try{await import(r);let i=[I,...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 n=Object.values(e).reduce((r,s)=>r.concat(s.suites),[]);return L(n),n.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:o,filesMap:n}=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;o.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(n,k),await N(k,t),o.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,o=new Set,n=new Set){if(n.has(t)||o.has(t))return o;if(n.add(t),t in e.filesMap)return o.add(t),o;let r=process.__vite_node__.server.moduleGraph.getModuleById(t);return r&&r.importers.forEach(s=>{s.id&&ie(s.id,e,o,n)}),o}c();c();import x from"chai";import Pe from"sinon-chai";import _e from"chai-subset";c();function re(){return(t,e)=>{let o=t.Assertion.prototype;e.addMethod(o,"toEqual",function(n){return this.eql(n)}),e.addMethod(o,"toStrictEqual",function(n){return this.equal(n)}),e.addMethod(o,"toBe",function(n){return this.equal(n)}),e.addMethod(o,"toMatchObject",function(n){return this.containSubset(n)}),e.addMethod(o,"toMatch",function(n){return typeof n=="string"?this.include(n):this.match(n)}),e.addMethod(o,"toContain",function(n){return this.contain(n)}),e.addMethod(o,"toBeTruthy",function(){let n=e.flag(this,"object");this.assert(Boolean(n),"expected #{this} to be truthy","expected #{this} to not be truthy",n)}),e.addMethod(o,"toBeFalsy",function(){let n=e.flag(this,"object");this.assert(!n,"expected #{this} to be falsy","expected #{this} to not be falsy",n)}),e.addMethod(o,"toBeNaN",function(){return this.be.NaN}),e.addMethod(o,"toBeUndefined",function(){return this.be.undefined}),e.addMethod(o,"toBeNull",function(){return this.be.null}),e.addMethod(o,"toBeDefined",function(){return this.not.be.undefined}),e.addMethod(o,"toBeInstanceOf",function(n){return this.instanceOf(n)}),e.addMethod(o,"toHaveBeenCalledTimes",function(n){return this.callCount(n)}),e.addMethod(o,"toHaveBeenCalledOnce",function(){return this.callCount(1)}),e.addMethod(o,"toHaveBeenCalled",function(){return this.called}),e.addMethod(o,"toHaveBeenCalled",function(){return this.called}),e.addMethod(o,"toHaveBeenCalledWith",function(...n){return this.calledWith(...n)})}}async function ae(t){x.use(Pe),x.use(re()),x.use(_e),x.use(await ne(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__,o=t,n=!1,s=Ie(o.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(o.name)}: ${o.message}`)}`),console.log(y.gray(`${s.file}:${d.line}:${d.column}`)),console.log(y.yellow(Ue(w,d))),n=!0}}n||console.error(o),o.showDiff&&console.error(y.gray(Ke(ce(o.actual),ce(o.expected))))}function Le(t,{line:e,column:o}){return new Promise(n=>{if(!t)return n(null);De.with(t,null,r=>{let s=r.originalPositionFor({line:e,column:o});s.line!=null&&s.column!=null?n(s):n(null)})})}var le=/\r?\n/;function Ne(t,e){if(typeof e=="number")return e;let o=t.split(le),{line:n,column:r}=e,s=0;for(let i=0;i<n-1;i++)s+=o[i].length+1;return s+r}function Ue(t,e=0,o,n=2){e=Ne(t,e),o=o||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-n;d<=a+n||o>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,o>s?h-S:o-e);i.push(`${y.gray(" |")} ${" ".repeat(S)}${"^".repeat(k)}`)}else if(d>a){if(o>s){let S=Math.max(Math.min(o-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(n=>{let r=n.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 o=2048;return t.length>o&&(t=`${t.substring(0,o)} ... Lines skipped`),e.length>o&&(e=`${e.substring(0,o)} ... Lines skipped`),qe(t,e)}function qe(t,e){let o=" ";function n(i){return i[0]==="+"?o+y.green(`${i[0]} ${i.slice(1)}`):i[0]==="-"?o+y.red(`${i[0]} ${i.slice(1)}`):i.match(/@@/)?"--":i.match(/\\ No newline/)?null:o+i}let s=Ge("string",t,e).split(`
4
+ `).splice(5);return`
5
+ ${o}${y.red("- actual")}
6
+ ${o}${y.green("+ expected")}
7
+
8
+ ${s.map(n).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 n=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(n(a.tasks),r)}]:n(a.tasks)),r)}})),r),this.listrPromise=this.listr.run().catch(()=>{})}onTaskEnd(e){var o,n;e.state==="fail"?(o=this.taskMap.get(e))==null||o.reject(e.error):(n=this.taskMap.get(e))==null||n.resolve()}async onFinished(e,o=e.files){var v;await this.listrPromise,this.end=ue.now(),console.log();let n=e.snapshotManager.report();n&&console.log(n.join(`
11
+ `));let r=o.flatMap(l=>l.suites),s=r.flatMap(l=>l.tasks),i=o.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 o=e.tasks.filter(n=>n.state==="fail");o.length?console.log(`
17
+ ${u.bold(u.inverse(u.red(" FAIL ")))}${u.red(` ${o.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,o){await this.listrPromise,console.clear(),console.log(u.blue("Re-running tests...")+u.dim(` [ ${this.relative(o)} ]
19
+ `))}onSnapshotUpdate(){}};async function de(t){return await ae(t),t.global&&(await import("../global-PFX5FMYU.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((o,n)=>o.concat(n.suites),[])},get tasks(){return this.suites.reduce((o,n)=>o.concat(n.tasks),[])},config:t,reporter:t.reporter||new W,snapshotManager:T()}}c();import Ye from"fast-glob";async function he(t){var o;let e=await Ye(t.includes||q,{absolute:!0,cwd:t.root,ignore:t.excludes||z});return((o=t.filters)==null?void 0:o.length)&&(e=e.filter(n=>t.filters.some(r=>n.includes(r)))),e}async function O(t,e,o){await Promise.all(t.hooks[e].map(n=>n(...o)))}async function fe(t,e){var n,r,s;let{reporter:o}=e;if((n=T())==null||n.setTask(t),await((r=o.onTaskBegin)==null?void 0:r.call(o,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=o.onTaskEnd)==null?void 0:s.call(o,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 n,r;let{reporter:o}=e;if(await((n=o.onSuiteBegin)==null?void 0:n.call(o,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)){let i=s[0].computeMode;if(i==="serial")for(let a of s)await fe(a,e);else i==="concurrent"&&await Promise.all(s.map(a=>fe(a,e)))}await O(t,"afterAll",[t])}catch(s){t.error=s,t.status="fail",process.exitCode=1}await((r=o.onSuiteEnd)==null?void 0:r.call(o,t,e))}function Qe(t){let e=[],o=[];for(let n of t)e.length===0||n.computeMode===e[0].computeMode?e.push(n):(o.push(e),e=[n]);return e.length>0&&o.push(e),o}async function Xe(t,e){var r,s;let{reporter:o}=e;if(t.suites.filter(i=>i.mode==="run").length!==0){if(await((r=o.onFileBegin)==null?void 0:r.call(o,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=o.onFileEnd)==null?void 0:s.call(o,t,e))}}async function N(t,e){var n;let{reporter:o}=e;await((n=o.onCollected)==null?void 0:n.call(o,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 o=await de(t),{filesMap:n,snapshotManager:r,reporter:s}=o;await((a=s.onStart)==null?void 0:a.call(s,t));let i=await M(e);Object.assign(n,i),await N(n,o),r.saveSnap(),await((d=s.onFinished)==null?void 0:d.call(s,o)),t.watch&&await se(o)}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 ot=setTimeout(()=>{process.exit()},500);ot.unref();
@@ -1,6 +1,56 @@
1
1
  import { Awaitable } from '@antfu/utils';
2
- import { SnapshotManager } from './integrations/chai/snapshot/manager';
3
- export interface UserOptions {
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
  *
@@ -58,53 +108,51 @@ export interface UserOptions {
58
108
  */
59
109
  reporter?: Reporter;
60
110
  }
61
- export interface ResolvedConfig extends Required<UserOptions> {
111
+ interface ResolvedConfig extends Required<UserOptions> {
62
112
  filters?: string[];
63
113
  config?: string;
64
114
  }
65
- export declare type RunMode = 'run' | 'skip' | 'only' | 'todo';
66
- export declare type TaskState = RunMode | 'pass' | 'fail';
67
- export interface ConcurrentOptions {
68
- timeout: number;
69
- }
70
- export interface Task {
115
+ declare type RunMode = 'run' | 'skip' | 'only' | 'todo';
116
+ declare type TaskState = RunMode | 'pass' | 'fail';
117
+ declare type ComputeMode = 'serial' | 'concurrent';
118
+ interface Task {
71
119
  name: string;
72
120
  mode: RunMode;
73
- concurrent?: ConcurrentOptions;
121
+ computeMode: ComputeMode;
74
122
  suite: Suite;
75
123
  fn: () => Awaitable<void>;
76
124
  file?: File;
77
125
  state?: TaskState;
78
126
  error?: unknown;
79
127
  }
80
- export declare type TestFunction = () => Awaitable<void>;
128
+ declare type TestFunction = () => Awaitable<void>;
81
129
  interface ConcurrentCollector {
82
- (name: string, fn: TestFunction, timeout?: number): void;
83
- only: (name: string, fn: TestFunction, timeout?: number) => void;
84
- skip: (name: string, fn: TestFunction, timeout?: number) => void;
130
+ (name: string, fn: TestFunction): void;
131
+ only: (name: string, fn: TestFunction) => void;
132
+ skip: (name: string, fn: TestFunction) => void;
85
133
  todo: (name: string) => void;
86
134
  }
87
135
  interface OnlyCollector {
88
136
  (name: string, fn: TestFunction): void;
89
- concurrent: (name: string, fn: TestFunction, timeout?: number) => void;
137
+ concurrent: (name: string, fn: TestFunction) => void;
90
138
  }
91
139
  interface SkipCollector {
92
140
  (name: string, fn: TestFunction): void;
93
- concurrent: (name: string, fn: TestFunction, timeout?: number) => void;
141
+ concurrent: (name: string, fn: TestFunction) => void;
94
142
  }
95
143
  interface TodoCollector {
96
144
  (name: string): void;
97
145
  concurrent: (name: string) => void;
98
146
  }
99
- export interface TestCollector {
147
+ interface TestCollector {
100
148
  (name: string, fn: TestFunction): void;
101
149
  concurrent: ConcurrentCollector;
102
150
  only: OnlyCollector;
103
151
  skip: SkipCollector;
104
152
  todo: TodoCollector;
105
153
  }
106
- export declare type HookListener<T extends any[]> = (...args: T) => Awaitable<void>;
107
- export interface Suite {
154
+ declare type HookListener<T extends any[]> = (...args: T) => Awaitable<void>;
155
+ interface Suite {
108
156
  name: string;
109
157
  mode: RunMode;
110
158
  tasks: Task[];
@@ -118,7 +166,7 @@ export interface Suite {
118
166
  afterEach: HookListener<[Task, Suite]>[];
119
167
  };
120
168
  }
121
- export interface SuiteCollector {
169
+ interface SuiteCollector {
122
170
  readonly name: string;
123
171
  readonly mode: RunMode;
124
172
  test: TestCollector;
@@ -126,14 +174,14 @@ export interface SuiteCollector {
126
174
  clear: () => void;
127
175
  on: <T extends keyof Suite['hooks']>(name: T, ...fn: Suite['hooks'][T]) => void;
128
176
  }
129
- export declare type TestFactory = (test: (name: string, fn: TestFunction) => void) => Awaitable<void>;
130
- export interface File {
177
+ declare type TestFactory = (test: (name: string, fn: TestFunction) => void) => Awaitable<void>;
178
+ interface File {
131
179
  filepath: string;
132
180
  suites: Suite[];
133
181
  collected: boolean;
134
182
  error?: unknown;
135
183
  }
136
- export interface RunnerContext {
184
+ interface RunnerContext {
137
185
  filesMap: Record<string, File>;
138
186
  files: File[];
139
187
  suites: Suite[];
@@ -142,11 +190,11 @@ export interface RunnerContext {
142
190
  reporter: Reporter;
143
191
  snapshotManager: SnapshotManager;
144
192
  }
145
- export interface GlobalContext {
193
+ interface GlobalContext {
146
194
  suites: SuiteCollector[];
147
195
  currentSuite: SuiteCollector | null;
148
196
  }
149
- export interface Reporter {
197
+ interface Reporter {
150
198
  onStart?: (config: ResolvedConfig) => Awaitable<void>;
151
199
  onCollected?: (files: File[], ctx: RunnerContext) => Awaitable<void>;
152
200
  onFinished?: (ctx: RunnerContext, files?: File[]) => Awaitable<void>;
@@ -159,4 +207,5 @@ export interface Reporter {
159
207
  onWatcherStart?: (ctx: RunnerContext) => Awaitable<void>;
160
208
  onWatcherRerun?: (files: string[], trigger: string, ctx: RunnerContext) => Awaitable<void>;
161
209
  }
162
- export {};
210
+
211
+ export { ComputeMode as C, File as F, GlobalContext as G, HookListener as H, ResolvedConfig as R, SuiteCollector as S, TestFactory as T, UserOptions as U, TestFunction as a, Suite as b, RunMode as c, TaskState as d, Task as e, TestCollector as f, RunnerContext as g, Reporter as h };