vitest 0.27.2 → 0.28.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 (64) hide show
  1. package/LICENSE.md +4 -93
  2. package/browser.d.ts +1 -1
  3. package/dist/browser.d.ts +11 -13
  4. package/dist/browser.js +10 -34
  5. package/dist/{chunk-api-setup.029198e3.js → chunk-api-setup.52751a38.js} +27 -12
  6. package/dist/chunk-constants.797d3ebf.js +42 -0
  7. package/dist/{chunk-env-node.787e9561.js → chunk-env-node.ffd1183b.js} +26 -0
  8. package/dist/{chunk-install-pkg.7b006b3e.js → chunk-install-pkg.cfd23146.js} +51 -11
  9. package/dist/chunk-integrations-coverage.48e6286b.js +3993 -0
  10. package/dist/chunk-integrations-globals.0d5f50f0.js +29 -0
  11. package/dist/chunk-integrations-run-once.38756e30.js +27 -0
  12. package/dist/chunk-integrations-utils.f1f6f1ed.js +118 -0
  13. package/dist/{chunk-node-git.125c9008.js → chunk-node-git.d9ad64ab.js} +6 -7
  14. package/dist/{chunk-snapshot-manager.ce714e21.js → chunk-node-pkg.dcdf4369.js} +12653 -9324
  15. package/dist/{chunk-runtime-mocker.58511c38.js → chunk-runtime-mocker.03017e8c.js} +14 -13
  16. package/dist/{chunk-runtime-rpc.d709e91b.js → chunk-runtime-rpc.9c0386cc.js} +3 -2
  17. package/dist/chunk-runtime-setup.d9302cfd.js +20 -0
  18. package/dist/chunk-snapshot-env.6457638e.js +11 -0
  19. package/dist/chunk-utils-base.977ae74f.js +77 -0
  20. package/dist/chunk-utils-env.860d90c2.js +6 -0
  21. package/dist/chunk-utils-global.442d1d33.js +73 -0
  22. package/dist/{chunk-utils-import.054ab315.js → chunk-utils-import.9911c99d.js} +3289 -169
  23. package/dist/chunk-utils-tasks.1b603032.js +103 -0
  24. package/dist/cli-wrapper.js +8 -6
  25. package/dist/cli.js +18 -15
  26. package/dist/config.cjs +10 -7
  27. package/dist/config.d.ts +22 -4
  28. package/dist/config.js +10 -8
  29. package/dist/entry.js +244 -28
  30. package/dist/env-afee91f0.d.ts +10 -0
  31. package/dist/environments.d.ts +7 -2
  32. package/dist/environments.js +1 -1
  33. package/dist/index.d.ts +160 -11
  34. package/dist/index.js +18 -18
  35. package/dist/loader.js +9 -8
  36. package/dist/node.d.ts +9 -7
  37. package/dist/node.js +20 -17
  38. package/dist/runners-chunk.js +215 -0
  39. package/dist/runners.d.ts +39 -0
  40. package/dist/runners.js +18 -0
  41. package/dist/spy.js +1 -2
  42. package/dist/suite.d.ts +2 -0
  43. package/dist/suite.js +2 -18
  44. package/dist/{types-d97c72c7.d.ts → types-c800444e.d.ts} +196 -437
  45. package/dist/{vendor-index.e6c27006.js → vendor-index.618ca5a1.js} +1078 -10
  46. package/dist/{vendor-index.b0346fe4.js → vendor-index.bdee400f.js} +1 -0
  47. package/dist/worker.js +17 -16
  48. package/package.json +22 -12
  49. package/runners.d.ts +1 -0
  50. package/suite.d.ts +1 -0
  51. package/dist/chunk-integrations-coverage.44413252.js +0 -240
  52. package/dist/chunk-integrations-globals.0024ce21.js +0 -27
  53. package/dist/chunk-mock-date.c543fa3e.js +0 -349
  54. package/dist/chunk-runtime-chain.2da9e75c.js +0 -2595
  55. package/dist/chunk-runtime-error.de671af0.js +0 -144
  56. package/dist/chunk-runtime-setup.35da9209.js +0 -649
  57. package/dist/chunk-utils-env.f4a39d2c.js +0 -228
  58. package/dist/chunk-utils-source-map.5f5d12cf.js +0 -408
  59. package/dist/chunk-utils-timers.52534f96.js +0 -3573
  60. package/dist/index-50755efe.d.ts +0 -258
  61. package/dist/vendor-index.451e37bc.js +0 -1071
  62. package/dist/vendor-index.723a074f.js +0 -102
  63. package/dist/vendor-index.9c919048.js +0 -61
  64. package/dist/vendor-index.9f20a9be.js +0 -6291
