vitest 0.0.133 → 0.0.137

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/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ViteDevServer, CommonServerOptions } from 'vite';
1
+ import { ViteDevServer, CommonServerOptions, TransformResult } from 'vite';
2
2
  import { MessagePort } from 'worker_threads';
3
3
  import { SpyImpl } from 'tinyspy';
4
4
  export { Spy, SpyFn } from 'tinyspy';
@@ -307,6 +307,7 @@ declare class Vitest {
307
307
  visitedFilesMap: Map<string, RawSourceMap>;
308
308
  runningPromise?: Promise<void>;
309
309
  closingPromise?: Promise<void>;
310
+ externalizeCache: Map<string, Promise<string | false>>;
310
311
  isFirstRun: boolean;
311
312
  restartsCount: number;
312
313
  private _onRestartListeners;
@@ -327,6 +328,7 @@ declare class Vitest {
327
328
  report<T extends keyof Reporter>(name: T, ...args: ArgumentsType<Reporter[T]>): Promise<void>;
328
329
  globTestFiles(filters?: string[]): Promise<string[]>;
329
330
  isTargetFile(id: string): boolean;
331
+ shouldExternalize(id: string): Promise<string | false>;
330
332
  onServerRestarted(fn: () => void): void;
331
333
  }
332
334
 
@@ -386,9 +388,14 @@ declare class VerboseReporter extends DefaultReporter {
386
388
  }
387
389
 
388
390
  declare class TapReporter implements Reporter {
389
- private ctx;
391
+ protected ctx: Vitest;
392
+ onInit(ctx: Vitest): void;
393
+ protected logTasks(tasks: Task[], currentIdent: string): void;
394
+ onFinished(files?: File[]): Promise<void>;
395
+ }
396
+
397
+ declare class TapFlatReporter extends TapReporter {
390
398
  onInit(ctx: Vitest): void;
391
- logTasks(tasks: Task[], currentIdent: string): void;
392
399
  onFinished(files?: File[]): Promise<void>;
393
400
  }
394
401
 
@@ -397,6 +404,7 @@ declare const ReportersMap: {
397
404
  verbose: typeof VerboseReporter;
398
405
  dot: typeof DotReporter;
399
406
  tap: typeof TapReporter;
407
+ 'tap-flat': typeof TapFlatReporter;
400
408
  };
401
409
  declare type BuiltinReporters = keyof typeof ReportersMap;
402
410
 
@@ -450,6 +458,86 @@ interface ResolvedC8Options extends Required<C8Options> {
450
458
  tempDirectory: string;
451
459
  }
452
460
 
461
+ interface JSDOMOptions {
462
+ /**
463
+ * The html content for the test.
464
+ *
465
+ * @default '<!DOCTYPE html>'
466
+ */
467
+ html?: string | Buffer | ArrayBufferLike;
468
+ /**
469
+ * referrer just affects the value read from document.referrer.
470
+ * It defaults to no referrer (which reflects as the empty string).
471
+ */
472
+ referrer?: string;
473
+ /**
474
+ * userAgent affects the value read from navigator.userAgent, as well as the User-Agent header sent while fetching subresources.
475
+ *
476
+ * @default `Mozilla/5.0 (${process.platform}) AppleWebKit/537.36 (KHTML, like Gecko) jsdom/${jsdomVersion}`
477
+ */
478
+ userAgent?: string;
479
+ /**
480
+ * url sets the value returned by window.location, document.URL, and document.documentURI,
481
+ * and affects things like resolution of relative URLs within the document
482
+ * and the same-origin restrictions and referrer used while fetching subresources.
483
+ *
484
+ * @default 'http://localhost:3000'.
485
+ */
486
+ url?: string;
487
+ /**
488
+ * contentType affects the value read from document.contentType, and how the document is parsed: as HTML or as XML.
489
+ * Values that are not "text/html" or an XML mime type will throw.
490
+ *
491
+ * @default 'text/html'.
492
+ */
493
+ contentType?: string;
494
+ /**
495
+ * The maximum size in code units for the separate storage areas used by localStorage and sessionStorage.
496
+ * Attempts to store data larger than this limit will cause a DOMException to be thrown. By default, it is set
497
+ * to 5,000,000 code units per origin, as inspired by the HTML specification.
498
+ *
499
+ * @default 5_000_000
500
+ */
501
+ storageQuota?: number;
502
+ /**
503
+ * Enable console?
504
+ *
505
+ * @default false
506
+ */
507
+ console?: boolean;
508
+ /**
509
+ * jsdom does not have the capability to render visual content, and will act like a headless browser by default.
510
+ * It provides hints to web pages through APIs such as document.hidden that their content is not visible.
511
+ *
512
+ * When the `pretendToBeVisual` option is set to `true`, jsdom will pretend that it is rendering and displaying
513
+ * content.
514
+ *
515
+ * @default true
516
+ */
517
+ pretendToBeVisual?: boolean;
518
+ /**
519
+ * `includeNodeLocations` preserves the location info produced by the HTML parser,
520
+ * allowing you to retrieve it with the nodeLocation() method (described below).
521
+ *
522
+ * It defaults to false to give the best performance,
523
+ * and cannot be used with an XML content type since our XML parser does not support location info.
524
+ *
525
+ * @default false
526
+ */
527
+ includeNodeLocations?: boolean | undefined;
528
+ /**
529
+ * @default 'dangerously'
530
+ */
531
+ runScripts?: 'dangerously' | 'outside-only';
532
+ /**
533
+ * Enable CookieJar
534
+ *
535
+ * @default false
536
+ */
537
+ cookieJar?: boolean;
538
+ resources?: 'usable' | any;
539
+ }
540
+
453
541
  declare type Awaitable<T> = T | PromiseLike<T>;
454
542
  declare type Nullable<T> = T | null | undefined;
455
543
  declare type Arrayable<T> = T | Array<T>;
@@ -464,7 +552,7 @@ interface EnvironmentReturn {
464
552
  }
465
553
  interface Environment {
466
554
  name: string;
467
- setup(global: any): Awaitable<EnvironmentReturn>;
555
+ setup(global: any, options: Record<string, any>): Awaitable<EnvironmentReturn>;
468
556
  }
469
557
  interface UserConsoleLog {
470
558
  content: string;
@@ -493,6 +581,11 @@ interface ErrorWithDiff extends Error {
493
581
  expected?: any;
494
582
  operator?: string;
495
583
  }
584
+ interface ModuleGraphData {
585
+ graph: Record<string, string[]>;
586
+ externalized: string[];
587
+ inlined: string[];
588
+ }
496
589
 
497
590
  declare type ChainableFunction<T extends string, Args extends any[], R = any> = {
498
591
  (...args: Args): R;
@@ -621,6 +714,13 @@ interface SnapshotSummary {
621
714
 
622
715
  declare type BuiltinEnvironment = 'node' | 'jsdom' | 'happy-dom';
623
716
  declare type ApiConfig = Pick<CommonServerOptions, 'port' | 'strictPort' | 'host'>;
717
+
718
+ interface EnvironmentOptions {
719
+ /**
720
+ * jsdom options.
721
+ */
722
+ jsdom?: JSDOMOptions;
723
+ }
624
724
  interface InlineConfig {
625
725
  /**
626
726
  * Include globs for test files
@@ -682,7 +782,11 @@ interface InlineConfig {
682
782
  */
683
783
  environment?: BuiltinEnvironment;
684
784
  /**
685
- * Update snapshot files
785
+ * Environment options.
786
+ */
787
+ environmentOptions?: EnvironmentOptions;
788
+ /**
789
+ * Update snapshot
686
790
  *
687
791
  * @default false
688
792
  */
@@ -695,6 +799,8 @@ interface InlineConfig {
695
799
  watch?: boolean;
696
800
  /**
697
801
  * Project root
802
+ *
803
+ * @default process.cwd()
698
804
  */
699
805
  root?: string;
700
806
  /**
@@ -788,7 +894,13 @@ interface InlineConfig {
788
894
  * Open Vitest UI
789
895
  * @internal WIP
790
896
  */
791
- open?: boolean;
897
+ ui?: boolean;
898
+ /**
899
+ * Base url for the UI
900
+ *
901
+ * @default '/__vitest__/'
902
+ */
903
+ uiBase?: string;
792
904
  }
793
905
  interface UserConfig extends InlineConfig {
794
906
  /**
@@ -839,8 +951,12 @@ interface WorkerContext {
839
951
  files: string[];
840
952
  invalidates?: string[];
841
953
  }
954
+ declare type FetchFunction = (id: string) => Promise<{
955
+ code?: string;
956
+ externalize?: string;
957
+ }>;
842
958
  interface WorkerRPC {
843
- fetch: (id: string) => Promise<string | undefined>;
959
+ fetch: FetchFunction;
844
960
  getSourceMap: (id: string, force?: boolean) => Promise<RawSourceMap | undefined>;
845
961
  onWorkerExit: (code?: number) => void;
846
962
  onUserLog: (log: UserConsoleLog) => void;
@@ -874,11 +990,11 @@ interface MockResultThrow {
874
990
  value: any;
875
991
  }
876
992
  declare type MockResult<T> = MockResultReturn<T> | MockResultThrow | MockResultIncomplete;
877
- interface JestMockCompatContext<T, Y> {
878
- calls: Y[];
879
- instances: T[];
993
+ interface JestMockCompatContext<TArgs, TReturns> {
994
+ calls: TArgs[];
995
+ instances: TReturns[];
880
996
  invocationCallOrder: number[];
881
- results: MockResult<T>[];
997
+ results: MockResult<TReturns>[];
882
998
  }
883
999
  declare type Procedure = (...args: any[]) => any;
884
1000
  declare type Methods<T> = {
@@ -1022,16 +1138,16 @@ declare class VitestUtils {
1022
1138
  declare const vitest: VitestUtils;
1023
1139
  declare const vi: VitestUtils;
1024
1140
 
1141
+ interface TransformResultWithSource extends TransformResult {
1142
+ source?: string;
1143
+ }
1025
1144
  interface WebSocketHandlers {
1026
1145
  getFiles(): File[];
1027
1146
  getConfig(): ResolvedConfig;
1147
+ getModuleGraph(id: string): Promise<ModuleGraphData>;
1148
+ getTransformResult(id: string): Promise<TransformResultWithSource | undefined>;
1028
1149
  readFile(id: string): Promise<string>;
1029
1150
  writeFile(id: string, content: string): Promise<void>;
1030
- getModuleGraph(id: string): Promise<{
1031
- graph: Record<string, string[]>;
1032
- externalized: string[];
1033
- inlined: string[];
1034
- }>;
1035
1151
  rerun(files: string[]): Promise<void>;
1036
1152
  }
1037
1153
  interface WebSocketEvents extends Pick<Reporter, 'onCollected' | 'onTaskUpdate'> {
@@ -1062,6 +1178,8 @@ declare global {
1062
1178
  anything(): Anything;
1063
1179
  any(constructor: unknown): Any;
1064
1180
  addSnapshotSerializer(plugin: Plugin): void;
1181
+ getState(): MatcherState;
1182
+ setState(state: Partial<MatcherState>): void;
1065
1183
  not: AsymmetricMatchersContaining;
1066
1184
  }
1067
1185
  interface JestAssertions {
@@ -1128,4 +1246,4 @@ declare global {
1128
1246
  }
1129
1247
  }
1130
1248
 
1131
- export { ApiConfig, ArgumentsType, Arrayable, Awaitable, BuiltinEnvironment, DoneCallback, EnhancedSpy, Environment, EnvironmentReturn, ErrorWithDiff, File, HookListener, InlineConfig, JestMockCompat, JestMockCompatContext, JestMockCompatFn, MaybeMocked, MaybeMockedConstructor, MaybeMockedDeep, MockWithArgs, MockedFunction, MockedFunctionDeep, MockedObject, MockedObjectDeep, ModuleCache, Nullable, ParsedStack, Position, Reporter, ResolvedConfig, RunMode, RuntimeContext, SnapshotData, SnapshotMatchOptions, SnapshotResult, SnapshotStateOptions, SnapshotSummary, SnapshotUpdateState, Suite, SuiteCollector, SuiteHooks, Task, TaskBase, TaskResult, TaskResultPack, TaskState, Test, TestCollector, TestFactory, TestFunction, UncheckedSnapshot, UserConfig, UserConsoleLog, WebSocketEvents, WebSocketHandlers, WorkerContext, WorkerRPC, afterAll, afterEach, beforeAll, beforeEach, describe, expect, fn, isMockFunction, it, spies, spyOn, suite, test, vi, vitest };
1249
+ export { ApiConfig, ArgumentsType, Arrayable, Awaitable, BuiltinEnvironment, DoneCallback, EnhancedSpy, Environment, EnvironmentOptions, EnvironmentReturn, ErrorWithDiff, FetchFunction, File, HookListener, InlineConfig, JSDOMOptions, JestMockCompat, JestMockCompatContext, JestMockCompatFn, MaybeMocked, MaybeMockedConstructor, MaybeMockedDeep, MockWithArgs, MockedFunction, MockedFunctionDeep, MockedObject, MockedObjectDeep, ModuleCache, ModuleGraphData, Nullable, ParsedStack, Position, Reporter, ResolvedConfig, RunMode, RuntimeContext, SnapshotData, SnapshotMatchOptions, SnapshotResult, SnapshotStateOptions, SnapshotSummary, SnapshotUpdateState, Suite, SuiteCollector, SuiteHooks, Task, TaskBase, TaskResult, TaskResultPack, TaskState, Test, TestCollector, TestFactory, TestFunction, TransformResultWithSource, UncheckedSnapshot, UserConfig, UserConsoleLog, WebSocketEvents, WebSocketHandlers, WorkerContext, WorkerRPC, afterAll, afterEach, beforeAll, beforeEach, describe, expect, fn, isMockFunction, it, spies, spyOn, suite, test, vi, vitest };
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
- export { d as describe, i as it, c as suite, t as test, e as vi, v as vitest } from './vi-aec007e7.js';
2
- export { a as afterAll, d as afterEach, b as beforeAll, c as beforeEach, e as expect } from './index-354a6abd.js';
3
- export { f as fn, i as isMockFunction, s as spies, a as spyOn } from './jest-mock-30625866.js';
1
+ export { d as describe, i as it, c as suite, t as test, e as vi, v as vitest } from './vi-567ba572.js';
2
+ export { a as afterAll, d as afterEach, b as beforeAll, c as beforeEach, e as expect } from './index-314cb4d9.js';
3
+ export { f as fn, i as isMockFunction, s as spies, a as spyOn } from './jest-mock-6c629944.js';
4
4
  export { assert, default as chai, should } from 'chai';
5
- import './index-720a83c6.js';
5
+ import './index-64aafe4b.js';
6
6
  import 'url';
7
7
  import 'tty';
8
8
  import 'local-pkg';
@@ -0,0 +1,95 @@
1
+ import { util } from 'chai';
2
+ import * as tinyspy from 'tinyspy';
3
+
4
+ const spies = new Set();
5
+ function isMockFunction(fn2) {
6
+ return typeof fn2 === "function" && "__isSpy" in fn2 && fn2.__isSpy;
7
+ }
8
+ function spyOn(obj, method, accessType) {
9
+ const dictionary = {
10
+ get: "getter",
11
+ set: "setter"
12
+ };
13
+ const objMethod = accessType ? { [dictionary[accessType]]: method } : method;
14
+ const stub = tinyspy.spyOn(obj, objMethod);
15
+ return enhanceSpy(stub);
16
+ }
17
+ function enhanceSpy(spy) {
18
+ const stub = spy;
19
+ let implementation;
20
+ let instances = [];
21
+ const mockContext = {
22
+ get calls() {
23
+ return stub.calls;
24
+ },
25
+ get instances() {
26
+ return instances;
27
+ },
28
+ get invocationCallOrder() {
29
+ return [];
30
+ },
31
+ get results() {
32
+ return stub.results.map(([callType, value]) => {
33
+ const type = callType === "error" ? "throw" : "return";
34
+ return { type, value };
35
+ });
36
+ }
37
+ };
38
+ let onceImplementations = [];
39
+ let name = stub.name;
40
+ stub.getMockName = () => name || "vi.fn()";
41
+ stub.mockName = (n) => {
42
+ name = n;
43
+ return stub;
44
+ };
45
+ stub.mockClear = () => {
46
+ stub.reset();
47
+ instances = [];
48
+ return stub;
49
+ };
50
+ stub.mockReset = () => {
51
+ stub.mockClear();
52
+ implementation = () => void 0;
53
+ onceImplementations = [];
54
+ return stub;
55
+ };
56
+ stub.mockRestore = () => {
57
+ stub.mockReset();
58
+ implementation = void 0;
59
+ return stub;
60
+ };
61
+ stub.getMockImplementation = () => implementation;
62
+ stub.mockImplementation = (fn2) => {
63
+ implementation = fn2;
64
+ return stub;
65
+ };
66
+ stub.mockImplementationOnce = (fn2) => {
67
+ onceImplementations.push(fn2);
68
+ return stub;
69
+ };
70
+ stub.mockReturnThis = () => stub.mockImplementation(function() {
71
+ return this;
72
+ });
73
+ stub.mockReturnValue = (val) => stub.mockImplementation(() => val);
74
+ stub.mockReturnValueOnce = (val) => stub.mockImplementationOnce(() => val);
75
+ stub.mockResolvedValue = (val) => stub.mockImplementation(() => Promise.resolve(val));
76
+ stub.mockResolvedValueOnce = (val) => stub.mockImplementationOnce(() => Promise.resolve(val));
77
+ stub.mockRejectedValue = (val) => stub.mockImplementation(() => Promise.reject(val));
78
+ stub.mockRejectedValueOnce = (val) => stub.mockImplementationOnce(() => Promise.reject(val));
79
+ util.addProperty(stub, "mock", () => mockContext);
80
+ stub.willCall(function(...args) {
81
+ instances.push(this);
82
+ const impl = onceImplementations.shift() || implementation || stub.getOriginal() || (() => {
83
+ });
84
+ return impl.apply(this, args);
85
+ });
86
+ spies.add(stub);
87
+ return stub;
88
+ }
89
+ function fn(implementation) {
90
+ return enhanceSpy(tinyspy.spyOn({ fn: implementation || (() => {
91
+ }) }, "fn"));
92
+ }
93
+
94
+ export { spyOn as a, fn as f, isMockFunction as i, spies as s };
95
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamVzdC1tb2NrLTZjNjI5OTQ0LmpzIiwic291cmNlcyI6WyIuLi9zcmMvaW50ZWdyYXRpb25zL2plc3QtbW9jay50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1dGlsIH0gZnJvbSAnY2hhaSdcbmltcG9ydCB0eXBlIHsgU3B5SW1wbCB9IGZyb20gJ3RpbnlzcHknXG5pbXBvcnQgKiBhcyB0aW55c3B5IGZyb20gJ3RpbnlzcHknXG5cbmludGVyZmFjZSBNb2NrUmVzdWx0UmV0dXJuPFQ+IHtcbiAgdHlwZTogJ3JldHVybidcbiAgdmFsdWU6IFRcbn1cbmludGVyZmFjZSBNb2NrUmVzdWx0SW5jb21wbGV0ZSB7XG4gIHR5cGU6ICdpbmNvbXBsZXRlJ1xuICB2YWx1ZTogdW5kZWZpbmVkXG59XG5pbnRlcmZhY2UgTW9ja1Jlc3VsdFRocm93IHtcbiAgdHlwZTogJ3Rocm93J1xuICB2YWx1ZTogYW55XG59XG5cbnR5cGUgTW9ja1Jlc3VsdDxUPiA9IE1vY2tSZXN1bHRSZXR1cm48VD4gfCBNb2NrUmVzdWx0VGhyb3cgfCBNb2NrUmVzdWx0SW5jb21wbGV0ZVxuXG5leHBvcnQgaW50ZXJmYWNlIEplc3RNb2NrQ29tcGF0Q29udGV4dDxUQXJncywgVFJldHVybnM+IHtcbiAgY2FsbHM6IFRBcmdzW11cbiAgaW5zdGFuY2VzOiBUUmV0dXJuc1tdXG4gIC8vIFRPRE86IGRvZXNuJ3Qgd29ya1xuICBpbnZvY2F0aW9uQ2FsbE9yZGVyOiBudW1iZXJbXVxuICByZXN1bHRzOiBNb2NrUmVzdWx0PFRSZXR1cm5zPltdXG59XG5cbnR5cGUgUHJvY2VkdXJlID0gKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnlcblxudHlwZSBNZXRob2RzPFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIFByb2NlZHVyZSA/IEsgOiBuZXZlclxufVtrZXlvZiBUXSAmIHN0cmluZ1xudHlwZSBQcm9wZXJ0aWVzPFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIFByb2NlZHVyZSA/IG5ldmVyIDogS1xufVtrZXlvZiBUXSAmIHN0cmluZ1xudHlwZSBDbGFzc2VzPFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIG5ldyAoLi4uYXJnczogYW55W10pID0+IGFueSA/IEsgOiBuZXZlclxufVtrZXlvZiBUXSAmIHN0cmluZ1xuXG5leHBvcnQgaW50ZXJmYWNlIEplc3RNb2NrQ29tcGF0PFRBcmdzIGV4dGVuZHMgYW55W10gPSBhbnlbXSwgVFJldHVybnMgPSBhbnk+IHtcbiAgZ2V0TW9ja05hbWUoKTogc3RyaW5nXG4gIG1vY2tOYW1lKG46IHN0cmluZyk6IHRoaXNcbiAgbW9jazogSmVzdE1vY2tDb21wYXRDb250ZXh0PFRBcmdzLCBUUmV0dXJucz5cbiAgbW9ja0NsZWFyKCk6IHRoaXNcbiAgbW9ja1Jlc2V0KCk6IHRoaXNcbiAgbW9ja1Jlc3RvcmUoKTogdm9pZFxuICBnZXRNb2NrSW1wbGVtZW50YXRpb24oKTogKCguLi5hcmdzOiBUQXJncykgPT4gVFJldHVybnMpIHwgdW5kZWZpbmVkXG4gIG1vY2tJbXBsZW1lbnRhdGlvbihmbjogKCguLi5hcmdzOiBUQXJncykgPT4gVFJldHVybnMpIHwgKCgpID0+IFByb21pc2U8VFJldHVybnM+KSk6IHRoaXNcbiAgbW9ja0ltcGxlbWVudGF0aW9uT25jZShmbjogKCguLi5hcmdzOiBUQXJncykgPT4gVFJldHVybnMpIHwgKCgpID0+IFByb21pc2U8VFJldHVybnM+KSk6IHRoaXNcbiAgbW9ja1JldHVyblRoaXMoKTogdGhpc1xuICBtb2NrUmV0dXJuVmFsdWUob2JqOiBUUmV0dXJucyk6IHRoaXNcbiAgbW9ja1JldHVyblZhbHVlT25jZShvYmo6IFRSZXR1cm5zKTogdGhpc1xuICBtb2NrUmVzb2x2ZWRWYWx1ZShvYmo6IEF3YWl0ZWQ8VFJldHVybnM+KTogdGhpc1xuICBtb2NrUmVzb2x2ZWRWYWx1ZU9uY2Uob2JqOiBBd2FpdGVkPFRSZXR1cm5zPik6IHRoaXNcbiAgbW9ja1JlamVjdGVkVmFsdWUob2JqOiBhbnkpOiB0aGlzXG4gIG1vY2tSZWplY3RlZFZhbHVlT25jZShvYmo6IGFueSk6IHRoaXNcbn1cblxuZXhwb3J0IGludGVyZmFjZSBKZXN0TW9ja0NvbXBhdEZuPFRBcmdzIGV4dGVuZHMgYW55W10gPSBhbnksIFRSZXR1cm5zID0gYW55PiBleHRlbmRzIEplc3RNb2NrQ29tcGF0PFRBcmdzLCBUUmV0dXJucz4ge1xuICAoLi4uYXJnczogVEFyZ3MpOiBUUmV0dXJuc1xufVxuXG5leHBvcnQgdHlwZSBNYXliZU1vY2tlZENvbnN0cnVjdG9yPFQ+ID0gVCBleHRlbmRzIG5ldyAoXG4gIC4uLmFyZ3M6IEFycmF5PGFueT5cbikgPT4gaW5mZXIgUlxuICA/IEplc3RNb2NrQ29tcGF0Rm48Q29uc3RydWN0b3JQYXJhbWV0ZXJzPFQ+LCBSPlxuICA6IFRcbmV4cG9ydCB0eXBlIE1vY2tlZEZ1bmN0aW9uPFQgZXh0ZW5kcyBQcm9jZWR1cmU+ID0gTW9ja1dpdGhBcmdzPFQ+ICYge1xuICBbSyBpbiBrZXlvZiBUXTogVFtLXTtcbn1cbmV4cG9ydCB0eXBlIE1vY2tlZEZ1bmN0aW9uRGVlcDxUIGV4dGVuZHMgUHJvY2VkdXJlPiA9IE1vY2tXaXRoQXJnczxUPiAmIE1vY2tlZE9iamVjdERlZXA8VD5cbmV4cG9ydCB0eXBlIE1vY2tlZE9iamVjdDxUPiA9IE1heWJlTW9ja2VkQ29uc3RydWN0b3I8VD4gJiB7XG4gIFtLIGluIE1ldGhvZHM8VD5dOiBUW0tdIGV4dGVuZHMgUHJvY2VkdXJlXG4gICAgPyBNb2NrZWRGdW5jdGlvbjxUW0tdPlxuICAgIDogVFtLXTtcbn0gJiB7W0sgaW4gUHJvcGVydGllczxUPl06IFRbS119XG5leHBvcnQgdHlwZSBNb2NrZWRPYmplY3REZWVwPFQ+ID0gTWF5YmVNb2NrZWRDb25zdHJ1Y3RvcjxUPiAmIHtcbiAgW0sgaW4gTWV0aG9kczxUPl06IFRbS10gZXh0ZW5kcyBQcm9jZWR1cmVcbiAgICA/IE1vY2tlZEZ1bmN0aW9uRGVlcDxUW0tdPlxuICAgIDogVFtLXTtcbn0gJiB7W0sgaW4gUHJvcGVydGllczxUPl06IE1heWJlTW9ja2VkRGVlcDxUW0tdPn1cblxuZXhwb3J0IHR5cGUgTWF5YmVNb2NrZWREZWVwPFQ+ID0gVCBleHRlbmRzIFByb2NlZHVyZVxuICA/IE1vY2tlZEZ1bmN0aW9uRGVlcDxUPlxuICA6IFQgZXh0ZW5kcyBvYmplY3RcbiAgICA/IE1vY2tlZE9iamVjdERlZXA8VD5cbiAgICA6IFRcblxuZXhwb3J0IHR5cGUgTWF5YmVNb2NrZWQ8VD4gPSBUIGV4dGVuZHMgUHJvY2VkdXJlXG4gID8gTW9ja2VkRnVuY3Rpb248VD5cbiAgOiBUIGV4dGVuZHMgb2JqZWN0XG4gICAgPyBNb2NrZWRPYmplY3Q8VD5cbiAgICA6IFRcblxuZXhwb3J0IHR5cGUgRW5oYW5jZWRTcHk8VEFyZ3MgZXh0ZW5kcyBhbnlbXSA9IGFueVtdLCBUUmV0dXJucyA9IGFueT4gPSBKZXN0TW9ja0NvbXBhdDxUQXJncywgVFJldHVybnM+ICYgU3B5SW1wbDxUQXJncywgVFJldHVybnM+XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9ja1dpdGhBcmdzPFQgZXh0ZW5kcyBQcm9jZWR1cmU+XG4gIGV4dGVuZHMgSmVzdE1vY2tDb21wYXRGbjxQYXJhbWV0ZXJzPFQ+LCBSZXR1cm5UeXBlPFQ+PiB7XG4gIG5ldyAoLi4uYXJnczogVCBleHRlbmRzIG5ldyAoLi4uYXJnczogYW55KSA9PiBhbnkgPyBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8VD4gOiBuZXZlcik6IFRcbiAgKC4uLmFyZ3M6IFBhcmFtZXRlcnM8VD4pOiBSZXR1cm5UeXBlPFQ+XG59XG5cbmV4cG9ydCBjb25zdCBzcGllcyA9IG5ldyBTZXQ8SmVzdE1vY2tDb21wYXQ+KClcblxuZXhwb3J0IGZ1bmN0aW9uIGlzTW9ja0Z1bmN0aW9uKGZuOiBhbnkpOiBmbiBpcyBFbmhhbmNlZFNweSB7XG4gIHJldHVybiB0eXBlb2YgZm4gPT09ICdmdW5jdGlvbidcbiAgJiYgJ19faXNTcHknIGluIGZuXG4gICYmIGZuLl9faXNTcHlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNweU9uPFQsIFMgZXh0ZW5kcyBQcm9wZXJ0aWVzPFJlcXVpcmVkPFQ+Pj4oXG4gIG9iajogVCxcbiAgbWV0aG9kTmFtZTogUyxcbiAgYWNjZXNUeXBlOiAnZ2V0Jyxcbik6IEplc3RNb2NrQ29tcGF0PFtUW1NdXSwgdm9pZD5cbmV4cG9ydCBmdW5jdGlvbiBzcHlPbjxULCBHIGV4dGVuZHMgUHJvcGVydGllczxSZXF1aXJlZDxUPj4+KFxuICBvYmo6IFQsXG4gIG1ldGhvZE5hbWU6IEcsXG4gIGFjY2VzVHlwZTogJ3NldCcsXG4pOiBKZXN0TW9ja0NvbXBhdDxbXSwgVFtHXT5cbmV4cG9ydCBmdW5jdGlvbiBzcHlPbjxULCBNIGV4dGVuZHMgQ2xhc3NlczxSZXF1aXJlZDxUPj4+KFxuICBvYmplY3Q6IFQsXG4gIG1ldGhvZDogTVxuKTogUmVxdWlyZWQ8VD5bTV0gZXh0ZW5kcyBuZXcgKC4uLmFyZ3M6IGluZmVyIEEpID0+IGluZmVyIFJcbiAgPyBKZXN0TW9ja0NvbXBhdDxBLCBSPlxuICA6IG5ldmVyXG5leHBvcnQgZnVuY3Rpb24gc3B5T248VCwgTSBleHRlbmRzIE1ldGhvZHM8UmVxdWlyZWQ8VD4+PihcbiAgb2JqOiBULFxuICBtZXRob2ROYW1lOiBNLFxuICBtb2NrPzogVFtNXVxuKTogUmVxdWlyZWQ8VD5bTV0gZXh0ZW5kcyAoLi4uYXJnczogaW5mZXIgQSkgPT4gaW5mZXIgUiA/IEplc3RNb2NrQ29tcGF0PEEsIFI+IDogbmV2ZXJcbmV4cG9ydCBmdW5jdGlvbiBzcHlPbjxULCBLIGV4dGVuZHMga2V5b2YgVD4oXG4gIG9iajogVCxcbiAgbWV0aG9kOiBLLFxuICBhY2Nlc3NUeXBlPzogJ2dldCcgfCAnc2V0Jyxcbik6IEplc3RNb2NrQ29tcGF0IHtcbiAgY29uc3QgZGljdGlvbmFyeSA9IHtcbiAgICBnZXQ6ICdnZXR0ZXInLFxuICAgIHNldDogJ3NldHRlcicsXG4gIH0gYXMgY29uc3RcbiAgY29uc3Qgb2JqTWV0aG9kID0gYWNjZXNzVHlwZSA/IHsgW2RpY3Rpb25hcnlbYWNjZXNzVHlwZV1dOiBtZXRob2QgfSA6IG1ldGhvZFxuXG4gIGNvbnN0IHN0dWIgPSB0aW55c3B5LnNweU9uKG9iaiwgb2JqTWV0aG9kIGFzIGFueSlcblxuICByZXR1cm4gZW5oYW5jZVNweShzdHViKSBhcyBKZXN0TW9ja0NvbXBhdFxufVxuXG5mdW5jdGlvbiBlbmhhbmNlU3B5PFRBcmdzIGV4dGVuZHMgYW55W10sIFRSZXR1cm5zPihcbiAgc3B5OiBTcHlJbXBsPFRBcmdzLCBUUmV0dXJucz4sXG4pOiBKZXN0TW9ja0NvbXBhdDxUQXJncywgVFJldHVybnM+IHtcbiAgY29uc3Qgc3R1YiA9IHNweSBhcyB1bmtub3duIGFzIEVuaGFuY2VkU3B5PFRBcmdzLCBUUmV0dXJucz5cblxuICBsZXQgaW1wbGVtZW50YXRpb246ICgoLi4uYXJnczogVEFyZ3MpID0+IFRSZXR1cm5zKSB8IHVuZGVmaW5lZFxuXG4gIGxldCBpbnN0YW5jZXM6IGFueVtdID0gW11cblxuICBjb25zdCBtb2NrQ29udGV4dCA9IHtcbiAgICBnZXQgY2FsbHMoKSB7XG4gICAgICByZXR1cm4gc3R1Yi5jYWxsc1xuICAgIH0sXG4gICAgZ2V0IGluc3RhbmNlcygpIHtcbiAgICAgIHJldHVybiBpbnN0YW5jZXNcbiAgICB9LFxuICAgIC8vIG5vdCBzdXBwb3J0ZWRcbiAgICBnZXQgaW52b2NhdGlvbkNhbGxPcmRlcigpIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH0sXG4gICAgZ2V0IHJlc3VsdHMoKSB7XG4gICAgICByZXR1cm4gc3R1Yi5yZXN1bHRzLm1hcCgoW2NhbGxUeXBlLCB2YWx1ZV0pID0+IHtcbiAgICAgICAgY29uc3QgdHlwZSA9IGNhbGxUeXBlID09PSAnZXJyb3InID8gJ3Rocm93JyA6ICdyZXR1cm4nXG4gICAgICAgIHJldHVybiB7IHR5cGUsIHZhbHVlIH1cbiAgICAgIH0pXG4gICAgfSxcbiAgfVxuXG4gIGxldCBvbmNlSW1wbGVtZW50YXRpb25zOiAoKC4uLmFyZ3M6IFRBcmdzKSA9PiBUUmV0dXJucylbXSA9IFtdXG5cbiAgbGV0IG5hbWU6IHN0cmluZyA9IChzdHViIGFzIGFueSkubmFtZVxuXG4gIHN0dWIuZ2V0TW9ja05hbWUgPSAoKSA9PiBuYW1lIHx8ICd2aS5mbigpJ1xuICBzdHViLm1vY2tOYW1lID0gKG4pID0+IHtcbiAgICBuYW1lID0gblxuICAgIHJldHVybiBzdHViXG4gIH1cblxuICBzdHViLm1vY2tDbGVhciA9ICgpID0+IHtcbiAgICBzdHViLnJlc2V0KClcbiAgICBpbnN0YW5jZXMgPSBbXVxuICAgIHJldHVybiBzdHViXG4gIH1cblxuICBzdHViLm1vY2tSZXNldCA9ICgpID0+IHtcbiAgICBzdHViLm1vY2tDbGVhcigpXG4gICAgaW1wbGVtZW50YXRpb24gPSAoKSA9PiB1bmRlZmluZWQgYXMgdW5rbm93biBhcyBUUmV0dXJuc1xuICAgIG9uY2VJbXBsZW1lbnRhdGlvbnMgPSBbXVxuICAgIHJldHVybiBzdHViXG4gIH1cblxuICBzdHViLm1vY2tSZXN0b3JlID0gKCkgPT4ge1xuICAgIHN0dWIubW9ja1Jlc2V0KClcbiAgICBpbXBsZW1lbnRhdGlvbiA9IHVuZGVmaW5lZFxuICAgIHJldHVybiBzdHViXG4gIH1cblxuICBzdHViLmdldE1vY2tJbXBsZW1lbnRhdGlvbiA9ICgpID0+IGltcGxlbWVudGF0aW9uXG4gIHN0dWIubW9ja0ltcGxlbWVudGF0aW9uID0gKGZuOiAoLi4uYXJnczogVEFyZ3MpID0+IFRSZXR1cm5zKSA9PiB7XG4gICAgaW1wbGVtZW50YXRpb24gPSBmblxuICAgIHJldHVybiBzdHViXG4gIH1cblxuICBzdHViLm1vY2tJbXBsZW1lbnRhdGlvbk9uY2UgPSAoZm46ICguLi5hcmdzOiBUQXJncykgPT4gVFJldHVybnMpID0+IHtcbiAgICBvbmNlSW1wbGVtZW50YXRpb25zLnB1c2goZm4pXG4gICAgcmV0dXJuIHN0dWJcbiAgfVxuXG4gIHN0dWIubW9ja1JldHVyblRoaXMgPSAoKSA9PlxuICAgIHN0dWIubW9ja0ltcGxlbWVudGF0aW9uKGZ1bmN0aW9uKHRoaXM6IFRSZXR1cm5zKSB7XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH0pXG5cbiAgc3R1Yi5tb2NrUmV0dXJuVmFsdWUgPSAodmFsOiBUUmV0dXJucykgPT4gc3R1Yi5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gdmFsKVxuICBzdHViLm1vY2tSZXR1cm5WYWx1ZU9uY2UgPSAodmFsOiBUUmV0dXJucykgPT4gc3R1Yi5tb2NrSW1wbGVtZW50YXRpb25PbmNlKCgpID0+IHZhbClcblxuICBzdHViLm1vY2tSZXNvbHZlZFZhbHVlID0gKHZhbDogQXdhaXRlZDxUUmV0dXJucz4pID0+XG4gICAgc3R1Yi5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHZhbCBhcyBUUmV0dXJucykpXG5cbiAgc3R1Yi5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UgPSAodmFsOiBBd2FpdGVkPFRSZXR1cm5zPikgPT5cbiAgICBzdHViLm1vY2tJbXBsZW1lbnRhdGlvbk9uY2UoKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHZhbCBhcyBUUmV0dXJucykpXG5cbiAgc3R1Yi5tb2NrUmVqZWN0ZWRWYWx1ZSA9ICh2YWw6IHVua25vd24pID0+XG4gICAgc3R1Yi5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gUHJvbWlzZS5yZWplY3QodmFsKSlcblxuICBzdHViLm1vY2tSZWplY3RlZFZhbHVlT25jZSA9ICh2YWw6IHVua25vd24pID0+XG4gICAgc3R1Yi5tb2NrSW1wbGVtZW50YXRpb25PbmNlKCgpID0+IFByb21pc2UucmVqZWN0KHZhbCkpXG5cbiAgdXRpbC5hZGRQcm9wZXJ0eShzdHViLCAnbW9jaycsICgpID0+IG1vY2tDb250ZXh0KVxuXG4gIHN0dWIud2lsbENhbGwoZnVuY3Rpb24odGhpczogdW5rbm93biwgLi4uYXJncykge1xuICAgIGluc3RhbmNlcy5wdXNoKHRoaXMpXG4gICAgY29uc3QgaW1wbCA9IG9uY2VJbXBsZW1lbnRhdGlvbnMuc2hpZnQoKSB8fCBpbXBsZW1lbnRhdGlvbiB8fCBzdHViLmdldE9yaWdpbmFsKCkgfHwgKCgpID0+IHt9KVxuICAgIHJldHVybiBpbXBsLmFwcGx5KHRoaXMsIGFyZ3MpXG4gIH0pXG5cbiAgc3BpZXMuYWRkKHN0dWIpXG5cbiAgcmV0dXJuIHN0dWIgYXMgYW55XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmbjxUQXJncyBleHRlbmRzIGFueVtdID0gYW55W10sIFIgPSBhbnk+KCk6IEplc3RNb2NrQ29tcGF0Rm48VEFyZ3MsIFI+XG5leHBvcnQgZnVuY3Rpb24gZm48VEFyZ3MgZXh0ZW5kcyBhbnlbXSA9IGFueVtdLCBSID0gYW55PihcbiAgaW1wbGVtZW50YXRpb246ICguLi5hcmdzOiBUQXJncykgPT4gUlxuKTogSmVzdE1vY2tDb21wYXRGbjxUQXJncywgUj5cbmV4cG9ydCBmdW5jdGlvbiBmbjxUQXJncyBleHRlbmRzIGFueVtdID0gYW55W10sIFIgPSBhbnk+KFxuICBpbXBsZW1lbnRhdGlvbj86ICguLi5hcmdzOiBUQXJncykgPT4gUixcbik6IEplc3RNb2NrQ29tcGF0Rm48VEFyZ3MsIFI+IHtcbiAgcmV0dXJuIGVuaGFuY2VTcHkodGlueXNweS5zcHlPbih7IGZuOiBpbXBsZW1lbnRhdGlvbiB8fCAoKCkgPT4ge30pIH0sICdmbicpKSBhcyB1bmtub3duIGFzIEplc3RNb2NrQ29tcGF0Rm5cbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFWSxNQUFDLEtBQUssR0FBRyxJQUFJLEdBQUcsR0FBRztBQUN4QixTQUFTLGNBQWMsQ0FBQyxHQUFHLEVBQUU7QUFDcEMsRUFBRSxPQUFPLE9BQU8sR0FBRyxLQUFLLFVBQVUsSUFBSSxTQUFTLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUM7QUFDdEUsQ0FBQztBQUNNLFNBQVMsS0FBSyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFO0FBQy9DLEVBQUUsTUFBTSxVQUFVLEdBQUc7QUFDckIsSUFBSSxHQUFHLEVBQUUsUUFBUTtBQUNqQixJQUFJLEdB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
package/dist/node.d.ts CHANGED
@@ -69,9 +69,14 @@ declare class VerboseReporter extends DefaultReporter {
69
69
  }
70
70
 
71
71
  declare class TapReporter implements Reporter {
72
- private ctx;
72
+ protected ctx: Vitest;
73
+ onInit(ctx: Vitest): void;
74
+ protected logTasks(tasks: Task[], currentIdent: string): void;
75
+ onFinished(files?: File[]): Promise<void>;
76
+ }
77
+
78
+ declare class TapFlatReporter extends TapReporter {
73
79
  onInit(ctx: Vitest): void;
74
- logTasks(tasks: Task[], currentIdent: string): void;
75
80
  onFinished(files?: File[]): Promise<void>;
76
81
  }
77
82
 
@@ -80,6 +85,7 @@ declare const ReportersMap: {
80
85
  verbose: typeof VerboseReporter;
81
86
  dot: typeof DotReporter;
82
87
  tap: typeof TapReporter;
88
+ 'tap-flat': typeof TapFlatReporter;
83
89
  };
84
90
  declare type BuiltinReporters = keyof typeof ReportersMap;
85
91
 
@@ -133,6 +139,86 @@ interface ResolvedC8Options extends Required<C8Options> {
133
139
  tempDirectory: string;
134
140
  }
135
141
 
142
+ interface JSDOMOptions {
143
+ /**
144
+ * The html content for the test.
145
+ *
146
+ * @default '<!DOCTYPE html>'
147
+ */
148
+ html?: string | Buffer | ArrayBufferLike;
149
+ /**
150
+ * referrer just affects the value read from document.referrer.
151
+ * It defaults to no referrer (which reflects as the empty string).
152
+ */
153
+ referrer?: string;
154
+ /**
155
+ * userAgent affects the value read from navigator.userAgent, as well as the User-Agent header sent while fetching subresources.
156
+ *
157
+ * @default `Mozilla/5.0 (${process.platform}) AppleWebKit/537.36 (KHTML, like Gecko) jsdom/${jsdomVersion}`
158
+ */
159
+ userAgent?: string;
160
+ /**
161
+ * url sets the value returned by window.location, document.URL, and document.documentURI,
162
+ * and affects things like resolution of relative URLs within the document
163
+ * and the same-origin restrictions and referrer used while fetching subresources.
164
+ *
165
+ * @default 'http://localhost:3000'.
166
+ */
167
+ url?: string;
168
+ /**
169
+ * contentType affects the value read from document.contentType, and how the document is parsed: as HTML or as XML.
170
+ * Values that are not "text/html" or an XML mime type will throw.
171
+ *
172
+ * @default 'text/html'.
173
+ */
174
+ contentType?: string;
175
+ /**
176
+ * The maximum size in code units for the separate storage areas used by localStorage and sessionStorage.
177
+ * Attempts to store data larger than this limit will cause a DOMException to be thrown. By default, it is set
178
+ * to 5,000,000 code units per origin, as inspired by the HTML specification.
179
+ *
180
+ * @default 5_000_000
181
+ */
182
+ storageQuota?: number;
183
+ /**
184
+ * Enable console?
185
+ *
186
+ * @default false
187
+ */
188
+ console?: boolean;
189
+ /**
190
+ * jsdom does not have the capability to render visual content, and will act like a headless browser by default.
191
+ * It provides hints to web pages through APIs such as document.hidden that their content is not visible.
192
+ *
193
+ * When the `pretendToBeVisual` option is set to `true`, jsdom will pretend that it is rendering and displaying
194
+ * content.
195
+ *
196
+ * @default true
197
+ */
198
+ pretendToBeVisual?: boolean;
199
+ /**
200
+ * `includeNodeLocations` preserves the location info produced by the HTML parser,
201
+ * allowing you to retrieve it with the nodeLocation() method (described below).
202
+ *
203
+ * It defaults to false to give the best performance,
204
+ * and cannot be used with an XML content type since our XML parser does not support location info.
205
+ *
206
+ * @default false
207
+ */
208
+ includeNodeLocations?: boolean | undefined;
209
+ /**
210
+ * @default 'dangerously'
211
+ */
212
+ runScripts?: 'dangerously' | 'outside-only';
213
+ /**
214
+ * Enable CookieJar
215
+ *
216
+ * @default false
217
+ */
218
+ cookieJar?: boolean;
219
+ resources?: 'usable' | any;
220
+ }
221
+
136
222
  declare type Awaitable<T> = T | PromiseLike<T>;
137
223
  declare type Arrayable<T> = T | Array<T>;
138
224
  declare type ArgumentsType<T> = T extends (...args: infer U) => any ? U : never;
@@ -334,6 +420,13 @@ interface SnapshotSummary {
334
420
 
335
421
  declare type BuiltinEnvironment = 'node' | 'jsdom' | 'happy-dom';
336
422
  declare type ApiConfig = Pick<CommonServerOptions, 'port' | 'strictPort' | 'host'>;
423
+
424
+ interface EnvironmentOptions {
425
+ /**
426
+ * jsdom options.
427
+ */
428
+ jsdom?: JSDOMOptions;
429
+ }
337
430
  interface InlineConfig {
338
431
  /**
339
432
  * Include globs for test files
@@ -395,7 +488,11 @@ interface InlineConfig {
395
488
  */
396
489
  environment?: BuiltinEnvironment;
397
490
  /**
398
- * Update snapshot files
491
+ * Environment options.
492
+ */
493
+ environmentOptions?: EnvironmentOptions;
494
+ /**
495
+ * Update snapshot
399
496
  *
400
497
  * @default false
401
498
  */
@@ -408,6 +505,8 @@ interface InlineConfig {
408
505
  watch?: boolean;
409
506
  /**
410
507
  * Project root
508
+ *
509
+ * @default process.cwd()
411
510
  */
412
511
  root?: string;
413
512
  /**
@@ -501,7 +600,13 @@ interface InlineConfig {
501
600
  * Open Vitest UI
502
601
  * @internal WIP
503
602
  */
504
- open?: boolean;
603
+ ui?: boolean;
604
+ /**
605
+ * Base url for the UI
606
+ *
607
+ * @default '/__vitest__/'
608
+ */
609
+ uiBase?: string;
505
610
  }
506
611
  interface UserConfig extends InlineConfig {
507
612
  /**
@@ -590,6 +695,7 @@ declare class Vitest {
590
695
  visitedFilesMap: Map<string, RawSourceMap>;
591
696
  runningPromise?: Promise<void>;
592
697
  closingPromise?: Promise<void>;
698
+ externalizeCache: Map<string, Promise<string | false>>;
593
699
  isFirstRun: boolean;
594
700
  restartsCount: number;
595
701
  private _onRestartListeners;
@@ -610,6 +716,7 @@ declare class Vitest {
610
716
  report<T extends keyof Reporter>(name: T, ...args: ArgumentsType<Reporter[T]>): Promise<void>;
611
717
  globTestFiles(filters?: string[]): Promise<string[]>;
612
718
  isTargetFile(id: string): boolean;
719
+ shouldExternalize(id: string): Promise<string | false>;
613
720
  onServerRestarted(fn: () => void): void;
614
721
  }
615
722
 
package/dist/node.js CHANGED
@@ -1,6 +1,6 @@
1
- export { c as createVitest } from './index-7f7acd60.js';
1
+ export { c as createVitest } from './index-64de1341.js';
2
2
  import 'fs';
3
- import './index-720a83c6.js';
3
+ import './index-64aafe4b.js';
4
4
  import 'url';
5
5
  import 'tty';
6
6
  import 'local-pkg';
@@ -11,15 +11,15 @@ import 'os';
11
11
  import 'util';
12
12
  import 'stream';
13
13
  import 'events';
14
- import './constants-0211a379.js';
14
+ import './constants-d24b670d.js';
15
15
  import './magic-string.es-94000aea.js';
16
16
  import 'perf_hooks';
17
- import './diff-18d4a7eb.js';
18
- import './index-7975be53.js';
17
+ import './diff-5dfc7eb4.js';
18
+ import './index-648e7ab2.js';
19
19
  import './_commonjsHelpers-c9e3b764.js';
20
20
  import 'assert';
21
21
  import 'module';
22
+ import './index-5d6a5929.js';
22
23
  import 'worker_threads';
23
24
  import 'tinypool';
24
- import './index-e909c175.js';
25
25
  //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS5qcyIsInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6W10sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OyJ9