vitest 0.2.3 → 0.2.7

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,5 +1,4 @@
1
1
  import { ViteDevServer, TransformResult, CommonServerOptions } from 'vite';
2
- import { Profiler } from 'inspector';
3
2
  import { MessagePort } from 'worker_threads';
4
3
  import { SpyImpl } from 'tinyspy';
5
4
  export { assert, default as chai, should } from 'chai';
@@ -228,11 +227,6 @@ declare class Any extends AsymmetricMatcher<any> {
228
227
  toAsymmetricMatcher(): string;
229
228
  }
230
229
 
231
- interface FetchResult$1 {
232
- code?: string;
233
- externalize?: string;
234
- }
235
-
236
230
  interface DepsHandlingOptions {
237
231
  external?: (string | RegExp)[];
238
232
  inline?: (string | RegExp)[];
@@ -242,6 +236,22 @@ interface DepsHandlingOptions {
242
236
  */
243
237
  fallbackCJS?: boolean;
244
238
  }
239
+ interface StartOfSourceMap$1 {
240
+ file?: string;
241
+ sourceRoot?: string;
242
+ }
243
+ interface RawSourceMap$1 extends StartOfSourceMap$1 {
244
+ version: string;
245
+ sources: string[];
246
+ names: string[];
247
+ sourcesContent?: string[];
248
+ mappings: string;
249
+ }
250
+ interface FetchResult$1 {
251
+ code?: string;
252
+ externalize?: string;
253
+ map?: RawSourceMap$1;
254
+ }
245
255
  interface ViteNodeResolveId$1 {
246
256
  external?: boolean | 'absolute' | 'relative';
247
257
  id: string;
@@ -252,9 +262,9 @@ interface ViteNodeResolveId$1 {
252
262
  interface ViteNodeServerOptions {
253
263
  /**
254
264
  * Inject inline sourcemap to modules
255
- * @default true
265
+ * @default 'inline'
256
266
  */
257
- sourcemap?: boolean;
267
+ sourcemap?: 'inline' | boolean;
258
268
  /**
259
269
  * Deps handling
260
270
  */
@@ -273,7 +283,10 @@ declare class ViteNodeServer {
273
283
  options: ViteNodeServerOptions;
274
284
  private fetchPromiseMap;
275
285
  private transformPromiseMap;
276
- private fetchCache;
286
+ fetchCache: Map<string, {
287
+ timestamp: number;
288
+ result: FetchResult$1;
289
+ }>;
277
290
  constructor(server: ViteDevServer, options?: ViteNodeServerOptions);
278
291
  shouldExternalize(id: string): Promise<string | false>;
279
292
  resolveId(id: string, importer?: string): Promise<ViteNodeResolveId$1 | null>;
@@ -318,7 +331,6 @@ declare class Vitest {
318
331
  server: ViteDevServer;
319
332
  state: StateManager;
320
333
  snapshot: SnapshotManager;
321
- coverage: Profiler.TakePreciseCoverageReturnType[];
322
334
  reporters: Reporter[];
323
335
  console: Console;
324
336
  pool: WorkerPool | undefined;
@@ -331,7 +343,6 @@ declare class Vitest {
331
343
  vitenode: ViteNodeServer;
332
344
  invalidates: Set<string>;
333
345
  changedTests: Set<string>;
334
- visitedFilesMap: Map<string, RawSourceMap>;
335
346
  runningPromise?: Promise<void>;
336
347
  closingPromise?: Promise<void>;
337
348
  isFirstRun: boolean;
@@ -472,6 +483,65 @@ declare const ReportersMap: {
472
483
  };
473
484
  declare type BuiltinReporters = keyof typeof ReportersMap;
474
485
 
486
+ declare type Awaitable<T> = T | PromiseLike<T>;
487
+ declare type Nullable<T> = T | null | undefined;
488
+ declare type Arrayable<T> = T | Array<T>;
489
+ declare type ArgumentsType<T> = T extends (...args: infer U) => any ? U : never;
490
+ declare type MergeInsertions<T> = T extends object ? {
491
+ [K in keyof T]: MergeInsertions<T[K]>;
492
+ } : T;
493
+ declare type DeepMerge<F, S> = MergeInsertions<{
494
+ [K in keyof F | keyof S]: K extends keyof S & keyof F ? DeepMerge<F[K], S[K]> : K extends keyof S ? S[K] : K extends keyof F ? F[K] : never;
495
+ }>;
496
+ interface Constructable {
497
+ new (...args: any[]): any;
498
+ }
499
+ interface ModuleCache {
500
+ promise?: Promise<any>;
501
+ exports?: any;
502
+ code?: string;
503
+ }
504
+ interface EnvironmentReturn {
505
+ teardown: (global: any) => Awaitable<void>;
506
+ }
507
+ interface Environment {
508
+ name: string;
509
+ setup(global: any, options: Record<string, any>): Awaitable<EnvironmentReturn>;
510
+ }
511
+ interface UserConsoleLog {
512
+ content: string;
513
+ type: 'stdout' | 'stderr';
514
+ taskId?: string;
515
+ time: number;
516
+ }
517
+ interface Position {
518
+ line: number;
519
+ column: number;
520
+ }
521
+ interface ParsedStack {
522
+ method: string;
523
+ file: string;
524
+ line: number;
525
+ column: number;
526
+ sourcePos?: Position;
527
+ }
528
+ interface ErrorWithDiff extends Error {
529
+ name: string;
530
+ nameStr?: string;
531
+ stack?: string;
532
+ stackStr?: string;
533
+ stacks?: ParsedStack[];
534
+ showDiff?: boolean;
535
+ actual?: any;
536
+ expected?: any;
537
+ operator?: string;
538
+ }
539
+ interface ModuleGraphData {
540
+ graph: Record<string, string[]>;
541
+ externalized: string[];
542
+ inlined: string[];
543
+ }
544
+
475
545
  declare type CoverageReporter = 'clover' | 'cobertura' | 'html-spa' | 'html' | 'json-summary' | 'json' | 'lcov' | 'lcovonly' | 'none' | 'teamcity' | 'text-lcov' | 'text-summary' | 'text';
476
546
  interface C8Options {
477
547
  /**
@@ -521,6 +591,7 @@ interface C8Options {
521
591
  all?: boolean;
522
592
  }
523
593
  interface ResolvedC8Options extends Required<C8Options> {
594
+ tempDirectory: string;
524
595
  }
525
596
 
526
597
  interface JSDOMOptions {
@@ -603,76 +674,6 @@ interface JSDOMOptions {
603
674
  resources?: 'usable' | any;
604
675
  }
605
676
 
606
- declare type Awaitable<T> = T | PromiseLike<T>;
607
- declare type Nullable<T> = T | null | undefined;
608
- declare type Arrayable<T> = T | Array<T>;
609
- declare type ArgumentsType<T> = T extends (...args: infer U) => any ? U : never;
610
- declare type MergeInsertions<T> = T extends object ? {
611
- [K in keyof T]: MergeInsertions<T[K]>;
612
- } : T;
613
- declare type DeepMerge<F, S> = MergeInsertions<{
614
- [K in keyof F | keyof S]: K extends keyof S & keyof F ? DeepMerge<F[K], S[K]> : K extends keyof S ? S[K] : K extends keyof F ? F[K] : never;
615
- }>;
616
- interface Constructable {
617
- new (...args: any[]): any;
618
- }
619
- interface ModuleCache {
620
- promise?: Promise<any>;
621
- exports?: any;
622
- code?: string;
623
- }
624
- interface EnvironmentReturn {
625
- teardown: (global: any) => Awaitable<void>;
626
- }
627
- interface Environment {
628
- name: string;
629
- setup(global: any, options: Record<string, any>): Awaitable<EnvironmentReturn>;
630
- }
631
- interface UserConsoleLog {
632
- content: string;
633
- type: 'stdout' | 'stderr';
634
- taskId?: string;
635
- time: number;
636
- }
637
- interface Position {
638
- line: number;
639
- column: number;
640
- }
641
- interface ParsedStack {
642
- method: string;
643
- file: string;
644
- line: number;
645
- column: number;
646
- sourcePos?: Position;
647
- }
648
- interface ErrorWithDiff extends Error {
649
- name: string;
650
- nameStr?: string;
651
- stack?: string;
652
- stackStr?: string;
653
- stacks?: ParsedStack[];
654
- showDiff?: boolean;
655
- actual?: any;
656
- expected?: any;
657
- operator?: string;
658
- }
659
- interface ModuleGraphData {
660
- graph: Record<string, string[]>;
661
- externalized: string[];
662
- inlined: string[];
663
- }
664
- interface StartOfSourceMap {
665
- file?: string;
666
- sourceRoot?: string;
667
- }
668
- interface RawSourceMap extends StartOfSourceMap {
669
- version: string;
670
- sources: string[];
671
- names: string[];
672
- sourcesContent?: string[];
673
- mappings: string;
674
- }
675
-
676
677
  declare type ChainableFunction<T extends string, Args extends any[], R = any> = {
677
678
  (...args: Args): R;
678
679
  } & {
@@ -714,11 +715,20 @@ interface Test extends TaskBase {
714
715
  declare type Task = Test | Suite | File;
715
716
  declare type DoneCallback = (error?: any) => void;
716
717
  declare type TestFunction = (done: DoneCallback) => Awaitable<void>;
717
- declare type TestCollector = ChainableFunction<'concurrent' | 'only' | 'skip' | 'todo' | 'fails', [
718
+ declare type EachFunction = <T>(cases: T[]) => (name: string, fn: (...args: T extends any[] ? T : [T]) => void) => void;
719
+ declare type TestAPI = ChainableFunction<'concurrent' | 'only' | 'skip' | 'todo' | 'fails', [
718
720
  name: string,
719
721
  fn?: TestFunction,
720
722
  timeout?: number
721
- ], void>;
723
+ ], void> & {
724
+ each: EachFunction;
725
+ };
726
+ declare type SuiteAPI = ChainableFunction<'concurrent' | 'only' | 'skip' | 'todo', [
727
+ name: string,
728
+ factory?: SuiteFactory
729
+ ], SuiteCollector> & {
730
+ each: EachFunction;
731
+ };
722
732
  declare type HookListener<T extends any[]> = (...args: T) => Awaitable<void>;
723
733
  interface SuiteHooks {
724
734
  beforeAll: HookListener<[Suite]>[];
@@ -730,13 +740,13 @@ interface SuiteCollector {
730
740
  readonly name: string;
731
741
  readonly mode: RunMode;
732
742
  type: 'collector';
733
- test: TestCollector;
743
+ test: TestAPI;
734
744
  tasks: (Suite | Test | SuiteCollector)[];
735
745
  collect: (file?: File) => Promise<Suite>;
736
746
  clear: () => void;
737
747
  on: <T extends keyof SuiteHooks>(name: T, ...fn: SuiteHooks[T]) => void;
738
748
  }
739
- declare type TestFactory = (test: (name: string, fn: TestFunction) => void) => Awaitable<void>;
749
+ declare type SuiteFactory = (test: (name: string, fn: TestFunction) => void) => Awaitable<void>;
740
750
  interface RuntimeContext {
741
751
  tasks: (SuiteCollector | Test)[];
742
752
  currentSuite: SuiteCollector | null;
@@ -990,10 +1000,16 @@ interface InlineConfig {
990
1000
  */
991
1001
  api?: boolean | number | ApiConfig;
992
1002
  /**
993
- * Open Vitest UI
1003
+ * Enable Vitest UI
994
1004
  * @internal WIP
995
1005
  */
996
1006
  ui?: boolean;
1007
+ /**
1008
+ * Open UI automatically.
1009
+ *
1010
+ * @default true
1011
+ */
1012
+ open?: boolean;
997
1013
  /**
998
1014
  * Base url for the UI
999
1015
  *
@@ -1048,6 +1064,10 @@ interface UserConfig extends InlineConfig {
1048
1064
  * Pass with no tests
1049
1065
  */
1050
1066
  passWithNoTests?: boolean;
1067
+ /**
1068
+ * Allow tests and suites that are marked as only
1069
+ */
1070
+ allowOnly?: boolean;
1051
1071
  /**
1052
1072
  * Run tests that cover a list of source files
1053
1073
  */
@@ -1064,9 +1084,21 @@ interface ResolvedConfig extends Omit<Required<UserConfig>, 'config' | 'filters'
1064
1084
  api?: ApiConfig;
1065
1085
  }
1066
1086
 
1087
+ interface StartOfSourceMap {
1088
+ file?: string;
1089
+ sourceRoot?: string;
1090
+ }
1091
+ interface RawSourceMap extends StartOfSourceMap {
1092
+ version: string;
1093
+ sources: string[];
1094
+ names: string[];
1095
+ sourcesContent?: string[];
1096
+ mappings: string;
1097
+ }
1067
1098
  interface FetchResult {
1068
1099
  code?: string;
1069
1100
  externalize?: string;
1101
+ map?: RawSourceMap;
1070
1102
  }
1071
1103
  declare type FetchFunction = (id: string) => Promise<FetchResult>;
1072
1104
  interface ViteNodeResolveId {
@@ -1094,13 +1126,12 @@ interface WorkerRPC {
1094
1126
  onCollected: (files: File[]) => void;
1095
1127
  onTaskUpdate: (pack: TaskResultPack[]) => void;
1096
1128
  snapshotSaved: (snapshot: SnapshotResult) => void;
1097
- coverageCollected: (coverage: Profiler.TakePreciseCoverageReturnType) => void;
1098
1129
  }
1099
1130
 
1100
- declare const suite: ChainableFunction<"skip" | "only" | "todo" | "concurrent", [name: string, factory?: TestFactory | undefined], SuiteCollector>;
1101
- declare const test: TestCollector;
1102
- declare const describe: ChainableFunction<"skip" | "only" | "todo" | "concurrent", [name: string, factory?: TestFactory | undefined], SuiteCollector>;
1103
- declare const it: TestCollector;
1131
+ declare const suite: SuiteAPI;
1132
+ declare const test: TestAPI;
1133
+ declare const describe: SuiteAPI;
1134
+ declare const it: TestAPI;
1104
1135
 
1105
1136
  declare const beforeAll: (fn: SuiteHooks['beforeAll'][0], timeout?: number | undefined) => void;
1106
1137
  declare const afterAll: (fn: SuiteHooks['afterAll'][0], timeout?: number | undefined) => void;
@@ -1185,8 +1216,7 @@ declare const spies: Set<SpyInstance<any[], any>>;
1185
1216
  declare function isMockFunction(fn: any): fn is EnhancedSpy;
1186
1217
  declare function spyOn<T, S extends Properties<Required<T>>>(obj: T, methodName: S, accesType: 'get'): SpyInstance<[], T[S]>;
1187
1218
  declare function spyOn<T, G extends Properties<Required<T>>>(obj: T, methodName: G, accesType: 'set'): SpyInstance<[T[G]], void>;
1188
- declare function spyOn<T, M extends Classes<Required<T>>>(object: T, method: M): Required<T>[M] extends new (...args: infer A) => infer R ? SpyInstance<A, R> : never;
1189
- declare function spyOn<T, M extends Methods<Required<T>>>(obj: T, methodName: M, mock?: T[M]): Required<T>[M] extends (...args: infer A) => infer R ? SpyInstance<A, R> : never;
1219
+ declare function spyOn<T, M extends (Methods<Required<T>> | Classes<Required<T>>)>(obj: T, methodName: M): Required<T>[M] extends (...args: infer A) => infer R | (new (...args: infer A) => infer R) ? SpyInstance<A, R> : never;
1190
1220
  declare function fn<TArgs extends any[] = any[], R = any>(): SpyInstanceFn<TArgs, R>;
1191
1221
  declare function fn<TArgs extends any[] = any[], R = any>(implementation: (...args: TArgs) => R): SpyInstanceFn<TArgs, R>;
1192
1222
 
@@ -1312,6 +1342,10 @@ declare type Promisify<O> = {
1312
1342
  [K in keyof O]: O[K] extends (...args: infer A) => infer R ? O extends R ? Promisify<O[K]> : (...args: A) => Promise<R> : O[K];
1313
1343
  };
1314
1344
  declare global {
1345
+ namespace jest {
1346
+ interface Matchers<R, T = {}> {
1347
+ }
1348
+ }
1315
1349
  namespace Vi {
1316
1350
  interface ExpectStatic extends Chai.ExpectStatic, AsymmetricMatchersContaining {
1317
1351
  <T>(actual: T, message?: string): Vi.Assertion<T>;
@@ -1325,7 +1359,7 @@ declare global {
1325
1359
  setState(state: Partial<MatcherState>): void;
1326
1360
  not: AsymmetricMatchersContaining;
1327
1361
  }
1328
- interface JestAssertion<T = any> {
1362
+ interface JestAssertion<T = any> extends jest.Matchers<void, T> {
1329
1363
  toMatchSnapshot<U extends {
1330
1364
  [P in keyof T]: any;
1331
1365
  }>(snapshot: Partial<U>, message?: string): void;
@@ -1385,14 +1419,14 @@ declare global {
1385
1419
  toHaveNthReturnedWith<E>(nthCall: number, value: E): void;
1386
1420
  nthReturnedWith<E>(nthCall: number, value: E): void;
1387
1421
  }
1388
- type VitestifyAssertion<A> = {
1389
- [K in keyof A]: A[K] extends Chai.Assertion ? Assertion<any> : A[K] extends (...args: any[]) => any ? A[K] : VitestifyAssertion<A[K]>;
1422
+ type VitestAssertion<A> = {
1423
+ [K in keyof A]: A[K] extends Chai.Assertion ? Assertion<any> : A[K] extends (...args: any[]) => any ? A[K] : VitestAssertion<A[K]>;
1390
1424
  };
1391
- interface Assertion<T = any> extends VitestifyAssertion<Chai.Assertion>, JestAssertion<T> {
1425
+ interface Assertion<T = any> extends VitestAssertion<Chai.Assertion>, JestAssertion<T> {
1392
1426
  resolves: Promisify<Assertion<T>>;
1393
1427
  rejects: Promisify<Assertion<T>>;
1394
1428
  }
1395
1429
  }
1396
1430
  }
1397
1431
 
1398
- export { ApiConfig, ArgumentsType, Arrayable, Awaitable, BuiltinEnvironment, Constructable, DeepMerge, DoneCallback, EnhancedSpy, Environment, EnvironmentOptions, EnvironmentReturn, ErrorWithDiff, File, HookListener, InlineConfig, JSDOMOptions, JestMockCompatContext, MaybeMocked, MaybeMockedConstructor, MaybeMockedDeep, MergeInsertions, MockWithArgs, MockedFunction, MockedFunctionDeep, MockedObject, MockedObjectDeep, ModuleCache, ModuleGraphData, Nullable, ParsedStack, Position, RawSourceMap, Reporter, ResolveIdFunction, ResolvedConfig, RunMode, RuntimeContext, SnapshotData, SnapshotMatchOptions, SnapshotResult, SnapshotStateOptions, SnapshotSummary, SnapshotUpdateState, SpyInstance, SpyInstanceFn, StartOfSourceMap, 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 };
1432
+ export { ApiConfig, ArgumentsType, Arrayable, Awaitable, BuiltinEnvironment, C8Options, Constructable, CoverageReporter, DeepMerge, DoneCallback, EachFunction, EnhancedSpy, Environment, EnvironmentOptions, EnvironmentReturn, ErrorWithDiff, File, HookListener, InlineConfig, JSDOMOptions, JestMockCompatContext, MaybeMocked, MaybeMockedConstructor, MaybeMockedDeep, MergeInsertions, MockWithArgs, MockedFunction, MockedFunctionDeep, MockedObject, MockedObjectDeep, ModuleCache, ModuleGraphData, Nullable, ParsedStack, Position, Reporter, ResolveIdFunction, ResolvedC8Options, ResolvedConfig, RunMode, RuntimeContext, SnapshotData, SnapshotMatchOptions, SnapshotResult, SnapshotStateOptions, SnapshotSummary, SnapshotUpdateState, SpyInstance, SpyInstanceFn, Suite, SuiteAPI, SuiteCollector, SuiteFactory, SuiteHooks, Task, TaskBase, TaskResult, TaskResultPack, TaskState, Test, TestAPI, 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,12 +1,12 @@
1
- export { d as describe, i as it, c as suite, t as test, e as vi, v as vitest } from './vi-7f0c5d26.js';
2
- export { a as afterAll, d as afterEach, b as beforeAll, c as beforeEach, e as expect } from './index-6102d563.js';
3
- export { f as fn, i as isMockFunction, s as spies, a as spyOn } from './jest-mock-113430de.js';
1
+ export { d as describe, i as it, c as suite, t as test, e as vi, v as vitest } from './vi-ec8761e0.js';
2
+ export { a as afterAll, d as afterEach, b as beforeAll, c as beforeEach, e as expect } from './index-08faa6e3.js';
3
+ export { fn, isMockFunction, spies, spyOn } from './jest-mock.js';
4
4
  export { assert, default as chai, should } from 'chai';
5
- import './index-87602a5a.js';
5
+ import 'util';
6
+ import './index-2e2d319c.js';
6
7
  import 'tty';
7
8
  import 'local-pkg';
8
- import './source-map-002462f4.js';
9
- import './_commonjsHelpers-bdec4bbd.js';
10
- import 'util';
9
+ import './source-map-799c200a.js';
10
+ import './_commonjsHelpers-c9e3b764.js';
11
11
  import 'tinyspy';
12
12
  //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbXSwic291cmNlc0NvbnRlbnQiOltdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OyJ9
@@ -0,0 +1,99 @@
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
+ let callOrder = 0;
18
+ function enhanceSpy(spy) {
19
+ const stub = spy;
20
+ let implementation;
21
+ let instances = [];
22
+ let invocations = [];
23
+ const mockContext = {
24
+ get calls() {
25
+ return stub.calls;
26
+ },
27
+ get instances() {
28
+ return instances;
29
+ },
30
+ get invocationCallOrder() {
31
+ return invocations;
32
+ },
33
+ get results() {
34
+ return stub.results.map(([callType, value]) => {
35
+ const type = callType === "error" ? "throw" : "return";
36
+ return { type, value };
37
+ });
38
+ }
39
+ };
40
+ let onceImplementations = [];
41
+ let name = stub.name;
42
+ stub.getMockName = () => name || "vi.fn()";
43
+ stub.mockName = (n) => {
44
+ name = n;
45
+ return stub;
46
+ };
47
+ stub.mockClear = () => {
48
+ stub.reset();
49
+ instances = [];
50
+ invocations = [];
51
+ return stub;
52
+ };
53
+ stub.mockReset = () => {
54
+ stub.mockClear();
55
+ implementation = () => void 0;
56
+ onceImplementations = [];
57
+ return stub;
58
+ };
59
+ stub.mockRestore = () => {
60
+ stub.mockReset();
61
+ implementation = void 0;
62
+ return stub;
63
+ };
64
+ stub.getMockImplementation = () => implementation;
65
+ stub.mockImplementation = (fn2) => {
66
+ implementation = fn2;
67
+ return stub;
68
+ };
69
+ stub.mockImplementationOnce = (fn2) => {
70
+ onceImplementations.push(fn2);
71
+ return stub;
72
+ };
73
+ stub.mockReturnThis = () => stub.mockImplementation(function() {
74
+ return this;
75
+ });
76
+ stub.mockReturnValue = (val) => stub.mockImplementation(() => val);
77
+ stub.mockReturnValueOnce = (val) => stub.mockImplementationOnce(() => val);
78
+ stub.mockResolvedValue = (val) => stub.mockImplementation(() => Promise.resolve(val));
79
+ stub.mockResolvedValueOnce = (val) => stub.mockImplementationOnce(() => Promise.resolve(val));
80
+ stub.mockRejectedValue = (val) => stub.mockImplementation(() => Promise.reject(val));
81
+ stub.mockRejectedValueOnce = (val) => stub.mockImplementationOnce(() => Promise.reject(val));
82
+ util.addProperty(stub, "mock", () => mockContext);
83
+ stub.willCall(function(...args) {
84
+ instances.push(this);
85
+ invocations.push(++callOrder);
86
+ const impl = onceImplementations.shift() || implementation || stub.getOriginal() || (() => {
87
+ });
88
+ return impl.apply(this, args);
89
+ });
90
+ spies.add(stub);
91
+ return stub;
92
+ }
93
+ function fn(implementation) {
94
+ return enhanceSpy(tinyspy.spyOn({ fn: implementation || (() => {
95
+ }) }, "fn"));
96
+ }
97
+
98
+ export { fn, isMockFunction, spies, spyOn };
99
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamVzdC1tb2NrLmpzIiwic291cmNlcyI6WyIuLi9zcmMvaW50ZWdyYXRpb25zL2plc3QtbW9jay50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1dGlsIH0gZnJvbSAnY2hhaSdcbmltcG9ydCB0eXBlIHsgU3B5SW1wbCB9IGZyb20gJ3RpbnlzcHknXG5pbXBvcnQgKiBhcyB0aW55c3B5IGZyb20gJ3RpbnlzcHknXG5cbmludGVyZmFjZSBNb2NrUmVzdWx0UmV0dXJuPFQ+IHtcbiAgdHlwZTogJ3JldHVybidcbiAgdmFsdWU6IFRcbn1cbmludGVyZmFjZSBNb2NrUmVzdWx0SW5jb21wbGV0ZSB7XG4gIHR5cGU6ICdpbmNvbXBsZXRlJ1xuICB2YWx1ZTogdW5kZWZpbmVkXG59XG5pbnRlcmZhY2UgTW9ja1Jlc3VsdFRocm93IHtcbiAgdHlwZTogJ3Rocm93J1xuICB2YWx1ZTogYW55XG59XG5cbnR5cGUgTW9ja1Jlc3VsdDxUPiA9IE1vY2tSZXN1bHRSZXR1cm48VD4gfCBNb2NrUmVzdWx0VGhyb3cgfCBNb2NrUmVzdWx0SW5jb21wbGV0ZVxuXG5leHBvcnQgaW50ZXJmYWNlIEplc3RNb2NrQ29tcGF0Q29udGV4dDxUQXJncywgVFJldHVybnM+IHtcbiAgY2FsbHM6IFRBcmdzW11cbiAgaW5zdGFuY2VzOiBUUmV0dXJuc1tdXG4gIGludm9jYXRpb25DYWxsT3JkZXI6IG51bWJlcltdXG4gIHJlc3VsdHM6IE1vY2tSZXN1bHQ8VFJldHVybnM+W11cbn1cblxudHlwZSBQcm9jZWR1cmUgPSAoLi4uYXJnczogYW55W10pID0+IGFueVxuXG50eXBlIE1ldGhvZHM8VD4gPSB7XG4gIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgUHJvY2VkdXJlID8gSyA6IG5ldmVyXG59W2tleW9mIFRdICYgc3RyaW5nXG50eXBlIFByb3BlcnRpZXM8VD4gPSB7XG4gIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgUHJvY2VkdXJlID8gbmV2ZXIgOiBLXG59W2tleW9mIFRdICYgc3RyaW5nXG50eXBlIENsYXNzZXM8VD4gPSB7XG4gIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55ID8gSyA6IG5ldmVyXG59W2tleW9mIFRdICYgc3RyaW5nXG5cbmV4cG9ydCBpbnRlcmZhY2UgU3B5SW5zdGFuY2U8VEFyZ3MgZXh0ZW5kcyBhbnlbXSA9IGFueVtdLCBUUmV0dXJucyA9IGFueT4ge1xuICBnZXRNb2NrTmFtZSgpOiBzdHJpbmdcbiAgbW9ja05hbWUobjogc3RyaW5nKTogdGhpc1xuICBtb2NrOiBKZXN0TW9ja0NvbXBhdENvbnRleHQ8VEFyZ3MsIFRSZXR1cm5zPlxuICBtb2NrQ2xlYXIoKTogdGhpc1xuICBtb2NrUmVzZXQoKTogdGhpc1xuICBtb2NrUmVzdG9yZSgpOiB2b2lkXG4gIGdldE1vY2tJbXBsZW1lbnRhdGlvbigpOiAoKC4uLmFyZ3M6IFRBcmdzKSA9PiBUUmV0dXJucykgfCB1bmRlZmluZWRcbiAgbW9ja0ltcGxlbWVudGF0aW9uKGZuOiAoKC4uLmFyZ3M6IFRBcmdzKSA9PiBUUmV0dXJucykgfCAoKCkgPT4gUHJvbWlzZTxUUmV0dXJucz4pKTogdGhpc1xuICBtb2NrSW1wbGVtZW50YXRpb25PbmNlKGZuOiAoKC4uLmFyZ3M6IFRBcmdzKSA9PiBUUmV0dXJucykgfCAoKCkgPT4gUHJvbWlzZTxUUmV0dXJucz4pKTogdGhpc1xuICBtb2NrUmV0dXJuVGhpcygpOiB0aGlzXG4gIG1vY2tSZXR1cm5WYWx1ZShvYmo6IFRSZXR1cm5zKTogdGhpc1xuICBtb2NrUmV0dXJuVmFsdWVPbmNlKG9iajogVFJldHVybnMpOiB0aGlzXG4gIG1vY2tSZXNvbHZlZFZhbHVlKG9iajogQXdhaXRlZDxUUmV0dXJucz4pOiB0aGlzXG4gIG1vY2tSZXNvbHZlZFZhbHVlT25jZShvYmo6IEF3YWl0ZWQ8VFJldHVybnM+KTogdGhpc1xuICBtb2NrUmVqZWN0ZWRWYWx1ZShvYmo6IGFueSk6IHRoaXNcbiAgbW9ja1JlamVjdGVkVmFsdWVPbmNlKG9iajogYW55KTogdGhpc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNweUluc3RhbmNlRm48VEFyZ3MgZXh0ZW5kcyBhbnlbXSA9IGFueSwgVFJldHVybnMgPSBhbnk+IGV4dGVuZHMgU3B5SW5zdGFuY2U8VEFyZ3MsIFRSZXR1cm5zPiB7XG4gICguLi5hcmdzOiBUQXJncyk6IFRSZXR1cm5zXG59XG5cbmV4cG9ydCB0eXBlIE1heWJlTW9ja2VkQ29uc3RydWN0b3I8VD4gPSBUIGV4dGVuZHMgbmV3IChcbiAgLi4uYXJnczogQXJyYXk8YW55PlxuKSA9PiBpbmZlciBSXG4gID8gU3B5SW5zdGFuY2VGbjxDb25zdHJ1Y3RvclBhcmFtZXRlcnM8VD4sIFI+XG4gIDogVFxuZXhwb3J0IHR5cGUgTW9ja2VkRnVuY3Rpb248VCBleHRlbmRzIFByb2NlZHVyZT4gPSBNb2NrV2l0aEFyZ3M8VD4gJiB7XG4gIFtLIGluIGtleW9mIFRdOiBUW0tdO1xufVxuZXhwb3J0IHR5cGUgTW9ja2VkRnVuY3Rpb25EZWVwPFQgZXh0ZW5kcyBQcm9jZWR1cmU+ID0gTW9ja1dpdGhBcmdzPFQ+ICYgTW9ja2VkT2JqZWN0RGVlcDxUPlxuZXhwb3J0IHR5cGUgTW9ja2VkT2JqZWN0PFQ+ID0gTWF5YmVNb2NrZWRDb25zdHJ1Y3RvcjxUPiAmIHtcbiAgW0sgaW4gTWV0aG9kczxUPl06IFRbS10gZXh0ZW5kcyBQcm9jZWR1cmVcbiAgICA/IE1vY2tlZEZ1bmN0aW9uPFRbS10+XG4gICAgOiBUW0tdO1xufSAmIHsgW0sgaW4gUHJvcGVydGllczxUPl06IFRbS10gfVxuZXhwb3J0IHR5cGUgTW9ja2VkT2JqZWN0RGVlcDxUPiA9IE1heWJlTW9ja2VkQ29uc3RydWN0b3I8VD4gJiB7XG4gIFtLIGluIE1ldGhvZHM8VD5dOiBUW0tdIGV4dGVuZHMgUHJvY2VkdXJlXG4gICAgPyBNb2NrZWRGdW5jdGlvbkRlZXA8VFtLXT5cbiAgICA6IFRbS107XG59ICYgeyBbSyBpbiBQcm9wZXJ0aWVzPFQ+XTogTWF5YmVNb2NrZWREZWVwPFRbS10+IH1cblxuZXhwb3J0IHR5cGUgTWF5YmVNb2NrZWREZWVwPFQ+ID0gVCBleHRlbmRzIFByb2NlZHVyZVxuICA/IE1vY2tlZEZ1bmN0aW9uRGVlcDxUPlxuICA6IFQgZXh0ZW5kcyBvYmplY3RcbiAgICA/IE1vY2tlZE9iamVjdERlZXA8VD5cbiAgICA6IFRcblxuZXhwb3J0IHR5cGUgTWF5YmVNb2NrZWQ8VD4gPSBUIGV4dGVuZHMgUHJvY2VkdXJlXG4gID8gTW9ja2VkRnVuY3Rpb248VD5cbiAgOiBUIGV4dGVuZHMgb2JqZWN0XG4gICAgPyBNb2NrZWRPYmplY3Q8VD5cbiAgICA6IFRcblxuZXhwb3J0IHR5cGUgRW5oYW5jZWRTcHk8VEFyZ3MgZXh0ZW5kcyBhbnlbXSA9IGFueVtdLCBUUmV0dXJucyA9IGFueT4gPSBTcHlJbnN0YW5jZTxUQXJncywgVFJldHVybnM+ICYgU3B5SW1wbDxUQXJncywgVFJldHVybnM+XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9ja1dpdGhBcmdzPFQgZXh0ZW5kcyBQcm9jZWR1cmU+XG4gIGV4dGVuZHMgU3B5SW5zdGFuY2VGbjxQYXJhbWV0ZXJzPFQ+LCBSZXR1cm5UeXBlPFQ+PiB7XG4gIG5ldyAoLi4uYXJnczogVCBleHRlbmRzIG5ldyAoLi4uYXJnczogYW55KSA9PiBhbnkgPyBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8VD4gOiBuZXZlcik6IFRcbiAgKC4uLmFyZ3M6IFBhcmFtZXRlcnM8VD4pOiBSZXR1cm5UeXBlPFQ+XG59XG5cbmV4cG9ydCBjb25zdCBzcGllcyA9IG5ldyBTZXQ8U3B5SW5zdGFuY2U+KClcblxuZXhwb3J0IGZ1bmN0aW9uIGlzTW9ja0Z1bmN0aW9uKGZuOiBhbnkpOiBmbiBpcyBFbmhhbmNlZFNweSB7XG4gIHJldHVybiB0eXBlb2YgZm4gPT09ICdmdW5jdGlvbidcbiAgJiYgJ19faXNTcHknIGluIGZuXG4gICYmIGZuLl9faXNTcHlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNweU9uPFQsIFMgZXh0ZW5kcyBQcm9wZXJ0aWVzPFJlcXVpcmVkPFQ+Pj4oXG4gIG9iajogVCxcbiAgbWV0aG9kTmFtZTogUyxcbiAgYWNjZXNUeXBlOiAnZ2V0Jyxcbik6IFNweUluc3RhbmNlPFtdLCBUW1NdPlxuZXhwb3J0IGZ1bmN0aW9uIHNweU9uPFQsIEcgZXh0ZW5kcyBQcm9wZXJ0aWVzPFJlcXVpcmVkPFQ+Pj4oXG4gIG9iajogVCxcbiAgbWV0aG9kTmFtZTogRyxcbiAgYWNjZXNUeXBlOiAnc2V0Jyxcbik6IFNweUluc3RhbmNlPFtUW0ddXSwgdm9pZD5cbmV4cG9ydCBmdW5jdGlvbiBzcHlPbjxULCBNIGV4dGVuZHMgKE1ldGhvZHM8UmVxdWlyZWQ8VD4+IHwgQ2xhc3NlczxSZXF1aXJlZDxUPj4pPihcbiAgb2JqOiBULFxuICBtZXRob2ROYW1lOiBNLFxuKTogUmVxdWlyZWQ8VD5bTV0gZXh0ZW5kcyAoLi4uYXJnczogaW5mZXIgQSkgPT4gaW5mZXIgUiB8IChuZXcgKC4uLmFyZ3M6IGluZmVyIEEpID0+IGluZmVyIFIpID8gU3B5SW5zdGFuY2U8QSwgUj4gOiBuZXZlclxuZXhwb3J0IGZ1bmN0aW9uIHNweU9uPFQsIEsgZXh0ZW5kcyBrZXlvZiBUPihcbiAgb2JqOiBULFxuICBtZXRob2Q6IEssXG4gIGFjY2Vzc1R5cGU/OiAnZ2V0JyB8ICdzZXQnLFxuKTogU3B5SW5zdGFuY2Uge1xuICBjb25zdCBkaWN0aW9uYXJ5ID0ge1xuICAgIGdldDogJ2dldHRlcicsXG4gICAgc2V0OiAnc2V0dGVyJyxcbiAgfSBhcyBjb25zdFxuICBjb25zdCBvYmpNZXRob2QgPSBhY2Nlc3NUeXBlID8geyBbZGljdGlvbmFyeVthY2Nlc3NUeXBlXV06IG1ldGhvZCB9IDogbWV0aG9kXG5cbiAgY29uc3Qgc3R1YiA9IHRpbnlzcHkuc3B5T24ob2JqLCBvYmpNZXRob2QgYXMgYW55KVxuXG4gIHJldHVybiBlbmhhbmNlU3B5KHN0dWIpIGFzIFNweUluc3RhbmNlXG59XG5cbmxldCBjYWxsT3JkZXIgPSAwXG5cbmZ1bmN0aW9uIGVuaGFuY2VTcHk8VEFyZ3MgZXh0ZW5kcyBhbnlbXSwgVFJldHVybnM+KFxuICBzcHk6IFNweUltcGw8VEFyZ3MsIFRSZXR1cm5zPixcbik6IFNweUluc3RhbmNlPFRBcmdzLCBUUmV0dXJucz4ge1xuICBjb25zdCBzdHViID0gc3B5IGFzIHVua25vd24gYXMgRW5oYW5jZWRTcHk8VEFyZ3MsIFRSZXR1cm5zPlxuXG4gIGxldCBpbXBsZW1lbnRhdGlvbjogKCguLi5hcmdzOiBUQXJncykgPT4gVFJldHVybnMpIHwgdW5kZWZpbmVkXG5cbiAgbGV0IGluc3RhbmNlczogYW55W10gPSBbXVxuICBsZXQgaW52b2NhdGlvbnM6IG51bWJlcltdID0gW11cblxuICBjb25zdCBtb2NrQ29udGV4dCA9IHtcbiAgICBnZXQgY2FsbHMoKSB7XG4gICAgICByZXR1cm4gc3R1Yi5jYWxsc1xuICAgIH0sXG4gICAgZ2V0IGluc3RhbmNlcygpIHtcbiAgICAgIHJldHVybiBpbnN0YW5jZXNcbiAgICB9LFxuICAgIGdldCBpbnZvY2F0aW9uQ2FsbE9yZGVyKCkge1xuICAgICAgcmV0dXJuIGludm9jYXRpb25zXG4gICAgfSxcbiAgICBnZXQgcmVzdWx0cygpIHtcbiAgICAgIHJldHVybiBzdHViLnJlc3VsdHMubWFwKChbY2FsbFR5cGUsIHZhbHVlXSkgPT4ge1xuICAgICAgICBjb25zdCB0eXBlID0gY2FsbFR5cGUgPT09ICdlcnJvcicgPyAndGhyb3cnIDogJ3JldHVybidcbiAgICAgICAgcmV0dXJuIHsgdHlwZSwgdmFsdWUgfVxuICAgICAgfSlcbiAgICB9LFxuICB9XG5cbiAgbGV0IG9uY2VJbXBsZW1lbnRhdGlvbnM6ICgoLi4uYXJnczogVEFyZ3MpID0+IFRSZXR1cm5zKVtdID0gW11cblxuICBsZXQgbmFtZTogc3RyaW5nID0gKHN0dWIgYXMgYW55KS5uYW1lXG5cbiAgc3R1Yi5nZXRNb2NrTmFtZSA9ICgpID0+IG5hbWUgfHwgJ3ZpLmZuKCknXG4gIHN0dWIubW9ja05hbWUgPSAobikgPT4ge1xuICAgIG5hbWUgPSBuXG4gICAgcmV0dXJuIHN0dWJcbiAgfVxuXG4gIHN0dWIubW9ja0NsZWFyID0gKCkgPT4ge1xuICAgIHN0dWIucmVzZXQoKVxuICAgIGluc3RhbmNlcyA9IFtdXG4gICAgaW52b2NhdGlvbnMgPSBbXVxuICAgIHJldHVybiBzdHViXG4gIH1cblxuICBzdHViLm1vY2tSZXNldCA9ICgpID0+IHtcbiAgICBzdHViLm1vY2tDbGVhcigpXG4gICAgaW1wbGVtZW50YXRpb24gPSAoKSA9PiB1bmRlZmluZWQgYXMgdW5rbm93biBhcyBUUmV0dXJuc1xuICAgIG9uY2VJbXBsZW1lbnRhdGlvbnMgPSBbXVxuICAgIHJldHVybiBzdHViXG4gIH1cblxuICBzdHViLm1vY2tSZXN0b3JlID0gKCkgPT4ge1xuICAgIHN0dWIubW9ja1Jlc2V0KClcbiAgICBpbXBsZW1lbnRhdGlvbiA9IHVuZGVmaW5lZFxuICAgIHJldHVybiBzdHViXG4gIH1cblxuICBzdHViLmdldE1vY2tJbXBsZW1lbnRhdGlvbiA9ICgpID0+IGltcGxlbWVudGF0aW9uXG4gIHN0dWIubW9ja0ltcGxlbWVudGF0aW9uID0gKGZuOiAoLi4uYXJnczogVEFyZ3MpID0+IFRSZXR1cm5zKSA9PiB7XG4gICAgaW1wbGVtZW50YXRpb24gPSBmblxuICAgIHJldHVybiBzdHViXG4gIH1cblxuICBzdHViLm1vY2tJbXBsZW1lbnRhdGlvbk9uY2UgPSAoZm46ICguLi5hcmdzOiBUQXJncykgPT4gVFJldHVybnMpID0+IHtcbiAgICBvbmNlSW1wbGVtZW50YXRpb25zLnB1c2goZm4pXG4gICAgcmV0dXJuIHN0dWJcbiAgfVxuXG4gIHN0dWIubW9ja1JldHVyblRoaXMgPSAoKSA9PlxuICAgIHN0dWIubW9ja0ltcGxlbWVudGF0aW9uKGZ1bmN0aW9uKHRoaXM6IFRSZXR1cm5zKSB7XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH0pXG5cbiAgc3R1Yi5tb2NrUmV0dXJuVmFsdWUgPSAodmFsOiBUUmV0dXJucykgPT4gc3R1Yi5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gdmFsKVxuICBzdHViLm1vY2tSZXR1cm5WYWx1ZU9uY2UgPSAodmFsOiBUUmV0dXJucykgPT4gc3R1Yi5tb2NrSW1wbGVtZW50YXRpb25PbmNlKCgpID0+IHZhbClcblxuICBzdHViLm1vY2tSZXNvbHZlZFZhbHVlID0gKHZhbDogQXdhaXRlZDxUUmV0dXJucz4pID0+XG4gICAgc3R1Yi5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHZhbCBhcyBUUmV0dXJucykpXG5cbiAgc3R1Yi5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UgPSAodmFsOiBBd2FpdGVkPFRSZXR1cm5zPikgPT5cbiAgICBzdHViLm1vY2tJbXBsZW1lbnRhdGlvbk9uY2UoKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHZhbCBhcyBUUmV0dXJucykpXG5cbiAgc3R1Yi5tb2NrUmVqZWN0ZWRWYWx1ZSA9ICh2YWw6IHVua25vd24pID0+XG4gICAgc3R1Yi5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gUHJvbWlzZS5yZWplY3QodmFsKSlcblxuICBzdHViLm1vY2tSZWplY3RlZFZhbHVlT25jZSA9ICh2YWw6IHVua25vd24pID0+XG4gICAgc3R1Yi5tb2NrSW1wbGVtZW50YXRpb25PbmNlKCgpID0+IFByb21pc2UucmVqZWN0KHZhbCkpXG5cbiAgdXRpbC5hZGRQcm9wZXJ0eShzdHViLCAnbW9jaycsICgpID0+IG1vY2tDb250ZXh0KVxuXG4gIHN0dWIud2lsbENhbGwoZnVuY3Rpb24odGhpczogdW5rbm93biwgLi4uYXJncykge1xuICAgIGluc3RhbmNlcy5wdXNoKHRoaXMpXG4gICAgaW52b2NhdGlvbnMucHVzaCgrK2NhbGxPcmRlcilcbiAgICBjb25zdCBpbXBsID0gb25jZUltcGxlbWVudGF0aW9ucy5zaGlmdCgpIHx8IGltcGxlbWVudGF0aW9uIHx8IHN0dWIuZ2V0T3JpZ2luYWwoKSB8fCAoKCkgPT4ge30pXG4gICAgcmV0dXJuIGltcGwuYXBwbHkodGhpcywgYXJncylcbiAgfSlcblxuICBzcGllcy5hZGQoc3R1YilcblxuICByZXR1cm4gc3R1YiBhcyBhbnlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZuPFRBcmdzIGV4dGVuZHMgYW55W10gPSBhbnlbXSwgUiA9IGFueT4oKTogU3B5SW5zdGFuY2VGbjxUQXJncywgUj5cbmV4cG9ydCBmdW5jdGlvbiBmbjxUQXJncyBleHRlbmRzIGFueVtdID0gYW55W10sIFIgPSBhbnk+KFxuICBpbXBsZW1lbnRhdGlvbjogKC4uLmFyZ3M6IFRBcmdzKSA9PiBSXG4pOiBTcHlJbnN0YW5jZUZuPFRBcmdzLCBSPlxuZXhwb3J0IGZ1bmN0aW9uIGZuPFRBcmdzIGV4dGVuZHMgYW55W10gPSBhbnlbXSwgUiA9IGFueT4oXG4gIGltcGxlbWVudGF0aW9uPzogKC4uLmFyZ3M6IFRBcmdzKSA9PiBSLFxuKTogU3B5SW5zdGFuY2VGbjxUQXJncywgUj4ge1xuICByZXR1cm4gZW5oYW5jZVNweSh0aW55c3B5LnNweU9uKHsgZm46IGltcGxlbWVudGF0aW9uIHx8ICgoKSA9PiB7fSkgfSwgJ2ZuJykpIGFzIHVua25vd24gYXMgU3B5SW5zdGFuY2VGblxufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVZLE1BQUMsS0FBSyxHQUFHLElBQUksR0FBRyxHQUFHO0FBQ3hCLFNBQVMsY0FBYyxDQUFDLEdBQUcsRUFBRTtBQUNwQyxFQUFFLE9BQU8sT0FBTyxHQUFHLEtBQUssVUFBVSxJQUFJLFNBQVMsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQztBQUN0RSxDQUFDO0FBQ00sU0FBUyxLQUFLLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUU7QUFDL0MsRUFBRSxNQUFNLFVBQVUsR0FBRztBQUNyQixJQUFJLEdBQUcsRUFBRSxRQUFRO0FBQ2pCLElBQUksR0FBRyxFQUFFLFFBQVE7QUFDakIsR0FBRyxDQUFDO0FBQ0osRUFBRSxNQUFNLFNBQVMsR0FBRyxVQUFVLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxNQUFNLEVBQUUsR0FBRyxNQUFN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