vitest 0.34.2 → 0.34.4

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 (38) hide show
  1. package/dist/browser.d.ts +3 -3
  2. package/dist/browser.js +1 -1
  3. package/dist/child.js +2 -2
  4. package/dist/{chunk-api-setup.cc5282f7.js → chunk-api-setup.d65b007d.js} +4 -4
  5. package/dist/{chunk-install-pkg.7e19b3a0.js → chunk-install-pkg.b2bdbadc.js} +4 -3
  6. package/dist/{chunk-integrations-globals.522ae1ae.js → chunk-integrations-globals.09bbbed7.js} +3 -3
  7. package/dist/cli.js +9 -8
  8. package/dist/config.cjs +3 -1
  9. package/dist/config.d.ts +3 -3
  10. package/dist/config.js +3 -1
  11. package/dist/coverage.d.ts +3 -3
  12. package/dist/entry-vm.js +3 -3
  13. package/dist/entry.js +6 -3
  14. package/dist/environments.d.ts +3 -3
  15. package/dist/environments.js +1 -1
  16. package/dist/execute.d.ts +3 -3
  17. package/dist/execute.js +1 -1
  18. package/dist/index.d.ts +3 -3
  19. package/dist/index.js +4 -4
  20. package/dist/loader.js +1 -1
  21. package/dist/node.d.ts +4 -4
  22. package/dist/node.js +4 -3
  23. package/dist/{types-63abf2e0.d.ts → reporters-cb94c88b.d.ts} +18 -15
  24. package/dist/reporters.d.ts +16 -0
  25. package/dist/reporters.js +16 -0
  26. package/dist/runners.d.ts +3 -3
  27. package/dist/runners.js +2 -2
  28. package/dist/{vendor-environments.37f266a9.js → vendor-environments.c9c96bf7.js} +16 -4
  29. package/dist/{vendor-execute.4fc8203a.js → vendor-execute.a63e187f.js} +8 -6
  30. package/dist/{vendor-index.087d1af7.js → vendor-index.29282562.js} +1 -1
  31. package/dist/{vendor-index.b5efbd68.js → vendor-index.e951dd92.js} +1 -1
  32. package/dist/{vendor-node.7b1bd3c5.js → vendor-node.b14cb9ad.js} +156 -2669
  33. package/dist/vendor-reporters.f6975b8d.js +2584 -0
  34. package/dist/{vendor-vi.f8055ff2.js → vendor-vi.befc11a6.js} +24 -23
  35. package/dist/vm.js +2 -2
  36. package/dist/worker.js +2 -2
  37. package/package.json +12 -8
  38. package/reporters.d.ts +1 -0
@@ -1,5 +1,5 @@
1
- import { resolve, relative, isAbsolute, dirname, basename, normalize, join, extname, toNamespacedPath } from 'pathe';
2
- import { loadConfigFromFile, version as version$2, searchForWorkspaceRoot, createServer, mergeConfig } from 'vite';
1
+ import { resolve, relative, dirname, normalize, basename, join, extname, toNamespacedPath } from 'pathe';
2
+ import { loadConfigFromFile, searchForWorkspaceRoot, version as version$2, createServer, mergeConfig } from 'vite';
3
3
  import path$a from 'node:path';
4
4
  import url, { fileURLToPath, pathToFileURL } from 'node:url';
5
5
  import process$1 from 'node:process';
@@ -17,7 +17,7 @@ import { slash as slash$2, normalizeRequestId, cleanUrl } from 'vite-node/utils'
17
17
  import { ViteNodeRunner } from 'vite-node/client';
18
18
  import { SnapshotManager } from '@vitest/snapshot/manager';
19
19
  import { ViteNodeServer } from 'vite-node/server';
20
- import { a as isNode, r as relativePath, b as removeUndefinedValues, c as isWindows } from './vendor-index.087d1af7.js';
20
+ import { r as removeUndefinedValues, a as isWindows } from './vendor-index.29282562.js';
21
21
  import { g as getCoverageProvider, C as CoverageProviderMap } from './vendor-coverage.78040316.js';
22
22
  import { d as distDir, r as rootDir } from './vendor-paths.84fc7a99.js';
23
23
  import v8 from 'node:v8';
@@ -25,25 +25,23 @@ import { fork } from 'node:child_process';
25
25
  import { c as createBirpc } from './vendor-index.b271ebe4.js';
26
26
  import { g as groupBy, A as AggregateErrorPonyfill, s as slash$1, t as toArray, i as isPrimitive, d as deepMerge, n as noop$1, a as stdout } from './vendor-base.9c08bbd0.js';
27
27
  import { MessageChannel } from 'node:worker_threads';
28
- import { cpus, hostname, totalmem } from 'node:os';
28
+ import { cpus, totalmem } from 'node:os';
29
29
  import Tinypool from 'tinypool';
30
- import { createDefer, getSafeTimers, notNullish, shuffle, inspect, positionToOffset, lineSplitRE } from '@vitest/utils';
30
+ import { createDefer, shuffle, inspect, positionToOffset, lineSplitRE, notNullish } from '@vitest/utils';
31
31
  import { isPackageExists, resolveModule } from 'local-pkg';
32
32
  import { isCI } from 'std-env';
33
- import { performance } from 'node:perf_hooks';
34
- import { g as getFullName, h as hasFailedSnapshot } from './vendor-tasks.f9d75aed.js';
35
- import { getTests, hasFailed, getSuites, generateHash, calculateSuiteHash, someTasksAreOnly, interpretTaskModes, getTasks } from '@vitest/runner/utils';
36
- import { parseErrorStacktrace, TraceMap, generatedPositionFor } from '@vitest/utils/source-map';
37
- import { createRequire, builtinModules } from 'node:module';
38
- import { createHash } from 'node:crypto';
33
+ import { R as ReportersMap, B as BenchmarkReportsMap, s as stringWidth, a as ansiStyles, b as stripAnsi, c as sliceAnsi, d as divider, F as F_POINTER, e as cliTruncate } from './vendor-reporters.f6975b8d.js';
34
+ import crypto, { createHash } from 'node:crypto';
39
35
  import { o as onExit, e as execa } from './vendor-index.1f85e5f1.js';
36
+ import { TraceMap, generatedPositionFor, parseErrorStacktrace } from '@vitest/utils/source-map';
40
37
  import { writeFile, rm } from 'node:fs/promises';
41
38
  import ue from 'module';
42
39
  import { parse as parse$4 } from 'acorn';
43
40
  import { ancestor, simple, findNodeAround } from 'acorn-walk';
41
+ import { generateHash, calculateSuiteHash, someTasksAreOnly, interpretTaskModes, getTasks, hasFailed } from '@vitest/runner/utils';
44
42
  import MagicString from 'magic-string';
45
43
  import { stripLiteral } from 'strip-literal';
46
- import { g as getEnvPackageName } from './vendor-environments.37f266a9.js';
44
+ import { g as getEnvPackageName } from './vendor-environments.c9c96bf7.js';
47
45
  import readline from 'node:readline';
48
46
  import require$$0$2 from 'readline';
49
47
 
@@ -62,7 +60,7 @@ function _mergeNamespaces(n, m) {
62
60
  return Object.freeze(n);
63
61
  }
64
62
 
65
- var version$1 = "0.34.2";
63
+ var version$1 = "0.34.4";
66
64
 
67
65
  const __dirname$1 = url.fileURLToPath(new URL(".", import.meta.url));
68
66
  async function ensurePackageInstalled(dependency, root) {
@@ -81,7 +79,7 @@ async function ensurePackageInstalled(dependency, root) {
81
79
  message: c.reset(`Do you want to install ${c.green(dependency)}?`)
82
80
  });
83
81
  if (install) {
84
- await (await import('./chunk-install-pkg.7e19b3a0.js')).installPackage(dependency, { dev: true });
82
+ await (await import('./chunk-install-pkg.b2bdbadc.js')).installPackage(dependency, { dev: true });
85
83
  process.stderr.write(c.yellow(`
86
84
  Package ${dependency} installed, re-run the command to start.
87
85
  `));
@@ -7687,2559 +7685,6 @@ function createPool(ctx) {
7687
7685
  };
7688
7686
  }
7689
7687
 
