vitest 0.26.3 → 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 (39) 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.47a09f0f.js → chunk-api-setup.16ac28c0.js} +9 -4
  5. package/dist/{chunk-integrations-coverage.befed097.js → chunk-integrations-coverage.44413252.js} +19 -1
  6. package/dist/chunk-integrations-globals.3dfaeb99.js +27 -0
  7. package/dist/{chunk-typecheck-constants.06e1fe5b.js → chunk-mock-date.a1c85759.js} +9 -27
  8. package/dist/{chunk-node-git.a90c0582.js → chunk-node-git.543e964a.js} +1 -2
  9. package/dist/{chunk-runtime-chain.f51aa930.js → chunk-runtime-chain.6df5a66b.js} +1191 -1027
  10. package/dist/{chunk-runtime-error.f5c8aaf2.js → chunk-runtime-error.fad2c32b.js} +2 -2
  11. package/dist/{chunk-runtime-mocker.887bf8c8.js → chunk-runtime-mocker.a677dd28.js} +8 -6
  12. package/dist/{chunk-runtime-rpc.54d72169.js → chunk-runtime-rpc.7f83c8a9.js} +2 -2
  13. package/dist/{chunk-runtime-setup.a06d5c72.js → chunk-runtime-setup.731b2b04.js} +51 -52
  14. package/dist/{chunk-snapshot-manager.70695b70.js → chunk-snapshot-manager.700322bf.js} +408 -272
  15. package/dist/{chunk-utils-env.3fdc1793.js → chunk-utils-env.b861e3a0.js} +1 -63
  16. package/dist/{chunk-utils-import.e7f64637.js → chunk-utils-import.2baa69a9.js} +22 -8
  17. package/dist/chunk-utils-source-map.60562959.js +408 -0
  18. package/dist/{chunk-utils-timers.715da787.js → chunk-utils-timers.52534f96.js} +2977 -3458
  19. package/dist/cli-wrapper.js +11 -11
  20. package/dist/cli.js +12 -624
  21. package/dist/config.cjs +2 -1
  22. package/dist/config.d.ts +1 -1
  23. package/dist/config.js +2 -1
  24. package/dist/entry.js +14 -14
  25. package/dist/environments.d.ts +1 -1
  26. package/dist/{index-761e769b.d.ts → index-2d10c3fd.d.ts} +1 -1
  27. package/dist/index.d.ts +4 -4
  28. package/dist/index.js +12 -12
  29. package/dist/loader.js +3 -3
  30. package/dist/node.d.ts +2 -2
  31. package/dist/node.js +8 -8
  32. package/dist/spy.js +2 -102
  33. package/dist/suite.js +10 -10
  34. package/dist/{types-bae746aa.d.ts → types-e1e1d1e5.d.ts} +88 -76
  35. package/dist/vendor-index.723a074f.js +102 -0
  36. package/dist/worker.js +7 -7
  37. package/package.json +9 -5
  38. package/dist/chunk-integrations-globals.ee28730b.js +0 -27
  39. package/dist/chunk-utils-source-map.5278ee22.js +0 -86
@@ -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,10 +1,10 @@
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.f51aa930.js';
2
- import { g as getWorkerState, R as RealDate, r as resetDate, m as mockDate, a as resetModules } from './chunk-typecheck-constants.06e1fe5b.js';
3
- import { p as parseStacktrace } from './chunk-utils-source-map.5278ee22.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.715da787.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
 
@@ -88,6 +88,19 @@ function resetRunOnceCounter() {
88
88
  filesCount.clear();
89
89
  }
90
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
+
91
104
  /**
92
105
  * A reference to the global object
93
106
  *
@@ -2811,9 +2824,10 @@ class VitestUtils {
2811
2824
  return this;
2812
2825
  }
2813
2826
  getImporter() {
2814
- const err = new Error("mock");
2815
- const [, , importer] = parseStacktrace(err, true);
2816
- 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) || "";
2817
2831
  }
2818
2832
  mock(path, factory) {
2819
2833
  const importer = 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 };