@@ -1,228 +0,0 @@
1
- import url from 'node:url';
2
- import k from 'path';
3
-
4
- function normalizeWindowsPath(input = "") {
5
- if (!input.includes("\\")) {
6
- return input;
7
- }
8
- return input.replace(/\\/g, "/");
9
- }
10
-
11
- const _UNC_REGEX = /^[/][/]/;
12
- const _UNC_DRIVE_REGEX = /^[/][/]([.]{1,2}[/])?([a-zA-Z]):[/]/;
13
- const _IS_ABSOLUTE_RE = /^\/|^\\|^[a-zA-Z]:[/\\]/;
14
- const sep = "/";
15
- const delimiter = ":";
16
- const normalize = function(path2) {
17
- if (path2.length === 0) {
18
- return ".";
19
- }
20
- path2 = normalizeWindowsPath(path2);
21
- const isUNCPath = path2.match(_UNC_REGEX);
22
- const hasUNCDrive = isUNCPath && path2.match(_UNC_DRIVE_REGEX);
23
- const isPathAbsolute = isAbsolute(path2);
24
- const trailingSeparator = path2[path2.length - 1] === "/";
25
- path2 = normalizeString(path2, !isPathAbsolute);
26
- if (path2.length === 0) {
27
- if (isPathAbsolute) {
28
- return "/";
29
- }
30
- return trailingSeparator ? "./" : ".";
31
- }
32
- if (trailingSeparator) {
33
- path2 += "/";
34
- }
35
- if (isUNCPath) {
36
- if (hasUNCDrive) {
37
- return `//./${path2}`;
38
- }
39
- return `//${path2}`;
40
- }
41
- return isPathAbsolute && !isAbsolute(path2) ? `/${path2}` : path2;
42
- };
43
- const join = function(...args) {
44
- if (args.length === 0) {
45
- return ".";
46
- }
47
- let joined;
48
- for (let i = 0; i < args.length; ++i) {
49
- const arg = args[i];
50
- if (arg.length > 0) {
51
- if (joined === void 0) {
52
- joined = arg;
53
- } else {
54
- joined += `/${arg}`;
55
- }
56
- }
57
- }
58
- if (joined === void 0) {
59
- return ".";
60
- }
61
- return normalize(joined);
62
- };
63
- const resolve = function(...args) {
64
- args = args.map((arg) => normalizeWindowsPath(arg));
65
- let resolvedPath = "";
66
- let resolvedAbsolute = false;
67
- for (let i = args.length - 1; i >= -1 && !resolvedAbsolute; i--) {
68
- const path2 = i >= 0 ? args[i] : process.cwd();
69
- if (path2.length === 0) {
70
- continue;
71
- }
72
- resolvedPath = `${path2}/${resolvedPath}`;
73
- resolvedAbsolute = isAbsolute(path2);
74
- }
75
- resolvedPath = normalizeString(resolvedPath, !resolvedAbsolute);
76
- if (resolvedAbsolute && !isAbsolute(resolvedPath)) {
77
- return `/${resolvedPath}`;
78
- }
79
- return resolvedPath.length > 0 ? resolvedPath : ".";
80
- };
81
- function normalizeString(path2, allowAboveRoot) {
82
- let res = "";
83
- let lastSegmentLength = 0;
84
- let lastSlash = -1;
85
- let dots = 0;
86
- let char = null;
87
- for (let i = 0; i <= path2.length; ++i) {
88
- if (i < path2.length) {
89
- char = path2[i];
90
- } else if (char === "/") {
91
- break;
92
- } else {
93
- char = "/";
94
- }
95
- if (char === "/") {
96
- if (lastSlash === i - 1 || dots === 1) ; else if (dots === 2) {
97
- if (res.length < 2 || lastSegmentLength !== 2 || res[res.length - 1] !== "." || res[res.length - 2] !== ".") {
98
- if (res.length > 2) {
99
- const lastSlashIndex = res.lastIndexOf("/");
100
- if (lastSlashIndex === -1) {
101
- res = "";
102
- lastSegmentLength = 0;
103
- } else {
104
- res = res.slice(0, lastSlashIndex);
105
- lastSegmentLength = res.length - 1 - res.lastIndexOf("/");
106
- }
107
- lastSlash = i;
108
- dots = 0;
109
- continue;
110
- } else if (res.length !== 0) {
111
- res = "";
112
- lastSegmentLength = 0;
113
- lastSlash = i;
114
- dots = 0;
115
- continue;
116
- }
117
- }
118
- if (allowAboveRoot) {
119
- res += res.length > 0 ? "/.." : "..";
120
- lastSegmentLength = 2;
121
- }
122
- } else {
123
- if (res.length > 0) {
124
- res += `/${path2.slice(lastSlash + 1, i)}`;
125
- } else {
126
- res = path2.slice(lastSlash + 1, i);
127
- }
128
- lastSegmentLength = i - lastSlash - 1;
129
- }
130
- lastSlash = i;
131
- dots = 0;
132
- } else if (char === "." && dots !== -1) {
133
- ++dots;
134
- } else {
135
- dots = -1;
136
- }
137
- }
138
- return res;
139
- }
140
- const isAbsolute = function(p) {
141
- return _IS_ABSOLUTE_RE.test(p);
142
- };
143
- const toNamespacedPath = function(p) {
144
- return normalizeWindowsPath(p);
145
- };
146
- const extname = function(p) {
147
- return k.posix.extname(normalizeWindowsPath(p));
148
- };
149
- const relative = function(from, to) {
150
- return k.posix.relative(normalizeWindowsPath(from), normalizeWindowsPath(to));
151
- };
152
- const dirname = function(p) {
153
- return k.posix.dirname(normalizeWindowsPath(p));
154
- };
155
- const format = function(p) {
156
- return normalizeWindowsPath(k.posix.format(p));
157
- };
158
- const basename = function(p, ext) {
159
- return k.posix.basename(normalizeWindowsPath(p), ext);
160
- };
161
- const parse = function(p) {
162
- return k.posix.parse(normalizeWindowsPath(p));
163
- };
164
-
165
- const _path = /*#__PURE__*/Object.freeze({
166
- __proto__: null,
167
- sep: sep,
168
- delimiter: delimiter,
169
- normalize: normalize,
170
- join: join,
171
- resolve: resolve,
172
- normalizeString: normalizeString,
173
- isAbsolute: isAbsolute,
174
- toNamespacedPath: toNamespacedPath,
175
- extname: extname,
176
- relative: relative,
177
- dirname: dirname,
178
- format: format,
179
- basename: basename,
180
- parse: parse
181
- });
182
-
183
- ({
184
- ..._path
185
- });
186
-
187
- var _a;
188
- const isNode = typeof process < "u" && typeof process.stdout < "u" && !((_a = process.versions) == null ? void 0 : _a.deno) && !globalThis.window;
189
- const isBrowser = typeof window !== "undefined";
190
-
191
- const rootDir = isNode ? resolve(url.fileURLToPath(import.meta.url), "../../") : import.meta.url;
192
- const distDir = isNode ? resolve(url.fileURLToPath(import.meta.url), "../../dist") : import.meta.url;
193
- const defaultPort = 51204;
194
- const EXIT_CODE_RESTART = 43;
195
- const API_PATH = "/__vitest_api__";
196
- const configFiles = [
197
- "vitest.config.ts",
198
- "vitest.config.mts",
199
- "vitest.config.cts",
200
- "vitest.config.js",
201
- "vitest.config.mjs",
202
- "vitest.config.cjs",
203
- "vite.config.ts",
204
- "vite.config.mts",
205
- "vite.config.cts",
206
- "vite.config.js",
207
- "vite.config.mjs",
208
- "vite.config.cjs"
209
- ];
210
- const globalApis = [
211
- "suite",
212
- "test",
213
- "describe",
214
- "it",
215
- "chai",
216
- "expect",
217
- "assert",
218
- "expectTypeOf",
219
- "assertType",
220
- "vitest",
221
- "vi",
222
- "beforeAll",
223
- "afterAll",
224
- "beforeEach",
225
- "afterEach"
226
- ];
227
-
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,408 +0,0 @@
1
- import { d as ansiStyles, e as eastAsianWidth } from './chunk-utils-timers.52534f96.js';
2
- import { b as resolve } from './chunk-utils-env.f4a39d2c.js';
3
- import { j as notNullish } from './chunk-mock-date.c543fa3e.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 };