vitest 0.26.2 → 0.27.0

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 (43) hide show
  1. package/LICENSE.md +2 -54
  2. package/dist/browser.d.ts +3 -3
  3. package/dist/browser.js +15 -15
  4. package/dist/{chunk-api-setup.46ee0021.js → chunk-api-setup.16ac28c0.js} +13 -3
  5. package/dist/{chunk-install-pkg.31846bc1.js → chunk-install-pkg.6dd2bae6.js} +2 -2
  6. package/dist/{chunk-integrations-coverage.befed097.js → chunk-integrations-coverage.44413252.js} +19 -1
  7. package/dist/chunk-integrations-globals.3dfaeb99.js +27 -0
  8. package/dist/{chunk-typecheck-constants.e478eb98.js → chunk-mock-date.a1c85759.js} +10 -28
  9. package/dist/{chunk-node-git.43b341db.js → chunk-node-git.543e964a.js} +3 -4
  10. package/dist/{chunk-runtime-chain.198631fd.js → chunk-runtime-chain.6df5a66b.js} +1192 -1028
  11. package/dist/{chunk-runtime-error.12631a44.js → chunk-runtime-error.fad2c32b.js} +2 -2
  12. package/dist/{chunk-runtime-mocker.03096876.js → chunk-runtime-mocker.a677dd28.js} +10 -8
  13. package/dist/{chunk-runtime-rpc.503623e9.js → chunk-runtime-rpc.7f83c8a9.js} +2 -2
  14. package/dist/{chunk-runtime-setup.f79addc3.js → chunk-runtime-setup.731b2b04.js} +51 -52
  15. package/dist/{chunk-snapshot-manager.8c94a052.js → chunk-snapshot-manager.700322bf.js} +430 -303
  16. package/dist/{chunk-utils-env.4afc6329.js → chunk-utils-env.b861e3a0.js} +1 -63
  17. package/dist/{chunk-utils-import.dc87c88c.js → chunk-utils-import.2baa69a9.js} +38 -13
  18. package/dist/chunk-utils-source-map.60562959.js +408 -0
  19. package/dist/{chunk-utils-timers.54caa12a.js → chunk-utils-timers.52534f96.js} +2977 -3458
  20. package/dist/cli-wrapper.js +13 -13
  21. package/dist/cli.js +15 -627
  22. package/dist/config.cjs +2 -1
  23. package/dist/config.d.ts +1 -1
  24. package/dist/config.js +2 -1
  25. package/dist/entry.js +14 -14
  26. package/dist/environments.d.ts +1 -1
  27. package/dist/{index-40ebba2b.d.ts → index-2d10c3fd.d.ts} +1 -1
  28. package/dist/index.d.ts +6 -6
  29. package/dist/index.js +12 -12
  30. package/dist/loader.js +3 -3
  31. package/dist/node.d.ts +6 -6
  32. package/dist/node.js +11 -11
  33. package/dist/spy.js +2 -102
  34. package/dist/suite.js +10 -10
  35. package/dist/{types-2a26f28c.d.ts → types-e1e1d1e5.d.ts} +92 -83
  36. package/dist/vendor-index.723a074f.js +102 -0
  37. package/dist/{vendor-index.62932580.js → vendor-index.7a2cebfe.js} +0 -0
  38. package/dist/{vendor-index.808a85a6.js → vendor-index.9c919048.js} +0 -0
  39. package/dist/{vendor-index.a323f2d0.js → vendor-index.b2fdde54.js} +1 -1
  40. package/dist/worker.js +7 -7
  41. package/package.json +9 -5
  42. package/dist/chunk-integrations-globals.5af12e76.js +0 -27
  43. package/dist/chunk-utils-source-map.95b8b3f0.js +0 -94
@@ -1,68 +1,6 @@
1
- import require$$0 from 'tty';
2
1
  import url from 'node:url';
3
2
  import g from 'path';
4
3
 