7690
- const F_RIGHT = "\u2192";
7691
- const F_DOWN = "\u2193";
7692
- const F_DOWN_RIGHT = "\u21B3";
7693
- const F_POINTER = "\u276F";
7694
- const F_DOT = "\xB7";
7695
- const F_CHECK = "\u2713";
7696
- const F_CROSS = "\xD7";
7697
- const F_LONG_DASH = "\u23AF";
7698
-
7699
- function ansiRegex({onlyFirst = false} = {}) {
7700
- const pattern = [
7701
- '[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)',
7702
- '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))'
7703
- ].join('|');
7704
-
7705
- return new RegExp(pattern, onlyFirst ? undefined : 'g');
7706
- }
7707
-
7708
- const regex = ansiRegex();
7709
-
7710
- function stripAnsi(string) {
7711
- if (typeof string !== 'string') {
7712
- throw new TypeError(`Expected a \`string\`, got \`${typeof string}\``);
7713
- }
7714
-
7715
- // Even though the regex is global, we don't need to reset the `.lastIndex`
7716
- // because unlike `.exec()` and `.test()`, `.replace()` does it automatically
7717
- // and doing it manually has a performance penalty.
7718
- return string.replace(regex, '');
7719
- }
7720
-
7721
- const spinnerMap = /* @__PURE__ */ new WeakMap();
7722
- const hookSpinnerMap = /* @__PURE__ */ new WeakMap();
7723
- const pointer = c.yellow(F_POINTER);
7724
- const skipped = c.dim(c.gray(F_DOWN));
7725
- function getCols(delta = 0) {
7726
- var _a;
7727
- let length = (_a = process.stdout) == null ? void 0 : _a.columns;
7728
- if (!length || Number.isNaN(length))
7729
- length = 30;
7730
- return Math.max(length + delta, 0);
7731
- }
7732
- function divider(text, left, right) {
7733
- const cols = getCols();
7734
- if (text) {
7735
- const textLength = stripAnsi(text).length;
7736
- if (left == null && right != null) {
7737
- left = cols - textLength - right;
7738
- } else {
7739
- left = left ?? Math.floor((cols - textLength) / 2);
7740
- right = cols - textLength - left;
7741
- }
7742
- left = Math.max(0, left);
7743
- right = Math.max(0, right);
7744
- return `${F_LONG_DASH.repeat(left)}${text}${F_LONG_DASH.repeat(right)}`;
7745
- }
7746
- return F_LONG_DASH.repeat(cols);
7747
- }
7748
- function formatTestPath(root, path) {
7749
- var _a;
7750
- if (isAbsolute(path))
7751
- path = relative(root, path);
7752
- const dir = dirname(path);
7753
- const ext = ((_a = path.match(/(\.(spec|test)\.[cm]?[tj]sx?)$/)) == null ? void 0 : _a[0]) || "";
7754
- const base = basename(path, ext);
7755
- return slash$1(c.dim(`${dir}/`) + c.bold(base)) + c.dim(ext);
7756
- }
7757
- function renderSnapshotSummary(rootDir, snapshots) {
7758
- const summary = [];
7759
- if (snapshots.added)
7760
- summary.push(c.bold(c.green(`${snapshots.added} written`)));
7761
- if (snapshots.unmatched)
7762
- summary.push(c.bold(c.red(`${snapshots.unmatched} failed`)));
7763
- if (snapshots.updated)
7764
- summary.push(c.bold(c.green(`${snapshots.updated} updated `)));
7765
- if (snapshots.filesRemoved) {
7766
- if (snapshots.didUpdate)
7767
- summary.push(c.bold(c.green(`${snapshots.filesRemoved} files removed `)));
7768
- else
7769
- summary.push(c.bold(c.yellow(`${snapshots.filesRemoved} files obsolete `)));
7770
- }
7771
- if (snapshots.filesRemovedList && snapshots.filesRemovedList.length) {
7772
- const [head, ...tail] = snapshots.filesRemovedList;
7773
- summary.push(`${c.gray(F_DOWN_RIGHT)} ${formatTestPath(rootDir, head)}`);
7774
- tail.forEach((key) => {
7775
- summary.push(` ${c.gray(F_DOT)} ${formatTestPath(rootDir, key)}`);
7776
- });
7777
- }
7778
- if (snapshots.unchecked) {
7779
- if (snapshots.didUpdate)
7780
- summary.push(c.bold(c.green(`${snapshots.unchecked} removed`)));
7781
- else
7782
- summary.push(c.bold(c.yellow(`${snapshots.unchecked} obsolete`)));
7783
- snapshots.uncheckedKeysByFile.forEach((uncheckedFile) => {
7784
- summary.push(`${c.gray(F_DOWN_RIGHT)} ${formatTestPath(rootDir, uncheckedFile.filePath)}`);
7785
- uncheckedFile.keys.forEach((key) => summary.push(` ${c.gray(F_DOT)} ${key}`));
7786
- });
7787
- }
7788
- return summary;
7789
- }
7790
- function countTestErrors(tasks) {
7791
- return tasks.reduce((c2, i) => {
7792
- var _a, _b;
7793
- return c2 + (((_b = (_a = i.result) == null ? void 0 : _a.errors) == null ? void 0 : _b.length) || 0);
7794
- }, 0);
7795
- }
7796
- function getStateString(tasks, name = "tests", showTotal = true) {
7797
- if (tasks.length === 0)
7798
- return c.dim(`no ${name}`);
7799
- const passed = tasks.filter((i) => {
7800
- var _a;
7801
- return ((_a = i.result) == null ? void 0 : _a.state) === "pass";
7802
- });
7803
- const failed = tasks.filter((i) => {
7804
- var _a;
7805
- return ((_a = i.result) == null ? void 0 : _a.state) === "fail";
7806
- });
7807
- const skipped2 = tasks.filter((i) => i.mode === "skip");
7808
- const todo = tasks.filter((i) => i.mode === "todo");
7809
- return [
7810
- failed.length ? c.bold(c.red(`${failed.length} failed`)) : null,
7811
- passed.length ? c.bold(c.green(`${passed.length} passed`)) : null,
7812
- skipped2.length ? c.yellow(`${skipped2.length} skipped`) : null,
7813
- todo.length ? c.gray(`${todo.length} todo`) : null
7814
- ].filter(Boolean).join(c.dim(" | ")) + (showTotal ? c.gray(` (${tasks.length})`) : "");
7815
- }
7816
- function getStateSymbol(task) {
7817
- var _a;
7818
- if (task.mode === "skip" || task.mode === "todo")
7819
- return skipped;
7820
- if (!task.result)
7821
- return c.gray("\xB7");
7822
- if (task.result.state === "run") {
7823
- if (task.type === "suite")
7824
- return pointer;
7825
- let spinner = spinnerMap.get(task);
7826
- if (!spinner) {
7827
- spinner = elegantSpinner();
7828
- spinnerMap.set(task, spinner);
7829
- }
7830
- return c.yellow(spinner());
7831
- }
7832
- if (task.result.state === "pass") {
7833
- return ((_a = task.meta) == null ? void 0 : _a.benchmark) ? c.green(F_DOT) : c.green(F_CHECK);
7834
- }
7835
- if (task.result.state === "fail") {
7836
- return task.type === "suite" ? pointer : c.red(F_CROSS);
7837
- }
7838
- return " ";
7839
- }
7840
- function getHookStateSymbol(task, hookName) {
7841
- var _a, _b;
7842
- const state = (_b = (_a = task.result) == null ? void 0 : _a.hooks) == null ? void 0 : _b[hookName];
7843
- if (state && state === "run") {
7844
- let spinnerMap2 = hookSpinnerMap.get(task);
7845
- if (!spinnerMap2) {
7846
- spinnerMap2 = /* @__PURE__ */ new Map();
7847
- hookSpinnerMap.set(task, spinnerMap2);
7848
- }
7849
- let spinner = spinnerMap2.get(hookName);
7850
- if (!spinner) {
7851
- spinner = elegantSpinner();
7852
- spinnerMap2.set(hookName, spinner);
7853
- }
7854
- return c.yellow(spinner());
7855
- }
7856
- }
7857
- const spinnerFrames = process.platform === "win32" ? ["-", "\\", "|", "/"] : ["\u280B", "\u2819", "\u2839", "\u2838", "\u283C", "\u2834", "\u2826", "\u2827", "\u2807", "\u280F"];
7858
- function elegantSpinner() {
7859
- let index = 0;
7860
- return () => {
7861
- index = ++index % spinnerFrames.length;
7862
- return spinnerFrames[index];
7863
- };
7864
- }
7865
- function formatTimeString(date) {
7866
- return date.toTimeString().split(" ")[0];
7867
- }
7868
- function formatProjectName(name, suffix = " ") {
7869
- if (!name)
7870
- return "";
7871
- const index = name.split("").reduce((acc, v, idx) => acc + v.charCodeAt(0) + idx, 0);
7872
- const colors = [
7873
- c.blue,
7874
- c.yellow,
7875
- c.cyan,
7876
- c.green,
7877
- c.magenta
7878
- ];
7879
- return colors[index % colors.length](`|${name}|`) + suffix;
7880
- }
7881
-
7882
- var _a;
7883
- const BADGE_PADDING = " ";
7884
- const HELP_HINT = `${c.dim("press ")}${c.bold("h")}${c.dim(" to show help")}`;
7885
- const HELP_UPDATE_SNAP = c.dim("press ") + c.bold(c.yellow("u")) + c.dim(" to update snapshot");
7886
- const HELP_QUITE = `${c.dim("press ")}${c.bold("q")}${c.dim(" to quit")}`;
7887
- const WAIT_FOR_CHANGE_PASS = `
7888
- ${c.bold(c.inverse(c.green(" PASS ")))}${c.green(" Waiting for file changes...")}`;
7889
- const WAIT_FOR_CHANGE_FAIL = `
7890
- ${c.bold(c.inverse(c.red(" FAIL ")))}${c.red(" Tests failed. Watching for file changes...")}`;
7891
- const WAIT_FOR_CHANGE_CANCELLED = `
7892
- ${c.bold(c.inverse(c.red(" CANCELLED ")))}${c.red(" Test run cancelled. Watching for file changes...")}`;
7893
- const LAST_RUN_LOG_TIMEOUT = 1500;
7894
- class BaseReporter {
7895
- start = 0;
7896
- end = 0;
7897
- watchFilters;
7898
- isTTY = isNode && ((_a = process.stdout) == null ? void 0 : _a.isTTY) && !isCI;
7899
- ctx = void 0;
7900
- _filesInWatchMode = /* @__PURE__ */ new Map();
7901
- _lastRunTimeout = 0;
7902
- _lastRunTimer;
7903
- _lastRunCount = 0;
7904
- _timeStart = /* @__PURE__ */ new Date();
7905
- constructor() {
7906
- this.registerUnhandledRejection();
7907
- }
7908
- get mode() {
7909
- return this.ctx.config.mode;
7910
- }
7911
- onInit(ctx) {
7912
- this.ctx = ctx;
7913
- ctx.logger.printBanner();
7914
- this.start = performance.now();
7915
- }
7916
- relative(path) {
7917
- return relativePath(this.ctx.config.root, path);
7918
- }
7919
- async onFinished(files = this.ctx.state.getFiles(), errors = this.ctx.state.getUnhandledErrors()) {
7920
- this.end = performance.now();
7921
- await this.reportSummary(files, errors);
7922
- if (errors.length) {
7923
- if (!this.ctx.config.dangerouslyIgnoreUnhandledErrors)
7924
- process.exitCode = 1;
7925
- }
7926
- }
7927
- onTaskUpdate(packs) {
7928
- var _a2, _b, _c, _d;
7929
- if (this.isTTY)
7930
- return;
7931
- const logger = this.ctx.logger;
7932
- for (const pack of packs) {
7933
- const task = this.ctx.state.idMap.get(pack[0]);
7934
- if (task && "filepath" in task && ((_a2 = task.result) == null ? void 0 : _a2.state) && ((_b = task.result) == null ? void 0 : _b.state) !== "run") {
7935
- const tests = getTests(task);
7936
- const failed = tests.filter((t) => {
7937
- var _a3;
7938
- return ((_a3 = t.result) == null ? void 0 : _a3.state) === "fail";
7939
- });
7940
- const skipped = tests.filter((t) => t.mode === "skip" || t.mode === "todo");
7941
- let state = c.dim(`${tests.length} test${tests.length > 1 ? "s" : ""}`);
7942
- if (failed.length)
7943
- state += ` ${c.dim("|")} ${c.red(`${failed.length} failed`)}`;
7944
- if (skipped.length)
7945
- state += ` ${c.dim("|")} ${c.yellow(`${skipped.length} skipped`)}`;
7946
- let suffix = c.dim(" (") + state + c.dim(")");
7947
- if (task.result.duration) {
7948
- const color = task.result.duration > this.ctx.config.slowTestThreshold ? c.yellow : c.gray;
7949
- suffix += color(` ${Math.round(task.result.duration)}${c.dim("ms")}`);
7950
- }
7951
- if (this.ctx.config.logHeapUsage && task.result.heap != null)
7952
- suffix += c.magenta(` ${Math.floor(task.result.heap / 1024 / 1024)} MB heap used`);
7953
- let title = ` ${getStateSymbol(task)} `;
7954
- if (task.projectName)
7955
- title += formatProjectName(task.projectName);
7956
- title += `${task.name} ${suffix}`;
7957
- logger.log(title);
7958
- for (const test of failed) {
7959
- logger.log(c.red(` ${pointer} ${getFullName(test, c.dim(" > "))}`));
7960
- (_d = (_c = test.result) == null ? void 0 : _c.errors) == null ? void 0 : _d.forEach((e) => {
7961
- logger.log(c.red(` ${F_RIGHT} ${e == null ? void 0 : e.message}`));
7962
- });
7963
- }
7964
- }
7965
- }
7966
- }
7967
- async onWatcherStart(files = this.ctx.state.getFiles(), errors = this.ctx.state.getUnhandledErrors()) {
7968
- this.resetLastRunLog();
7969
- const failed = errors.length > 0 || hasFailed(files);
7970
- const failedSnap = hasFailedSnapshot(files);
7971
- const cancelled = this.ctx.isCancelling;
7972
- if (failed)
7973
- this.ctx.logger.log(WAIT_FOR_CHANGE_FAIL);
7974
- else if (cancelled)
7975
- this.ctx.logger.log(WAIT_FOR_CHANGE_CANCELLED);
7976
- else
7977
- this.ctx.logger.log(WAIT_FOR_CHANGE_PASS);
7978
- const hints = [];
7979
- if (this.mode !== "typecheck")
7980
- hints.push(HELP_HINT);
7981
- if (failedSnap)
7982
- hints.unshift(HELP_UPDATE_SNAP);
7983
- else
7984
- hints.push(HELP_QUITE);
7985
- this.ctx.logger.log(BADGE_PADDING + hints.join(c.dim(", ")));
7986
- if (this._lastRunCount) {
7987
- const LAST_RUN_TEXT = `rerun x${this._lastRunCount}`;
7988
- const LAST_RUN_TEXTS = [
7989
- c.blue(LAST_RUN_TEXT),
7990
- c.gray(LAST_RUN_TEXT),
7991
- c.dim(c.gray(LAST_RUN_TEXT))
7992
- ];
7993
- this.ctx.logger.logUpdate(BADGE_PADDING + LAST_RUN_TEXTS[0]);
7994
- this._lastRunTimeout = 0;
7995
- const { setInterval } = getSafeTimers();
7996
- this._lastRunTimer = setInterval(
7997
- () => {
7998
- this._lastRunTimeout += 1;
7999
- if (this._lastRunTimeout >= LAST_RUN_TEXTS.length)
8000
- this.resetLastRunLog();
8001
- else
8002
- this.ctx.logger.logUpdate(BADGE_PADDING + LAST_RUN_TEXTS[this._lastRunTimeout]);
8003
- },
8004
- LAST_RUN_LOG_TIMEOUT / LAST_RUN_TEXTS.length
8005
- );
8006
- }
8007
- }
8008
- resetLastRunLog() {
8009
- const { clearInterval } = getSafeTimers();
8010
- clearInterval(this._lastRunTimer);
8011
- this._lastRunTimer = void 0;
8012
- this.ctx.logger.logUpdate.clear();
8013
- }
8014
- async onWatcherRerun(files, trigger) {
8015
- this.resetLastRunLog();
8016
- this.watchFilters = files;
8017
- files.forEach((filepath) => {
8018
- let reruns = this._filesInWatchMode.get(filepath) ?? 0;
8019
- this._filesInWatchMode.set(filepath, ++reruns);
8020
- });
8021
- const BADGE = c.inverse(c.bold(c.blue(" RERUN ")));
8022
- const TRIGGER = trigger ? c.dim(` ${this.relative(trigger)}`) : "";
8023
- const FILENAME_PATTERN = this.ctx.filenamePattern ? `${BADGE_PADDING} ${c.dim("Filename pattern: ")}${c.blue(this.ctx.filenamePattern)}
8024
- ` : "";
8025
- const TESTNAME_PATTERN = this.ctx.configOverride.testNamePattern ? `${BADGE_PADDING} ${c.dim("Test name pattern: ")}${c.blue(String(this.ctx.configOverride.testNamePattern))}
8026
- ` : "";
8027
- if (files.length > 1) {
8028
- this.ctx.logger.clearFullScreen(`
8029
- ${BADGE}${TRIGGER}
8030
- ${FILENAME_PATTERN}${TESTNAME_PATTERN}`);
8031
- this._lastRunCount = 0;
8032
- } else if (files.length === 1) {
8033
- const rerun = this._filesInWatchMode.get(files[0]) ?? 1;
8034
- this._lastRunCount = rerun;
8035
- this.ctx.logger.clearFullScreen(`
8036
- ${BADGE}${TRIGGER} ${c.blue(`x${rerun}`)}
8037
- ${FILENAME_PATTERN}${TESTNAME_PATTERN}`);
8038
- }
8039
- this._timeStart = /* @__PURE__ */ new Date();
8040
- this.start = performance.now();
8041
- }
8042
- onUserConsoleLog(log) {
8043
- if (!this.shouldLog(log))
8044
- return;
8045
- const task = log.taskId ? this.ctx.state.idMap.get(log.taskId) : void 0;
8046
- const header = c.gray(log.type + c.dim(` | ${task ? getFullName(task, c.dim(" > ")) : "unknown test"}`));
8047
- process[log.type].write(`${header}
8048
- ${log.content}
8049
- `);
8050
- }
8051
- shouldLog(log) {
8052
- var _a2, _b;
8053
- if (this.ctx.config.silent)
8054
- return false;
8055
- const shouldLog = (_b = (_a2 = this.ctx.config).onConsoleLog) == null ? void 0 : _b.call(_a2, log.content, log.type);
8056
- if (shouldLog === false)
8057
- return shouldLog;
8058
- return true;
8059
- }
8060
- onServerRestart(reason) {
8061
- this.ctx.logger.log(c.bold(c.magenta(
8062
- reason === "config" ? "\nRestarting due to config changes..." : "\nRestarting Vitest..."
8063
- )));
8064
- }
8065
- async reportSummary(files, errors) {
8066
- await this.printErrorsSummary(files, errors);
8067
- if (this.mode === "benchmark")
8068
- await this.reportBenchmarkSummary(files);
8069
- else
8070
- await this.reportTestSummary(files, errors);
8071
- }
8072
- async reportTestSummary(files, errors) {
8073
- const tests = getTests(files);
8074
- const logger = this.ctx.logger;
8075
- const executionTime = this.end - this.start;
8076
- const collectTime = files.reduce((acc, test) => acc + Math.max(0, test.collectDuration || 0), 0);
8077
- const setupTime = files.reduce((acc, test) => acc + Math.max(0, test.setupDuration || 0), 0);
8078
- const testsTime = files.reduce((acc, test) => {
8079
- var _a2;
8080
- return acc + Math.max(0, ((_a2 = test.result) == null ? void 0 : _a2.duration) || 0);
8081
- }, 0);
8082
- const transformTime = this.ctx.projects.flatMap((w) => Array.from(w.vitenode.fetchCache.values()).map((i) => i.duration || 0)).reduce((a, b) => a + b, 0);
8083
- const environmentTime = files.reduce((acc, file) => acc + Math.max(0, file.environmentLoad || 0), 0);
8084
- const prepareTime = files.reduce((acc, file) => acc + Math.max(0, file.prepareDuration || 0), 0);
8085
- const threadTime = collectTime + testsTime + setupTime;
8086
- const padTitle = (str) => c.dim(`${str.padStart(11)} `);
8087
- const time = (time2) => {
8088
- if (time2 > 1e3)
8089
- return `${(time2 / 1e3).toFixed(2)}s`;
8090
- return `${Math.round(time2)}ms`;
8091
- };
8092
- const snapshotOutput = renderSnapshotSummary(this.ctx.config.root, this.ctx.snapshot.summary);
8093
- if (snapshotOutput.length) {
8094
- logger.log(snapshotOutput.map(
8095
- (t, i) => i === 0 ? `${padTitle("Snapshots")} ${t}` : `${padTitle("")} ${t}`
8096
- ).join("\n"));
8097
- if (snapshotOutput.length > 1)
8098
- logger.log();
8099
- }
8100
- logger.log(padTitle("Test Files"), getStateString(files));
8101
- logger.log(padTitle("Tests"), getStateString(tests));
8102
- if (this.mode === "typecheck") {
8103
- const failed = tests.filter((t) => {
8104
- var _a2, _b, _c;
8105
- return ((_a2 = t.meta) == null ? void 0 : _a2.typecheck) && ((_c = (_b = t.result) == null ? void 0 : _b.errors) == null ? void 0 : _c.length);
8106
- });
8107
- logger.log(padTitle("Type Errors"), failed.length ? c.bold(c.red(`${failed.length} failed`)) : c.dim("no errors"));
8108
- }
8109
- if (errors.length)
8110
- logger.log(padTitle("Errors"), c.bold(c.red(`${errors.length} error${errors.length > 1 ? "s" : ""}`)));
8111
- logger.log(padTitle("Start at"), formatTimeString(this._timeStart));
8112
- if (this.watchFilters)
8113
- logger.log(padTitle("Duration"), time(threadTime));
8114
- else if (this.mode === "typecheck")
8115
- logger.log(padTitle("Duration"), time(executionTime));
8116
- else
8117
- logger.log(padTitle("Duration"), time(executionTime) + c.dim(` (transform ${time(transformTime)}, setup ${time(setupTime)}, collect ${time(collectTime)}, tests ${time(testsTime)}, environment ${time(environmentTime)}, prepare ${time(prepareTime)})`));
8118
- logger.log();
8119
- }
8120
- async printErrorsSummary(files, errors) {
8121
- const logger = this.ctx.logger;
8122
- const suites = getSuites(files);
8123
- const tests = getTests(files);
8124
- const failedSuites = suites.filter((i) => {
8125
- var _a2;
8126
- return (_a2 = i.result) == null ? void 0 : _a2.errors;
8127
- });
8128
- const failedTests = tests.filter((i) => {
8129
- var _a2;
8130
- return ((_a2 = i.result) == null ? void 0 : _a2.state) === "fail";
8131
- });
8132
- const failedTotal = countTestErrors(failedSuites) + countTestErrors(failedTests);
8133
- let current = 1;
8134
- const errorDivider = () => logger.error(`${c.red(c.dim(divider(`[${current++}/${failedTotal}]`, void 0, 1)))}
8135
- `);
8136
- if (failedSuites.length) {
8137
- logger.error(c.red(divider(c.bold(c.inverse(` Failed Suites ${failedSuites.length} `)))));
8138
- logger.error();
8139
- await this.printTaskErrors(failedSuites, errorDivider);
8140
- }
8141
- if (failedTests.length) {
8142
- logger.error(c.red(divider(c.bold(c.inverse(` Failed Tests ${failedTests.length} `)))));
8143
- logger.error();
8144
- await this.printTaskErrors(failedTests, errorDivider);
8145
- }
8146
- if (errors.length) {
8147
- await logger.printUnhandledErrors(errors);
8148
- logger.error();
8149
- }
8150
- return tests;
8151
- }
8152
- async reportBenchmarkSummary(files) {
8153
- const logger = this.ctx.logger;
8154
- const benches = getTests(files);
8155
- const topBenches = benches.filter((i) => {
8156
- var _a2, _b;
8157
- return ((_b = (_a2 = i.result) == null ? void 0 : _a2.benchmark) == null ? void 0 : _b.rank) === 1;
8158
- });
8159
- logger.log(`
8160
- ${c.cyan(c.inverse(c.bold(" BENCH ")))} ${c.cyan("Summary")}
8161
- `);
8162
- for (const bench of topBenches) {
8163
- const group = bench.suite;
8164
- if (!group)
8165
- continue;
8166
- const groupName = getFullName(group, c.dim(" > "));
8167
- logger.log(` ${bench.name}${c.dim(` - ${groupName}`)}`);
8168
- const siblings = group.tasks.filter((i) => {
8169
- var _a2;
8170
- return ((_a2 = i.result) == null ? void 0 : _a2.benchmark) && i !== bench;
8171
- }).sort((a, b) => a.result.benchmark.rank - b.result.benchmark.rank);
8172
- for (const sibling of siblings) {
8173
- const number = `${(sibling.result.benchmark.mean / bench.result.benchmark.mean).toFixed(2)}x`;
8174
- logger.log(` ${c.green(number)} ${c.gray("faster than")} ${sibling.name}`);
8175
- }
8176
- logger.log("");
8177
- }
8178
- }
8179
- async printTaskErrors(tasks, errorDivider) {
8180
- var _a2, _b, _c;
8181
- const errorsQueue = [];
8182
- for (const task of tasks) {
8183
- (_b = (_a2 = task.result) == null ? void 0 : _a2.errors) == null ? void 0 : _b.forEach((error) => {
8184
- const errorItem = (error == null ? void 0 : error.stackStr) && errorsQueue.find((i) => {
8185
- var _a3, _b2, _c2, _d;
8186
- const hasStr = ((_a3 = i[0]) == null ? void 0 : _a3.stackStr) === error.stackStr;
8187
- if (!hasStr)
8188
- return false;
8189
- const currentProjectName = (task == null ? void 0 : task.projectName) || ((_b2 = task.file) == null ? void 0 : _b2.projectName);
8190
- const projectName = ((_c2 = i[1][0]) == null ? void 0 : _c2.projectName) || ((_d = i[1][0].file) == null ? void 0 : _d.projectName);
8191
- return projectName === currentProjectName;
8192
- });
8193
- if (errorItem)
8194
- errorItem[1].push(task);
8195
- else
8196
- errorsQueue.push([error, [task]]);
8197
- });
8198
- }
8199
- for (const [error, tasks2] of errorsQueue) {
8200
- for (const task of tasks2) {
8201
- const filepath = (task == null ? void 0 : task.filepath) || "";
8202
- const projectName = (task == null ? void 0 : task.projectName) || ((_c = task.file) == null ? void 0 : _c.projectName);
8203
- let name = getFullName(task, c.dim(" > "));
8204
- if (filepath)
8205
- name = `${name} ${c.dim(`[ ${this.relative(filepath)} ]`)}`;
8206
- this.ctx.logger.error(`${c.red(c.bold(c.inverse(" FAIL ")))} ${formatProjectName(projectName)}${name}`);
8207
- }
8208
- const project = this.ctx.getProjectByTaskId(tasks2[0].id);
8209
- await this.ctx.logger.printError(error, { project });
8210
- errorDivider();
8211
- await Promise.resolve();
8212
- }
8213
- }
8214
- registerUnhandledRejection() {
8215
- process.on("unhandledRejection", async (err) => {
8216
- process.exitCode = 1;
8217
- await this.ctx.logger.printError(err, { fullStack: true, type: "Unhandled Rejection" });
8218
- this.ctx.logger.error("\n\n");
8219
- process.exit(1);
8220
- });
8221
- }
8222
- }
8223
-
8224
- class BasicReporter extends BaseReporter {
8225
- isTTY = false;
8226
- reportSummary(files, errors) {
8227
- this.ctx.logger.log();
8228
- return super.reportSummary(files, errors);
8229
- }
8230
- }
8231
-
8232
- /* eslint-disable yoda */
8233
-
8234
- function isFullwidthCodePoint(codePoint) {
8235
- if (!Number.isInteger(codePoint)) {
8236
- return false;
8237
- }
8238
-
8239
- // Code points are derived from:
8240
- // https://unicode.org/Public/UNIDATA/EastAsianWidth.txt
8241
- return codePoint >= 0x1100 && (
8242
- codePoint <= 0x115F || // Hangul Jamo
8243
- codePoint === 0x2329 || // LEFT-POINTING ANGLE BRACKET
8244
- codePoint === 0x232A || // RIGHT-POINTING ANGLE BRACKET
8245
- // CJK Radicals Supplement .. Enclosed CJK Letters and Months
8246
- (0x2E80 <= codePoint && codePoint <= 0x3247 && codePoint !== 0x303F) ||
8247
- // Enclosed CJK Letters and Months .. CJK Unified Ideographs Extension A
8248
- (0x3250 <= codePoint && codePoint <= 0x4DBF) ||
8249
- // CJK Unified Ideographs .. Yi Radicals
8250
- (0x4E00 <= codePoint && codePoint <= 0xA4C6) ||
8251
- // Hangul Jamo Extended-A
8252
- (0xA960 <= codePoint && codePoint <= 0xA97C) ||
8253
- // Hangul Syllables
8254
- (0xAC00 <= codePoint && codePoint <= 0xD7A3) ||
8255
- // CJK Compatibility Ideographs
8256
- (0xF900 <= codePoint && codePoint <= 0xFAFF) ||
8257
- // Vertical Forms
8258
- (0xFE10 <= codePoint && codePoint <= 0xFE19) ||
8259
- // CJK Compatibility Forms .. Small Form Variants
8260
- (0xFE30 <= codePoint && codePoint <= 0xFE6B) ||
8261
- // Halfwidth and Fullwidth Forms
8262
- (0xFF01 <= codePoint && codePoint <= 0xFF60) ||
8263
- (0xFFE0 <= codePoint && codePoint <= 0xFFE6) ||
8264
- // Kana Supplement
8265
- (0x1B000 <= codePoint && codePoint <= 0x1B001) ||
8266
- // Enclosed Ideographic Supplement
8267
- (0x1F200 <= codePoint && codePoint <= 0x1F251) ||
8268
- // CJK Unified Ideographs Extension B .. Tertiary Ideographic Plane
8269
- (0x20000 <= codePoint && codePoint <= 0x3FFFD)
8270
- );
8271
- }
8272
-
8273
- const ANSI_BACKGROUND_OFFSET = 10;
8274
-
8275
- const wrapAnsi16 = (offset = 0) => code => `\u001B[${code + offset}m`;
8276
-
8277
- const wrapAnsi256 = (offset = 0) => code => `\u001B[${38 + offset};5;${code}m`;
8278
-
8279
- const wrapAnsi16m = (offset = 0) => (red, green, blue) => `\u001B[${38 + offset};2;${red};${green};${blue}m`;
8280
-
8281
- const styles = {
8282
- modifier: {
8283
- reset: [0, 0],
8284
- // 21 isn't widely supported and 22 does the same thing
8285
- bold: [1, 22],
8286
- dim: [2, 22],
8287
- italic: [3, 23],
8288
- underline: [4, 24],
8289
- overline: [53, 55],
8290
- inverse: [7, 27],
8291
- hidden: [8, 28],
8292
- strikethrough: [9, 29],
8293
- },
8294
- color: {
8295
- black: [30, 39],
8296
- red: [31, 39],
8297
- green: [32, 39],
8298
- yellow: [33, 39],
8299
- blue: [34, 39],
8300
- magenta: [35, 39],
8301
- cyan: [36, 39],
8302
- white: [37, 39],
8303
-
8304
- // Bright color
8305
- blackBright: [90, 39],
8306
- gray: [90, 39], // Alias of `blackBright`
8307
- grey: [90, 39], // Alias of `blackBright`
8308
- redBright: [91, 39],
8309
- greenBright: [92, 39],
8310
- yellowBright: [93, 39],
8311
- blueBright: [94, 39],
8312
- magentaBright: [95, 39],
8313
- cyanBright: [96, 39],
8314
- whiteBright: [97, 39],
8315
- },
8316
- bgColor: {
8317
- bgBlack: [40, 49],
8318
- bgRed: [41, 49],
8319
- bgGreen: [42, 49],
8320
- bgYellow: [43, 49],
8321
- bgBlue: [44, 49],
8322
- bgMagenta: [45, 49],
8323
- bgCyan: [46, 49],
8324
- bgWhite: [47, 49],
8325
-
8326
- // Bright color
8327
- bgBlackBright: [100, 49],
8328
- bgGray: [100, 49], // Alias of `bgBlackBright`
8329
- bgGrey: [100, 49], // Alias of `bgBlackBright`
8330
- bgRedBright: [101, 49],
8331
- bgGreenBright: [102, 49],
8332
- bgYellowBright: [103, 49],
8333
- bgBlueBright: [104, 49],
8334
- bgMagentaBright: [105, 49],
8335
- bgCyanBright: [106, 49],
8336
- bgWhiteBright: [107, 49],
8337
- },
8338
- };
8339
-
8340
- Object.keys(styles.modifier);
8341
- const foregroundColorNames = Object.keys(styles.color);
8342
- const backgroundColorNames = Object.keys(styles.bgColor);
8343
- [...foregroundColorNames, ...backgroundColorNames];
8344
-
8345
- function assembleStyles() {
8346
- const codes = new Map();
8347
-
8348
- for (const [groupName, group] of Object.entries(styles)) {
8349
- for (const [styleName, style] of Object.entries(group)) {
8350
- styles[styleName] = {
8351
- open: `\u001B[${style[0]}m`,
8352
- close: `\u001B[${style[1]}m`,
8353
- };
8354
-
8355
- group[styleName] = styles[styleName];
8356
-
8357
- codes.set(style[0], style[1]);
8358
- }
8359
-
8360
- Object.defineProperty(styles, groupName, {
8361
- value: group,
8362
- enumerable: false,
8363
- });
8364
- }
8365
-
8366
- Object.defineProperty(styles, 'codes', {
8367
- value: codes,
8368
- enumerable: false,
8369
- });
8370
-
8371
- styles.color.close = '\u001B[39m';
8372
- styles.bgColor.close = '\u001B[49m';
8373
-
8374
- styles.color.ansi = wrapAnsi16();
8375
- styles.color.ansi256 = wrapAnsi256();
8376
- styles.color.ansi16m = wrapAnsi16m();
8377
- styles.bgColor.ansi = wrapAnsi16(ANSI_BACKGROUND_OFFSET);
8378
- styles.bgColor.ansi256 = wrapAnsi256(ANSI_BACKGROUND_OFFSET);
8379
- styles.bgColor.ansi16m = wrapAnsi16m(ANSI_BACKGROUND_OFFSET);
8380
-
8381
- // From https://github.com/Qix-/color-convert/blob/3f0e0d4e92e235796ccb17f6e85c72094a651f49/conversions.js
8382
- Object.defineProperties(styles, {
8383
- rgbToAnsi256: {
8384
- value: (red, green, blue) => {
8385
- // We use the extended greyscale palette here, with the exception of
8386
- // black and white. normal palette only has 4 greyscale shades.
8387
- if (red === green && green === blue) {
8388
- if (red < 8) {
8389
- return 16;
8390
- }
8391
-
8392
- if (red > 248) {
8393
- return 231;
8394
- }
8395
-
8396
- return Math.round(((red - 8) / 247) * 24) + 232;
8397
- }
8398
-
8399
- return 16
8400
- + (36 * Math.round(red / 255 * 5))
8401
- + (6 * Math.round(green / 255 * 5))
8402
- + Math.round(blue / 255 * 5);
8403
- },
8404
- enumerable: false,
8405
- },
8406
- hexToRgb: {
8407
- value: hex => {
8408
- const matches = /[a-f\d]{6}|[a-f\d]{3}/i.exec(hex.toString(16));
8409
- if (!matches) {
8410
- return [0, 0, 0];
8411
- }
8412
-
8413
- let [colorString] = matches;
8414
-
8415
- if (colorString.length === 3) {
8416
- colorString = [...colorString].map(character => character + character).join('');
8417
- }
8418
-
8419
- const integer = Number.parseInt(colorString, 16);
8420
-
8421
- return [
8422
- /* eslint-disable no-bitwise */
8423
- (integer >> 16) & 0xFF,
8424
- (integer >> 8) & 0xFF,
8425
- integer & 0xFF,
8426
- /* eslint-enable no-bitwise */
8427
- ];
8428
- },
8429
- enumerable: false,
8430
- },
8431
- hexToAnsi256: {
8432
- value: hex => styles.rgbToAnsi256(...styles.hexToRgb(hex)),
8433
- enumerable: false,
8434
- },
8435
- ansi256ToAnsi: {
8436
- value: code => {
8437
- if (code < 8) {
8438
- return 30 + code;
8439
- }
8440
-
8441
- if (code < 16) {
8442
- return 90 + (code - 8);
8443
- }
8444
-
8445
- let red;
8446
- let green;
8447
- let blue;
8448
-
8449
- if (code >= 232) {
8450
- red = (((code - 232) * 10) + 8) / 255;
8451
- green = red;
8452
- blue = red;
8453
- } else {
8454
- code -= 16;
8455
-
8456
- const remainder = code % 36;
8457
-
8458
- red = Math.floor(code / 36) / 5;
8459
- green = Math.floor(remainder / 6) / 5;
8460
- blue = (remainder % 6) / 5;
8461
- }
8462
-
8463
- const value = Math.max(red, green, blue) * 2;
8464
-
8465
- if (value === 0) {
8466
- return 30;
8467
- }
8468
-
8469
- // eslint-disable-next-line no-bitwise
8470
- let result = 30 + ((Math.round(blue) << 2) | (Math.round(green) << 1) | Math.round(red));
8471
-
8472
- if (value === 2) {
8473
- result += 60;
8474
- }
8475
-
8476
- return result;
8477
- },
8478
- enumerable: false,
8479
- },
8480
- rgbToAnsi: {
8481
- value: (red, green, blue) => styles.ansi256ToAnsi(styles.rgbToAnsi256(red, green, blue)),
8482
- enumerable: false,
8483
- },
8484
- hexToAnsi: {
8485
- value: hex => styles.ansi256ToAnsi(styles.hexToAnsi256(hex)),
8486
- enumerable: false,
8487
- },
8488
- });
8489
-
8490
- return styles;
8491
- }
8492
-
8493
- const ansiStyles = assembleStyles();
8494
-
8495
- const astralRegex = /^[\uD800-\uDBFF][\uDC00-\uDFFF]$/;
8496
-
8497
- const ESCAPES$1 = [
8498
- '\u001B',
8499
- '\u009B'
8500
- ];
8501
-
8502
- const wrapAnsi$1 = code => `${ESCAPES$1[0]}[${code}m`;
8503
-
8504
- const checkAnsi = (ansiCodes, isEscapes, endAnsiCode) => {
8505
- let output = [];
8506
- ansiCodes = [...ansiCodes];
8507
-
8508
- for (let ansiCode of ansiCodes) {
8509
- const ansiCodeOrigin = ansiCode;
8510
- if (ansiCode.includes(';')) {
8511
- ansiCode = ansiCode.split(';')[0][0] + '0';
8512
- }
8513
-
8514
- const item = ansiStyles.codes.get(Number.parseInt(ansiCode, 10));
8515
- if (item) {
8516
- const indexEscape = ansiCodes.indexOf(item.toString());
8517
- if (indexEscape === -1) {
8518
- output.push(wrapAnsi$1(isEscapes ? item : ansiCodeOrigin));
8519
- } else {
8520
- ansiCodes.splice(indexEscape, 1);
8521
- }
8522
- } else if (isEscapes) {
8523
- output.push(wrapAnsi$1(0));
8524
- break;
8525
- } else {
8526
- output.push(wrapAnsi$1(ansiCodeOrigin));
8527
- }
8528
- }
8529
-
8530
- if (isEscapes) {
8531
- output = output.filter((element, index) => output.indexOf(element) === index);
8532
-
8533
- if (endAnsiCode !== undefined) {
8534
- const fistEscapeCode = wrapAnsi$1(ansiStyles.codes.get(Number.parseInt(endAnsiCode, 10)));
8535
- // TODO: Remove the use of `.reduce` here.
8536
- // eslint-disable-next-line unicorn/no-array-reduce
8537
- output = output.reduce((current, next) => next === fistEscapeCode ? [next, ...current] : [...current, next], []);
8538
- }
8539
- }
8540
-
8541
- return output.join('');
8542
- };
8543
-
8544
- function sliceAnsi(string, begin, end) {
8545
- const characters = [...string];
8546
- const ansiCodes = [];
8547
-
8548
- let stringEnd = typeof end === 'number' ? end : characters.length;
8549
- let isInsideEscape = false;
8550
- let ansiCode;
8551
- let visible = 0;
8552
- let output = '';
8553
-
8554
- for (const [index, character] of characters.entries()) {
8555
- let leftEscape = false;
8556
-
8557
- if (ESCAPES$1.includes(character)) {
8558
- const code = /\d[^m]*/.exec(string.slice(index, index + 18));
8559
- ansiCode = code && code.length > 0 ? code[0] : undefined;
8560
-
8561
- if (visible < stringEnd) {
8562
- isInsideEscape = true;
8563
-
8564
- if (ansiCode !== undefined) {
8565
- ansiCodes.push(ansiCode);
8566
- }
8567
- }
8568
- } else if (isInsideEscape && character === 'm') {
8569
- isInsideEscape = false;
8570
- leftEscape = true;
8571
- }
8572
-
8573
- if (!isInsideEscape && !leftEscape) {
8574
- visible++;
8575
- }
8576
-
8577
- if (!astralRegex.test(character) && isFullwidthCodePoint(character.codePointAt())) {
8578
- visible++;
8579
-
8580
- if (typeof end !== 'number') {
8581
- stringEnd++;
8582
- }
8583
- }
8584
-
8585
- if (visible > begin && visible <= stringEnd) {
8586
- output += character;
8587
- } else if (visible === begin && !isInsideEscape && ansiCode !== undefined) {
8588
- output = checkAnsi(ansiCodes);
8589
- } else if (visible >= stringEnd) {
8590
- output += checkAnsi(ansiCodes, true, ansiCode);
8591
- break;
8592
- }
8593
- }
8594
-
8595
- return output;
8596
- }
8597
-
8598
- var eastasianwidth = {exports: {}};
8599
-
8600
- (function (module) {
8601
- var eaw = {};
8602
-
8603
- {
8604
- module.exports = eaw;
8605
- }
8606
-
8607
- eaw.eastAsianWidth = function(character) {
8608
- var x = character.charCodeAt(0);
8609
- var y = (character.length == 2) ? character.charCodeAt(1) : 0;
8610
- var codePoint = x;
8611
- if ((0xD800 <= x && x <= 0xDBFF) && (0xDC00 <= y && y <= 0xDFFF)) {
8612
- x &= 0x3FF;
8613
- y &= 0x3FF;
8614
- codePoint = (x << 10) | y;
8615
- codePoint += 0x10000;
8616
- }
8617
-
8618
- if ((0x3000 == codePoint) ||
8619
- (0xFF01 <= codePoint && codePoint <= 0xFF60) ||
8620
- (0xFFE0 <= codePoint && codePoint <= 0xFFE6)) {
8621
- return 'F';
8622
- }
8623
- if ((0x20A9 == codePoint) ||
8624
- (0xFF61 <= codePoint && codePoint <= 0xFFBE) ||
8625
- (0xFFC2 <= codePoint && codePoint <= 0xFFC7) ||
8626
- (0xFFCA <= codePoint && codePoint <= 0xFFCF) ||
8627
- (0xFFD2 <= codePoint && codePoint <= 0xFFD7) ||
8628
- (0xFFDA <= codePoint && codePoint <= 0xFFDC) ||
8629
- (0xFFE8 <= codePoint && codePoint <= 0xFFEE)) {
8630
- return 'H';
8631
- }
8632
- if ((0x1100 <= codePoint && codePoint <= 0x115F) ||
8633
- (0x11A3 <= codePoint && codePoint <= 0x11A7) ||
8634
- (0x11FA <= codePoint && codePoint <= 0x11FF) ||
8635
- (0x2329 <= codePoint && codePoint <= 0x232A) ||
8636
- (0x2E80 <= codePoint && codePoint <= 0x2E99) ||
8637
- (0x2E9B <= codePoint && codePoint <= 0x2EF3) ||
8638
- (0x2F00 <= codePoint && codePoint <= 0x2FD5) ||
8639
- (0x2FF0 <= codePoint && codePoint <= 0x2FFB) ||
8640
- (0x3001 <= codePoint && codePoint <= 0x303E) ||
8641
- (0x3041 <= codePoint && codePoint <= 0x3096) ||
8642
- (0x3099 <= codePoint && codePoint <= 0x30FF) ||
8643
- (0x3105 <= codePoint && codePoint <= 0x312D) ||
8644
- (0x3131 <= codePoint && codePoint <= 0x318E) ||
8645
- (0x3190 <= codePoint && codePoint <= 0x31BA) ||
8646
- (0x31C0 <= codePoint && codePoint <= 0x31E3) ||
8647
- (0x31F0 <= codePoint && codePoint <= 0x321E) ||
8648
- (0x3220 <= codePoint && codePoint <= 0x3247) ||
8649
- (0x3250 <= codePoint && codePoint <= 0x32FE) ||
8650
- (0x3300 <= codePoint && codePoint <= 0x4DBF) ||
8651
- (0x4E00 <= codePoint && codePoint <= 0xA48C) ||
8652
- (0xA490 <= codePoint && codePoint <= 0xA4C6) ||
8653
- (0xA960 <= codePoint && codePoint <= 0xA97C) ||
8654
- (0xAC00 <= codePoint && codePoint <= 0xD7A3) ||
8655
- (0xD7B0 <= codePoint && codePoint <= 0xD7C6) ||
8656
- (0xD7CB <= codePoint && codePoint <= 0xD7FB) ||
8657
- (0xF900 <= codePoint && codePoint <= 0xFAFF) ||
8658
- (0xFE10 <= codePoint && codePoint <= 0xFE19) ||
8659
- (0xFE30 <= codePoint && codePoint <= 0xFE52) ||
8660
- (0xFE54 <= codePoint && codePoint <= 0xFE66) ||
8661
- (0xFE68 <= codePoint && codePoint <= 0xFE6B) ||
8662
- (0x1B000 <= codePoint && codePoint <= 0x1B001) ||
8663
- (0x1F200 <= codePoint && codePoint <= 0x1F202) ||
8664
- (0x1F210 <= codePoint && codePoint <= 0x1F23A) ||
8665
- (0x1F240 <= codePoint && codePoint <= 0x1F248) ||
8666
- (0x1F250 <= codePoint && codePoint <= 0x1F251) ||
8667
- (0x20000 <= codePoint && codePoint <= 0x2F73F) ||
8668
- (0x2B740 <= codePoint && codePoint <= 0x2FFFD) ||
8669
- (0x30000 <= codePoint && codePoint <= 0x3FFFD)) {
8670
- return 'W';
8671
- }
8672
- if ((0x0020 <= codePoint && codePoint <= 0x007E) ||
8673
- (0x00A2 <= codePoint && codePoint <= 0x00A3) ||
8674
- (0x00A5 <= codePoint && codePoint <= 0x00A6) ||
8675
- (0x00AC == codePoint) ||
8676
- (0x00AF == codePoint) ||
8677
- (0x27E6 <= codePoint && codePoint <= 0x27ED) ||
8678
- (0x2985 <= codePoint && codePoint <= 0x2986)) {
8679
- return 'Na';
8680
- }
8681
- if ((0x00A1 == codePoint) ||
8682
- (0x00A4 == codePoint) ||
8683
- (0x00A7 <= codePoint && codePoint <= 0x00A8) ||
8684
- (0x00AA == codePoint) ||
8685
- (0x00AD <= codePoint && codePoint <= 0x00AE) ||
8686
- (0x00B0 <= codePoint && codePoint <= 0x00B4) ||
8687
- (0x00B6 <= codePoint && codePoint <= 0x00BA) ||
8688
- (0x00BC <= codePoint && codePoint <= 0x00BF) ||
8689
- (0x00C6 == codePoint) ||
8690
- (0x00D0 == codePoint) ||
8691
- (0x00D7 <= codePoint && codePoint <= 0x00D8) ||
8692
- (0x00DE <= codePoint && codePoint <= 0x00E1) ||
8693
- (0x00E6 == codePoint) ||
8694
- (0x00E8 <= codePoint && codePoint <= 0x00EA) ||
8695
- (0x00EC <= codePoint && codePoint <= 0x00ED) ||
8696
- (0x00F0 == codePoint) ||
8697
- (0x00F2 <= codePoint && codePoint <= 0x00F3) ||
8698
- (0x00F7 <= codePoint && codePoint <= 0x00FA) ||
8699
- (0x00FC == codePoint) ||
8700
- (0x00FE == codePoint) ||
8701
- (0x0101 == codePoint) ||
8702
- (0x0111 == codePoint) ||
8703
- (0x0113 == codePoint) ||
8704
- (0x011B == codePoint) ||
8705
- (0x0126 <= codePoint && codePoint <= 0x0127) ||
8706
- (0x012B == codePoint) ||
8707
- (0x0131 <= codePoint && codePoint <= 0x0133) ||
8708
- (0x0138 == codePoint) ||
8709
- (0x013F <= codePoint && codePoint <= 0x0142) ||
8710
- (0x0144 == codePoint) ||
8711
- (0x0148 <= codePoint && codePoint <= 0x014B) ||
8712
- (0x014D == codePoint) ||
8713
- (0x0152 <= codePoint && codePoint <= 0x0153) ||
8714
- (0x0166 <= codePoint && codePoint <= 0x0167) ||
8715
- (0x016B == codePoint) ||
8716
- (0x01CE == codePoint) ||
8717
- (0x01D0 == codePoint) ||
8718
- (0x01D2 == codePoint) ||
8719
- (0x01D4 == codePoint) ||
8720
- (0x01D6 == codePoint) ||
8721
- (0x01D8 == codePoint) ||
8722
- (0x01DA == codePoint) ||
8723
- (0x01DC == codePoint) ||
8724
- (0x0251 == codePoint) ||
8725
- (0x0261 == codePoint) ||
8726
- (0x02C4 == codePoint) ||
8727
- (0x02C7 == codePoint) ||
8728
- (0x02C9 <= codePoint && codePoint <= 0x02CB) ||
8729
- (0x02CD == codePoint) ||
8730
- (0x02D0 == codePoint) ||
8731
- (0x02D8 <= codePoint && codePoint <= 0x02DB) ||
8732
- (0x02DD == codePoint) ||
8733
- (0x02DF == codePoint) ||
8734
- (0x0300 <= codePoint && codePoint <= 0x036F) ||
8735
- (0x0391 <= codePoint && codePoint <= 0x03A1) ||
8736
- (0x03A3 <= codePoint && codePoint <= 0x03A9) ||
8737
- (0x03B1 <= codePoint && codePoint <= 0x03C1) ||
8738
- (0x03C3 <= codePoint && codePoint <= 0x03C9) ||
8739
- (0x0401 == codePoint) ||
8740
- (0x0410 <= codePoint && codePoint <= 0x044F) ||
8741
- (0x0451 == codePoint) ||
8742
- (0x2010 == codePoint) ||
8743
- (0x2013 <= codePoint && codePoint <= 0x2016) ||
8744
- (0x2018 <= codePoint && codePoint <= 0x2019) ||
8745
- (0x201C <= codePoint && codePoint <= 0x201D) ||
8746
- (0x2020 <= codePoint && codePoint <= 0x2022) ||
8747
- (0x2024 <= codePoint && codePoint <= 0x2027) ||
8748
- (0x2030 == codePoint) ||
8749
- (0x2032 <= codePoint && codePoint <= 0x2033) ||
8750
- (0x2035 == codePoint) ||
8751
- (0x203B == codePoint) ||
8752
- (0x203E == codePoint) ||
8753
- (0x2074 == codePoint) ||
8754
- (0x207F == codePoint) ||
8755
- (0x2081 <= codePoint && codePoint <= 0x2084) ||
8756
- (0x20AC == codePoint) ||
8757
- (0x2103 == codePoint) ||
8758
- (0x2105 == codePoint) ||
8759
- (0x2109 == codePoint) ||
8760
- (0x2113 == codePoint) ||
8761
- (0x2116 == codePoint) ||
8762
- (0x2121 <= codePoint && codePoint <= 0x2122) ||
8763
- (0x2126 == codePoint) ||
8764
- (0x212B == codePoint) ||
8765
- (0x2153 <= codePoint && codePoint <= 0x2154) ||
8766
- (0x215B <= codePoint && codePoint <= 0x215E) ||
8767
- (0x2160 <= codePoint && codePoint <= 0x216B) ||
8768
- (0x2170 <= codePoint && codePoint <= 0x2179) ||
8769
- (0x2189 == codePoint) ||
8770
- (0x2190 <= codePoint && codePoint <= 0x2199) ||
8771
- (0x21B8 <= codePoint && codePoint <= 0x21B9) ||
8772
- (0x21D2 == codePoint) ||
8773
- (0x21D4 == codePoint) ||
8774
- (0x21E7 == codePoint) ||
8775
- (0x2200 == codePoint) ||
8776
- (0x2202 <= codePoint && codePoint <= 0x2203) ||
8777
- (0x2207 <= codePoint && codePoint <= 0x2208) ||
8778
- (0x220B == codePoint) ||
8779
- (0x220F == codePoint) ||
8780
- (0x2211 == codePoint) ||
8781
- (0x2215 == codePoint) ||
8782
- (0x221A == codePoint) ||
8783
- (0x221D <= codePoint && codePoint <= 0x2220) ||
8784
- (0x2223 == codePoint) ||
8785
- (0x2225 == codePoint) ||
8786
- (0x2227 <= codePoint && codePoint <= 0x222C) ||
8787
- (0x222E == codePoint) ||
8788
- (0x2234 <= codePoint && codePoint <= 0x2237) ||
8789
- (0x223C <= codePoint && codePoint <= 0x223D) ||
8790
- (0x2248 == codePoint) ||
8791
- (0x224C == codePoint) ||
8792
- (0x2252 == codePoint) ||
8793
- (0x2260 <= codePoint && codePoint <= 0x2261) ||
8794
- (0x2264 <= codePoint && codePoint <= 0x2267) ||
8795
- (0x226A <= codePoint && codePoint <= 0x226B) ||
8796
- (0x226E <= codePoint && codePoint <= 0x226F) ||
8797
- (0x2282 <= codePoint && codePoint <= 0x2283) ||
8798
- (0x2286 <= codePoint && codePoint <= 0x2287) ||
8799
- (0x2295 == codePoint) ||
8800
- (0x2299 == codePoint) ||
8801
- (0x22A5 == codePoint) ||
8802
- (0x22BF == codePoint) ||
8803
- (0x2312 == codePoint) ||
8804
- (0x2460 <= codePoint && codePoint <= 0x24E9) ||
8805
- (0x24EB <= codePoint && codePoint <= 0x254B) ||
8806
- (0x2550 <= codePoint && codePoint <= 0x2573) ||
8807
- (0x2580 <= codePoint && codePoint <= 0x258F) ||
8808
- (0x2592 <= codePoint && codePoint <= 0x2595) ||
8809
- (0x25A0 <= codePoint && codePoint <= 0x25A1) ||
8810
- (0x25A3 <= codePoint && codePoint <= 0x25A9) ||
8811
- (0x25B2 <= codePoint && codePoint <= 0x25B3) ||
8812
- (0x25B6 <= codePoint && codePoint <= 0x25B7) ||
8813
- (0x25BC <= codePoint && codePoint <= 0x25BD) ||
8814
- (0x25C0 <= codePoint && codePoint <= 0x25C1) ||
8815
- (0x25C6 <= codePoint && codePoint <= 0x25C8) ||
8816
- (0x25CB == codePoint) ||
8817
- (0x25CE <= codePoint && codePoint <= 0x25D1) ||
8818
- (0x25E2 <= codePoint && codePoint <= 0x25E5) ||
8819
- (0x25EF == codePoint) ||
8820
- (0x2605 <= codePoint && codePoint <= 0x2606) ||
8821
- (0x2609 == codePoint) ||
8822
- (0x260E <= codePoint && codePoint <= 0x260F) ||
8823
- (0x2614 <= codePoint && codePoint <= 0x2615) ||
8824
- (0x261C == codePoint) ||
8825
- (0x261E == codePoint) ||
8826
- (0x2640 == codePoint) ||
8827
- (0x2642 == codePoint) ||
8828
- (0x2660 <= codePoint && codePoint <= 0x2661) ||
8829
- (0x2663 <= codePoint && codePoint <= 0x2665) ||
8830
- (0x2667 <= codePoint && codePoint <= 0x266A) ||
8831
- (0x266C <= codePoint && codePoint <= 0x266D) ||
8832
- (0x266F == codePoint) ||
8833
- (0x269E <= codePoint && codePoint <= 0x269F) ||
8834
- (0x26BE <= codePoint && codePoint <= 0x26BF) ||
8835
- (0x26C4 <= codePoint && codePoint <= 0x26CD) ||
8836
- (0x26CF <= codePoint && codePoint <= 0x26E1) ||
8837
- (0x26E3 == codePoint) ||
8838
- (0x26E8 <= codePoint && codePoint <= 0x26FF) ||
8839
- (0x273D == codePoint) ||
8840
- (0x2757 == codePoint) ||
8841
- (0x2776 <= codePoint && codePoint <= 0x277F) ||
8842
- (0x2B55 <= codePoint && codePoint <= 0x2B59) ||
8843
- (0x3248 <= codePoint && codePoint <= 0x324F) ||
8844
- (0xE000 <= codePoint && codePoint <= 0xF8FF) ||
8845
- (0xFE00 <= codePoint && codePoint <= 0xFE0F) ||
8846
- (0xFFFD == codePoint) ||
8847
- (0x1F100 <= codePoint && codePoint <= 0x1F10A) ||
8848
- (0x1F110 <= codePoint && codePoint <= 0x1F12D) ||
8849
- (0x1F130 <= codePoint && codePoint <= 0x1F169) ||
8850
- (0x1F170 <= codePoint && codePoint <= 0x1F19A) ||
8851
- (0xE0100 <= codePoint && codePoint <= 0xE01EF) ||
8852
- (0xF0000 <= codePoint && codePoint <= 0xFFFFD) ||
8853
- (0x100000 <= codePoint && codePoint <= 0x10FFFD)) {
8854
- return 'A';
8855
- }
8856
-
8857
- return 'N';
8858
- };
8859
-
8860
- eaw.characterLength = function(character) {
8861
- var code = this.eastAsianWidth(character);
8862
- if (code == 'F' || code == 'W' || code == 'A') {
8863
- return 2;
8864
- } else {
8865
- return 1;
8866
- }
8867
- };
8868
-
8869
- // Split a string considering surrogate-pairs.
8870
- function stringToArray(string) {
8871
- return string.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]|[^\uD800-\uDFFF]/g) || [];
8872
- }
8873
-
8874
- eaw.length = function(string) {
8875
- var characters = stringToArray(string);
8876
- var len = 0;
8877
- for (var i = 0; i < characters.length; i++) {
8878
- len = len + this.characterLength(characters[i]);
8879
- }
8880
- return len;
8881
- };
8882
-
8883
- eaw.slice = function(text, start, end) {
8884
- textLen = eaw.length(text);
8885
- start = start ? start : 0;
8886
- end = end ? end : 1;
8887
- if (start < 0) {
8888
- start = textLen + start;
8889
- }
8890
- if (end < 0) {
8891
- end = textLen + end;
8892
- }
8893
- var result = '';
8894
- var eawLen = 0;
8895
- var chars = stringToArray(text);
8896
- for (var i = 0; i < chars.length; i++) {
8897
- var char = chars[i];
8898
- var charLen = eaw.length(char);
8899
- if (eawLen >= start - (charLen == 2 ? 1 : 0)) {
8900
- if (eawLen + charLen <= end) {
8901
- result += char;
8902
- } else {
8903
- break;
8904
- }
8905
- }
8906
- eawLen += charLen;
8907
- }
8908
- return result;
8909
- };
8910
- } (eastasianwidth));
8911
-
8912
- var eastasianwidthExports = eastasianwidth.exports;
8913
- var eastAsianWidth = /*@__PURE__*/getDefaultExportFromCjs(eastasianwidthExports);
8914
-
8915
- var emojiRegex = function () {
8916
- // https://mths.be/emoji
8917
- return /\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67)\uDB40\uDC7F|(?:\uD83E\uDDD1\uD83C\uDFFF\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFC-\uDFFF])|\uD83D\uDC68(?:\uD83C\uDFFB(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|[\u2695\u2696\u2708]\uFE0F|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))?|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])\uFE0F|\u200D(?:(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D[\uDC66\uDC67])|\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC)?|(?:\uD83D\uDC69(?:\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69]))|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC69(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83E\uDDD1(?:\u200D(?:\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDE36\u200D\uD83C\uDF2B|\uD83C\uDFF3\uFE0F\u200D\u26A7|\uD83D\uDC3B\u200D\u2744|(?:(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\uD83C\uDFF4\u200D\u2620|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])\u200D[\u2640\u2642]|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u2600-\u2604\u260E\u2611\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26B0\u26B1\u26C8\u26CF\u26D1\u26D3\u26E9\u26F0\u26F1\u26F4\u26F7\u26F8\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u3030\u303D\u3297\u3299]|\uD83C[\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]|\uD83D[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3])\uFE0F|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDE35\u200D\uD83D\uDCAB|\uD83D\uDE2E\u200D\uD83D\uDCA8|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83E\uDDD1(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83D\uDC69(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF4\uD83C\uDDF2|\uD83D\uDC08\u200D\u2B1B|\u2764\uFE0F\u200D(?:\uD83D\uDD25|\uD83E\uDE79)|\uD83D\uDC41\uFE0F|\uD83C\uDFF3\uFE0F|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|[#\*0-9]\uFE0F\u20E3|\u2764\uFE0F|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|\uD83C\uDFF4|(?:[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270C\u270D]|\uD83D[\uDD74\uDD90])(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC08\uDC15\uDC3B\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE2E\uDE35\uDE36\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5]|\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD]|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0D\uDD0E\uDD10-\uDD17\uDD1D\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78\uDD7A-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCB\uDDD0\uDDE0-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6]|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26A7\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5-\uDED7\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDD77\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g;
8918
- };
8919
-
8920
- var emojiRegex$1 = /*@__PURE__*/getDefaultExportFromCjs(emojiRegex);
8921
-
8922
- function stringWidth(string, options = {}) {
8923
- if (typeof string !== 'string' || string.length === 0) {
8924
- return 0;
8925
- }
8926
-
8927
- options = {
8928
- ambiguousIsNarrow: true,
8929
- ...options
8930
- };
8931
-
8932
- string = stripAnsi(string);
8933
-
8934
- if (string.length === 0) {
8935
- return 0;
8936
- }
8937
-
8938
- string = string.replace(emojiRegex$1(), ' ');
8939
-
8940
- const ambiguousCharacterWidth = options.ambiguousIsNarrow ? 1 : 2;
8941
- let width = 0;
8942
-
8943
- for (const character of string) {
8944
- const codePoint = character.codePointAt(0);
8945
-
8946
- // Ignore control characters
8947
- if (codePoint <= 0x1F || (codePoint >= 0x7F && codePoint <= 0x9F)) {
8948
- continue;
8949
- }
8950
-
8951
- // Ignore combining characters
8952
- if (codePoint >= 0x300 && codePoint <= 0x36F) {
8953
- continue;
8954
- }
8955
-
8956
- const code = eastAsianWidth.eastAsianWidth(character);
8957
- switch (code) {
8958
- case 'F':
8959
- case 'W':
8960
- width += 2;
8961
- break;
8962
- case 'A':
8963
- width += ambiguousCharacterWidth;
8964
- break;
8965
- default:
8966
- width += 1;
8967
- }
8968
- }
8969
-
8970
- return width;
8971
- }
8972
-
8973
- function getIndexOfNearestSpace(string, wantedIndex, shouldSearchRight) {
8974
- if (string.charAt(wantedIndex) === ' ') {
8975
- return wantedIndex;
8976
- }
8977
-
8978
- for (let index = 1; index <= 3; index++) {
8979
- if (shouldSearchRight) {
8980
- if (string.charAt(wantedIndex + index) === ' ') {
8981
- return wantedIndex + index;
8982
- }
8983
- } else if (string.charAt(wantedIndex - index) === ' ') {
8984
- return wantedIndex - index;
8985
- }
8986
- }
8987
-
8988
- return wantedIndex;
8989
- }
8990
-
8991
- function cliTruncate(text, columns, options) {
8992
- options = {
8993
- position: 'end',
8994
- preferTruncationOnSpace: false,
8995
- truncationCharacter: '…',
8996
- ...options,
8997
- };
8998
-
8999
- const {position, space, preferTruncationOnSpace} = options;
9000
- let {truncationCharacter} = options;
9001
-
9002
- if (typeof text !== 'string') {
9003
- throw new TypeError(`Expected \`input\` to be a string, got ${typeof text}`);
9004
- }
9005
-
9006
- if (typeof columns !== 'number') {
9007
- throw new TypeError(`Expected \`columns\` to be a number, got ${typeof columns}`);
9008
- }
9009
-
9010
- if (columns < 1) {
9011
- return '';
9012
- }
9013
-
9014
- if (columns === 1) {
9015
- return truncationCharacter;
9016
- }
9017
-
9018
- const length = stringWidth(text);
9019
-
9020
- if (length <= columns) {
9021
- return text;
9022
- }
9023
-
9024
- if (position === 'start') {
9025
- if (preferTruncationOnSpace) {
9026
- const nearestSpace = getIndexOfNearestSpace(text, length - columns + 1, true);
9027
- return truncationCharacter + sliceAnsi(text, nearestSpace, length).trim();
9028
- }
9029
-
9030
- if (space === true) {
9031
- truncationCharacter += ' ';
9032
- }
9033
-
9034
- return truncationCharacter + sliceAnsi(text, length - columns + stringWidth(truncationCharacter), length);
9035
- }
9036
-
9037
- if (position === 'middle') {
9038
- if (space === true) {
9039
- truncationCharacter = ` ${truncationCharacter} `;
9040
- }
9041
-
9042
- const half = Math.floor(columns / 2);
9043
-
9044
- if (preferTruncationOnSpace) {
9045
- const spaceNearFirstBreakPoint = getIndexOfNearestSpace(text, half);
9046
- const spaceNearSecondBreakPoint = getIndexOfNearestSpace(text, length - (columns - half) + 1, true);
9047
- return sliceAnsi(text, 0, spaceNearFirstBreakPoint) + truncationCharacter + sliceAnsi(text, spaceNearSecondBreakPoint, length).trim();
9048
- }
9049
-
9050
- return (
9051
- sliceAnsi(text, 0, half)
9052
- + truncationCharacter
9053
- + sliceAnsi(text, length - (columns - half) + stringWidth(truncationCharacter), length)
9054
- );
9055
- }
9056
-
9057
- if (position === 'end') {
9058
- if (preferTruncationOnSpace) {
9059
- const nearestSpace = getIndexOfNearestSpace(text, columns - 1);
9060
- return sliceAnsi(text, 0, nearestSpace) + truncationCharacter;
9061
- }
9062
-
9063
- if (space === true) {
9064
- truncationCharacter = ` ${truncationCharacter}`;
9065
- }
9066
-
9067
- return sliceAnsi(text, 0, columns - stringWidth(truncationCharacter)) + truncationCharacter;
9068
- }
9069
-
9070
- throw new Error(`Expected \`options.position\` to be either \`start\`, \`middle\` or \`end\`, got ${position}`);
9071
- }
9072
-
9073
- const DURATION_LONG$1 = 300;
9074
- const outputMap$1 = /* @__PURE__ */ new WeakMap();
9075
- function formatFilepath$1(path) {
9076
- const lastSlash = Math.max(path.lastIndexOf("/") + 1, 0);
9077
- const basename = path.slice(lastSlash);
9078
- let firstDot = basename.indexOf(".");
9079
- if (firstDot < 0)
9080
- firstDot = basename.length;
9081
- firstDot += lastSlash;
9082
- return c.dim(path.slice(0, lastSlash)) + path.slice(lastSlash, firstDot) + c.dim(path.slice(firstDot));
9083
- }
9084
- function formatNumber$1(number) {
9085
- const res = String(number.toFixed(number < 100 ? 4 : 2)).split(".");
9086
- return res[0].replace(/(?=(?:\d{3})+$)(?!\b)/g, ",") + (res[1] ? `.${res[1]}` : "");
9087
- }
9088
- function renderHookState(task, hookName, level = 0) {
9089
- var _a, _b;
9090
- const state = (_b = (_a = task.result) == null ? void 0 : _a.hooks) == null ? void 0 : _b[hookName];
9091
- if (state && state === "run")
9092
- return `${" ".repeat(level)} ${getHookStateSymbol(task, hookName)} ${c.dim(`[ ${hookName} ]`)}`;
9093
- return "";
9094
- }
9095
- function renderBenchmarkItems$1(result) {
9096
- return [
9097
- result.name,
9098
- formatNumber$1(result.hz || 0),
9099
- formatNumber$1(result.p99 || 0),
9100
- `\xB1${result.rme.toFixed(2)}%`,
9101
- result.samples.length.toString()
9102
- ];
9103
- }
9104
- function renderBenchmark$1(task, tasks) {
9105
- var _a;
9106
- const result = (_a = task.result) == null ? void 0 : _a.benchmark;
9107
- if (!result)
9108
- return task.name;
9109
- const benches = tasks.map((i) => {
9110
- var _a2, _b;
9111
- return ((_a2 = i.meta) == null ? void 0 : _a2.benchmark) ? (_b = i.result) == null ? void 0 : _b.benchmark : void 0;
9112
- }).filter(notNullish);
9113
- const allItems = benches.map(renderBenchmarkItems$1);
9114
- const items = renderBenchmarkItems$1(result);
9115
- const padded = items.map((i, idx) => {
9116
- const width = Math.max(...allItems.map((i2) => i2[idx].length));
9117
- return idx ? i.padStart(width, " ") : i.padEnd(width, " ");
9118
- });
9119
- return [
9120
- padded[0],
9121
- // name
9122
- c.dim(" "),
9123
- c.blue(padded[1]),
9124
- c.dim(" ops/sec "),
9125
- c.cyan(padded[3]),
9126
- c.dim(` (${padded[4]} samples)`),
9127
- result.rank === 1 ? c.bold(c.green(" fastest")) : result.rank === benches.length && benches.length > 2 ? c.bold(c.gray(" slowest")) : ""
9128
- ].join("");
9129
- }
9130
- function renderTree$1(tasks, options, level = 0, maxRows) {
9131
- var _a, _b, _c, _d, _e, _f, _g, _h, _i;
9132
- const output = [];
9133
- let currentRowCount = 0;
9134
- for (const task of [...tasks].reverse()) {
9135
- const taskOutput = [];
9136
- let suffix = "";
9137
- let prefix = ` ${getStateSymbol(task)} `;
9138
- if (level === 0 && task.type === "suite" && task.projectName)
9139
- prefix += formatProjectName(task.projectName);
9140
- if (task.type === "test" && ((_a = task.result) == null ? void 0 : _a.retryCount) && task.result.retryCount > 0)
9141
- suffix += c.yellow(` (retry x${task.result.retryCount})`);
9142
- if (task.type === "suite" && !((_b = task.meta) == null ? void 0 : _b.typecheck)) {
9143
- const tests = getTests(task);
9144
- suffix += c.dim(` (${tests.length})`);
9145
- }
9146
- if (task.mode === "skip" || task.mode === "todo")
9147
- suffix += ` ${c.dim(c.gray("[skipped]"))}`;
9148
- if (task.type === "test" && ((_c = task.result) == null ? void 0 : _c.repeatCount) && task.result.repeatCount > 0)
9149
- suffix += c.yellow(` (repeat x${task.result.repeatCount})`);
9150
- if (((_d = task.result) == null ? void 0 : _d.duration) != null) {
9151
- if (task.result.duration > DURATION_LONG$1)
9152
- suffix += c.yellow(` ${Math.round(task.result.duration)}${c.dim("ms")}`);
9153
- }
9154
- if (options.showHeap && ((_e = task.result) == null ? void 0 : _e.heap) != null)
9155
- suffix += c.magenta(` ${Math.floor(task.result.heap / 1024 / 1024)} MB heap used`);
9156
- let name = task.name;
9157
- if (level === 0)
9158
- name = formatFilepath$1(name);
9159
- const padding = " ".repeat(level);
9160
- const body = ((_f = task.meta) == null ? void 0 : _f.benchmark) ? renderBenchmark$1(task, tasks) : name;
9161
- taskOutput.push(padding + prefix + body + suffix);
9162
- if (((_g = task.result) == null ? void 0 : _g.state) !== "pass" && outputMap$1.get(task) != null) {
9163
- let data = outputMap$1.get(task);
9164
- if (typeof data === "string") {
9165
- data = stripAnsi(data.trim().split("\n").filter(Boolean).pop());
9166
- if (data === "")
9167
- data = void 0;
9168
- }
9169
- if (data != null) {
9170
- const out = `${" ".repeat(level)}${F_RIGHT} ${data}`;
9171
- taskOutput.push(` ${c.gray(cliTruncate(out, getCols(-3)))}`);
9172
- }
9173
- }
9174
- taskOutput.push(renderHookState(task, "beforeAll", level + 1));
9175
- taskOutput.push(renderHookState(task, "beforeEach", level + 1));
9176
- if (task.type === "suite" && task.tasks.length > 0) {
9177
- if (((_h = task.result) == null ? void 0 : _h.state) === "fail" || ((_i = task.result) == null ? void 0 : _i.state) === "run" || options.renderSucceed) {
9178
- if (options.logger.ctx.config.hideSkippedTests) {
9179
- const filteredTasks = task.tasks.filter((t) => t.mode !== "skip" && t.mode !== "todo");
9180
- taskOutput.push(renderTree$1(filteredTasks, options, level + 1, maxRows));
9181
- } else {
9182
- taskOutput.push(renderTree$1(task.tasks, options, level + 1, maxRows));
9183
- }
9184
- }
9185
- }
9186
- taskOutput.push(renderHookState(task, "afterAll", level + 1));
9187
- taskOutput.push(renderHookState(task, "afterEach", level + 1));
9188
- const rows = taskOutput.filter(Boolean);
9189
- output.push(rows.join("\n"));
9190
- currentRowCount += rows.length;
9191
- if (maxRows && currentRowCount >= maxRows)
9192
- break;
9193
- }
9194
- return output.reverse().join("\n");
9195
- }
9196
- function createListRenderer(_tasks, options) {
9197
- let tasks = _tasks;
9198
- let timer;
9199
- const log = options.logger.logUpdate;
9200
- function update() {
9201
- if (options.logger.ctx.config.hideSkippedTests) {
9202
- const filteredTasks = tasks.filter((t) => t.mode !== "skip" && t.mode !== "todo");
9203
- log(renderTree$1(
9204
- filteredTasks,
9205
- options,
9206
- 0,
9207
- // log-update already limits the amount of printed rows to fit the current terminal
9208
- // but we can optimize performance by doing it ourselves
9209
- process.stdout.rows
9210
- ));
9211
- } else {
9212
- log(renderTree$1(
9213
- tasks,
9214
- options,
9215
- 0,
9216
- // log-update already limits the amount of printed rows to fit the current terminal
9217
- // but we can optimize performance by doing it ourselves
9218
- process.stdout.rows
9219
- ));
9220
- }
9221
- }
9222
- return {
9223
- start() {
9224
- if (timer)
9225
- return this;
9226
- timer = setInterval(update, 16);
9227
- return this;
9228
- },
9229
- update(_tasks2) {
9230
- tasks = _tasks2;
9231
- return this;
9232
- },
9233
- async stop() {
9234
- if (timer) {
9235
- clearInterval(timer);
9236
- timer = void 0;
9237
- }
9238
- log.clear();
9239
- if (options.logger.ctx.config.hideSkippedTests) {
9240
- const filteredTasks = tasks.filter((t) => t.mode !== "skip" && t.mode !== "todo");
9241
- options.logger.log(renderTree$1(filteredTasks, options));
9242
- } else {
9243
- options.logger.log(renderTree$1(tasks, options));
9244
- }
9245
- return this;
9246
- },
9247
- clear() {
9248
- log.clear();
9249
- }
9250
- };
9251
- }
9252
-
9253
- class DefaultReporter extends BaseReporter {
9254
- renderer;
9255
- rendererOptions = {};
9256
- renderSucceedDefault;
9257
- onPathsCollected(paths = []) {
9258
- if (this.isTTY) {
9259
- if (this.renderSucceedDefault === void 0)
9260
- this.renderSucceedDefault = !!this.rendererOptions.renderSucceed;
9261
- if (this.renderSucceedDefault !== true)
9262
- this.rendererOptions.renderSucceed = paths.length <= 1;
9263
- }
9264
- }
9265
- async onTestRemoved(trigger) {
9266
- await this.stopListRender();
9267
- this.ctx.logger.clearScreen(c.yellow("Test removed...") + (trigger ? c.dim(` [ ${this.relative(trigger)} ]
9268
- `) : ""), true);
9269
- const files = this.ctx.state.getFiles(this.watchFilters);
9270
- createListRenderer(files, this.rendererOptions).stop();
9271
- this.ctx.logger.log();
9272
- await super.reportSummary(files, this.ctx.state.getUnhandledErrors());
9273
- super.onWatcherStart();
9274
- }
9275
- onCollected() {
9276
- if (this.isTTY) {
9277
- this.rendererOptions.logger = this.ctx.logger;
9278
- this.rendererOptions.showHeap = this.ctx.config.logHeapUsage;
9279
- this.rendererOptions.mode = this.mode;
9280
- const files = this.ctx.state.getFiles(this.watchFilters);
9281
- if (!this.renderer)
9282
- this.renderer = createListRenderer(files, this.rendererOptions).start();
9283
- else
9284
- this.renderer.update(files);
9285
- }
9286
- }
9287
- async onFinished(files = this.ctx.state.getFiles(), errors = this.ctx.state.getUnhandledErrors()) {
9288
- await this.stopListRender();
9289
- this.ctx.logger.log();
9290
- await super.onFinished(files, errors);
9291
- }
9292
- async onWatcherStart(files = this.ctx.state.getFiles(), errors = this.ctx.state.getUnhandledErrors()) {
9293
- await this.stopListRender();
9294
- await super.onWatcherStart(files, errors);
9295
- }
9296
- async stopListRender() {
9297
- var _a;
9298
- await ((_a = this.renderer) == null ? void 0 : _a.stop());
9299
- this.renderer = void 0;
9300
- }
9301
- async onWatcherRerun(files, trigger) {
9302
- await this.stopListRender();
9303
- await super.onWatcherRerun(files, trigger);
9304
- }
9305
- onUserConsoleLog(log) {
9306
- var _a;
9307
- if (!this.shouldLog(log))
9308
- return;
9309
- (_a = this.renderer) == null ? void 0 : _a.clear();
9310
- super.onUserConsoleLog(log);
9311
- }
9312
- }
9313
-
9314
- const check = { char: "\xB7", color: c.green };
9315
- const cross = { char: "x", color: c.red };
9316
- const pending = { char: "*", color: c.yellow };
9317
- const skip = { char: "-", color: (char) => c.dim(c.gray(char)) };
9318
- function getIcon(task) {
9319
- var _a;
9320
- if (task.mode === "skip" || task.mode === "todo")
9321
- return skip;
9322
- switch ((_a = task.result) == null ? void 0 : _a.state) {
9323
- case "pass":
9324
- return check;
9325
- case "fail":
9326
- return cross;
9327
- default:
9328
- return pending;
9329
- }
9330
- }
9331
- function render(tasks, width) {
9332
- const all = getTests(tasks);
9333
- let currentIcon = pending;
9334
- let currentTasks = 0;
9335
- let previousLineWidth = 0;
9336
- let output = "";
9337
- const addOutput = () => {
9338
- const { char, color } = currentIcon;
9339
- const availableWidth = width - previousLineWidth;
9340
- if (availableWidth > currentTasks) {
9341
- output += color(char.repeat(currentTasks));
9342
- previousLineWidth += currentTasks;
9343
- } else {
9344
- let buf = `${char.repeat(availableWidth)}
9345
- `;
9346
- const remaining = currentTasks - availableWidth;
9347
- const fullRows = Math.floor(remaining / width);
9348
- buf += `${char.repeat(width)}
9349
- `.repeat(fullRows);
9350
- const partialRow = remaining % width;
9351
- if (partialRow > 0) {
9352
- buf += char.repeat(partialRow);
9353
- previousLineWidth = partialRow;
9354
- } else {
9355
- previousLineWidth = 0;
9356
- }
9357
- output += color(buf);
9358
- }
9359
- };
9360
- for (const task of all) {
9361
- const icon = getIcon(task);
9362
- if (icon === currentIcon) {
9363
- currentTasks++;
9364
- continue;
9365
- }
9366
- addOutput();
9367
- currentTasks = 1;
9368
- currentIcon = icon;
9369
- }
9370
- addOutput();
9371
- return output;
9372
- }
9373
- function createDotRenderer(_tasks, options) {
9374
- let tasks = _tasks;
9375
- let timer;
9376
- const { logUpdate: log, outputStream } = options.logger;
9377
- function update() {
9378
- log(render(tasks, outputStream.columns));
9379
- }
9380
- return {
9381
- start() {
9382
- if (timer)
9383
- return this;
9384
- timer = setInterval(update, 16);
9385
- return this;
9386
- },
9387
- update(_tasks2) {
9388
- tasks = _tasks2;
9389
- return this;
9390
- },
9391
- async stop() {
9392
- if (timer) {
9393
- clearInterval(timer);
9394
- timer = void 0;
9395
- }
9396
- log.clear();
9397
- options.logger.log(render(tasks, outputStream.columns));
9398
- return this;
9399
- },
9400
- clear() {
9401
- log.clear();
9402
- }
9403
- };
9404
- }
9405
-
9406
- class DotReporter extends BaseReporter {
9407
- renderer;
9408
- onCollected() {
9409
- if (this.isTTY) {
9410
- const files = this.ctx.state.getFiles(this.watchFilters);
9411
- if (!this.renderer)
9412
- this.renderer = createDotRenderer(files, { logger: this.ctx.logger }).start();
9413
- else
9414
- this.renderer.update(files);
9415
- }
9416
- }
9417
- async onFinished(files = this.ctx.state.getFiles(), errors = this.ctx.state.getUnhandledErrors()) {
9418
- await this.stopListRender();
9419
- this.ctx.logger.log();
9420
- await super.onFinished(files, errors);
9421
- }
9422
- async onWatcherStart() {
9423
- await this.stopListRender();
9424
- super.onWatcherStart();
9425
- }
9426
- async stopListRender() {
9427
- var _a;
9428
- (_a = this.renderer) == null ? void 0 : _a.stop();
9429
- this.renderer = void 0;
9430
- await new Promise((resolve) => setTimeout(resolve, 10));
9431
- }
9432
- async onWatcherRerun(files, trigger) {
9433
- await this.stopListRender();
9434
- await super.onWatcherRerun(files, trigger);
9435
- }
9436
- onUserConsoleLog(log) {
9437
- var _a;
9438
- (_a = this.renderer) == null ? void 0 : _a.clear();
9439
- super.onUserConsoleLog(log);
9440
- }
9441
- }
9442
-
9443
- function getOutputFile(config, reporter) {
9444
- if (!(config == null ? void 0 : config.outputFile))
9445
- return;
9446
- if (typeof config.outputFile === "string")
9447
- return config.outputFile;
9448
- return config.outputFile[reporter];
9449
- }
9450
-
9451
- const StatusMap = {
9452
- fail: "failed",
9453
- only: "pending",
9454
- pass: "passed",
9455
- run: "pending",
9456
- skip: "skipped",
9457
- todo: "todo"
9458
- };
9459
- let JsonReporter$1 = class JsonReporter {
9460
- start = 0;
9461
- ctx;
9462
- onInit(ctx) {
9463
- this.ctx = ctx;
9464
- this.start = Date.now();
9465
- }
9466
- async logTasks(files) {
9467
- var _a, _b, _c;
9468
- const suites = getSuites(files);
9469
- const numTotalTestSuites = suites.length;
9470
- const tests = getTests(files);
9471
- const numTotalTests = tests.length;
9472
- const numFailedTestSuites = suites.filter((s) => {
9473
- var _a2;
9474
- return (_a2 = s.result) == null ? void 0 : _a2.errors;
9475
- }).length;
9476
- const numPassedTestSuites = numTotalTestSuites - numFailedTestSuites;
9477
- const numPendingTestSuites = suites.filter((s) => {
9478
- var _a2;
9479
- return ((_a2 = s.result) == null ? void 0 : _a2.state) === "run";
9480
- }).length;
9481
- const numFailedTests = tests.filter((t) => {
9482
- var _a2;
9483
- return ((_a2 = t.result) == null ? void 0 : _a2.state) === "fail";
9484
- }).length;
9485
- const numPassedTests = numTotalTests - numFailedTests;
9486
- const numPendingTests = tests.filter((t) => {
9487
- var _a2;
9488
- return ((_a2 = t.result) == null ? void 0 : _a2.state) === "run";
9489
- }).length;
9490
- const numTodoTests = tests.filter((t) => t.mode === "todo").length;
9491
- const testResults = [];
9492
- const success = numFailedTestSuites === 0 && numFailedTests === 0;
9493
- for (const file of files) {
9494
- const tests2 = getTests([file]);
9495
- let startTime = tests2.reduce((prev, next) => {
9496
- var _a2;
9497
- return Math.min(prev, ((_a2 = next.result) == null ? void 0 : _a2.startTime) ?? Number.POSITIVE_INFINITY);
9498
- }, Number.POSITIVE_INFINITY);
9499
- if (startTime === Number.POSITIVE_INFINITY)
9500
- startTime = this.start;
9501
- const endTime = tests2.reduce((prev, next) => {
9502
- var _a2, _b2;
9503
- return Math.max(prev, (((_a2 = next.result) == null ? void 0 : _a2.startTime) ?? 0) + (((_b2 = next.result) == null ? void 0 : _b2.duration) ?? 0));
9504
- }, startTime);
9505
- const assertionResults = await Promise.all(tests2.map(async (t) => {
9506
- var _a2, _b2, _c2, _d;
9507
- const ancestorTitles = [];
9508
- let iter = t.suite;
9509
- while (iter) {
9510
- ancestorTitles.push(iter.name);
9511
- iter = iter.suite;
9512
- }
9513
- ancestorTitles.reverse();
9514
- return {
9515
- ancestorTitles,
9516
- fullName: ancestorTitles.length > 0 ? `${ancestorTitles.join(" ")} ${t.name}` : t.name,
9517
- status: StatusMap[((_a2 = t.result) == null ? void 0 : _a2.state) || t.mode] || "skipped",
9518
- title: t.name,
9519
- duration: (_b2 = t.result) == null ? void 0 : _b2.duration,
9520
- failureMessages: ((_d = (_c2 = t.result) == null ? void 0 : _c2.errors) == null ? void 0 : _d.map((e) => e.message)) || [],
9521
- location: await this.getFailureLocation(t)
9522
- };
9523
- }));
9524
- if (tests2.some((t) => {
9525
- var _a2;
9526
- return ((_a2 = t.result) == null ? void 0 : _a2.state) === "run";
9527
- })) {
9528
- this.ctx.logger.warn("WARNING: Some tests are still running when generating the JSON report.This is likely an internal bug in Vitest.Please report it to https://github.com/vitest-dev/vitest/issues");
9529
- }
9530
- testResults.push({
9531
- assertionResults,
9532
- startTime,
9533
- endTime,
9534
- status: tests2.some((t) => {
9535
- var _a2;
9536
- return ((_a2 = t.result) == null ? void 0 : _a2.state) === "fail";
9537
- }) ? "failed" : "passed",
9538
- message: ((_c = (_b = (_a = file.result) == null ? void 0 : _a.errors) == null ? void 0 : _b[0]) == null ? void 0 : _c.message) ?? "",
9539
- name: file.filepath
9540
- });
9541
- }
9542
- const result = {
9543
- numTotalTestSuites,
9544
- numPassedTestSuites,
9545
- numFailedTestSuites,
9546
- numPendingTestSuites,
9547
- numTotalTests,
9548
- numPassedTests,
9549
- numFailedTests,
9550
- numPendingTests,
9551
- numTodoTests,
9552
- startTime: this.start,
9553
- success,
9554
- testResults
9555
- };
9556
- await this.writeReport(JSON.stringify(result, null, 2));
9557
- }
9558
- async onFinished(files = this.ctx.state.getFiles()) {
9559
- await this.logTasks(files);
9560
- }
9561
- /**
9562
- * Writes the report to an output file if specified in the config,
9563
- * or logs it to the console otherwise.
9564
- * @param report
9565
- */
9566
- async writeReport(report) {
9567
- const outputFile = getOutputFile(this.ctx.config, "json");
9568
- if (outputFile) {
9569
- const reportFile = resolve(this.ctx.config.root, outputFile);
9570
- const outputDirectory = dirname(reportFile);
9571
- if (!existsSync(outputDirectory))
9572
- await promises.mkdir(outputDirectory, { recursive: true });
9573
- await promises.writeFile(reportFile, report, "utf-8");
9574
- this.ctx.logger.log(`JSON report written to ${reportFile}`);
9575
- } else {
9576
- this.ctx.logger.log(report);
9577
- }
9578
- }
9579
- async getFailureLocation(test) {
9580
- var _a, _b;
9581
- const error = (_b = (_a = test.result) == null ? void 0 : _a.errors) == null ? void 0 : _b[0];
9582
- if (!error)
9583
- return;
9584
- const project = this.ctx.getProjectByTaskId(test.id);
9585
- const stack = parseErrorStacktrace(error, {
9586
- getSourceMap: (file) => project.getBrowserSourceMapModuleById(file)
9587
- });
9588
- const frame = stack[0];
9589
- if (!frame)
9590
- return;
9591
- return { line: frame.line, column: frame.column };
9592
- }
9593
- };
9594
-
9595
- class VerboseReporter extends DefaultReporter {
9596
- constructor() {
9597
- super();
9598
- this.rendererOptions.renderSucceed = true;
9599
- }
9600
- onTaskUpdate(packs) {
9601
- var _a, _b, _c, _d;
9602
- if (this.isTTY)
9603
- return;
9604
- for (const pack of packs) {
9605
- const task = this.ctx.state.idMap.get(pack[0]);
9606
- if (task && task.type === "test" && ((_a = task.result) == null ? void 0 : _a.state) && ((_b = task.result) == null ? void 0 : _b.state) !== "run") {
9607
- let title = ` ${getStateSymbol(task)} `;
9608
- if ((_c = task.suite) == null ? void 0 : _c.projectName)
9609
- title += formatProjectName(task.suite.projectName);
9610
- title += getFullName(task, c.dim(" > "));
9611
- if (this.ctx.config.logHeapUsage && task.result.heap != null)
9612
- title += c.magenta(` ${Math.floor(task.result.heap / 1024 / 1024)} MB heap used`);
9613
- this.ctx.logger.log(title);
9614
- if (task.result.state === "fail") {
9615
- (_d = task.result.errors) == null ? void 0 : _d.forEach((error) => {
9616
- this.ctx.logger.log(c.red(` ${F_RIGHT} ${error == null ? void 0 : error.message}`));
9617
- });
9618
- }
9619
- }
9620
- }
9621
- }
9622
- }
9623
-
9624
- class IndentedLogger {
9625
- constructor(baseLog) {
9626
- this.baseLog = baseLog;
9627
- }
9628
- currentIndent = "";
9629
- indent() {
9630
- this.currentIndent += " ";
9631
- }
9632
- unindent() {
9633
- this.currentIndent = this.currentIndent.substring(0, this.currentIndent.length - 4);
9634
- }
9635
- log(text) {
9636
- return this.baseLog(this.currentIndent + text);
9637
- }
9638
- }
9639
-
9640
- function yamlString(str) {
9641
- return `"${str.replace(/"/g, '\\"')}"`;
9642
- }
9643
- function tapString(str) {
9644
- return str.replace(/\\/g, "\\\\").replace(/#/g, "\\#").replace(/\n/g, " ");
9645
- }
9646
- class TapReporter {
9647
- ctx;
9648
- logger;
9649
- onInit(ctx) {
9650
- this.ctx = ctx;
9651
- this.logger = new IndentedLogger(ctx.logger.log.bind(ctx.logger));
9652
- }
9653
- static getComment(task) {
9654
- var _a;
9655
- if (task.mode === "skip")
9656
- return " # SKIP";
9657
- else if (task.mode === "todo")
9658
- return " # TODO";
9659
- else if (((_a = task.result) == null ? void 0 : _a.duration) != null)
9660
- return ` # time=${task.result.duration.toFixed(2)}ms`;
9661
- else
9662
- return "";
9663
- }
9664
- logErrorDetails(error, stack) {
9665
- this.logger.log(`name: ${yamlString(error.name)}`);
9666
- this.logger.log(`message: ${yamlString(error.message)}`);
9667
- if (stack) {
9668
- this.logger.log(`stack: ${yamlString(`${stack.file}:${stack.line}:${stack.column}`)}`);
9669
- }
9670
- }
9671
- logTasks(tasks) {
9672
- var _a, _b;
9673
- this.logger.log(`1..${tasks.length}`);
9674
- for (const [i, task] of tasks.entries()) {
9675
- const id = i + 1;
9676
- const ok = ((_a = task.result) == null ? void 0 : _a.state) === "pass" || task.mode === "skip" || task.mode === "todo" ? "ok" : "not ok";
9677
- const comment = TapReporter.getComment(task);
9678
- if (task.type === "suite" && task.tasks.length > 0) {
9679
- this.logger.log(`${ok} ${id} - ${tapString(task.name)}${comment} {`);
9680
- this.logger.indent();
9681
- this.logTasks(task.tasks);
9682
- this.logger.unindent();
9683
- this.logger.log("}");
9684
- } else {
9685
- this.logger.log(`${ok} ${id} - ${tapString(task.name)}${comment}`);
9686
- const project = this.ctx.getProjectByTaskId(task.id);
9687
- if (((_b = task.result) == null ? void 0 : _b.state) === "fail" && task.result.errors) {
9688
- this.logger.indent();
9689
- task.result.errors.forEach((error) => {
9690
- const stacks = parseErrorStacktrace(error, {
9691
- getSourceMap: (file) => project.getBrowserSourceMapModuleById(file)
9692
- });
9693
- const stack = stacks[0];
9694
- this.logger.log("---");
9695
- this.logger.log("error:");
9696
- this.logger.indent();
9697
- this.logErrorDetails(error);
9698
- this.logger.unindent();
9699
- if (stack)
9700
- this.logger.log(`at: ${yamlString(`${stack.file}:${stack.line}:${stack.column}`)}`);
9701
- if (error.showDiff) {
9702
- this.logger.log(`actual: ${yamlString(error.actual)}`);
9703
- this.logger.log(`expected: ${yamlString(error.expected)}`);
9704
- }
9705
- });
9706
- this.logger.log("...");
9707
- this.logger.unindent();
9708
- }
9709
- }
9710
- }
9711
- }
9712
- async onFinished(files = this.ctx.state.getFiles()) {
9713
- this.logger.log("TAP version 13");
9714
- this.logTasks(files);
9715
- }
9716
- }
9717
-
9718
- function flattenTasks$1(task, baseName = "") {
9719
- const base = baseName ? `${baseName} > ` : "";
9720
- if (task.type === "suite") {
9721
- return task.tasks.flatMap((child) => flattenTasks$1(child, `${base}${task.name}`));
9722
- } else {
9723
- return [{
9724
- ...task,
9725
- name: `${base}${task.name}`
9726
- }];
9727
- }
9728
- }
9729
- function removeInvalidXMLCharacters(value, removeDiscouragedChars) {
9730
- let regex = /((?:[\0-\x08\x0B\f\x0E-\x1F\uFFFD\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]))/g;
9731
- value = String(value || "").replace(regex, "");
9732
- if (removeDiscouragedChars) {
9733
- regex = new RegExp(
9734
- "([\\x7F-\\x84]|[\\x86-\\x9F]|[\\uFDD0-\\uFDEF]|(?:\\uD83F[\\uDFFE\\uDFFF])|(?:\\uD87F[\\uDFFE\\uDFFF])|(?:\\uD8BF[\\uDFFE\\uDFFF])|(?:\\uD8FF[\\uDFFE\\uDFFF])|(?:\\uD93F[\\uDFFE\\uDFFF])|(?:\\uD97F[\\uDFFE\\uDFFF])|(?:\\uD9BF[\\uDFFE\\uDFFF])|(?:\\uD9FF[\\uDFFE\\uDFFF])|(?:\\uDA3F[\\uDFFE\\uDFFF])|(?:\\uDA7F[\\uDFFE\\uDFFF])|(?:\\uDABF[\\uDFFE\\uDFFF])|(?:\\uDAFF[\\uDFFE\\uDFFF])|(?:\\uDB3F[\\uDFFE\\uDFFF])|(?:\\uDB7F[\\uDFFE\\uDFFF])|(?:\\uDBBF[\\uDFFE\\uDFFF])|(?:\\uDBFF[\\uDFFE\\uDFFF])(?:[\\0-\\t\\x0B\\f\\x0E-\\u2027\\u202A-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]))",
9735
- "g"
9736
- );
9737
- value = value.replace(regex, "");
9738
- }
9739
- return value;
9740
- }
9741
- function escapeXML(value) {
9742
- return removeInvalidXMLCharacters(
9743
- String(value).replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/'/g, "&apos;").replace(/</g, "&lt;").replace(/>/g, "&gt;"),
9744
- true
9745
- );
9746
- }
9747
- function executionTime(durationMS) {
9748
- return (durationMS / 1e3).toLocaleString("en-US", { useGrouping: false, maximumFractionDigits: 10 });
9749
- }
9750
- function getDuration(task) {
9751
- var _a;
9752
- const duration = ((_a = task.result) == null ? void 0 : _a.duration) ?? 0;
9753
- return executionTime(duration);
9754
- }
9755
- class JUnitReporter {
9756
- ctx;
9757
- reportFile;
9758
- baseLog;
9759
- logger;
9760
- _timeStart = /* @__PURE__ */ new Date();
9761
- fileFd;
9762
- async onInit(ctx) {
9763
- this.ctx = ctx;
9764
- const outputFile = getOutputFile(this.ctx.config, "junit");
9765
- if (outputFile) {
9766
- this.reportFile = resolve(this.ctx.config.root, outputFile);
9767
- const outputDirectory = dirname(this.reportFile);
9768
- if (!existsSync(outputDirectory))
9769
- await promises.mkdir(outputDirectory, { recursive: true });
9770
- const fileFd = await promises.open(this.reportFile, "w+");
9771
- this.fileFd = fileFd;
9772
- this.baseLog = async (text) => {
9773
- if (!this.fileFd)
9774
- this.fileFd = await promises.open(this.reportFile, "w+");
9775
- await promises.writeFile(this.fileFd, `${text}
9776
- `);
9777
- };
9778
- } else {
9779
- this.baseLog = async (text) => this.ctx.logger.log(text);
9780
- }
9781
- this._timeStart = /* @__PURE__ */ new Date();
9782
- this.logger = new IndentedLogger(this.baseLog);
9783
- }
9784
- async writeElement(name, attrs, children) {
9785
- const pairs = [];
9786
- for (const key in attrs) {
9787
- const attr = attrs[key];
9788
- if (attr === void 0)
9789
- continue;
9790
- pairs.push(`${key}="${escapeXML(attr)}"`);
9791
- }
9792
- await this.logger.log(`<${name}${pairs.length ? ` ${pairs.join(" ")}` : ""}>`);
9793
- this.logger.indent();
9794
- await children.call(this);
9795
- this.logger.unindent();
9796
- await this.logger.log(`</${name}>`);
9797
- }
9798
- async writeErrorDetails(task, error) {
9799
- const errorName = error.name ?? error.nameStr ?? "Unknown Error";
9800
- const errorDetails = `${errorName}: ${error.message}`;
9801
- await this.baseLog(escapeXML(errorDetails));
9802
- const project = this.ctx.getProjectByTaskId(task.id);
9803
- const stack = parseErrorStacktrace(error, {
9804
- getSourceMap: (file) => project.getBrowserSourceMapModuleById(file)
9805
- });
9806
- for (const frame of stack) {
9807
- const path = relative(this.ctx.config.root, frame.file);
9808
- await this.baseLog(escapeXML(` ${F_POINTER} ${[frame.method, `${path}:${frame.line}:${frame.column}`].filter(Boolean).join(" ")}`));
9809
- if (frame.file in this.ctx.state.filesMap)
9810
- break;
9811
- }
9812
- }
9813
- async writeLogs(task, type) {
9814
- if (task.logs == null || task.logs.length === 0)
9815
- return;
9816
- const logType = type === "err" ? "stderr" : "stdout";
9817
- const logs = task.logs.filter((log) => log.type === logType);
9818
- if (logs.length === 0)
9819
- return;
9820
- await this.writeElement(`system-${type}`, {}, async () => {
9821
- for (const log of logs)
9822
- await this.baseLog(escapeXML(log.content));
9823
- });
9824
- }
9825
- async writeTasks(tasks, filename) {
9826
- for (const task of tasks) {
9827
- await this.writeElement("testcase", {
9828
- classname: process.env.VITEST_JUNIT_CLASSNAME ?? filename,
9829
- name: task.name,
9830
- time: getDuration(task)
9831
- }, async () => {
9832
- var _a, _b;
9833
- await this.writeLogs(task, "out");
9834
- await this.writeLogs(task, "err");
9835
- if (task.mode === "skip" || task.mode === "todo")
9836
- await this.logger.log("<skipped/>");
9837
- if (((_a = task.result) == null ? void 0 : _a.state) === "fail") {
9838
- const errors = ((_b = task.result.errors) == null ? void 0 : _b.length) ? task.result.errors : [task.result.error];
9839
- for (const error of errors) {
9840
- await this.writeElement("failure", {
9841
- message: error == null ? void 0 : error.message,
9842
- type: (error == null ? void 0 : error.name) ?? (error == null ? void 0 : error.nameStr)
9843
- }, async () => {
9844
- if (!error)
9845
- return;
9846
- await this.writeErrorDetails(task, error);
9847
- });
9848
- }
9849
- }
9850
- });
9851
- }
9852
- }
9853
- async onFinished(files = this.ctx.state.getFiles()) {
9854
- var _a;
9855
- await this.logger.log('<?xml version="1.0" encoding="UTF-8" ?>');
9856
- const transformed = files.map((file) => {
9857
- const tasks = file.tasks.flatMap((task) => flattenTasks$1(task));
9858
- const stats2 = tasks.reduce(
9859
- (stats3, task) => {
9860
- var _a2, _b;
9861
- return {
9862
- passed: stats3.passed + Number(((_a2 = task.result) == null ? void 0 : _a2.state) === "pass"),
9863
- failures: stats3.failures + Number(((_b = task.result) == null ? void 0 : _b.state) === "fail"),
9864
- skipped: stats3.skipped + Number(task.mode === "skip" || task.mode === "todo")
9865
- };
9866
- },
9867
- {
9868
- passed: 0,
9869
- failures: 0,
9870
- skipped: 0
9871
- }
9872
- );
9873
- return {
9874
- ...file,
9875
- tasks,
9876
- stats: stats2
9877
- };
9878
- });
9879
- const stats = transformed.reduce((stats2, file) => {
9880
- stats2.tests += file.tasks.length;
9881
- stats2.failures += file.stats.failures;
9882
- return stats2;
9883
- }, {
9884
- name: process.env.VITEST_JUNIT_SUITE_NAME || "vitest tests",
9885
- tests: 0,
9886
- failures: 0,
9887
- errors: 0,
9888
- // we cannot detect those
9889
- time: executionTime((/* @__PURE__ */ new Date()).getTime() - this._timeStart.getTime())
9890
- });
9891
- await this.writeElement("testsuites", stats, async () => {
9892
- for (const file of transformed) {
9893
- await this.writeElement("testsuite", {
9894
- name: file.name,
9895
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
9896
- hostname: hostname(),
9897
- tests: file.tasks.length,
9898
- failures: file.stats.failures,
9899
- errors: 0,
9900
- // An errored test is one that had an unanticipated problem. We cannot detect those.
9901
- skipped: file.stats.skipped,
9902
- time: getDuration(file)
9903
- }, async () => {
9904
- await this.writeTasks(file.tasks, file.name);
9905
- });
9906
- }
9907
- });
9908
- if (this.reportFile)
9909
- this.ctx.logger.log(`JUNIT report written to ${this.reportFile}`);
9910
- await ((_a = this.fileFd) == null ? void 0 : _a.close());
9911
- this.fileFd = void 0;
9912
- }
9913
- }
9914
-
9915
- function flattenTasks(task, baseName = "") {
9916
- const base = baseName ? `${baseName} > ` : "";
9917
- if (task.type === "suite" && task.tasks.length > 0) {
9918
- return task.tasks.flatMap((child) => flattenTasks(child, `${base}${task.name}`));
9919
- } else {
9920
- return [{
9921
- ...task,
9922
- name: `${base}${task.name}`
9923
- }];
9924
- }
9925
- }
9926
- class TapFlatReporter extends TapReporter {
9927
- onInit(ctx) {
9928
- super.onInit(ctx);
9929
- }
9930
- async onFinished(files = this.ctx.state.getFiles()) {
9931
- this.ctx.logger.log("TAP version 13");
9932
- const flatTasks = files.flatMap((task) => flattenTasks(task));
9933
- this.logTasks(flatTasks);
9934
- }
9935
- }
9936
-
9937
- class HangingProcessReporter {
9938
- whyRunning;
9939
- onInit() {
9940
- const _require = createRequire(import.meta.url);
9941
- this.whyRunning = _require("why-is-node-running");
9942
- }
9943
- onProcessTimeout() {
9944
- var _a;
9945
- (_a = this.whyRunning) == null ? void 0 : _a.call(this);
9946
- }
9947
- }
9948
-
9949
- class JsonReporter {
9950
- start = 0;
9951
- ctx;
9952
- onInit(ctx) {
9953
- this.ctx = ctx;
9954
- }
9955
- async logTasks(files) {
9956
- var _a;
9957
- const suites = getSuites(files);
9958
- const numTotalTestSuites = suites.length;
9959
- const tests = getTests(files);
9960
- const numTotalTests = tests.length;
9961
- const testResults = {};
9962
- const outputFile = getOutputFile(this.ctx.config.benchmark, "json");
9963
- for (const file of files) {
9964
- const tests2 = getTests([file]);
9965
- for (const test of tests2) {
9966
- const res = (_a = test.result) == null ? void 0 : _a.benchmark;
9967
- if (!res || test.mode === "skip")
9968
- continue;
9969
- if (!outputFile)
9970
- res.samples = "ignore on terminal";
9971
- testResults[test.suite.name] = (testResults[test.suite.name] || []).concat(res);
9972
- }
9973
- if (tests2.some((t) => {
9974
- var _a2;
9975
- return ((_a2 = t.result) == null ? void 0 : _a2.state) === "run";
9976
- })) {
9977
- this.ctx.logger.warn("WARNING: Some tests are still running when generating the json report.This is likely an internal bug in Vitest.Please report it to https://github.com/vitest-dev/vitest/issues");
9978
- }
9979
- }
9980
- const result = {
9981
- numTotalTestSuites,
9982
- numTotalTests,
9983
- testResults
9984
- };
9985
- await this.writeReport(JSON.stringify(result, null, 2));
9986
- }
9987
- async onFinished(files = this.ctx.state.getFiles()) {
9988
- await this.logTasks(files);
9989
- }
9990
- /**
9991
- * Writes the report to an output file if specified in the config,
9992
- * or logs it to the console otherwise.
9993
- * @param report
9994
- */
9995
- async writeReport(report) {
9996
- const outputFile = getOutputFile(this.ctx.config.benchmark, "json");
9997
- if (outputFile) {
9998
- const reportFile = resolve(this.ctx.config.root, outputFile);
9999
- const outputDirectory = dirname(reportFile);
10000
- if (!existsSync(outputDirectory))
10001
- await promises.mkdir(outputDirectory, { recursive: true });
10002
- await promises.writeFile(reportFile, report, "utf-8");
10003
- this.ctx.logger.log(`json report written to ${reportFile}`);
10004
- } else {
10005
- this.ctx.logger.log(report);
10006
- }
10007
- }
10008
- }
10009
-
10010
- const DURATION_LONG = 300;
10011
- const outputMap = /* @__PURE__ */ new WeakMap();
10012
- function formatFilepath(path) {
10013
- const lastSlash = Math.max(path.lastIndexOf("/") + 1, 0);
10014
- const basename = path.slice(lastSlash);
10015
- let firstDot = basename.indexOf(".");
10016
- if (firstDot < 0)
10017
- firstDot = basename.length;
10018
- firstDot += lastSlash;
10019
- return c.dim(path.slice(0, lastSlash)) + path.slice(lastSlash, firstDot) + c.dim(path.slice(firstDot));
10020
- }
10021
- function formatNumber(number) {
10022
- const res = String(number.toFixed(number < 100 ? 4 : 2)).split(".");
10023
- return res[0].replace(/(?=(?:\d{3})+$)(?!\b)/g, ",") + (res[1] ? `.${res[1]}` : "");
10024
- }
10025
- const tableHead = ["name", "hz", "min", "max", "mean", "p75", "p99", "p995", "p999", "rme", "samples"];
10026
- function renderTableHead(tasks) {
10027
- const benches = tasks.map((i) => {
10028
- var _a, _b;
10029
- return ((_a = i.meta) == null ? void 0 : _a.benchmark) ? (_b = i.result) == null ? void 0 : _b.benchmark : void 0;
10030
- }).filter(notNullish);
10031
- const allItems = benches.map(renderBenchmarkItems).concat([tableHead]);
10032
- return `${" ".repeat(3)}${tableHead.map((i, idx) => {
10033
- const width = Math.max(...allItems.map((i2) => i2[idx].length));
10034
- return idx ? i.padStart(width, " ") : i.padEnd(width, " ");
10035
- }).map(c.bold).join(" ")}`;
10036
- }
10037
- function renderBenchmarkItems(result) {
10038
- return [
10039
- result.name,
10040
- formatNumber(result.hz || 0),
10041
- formatNumber(result.min || 0),
10042
- formatNumber(result.max || 0),
10043
- formatNumber(result.mean || 0),
10044
- formatNumber(result.p75 || 0),
10045
- formatNumber(result.p99 || 0),
10046
- formatNumber(result.p995 || 0),
10047
- formatNumber(result.p999 || 0),
10048
- `\xB1${(result.rme || 0).toFixed(2)}%`,
10049
- result.samples.length.toString()
10050
- ];
10051
- }
10052
- function renderBenchmark(task, tasks) {
10053
- var _a;
10054
- const result = (_a = task.result) == null ? void 0 : _a.benchmark;
10055
- if (!result)
10056
- return task.name;
10057
- const benches = tasks.map((i) => {
10058
- var _a2, _b;
10059
- return ((_a2 = i.meta) == null ? void 0 : _a2.benchmark) ? (_b = i.result) == null ? void 0 : _b.benchmark : void 0;
10060
- }).filter(notNullish);
10061
- const allItems = benches.map(renderBenchmarkItems).concat([tableHead]);
10062
- const items = renderBenchmarkItems(result);
10063
- const padded = items.map((i, idx) => {
10064
- const width = Math.max(...allItems.map((i2) => i2[idx].length));
10065
- return idx ? i.padStart(width, " ") : i.padEnd(width, " ");
10066
- });
10067
- return [
10068
- padded[0],
10069
- // name
10070
- c.blue(padded[1]),
10071
- // hz
10072
- c.cyan(padded[2]),
10073
- // min
10074
- c.cyan(padded[3]),
10075
- // max
10076
- c.cyan(padded[4]),
10077
- // mean
10078
- c.cyan(padded[5]),
10079
- // p75
10080
- c.cyan(padded[6]),
10081
- // p99
10082
- c.cyan(padded[7]),
10083
- // p995
10084
- c.cyan(padded[8]),
10085
- // p999
10086
- c.dim(padded[9]),
10087
- // rem
10088
- c.dim(padded[10]),
10089
- // sample
10090
- result.rank === 1 ? c.bold(c.green(" fastest")) : result.rank === benches.length && benches.length > 2 ? c.bold(c.gray(" slowest")) : ""
10091
- ].join(" ");
10092
- }
10093
- function renderTree(tasks, options, level = 0) {
10094
- var _a, _b, _c, _d, _e, _f;
10095
- const output = [];
10096
- let idx = 0;
10097
- for (const task of tasks) {
10098
- const padding = " ".repeat(level ? 1 : 0);
10099
- let prefix = "";
10100
- if (idx === 0 && ((_a = task.meta) == null ? void 0 : _a.benchmark))
10101
- prefix += `${renderTableHead(tasks)}
10102
- ${padding}`;
10103
- prefix += ` ${getStateSymbol(task)} `;
10104
- let suffix = "";
10105
- if (task.type === "suite")
10106
- suffix += c.dim(` (${getTests(task).length})`);
10107
- if (task.mode === "skip" || task.mode === "todo")
10108
- suffix += ` ${c.dim(c.gray("[skipped]"))}`;
10109
- if (((_b = task.result) == null ? void 0 : _b.duration) != null) {
10110
- if (task.result.duration > DURATION_LONG)
10111
- suffix += c.yellow(` ${Math.round(task.result.duration)}${c.dim("ms")}`);
10112
- }
10113
- if (options.showHeap && ((_c = task.result) == null ? void 0 : _c.heap) != null)
10114
- suffix += c.magenta(` ${Math.floor(task.result.heap / 1024 / 1024)} MB heap used`);
10115
- let name = task.name;
10116
- if (level === 0)
10117
- name = formatFilepath(name);
10118
- const body = ((_d = task.meta) == null ? void 0 : _d.benchmark) ? renderBenchmark(task, tasks) : name;
10119
- output.push(padding + prefix + body + suffix);
10120
- if (((_e = task.result) == null ? void 0 : _e.state) !== "pass" && outputMap.get(task) != null) {
10121
- let data = outputMap.get(task);
10122
- if (typeof data === "string") {
10123
- data = stripAnsi(data.trim().split("\n").filter(Boolean).pop());
10124
- if (data === "")
10125
- data = void 0;
10126
- }
10127
- if (data != null) {
10128
- const out = `${" ".repeat(level)}${F_RIGHT} ${data}`;
10129
- output.push(` ${c.gray(cliTruncate(out, getCols(-3)))}`);
10130
- }
10131
- }
10132
- if (task.type === "suite" && task.tasks.length > 0) {
10133
- if ((_f = task.result) == null ? void 0 : _f.state)
10134
- output.push(renderTree(task.tasks, options, level + 1));
10135
- }
10136
- idx++;
10137
- }
10138
- return output.filter(Boolean).join("\n");
10139
- }
10140
- function createTableRenderer(_tasks, options) {
10141
- let tasks = _tasks;
10142
- let timer;
10143
- const log = options.logger.logUpdate;
10144
- function update() {
10145
- log(renderTree(tasks, options));
10146
- }
10147
- return {
10148
- start() {
10149
- if (timer)
10150
- return this;
10151
- timer = setInterval(update, 200);
10152
- return this;
10153
- },
10154
- update(_tasks2) {
10155
- tasks = _tasks2;
10156
- update();
10157
- return this;
10158
- },
10159
- async stop() {
10160
- if (timer) {
10161
- clearInterval(timer);
10162
- timer = void 0;
10163
- }
10164
- log.clear();
10165
- options.logger.log(renderTree(tasks, options));
10166
- return this;
10167
- },
10168
- clear() {
10169
- log.clear();
10170
- }
10171
- };
10172
- }
10173
-
10174
- class TableReporter extends BaseReporter {
10175
- renderer;
10176
- rendererOptions = {};
10177
- async onTestRemoved(trigger) {
10178
- await this.stopListRender();
10179
- this.ctx.logger.clearScreen(c.yellow("Test removed...") + (trigger ? c.dim(` [ ${this.relative(trigger)} ]
10180
- `) : ""), true);
10181
- const files = this.ctx.state.getFiles(this.watchFilters);
10182
- createTableRenderer(files, this.rendererOptions).stop();
10183
- this.ctx.logger.log();
10184
- await super.reportSummary(files, this.ctx.state.getUnhandledErrors());
10185
- super.onWatcherStart();
10186
- }
10187
- onCollected() {
10188
- if (this.isTTY) {
10189
- this.rendererOptions.logger = this.ctx.logger;
10190
- this.rendererOptions.showHeap = this.ctx.config.logHeapUsage;
10191
- const files = this.ctx.state.getFiles(this.watchFilters);
10192
- if (!this.renderer)
10193
- this.renderer = createTableRenderer(files, this.rendererOptions).start();
10194
- else
10195
- this.renderer.update(files);
10196
- }
10197
- }
10198
- async onFinished(files = this.ctx.state.getFiles(), errors = this.ctx.state.getUnhandledErrors()) {
10199
- await this.stopListRender();
10200
- this.ctx.logger.log();
10201
- await super.onFinished(files, errors);
10202
- }
10203
- async onWatcherStart() {
10204
- await this.stopListRender();
10205
- await super.onWatcherStart();
10206
- }
10207
- async stopListRender() {
10208
- var _a;
10209
- await ((_a = this.renderer) == null ? void 0 : _a.stop());
10210
- this.renderer = void 0;
10211
- }
10212
- async onWatcherRerun(files, trigger) {
10213
- await this.stopListRender();
10214
- await super.onWatcherRerun(files, trigger);
10215
- }
10216
- onUserConsoleLog(log) {
10217
- var _a;
10218
- if (!this.shouldLog(log))
10219
- return;
10220
- (_a = this.renderer) == null ? void 0 : _a.clear();
10221
- super.onUserConsoleLog(log);
10222
- }
10223
- }
10224
-
10225
- const BenchmarkReportsMap = {
10226
- default: TableReporter,
10227
- verbose: VerboseReporter,
10228
- json: JsonReporter
10229
- };
10230
-
10231
- const ReportersMap = {
10232
- "default": DefaultReporter,
10233
- "basic": BasicReporter,
10234
- "verbose": VerboseReporter,
10235
- "dot": DotReporter,
10236
- "json": JsonReporter$1,
10237
- "tap": TapReporter,
10238
- "tap-flat": TapFlatReporter,
10239
- "junit": JUnitReporter,
10240
- "hanging-process": HangingProcessReporter
10241
- };
10242
-
10243
7688
  async function loadCustomReporterModule(path, runner) {
10244
7689
  let customReporterModule;
10245
7690
  try {
@@ -10449,6 +7894,7 @@ const defaultCoverageExcludes = [
10449
7894
  "**/*{.,-}{test,spec}.?(c|m)[jt]s?(x)",
10450
7895
  "**/__tests__/**",
10451
7896
  "**/{karma,rollup,webpack,vite,vitest,jest,ava,babel,nyc,cypress,tsup,build}.config.*",
7897
+ "**/vitest.{workspace,projects}.[jt]s?(on)",
10452
7898
  "**/.{eslint,mocha,prettier}rc.{?(c|m)js,yml}"
10453
7899
  ];
10454
7900
  const coverageConfigDefaults = {
@@ -10460,7 +7906,8 @@ const coverageConfigDefaults = {
10460
7906
  exclude: defaultCoverageExcludes,
10461
7907
  reportOnFailure: false,
10462
7908
  reporter: [["text", {}], ["html", {}], ["clover", {}], ["json", {}]],
10463
- extension: [".js", ".cjs", ".mjs", ".ts", ".mts", ".cts", ".tsx", ".jsx", ".vue", ".svelte"]
7909
+ extension: [".js", ".cjs", ".mjs", ".ts", ".mts", ".cts", ".tsx", ".jsx", ".vue", ".svelte"],
7910
+ allowExternal: false
10464
7911
  };
10465
7912
  const fakeTimersDefaults = {
10466
7913
  loopLimit: 1e4,
@@ -10683,18 +8130,20 @@ class VitestCache {
10683
8130
  getFileStats(key) {
10684
8131
  return this.stats.getStats(key);
10685
8132
  }
10686
- static resolveCacheDir(root, dir) {
10687
- return resolve(root, slash$1(dir || "node_modules/.vitest"));
8133
+ static resolveCacheDir(root, dir, projectName) {
8134
+ const baseDir = slash$1(dir || "node_modules/.vitest");
8135
+ return projectName ? resolve(root, baseDir, crypto.createHash("md5").update(projectName, "utf-8").digest("hex")) : resolve(root, baseDir);
10688
8136
  }
10689
8137
  static async clearCache(options) {
10690
- var _a, _b;
8138
+ var _a, _b, _c;
10691
8139
  const root = resolve(options.root || process.cwd());
10692
8140
  const configPath = options.config === false ? false : options.config ? resolve(root, options.config) : await findUp(configFiles, { cwd: root });
10693
8141
  const config = configPath ? (_a = await loadConfigFromFile({ command: "serve", mode: "test" }, configPath)) == null ? void 0 : _a.config : void 0;
10694
8142
  const cache = (_b = config == null ? void 0 : config.test) == null ? void 0 : _b.cache;
8143
+ const projectName = (_c = config == null ? void 0 : config.test) == null ? void 0 : _c.name;
10695
8144
  if (cache === false)
10696
8145
  throw new Error("Cache is disabled");
10697
- const cachePath = VitestCache.resolveCacheDir(root, cache == null ? void 0 : cache.dir);
8146
+ const cachePath = VitestCache.resolveCacheDir(root, cache == null ? void 0 : cache.dir, projectName);
10698
8147
  let cleared = false;
10699
8148
  if (fs$8.existsSync(cachePath)) {
10700
8149
  fs$8.rmSync(cachePath, { recursive: true, force: true });
@@ -10785,13 +8234,15 @@ function resolveApiServerConfig(options) {
10785
8234
  }
10786
8235
  }
10787
8236
  if (api) {
10788
- if (!api.port)
8237
+ if (!api.port && !api.middlewareMode)
10789
8238
  api.port = defaultPort;
8239
+ } else {
8240
+ api = { middlewareMode: true };
10790
8241
  }
10791
8242
  return api;
10792
8243
  }
10793
8244
  function resolveConfig(mode, options, viteConfig) {
10794
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q;
8245
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v;
10795
8246
  if (options.dom) {
10796
8247
  if (((_a = viteConfig.test) == null ? void 0 : _a.environment) != null && viteConfig.test.environment !== "happy-dom") {
10797
8248
  console.warn(
@@ -10846,12 +8297,17 @@ function resolveConfig(mode, options, viteConfig) {
10846
8297
  });
10847
8298
  if (!resolved.deps.moduleDirectories.includes("/node_modules/"))
10848
8299
  resolved.deps.moduleDirectories.push("/node_modules/");
10849
- (_c = resolved.deps).web ?? (_c.web = {});
10850
- (_d = resolved.deps.web).transformAssets ?? (_d.transformAssets = true);
10851
- (_e = resolved.deps.web).transformCss ?? (_e.transformCss = true);
10852
- (_f = resolved.deps.web).transformGlobPattern ?? (_f.transformGlobPattern = []);
8300
+ (_c = resolved.deps).optimizer ?? (_c.optimizer = {});
8301
+ (_d = resolved.deps.optimizer).ssr ?? (_d.ssr = {});
8302
+ (_e = resolved.deps.optimizer.ssr).enabled ?? (_e.enabled = true);
8303
+ (_f = resolved.deps.optimizer).web ?? (_f.web = {});
8304
+ (_g = resolved.deps.optimizer.web).enabled ?? (_g.enabled = true);
8305
+ (_h = resolved.deps).web ?? (_h.web = {});
8306
+ (_i = resolved.deps.web).transformAssets ?? (_i.transformAssets = true);
8307
+ (_j = resolved.deps.web).transformCss ?? (_j.transformCss = true);
8308
+ (_k = resolved.deps.web).transformGlobPattern ?? (_k.transformGlobPattern = []);
10853
8309
  resolved.server ?? (resolved.server = {});
10854
- (_g = resolved.server).deps ?? (_g.deps = {});
8310
+ (_l = resolved.server).deps ?? (_l.deps = {});
10855
8311
  const deprecatedDepsOptions = ["inline", "external", "fallbackCJS"];
10856
8312
  deprecatedDepsOptions.forEach((option) => {
10857
8313
  if (resolved.deps[option] === void 0)
@@ -10874,11 +8330,11 @@ function resolveConfig(mode, options, viteConfig) {
10874
8330
  if ((ssrOptions == null ? void 0 : ssrOptions.noExternal) === true && resolved.server.deps.inline == null) {
10875
8331
  resolved.server.deps.inline = true;
10876
8332
  } else {
10877
- (_h = resolved.server.deps).inline ?? (_h.inline = []);
8333
+ (_m = resolved.server.deps).inline ?? (_m.inline = []);
10878
8334
  resolved.server.deps.inline.push(...extraInlineDeps);
10879
8335
  }
10880
8336
  }
10881
- (_i = resolved.server.deps).moduleDirectories ?? (_i.moduleDirectories = []);
8337
+ (_n = resolved.server.deps).moduleDirectories ?? (_n.moduleDirectories = []);
10882
8338
  resolved.server.deps.moduleDirectories.push(...resolved.deps.moduleDirectories);
10883
8339
  if (resolved.runner) {
10884
8340
  resolved.runner = resolveModule(resolved.runner, { paths: [resolved.root] }) ?? resolve(resolved.root, resolved.runner);
@@ -10942,7 +8398,7 @@ function resolveConfig(mode, options, viteConfig) {
10942
8398
  resolveModule(file, { paths: [resolved.root] }) ?? resolve(resolved.root, file)
10943
8399
  )
10944
8400
  );
10945
- resolved.coverage.exclude.push(...resolved.setupFiles.map((file) => relative(resolved.root, file)));
8401
+ resolved.coverage.exclude.push(...resolved.setupFiles.map((file) => `${resolved.coverage.allowExternal ? "**/" : ""}${relative(resolved.root, file)}`));
10946
8402
  resolved.forceRerunTriggers = [
10947
8403
  ...resolved.forceRerunTriggers,
10948
8404
  ...resolved.setupFiles
@@ -10965,19 +8421,19 @@ function resolveConfig(mode, options, viteConfig) {
10965
8421
  resolved.passWithNoTests ?? (resolved.passWithNoTests = true);
10966
8422
  resolved.css ?? (resolved.css = {});
10967
8423
  if (typeof resolved.css === "object") {
10968
- (_j = resolved.css).modules ?? (_j.modules = {});
10969
- (_k = resolved.css.modules).classNameStrategy ?? (_k.classNameStrategy = "stable");
8424
+ (_o = resolved.css).modules ?? (_o.modules = {});
8425
+ (_p = resolved.css.modules).classNameStrategy ?? (_p.classNameStrategy = "stable");
10970
8426
  }
10971
8427
  resolved.cache ?? (resolved.cache = { dir: "" });
10972
8428
  if (resolved.cache)
10973
- resolved.cache.dir = VitestCache.resolveCacheDir(resolved.root, resolved.cache.dir);
8429
+ resolved.cache.dir = VitestCache.resolveCacheDir(resolved.root, resolved.cache.dir, resolved.name);
10974
8430
  resolved.sequence ?? (resolved.sequence = {});
10975
- if (!((_l = resolved.sequence) == null ? void 0 : _l.sequencer)) {
8431
+ if (!((_q = resolved.sequence) == null ? void 0 : _q.sequencer)) {
10976
8432
  resolved.sequence.sequencer = resolved.sequence.shuffle ? RandomSequencer : BaseSequencer;
10977
8433
  }
10978
- (_m = resolved.sequence).hooks ?? (_m.hooks = "parallel");
8434
+ (_r = resolved.sequence).hooks ?? (_r.hooks = "parallel");
10979
8435
  if (resolved.sequence.sequencer === RandomSequencer)
10980
- (_n = resolved.sequence).seed ?? (_n.seed = Date.now());
8436
+ (_s = resolved.sequence).seed ?? (_s.seed = Date.now());
10981
8437
  resolved.typecheck = {
10982
8438
  ...configDefaults.typecheck,
10983
8439
  ...resolved.typecheck
@@ -10988,9 +8444,9 @@ function resolveConfig(mode, options, viteConfig) {
10988
8444
  resolved.exclude = resolved.typecheck.exclude;
10989
8445
  }
10990
8446
  resolved.browser ?? (resolved.browser = {});
10991
- (_o = resolved.browser).enabled ?? (_o.enabled = false);
10992
- (_p = resolved.browser).headless ?? (_p.headless = isCI);
10993
- (_q = resolved.browser).slowHijackESM ?? (_q.slowHijackESM = true);
8447
+ (_t = resolved.browser).enabled ?? (_t.enabled = false);
8448
+ (_u = resolved.browser).headless ?? (_u.headless = isCI);
8449
+ (_v = resolved.browser).slowHijackESM ?? (_v.slowHijackESM = true);
10994
8450
  resolved.browser.api = resolveApiServerConfig(resolved.browser) || {
10995
8451
  port: defaultBrowserPort
10996
8452
  };
@@ -11555,7 +9011,7 @@ createLogUpdate(process$1.stdout);
11555
9011
 
11556
9012
  createLogUpdate(process$1.stderr);
11557
9013
 
11558
- var version = "0.34.2";
9014
+ var version = "0.34.4";
11559
9015
 
11560
9016
  const A=r=>r!==null&&typeof r=="object",a=(r,t)=>Object.assign(new Error(`[${r}]: ${t}`),{code:r}),_$1="ERR_INVALID_PACKAGE_CONFIG",E="ERR_INVALID_PACKAGE_TARGET",I="ERR_PACKAGE_PATH_NOT_EXPORTED",R$1=/^\d+$/,O=/^(\.{1,2}|node_modules)$/i,w=/\/|\\/;var h=(r=>(r.Export="exports",r.Import="imports",r))(h||{});const f=(r,t,e,o,c)=>{if(t==null)return [];if(typeof t=="string"){const[n,...i]=t.split(w);if(n===".."||i.some(l=>O.test(l)))throw a(E,`Invalid "${r}" target "${t}" defined in the package config`);return [c?t.replace(/\*/g,c):t]}if(Array.isArray(t))return t.flatMap(n=>f(r,n,e,o,c));if(A(t)){for(const n of Object.keys(t)){if(R$1.test(n))throw a(_$1,"Cannot contain numeric property keys");if(n==="default"||o.includes(n))return f(r,t[n],e,o,c)}return []}throw a(E,`Invalid "${r}" target "${t}"`)},s="*",m=(r,t)=>{const e=r.indexOf(s),o=t.indexOf(s);return e===o?t.length>r.length:o>e};function d$1(r,t){if(!t.includes(s)&&r.hasOwnProperty(t))return [t];let e,o;for(const c of Object.keys(r))if(c.includes(s)){const[n,i,l]=c.split(s);if(l===void 0&&t.startsWith(n)&&t.endsWith(i)){const g=t.slice(n.length,-i.length||void 0);g&&(!e||m(e,c))&&(e=c,o=g);}}return [e,o]}const p=r=>Object.keys(r).reduce((t,e)=>{const o=e===""||e[0]!==".";if(t===void 0||t===o)return o;throw a(_$1,'"exports" cannot contain some keys starting with "." and some not')},void 0),u=/^\w+:/,v=(r,t,e)=>{if(!r)throw new Error('"exports" is required');t=t===""?".":`./${t}`,(typeof r=="string"||Array.isArray(r)||A(r)&&p(r))&&(r={".":r});const[o,c]=d$1(r,t),n=f(h.Export,r[o],t,e,c);if(n.length===0)throw a(I,t==="."?'No "exports" main defined':`Package subpath '${t}' is not defined by "exports"`);for(const i of n)if(!i.startsWith("./")&&!u.test(i))throw a(E,`Invalid "exports" target "${i}" defined in the package config`);return n};
11561
9017
 
@@ -12331,7 +9787,7 @@ No ${config.mode} files found, exiting with code 1`));
12331
9787
  }
12332
9788
  }
12333
9789
  printBanner() {
12334
- var _a, _b;
9790
+ var _a, _b, _c;
12335
9791
  this.log();
12336
9792
  const versionTest = this.ctx.config.watch ? c.blue(`v${version}`) : c.cyan(`v${version}`);
12337
9793
  const mode = this.ctx.config.watch ? c.blue(" DEV ") : c.cyan(" RUN ");
@@ -12348,8 +9804,8 @@ No ${config.mode} files found, exiting with code 1`));
12348
9804
  });
12349
9805
  if (this.ctx.config.ui)
12350
9806
  this.log(c.dim(c.green(` UI started at http://${((_a = this.ctx.config.api) == null ? void 0 : _a.host) || "localhost"}:${c.bold(`${this.ctx.server.config.server.port}`)}${this.ctx.config.uiBase}`)));
12351
- else if (this.ctx.config.api)
12352
- this.log(c.dim(c.green(` API started at http://${((_b = this.ctx.config.api) == null ? void 0 : _b.host) || "localhost"}:${c.bold(`${this.ctx.config.api.port}`)}`)));
9807
+ else if ((_b = this.ctx.config.api) == null ? void 0 : _b.port)
9808
+ this.log(c.dim(c.green(` API started at http://${((_c = this.ctx.config.api) == null ? void 0 : _c.host) || "localhost"}:${c.bold(`${this.ctx.config.api.port}`)}`)));
12353
9809
  if (this.ctx.coverageProvider)
12354
9810
  this.log(c.dim(" Coverage enabled with ") + c.yellow(this.ctx.coverageProvider.name));
12355
9811
  this.log();
@@ -12535,10 +9991,10 @@ function resolveOptimizerConfig(_testOptions, viteOptions, testConfig) {
12535
9991
  var _a;
12536
9992
  const testOptions = _testOptions || {};
12537
9993
  const newConfig = {};
12538
- const [major, minor] = version$2.split(".").map(Number);
12539
- const allowed = major >= 5 || major === 4 && minor >= 3;
9994
+ const [major, minor, fix] = version$2.split(".").map(Number);
9995
+ const allowed = major >= 5 || major === 4 && minor >= 4 || major === 4 && minor === 3 && fix >= 2;
12540
9996
  if (!allowed && (testOptions == null ? void 0 : testOptions.enabled) === true)
12541
- console.warn(`Vitest: "deps.optimizer" is only available in Vite >= 4.3.0, current Vite version: ${version$2}`);
9997
+ console.warn(`Vitest: "deps.optimizer" is only available in Vite >= 4.3.2, current Vite version: ${version$2}`);
12542
9998
  else
12543
9999
  testOptions.enabled ?? (testOptions.enabled = true);
12544
10000
  if (!allowed || (testOptions == null ? void 0 : testOptions.enabled) !== true) {
@@ -12549,16 +10005,27 @@ function resolveOptimizerConfig(_testOptions, viteOptions, testConfig) {
12549
10005
  entries: []
12550
10006
  };
12551
10007
  } else {
12552
- const cacheDir = testConfig.cache !== false ? (_a = testConfig.cache) == null ? void 0 : _a.dir : null;
12553
- newConfig.cacheDir = cacheDir ?? "node_modules/.vitest";
10008
+ const root = testConfig.root ?? process.cwd();
10009
+ const cacheDir = testConfig.cache !== false ? (_a = testConfig.cache) == null ? void 0 : _a.dir : void 0;
10010
+ const currentInclude = testOptions.include || (viteOptions == null ? void 0 : viteOptions.include) || [];
10011
+ const exclude = [
10012
+ "vitest",
10013
+ // Ideally, we shouldn't optimize react in test mode, otherwise we need to optimize _every_ dependency that uses react.
10014
+ "react",
10015
+ ...testOptions.exclude || (viteOptions == null ? void 0 : viteOptions.exclude) || []
10016
+ ];
10017
+ const runtime = currentInclude.filter((n) => n.endsWith("jsx-dev-runtime"));
10018
+ exclude.push(...runtime);
10019
+ const include = (testOptions.include || (viteOptions == null ? void 0 : viteOptions.include) || []).filter((n) => !exclude.includes(n));
10020
+ newConfig.cacheDir = cacheDir ?? VitestCache.resolveCacheDir(root, cacheDir, testConfig.name);
12554
10021
  newConfig.optimizeDeps = {
12555
10022
  ...viteOptions,
12556
10023
  ...testOptions,
12557
10024
  noDiscovery: true,
12558
10025
  disabled: false,
12559
10026
  entries: [],
12560
- exclude: ["vitest", ...builtinModules, ...testOptions.exclude || (viteOptions == null ? void 0 : viteOptions.exclude) || []],
12561
- include: (testOptions.include || (viteOptions == null ? void 0 : viteOptions.include) || []).filter((n) => n !== "vitest")
10027
+ exclude,
10028
+ include
12562
10029
  };
12563
10030
  }
12564
10031
  return newConfig;
@@ -12609,10 +10076,10 @@ function resolveFsAllow(projectRoot, rootConfigFile) {
12609
10076
  return [dirname(rootConfigFile), searchForWorkspaceRoot(projectRoot)];
12610
10077
  }
12611
10078
 
12612
- async function createBrowserServer(project, options) {
10079
+ async function createBrowserServer(project, configFile) {
12613
10080
  const root = project.config.root;
12614
10081
  await ensurePackageInstalled("@vitest/browser", root);
12615
- const configPath = options.config === false ? false : options.config ? resolve(root, options.config) : await findUp(configFiles, { cwd: root });
10082
+ const configPath = typeof configFile === "string" ? configFile : false;
12616
10083
  const server = await createServer({
12617
10084
  logLevel: "error",
12618
10085
  mode: project.config.mode,
@@ -12635,6 +10102,7 @@ async function createBrowserServer(project, options) {
12635
10102
  const server2 = resolveApiServerConfig(((_a = config.test) == null ? void 0 : _a.browser) || {}) || {
12636
10103
  port: defaultBrowserPort
12637
10104
  };
10105
+ server2.middlewareMode = false;
12638
10106
  config.server = server2;
12639
10107
  (_b = config.server).fs ?? (_b.fs = {});
12640
10108
  config.server.fs.allow = config.server.fs.allow || [];
@@ -12656,7 +10124,7 @@ async function createBrowserServer(project, options) {
12656
10124
  });
12657
10125
  await server.listen();
12658
10126
  await server.watcher.close();
12659
- (await import('./chunk-api-setup.cc5282f7.js')).setup(project, server);
10127
+ (await import('./chunk-api-setup.d65b007d.js')).setup(project, server);
12660
10128
  return server;
12661
10129
  }
12662
10130
 
@@ -12978,6 +10446,25 @@ function VitestResolver(ctx) {
12978
10446
  };
12979
10447
  }
12980
10448
 
10449
+ function VitestOptimizer() {
10450
+ return {
10451
+ name: "vitest:normalize-optimizer",
10452
+ config: {
10453
+ order: "post",
10454
+ handler(viteConfig) {
10455
+ var _a, _b, _c, _d, _e;
10456
+ const testConfig = viteConfig.test || {};
10457
+ const webOptimizer = resolveOptimizerConfig((_b = (_a = testConfig.deps) == null ? void 0 : _a.optimizer) == null ? void 0 : _b.web, viteConfig.optimizeDeps, testConfig);
10458
+ const ssrOptimizer = resolveOptimizerConfig((_d = (_c = testConfig.deps) == null ? void 0 : _c.optimizer) == null ? void 0 : _d.ssr, (_e = viteConfig.ssr) == null ? void 0 : _e.optimizeDeps, testConfig);
10459
+ viteConfig.cacheDir = webOptimizer.cacheDir || ssrOptimizer.cacheDir || viteConfig.cacheDir;
10460
+ viteConfig.optimizeDeps = webOptimizer.optimizeDeps;
10461
+ viteConfig.ssr ?? (viteConfig.ssr = {});
10462
+ viteConfig.ssr.optimizeDeps = ssrOptimizer.optimizeDeps;
10463
+ }
10464
+ }
10465
+ };
10466
+ }
10467
+
12981
10468
  function WorkspaceVitestPlugin(project, options) {
12982
10469
  return [
12983
10470
  {
@@ -12987,7 +10474,7 @@ function WorkspaceVitestPlugin(project, options) {
12987
10474
  this.meta.watchMode = false;
12988
10475
  },
12989
10476
  config(viteConfig) {
12990
- var _a, _b, _c, _d, _e, _f, _g, _h;
10477
+ var _a, _b, _c;
12991
10478
  const env = deleteDefineConfig(viteConfig);
12992
10479
  const testConfig = viteConfig.test || {};
12993
10480
  const root = testConfig.root || viteConfig.root || options.root;
@@ -13026,6 +10513,7 @@ function WorkspaceVitestPlugin(project, options) {
13026
10513
  open: false,
13027
10514
  hmr: false,
13028
10515
  preTransformRequests: false,
10516
+ middlewareMode: true,
13029
10517
  fs: {
13030
10518
  allow: resolveFsAllow(
13031
10519
  project.ctx.config.root,
@@ -13049,13 +10537,6 @@ function WorkspaceVitestPlugin(project, options) {
13049
10537
  };
13050
10538
  }
13051
10539
  }
13052
- const webOptimizer = resolveOptimizerConfig((_e = (_d = testConfig.deps) == null ? void 0 : _d.optimizer) == null ? void 0 : _e.web, viteConfig.optimizeDeps, testConfig);
13053
- const ssrOptimizer = resolveOptimizerConfig((_g = (_f = testConfig.deps) == null ? void 0 : _f.optimizer) == null ? void 0 : _g.ssr, (_h = viteConfig.ssr) == null ? void 0 : _h.optimizeDeps, testConfig);
13054
- config.cacheDir = webOptimizer.cacheDir || ssrOptimizer.cacheDir || config.cacheDir;
13055
- config.optimizeDeps = webOptimizer.optimizeDeps;
13056
- config.ssr = {
13057
- optimizeDeps: ssrOptimizer.optimizeDeps
13058
- };
13059
10540
  return config;
13060
10541
  },
13061
10542
  configResolved(viteConfig) {
@@ -13081,12 +10562,27 @@ function WorkspaceVitestPlugin(project, options) {
13081
10562
  CoverageTransform(project.ctx),
13082
10563
  GlobalSetupPlugin(project, project.ctx.logger),
13083
10564
  MocksPlugin(),
13084
- VitestResolver(project.ctx)
10565
+ VitestResolver(project.ctx),
10566
+ VitestOptimizer()
13085
10567
  ];
13086
10568
  }
13087
10569
 
10570
+ async function createViteServer(inlineConfig) {
10571
+ const error = console.error;
10572
+ console.error = (...args) => {
10573
+ if (typeof args[0] === "string" && args[0].includes("WebSocket server error:"))
10574
+ return;
10575
+ error(...args);
10576
+ };
10577
+ const server = await createServer({
10578
+ logLevel: "error",
10579
+ ...inlineConfig
10580
+ });
10581
+ console.error = error;
10582
+ return server;
10583
+ }
10584
+
13088
10585
  async function initializeProject(workspacePath, ctx, options) {
13089
- var _a, _b, _c, _d, _e, _f, _g;
13090
10586
  const project = new WorkspaceProject(workspacePath, ctx);
13091
10587
  const configFile = options.extends ? resolve(dirname(options.workspaceConfigPath), options.extends) : typeof workspacePath === "number" || workspacePath.endsWith("/") ? false : workspacePath;
13092
10588
  const root = options.root || (typeof workspacePath === "number" ? void 0 : dirname(workspacePath));
@@ -13102,11 +10598,7 @@ async function initializeProject(workspacePath, ctx, options) {
13102
10598
  WorkspaceVitestPlugin(project, { ...options, root, workspacePath })
13103
10599
  ]
13104
10600
  };
13105
- const server = await createServer(config);
13106
- if (((_a = ctx.config.api) == null ? void 0 : _a.port) || ((_d = (_c = (_b = project.config.deps) == null ? void 0 : _b.optimizer) == null ? void 0 : _c.web) == null ? void 0 : _d.enabled) || ((_g = (_f = (_e = project.config.deps) == null ? void 0 : _e.optimizer) == null ? void 0 : _f.ssr) == null ? void 0 : _g.enabled))
13107
- await server.listen();
13108
- else
13109
- await server.pluginContainer.buildStart({});
10601
+ await createViteServer(config);
13110
10602
  return project;
13111
10603
  }
13112
10604
  class WorkspaceProject {
@@ -13210,19 +10702,28 @@ class WorkspaceProject {
13210
10702
  }
13211
10703
  return testFiles;
13212
10704
  }
13213
- async initBrowserServer(options) {
10705
+ async initBrowserServer(configFile) {
13214
10706
  var _a;
13215
10707
  if (!this.isBrowserEnabled())
13216
10708
  return;
13217
10709
  await ((_a = this.browser) == null ? void 0 : _a.close());
13218
- this.browser = await createBrowserServer(this, options);
13219
- }
13220
- async setServer(options, server, params = {}) {
10710
+ this.browser = await createBrowserServer(this, configFile);
10711
+ }
10712
+ static async createCoreProject(ctx) {
10713
+ const project = new WorkspaceProject(ctx.config.name || ctx.config.root, ctx);
10714
+ project.vitenode = ctx.vitenode;
10715
+ project.server = ctx.server;
10716
+ project.runner = ctx.runner;
10717
+ project.config = ctx.config;
10718
+ await project.initBrowserServer(ctx.server.config.configFile);
10719
+ return project;
10720
+ }
10721
+ async setServer(options, server) {
13221
10722
  this.config = resolveConfig(this.ctx.mode, options, server.config);
13222
10723
  this.server = server;
13223
- this.vitenode = params.server ?? new ViteNodeServer(server, this.config);
10724
+ this.vitenode = new ViteNodeServer(server, this.config);
13224
10725
  const node = this.vitenode;
13225
- this.runner = params.runner ?? new ViteNodeRunner({
10726
+ this.runner = new ViteNodeRunner({
13226
10727
  root: server.config.root,
13227
10728
  base: server.config.base,
13228
10729
  fetchModule(id) {
@@ -13232,7 +10733,7 @@ class WorkspaceProject {
13232
10733
  return node.resolveId(id, importer);
13233
10734
  }
13234
10735
  });
13235
- await this.initBrowserServer(options);
10736
+ await this.initBrowserServer(this.server.config.configFile);
13236
10737
  }
13237
10738
  async report(name, ...args) {
13238
10739
  return this.ctx.report(name, ...args);
@@ -13298,7 +10799,8 @@ class WorkspaceProject {
13298
10799
  return isBrowserEnabled(this.config);
13299
10800
  }
13300
10801
  getSerializableConfig() {
13301
- var _a, _b, _c, _d, _e, _f;
10802
+ var _a, _b, _c;
10803
+ const optimizer = (_a = this.config.deps) == null ? void 0 : _a.optimizer;
13302
10804
  return deepMerge(
13303
10805
  {
13304
10806
  ...this.config,
@@ -13308,10 +10810,10 @@ class WorkspaceProject {
13308
10810
  ...this.config.deps,
13309
10811
  optimizer: {
13310
10812
  web: {
13311
- enabled: ((_c = (_b = (_a = this.config.deps) == null ? void 0 : _a.optimizer) == null ? void 0 : _b.web) == null ? void 0 : _c.enabled) ?? true
10813
+ enabled: ((_b = optimizer == null ? void 0 : optimizer.web) == null ? void 0 : _b.enabled) ?? true
13312
10814
  },
13313
10815
  ssr: {
13314
- enabled: ((_f = (_e = (_d = this.config.deps) == null ? void 0 : _d.optimizer) == null ? void 0 : _e.ssr) == null ? void 0 : _f.enabled) ?? true
10816
+ enabled: ((_c = optimizer == null ? void 0 : optimizer.ssr) == null ? void 0 : _c.enabled) ?? true
13315
10817
  }
13316
10818
  }
13317
10819
  },
@@ -13329,7 +10831,8 @@ class WorkspaceProject {
13329
10831
  reporters: []
13330
10832
  },
13331
10833
  inspect: this.ctx.config.inspect,
13332
- inspectBrk: this.ctx.config.inspectBrk
10834
+ inspectBrk: this.ctx.config.inspectBrk,
10835
+ alias: []
13333
10836
  },
13334
10837
  this.ctx.configOverride || {}
13335
10838
  );
@@ -13447,18 +10950,13 @@ class Vitest {
13447
10950
  } catch {
13448
10951
  }
13449
10952
  await Promise.all(this._onSetServer.map((fn) => fn()));
13450
- this.projects = await this.resolveWorkspace(options, cliOptions);
10953
+ this.projects = await this.resolveWorkspace(cliOptions);
13451
10954
  if (this.config.testNamePattern)
13452
10955
  this.configOverride.testNamePattern = this.config.testNamePattern;
13453
10956
  }
13454
- async createCoreWorkspace(options) {
13455
- const coreWorkspace = new WorkspaceProject(this.config.root, this);
13456
- await coreWorkspace.setServer(options, this.server, {
13457
- runner: this.runner,
13458
- server: this.vitenode
13459
- });
13460
- this.coreWorkspaceProject = coreWorkspace;
13461
- return coreWorkspace;
10957
+ async createCoreProject() {
10958
+ this.coreWorkspaceProject = await WorkspaceProject.createCoreProject(this);
10959
+ return this.coreWorkspaceProject;
13462
10960
  }
13463
10961
  getCoreWorkspaceProject() {
13464
10962
  return this.coreWorkspaceProject || null;
@@ -13469,14 +10967,14 @@ class Vitest {
13469
10967
  const projectName = task.projectName || ((_a = task == null ? void 0 : task.file) == null ? void 0 : _a.projectName);
13470
10968
  return this.projects.find((p) => p.getName() === projectName) || this.getCoreWorkspaceProject() || this.projects[0];
13471
10969
  }
13472
- async resolveWorkspace(options, cliOptions) {
10970
+ async resolveWorkspace(cliOptions) {
13473
10971
  const configDir = this.server.config.configFile ? dirname(this.server.config.configFile) : this.config.root;
13474
10972
  const rootFiles = await promises.readdir(configDir);
13475
10973
  const workspaceConfigName = workspacesFiles.find((configFile) => {
13476
10974
  return rootFiles.includes(configFile);
13477
10975
  });
13478
10976
  if (!workspaceConfigName)
13479
- return [await this.createCoreWorkspace(options)];
10977
+ return [await this.createCoreProject()];
13480
10978
  const workspaceConfigPath = join(configDir, workspaceConfigName);
13481
10979
  const workspaceModule = await this.runner.executeFile(workspaceConfigPath);
13482
10980
  if (!workspaceModule.default || !Array.isArray(workspaceModule.default))
@@ -13545,14 +11043,14 @@ class Vitest {
13545
11043
  }, {});
13546
11044
  const projects = filteredWorkspaces.map(async (workspacePath) => {
13547
11045
  if (this.server.config.configFile === workspacePath)
13548
- return this.createCoreWorkspace(options);
11046
+ return this.createCoreProject();
13549
11047
  return initializeProject(workspacePath, this, { workspaceConfigPath, test: cliOverrides });
13550
11048
  });
13551
- projectsOptions.forEach((options2, index) => {
13552
- projects.push(initializeProject(index, this, mergeConfig(options2, { workspaceConfigPath, test: cliOverrides })));
11049
+ projectsOptions.forEach((options, index) => {
11050
+ projects.push(initializeProject(index, this, mergeConfig(options, { workspaceConfigPath, test: cliOverrides })));
13553
11051
  });
13554
11052
  if (!projects.length)
13555
- return [await this.createCoreWorkspace(options)];
11053
+ return [await this.createCoreProject()];
13556
11054
  const resolvedProjects = await Promise.all(projects);
13557
11055
  const names = /* @__PURE__ */ new Set();
13558
11056
  for (const project of resolvedProjects) {
@@ -13901,10 +11399,8 @@ class Vitest {
13901
11399
  async reportCoverage(allTestsRun) {
13902
11400
  if (!this.config.coverage.reportOnFailure && this.state.getCountOfFailedTests() > 0)
13903
11401
  return;
13904
- if (this.coverageProvider) {
13905
- this.logger.log(c.blue(" % ") + c.dim("Coverage report from ") + c.yellow(this.coverageProvider.name));
11402
+ if (this.coverageProvider)
13906
11403
  await this.coverageProvider.reportCoverage({ allTestsRun });
13907
- }
13908
11404
  }
13909
11405
  async close() {
13910
11406
  if (!this.closingPromise) {
@@ -14002,7 +11498,7 @@ async function VitestPlugin(options = {}, ctx = new Vitest("test")) {
14002
11498
  this.meta.watchMode = false;
14003
11499
  },
14004
11500
  async config(viteConfig) {
14005
- var _a, _b, _c, _d, _e, _f, _g, _h, _i;
11501
+ var _a, _b, _c, _d;
14006
11502
  if (options.watch) {
14007
11503
  options = deepMerge({}, userConfig);
14008
11504
  }
@@ -14015,7 +11511,7 @@ async function VitestPlugin(options = {}, ctx = new Vitest("test")) {
14015
11511
  testConfig.api = resolveApiServerConfig(testConfig);
14016
11512
  const defines = deleteDefineConfig(viteConfig);
14017
11513
  options.defines = defines;
14018
- let open;
11514
+ let open = false;
14019
11515
  if (testConfig.ui && testConfig.open)
14020
11516
  open = testConfig.uiBase ?? "/__vitest__/";
14021
11517
  const config = {
@@ -14063,17 +11559,10 @@ async function VitestPlugin(options = {}, ctx = new Vitest("test")) {
14063
11559
  };
14064
11560
  }
14065
11561
  }
14066
- const webOptimizer = resolveOptimizerConfig((_f = (_e = testConfig.deps) == null ? void 0 : _e.optimizer) == null ? void 0 : _f.web, viteConfig.optimizeDeps, testConfig);
14067
- const ssrOptimizer = resolveOptimizerConfig((_h = (_g = testConfig.deps) == null ? void 0 : _g.optimizer) == null ? void 0 : _h.ssr, (_i = viteConfig.ssr) == null ? void 0 : _i.optimizeDeps, testConfig);
14068
- config.cacheDir = webOptimizer.cacheDir || ssrOptimizer.cacheDir || config.cacheDir;
14069
- config.optimizeDeps = webOptimizer.optimizeDeps;
14070
- config.ssr = {
14071
- optimizeDeps: ssrOptimizer.optimizeDeps
14072
- };
14073
11562
  return config;
14074
11563
  },
14075
11564
  async configResolved(viteConfig) {
14076
- var _a, _b, _c, _d;
11565
+ var _a, _b, _c;
14077
11566
  const viteConfigTest = viteConfig.test || {};
14078
11567
  if (viteConfigTest.watch === false)
14079
11568
  viteConfigTest.run = true;
@@ -14089,9 +11578,8 @@ async function VitestPlugin(options = {}, ctx = new Vitest("test")) {
14089
11578
  const { PROD, DEV, ...envs } = viteConfig.env;
14090
11579
  (_a = process.env).PROD ?? (_a.PROD = PROD ? "1" : "");
14091
11580
  (_b = process.env).DEV ?? (_b.DEV = DEV ? "1" : "");
14092
- (_c = process.env).SSR ?? (_c.SSR = "1");
14093
11581
  for (const name in envs)
14094
- (_d = process.env)[name] ?? (_d[name] = envs[name]);
11582
+ (_c = process.env)[name] ?? (_c[name] = envs[name]);
14095
11583
  if (!options.watch) {
14096
11584
  viteConfig.server.watch = {
14097
11585
  persistent: false,
@@ -14110,7 +11598,7 @@ async function VitestPlugin(options = {}, ctx = new Vitest("test")) {
14110
11598
  try {
14111
11599
  await ctx.setServer(options, server, userConfig);
14112
11600
  if (options.api && options.watch)
14113
- (await import('./chunk-api-setup.cc5282f7.js')).setup(ctx);
11601
+ (await import('./chunk-api-setup.d65b007d.js')).setup(ctx);
14114
11602
  } catch (err) {
14115
11603
  await ctx.logger.printError(err, { fullStack: true });
14116
11604
  process.exit(1);
@@ -14125,12 +11613,13 @@ async function VitestPlugin(options = {}, ctx = new Vitest("test")) {
14125
11613
  CoverageTransform(ctx),
14126
11614
  options.ui ? await UIPlugin() : null,
14127
11615
  MocksPlugin(),
14128
- VitestResolver(ctx)
11616
+ VitestResolver(ctx),
11617
+ VitestOptimizer()
14129
11618
  ].filter(notNullish);
14130
11619
  }
14131
11620
 
14132
11621
  async function createVitest(mode, options, viteOverrides = {}) {
14133
- var _a, _b, _c, _d, _e, _f, _g;
11622
+ var _a;
14134
11623
  const ctx = new Vitest(mode);
14135
11624
  const root = resolve(options.root || process.cwd());
14136
11625
  const configPath = options.config === false ? false : options.config ? resolve(root, options.config) : await findUp(configFiles, { cwd: root });
@@ -14142,11 +11631,9 @@ async function createVitest(mode, options, viteOverrides = {}) {
14142
11631
  mode: options.mode || process.env.NODE_ENV || mode,
14143
11632
  plugins: await VitestPlugin(options, ctx)
14144
11633
  };
14145
- const server = await createServer(mergeConfig(config, mergeConfig(viteOverrides, { root: options.root })));
14146
- if (((_a = ctx.config.api) == null ? void 0 : _a.port) || ((_d = (_c = (_b = ctx.config.deps) == null ? void 0 : _b.optimizer) == null ? void 0 : _c.web) == null ? void 0 : _d.enabled) || ((_g = (_f = (_e = ctx.config.deps) == null ? void 0 : _e.optimizer) == null ? void 0 : _f.ssr) == null ? void 0 : _g.enabled))
11634
+ const server = await createViteServer(mergeConfig(config, mergeConfig(viteOverrides, { root: options.root })));
11635
+ if ((_a = ctx.config.api) == null ? void 0 : _a.port)
14147
11636
  await server.listen();
14148
- else
14149
- await server.pluginContainer.buildStart({});
14150
11637
  return ctx;
14151
11638
  }
14152
11639
 
@@ -20600,4 +18087,4 @@ async function startVitest(mode, cliFilters = [], options = {}, viteOverrides) {
20600
18087
  return ctx;
20601
18088
  }
20602
18089
 
20603
- export { BaseSequencer as B, VitestPlugin as V, createVitest as c, divider as d, onetimeExports as o, registerConsoleShortcuts as r, startVitest as s, version$1 as v };
18090
+ export { BaseSequencer as B, VitestPlugin as V, createVitest as c, onetimeExports as o, registerConsoleShortcuts as r, startVitest as s, version$1 as v };