5
- var picocolors = {exports: {}};
6
-
7
- let tty = require$$0;
8
-
9
- let isColorSupported =
10
- !("NO_COLOR" in process.env || process.argv.includes("--no-color")) &&
11
- ("FORCE_COLOR" in process.env ||
12
- process.argv.includes("--color") ||
13
- process.platform === "win32" ||
14
- (tty.isatty(1) && process.env.TERM !== "dumb") ||
15
- "CI" in process.env);
16
-
17
- let formatter =
18
- (open, close, replace = open) =>
19
- input => {
20
- let string = "" + input;
21
- let index = string.indexOf(close, open.length);
22
- return ~index
23
- ? open + replaceClose(string, close, replace, index) + close
24
- : open + string + close
25
- };
26
-
27
- let replaceClose = (string, close, replace, index) => {
28
- let start = string.substring(0, index) + replace;
29
- let end = string.substring(index + close.length);
30
- let nextIndex = end.indexOf(close);
31
- return ~nextIndex ? start + replaceClose(end, close, replace, nextIndex) : start + end
32
- };
33
-
34
- let createColors = (enabled = isColorSupported) => ({
35
- isColorSupported: enabled,
36
- reset: enabled ? s => `\x1b[0m${s}\x1b[0m` : String,
37
- bold: enabled ? formatter("\x1b[1m", "\x1b[22m", "\x1b[22m\x1b[1m") : String,
38
- dim: enabled ? formatter("\x1b[2m", "\x1b[22m", "\x1b[22m\x1b[2m") : String,
39
- italic: enabled ? formatter("\x1b[3m", "\x1b[23m") : String,
40
- underline: enabled ? formatter("\x1b[4m", "\x1b[24m") : String,
41
- inverse: enabled ? formatter("\x1b[7m", "\x1b[27m") : String,
42
- hidden: enabled ? formatter("\x1b[8m", "\x1b[28m") : String,
43
- strikethrough: enabled ? formatter("\x1b[9m", "\x1b[29m") : String,
44
- black: enabled ? formatter("\x1b[30m", "\x1b[39m") : String,
45
- red: enabled ? formatter("\x1b[31m", "\x1b[39m") : String,
46
- green: enabled ? formatter("\x1b[32m", "\x1b[39m") : String,
47
- yellow: enabled ? formatter("\x1b[33m", "\x1b[39m") : String,
48
- blue: enabled ? formatter("\x1b[34m", "\x1b[39m") : String,
49
- magenta: enabled ? formatter("\x1b[35m", "\x1b[39m") : String,
50
- cyan: enabled ? formatter("\x1b[36m", "\x1b[39m") : String,
51
- white: enabled ? formatter("\x1b[37m", "\x1b[39m") : String,
52
- gray: enabled ? formatter("\x1b[90m", "\x1b[39m") : String,
53
- bgBlack: enabled ? formatter("\x1b[40m", "\x1b[49m") : String,
54
- bgRed: enabled ? formatter("\x1b[41m", "\x1b[49m") : String,
55
- bgGreen: enabled ? formatter("\x1b[42m", "\x1b[49m") : String,
56
- bgYellow: enabled ? formatter("\x1b[43m", "\x1b[49m") : String,
57
- bgBlue: enabled ? formatter("\x1b[44m", "\x1b[49m") : String,
58
- bgMagenta: enabled ? formatter("\x1b[45m", "\x1b[49m") : String,
59
- bgCyan: enabled ? formatter("\x1b[46m", "\x1b[49m") : String,
60
- bgWhite: enabled ? formatter("\x1b[47m", "\x1b[49m") : String,
61
- });
62
-
63
- picocolors.exports = createColors();
64
- picocolors.exports.createColors = createColors;
65
-
66
4
  function normalizeWindowsPath(input = "") {
67
5
  if (!input.includes("\\")) {
68
6
  return input;
@@ -287,4 +225,4 @@ const globalApis = [
287
225
  "afterEach"
288
226
  ];
289
227
 
290
- export { API_PATH as A, EXIT_CODE_RESTART as E, isBrowser as a, resolve as b, basename as c, dirname as d, distDir as e, rootDir as f, isAbsolute as g, configFiles as h, isNode as i, join as j, defaultPort as k, extname as l, globalApis as m, normalize as n, picocolors as p, relative as r, toNamespacedPath as t };
228
+ export { API_PATH as A, EXIT_CODE_RESTART as E, isBrowser as a, resolve as b, basename as c, dirname as d, extname as e, distDir as f, rootDir as g, isAbsolute as h, isNode as i, join as j, configFiles as k, defaultPort as l, globalApis as m, normalize as n, relative as r, toNamespacedPath as t };
@@ -1,25 +1,31 @@
1
- import { g as getCurrentSuite, w as withTimeout, a as getDefaultHookTimeout, s as suite, t as test, d as describe, i as it, b as bench, c as createExpect, e as globalExpect } from './chunk-runtime-chain.198631fd.js';
2
- import { g as getWorkerState, R as RealDate, r as resetDate, m as mockDate, a as resetModules } from './chunk-typecheck-constants.e478eb98.js';
3
- import { p as parseStacktrace } from './chunk-utils-source-map.95b8b3f0.js';
1
+ import { g as getCurrentSuite, w as withTimeout, a as getDefaultHookTimeout, s as suite, t as test, d as describe, i as it, b as bench, c as createExpect, e as globalExpect } from './chunk-runtime-chain.6df5a66b.js';
2
+ import { g as getWorkerState, R as RealDate, r as resetDate, m as mockDate, a as resetModules } from './chunk-mock-date.a1c85759.js';
3
+ import { p as parseSingleStack } from './chunk-utils-source-map.60562959.js';
4
4
  import { c as commonjsGlobal } from './vendor-_commonjsHelpers.addc3445.js';
5
5
  import util from 'util';
6
- import { spyOn, fn, isMockFunction, spies } from './spy.js';
7
- import { s as safeSetTimeout } from './chunk-utils-timers.54caa12a.js';
6
+ import { s as spyOn, f as fn, i as isMockFunction, a as spies } from './vendor-index.723a074f.js';
7
+ import { s as safeSetTimeout } from './chunk-utils-timers.52534f96.js';
8
8
  import * as chai from 'chai';
9
9
  import { assert, should } from 'chai';
10
10
 
11
- async function waitForImportsToResolve(tries = 0) {
12
- await new Promise((resolve) => safeSetTimeout(resolve, 0));
11
+ function waitNextTick() {
12
+ return new Promise((resolve) => safeSetTimeout(resolve, 0));
13
+ }
14
+ async function waitForImportsToResolve() {
15
+ await waitNextTick();
13
16
  const state = getWorkerState();
14
17
  const promises = [];
18
+ let resolvingCount = 0;
15
19
  for (const mod of state.moduleCache.values()) {
16
20
  if (mod.promise && !mod.evaluated)
17
21
  promises.push(mod.promise);
22
+ if (mod.resolving)
23
+ resolvingCount++;
18
24
  }
19
- if (!promises.length && tries >= 3)
25
+ if (!promises.length && !resolvingCount)
20
26
  return;
21
27
  await Promise.allSettled(promises);
22
- await new Promise((resolve) => safeSetTimeout(resolve, 1)).then(() => Promise.resolve()).then(() => waitForImportsToResolve(tries + 1));
28
+ await waitForImportsToResolve();
23
29
  }
24
30
 
25
31
  let _test;
@@ -82,6 +88,19 @@ function resetRunOnceCounter() {
82
88
  filesCount.clear();
83
89
  }
84
90
 
91
+ function createSimpleStackTrace(options) {
92
+ const { message = "error", stackTraceLimit = 1 } = options || {};
93
+ const limit = Error.stackTraceLimit;
94
+ const prepareStackTrace = Error.prepareStackTrace;
95
+ Error.stackTraceLimit = stackTraceLimit;
96
+ Error.prepareStackTrace = (e) => e.stack;
97
+ const err = new Error(message);
98
+ const stackTrace = err.stack || "";
99
+ Error.prepareStackTrace = prepareStackTrace;
100
+ Error.stackTraceLimit = limit;
101
+ return stackTrace;
102
+ }
103
+
85
104
  /**
86
105
  * A reference to the global object
87
106
  *
@@ -2805,12 +2824,18 @@ class VitestUtils {
2805
2824
  return this;
2806
2825
  }
2807
2826
  getImporter() {
2808
- const err = new Error("mock");
2809
- const [, , importer] = parseStacktrace(err, true);
2810
- return importer.file;
2827
+ const stackTrace = createSimpleStackTrace({ stackTraceLimit: 4 });
2828
+ const importerStack = stackTrace.split("\n")[4];
2829
+ const stack = parseSingleStack(importerStack);
2830
+ return (stack == null ? void 0 : stack.file) || "";
2811
2831
  }
2812
2832
  mock(path, factory) {
2813
- this._mocker.queueMock(path, this.getImporter(), factory);
2833
+ const importer = this.getImporter();
2834
+ this._mocker.queueMock(
2835
+ path,
2836
+ importer,
2837
+ factory ? () => factory(() => this._mocker.importActual(path, importer)) : void 0
2838
+ );
2814
2839
  }
2815
2840
  unmock(path) {
2816
2841
  this._mocker.queueUnmock(path, this.getImporter());
@@ -0,0 +1,408 @@
1
+ import { d as ansiStyles, e as eastAsianWidth } from './chunk-utils-timers.52534f96.js';
2
+ import { b as resolve } from './chunk-utils-env.b861e3a0.js';
3
+ import { j as notNullish } from './chunk-mock-date.a1c85759.js';
4
+
5
+ /* eslint-disable yoda */
6
+
7
+ function isFullwidthCodePoint(codePoint) {
8
+ if (!Number.isInteger(codePoint)) {
9
+ return false;
10
+ }
11
+
12
+ // Code points are derived from:
13
+ // https://unicode.org/Public/UNIDATA/EastAsianWidth.txt
14
+ return codePoint >= 0x1100 && (
15
+ codePoint <= 0x115F || // Hangul Jamo
16
+ codePoint === 0x2329 || // LEFT-POINTING ANGLE BRACKET
17
+ codePoint === 0x232A || // RIGHT-POINTING ANGLE BRACKET
18
+ // CJK Radicals Supplement .. Enclosed CJK Letters and Months
19
+ (0x2E80 <= codePoint && codePoint <= 0x3247 && codePoint !== 0x303F) ||
20
+ // Enclosed CJK Letters and Months .. CJK Unified Ideographs Extension A
21
+ (0x3250 <= codePoint && codePoint <= 0x4DBF) ||
22
+ // CJK Unified Ideographs .. Yi Radicals
23
+ (0x4E00 <= codePoint && codePoint <= 0xA4C6) ||
24
+ // Hangul Jamo Extended-A
25
+ (0xA960 <= codePoint && codePoint <= 0xA97C) ||
26
+ // Hangul Syllables
27
+ (0xAC00 <= codePoint && codePoint <= 0xD7A3) ||
28
+ // CJK Compatibility Ideographs
29
+ (0xF900 <= codePoint && codePoint <= 0xFAFF) ||
30
+ // Vertical Forms
31
+ (0xFE10 <= codePoint && codePoint <= 0xFE19) ||
32
+ // CJK Compatibility Forms .. Small Form Variants
33
+ (0xFE30 <= codePoint && codePoint <= 0xFE6B) ||
34
+ // Halfwidth and Fullwidth Forms
35
+ (0xFF01 <= codePoint && codePoint <= 0xFF60) ||
36
+ (0xFFE0 <= codePoint && codePoint <= 0xFFE6) ||
37
+ // Kana Supplement
38
+ (0x1B000 <= codePoint && codePoint <= 0x1B001) ||
39
+ // Enclosed Ideographic Supplement
40
+ (0x1F200 <= codePoint && codePoint <= 0x1F251) ||
41
+ // CJK Unified Ideographs Extension B .. Tertiary Ideographic Plane
42
+ (0x20000 <= codePoint && codePoint <= 0x3FFFD)
43
+ );
44
+ }
45
+
46
+ const astralRegex = /^[\uD800-\uDBFF][\uDC00-\uDFFF]$/;
47
+
48
+ const ESCAPES = [
49
+ '\u001B',
50
+ '\u009B'
51
+ ];
52
+
53
+ const wrapAnsi = code => `${ESCAPES[0]}[${code}m`;
54
+
55
+ const checkAnsi = (ansiCodes, isEscapes, endAnsiCode) => {
56
+ let output = [];
57
+ ansiCodes = [...ansiCodes];
58
+
59
+ for (let ansiCode of ansiCodes) {
60
+ const ansiCodeOrigin = ansiCode;
61
+ if (ansiCode.includes(';')) {
62
+ ansiCode = ansiCode.split(';')[0][0] + '0';
63
+ }
64
+
65
+ const item = ansiStyles.codes.get(Number.parseInt(ansiCode, 10));
66
+ if (item) {
67
+ const indexEscape = ansiCodes.indexOf(item.toString());
68
+ if (indexEscape === -1) {
69
+ output.push(wrapAnsi(isEscapes ? item : ansiCodeOrigin));
70
+ } else {
71
+ ansiCodes.splice(indexEscape, 1);
72
+ }
73
+ } else if (isEscapes) {
74
+ output.push(wrapAnsi(0));
75
+ break;
76
+ } else {
77
+ output.push(wrapAnsi(ansiCodeOrigin));
78
+ }
79
+ }
80
+
81
+ if (isEscapes) {
82
+ output = output.filter((element, index) => output.indexOf(element) === index);
83
+
84
+ if (endAnsiCode !== undefined) {
85
+ const fistEscapeCode = wrapAnsi(ansiStyles.codes.get(Number.parseInt(endAnsiCode, 10)));
86
+ // TODO: Remove the use of `.reduce` here.
87
+ // eslint-disable-next-line unicorn/no-array-reduce
88
+ output = output.reduce((current, next) => next === fistEscapeCode ? [next, ...current] : [...current, next], []);
89
+ }
90
+ }
91
+
92
+ return output.join('');
93
+ };
94
+
95
+ function sliceAnsi(string, begin, end) {
96
+ const characters = [...string];
97
+ const ansiCodes = [];
98
+
99
+ let stringEnd = typeof end === 'number' ? end : characters.length;
100
+ let isInsideEscape = false;
101
+ let ansiCode;
102
+ let visible = 0;
103
+ let output = '';
104
+
105
+ for (const [index, character] of characters.entries()) {
106
+ let leftEscape = false;
107
+
108
+ if (ESCAPES.includes(character)) {
109
+ const code = /\d[^m]*/.exec(string.slice(index, index + 18));
110
+ ansiCode = code && code.length > 0 ? code[0] : undefined;
111
+
112
+ if (visible < stringEnd) {
113
+ isInsideEscape = true;
114
+
115
+ if (ansiCode !== undefined) {
116
+ ansiCodes.push(ansiCode);
117
+ }
118
+ }
119
+ } else if (isInsideEscape && character === 'm') {
120
+ isInsideEscape = false;
121
+ leftEscape = true;
122
+ }
123
+
124
+ if (!isInsideEscape && !leftEscape) {
125
+ visible++;
126
+ }
127
+
128
+ if (!astralRegex.test(character) && isFullwidthCodePoint(character.codePointAt())) {
129
+ visible++;
130
+
131
+ if (typeof end !== 'number') {
132
+ stringEnd++;
133
+ }
134
+ }
135
+
136
+ if (visible > begin && visible <= stringEnd) {
137
+ output += character;
138
+ } else if (visible === begin && !isInsideEscape && ansiCode !== undefined) {
139
+ output = checkAnsi(ansiCodes);
140
+ } else if (visible >= stringEnd) {
141
+ output += checkAnsi(ansiCodes, true, ansiCode);
142
+ break;
143
+ }
144
+ }
145
+
146
+ return output;
147
+ }
148
+
149
+ function ansiRegex({onlyFirst = false} = {}) {
150
+ const pattern = [
151
+ '[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)',
152
+ '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))'
153
+ ].join('|');
154
+
155
+ return new RegExp(pattern, onlyFirst ? undefined : 'g');
156
+ }
157
+
158
+ function stripAnsi(string) {
159
+ if (typeof string !== 'string') {
160
+ throw new TypeError(`Expected a \`string\`, got \`${typeof string}\``);
161
+ }
162
+
163
+ return string.replace(ansiRegex(), '');
164
+ }
165
+
166
+ var emojiRegex = function () {
167
+ // https://mths.be/emoji
168
+ 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;
169
+ };
170
+
171
+ function stringWidth(string, options = {}) {
172
+ if (typeof string !== 'string' || string.length === 0) {
173
+ return 0;
174
+ }
175
+
176
+ options = {
177
+ ambiguousIsNarrow: true,
178
+ ...options
179
+ };
180
+
181
+ string = stripAnsi(string);
182
+
183
+ if (string.length === 0) {
184
+ return 0;
185
+ }
186
+
187
+ string = string.replace(emojiRegex(), ' ');
188
+
189
+ const ambiguousCharacterWidth = options.ambiguousIsNarrow ? 1 : 2;
190
+ let width = 0;
191
+
192
+ for (const character of string) {
193
+ const codePoint = character.codePointAt(0);
194
+
195
+ // Ignore control characters
196
+ if (codePoint <= 0x1F || (codePoint >= 0x7F && codePoint <= 0x9F)) {
197
+ continue;
198
+ }
199
+
200
+ // Ignore combining characters
201
+ if (codePoint >= 0x300 && codePoint <= 0x36F) {
202
+ continue;
203
+ }
204
+
205
+ const code = eastAsianWidth.eastAsianWidth(character);
206
+ switch (code) {
207
+ case 'F':
208
+ case 'W':
209
+ width += 2;
210
+ break;
211
+ case 'A':
212
+ width += ambiguousCharacterWidth;
213
+ break;
214
+ default:
215
+ width += 1;
216
+ }
217
+ }
218
+
219
+ return width;
220
+ }
221
+
222
+ function getIndexOfNearestSpace(string, wantedIndex, shouldSearchRight) {
223
+ if (string.charAt(wantedIndex) === ' ') {
224
+ return wantedIndex;
225
+ }
226
+
227
+ for (let index = 1; index <= 3; index++) {
228
+ if (shouldSearchRight) {
229
+ if (string.charAt(wantedIndex + index) === ' ') {
230
+ return wantedIndex + index;
231
+ }
232
+ } else if (string.charAt(wantedIndex - index) === ' ') {
233
+ return wantedIndex - index;
234
+ }
235
+ }
236
+
237
+ return wantedIndex;
238
+ }
239
+
240
+ function cliTruncate(text, columns, options) {
241
+ options = {
242
+ position: 'end',
243
+ preferTruncationOnSpace: false,
244
+ truncationCharacter: '…',
245
+ ...options,
246
+ };
247
+
248
+ const {position, space, preferTruncationOnSpace} = options;
249
+ let {truncationCharacter} = options;
250
+
251
+ if (typeof text !== 'string') {
252
+ throw new TypeError(`Expected \`input\` to be a string, got ${typeof text}`);
253
+ }
254
+
255
+ if (typeof columns !== 'number') {
256
+ throw new TypeError(`Expected \`columns\` to be a number, got ${typeof columns}`);
257
+ }
258
+
259
+ if (columns < 1) {
260
+ return '';
261
+ }
262
+
263
+ if (columns === 1) {
264
+ return truncationCharacter;
265
+ }
266
+
267
+ const length = stringWidth(text);
268
+
269
+ if (length <= columns) {
270
+ return text;
271
+ }
272
+
273
+ if (position === 'start') {
274
+ if (preferTruncationOnSpace) {
275
+ const nearestSpace = getIndexOfNearestSpace(text, length - columns + 1, true);
276
+ return truncationCharacter + sliceAnsi(text, nearestSpace, length).trim();
277
+ }
278
+
279
+ if (space === true) {
280
+ truncationCharacter += ' ';
281
+ }
282
+
283
+ return truncationCharacter + sliceAnsi(text, length - columns + stringWidth(truncationCharacter), length);
284
+ }
285
+
286
+ if (position === 'middle') {
287
+ if (space === true) {
288
+ truncationCharacter = ` ${truncationCharacter} `;
289
+ }
290
+
291
+ const half = Math.floor(columns / 2);
292
+
293
+ if (preferTruncationOnSpace) {
294
+ const spaceNearFirstBreakPoint = getIndexOfNearestSpace(text, half);
295
+ const spaceNearSecondBreakPoint = getIndexOfNearestSpace(text, length - (columns - half) + 1, true);
296
+ return sliceAnsi(text, 0, spaceNearFirstBreakPoint) + truncationCharacter + sliceAnsi(text, spaceNearSecondBreakPoint, length).trim();
297
+ }
298
+
299
+ return (
300
+ sliceAnsi(text, 0, half)
301
+ + truncationCharacter
302
+ + sliceAnsi(text, length - (columns - half) + stringWidth(truncationCharacter), length)
303
+ );
304
+ }
305
+
306
+ if (position === 'end') {
307
+ if (preferTruncationOnSpace) {
308
+ const nearestSpace = getIndexOfNearestSpace(text, columns - 1);
309
+ return sliceAnsi(text, 0, nearestSpace) + truncationCharacter;
310
+ }
311
+
312
+ if (space === true) {
313
+ truncationCharacter = ` ${truncationCharacter}`;
314
+ }
315
+
316
+ return sliceAnsi(text, 0, columns - stringWidth(truncationCharacter)) + truncationCharacter;
317
+ }
318
+
319
+ throw new Error(`Expected \`options.position\` to be either \`start\`, \`middle\` or \`end\`, got ${position}`);
320
+ }
321
+
322
+ const lineSplitRE = /\r?\n/;
323
+ const stackIgnorePatterns = [
324
+ "node:internal",
325
+ "/vitest/dist/",
326
+ "/vitest/src/",
327
+ "/vite-node/dist/",
328
+ "/vite-node/src/",
329
+ "/node_modules/chai/",
330
+ "/node_modules/tinypool/",
331
+ "/node_modules/tinyspy/"
332
+ ];
333
+ function extractLocation(urlLike) {
334
+ if (!urlLike.includes(":"))
335
+ return [urlLike];
336
+ const regExp = /(.+?)(?::(\d+))?(?::(\d+))?$/;
337
+ const parts = regExp.exec(urlLike.replace(/[()]/g, ""));
338
+ if (!parts)
339
+ return [urlLike];
340
+ return [parts[1], parts[2] || void 0, parts[3] || void 0];
341
+ }
342
+ function parseSingleStack(raw) {
343
+ let line = raw.trim();
344
+ if (line.includes("(eval "))
345
+ line = line.replace(/eval code/g, "eval").replace(/(\(eval at [^()]*)|(,.*$)/g, "");
346
+ let sanitizedLine = line.replace(/^\s+/, "").replace(/\(eval code/g, "(").replace(/^.*?\s+/, "");
347
+ const location = sanitizedLine.match(/ (\(.+\)$)/);
348
+ sanitizedLine = location ? sanitizedLine.replace(location[0], "") : sanitizedLine;
349
+ const [url, lineNumber, columnNumber] = extractLocation(location ? location[1] : sanitizedLine);
350
+ let method = location && sanitizedLine || "";
351
+ let file = url && ["eval", "<anonymous>"].includes(url) ? void 0 : url;
352
+ if (!file || !lineNumber || !columnNumber)
353
+ return null;
354
+ if (method.startsWith("async "))
355
+ method = method.slice(6);
356
+ if (file.startsWith("file://"))
357
+ file = file.slice(7);
358
+ file = resolve(file);
359
+ return {
360
+ method,
361
+ file,
362
+ line: parseInt(lineNumber),
363
+ column: parseInt(columnNumber)
364
+ };
365
+ }
366
+ function parseStacktrace(e, full = false) {
367
+ if (!e)
368
+ return [];
369
+ if (e.stacks)
370
+ return e.stacks;
371
+ const stackStr = e.stack || e.stackStr || "";
372
+ const stackFrames = stackStr.split("\n").map((raw) => {
373
+ const stack = parseSingleStack(raw);
374
+ if (!stack || !full && stackIgnorePatterns.some((p) => stack.file.includes(p)))
375
+ return null;
376
+ return stack;
377
+ }).filter(notNullish);
378
+ e.stacks = stackFrames;
379
+ return stackFrames;
380
+ }
381
+ function positionToOffset(source, lineNumber, columnNumber) {
382
+ const lines = source.split(lineSplitRE);
383
+ let start = 0;
384
+ if (lineNumber > lines.length)
385
+ return source.length;
386
+ for (let i = 0; i < lineNumber - 1; i++)
387
+ start += lines[i].length + 1;
388
+ return start + columnNumber;
389
+ }
390
+ function offsetToLineNumber(source, offset) {
391
+ if (offset > source.length) {
392
+ throw new Error(
393
+ `offset is longer than source length! offset ${offset} > length ${source.length}`
394
+ );
395
+ }
396
+ const lines = source.split(lineSplitRE);
397
+ let counted = 0;
398
+ let line = 0;
399
+ for (; line < lines.length; line++) {
400
+ const lineLength = lines[line].length + 1;
401
+ if (counted + lineLength >= offset)
402
+ break;
403
+ counted += lineLength;
404
+ }
405
+ return line + 1;
406
+ }
407
+
408
+ export { positionToOffset as a, parseStacktrace as b, cliTruncate as c, stringWidth as d, sliceAnsi as e, lineSplitRE as l, offsetToLineNumber as o, parseSingleStack as p, stripAnsi as s };