vitest-tiny-reporter 1.2.0 → 1.3.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.
package/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # vitest-tiny-reporter
2
2
 
3
3
  [![npm](https://img.shields.io/npm/v/vitest-tiny-reporter?style=flat-square)](https://www.npmjs.com/package/vitest-tiny-reporter?activeTab=versions)
4
- [![npm bundle size](https://img.shields.io/bundlephobia/minzip/vitest-tiny-reporter?style=flat-square)](https://bundlephobia.com/package/vitest-tiny-reporter)
4
+ [![install size](https://flat.badgen.net/packagephobia/install/vitest-tiny-reporter)](https://packagephobia.com/result?p=vitest-tiny-reporter)
5
5
  [![NPM](https://img.shields.io/npm/l/vitest-tiny-reporter?style=flat-square)](https://raw.githubusercontent.com/manbearwiz/vitest-tiny-reporter/master/LICENSE)
6
6
  [![npm](https://img.shields.io/npm/dt/vitest-tiny-reporter?style=flat-square)](https://www.npmjs.com/package/vitest-tiny-reporter)
7
7
  [![GitHub issues](https://img.shields.io/github/issues/manbearwiz/vitest-tiny-reporter?style=flat-square)](https://github.com/manbearwiz/vitest-tiny-reporter/issues)
@@ -1,72 +1,58 @@
1
- var u = Object.defineProperty;
2
- var $ = (e, t, o) => t in e ? u(e, t, { enumerable: !0, configurable: !0, writable: !0, value: o }) : e[t] = o;
3
- var g = (e, t, o) => $(e, typeof t != "symbol" ? t + "" : t, o);
4
- import s from "tinyrainbow";
5
- function T(e) {
6
- return e == null && (e = []), Array.isArray(e) ? e : [e];
1
+ import e from "tinyrainbow";
2
+ function h(s) {
3
+ return s == null && (s = []), Array.isArray(s) ? s : [s];
7
4
  }
8
- function c(e) {
9
- return e.type === "test";
5
+ function g(s) {
6
+ return s.type === "test";
10
7
  }
11
- function h(e) {
12
- const t = [], o = T(e);
13
- for (const i of o)
14
- if (c(i))
15
- t.push(i);
8
+ function a(s) {
9
+ const t = [], r = h(s);
10
+ for (const o of r)
11
+ if (g(o))
12
+ t.push(o);
16
13
  else
17
- for (const n of i.tasks)
18
- if (c(n))
19
- t.push(n);
14
+ for (const i of o.tasks)
15
+ if (g(i))
16
+ t.push(i);
20
17
  else {
21
- const d = h(n);
22
- for (const l of d)
23
- t.push(l);
18
+ const d = a(i);
19
+ for (const n of d)
20
+ t.push(n);
24
21
  }
25
22
  return t;
26
23
  }
27
- class x {
28
- constructor() {
29
- // biome-ignore lint/style/noNonNullAssertion: Non-null assertion is allowed here because the onInit method is called before any other method
30
- g(this, "ctx");
31
- g(this, "verbose", !1);
32
- g(this, "padTitle", (t) => s.dim(`${t.padStart(11)} `));
33
- }
24
+ class u {
25
+ // biome-ignore lint/style/noNonNullAssertion: Non-null assertion is allowed here because the onInit method is called before any other method
26
+ ctx = void 0;
27
+ verbose = !1;
34
28
  onInit(t) {
35
29
  this.ctx = t;
36
30
  }
37
- onFinished(t = this.ctx.state.getFiles(), o = this.ctx.state.getUnhandledErrors()) {
38
- const { logger: i } = this.ctx, n = h(t), d = n.filter((p) => {
39
- var a;
40
- return ((a = p.result) == null ? void 0 : a.state) === "fail";
41
- }).length, l = !(d + o.length), r = l ? "✔ PASS" : "✖ FAIL", f = l ? s.green : s.red;
42
- i.log(
43
- `${f(s.bold(s.inverse(` ${r} `)))} ${f(
44
- l ? "All tests passed" : `${d} test${d > 1 ? "s" : ""} failed`
31
+ onFinished(t = this.ctx.state.getFiles(), r = this.ctx.state.getUnhandledErrors()) {
32
+ const { logger: o } = this.ctx, i = a(t), d = i.filter((c) => c.result?.state === "fail").length, n = !(d + r.length), l = n ? "✔ PASS" : "✖ FAIL", f = n ? e.green : e.red;
33
+ o.log(
34
+ `${f(e.bold(e.inverse(` ${l} `)))} ${f(
35
+ n ? "All tests passed" : `${d} test${d > 1 ? "s" : ""} failed`
45
36
  )}`
46
- ), i.log(this.padTitle("Test Files"), this.getStateString(t)), i.log(this.padTitle("Tests"), this.getStateString(n)), o.length && i.log(
37
+ ), o.log(this.padTitle("Test Files"), this.getStateString(t)), o.log(this.padTitle("Tests"), this.getStateString(i)), r.length && o.log(
47
38
  this.padTitle("Errors"),
48
- s.bold(s.red(`${o.length} error${o.length > 1 ? "s" : ""}`))
49
- ), l || (process.exitCode = 1);
39
+ e.bold(e.red(`${r.length} error${r.length > 1 ? "s" : ""}`))
40
+ ), n || (process.exitCode = 1);
50
41
  }
51
- getStateString(t, o = "tests") {
42
+ padTitle = (t) => e.dim(`${t.padStart(11)} `);
43
+ getStateString(t, r = "tests") {
52
44
  if (!t.length)
53
- return s.dim(`no ${o}`);
54
- const i = t.filter((r) => {
55
- var f;
56
- return ((f = r.result) == null ? void 0 : f.state) === "pass";
57
- }).length, n = t.filter((r) => {
58
- var f;
59
- return ((f = r.result) == null ? void 0 : f.state) === "fail";
60
- }).length, d = t.filter((r) => r.mode === "skip").length, l = t.filter((r) => r.mode === "todo").length;
45
+ return e.dim(`no ${r}`);
46
+ const o = t.filter((l) => l.result?.state === "pass").length, i = t.filter((l) => l.result?.state === "fail").length, d = t.filter((l) => l.mode === "skip").length, n = t.filter((l) => l.mode === "todo").length;
61
47
  return [
62
- n && s.bold(s.red(`${n} failed`)),
63
- i && s.bold(s.green(`${i} passed`)),
64
- d && s.yellow(`${d} skipped`),
65
- l && s.gray(`${l} todo`)
66
- ].filter(Boolean).join(s.dim(" | ")) + s.gray(` (${t.length})`);
48
+ i && e.bold(e.red(`${i} failed`)),
49
+ o && e.bold(e.green(`${o} passed`)),
50
+ d && e.yellow(`${d} skipped`),
51
+ n && e.gray(`${n} todo`)
52
+ ].filter(Boolean).join(e.dim(" | ")) + e.gray(` (${t.length})`);
67
53
  }
68
54
  }
69
55
  export {
70
- x as default
56
+ u as default
71
57
  };
72
58
  //# sourceMappingURL=vitest-tiny-reporter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"vitest-tiny-reporter.js","sources":["../node_modules/@vitest/utils/dist/helpers.js","../node_modules/@vitest/runner/dist/chunk-tasks.js","../src/index.ts"],"sourcesContent":["function createSimpleStackTrace(options) {\n const { message = \"$$stack trace error\", stackTraceLimit = 1 } = options || {};\n const limit = Error.stackTraceLimit;\n const prepareStackTrace = Error.prepareStackTrace;\n Error.stackTraceLimit = stackTraceLimit;\n Error.prepareStackTrace = (e) => e.stack;\n const err = new Error(message);\n const stackTrace = err.stack || \"\";\n Error.prepareStackTrace = prepareStackTrace;\n Error.stackTraceLimit = limit;\n return stackTrace;\n}\nfunction notNullish(v) {\n return v != null;\n}\nfunction assertTypes(value, name, types) {\n const receivedType = typeof value;\n const pass = types.includes(receivedType);\n if (!pass) {\n throw new TypeError(\n `${name} value must be ${types.join(\" or \")}, received \"${receivedType}\"`\n );\n }\n}\nfunction isPrimitive(value) {\n return value === null || typeof value !== \"function\" && typeof value !== \"object\";\n}\nfunction slash(path) {\n return path.replace(/\\\\/g, \"/\");\n}\nfunction parseRegexp(input) {\n const m = input.match(/(\\/?)(.+)\\1([a-z]*)/i);\n if (!m) {\n return /$^/;\n }\n if (m[3] && !/^(?!.*?(.).*?\\1)[gmixXsuUAJ]+$/.test(m[3])) {\n return new RegExp(input);\n }\n return new RegExp(m[2], m[3]);\n}\nfunction toArray(array) {\n if (array === null || array === undefined) {\n array = [];\n }\n if (Array.isArray(array)) {\n return array;\n }\n return [array];\n}\nfunction isObject(item) {\n return item != null && typeof item === \"object\" && !Array.isArray(item);\n}\nfunction isFinalObj(obj) {\n return obj === Object.prototype || obj === Function.prototype || obj === RegExp.prototype;\n}\nfunction getType(value) {\n return Object.prototype.toString.apply(value).slice(8, -1);\n}\nfunction collectOwnProperties(obj, collector) {\n const collect = typeof collector === \"function\" ? collector : (key) => collector.add(key);\n Object.getOwnPropertyNames(obj).forEach(collect);\n Object.getOwnPropertySymbols(obj).forEach(collect);\n}\nfunction getOwnProperties(obj) {\n const ownProps = /* @__PURE__ */ new Set();\n if (isFinalObj(obj)) {\n return [];\n }\n collectOwnProperties(obj, ownProps);\n return Array.from(ownProps);\n}\nconst defaultCloneOptions = { forceWritable: false };\nfunction deepClone(val, options = defaultCloneOptions) {\n const seen = /* @__PURE__ */ new WeakMap();\n return clone(val, seen, options);\n}\nfunction clone(val, seen, options = defaultCloneOptions) {\n let k, out;\n if (seen.has(val)) {\n return seen.get(val);\n }\n if (Array.isArray(val)) {\n out = Array.from({ length: k = val.length });\n seen.set(val, out);\n while (k--) {\n out[k] = clone(val[k], seen, options);\n }\n return out;\n }\n if (Object.prototype.toString.call(val) === \"[object Object]\") {\n out = Object.create(Object.getPrototypeOf(val));\n seen.set(val, out);\n const props = getOwnProperties(val);\n for (const k2 of props) {\n const descriptor = Object.getOwnPropertyDescriptor(val, k2);\n if (!descriptor) {\n continue;\n }\n const cloned = clone(val[k2], seen, options);\n if (options.forceWritable) {\n Object.defineProperty(out, k2, {\n enumerable: descriptor.enumerable,\n configurable: true,\n writable: true,\n value: cloned\n });\n } else if (\"get\" in descriptor) {\n Object.defineProperty(out, k2, {\n ...descriptor,\n get() {\n return cloned;\n }\n });\n } else {\n Object.defineProperty(out, k2, {\n ...descriptor,\n value: cloned\n });\n }\n }\n return out;\n }\n return val;\n}\nfunction noop() {\n}\nfunction objectAttr(source, path, defaultValue = undefined) {\n const paths = path.replace(/\\[(\\d+)\\]/g, \".$1\").split(\".\");\n let result = source;\n for (const p of paths) {\n result = new Object(result)[p];\n if (result === undefined) {\n return defaultValue;\n }\n }\n return result;\n}\nfunction createDefer() {\n let resolve = null;\n let reject = null;\n const p = new Promise((_resolve, _reject) => {\n resolve = _resolve;\n reject = _reject;\n });\n p.resolve = resolve;\n p.reject = reject;\n return p;\n}\nfunction getCallLastIndex(code) {\n let charIndex = -1;\n let inString = null;\n let startedBracers = 0;\n let endedBracers = 0;\n let beforeChar = null;\n while (charIndex <= code.length) {\n beforeChar = code[charIndex];\n charIndex++;\n const char = code[charIndex];\n const isCharString = char === '\"' || char === \"'\" || char === \"`\";\n if (isCharString && beforeChar !== \"\\\\\") {\n if (inString === char) {\n inString = null;\n } else if (!inString) {\n inString = char;\n }\n }\n if (!inString) {\n if (char === \"(\") {\n startedBracers++;\n }\n if (char === \")\") {\n endedBracers++;\n }\n }\n if (startedBracers && endedBracers && startedBracers === endedBracers) {\n return charIndex;\n }\n }\n return null;\n}\nfunction isNegativeNaN(val) {\n if (!Number.isNaN(val)) {\n return false;\n }\n const f64 = new Float64Array(1);\n f64[0] = val;\n const u32 = new Uint32Array(f64.buffer);\n const isNegative = u32[1] >>> 31 === 1;\n return isNegative;\n}\nfunction toString(v) {\n return Object.prototype.toString.call(v);\n}\nfunction isPlainObject(val) {\n return toString(val) === \"[object Object]\" && (!val.constructor || val.constructor.name === \"Object\");\n}\nfunction isMergeableObject(item) {\n return isPlainObject(item) && !Array.isArray(item);\n}\nfunction deepMerge(target, ...sources) {\n if (!sources.length) {\n return target;\n }\n const source = sources.shift();\n if (source === undefined) {\n return target;\n }\n if (isMergeableObject(target) && isMergeableObject(source)) {\n Object.keys(source).forEach((key) => {\n const _source = source;\n if (isMergeableObject(_source[key])) {\n if (!target[key]) {\n target[key] = {};\n }\n deepMerge(target[key], _source[key]);\n } else {\n target[key] = _source[key];\n }\n });\n }\n return deepMerge(target, ...sources);\n}\n\nexport { assertTypes, clone, createDefer, createSimpleStackTrace, deepClone, deepMerge, getCallLastIndex, getOwnProperties, getType, isNegativeNaN, isObject, isPrimitive, noop, notNullish, objectAttr, parseRegexp, slash, toArray };\n","import { processError } from '@vitest/utils/error';\nimport { relative } from 'pathe';\nimport { toArray } from '@vitest/utils';\n\nfunction createChainable(keys, fn) {\n function create(context) {\n const chain2 = function(...args) {\n return fn.apply(context, args);\n };\n Object.assign(chain2, fn);\n chain2.withContext = () => chain2.bind(context);\n chain2.setContext = (key, value) => {\n context[key] = value;\n };\n chain2.mergeContext = (ctx) => {\n Object.assign(context, ctx);\n };\n for (const key of keys) {\n Object.defineProperty(chain2, key, {\n get() {\n return create({ ...context, [key]: true });\n }\n });\n }\n return chain2;\n }\n const chain = create({});\n chain.fn = fn;\n return chain;\n}\n\nfunction interpretTaskModes(file, namePattern, testLocations, onlyMode, parentIsOnly, allowOnly) {\n const matchedLocations = [];\n const traverseSuite = (suite, parentIsOnly2, parentMatchedWithLocation) => {\n const suiteIsOnly = parentIsOnly2 || suite.mode === \"only\";\n suite.tasks.forEach((t) => {\n const includeTask = suiteIsOnly || t.mode === \"only\";\n if (onlyMode) {\n if (t.type === \"suite\" && (includeTask || someTasksAreOnly(t))) {\n if (t.mode === \"only\") {\n checkAllowOnly(t, allowOnly);\n t.mode = \"run\";\n }\n } else if (t.mode === \"run\" && !includeTask) {\n t.mode = \"skip\";\n } else if (t.mode === \"only\") {\n checkAllowOnly(t, allowOnly);\n t.mode = \"run\";\n }\n }\n let hasLocationMatch = parentMatchedWithLocation;\n if (testLocations !== undefined && testLocations.length !== 0) {\n if (t.location && (testLocations == null ? undefined : testLocations.includes(t.location.line))) {\n t.mode = \"run\";\n matchedLocations.push(t.location.line);\n hasLocationMatch = true;\n } else if (parentMatchedWithLocation) {\n t.mode = \"run\";\n } else if (t.type === \"test\") {\n t.mode = \"skip\";\n }\n }\n if (t.type === \"test\") {\n if (namePattern && !getTaskFullName(t).match(namePattern)) {\n t.mode = \"skip\";\n }\n } else if (t.type === \"suite\") {\n if (t.mode === \"skip\") {\n skipAllTasks(t);\n } else if (t.mode === \"todo\") {\n todoAllTasks(t);\n } else {\n traverseSuite(t, includeTask, hasLocationMatch);\n }\n }\n });\n if (suite.mode === \"run\" || suite.mode === \"queued\") {\n if (suite.tasks.length && suite.tasks.every((i) => i.mode !== \"run\" && i.mode !== \"queued\")) {\n suite.mode = \"skip\";\n }\n }\n };\n traverseSuite(file, parentIsOnly, false);\n const nonMatching = testLocations == null ? undefined : testLocations.filter((loc) => !matchedLocations.includes(loc));\n if (nonMatching && nonMatching.length !== 0) {\n const message = nonMatching.length === 1 ? `line ${nonMatching[0]}` : `lines ${nonMatching.join(\", \")}`;\n if (file.result === undefined) {\n file.result = {\n state: \"fail\",\n errors: []\n };\n }\n if (file.result.errors === undefined) {\n file.result.errors = [];\n }\n file.result.errors.push(\n processError(new Error(`No test found in ${file.name} in ${message}`))\n );\n }\n}\nfunction getTaskFullName(task) {\n return `${task.suite ? `${getTaskFullName(task.suite)} ` : \"\"}${task.name}`;\n}\nfunction someTasksAreOnly(suite) {\n return suite.tasks.some(\n (t) => t.mode === \"only\" || t.type === \"suite\" && someTasksAreOnly(t)\n );\n}\nfunction skipAllTasks(suite) {\n suite.tasks.forEach((t) => {\n if (t.mode === \"run\" || t.mode === \"queued\") {\n t.mode = \"skip\";\n if (t.type === \"suite\") {\n skipAllTasks(t);\n }\n }\n });\n}\nfunction todoAllTasks(suite) {\n suite.tasks.forEach((t) => {\n if (t.mode === \"run\" || t.mode === \"queued\") {\n t.mode = \"todo\";\n if (t.type === \"suite\") {\n todoAllTasks(t);\n }\n }\n });\n}\nfunction checkAllowOnly(task, allowOnly) {\n if (allowOnly) {\n return;\n }\n const error = processError(\n new Error(\n \"[Vitest] Unexpected .only modifier. Remove it or pass --allowOnly argument to bypass this error\"\n )\n );\n task.result = {\n state: \"fail\",\n errors: [error]\n };\n}\nfunction generateHash(str) {\n let hash = 0;\n if (str.length === 0) {\n return `${hash}`;\n }\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash;\n }\n return `${hash}`;\n}\nfunction calculateSuiteHash(parent) {\n parent.tasks.forEach((t, idx) => {\n t.id = `${parent.id}_${idx}`;\n if (t.type === \"suite\") {\n calculateSuiteHash(t);\n }\n });\n}\nfunction createFileTask(filepath, root, projectName, pool) {\n const path = relative(root, filepath);\n const file = {\n id: generateFileHash(path, projectName),\n name: path,\n type: \"suite\",\n mode: \"queued\",\n filepath,\n tasks: [],\n meta: /* @__PURE__ */ Object.create(null),\n projectName,\n file: undefined,\n pool\n };\n file.file = file;\n return file;\n}\nfunction generateFileHash(file, projectName) {\n return generateHash(`${file}${projectName || \"\"}`);\n}\n\nfunction limitConcurrency(concurrency = Infinity) {\n let count = 0;\n let head;\n let tail;\n const finish = () => {\n count--;\n if (head) {\n head[0]();\n head = head[1];\n tail = head && tail;\n }\n };\n return (func, ...args) => {\n return new Promise((resolve) => {\n if (count++ < concurrency) {\n resolve();\n } else if (tail) {\n tail = tail[1] = [resolve];\n } else {\n head = tail = [resolve];\n }\n }).then(() => {\n return func(...args);\n }).finally(finish);\n };\n}\n\nfunction partitionSuiteChildren(suite) {\n let tasksGroup = [];\n const tasksGroups = [];\n for (const c of suite.tasks) {\n if (tasksGroup.length === 0 || c.concurrent === tasksGroup[0].concurrent) {\n tasksGroup.push(c);\n } else {\n tasksGroups.push(tasksGroup);\n tasksGroup = [c];\n }\n }\n if (tasksGroup.length > 0) {\n tasksGroups.push(tasksGroup);\n }\n return tasksGroups;\n}\n\nfunction isAtomTest(s) {\n return isTestCase(s);\n}\nfunction isTestCase(s) {\n return s.type === \"test\";\n}\nfunction getTests(suite) {\n const tests = [];\n const arraySuites = toArray(suite);\n for (const s of arraySuites) {\n if (isTestCase(s)) {\n tests.push(s);\n } else {\n for (const task of s.tasks) {\n if (isTestCase(task)) {\n tests.push(task);\n } else {\n const taskTests = getTests(task);\n for (const test of taskTests) {\n tests.push(test);\n }\n }\n }\n }\n }\n return tests;\n}\nfunction getTasks(tasks = []) {\n return toArray(tasks).flatMap(\n (s) => isTestCase(s) ? [s] : [s, ...getTasks(s.tasks)]\n );\n}\nfunction getSuites(suite) {\n return toArray(suite).flatMap(\n (s) => s.type === \"suite\" ? [s, ...getSuites(s.tasks)] : []\n );\n}\nfunction hasTests(suite) {\n return toArray(suite).some(\n (s) => s.tasks.some((c) => isTestCase(c) || hasTests(c))\n );\n}\nfunction hasFailed(suite) {\n return toArray(suite).some(\n (s) => {\n var _a;\n return ((_a = s.result) == null ? undefined : _a.state) === \"fail\" || s.type === \"suite\" && hasFailed(s.tasks);\n }\n );\n}\nfunction getNames(task) {\n const names = [task.name];\n let current = task;\n while (current == null ? undefined : current.suite) {\n current = current.suite;\n if (current == null ? undefined : current.name) {\n names.unshift(current.name);\n }\n }\n if (current !== task.file) {\n names.unshift(task.file.name);\n }\n return names;\n}\nfunction getFullName(task, separator = \" > \") {\n return getNames(task).join(separator);\n}\nfunction getTestName(task, separator = \" > \") {\n return getNames(task).slice(1).join(separator);\n}\n\nexport { calculateSuiteHash as a, createFileTask as b, createChainable as c, generateHash as d, getFullName as e, getNames as f, generateFileHash as g, getSuites as h, interpretTaskModes as i, getTasks as j, getTestName as k, limitConcurrency as l, getTests as m, hasFailed as n, hasTests as o, partitionSuiteChildren as p, isAtomTest as q, isTestCase as r, someTasksAreOnly as s };\n","import { getTests } from '@vitest/runner/utils';\nimport c from 'tinyrainbow';\nimport type { RunnerTask } from 'vitest';\nimport type { Vitest } from 'vitest/node';\nimport type { Reporter } from 'vitest/reporters';\n\nexport default class TinyReporter implements Reporter {\n // biome-ignore lint/style/noNonNullAssertion: Non-null assertion is allowed here because the onInit method is called before any other method\n ctx: Vitest = undefined!;\n protected verbose = false;\n\n onInit(ctx: Vitest) {\n this.ctx = ctx;\n }\n\n onFinished(\n files = this.ctx.state.getFiles(),\n errors = this.ctx.state.getUnhandledErrors(),\n ) {\n const { logger } = this.ctx;\n const tests = getTests(files);\n const failedTests = tests.filter((i) => i.result?.state === 'fail').length;\n\n const passed = !(failedTests + errors.length);\n const status = passed ? '\\u2714 PASS' : '\\u2716 FAIL';\n const statusColor = passed ? c.green : c.red;\n\n logger.log(\n `${statusColor(c.bold(c.inverse(` ${status} `)))} ${statusColor(\n passed\n ? 'All tests passed'\n : `${failedTests} test${failedTests > 1 ? 's' : ''} failed`,\n )}`,\n );\n logger.log(this.padTitle('Test Files'), this.getStateString(files));\n logger.log(this.padTitle('Tests'), this.getStateString(tests));\n\n if (errors.length) {\n logger.log(\n this.padTitle('Errors'),\n c.bold(c.red(`${errors.length} error${errors.length > 1 ? 's' : ''}`)),\n );\n }\n\n if (!passed) {\n process.exitCode = 1;\n }\n }\n\n padTitle = (str: string) => c.dim(`${str.padStart(11)} `);\n\n getStateString(tasks: RunnerTask[], name = 'tests') {\n if (!tasks.length) {\n return c.dim(`no ${name}`);\n }\n\n const passed = tasks.filter((i) => i.result?.state === 'pass').length;\n const failed = tasks.filter((i) => i.result?.state === 'fail').length;\n const skipped = tasks.filter((i) => i.mode === 'skip').length;\n const todo = tasks.filter((i) => i.mode === 'todo').length;\n\n return (\n [\n failed && c.bold(c.red(`${failed} failed`)),\n passed && c.bold(c.green(`${passed} passed`)),\n skipped && c.yellow(`${skipped} skipped`),\n todo && c.gray(`${todo} todo`),\n ]\n .filter(Boolean)\n .join(c.dim(' | ')) + c.gray(` (${tasks.length})`)\n );\n }\n}\n"],"names":["toArray","array","isTestCase","s","getTests","suite","tests","arraySuites","task","taskTests","test","TinyReporter","__publicField","str","c","ctx","files","errors","logger","failedTests","i","_a","passed","status","statusColor","tasks","name","failed","skipped","todo"],"mappings":"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","x_google_ignoreList":[0,1]}
1
+ {"version":3,"file":"vitest-tiny-reporter.js","sources":["../node_modules/@vitest/utils/dist/helpers.js","../node_modules/@vitest/runner/dist/chunk-tasks.js","../src/index.ts"],"sourcesContent":["import { VALID_ID_PREFIX, NULL_BYTE_PLACEHOLDER } from './constants.js';\n\n// port from nanoid\n// https://github.com/ai/nanoid\nconst urlAlphabet = \"useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict\";\nfunction nanoid(size = 21) {\n\tlet id = \"\";\n\tlet i = size;\n\twhile (i--) {\n\t\tid += urlAlphabet[Math.random() * 64 | 0];\n\t}\n\treturn id;\n}\n\nconst RealDate = Date;\nfunction random(seed) {\n\tconst x = Math.sin(seed++) * 1e4;\n\treturn x - Math.floor(x);\n}\nfunction shuffle(array, seed = RealDate.now()) {\n\tlet length = array.length;\n\twhile (length) {\n\t\tconst index = Math.floor(random(seed) * length--);\n\t\tconst previous = array[length];\n\t\tarray[length] = array[index];\n\t\tarray[index] = previous;\n\t\t++seed;\n\t}\n\treturn array;\n}\n\n/**\n* Get original stacktrace without source map support the most performant way.\n* - Create only 1 stack frame.\n* - Rewrite prepareStackTrace to bypass \"support-stack-trace\" (usually takes ~250ms).\n*/\nfunction createSimpleStackTrace(options) {\n\tconst { message = \"$$stack trace error\", stackTraceLimit = 1 } = options || {};\n\tconst limit = Error.stackTraceLimit;\n\tconst prepareStackTrace = Error.prepareStackTrace;\n\tError.stackTraceLimit = stackTraceLimit;\n\tError.prepareStackTrace = (e) => e.stack;\n\tconst err = new Error(message);\n\tconst stackTrace = err.stack || \"\";\n\tError.prepareStackTrace = prepareStackTrace;\n\tError.stackTraceLimit = limit;\n\treturn stackTrace;\n}\nfunction notNullish(v) {\n\treturn v != null;\n}\nfunction assertTypes(value, name, types) {\n\tconst receivedType = typeof value;\n\tconst pass = types.includes(receivedType);\n\tif (!pass) {\n\t\tthrow new TypeError(`${name} value must be ${types.join(\" or \")}, received \"${receivedType}\"`);\n\t}\n}\nfunction isPrimitive(value) {\n\treturn value === null || typeof value !== \"function\" && typeof value !== \"object\";\n}\nfunction slash(path) {\n\treturn path.replace(/\\\\/g, \"/\");\n}\nconst postfixRE = /[?#].*$/;\nfunction cleanUrl(url) {\n\treturn url.replace(postfixRE, \"\");\n}\nconst externalRE = /^(?:[a-z]+:)?\\/\\//;\nconst isExternalUrl = (url) => externalRE.test(url);\n/**\n* Prepend `/@id/` and replace null byte so the id is URL-safe.\n* This is prepended to resolved ids that are not valid browser\n* import specifiers by the importAnalysis plugin.\n*/\nfunction wrapId(id) {\n\treturn id.startsWith(VALID_ID_PREFIX) ? id : VALID_ID_PREFIX + id.replace(\"\\0\", NULL_BYTE_PLACEHOLDER);\n}\n/**\n* Undo {@link wrapId}'s `/@id/` and null byte replacements.\n*/\nfunction unwrapId(id) {\n\treturn id.startsWith(VALID_ID_PREFIX) ? id.slice(VALID_ID_PREFIX.length).replace(NULL_BYTE_PLACEHOLDER, \"\\0\") : id;\n}\nfunction withTrailingSlash(path) {\n\tif (path.at(-1) !== \"/\") {\n\t\treturn `${path}/`;\n\t}\n\treturn path;\n}\nconst bareImportRE = /^(?![a-z]:)[\\w@](?!.*:\\/\\/)/i;\nfunction isBareImport(id) {\n\treturn bareImportRE.test(id);\n}\nfunction toArray(array) {\n\tif (array === null || array === undefined) {\n\t\tarray = [];\n\t}\n\tif (Array.isArray(array)) {\n\t\treturn array;\n\t}\n\treturn [array];\n}\nfunction isObject(item) {\n\treturn item != null && typeof item === \"object\" && !Array.isArray(item);\n}\nfunction isFinalObj(obj) {\n\treturn obj === Object.prototype || obj === Function.prototype || obj === RegExp.prototype;\n}\nfunction getType(value) {\n\treturn Object.prototype.toString.apply(value).slice(8, -1);\n}\nfunction collectOwnProperties(obj, collector) {\n\tconst collect = typeof collector === \"function\" ? collector : (key) => collector.add(key);\n\tObject.getOwnPropertyNames(obj).forEach(collect);\n\tObject.getOwnPropertySymbols(obj).forEach(collect);\n}\nfunction getOwnProperties(obj) {\n\tconst ownProps = new Set();\n\tif (isFinalObj(obj)) {\n\t\treturn [];\n\t}\n\tcollectOwnProperties(obj, ownProps);\n\treturn Array.from(ownProps);\n}\nconst defaultCloneOptions = { forceWritable: false };\nfunction deepClone(val, options = defaultCloneOptions) {\n\tconst seen = new WeakMap();\n\treturn clone(val, seen, options);\n}\nfunction clone(val, seen, options = defaultCloneOptions) {\n\tlet k, out;\n\tif (seen.has(val)) {\n\t\treturn seen.get(val);\n\t}\n\tif (Array.isArray(val)) {\n\t\tout = Array.from({ length: k = val.length });\n\t\tseen.set(val, out);\n\t\twhile (k--) {\n\t\t\tout[k] = clone(val[k], seen, options);\n\t\t}\n\t\treturn out;\n\t}\n\tif (Object.prototype.toString.call(val) === \"[object Object]\") {\n\t\tout = Object.create(Object.getPrototypeOf(val));\n\t\tseen.set(val, out);\n\t\t// we don't need properties from prototype\n\t\tconst props = getOwnProperties(val);\n\t\tfor (const k of props) {\n\t\t\tconst descriptor = Object.getOwnPropertyDescriptor(val, k);\n\t\t\tif (!descriptor) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst cloned = clone(val[k], seen, options);\n\t\t\tif (options.forceWritable) {\n\t\t\t\tObject.defineProperty(out, k, {\n\t\t\t\t\tenumerable: descriptor.enumerable,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\tvalue: cloned\n\t\t\t\t});\n\t\t\t} else if (\"get\" in descriptor) {\n\t\t\t\tObject.defineProperty(out, k, {\n\t\t\t\t\t...descriptor,\n\t\t\t\t\tget() {\n\t\t\t\t\t\treturn cloned;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tObject.defineProperty(out, k, {\n\t\t\t\t\t...descriptor,\n\t\t\t\t\tvalue: cloned\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\treturn out;\n\t}\n\treturn val;\n}\nfunction noop() {}\nfunction objectAttr(source, path, defaultValue = undefined) {\n\t// a[3].b -> a.3.b\n\tconst paths = path.replace(/\\[(\\d+)\\]/g, \".$1\").split(\".\");\n\tlet result = source;\n\tfor (const p of paths) {\n\t\tresult = new Object(result)[p];\n\t\tif (result === undefined) {\n\t\t\treturn defaultValue;\n\t\t}\n\t}\n\treturn result;\n}\nfunction createDefer() {\n\tlet resolve = null;\n\tlet reject = null;\n\tconst p = new Promise((_resolve, _reject) => {\n\t\tresolve = _resolve;\n\t\treject = _reject;\n\t});\n\tp.resolve = resolve;\n\tp.reject = reject;\n\treturn p;\n}\n/**\n* If code starts with a function call, will return its last index, respecting arguments.\n* This will return 25 - last ending character of toMatch \")\"\n* Also works with callbacks\n* ```\n* toMatch({ test: '123' });\n* toBeAliased('123')\n* ```\n*/\nfunction getCallLastIndex(code) {\n\tlet charIndex = -1;\n\tlet inString = null;\n\tlet startedBracers = 0;\n\tlet endedBracers = 0;\n\tlet beforeChar = null;\n\twhile (charIndex <= code.length) {\n\t\tbeforeChar = code[charIndex];\n\t\tcharIndex++;\n\t\tconst char = code[charIndex];\n\t\tconst isCharString = char === \"\\\"\" || char === \"'\" || char === \"`\";\n\t\tif (isCharString && beforeChar !== \"\\\\\") {\n\t\t\tif (inString === char) {\n\t\t\t\tinString = null;\n\t\t\t} else if (!inString) {\n\t\t\t\tinString = char;\n\t\t\t}\n\t\t}\n\t\tif (!inString) {\n\t\t\tif (char === \"(\") {\n\t\t\t\tstartedBracers++;\n\t\t\t}\n\t\t\tif (char === \")\") {\n\t\t\t\tendedBracers++;\n\t\t\t}\n\t\t}\n\t\tif (startedBracers && endedBracers && startedBracers === endedBracers) {\n\t\t\treturn charIndex;\n\t\t}\n\t}\n\treturn null;\n}\nfunction isNegativeNaN(val) {\n\tif (!Number.isNaN(val)) {\n\t\treturn false;\n\t}\n\tconst f64 = new Float64Array(1);\n\tf64[0] = val;\n\tconst u32 = new Uint32Array(f64.buffer);\n\tconst isNegative = u32[1] >>> 31 === 1;\n\treturn isNegative;\n}\nfunction toString(v) {\n\treturn Object.prototype.toString.call(v);\n}\nfunction isPlainObject(val) {\n\treturn toString(val) === \"[object Object]\" && (!val.constructor || val.constructor.name === \"Object\");\n}\nfunction isMergeableObject(item) {\n\treturn isPlainObject(item) && !Array.isArray(item);\n}\n/**\n* Deep merge :P\n*\n* Will merge objects only if they are plain\n*\n* Do not merge types - it is very expensive and usually it's better to case a type here\n*/\nfunction deepMerge(target, ...sources) {\n\tif (!sources.length) {\n\t\treturn target;\n\t}\n\tconst source = sources.shift();\n\tif (source === undefined) {\n\t\treturn target;\n\t}\n\tif (isMergeableObject(target) && isMergeableObject(source)) {\n\t\tObject.keys(source).forEach((key) => {\n\t\t\tconst _source = source;\n\t\t\tif (isMergeableObject(_source[key])) {\n\t\t\t\tif (!target[key]) {\n\t\t\t\t\ttarget[key] = {};\n\t\t\t\t}\n\t\t\t\tdeepMerge(target[key], _source[key]);\n\t\t\t} else {\n\t\t\t\ttarget[key] = _source[key];\n\t\t\t}\n\t\t});\n\t}\n\treturn deepMerge(target, ...sources);\n}\n\nexport { assertTypes, cleanUrl, clone, createDefer, createSimpleStackTrace, deepClone, deepMerge, getCallLastIndex, getOwnProperties, getType, isBareImport, isExternalUrl, isNegativeNaN, isObject, isPrimitive, nanoid, noop, notNullish, objectAttr, shuffle, slash, toArray, unwrapId, withTrailingSlash, wrapId };\n","import { processError } from '@vitest/utils/error';\nimport { parseSingleStack } from '@vitest/utils/source-map';\nimport { relative } from 'pathe';\nimport { toArray } from '@vitest/utils/helpers';\n\nfunction createChainable(keys, fn) {\n\tfunction create(context) {\n\t\tconst chain = function(...args) {\n\t\t\treturn fn.apply(context, args);\n\t\t};\n\t\tObject.assign(chain, fn);\n\t\tchain.withContext = () => chain.bind(context);\n\t\tchain.setContext = (key, value) => {\n\t\t\tcontext[key] = value;\n\t\t};\n\t\tchain.mergeContext = (ctx) => {\n\t\t\tObject.assign(context, ctx);\n\t\t};\n\t\tfor (const key of keys) {\n\t\t\tObject.defineProperty(chain, key, { get() {\n\t\t\t\treturn create({\n\t\t\t\t\t...context,\n\t\t\t\t\t[key]: true\n\t\t\t\t});\n\t\t\t} });\n\t\t}\n\t\treturn chain;\n\t}\n\tconst chain = create({});\n\tchain.fn = fn;\n\treturn chain;\n}\n\n/**\n* If any tasks been marked as `only`, mark all other tasks as `skip`.\n*/\nfunction interpretTaskModes(file, namePattern, testLocations, onlyMode, parentIsOnly, allowOnly) {\n\tconst matchedLocations = [];\n\tconst traverseSuite = (suite, parentIsOnly, parentMatchedWithLocation) => {\n\t\tconst suiteIsOnly = parentIsOnly || suite.mode === \"only\";\n\t\tsuite.tasks.forEach((t) => {\n\t\t\t// Check if either the parent suite or the task itself are marked as included\n\t\t\tconst includeTask = suiteIsOnly || t.mode === \"only\";\n\t\t\tif (onlyMode) {\n\t\t\t\tif (t.type === \"suite\" && (includeTask || someTasksAreOnly(t))) {\n\t\t\t\t\t// Don't skip this suite\n\t\t\t\t\tif (t.mode === \"only\") {\n\t\t\t\t\t\tcheckAllowOnly(t, allowOnly);\n\t\t\t\t\t\tt.mode = \"run\";\n\t\t\t\t\t}\n\t\t\t\t} else if (t.mode === \"run\" && !includeTask) {\n\t\t\t\t\tt.mode = \"skip\";\n\t\t\t\t} else if (t.mode === \"only\") {\n\t\t\t\t\tcheckAllowOnly(t, allowOnly);\n\t\t\t\t\tt.mode = \"run\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tlet hasLocationMatch = parentMatchedWithLocation;\n\t\t\t// Match test location against provided locations, only run if present\n\t\t\t// in `testLocations`. Note: if `includeTaskLocations` is not enabled,\n\t\t\t// all test will be skipped.\n\t\t\tif (testLocations !== undefined && testLocations.length !== 0) {\n\t\t\t\tif (t.location && (testLocations === null || testLocations === void 0 ? void 0 : testLocations.includes(t.location.line))) {\n\t\t\t\t\tt.mode = \"run\";\n\t\t\t\t\tmatchedLocations.push(t.location.line);\n\t\t\t\t\thasLocationMatch = true;\n\t\t\t\t} else if (parentMatchedWithLocation) {\n\t\t\t\t\tt.mode = \"run\";\n\t\t\t\t} else if (t.type === \"test\") {\n\t\t\t\t\tt.mode = \"skip\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (t.type === \"test\") {\n\t\t\t\tif (namePattern && !getTaskFullName(t).match(namePattern)) {\n\t\t\t\t\tt.mode = \"skip\";\n\t\t\t\t}\n\t\t\t} else if (t.type === \"suite\") {\n\t\t\t\tif (t.mode === \"skip\") {\n\t\t\t\t\tskipAllTasks(t);\n\t\t\t\t} else if (t.mode === \"todo\") {\n\t\t\t\t\ttodoAllTasks(t);\n\t\t\t\t} else {\n\t\t\t\t\ttraverseSuite(t, includeTask, hasLocationMatch);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\t// if all subtasks are skipped, mark as skip\n\t\tif (suite.mode === \"run\" || suite.mode === \"queued\") {\n\t\t\tif (suite.tasks.length && suite.tasks.every((i) => i.mode !== \"run\" && i.mode !== \"queued\")) {\n\t\t\t\tsuite.mode = \"skip\";\n\t\t\t}\n\t\t}\n\t};\n\ttraverseSuite(file, parentIsOnly, false);\n\tconst nonMatching = testLocations === null || testLocations === void 0 ? void 0 : testLocations.filter((loc) => !matchedLocations.includes(loc));\n\tif (nonMatching && nonMatching.length !== 0) {\n\t\tconst message = nonMatching.length === 1 ? `line ${nonMatching[0]}` : `lines ${nonMatching.join(\", \")}`;\n\t\tif (file.result === undefined) {\n\t\t\tfile.result = {\n\t\t\t\tstate: \"fail\",\n\t\t\t\terrors: []\n\t\t\t};\n\t\t}\n\t\tif (file.result.errors === undefined) {\n\t\t\tfile.result.errors = [];\n\t\t}\n\t\tfile.result.errors.push(processError(new Error(`No test found in ${file.name} in ${message}`)));\n\t}\n}\nfunction getTaskFullName(task) {\n\treturn `${task.suite ? `${getTaskFullName(task.suite)} ` : \"\"}${task.name}`;\n}\nfunction someTasksAreOnly(suite) {\n\treturn suite.tasks.some((t) => t.mode === \"only\" || t.type === \"suite\" && someTasksAreOnly(t));\n}\nfunction skipAllTasks(suite) {\n\tsuite.tasks.forEach((t) => {\n\t\tif (t.mode === \"run\" || t.mode === \"queued\") {\n\t\t\tt.mode = \"skip\";\n\t\t\tif (t.type === \"suite\") {\n\t\t\t\tskipAllTasks(t);\n\t\t\t}\n\t\t}\n\t});\n}\nfunction todoAllTasks(suite) {\n\tsuite.tasks.forEach((t) => {\n\t\tif (t.mode === \"run\" || t.mode === \"queued\") {\n\t\t\tt.mode = \"todo\";\n\t\t\tif (t.type === \"suite\") {\n\t\t\t\ttodoAllTasks(t);\n\t\t\t}\n\t\t}\n\t});\n}\nfunction checkAllowOnly(task, allowOnly) {\n\tif (allowOnly) {\n\t\treturn;\n\t}\n\tconst error = processError(new Error(\"[Vitest] Unexpected .only modifier. Remove it or pass --allowOnly argument to bypass this error\"));\n\ttask.result = {\n\t\tstate: \"fail\",\n\t\terrors: [error]\n\t};\n}\n/* @__NO_SIDE_EFFECTS__ */\nfunction generateHash(str) {\n\tlet hash = 0;\n\tif (str.length === 0) {\n\t\treturn `${hash}`;\n\t}\n\tfor (let i = 0; i < str.length; i++) {\n\t\tconst char = str.charCodeAt(i);\n\t\thash = (hash << 5) - hash + char;\n\t\thash = hash & hash;\n\t}\n\treturn `${hash}`;\n}\nfunction calculateSuiteHash(parent) {\n\tparent.tasks.forEach((t, idx) => {\n\t\tt.id = `${parent.id}_${idx}`;\n\t\tif (t.type === \"suite\") {\n\t\t\tcalculateSuiteHash(t);\n\t\t}\n\t});\n}\nfunction createFileTask(filepath, root, projectName, pool) {\n\tconst path = relative(root, filepath);\n\tconst file = {\n\t\tid: generateFileHash(path, projectName),\n\t\tname: path,\n\t\ttype: \"suite\",\n\t\tmode: \"queued\",\n\t\tfilepath,\n\t\ttasks: [],\n\t\tmeta: Object.create(null),\n\t\tprojectName,\n\t\tfile: undefined,\n\t\tpool\n\t};\n\tfile.file = file;\n\treturn file;\n}\n/**\n* Generate a unique ID for a file based on its path and project name\n* @param file File relative to the root of the project to keep ID the same between different machines\n* @param projectName The name of the test project\n*/\n/* @__NO_SIDE_EFFECTS__ */\nfunction generateFileHash(file, projectName) {\n\treturn /* @__PURE__ */ generateHash(`${file}${projectName || \"\"}`);\n}\nfunction findTestFileStackTrace(testFilePath, error) {\n\t// first line is the error message\n\tconst lines = error.split(\"\\n\").slice(1);\n\tfor (const line of lines) {\n\t\tconst stack = parseSingleStack(line);\n\t\tif (stack && stack.file === testFilePath) {\n\t\t\treturn stack;\n\t\t}\n\t}\n}\n\n/**\n* Return a function for running multiple async operations with limited concurrency.\n*/\nfunction limitConcurrency(concurrency = Infinity) {\n\t// The number of currently active + pending tasks.\n\tlet count = 0;\n\t// The head and tail of the pending task queue, built using a singly linked list.\n\t// Both head and tail are initially undefined, signifying an empty queue.\n\t// They both become undefined again whenever there are no pending tasks.\n\tlet head;\n\tlet tail;\n\t// A bookkeeping function executed whenever a task has been run to completion.\n\tconst finish = () => {\n\t\tcount--;\n\t\t// Check if there are further pending tasks in the queue.\n\t\tif (head) {\n\t\t\t// Allow the next pending task to run and pop it from the queue.\n\t\t\thead[0]();\n\t\t\thead = head[1];\n\t\t\t// The head may now be undefined if there are no further pending tasks.\n\t\t\t// In that case, set tail to undefined as well.\n\t\t\ttail = head && tail;\n\t\t}\n\t};\n\treturn (func, ...args) => {\n\t\t// Create a promise chain that:\n\t\t// 1. Waits for its turn in the task queue (if necessary).\n\t\t// 2. Runs the task.\n\t\t// 3. Allows the next pending task (if any) to run.\n\t\treturn new Promise((resolve) => {\n\t\t\tif (count++ < concurrency) {\n\t\t\t\t// No need to queue if fewer than maxConcurrency tasks are running.\n\t\t\t\tresolve();\n\t\t\t} else if (tail) {\n\t\t\t\t// There are pending tasks, so append to the queue.\n\t\t\t\ttail = tail[1] = [resolve];\n\t\t\t} else {\n\t\t\t\t// No other pending tasks, initialize the queue with a new tail and head.\n\t\t\t\thead = tail = [resolve];\n\t\t\t}\n\t\t}).then(() => {\n\t\t\t// Running func here ensures that even a non-thenable result or an\n\t\t\t// immediately thrown error gets wrapped into a Promise.\n\t\t\treturn func(...args);\n\t\t}).finally(finish);\n\t};\n}\n\n/**\n* Partition in tasks groups by consecutive concurrent\n*/\nfunction partitionSuiteChildren(suite) {\n\tlet tasksGroup = [];\n\tconst tasksGroups = [];\n\tfor (const c of suite.tasks) {\n\t\tif (tasksGroup.length === 0 || c.concurrent === tasksGroup[0].concurrent) {\n\t\t\ttasksGroup.push(c);\n\t\t} else {\n\t\t\ttasksGroups.push(tasksGroup);\n\t\t\ttasksGroup = [c];\n\t\t}\n\t}\n\tif (tasksGroup.length > 0) {\n\t\ttasksGroups.push(tasksGroup);\n\t}\n\treturn tasksGroups;\n}\n\nfunction isTestCase(s) {\n\treturn s.type === \"test\";\n}\nfunction getTests(suite) {\n\tconst tests = [];\n\tconst arraySuites = toArray(suite);\n\tfor (const s of arraySuites) {\n\t\tif (isTestCase(s)) {\n\t\t\ttests.push(s);\n\t\t} else {\n\t\t\tfor (const task of s.tasks) {\n\t\t\t\tif (isTestCase(task)) {\n\t\t\t\t\ttests.push(task);\n\t\t\t\t} else {\n\t\t\t\t\tconst taskTests = getTests(task);\n\t\t\t\t\tfor (const test of taskTests) {\n\t\t\t\t\t\ttests.push(test);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn tests;\n}\nfunction getTasks(tasks = []) {\n\treturn toArray(tasks).flatMap((s) => isTestCase(s) ? [s] : [s, ...getTasks(s.tasks)]);\n}\nfunction getSuites(suite) {\n\treturn toArray(suite).flatMap((s) => s.type === \"suite\" ? [s, ...getSuites(s.tasks)] : []);\n}\nfunction hasTests(suite) {\n\treturn toArray(suite).some((s) => s.tasks.some((c) => isTestCase(c) || hasTests(c)));\n}\nfunction hasFailed(suite) {\n\treturn toArray(suite).some((s) => {\n\t\tvar _s$result;\n\t\treturn ((_s$result = s.result) === null || _s$result === void 0 ? void 0 : _s$result.state) === \"fail\" || s.type === \"suite\" && hasFailed(s.tasks);\n\t});\n}\nfunction getNames(task) {\n\tconst names = [task.name];\n\tlet current = task;\n\twhile (current === null || current === void 0 ? void 0 : current.suite) {\n\t\tcurrent = current.suite;\n\t\tif (current === null || current === void 0 ? void 0 : current.name) {\n\t\t\tnames.unshift(current.name);\n\t\t}\n\t}\n\tif (current !== task.file) {\n\t\tnames.unshift(task.file.name);\n\t}\n\treturn names;\n}\nfunction getFullName(task, separator = \" > \") {\n\treturn getNames(task).join(separator);\n}\nfunction getTestName(task, separator = \" > \") {\n\treturn getNames(task).slice(1).join(separator);\n}\n\nexport { calculateSuiteHash as a, createFileTask as b, createChainable as c, generateHash as d, getFullName as e, findTestFileStackTrace as f, generateFileHash as g, getNames as h, interpretTaskModes as i, getSuites as j, getTasks as k, limitConcurrency as l, getTestName as m, getTests as n, hasFailed as o, partitionSuiteChildren as p, hasTests as q, isTestCase as r, someTasksAreOnly as s };\n","import { getTests } from '@vitest/runner/utils';\nimport c from 'tinyrainbow';\nimport type { RunnerTask } from 'vitest';\nimport type { Vitest } from 'vitest/node';\nimport type { Reporter } from 'vitest/reporters';\n\nexport default class TinyReporter implements Reporter {\n // biome-ignore lint/style/noNonNullAssertion: Non-null assertion is allowed here because the onInit method is called before any other method\n ctx: Vitest = undefined!;\n protected verbose = false;\n\n onInit(ctx: Vitest) {\n this.ctx = ctx;\n }\n\n onFinished(\n files = this.ctx.state.getFiles(),\n errors = this.ctx.state.getUnhandledErrors(),\n ) {\n const { logger } = this.ctx;\n const tests = getTests(files);\n const failedTests = tests.filter((i) => i.result?.state === 'fail').length;\n\n const passed = !(failedTests + errors.length);\n const status = passed ? '\\u2714 PASS' : '\\u2716 FAIL';\n const statusColor = passed ? c.green : c.red;\n\n logger.log(\n `${statusColor(c.bold(c.inverse(` ${status} `)))} ${statusColor(\n passed\n ? 'All tests passed'\n : `${failedTests} test${failedTests > 1 ? 's' : ''} failed`,\n )}`,\n );\n logger.log(this.padTitle('Test Files'), this.getStateString(files));\n logger.log(this.padTitle('Tests'), this.getStateString(tests));\n\n if (errors.length) {\n logger.log(\n this.padTitle('Errors'),\n c.bold(c.red(`${errors.length} error${errors.length > 1 ? 's' : ''}`)),\n );\n }\n\n if (!passed) {\n process.exitCode = 1;\n }\n }\n\n padTitle = (str: string) => c.dim(`${str.padStart(11)} `);\n\n getStateString(tasks: RunnerTask[], name = 'tests') {\n if (!tasks.length) {\n return c.dim(`no ${name}`);\n }\n\n const passed = tasks.filter((i) => i.result?.state === 'pass').length;\n const failed = tasks.filter((i) => i.result?.state === 'fail').length;\n const skipped = tasks.filter((i) => i.mode === 'skip').length;\n const todo = tasks.filter((i) => i.mode === 'todo').length;\n\n return (\n [\n failed && c.bold(c.red(`${failed} failed`)),\n passed && c.bold(c.green(`${passed} passed`)),\n skipped && c.yellow(`${skipped} skipped`),\n todo && c.gray(`${todo} todo`),\n ]\n .filter(Boolean)\n .join(c.dim(' | ')) + c.gray(` (${tasks.length})`)\n );\n }\n}\n"],"names":["toArray","array","isTestCase","getTests","suite","tests","arraySuites","s","task","taskTests","test","TinyReporter","ctx","files","errors","logger","failedTests","i","passed","status","statusColor","c","str","tasks","name","failed","skipped","todo"],"mappings":"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","x_google_ignoreList":[0,1]}
@@ -1,2 +1,2 @@
1
- (function(t,s){typeof exports=="object"&&typeof module<"u"?module.exports=s(require("tinyrainbow")):typeof define=="function"&&define.amd?define(["tinyrainbow"],s):(t=typeof globalThis<"u"?globalThis:t||self,t["vitest-tiny-reporter"]=s(t.tinyrainbow))})(this,function(t){"use strict";var T=Object.defineProperty;var y=(t,s,g)=>s in t?T(t,s,{enumerable:!0,configurable:!0,writable:!0,value:g}):t[s]=g;var a=(t,s,g)=>y(t,typeof s!="symbol"?s+"":s,g);function s(n){return n==null&&(n=[]),Array.isArray(n)?n:[n]}function g(n){return n.type==="test"}function h(n){const e=[],d=s(n);for(const i of d)if(g(i))e.push(i);else for(const o of i.tasks)if(g(o))e.push(o);else{const f=h(o);for(const l of f)e.push(l)}return e}class c{constructor(){a(this,"ctx");a(this,"verbose",!1);a(this,"padTitle",e=>t.dim(`${e.padStart(11)} `))}onInit(e){this.ctx=e}onFinished(e=this.ctx.state.getFiles(),d=this.ctx.state.getUnhandledErrors()){const{logger:i}=this.ctx,o=h(e),f=o.filter($=>{var p;return((p=$.result)==null?void 0:p.state)==="fail"}).length,l=!(f+d.length),r=l?"✔ PASS":"✖ FAIL",u=l?t.green:t.red;i.log(`${u(t.bold(t.inverse(` ${r} `)))} ${u(l?"All tests passed":`${f} test${f>1?"s":""} failed`)}`),i.log(this.padTitle("Test Files"),this.getStateString(e)),i.log(this.padTitle("Tests"),this.getStateString(o)),d.length&&i.log(this.padTitle("Errors"),t.bold(t.red(`${d.length} error${d.length>1?"s":""}`))),l||(process.exitCode=1)}getStateString(e,d="tests"){if(!e.length)return t.dim(`no ${d}`);const i=e.filter(r=>{var u;return((u=r.result)==null?void 0:u.state)==="pass"}).length,o=e.filter(r=>{var u;return((u=r.result)==null?void 0:u.state)==="fail"}).length,f=e.filter(r=>r.mode==="skip").length,l=e.filter(r=>r.mode==="todo").length;return[o&&t.bold(t.red(`${o} failed`)),i&&t.bold(t.green(`${i} passed`)),f&&t.yellow(`${f} skipped`),l&&t.gray(`${l} todo`)].filter(Boolean).join(t.dim(" | "))+t.gray(` (${e.length})`)}}return c});
1
+ (function(t,f){typeof exports=="object"&&typeof module<"u"?module.exports=f(require("tinyrainbow")):typeof define=="function"&&define.amd?define(["tinyrainbow"],f):(t=typeof globalThis<"u"?globalThis:t||self,t["vitest-tiny-reporter"]=f(t.tinyrainbow))})(this,function(t){"use strict";function f(s){return s==null&&(s=[]),Array.isArray(s)?s:[s]}function u(s){return s.type==="test"}function g(s){const e=[],r=f(s);for(const n of r)if(u(n))e.push(n);else for(const i of n.tasks)if(u(i))e.push(i);else{const d=g(i);for(const o of d)e.push(o)}return e}class h{ctx=void 0;verbose=!1;onInit(e){this.ctx=e}onFinished(e=this.ctx.state.getFiles(),r=this.ctx.state.getUnhandledErrors()){const{logger:n}=this.ctx,i=g(e),d=i.filter(p=>p.result?.state==="fail").length,o=!(d+r.length),l=o?"✔ PASS":"✖ FAIL",a=o?t.green:t.red;n.log(`${a(t.bold(t.inverse(` ${l} `)))} ${a(o?"All tests passed":`${d} test${d>1?"s":""} failed`)}`),n.log(this.padTitle("Test Files"),this.getStateString(e)),n.log(this.padTitle("Tests"),this.getStateString(i)),r.length&&n.log(this.padTitle("Errors"),t.bold(t.red(`${r.length} error${r.length>1?"s":""}`))),o||(process.exitCode=1)}padTitle=e=>t.dim(`${e.padStart(11)} `);getStateString(e,r="tests"){if(!e.length)return t.dim(`no ${r}`);const n=e.filter(l=>l.result?.state==="pass").length,i=e.filter(l=>l.result?.state==="fail").length,d=e.filter(l=>l.mode==="skip").length,o=e.filter(l=>l.mode==="todo").length;return[i&&t.bold(t.red(`${i} failed`)),n&&t.bold(t.green(`${n} passed`)),d&&t.yellow(`${d} skipped`),o&&t.gray(`${o} todo`)].filter(Boolean).join(t.dim(" | "))+t.gray(` (${e.length})`)}}return h});
2
2
  //# sourceMappingURL=vitest-tiny-reporter.umd.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"vitest-tiny-reporter.umd.cjs","sources":["../node_modules/@vitest/utils/dist/helpers.js","../node_modules/@vitest/runner/dist/chunk-tasks.js","../src/index.ts"],"sourcesContent":["function createSimpleStackTrace(options) {\n const { message = \"$$stack trace error\", stackTraceLimit = 1 } = options || {};\n const limit = Error.stackTraceLimit;\n const prepareStackTrace = Error.prepareStackTrace;\n Error.stackTraceLimit = stackTraceLimit;\n Error.prepareStackTrace = (e) => e.stack;\n const err = new Error(message);\n const stackTrace = err.stack || \"\";\n Error.prepareStackTrace = prepareStackTrace;\n Error.stackTraceLimit = limit;\n return stackTrace;\n}\nfunction notNullish(v) {\n return v != null;\n}\nfunction assertTypes(value, name, types) {\n const receivedType = typeof value;\n const pass = types.includes(receivedType);\n if (!pass) {\n throw new TypeError(\n `${name} value must be ${types.join(\" or \")}, received \"${receivedType}\"`\n );\n }\n}\nfunction isPrimitive(value) {\n return value === null || typeof value !== \"function\" && typeof value !== \"object\";\n}\nfunction slash(path) {\n return path.replace(/\\\\/g, \"/\");\n}\nfunction parseRegexp(input) {\n const m = input.match(/(\\/?)(.+)\\1([a-z]*)/i);\n if (!m) {\n return /$^/;\n }\n if (m[3] && !/^(?!.*?(.).*?\\1)[gmixXsuUAJ]+$/.test(m[3])) {\n return new RegExp(input);\n }\n return new RegExp(m[2], m[3]);\n}\nfunction toArray(array) {\n if (array === null || array === undefined) {\n array = [];\n }\n if (Array.isArray(array)) {\n return array;\n }\n return [array];\n}\nfunction isObject(item) {\n return item != null && typeof item === \"object\" && !Array.isArray(item);\n}\nfunction isFinalObj(obj) {\n return obj === Object.prototype || obj === Function.prototype || obj === RegExp.prototype;\n}\nfunction getType(value) {\n return Object.prototype.toString.apply(value).slice(8, -1);\n}\nfunction collectOwnProperties(obj, collector) {\n const collect = typeof collector === \"function\" ? collector : (key) => collector.add(key);\n Object.getOwnPropertyNames(obj).forEach(collect);\n Object.getOwnPropertySymbols(obj).forEach(collect);\n}\nfunction getOwnProperties(obj) {\n const ownProps = /* @__PURE__ */ new Set();\n if (isFinalObj(obj)) {\n return [];\n }\n collectOwnProperties(obj, ownProps);\n return Array.from(ownProps);\n}\nconst defaultCloneOptions = { forceWritable: false };\nfunction deepClone(val, options = defaultCloneOptions) {\n const seen = /* @__PURE__ */ new WeakMap();\n return clone(val, seen, options);\n}\nfunction clone(val, seen, options = defaultCloneOptions) {\n let k, out;\n if (seen.has(val)) {\n return seen.get(val);\n }\n if (Array.isArray(val)) {\n out = Array.from({ length: k = val.length });\n seen.set(val, out);\n while (k--) {\n out[k] = clone(val[k], seen, options);\n }\n return out;\n }\n if (Object.prototype.toString.call(val) === \"[object Object]\") {\n out = Object.create(Object.getPrototypeOf(val));\n seen.set(val, out);\n const props = getOwnProperties(val);\n for (const k2 of props) {\n const descriptor = Object.getOwnPropertyDescriptor(val, k2);\n if (!descriptor) {\n continue;\n }\n const cloned = clone(val[k2], seen, options);\n if (options.forceWritable) {\n Object.defineProperty(out, k2, {\n enumerable: descriptor.enumerable,\n configurable: true,\n writable: true,\n value: cloned\n });\n } else if (\"get\" in descriptor) {\n Object.defineProperty(out, k2, {\n ...descriptor,\n get() {\n return cloned;\n }\n });\n } else {\n Object.defineProperty(out, k2, {\n ...descriptor,\n value: cloned\n });\n }\n }\n return out;\n }\n return val;\n}\nfunction noop() {\n}\nfunction objectAttr(source, path, defaultValue = undefined) {\n const paths = path.replace(/\\[(\\d+)\\]/g, \".$1\").split(\".\");\n let result = source;\n for (const p of paths) {\n result = new Object(result)[p];\n if (result === undefined) {\n return defaultValue;\n }\n }\n return result;\n}\nfunction createDefer() {\n let resolve = null;\n let reject = null;\n const p = new Promise((_resolve, _reject) => {\n resolve = _resolve;\n reject = _reject;\n });\n p.resolve = resolve;\n p.reject = reject;\n return p;\n}\nfunction getCallLastIndex(code) {\n let charIndex = -1;\n let inString = null;\n let startedBracers = 0;\n let endedBracers = 0;\n let beforeChar = null;\n while (charIndex <= code.length) {\n beforeChar = code[charIndex];\n charIndex++;\n const char = code[charIndex];\n const isCharString = char === '\"' || char === \"'\" || char === \"`\";\n if (isCharString && beforeChar !== \"\\\\\") {\n if (inString === char) {\n inString = null;\n } else if (!inString) {\n inString = char;\n }\n }\n if (!inString) {\n if (char === \"(\") {\n startedBracers++;\n }\n if (char === \")\") {\n endedBracers++;\n }\n }\n if (startedBracers && endedBracers && startedBracers === endedBracers) {\n return charIndex;\n }\n }\n return null;\n}\nfunction isNegativeNaN(val) {\n if (!Number.isNaN(val)) {\n return false;\n }\n const f64 = new Float64Array(1);\n f64[0] = val;\n const u32 = new Uint32Array(f64.buffer);\n const isNegative = u32[1] >>> 31 === 1;\n return isNegative;\n}\nfunction toString(v) {\n return Object.prototype.toString.call(v);\n}\nfunction isPlainObject(val) {\n return toString(val) === \"[object Object]\" && (!val.constructor || val.constructor.name === \"Object\");\n}\nfunction isMergeableObject(item) {\n return isPlainObject(item) && !Array.isArray(item);\n}\nfunction deepMerge(target, ...sources) {\n if (!sources.length) {\n return target;\n }\n const source = sources.shift();\n if (source === undefined) {\n return target;\n }\n if (isMergeableObject(target) && isMergeableObject(source)) {\n Object.keys(source).forEach((key) => {\n const _source = source;\n if (isMergeableObject(_source[key])) {\n if (!target[key]) {\n target[key] = {};\n }\n deepMerge(target[key], _source[key]);\n } else {\n target[key] = _source[key];\n }\n });\n }\n return deepMerge(target, ...sources);\n}\n\nexport { assertTypes, clone, createDefer, createSimpleStackTrace, deepClone, deepMerge, getCallLastIndex, getOwnProperties, getType, isNegativeNaN, isObject, isPrimitive, noop, notNullish, objectAttr, parseRegexp, slash, toArray };\n","import { processError } from '@vitest/utils/error';\nimport { relative } from 'pathe';\nimport { toArray } from '@vitest/utils';\n\nfunction createChainable(keys, fn) {\n function create(context) {\n const chain2 = function(...args) {\n return fn.apply(context, args);\n };\n Object.assign(chain2, fn);\n chain2.withContext = () => chain2.bind(context);\n chain2.setContext = (key, value) => {\n context[key] = value;\n };\n chain2.mergeContext = (ctx) => {\n Object.assign(context, ctx);\n };\n for (const key of keys) {\n Object.defineProperty(chain2, key, {\n get() {\n return create({ ...context, [key]: true });\n }\n });\n }\n return chain2;\n }\n const chain = create({});\n chain.fn = fn;\n return chain;\n}\n\nfunction interpretTaskModes(file, namePattern, testLocations, onlyMode, parentIsOnly, allowOnly) {\n const matchedLocations = [];\n const traverseSuite = (suite, parentIsOnly2, parentMatchedWithLocation) => {\n const suiteIsOnly = parentIsOnly2 || suite.mode === \"only\";\n suite.tasks.forEach((t) => {\n const includeTask = suiteIsOnly || t.mode === \"only\";\n if (onlyMode) {\n if (t.type === \"suite\" && (includeTask || someTasksAreOnly(t))) {\n if (t.mode === \"only\") {\n checkAllowOnly(t, allowOnly);\n t.mode = \"run\";\n }\n } else if (t.mode === \"run\" && !includeTask) {\n t.mode = \"skip\";\n } else if (t.mode === \"only\") {\n checkAllowOnly(t, allowOnly);\n t.mode = \"run\";\n }\n }\n let hasLocationMatch = parentMatchedWithLocation;\n if (testLocations !== undefined && testLocations.length !== 0) {\n if (t.location && (testLocations == null ? undefined : testLocations.includes(t.location.line))) {\n t.mode = \"run\";\n matchedLocations.push(t.location.line);\n hasLocationMatch = true;\n } else if (parentMatchedWithLocation) {\n t.mode = \"run\";\n } else if (t.type === \"test\") {\n t.mode = \"skip\";\n }\n }\n if (t.type === \"test\") {\n if (namePattern && !getTaskFullName(t).match(namePattern)) {\n t.mode = \"skip\";\n }\n } else if (t.type === \"suite\") {\n if (t.mode === \"skip\") {\n skipAllTasks(t);\n } else if (t.mode === \"todo\") {\n todoAllTasks(t);\n } else {\n traverseSuite(t, includeTask, hasLocationMatch);\n }\n }\n });\n if (suite.mode === \"run\" || suite.mode === \"queued\") {\n if (suite.tasks.length && suite.tasks.every((i) => i.mode !== \"run\" && i.mode !== \"queued\")) {\n suite.mode = \"skip\";\n }\n }\n };\n traverseSuite(file, parentIsOnly, false);\n const nonMatching = testLocations == null ? undefined : testLocations.filter((loc) => !matchedLocations.includes(loc));\n if (nonMatching && nonMatching.length !== 0) {\n const message = nonMatching.length === 1 ? `line ${nonMatching[0]}` : `lines ${nonMatching.join(\", \")}`;\n if (file.result === undefined) {\n file.result = {\n state: \"fail\",\n errors: []\n };\n }\n if (file.result.errors === undefined) {\n file.result.errors = [];\n }\n file.result.errors.push(\n processError(new Error(`No test found in ${file.name} in ${message}`))\n );\n }\n}\nfunction getTaskFullName(task) {\n return `${task.suite ? `${getTaskFullName(task.suite)} ` : \"\"}${task.name}`;\n}\nfunction someTasksAreOnly(suite) {\n return suite.tasks.some(\n (t) => t.mode === \"only\" || t.type === \"suite\" && someTasksAreOnly(t)\n );\n}\nfunction skipAllTasks(suite) {\n suite.tasks.forEach((t) => {\n if (t.mode === \"run\" || t.mode === \"queued\") {\n t.mode = \"skip\";\n if (t.type === \"suite\") {\n skipAllTasks(t);\n }\n }\n });\n}\nfunction todoAllTasks(suite) {\n suite.tasks.forEach((t) => {\n if (t.mode === \"run\" || t.mode === \"queued\") {\n t.mode = \"todo\";\n if (t.type === \"suite\") {\n todoAllTasks(t);\n }\n }\n });\n}\nfunction checkAllowOnly(task, allowOnly) {\n if (allowOnly) {\n return;\n }\n const error = processError(\n new Error(\n \"[Vitest] Unexpected .only modifier. Remove it or pass --allowOnly argument to bypass this error\"\n )\n );\n task.result = {\n state: \"fail\",\n errors: [error]\n };\n}\nfunction generateHash(str) {\n let hash = 0;\n if (str.length === 0) {\n return `${hash}`;\n }\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash;\n }\n return `${hash}`;\n}\nfunction calculateSuiteHash(parent) {\n parent.tasks.forEach((t, idx) => {\n t.id = `${parent.id}_${idx}`;\n if (t.type === \"suite\") {\n calculateSuiteHash(t);\n }\n });\n}\nfunction createFileTask(filepath, root, projectName, pool) {\n const path = relative(root, filepath);\n const file = {\n id: generateFileHash(path, projectName),\n name: path,\n type: \"suite\",\n mode: \"queued\",\n filepath,\n tasks: [],\n meta: /* @__PURE__ */ Object.create(null),\n projectName,\n file: undefined,\n pool\n };\n file.file = file;\n return file;\n}\nfunction generateFileHash(file, projectName) {\n return generateHash(`${file}${projectName || \"\"}`);\n}\n\nfunction limitConcurrency(concurrency = Infinity) {\n let count = 0;\n let head;\n let tail;\n const finish = () => {\n count--;\n if (head) {\n head[0]();\n head = head[1];\n tail = head && tail;\n }\n };\n return (func, ...args) => {\n return new Promise((resolve) => {\n if (count++ < concurrency) {\n resolve();\n } else if (tail) {\n tail = tail[1] = [resolve];\n } else {\n head = tail = [resolve];\n }\n }).then(() => {\n return func(...args);\n }).finally(finish);\n };\n}\n\nfunction partitionSuiteChildren(suite) {\n let tasksGroup = [];\n const tasksGroups = [];\n for (const c of suite.tasks) {\n if (tasksGroup.length === 0 || c.concurrent === tasksGroup[0].concurrent) {\n tasksGroup.push(c);\n } else {\n tasksGroups.push(tasksGroup);\n tasksGroup = [c];\n }\n }\n if (tasksGroup.length > 0) {\n tasksGroups.push(tasksGroup);\n }\n return tasksGroups;\n}\n\nfunction isAtomTest(s) {\n return isTestCase(s);\n}\nfunction isTestCase(s) {\n return s.type === \"test\";\n}\nfunction getTests(suite) {\n const tests = [];\n const arraySuites = toArray(suite);\n for (const s of arraySuites) {\n if (isTestCase(s)) {\n tests.push(s);\n } else {\n for (const task of s.tasks) {\n if (isTestCase(task)) {\n tests.push(task);\n } else {\n const taskTests = getTests(task);\n for (const test of taskTests) {\n tests.push(test);\n }\n }\n }\n }\n }\n return tests;\n}\nfunction getTasks(tasks = []) {\n return toArray(tasks).flatMap(\n (s) => isTestCase(s) ? [s] : [s, ...getTasks(s.tasks)]\n );\n}\nfunction getSuites(suite) {\n return toArray(suite).flatMap(\n (s) => s.type === \"suite\" ? [s, ...getSuites(s.tasks)] : []\n );\n}\nfunction hasTests(suite) {\n return toArray(suite).some(\n (s) => s.tasks.some((c) => isTestCase(c) || hasTests(c))\n );\n}\nfunction hasFailed(suite) {\n return toArray(suite).some(\n (s) => {\n var _a;\n return ((_a = s.result) == null ? undefined : _a.state) === \"fail\" || s.type === \"suite\" && hasFailed(s.tasks);\n }\n );\n}\nfunction getNames(task) {\n const names = [task.name];\n let current = task;\n while (current == null ? undefined : current.suite) {\n current = current.suite;\n if (current == null ? undefined : current.name) {\n names.unshift(current.name);\n }\n }\n if (current !== task.file) {\n names.unshift(task.file.name);\n }\n return names;\n}\nfunction getFullName(task, separator = \" > \") {\n return getNames(task).join(separator);\n}\nfunction getTestName(task, separator = \" > \") {\n return getNames(task).slice(1).join(separator);\n}\n\nexport { calculateSuiteHash as a, createFileTask as b, createChainable as c, generateHash as d, getFullName as e, getNames as f, generateFileHash as g, getSuites as h, interpretTaskModes as i, getTasks as j, getTestName as k, limitConcurrency as l, getTests as m, hasFailed as n, hasTests as o, partitionSuiteChildren as p, isAtomTest as q, isTestCase as r, someTasksAreOnly as s };\n","import { getTests } from '@vitest/runner/utils';\nimport c from 'tinyrainbow';\nimport type { RunnerTask } from 'vitest';\nimport type { Vitest } from 'vitest/node';\nimport type { Reporter } from 'vitest/reporters';\n\nexport default class TinyReporter implements Reporter {\n // biome-ignore lint/style/noNonNullAssertion: Non-null assertion is allowed here because the onInit method is called before any other method\n ctx: Vitest = undefined!;\n protected verbose = false;\n\n onInit(ctx: Vitest) {\n this.ctx = ctx;\n }\n\n onFinished(\n files = this.ctx.state.getFiles(),\n errors = this.ctx.state.getUnhandledErrors(),\n ) {\n const { logger } = this.ctx;\n const tests = getTests(files);\n const failedTests = tests.filter((i) => i.result?.state === 'fail').length;\n\n const passed = !(failedTests + errors.length);\n const status = passed ? '\\u2714 PASS' : '\\u2716 FAIL';\n const statusColor = passed ? c.green : c.red;\n\n logger.log(\n `${statusColor(c.bold(c.inverse(` ${status} `)))} ${statusColor(\n passed\n ? 'All tests passed'\n : `${failedTests} test${failedTests > 1 ? 's' : ''} failed`,\n )}`,\n );\n logger.log(this.padTitle('Test Files'), this.getStateString(files));\n logger.log(this.padTitle('Tests'), this.getStateString(tests));\n\n if (errors.length) {\n logger.log(\n this.padTitle('Errors'),\n c.bold(c.red(`${errors.length} error${errors.length > 1 ? 's' : ''}`)),\n );\n }\n\n if (!passed) {\n process.exitCode = 1;\n }\n }\n\n padTitle = (str: string) => c.dim(`${str.padStart(11)} `);\n\n getStateString(tasks: RunnerTask[], name = 'tests') {\n if (!tasks.length) {\n return c.dim(`no ${name}`);\n }\n\n const passed = tasks.filter((i) => i.result?.state === 'pass').length;\n const failed = tasks.filter((i) => i.result?.state === 'fail').length;\n const skipped = tasks.filter((i) => i.mode === 'skip').length;\n const todo = tasks.filter((i) => i.mode === 'todo').length;\n\n return (\n [\n failed && c.bold(c.red(`${failed} failed`)),\n passed && c.bold(c.green(`${passed} passed`)),\n skipped && c.yellow(`${skipped} skipped`),\n todo && c.gray(`${todo} todo`),\n ]\n .filter(Boolean)\n .join(c.dim(' | ')) + c.gray(` (${tasks.length})`)\n );\n }\n}\n"],"names":["toArray","array","isTestCase","s","getTests","suite","tests","arraySuites","task","taskTests","test","TinyReporter","__publicField","str","c","ctx","files","errors","logger","failedTests","i","_a","passed","status","statusColor","tasks","name","failed","skipped","todo"],"mappings":"gcAwCA,SAASA,EAAQC,EAAO,CAItB,OAHIA,GAAU,OACZA,EAAQ,CAAE,GAER,MAAM,QAAQA,CAAK,EACdA,EAEF,CAACA,CAAK,CACf,CCsLA,SAASC,EAAWC,EAAG,CACrB,OAAOA,EAAE,OAAS,MACpB,CACA,SAASC,EAASC,EAAO,CACvB,MAAMC,EAAQ,CAAE,EACVC,EAAcP,EAAQK,CAAK,EACjC,UAAWF,KAAKI,EACd,GAAIL,EAAWC,CAAC,EACdG,EAAM,KAAKH,CAAC,MAEZ,WAAWK,KAAQL,EAAE,MACnB,GAAID,EAAWM,CAAI,EACjBF,EAAM,KAAKE,CAAI,MACV,CACL,MAAMC,EAAYL,EAASI,CAAI,EAC/B,UAAWE,KAAQD,EACjBH,EAAM,KAAKI,CAAI,CAE3B,CAIE,OAAOJ,CACT,CCvPA,MAAqBK,CAAiC,CAAtD,cAEEC,EAAA,YACUA,EAAA,eAAU,IAwCpBA,EAAA,gBAAYC,GAAgBC,EAAE,IAAI,GAAGD,EAAI,SAAS,EAAE,CAAC,GAAG,GAtCxD,OAAOE,EAAa,CAClB,KAAK,IAAMA,CAAA,CAGb,WACEC,EAAQ,KAAK,IAAI,MAAM,WACvBC,EAAS,KAAK,IAAI,MAAM,mBAAA,EACxB,CACM,KAAA,CAAE,OAAAC,GAAW,KAAK,IAClBZ,EAAQF,EAASY,CAAK,EACtBG,EAAcb,EAAM,OAAQc,UAAM,QAAAC,EAAAD,EAAE,SAAF,YAAAC,EAAU,SAAU,OAAM,EAAE,OAE9DC,EAAS,EAAEH,EAAcF,EAAO,QAChCM,EAASD,EAAS,SAAgB,SAClCE,EAAcF,EAASR,EAAE,MAAQA,EAAE,IAElCI,EAAA,IACL,GAAGM,EAAYV,EAAE,KAAKA,EAAE,QAAQ,IAAIS,CAAM,GAAG,CAAC,CAAC,CAAC,IAAIC,EAClDF,EACI,mBACA,GAAGH,CAAW,QAAQA,EAAc,EAAI,IAAM,EAAE,SAAA,CACrD,EACH,EACOD,EAAA,IAAI,KAAK,SAAS,YAAY,EAAG,KAAK,eAAeF,CAAK,CAAC,EAC3DE,EAAA,IAAI,KAAK,SAAS,OAAO,EAAG,KAAK,eAAeZ,CAAK,CAAC,EAEzDW,EAAO,QACFC,EAAA,IACL,KAAK,SAAS,QAAQ,EACtBJ,EAAE,KAAKA,EAAE,IAAI,GAAGG,EAAO,MAAM,SAASA,EAAO,OAAS,EAAI,IAAM,EAAE,EAAE,CAAC,CACvE,EAGGK,IACH,QAAQ,SAAW,EACrB,CAKF,eAAeG,EAAqBC,EAAO,QAAS,CAC9C,GAAA,CAACD,EAAM,OACT,OAAOX,EAAE,IAAI,MAAMY,CAAI,EAAE,EAGrB,MAAAJ,EAASG,EAAM,OAAQL,UAAM,QAAAC,EAAAD,EAAE,SAAF,YAAAC,EAAU,SAAU,OAAM,EAAE,OACzDM,EAASF,EAAM,OAAQL,UAAM,QAAAC,EAAAD,EAAE,SAAF,YAAAC,EAAU,SAAU,OAAM,EAAE,OACzDO,EAAUH,EAAM,OAAQL,GAAMA,EAAE,OAAS,MAAM,EAAE,OACjDS,EAAOJ,EAAM,OAAQL,GAAMA,EAAE,OAAS,MAAM,EAAE,OAGlD,MAAA,CACEO,GAAUb,EAAE,KAAKA,EAAE,IAAI,GAAGa,CAAM,SAAS,CAAC,EAC1CL,GAAUR,EAAE,KAAKA,EAAE,MAAM,GAAGQ,CAAM,SAAS,CAAC,EAC5CM,GAAWd,EAAE,OAAO,GAAGc,CAAO,UAAU,EACxCC,GAAQf,EAAE,KAAK,GAAGe,CAAI,OAAO,CAAA,EAE5B,OAAO,OAAO,EACd,KAAKf,EAAE,IAAI,KAAK,CAAC,EAAIA,EAAE,KAAK,KAAKW,EAAM,MAAM,GAAG,CAAA,CAGzD","x_google_ignoreList":[0,1]}
1
+ {"version":3,"file":"vitest-tiny-reporter.umd.cjs","sources":["../node_modules/@vitest/utils/dist/helpers.js","../node_modules/@vitest/runner/dist/chunk-tasks.js","../src/index.ts"],"sourcesContent":["import { VALID_ID_PREFIX, NULL_BYTE_PLACEHOLDER } from './constants.js';\n\n// port from nanoid\n// https://github.com/ai/nanoid\nconst urlAlphabet = \"useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict\";\nfunction nanoid(size = 21) {\n\tlet id = \"\";\n\tlet i = size;\n\twhile (i--) {\n\t\tid += urlAlphabet[Math.random() * 64 | 0];\n\t}\n\treturn id;\n}\n\nconst RealDate = Date;\nfunction random(seed) {\n\tconst x = Math.sin(seed++) * 1e4;\n\treturn x - Math.floor(x);\n}\nfunction shuffle(array, seed = RealDate.now()) {\n\tlet length = array.length;\n\twhile (length) {\n\t\tconst index = Math.floor(random(seed) * length--);\n\t\tconst previous = array[length];\n\t\tarray[length] = array[index];\n\t\tarray[index] = previous;\n\t\t++seed;\n\t}\n\treturn array;\n}\n\n/**\n* Get original stacktrace without source map support the most performant way.\n* - Create only 1 stack frame.\n* - Rewrite prepareStackTrace to bypass \"support-stack-trace\" (usually takes ~250ms).\n*/\nfunction createSimpleStackTrace(options) {\n\tconst { message = \"$$stack trace error\", stackTraceLimit = 1 } = options || {};\n\tconst limit = Error.stackTraceLimit;\n\tconst prepareStackTrace = Error.prepareStackTrace;\n\tError.stackTraceLimit = stackTraceLimit;\n\tError.prepareStackTrace = (e) => e.stack;\n\tconst err = new Error(message);\n\tconst stackTrace = err.stack || \"\";\n\tError.prepareStackTrace = prepareStackTrace;\n\tError.stackTraceLimit = limit;\n\treturn stackTrace;\n}\nfunction notNullish(v) {\n\treturn v != null;\n}\nfunction assertTypes(value, name, types) {\n\tconst receivedType = typeof value;\n\tconst pass = types.includes(receivedType);\n\tif (!pass) {\n\t\tthrow new TypeError(`${name} value must be ${types.join(\" or \")}, received \"${receivedType}\"`);\n\t}\n}\nfunction isPrimitive(value) {\n\treturn value === null || typeof value !== \"function\" && typeof value !== \"object\";\n}\nfunction slash(path) {\n\treturn path.replace(/\\\\/g, \"/\");\n}\nconst postfixRE = /[?#].*$/;\nfunction cleanUrl(url) {\n\treturn url.replace(postfixRE, \"\");\n}\nconst externalRE = /^(?:[a-z]+:)?\\/\\//;\nconst isExternalUrl = (url) => externalRE.test(url);\n/**\n* Prepend `/@id/` and replace null byte so the id is URL-safe.\n* This is prepended to resolved ids that are not valid browser\n* import specifiers by the importAnalysis plugin.\n*/\nfunction wrapId(id) {\n\treturn id.startsWith(VALID_ID_PREFIX) ? id : VALID_ID_PREFIX + id.replace(\"\\0\", NULL_BYTE_PLACEHOLDER);\n}\n/**\n* Undo {@link wrapId}'s `/@id/` and null byte replacements.\n*/\nfunction unwrapId(id) {\n\treturn id.startsWith(VALID_ID_PREFIX) ? id.slice(VALID_ID_PREFIX.length).replace(NULL_BYTE_PLACEHOLDER, \"\\0\") : id;\n}\nfunction withTrailingSlash(path) {\n\tif (path.at(-1) !== \"/\") {\n\t\treturn `${path}/`;\n\t}\n\treturn path;\n}\nconst bareImportRE = /^(?![a-z]:)[\\w@](?!.*:\\/\\/)/i;\nfunction isBareImport(id) {\n\treturn bareImportRE.test(id);\n}\nfunction toArray(array) {\n\tif (array === null || array === undefined) {\n\t\tarray = [];\n\t}\n\tif (Array.isArray(array)) {\n\t\treturn array;\n\t}\n\treturn [array];\n}\nfunction isObject(item) {\n\treturn item != null && typeof item === \"object\" && !Array.isArray(item);\n}\nfunction isFinalObj(obj) {\n\treturn obj === Object.prototype || obj === Function.prototype || obj === RegExp.prototype;\n}\nfunction getType(value) {\n\treturn Object.prototype.toString.apply(value).slice(8, -1);\n}\nfunction collectOwnProperties(obj, collector) {\n\tconst collect = typeof collector === \"function\" ? collector : (key) => collector.add(key);\n\tObject.getOwnPropertyNames(obj).forEach(collect);\n\tObject.getOwnPropertySymbols(obj).forEach(collect);\n}\nfunction getOwnProperties(obj) {\n\tconst ownProps = new Set();\n\tif (isFinalObj(obj)) {\n\t\treturn [];\n\t}\n\tcollectOwnProperties(obj, ownProps);\n\treturn Array.from(ownProps);\n}\nconst defaultCloneOptions = { forceWritable: false };\nfunction deepClone(val, options = defaultCloneOptions) {\n\tconst seen = new WeakMap();\n\treturn clone(val, seen, options);\n}\nfunction clone(val, seen, options = defaultCloneOptions) {\n\tlet k, out;\n\tif (seen.has(val)) {\n\t\treturn seen.get(val);\n\t}\n\tif (Array.isArray(val)) {\n\t\tout = Array.from({ length: k = val.length });\n\t\tseen.set(val, out);\n\t\twhile (k--) {\n\t\t\tout[k] = clone(val[k], seen, options);\n\t\t}\n\t\treturn out;\n\t}\n\tif (Object.prototype.toString.call(val) === \"[object Object]\") {\n\t\tout = Object.create(Object.getPrototypeOf(val));\n\t\tseen.set(val, out);\n\t\t// we don't need properties from prototype\n\t\tconst props = getOwnProperties(val);\n\t\tfor (const k of props) {\n\t\t\tconst descriptor = Object.getOwnPropertyDescriptor(val, k);\n\t\t\tif (!descriptor) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst cloned = clone(val[k], seen, options);\n\t\t\tif (options.forceWritable) {\n\t\t\t\tObject.defineProperty(out, k, {\n\t\t\t\t\tenumerable: descriptor.enumerable,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\tvalue: cloned\n\t\t\t\t});\n\t\t\t} else if (\"get\" in descriptor) {\n\t\t\t\tObject.defineProperty(out, k, {\n\t\t\t\t\t...descriptor,\n\t\t\t\t\tget() {\n\t\t\t\t\t\treturn cloned;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tObject.defineProperty(out, k, {\n\t\t\t\t\t...descriptor,\n\t\t\t\t\tvalue: cloned\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\treturn out;\n\t}\n\treturn val;\n}\nfunction noop() {}\nfunction objectAttr(source, path, defaultValue = undefined) {\n\t// a[3].b -> a.3.b\n\tconst paths = path.replace(/\\[(\\d+)\\]/g, \".$1\").split(\".\");\n\tlet result = source;\n\tfor (const p of paths) {\n\t\tresult = new Object(result)[p];\n\t\tif (result === undefined) {\n\t\t\treturn defaultValue;\n\t\t}\n\t}\n\treturn result;\n}\nfunction createDefer() {\n\tlet resolve = null;\n\tlet reject = null;\n\tconst p = new Promise((_resolve, _reject) => {\n\t\tresolve = _resolve;\n\t\treject = _reject;\n\t});\n\tp.resolve = resolve;\n\tp.reject = reject;\n\treturn p;\n}\n/**\n* If code starts with a function call, will return its last index, respecting arguments.\n* This will return 25 - last ending character of toMatch \")\"\n* Also works with callbacks\n* ```\n* toMatch({ test: '123' });\n* toBeAliased('123')\n* ```\n*/\nfunction getCallLastIndex(code) {\n\tlet charIndex = -1;\n\tlet inString = null;\n\tlet startedBracers = 0;\n\tlet endedBracers = 0;\n\tlet beforeChar = null;\n\twhile (charIndex <= code.length) {\n\t\tbeforeChar = code[charIndex];\n\t\tcharIndex++;\n\t\tconst char = code[charIndex];\n\t\tconst isCharString = char === \"\\\"\" || char === \"'\" || char === \"`\";\n\t\tif (isCharString && beforeChar !== \"\\\\\") {\n\t\t\tif (inString === char) {\n\t\t\t\tinString = null;\n\t\t\t} else if (!inString) {\n\t\t\t\tinString = char;\n\t\t\t}\n\t\t}\n\t\tif (!inString) {\n\t\t\tif (char === \"(\") {\n\t\t\t\tstartedBracers++;\n\t\t\t}\n\t\t\tif (char === \")\") {\n\t\t\t\tendedBracers++;\n\t\t\t}\n\t\t}\n\t\tif (startedBracers && endedBracers && startedBracers === endedBracers) {\n\t\t\treturn charIndex;\n\t\t}\n\t}\n\treturn null;\n}\nfunction isNegativeNaN(val) {\n\tif (!Number.isNaN(val)) {\n\t\treturn false;\n\t}\n\tconst f64 = new Float64Array(1);\n\tf64[0] = val;\n\tconst u32 = new Uint32Array(f64.buffer);\n\tconst isNegative = u32[1] >>> 31 === 1;\n\treturn isNegative;\n}\nfunction toString(v) {\n\treturn Object.prototype.toString.call(v);\n}\nfunction isPlainObject(val) {\n\treturn toString(val) === \"[object Object]\" && (!val.constructor || val.constructor.name === \"Object\");\n}\nfunction isMergeableObject(item) {\n\treturn isPlainObject(item) && !Array.isArray(item);\n}\n/**\n* Deep merge :P\n*\n* Will merge objects only if they are plain\n*\n* Do not merge types - it is very expensive and usually it's better to case a type here\n*/\nfunction deepMerge(target, ...sources) {\n\tif (!sources.length) {\n\t\treturn target;\n\t}\n\tconst source = sources.shift();\n\tif (source === undefined) {\n\t\treturn target;\n\t}\n\tif (isMergeableObject(target) && isMergeableObject(source)) {\n\t\tObject.keys(source).forEach((key) => {\n\t\t\tconst _source = source;\n\t\t\tif (isMergeableObject(_source[key])) {\n\t\t\t\tif (!target[key]) {\n\t\t\t\t\ttarget[key] = {};\n\t\t\t\t}\n\t\t\t\tdeepMerge(target[key], _source[key]);\n\t\t\t} else {\n\t\t\t\ttarget[key] = _source[key];\n\t\t\t}\n\t\t});\n\t}\n\treturn deepMerge(target, ...sources);\n}\n\nexport { assertTypes, cleanUrl, clone, createDefer, createSimpleStackTrace, deepClone, deepMerge, getCallLastIndex, getOwnProperties, getType, isBareImport, isExternalUrl, isNegativeNaN, isObject, isPrimitive, nanoid, noop, notNullish, objectAttr, shuffle, slash, toArray, unwrapId, withTrailingSlash, wrapId };\n","import { processError } from '@vitest/utils/error';\nimport { parseSingleStack } from '@vitest/utils/source-map';\nimport { relative } from 'pathe';\nimport { toArray } from '@vitest/utils/helpers';\n\nfunction createChainable(keys, fn) {\n\tfunction create(context) {\n\t\tconst chain = function(...args) {\n\t\t\treturn fn.apply(context, args);\n\t\t};\n\t\tObject.assign(chain, fn);\n\t\tchain.withContext = () => chain.bind(context);\n\t\tchain.setContext = (key, value) => {\n\t\t\tcontext[key] = value;\n\t\t};\n\t\tchain.mergeContext = (ctx) => {\n\t\t\tObject.assign(context, ctx);\n\t\t};\n\t\tfor (const key of keys) {\n\t\t\tObject.defineProperty(chain, key, { get() {\n\t\t\t\treturn create({\n\t\t\t\t\t...context,\n\t\t\t\t\t[key]: true\n\t\t\t\t});\n\t\t\t} });\n\t\t}\n\t\treturn chain;\n\t}\n\tconst chain = create({});\n\tchain.fn = fn;\n\treturn chain;\n}\n\n/**\n* If any tasks been marked as `only`, mark all other tasks as `skip`.\n*/\nfunction interpretTaskModes(file, namePattern, testLocations, onlyMode, parentIsOnly, allowOnly) {\n\tconst matchedLocations = [];\n\tconst traverseSuite = (suite, parentIsOnly, parentMatchedWithLocation) => {\n\t\tconst suiteIsOnly = parentIsOnly || suite.mode === \"only\";\n\t\tsuite.tasks.forEach((t) => {\n\t\t\t// Check if either the parent suite or the task itself are marked as included\n\t\t\tconst includeTask = suiteIsOnly || t.mode === \"only\";\n\t\t\tif (onlyMode) {\n\t\t\t\tif (t.type === \"suite\" && (includeTask || someTasksAreOnly(t))) {\n\t\t\t\t\t// Don't skip this suite\n\t\t\t\t\tif (t.mode === \"only\") {\n\t\t\t\t\t\tcheckAllowOnly(t, allowOnly);\n\t\t\t\t\t\tt.mode = \"run\";\n\t\t\t\t\t}\n\t\t\t\t} else if (t.mode === \"run\" && !includeTask) {\n\t\t\t\t\tt.mode = \"skip\";\n\t\t\t\t} else if (t.mode === \"only\") {\n\t\t\t\t\tcheckAllowOnly(t, allowOnly);\n\t\t\t\t\tt.mode = \"run\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tlet hasLocationMatch = parentMatchedWithLocation;\n\t\t\t// Match test location against provided locations, only run if present\n\t\t\t// in `testLocations`. Note: if `includeTaskLocations` is not enabled,\n\t\t\t// all test will be skipped.\n\t\t\tif (testLocations !== undefined && testLocations.length !== 0) {\n\t\t\t\tif (t.location && (testLocations === null || testLocations === void 0 ? void 0 : testLocations.includes(t.location.line))) {\n\t\t\t\t\tt.mode = \"run\";\n\t\t\t\t\tmatchedLocations.push(t.location.line);\n\t\t\t\t\thasLocationMatch = true;\n\t\t\t\t} else if (parentMatchedWithLocation) {\n\t\t\t\t\tt.mode = \"run\";\n\t\t\t\t} else if (t.type === \"test\") {\n\t\t\t\t\tt.mode = \"skip\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (t.type === \"test\") {\n\t\t\t\tif (namePattern && !getTaskFullName(t).match(namePattern)) {\n\t\t\t\t\tt.mode = \"skip\";\n\t\t\t\t}\n\t\t\t} else if (t.type === \"suite\") {\n\t\t\t\tif (t.mode === \"skip\") {\n\t\t\t\t\tskipAllTasks(t);\n\t\t\t\t} else if (t.mode === \"todo\") {\n\t\t\t\t\ttodoAllTasks(t);\n\t\t\t\t} else {\n\t\t\t\t\ttraverseSuite(t, includeTask, hasLocationMatch);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\t// if all subtasks are skipped, mark as skip\n\t\tif (suite.mode === \"run\" || suite.mode === \"queued\") {\n\t\t\tif (suite.tasks.length && suite.tasks.every((i) => i.mode !== \"run\" && i.mode !== \"queued\")) {\n\t\t\t\tsuite.mode = \"skip\";\n\t\t\t}\n\t\t}\n\t};\n\ttraverseSuite(file, parentIsOnly, false);\n\tconst nonMatching = testLocations === null || testLocations === void 0 ? void 0 : testLocations.filter((loc) => !matchedLocations.includes(loc));\n\tif (nonMatching && nonMatching.length !== 0) {\n\t\tconst message = nonMatching.length === 1 ? `line ${nonMatching[0]}` : `lines ${nonMatching.join(\", \")}`;\n\t\tif (file.result === undefined) {\n\t\t\tfile.result = {\n\t\t\t\tstate: \"fail\",\n\t\t\t\terrors: []\n\t\t\t};\n\t\t}\n\t\tif (file.result.errors === undefined) {\n\t\t\tfile.result.errors = [];\n\t\t}\n\t\tfile.result.errors.push(processError(new Error(`No test found in ${file.name} in ${message}`)));\n\t}\n}\nfunction getTaskFullName(task) {\n\treturn `${task.suite ? `${getTaskFullName(task.suite)} ` : \"\"}${task.name}`;\n}\nfunction someTasksAreOnly(suite) {\n\treturn suite.tasks.some((t) => t.mode === \"only\" || t.type === \"suite\" && someTasksAreOnly(t));\n}\nfunction skipAllTasks(suite) {\n\tsuite.tasks.forEach((t) => {\n\t\tif (t.mode === \"run\" || t.mode === \"queued\") {\n\t\t\tt.mode = \"skip\";\n\t\t\tif (t.type === \"suite\") {\n\t\t\t\tskipAllTasks(t);\n\t\t\t}\n\t\t}\n\t});\n}\nfunction todoAllTasks(suite) {\n\tsuite.tasks.forEach((t) => {\n\t\tif (t.mode === \"run\" || t.mode === \"queued\") {\n\t\t\tt.mode = \"todo\";\n\t\t\tif (t.type === \"suite\") {\n\t\t\t\ttodoAllTasks(t);\n\t\t\t}\n\t\t}\n\t});\n}\nfunction checkAllowOnly(task, allowOnly) {\n\tif (allowOnly) {\n\t\treturn;\n\t}\n\tconst error = processError(new Error(\"[Vitest] Unexpected .only modifier. Remove it or pass --allowOnly argument to bypass this error\"));\n\ttask.result = {\n\t\tstate: \"fail\",\n\t\terrors: [error]\n\t};\n}\n/* @__NO_SIDE_EFFECTS__ */\nfunction generateHash(str) {\n\tlet hash = 0;\n\tif (str.length === 0) {\n\t\treturn `${hash}`;\n\t}\n\tfor (let i = 0; i < str.length; i++) {\n\t\tconst char = str.charCodeAt(i);\n\t\thash = (hash << 5) - hash + char;\n\t\thash = hash & hash;\n\t}\n\treturn `${hash}`;\n}\nfunction calculateSuiteHash(parent) {\n\tparent.tasks.forEach((t, idx) => {\n\t\tt.id = `${parent.id}_${idx}`;\n\t\tif (t.type === \"suite\") {\n\t\t\tcalculateSuiteHash(t);\n\t\t}\n\t});\n}\nfunction createFileTask(filepath, root, projectName, pool) {\n\tconst path = relative(root, filepath);\n\tconst file = {\n\t\tid: generateFileHash(path, projectName),\n\t\tname: path,\n\t\ttype: \"suite\",\n\t\tmode: \"queued\",\n\t\tfilepath,\n\t\ttasks: [],\n\t\tmeta: Object.create(null),\n\t\tprojectName,\n\t\tfile: undefined,\n\t\tpool\n\t};\n\tfile.file = file;\n\treturn file;\n}\n/**\n* Generate a unique ID for a file based on its path and project name\n* @param file File relative to the root of the project to keep ID the same between different machines\n* @param projectName The name of the test project\n*/\n/* @__NO_SIDE_EFFECTS__ */\nfunction generateFileHash(file, projectName) {\n\treturn /* @__PURE__ */ generateHash(`${file}${projectName || \"\"}`);\n}\nfunction findTestFileStackTrace(testFilePath, error) {\n\t// first line is the error message\n\tconst lines = error.split(\"\\n\").slice(1);\n\tfor (const line of lines) {\n\t\tconst stack = parseSingleStack(line);\n\t\tif (stack && stack.file === testFilePath) {\n\t\t\treturn stack;\n\t\t}\n\t}\n}\n\n/**\n* Return a function for running multiple async operations with limited concurrency.\n*/\nfunction limitConcurrency(concurrency = Infinity) {\n\t// The number of currently active + pending tasks.\n\tlet count = 0;\n\t// The head and tail of the pending task queue, built using a singly linked list.\n\t// Both head and tail are initially undefined, signifying an empty queue.\n\t// They both become undefined again whenever there are no pending tasks.\n\tlet head;\n\tlet tail;\n\t// A bookkeeping function executed whenever a task has been run to completion.\n\tconst finish = () => {\n\t\tcount--;\n\t\t// Check if there are further pending tasks in the queue.\n\t\tif (head) {\n\t\t\t// Allow the next pending task to run and pop it from the queue.\n\t\t\thead[0]();\n\t\t\thead = head[1];\n\t\t\t// The head may now be undefined if there are no further pending tasks.\n\t\t\t// In that case, set tail to undefined as well.\n\t\t\ttail = head && tail;\n\t\t}\n\t};\n\treturn (func, ...args) => {\n\t\t// Create a promise chain that:\n\t\t// 1. Waits for its turn in the task queue (if necessary).\n\t\t// 2. Runs the task.\n\t\t// 3. Allows the next pending task (if any) to run.\n\t\treturn new Promise((resolve) => {\n\t\t\tif (count++ < concurrency) {\n\t\t\t\t// No need to queue if fewer than maxConcurrency tasks are running.\n\t\t\t\tresolve();\n\t\t\t} else if (tail) {\n\t\t\t\t// There are pending tasks, so append to the queue.\n\t\t\t\ttail = tail[1] = [resolve];\n\t\t\t} else {\n\t\t\t\t// No other pending tasks, initialize the queue with a new tail and head.\n\t\t\t\thead = tail = [resolve];\n\t\t\t}\n\t\t}).then(() => {\n\t\t\t// Running func here ensures that even a non-thenable result or an\n\t\t\t// immediately thrown error gets wrapped into a Promise.\n\t\t\treturn func(...args);\n\t\t}).finally(finish);\n\t};\n}\n\n/**\n* Partition in tasks groups by consecutive concurrent\n*/\nfunction partitionSuiteChildren(suite) {\n\tlet tasksGroup = [];\n\tconst tasksGroups = [];\n\tfor (const c of suite.tasks) {\n\t\tif (tasksGroup.length === 0 || c.concurrent === tasksGroup[0].concurrent) {\n\t\t\ttasksGroup.push(c);\n\t\t} else {\n\t\t\ttasksGroups.push(tasksGroup);\n\t\t\ttasksGroup = [c];\n\t\t}\n\t}\n\tif (tasksGroup.length > 0) {\n\t\ttasksGroups.push(tasksGroup);\n\t}\n\treturn tasksGroups;\n}\n\nfunction isTestCase(s) {\n\treturn s.type === \"test\";\n}\nfunction getTests(suite) {\n\tconst tests = [];\n\tconst arraySuites = toArray(suite);\n\tfor (const s of arraySuites) {\n\t\tif (isTestCase(s)) {\n\t\t\ttests.push(s);\n\t\t} else {\n\t\t\tfor (const task of s.tasks) {\n\t\t\t\tif (isTestCase(task)) {\n\t\t\t\t\ttests.push(task);\n\t\t\t\t} else {\n\t\t\t\t\tconst taskTests = getTests(task);\n\t\t\t\t\tfor (const test of taskTests) {\n\t\t\t\t\t\ttests.push(test);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn tests;\n}\nfunction getTasks(tasks = []) {\n\treturn toArray(tasks).flatMap((s) => isTestCase(s) ? [s] : [s, ...getTasks(s.tasks)]);\n}\nfunction getSuites(suite) {\n\treturn toArray(suite).flatMap((s) => s.type === \"suite\" ? [s, ...getSuites(s.tasks)] : []);\n}\nfunction hasTests(suite) {\n\treturn toArray(suite).some((s) => s.tasks.some((c) => isTestCase(c) || hasTests(c)));\n}\nfunction hasFailed(suite) {\n\treturn toArray(suite).some((s) => {\n\t\tvar _s$result;\n\t\treturn ((_s$result = s.result) === null || _s$result === void 0 ? void 0 : _s$result.state) === \"fail\" || s.type === \"suite\" && hasFailed(s.tasks);\n\t});\n}\nfunction getNames(task) {\n\tconst names = [task.name];\n\tlet current = task;\n\twhile (current === null || current === void 0 ? void 0 : current.suite) {\n\t\tcurrent = current.suite;\n\t\tif (current === null || current === void 0 ? void 0 : current.name) {\n\t\t\tnames.unshift(current.name);\n\t\t}\n\t}\n\tif (current !== task.file) {\n\t\tnames.unshift(task.file.name);\n\t}\n\treturn names;\n}\nfunction getFullName(task, separator = \" > \") {\n\treturn getNames(task).join(separator);\n}\nfunction getTestName(task, separator = \" > \") {\n\treturn getNames(task).slice(1).join(separator);\n}\n\nexport { calculateSuiteHash as a, createFileTask as b, createChainable as c, generateHash as d, getFullName as e, findTestFileStackTrace as f, generateFileHash as g, getNames as h, interpretTaskModes as i, getSuites as j, getTasks as k, limitConcurrency as l, getTestName as m, getTests as n, hasFailed as o, partitionSuiteChildren as p, hasTests as q, isTestCase as r, someTasksAreOnly as s };\n","import { getTests } from '@vitest/runner/utils';\nimport c from 'tinyrainbow';\nimport type { RunnerTask } from 'vitest';\nimport type { Vitest } from 'vitest/node';\nimport type { Reporter } from 'vitest/reporters';\n\nexport default class TinyReporter implements Reporter {\n // biome-ignore lint/style/noNonNullAssertion: Non-null assertion is allowed here because the onInit method is called before any other method\n ctx: Vitest = undefined!;\n protected verbose = false;\n\n onInit(ctx: Vitest) {\n this.ctx = ctx;\n }\n\n onFinished(\n files = this.ctx.state.getFiles(),\n errors = this.ctx.state.getUnhandledErrors(),\n ) {\n const { logger } = this.ctx;\n const tests = getTests(files);\n const failedTests = tests.filter((i) => i.result?.state === 'fail').length;\n\n const passed = !(failedTests + errors.length);\n const status = passed ? '\\u2714 PASS' : '\\u2716 FAIL';\n const statusColor = passed ? c.green : c.red;\n\n logger.log(\n `${statusColor(c.bold(c.inverse(` ${status} `)))} ${statusColor(\n passed\n ? 'All tests passed'\n : `${failedTests} test${failedTests > 1 ? 's' : ''} failed`,\n )}`,\n );\n logger.log(this.padTitle('Test Files'), this.getStateString(files));\n logger.log(this.padTitle('Tests'), this.getStateString(tests));\n\n if (errors.length) {\n logger.log(\n this.padTitle('Errors'),\n c.bold(c.red(`${errors.length} error${errors.length > 1 ? 's' : ''}`)),\n );\n }\n\n if (!passed) {\n process.exitCode = 1;\n }\n }\n\n padTitle = (str: string) => c.dim(`${str.padStart(11)} `);\n\n getStateString(tasks: RunnerTask[], name = 'tests') {\n if (!tasks.length) {\n return c.dim(`no ${name}`);\n }\n\n const passed = tasks.filter((i) => i.result?.state === 'pass').length;\n const failed = tasks.filter((i) => i.result?.state === 'fail').length;\n const skipped = tasks.filter((i) => i.mode === 'skip').length;\n const todo = tasks.filter((i) => i.mode === 'todo').length;\n\n return (\n [\n failed && c.bold(c.red(`${failed} failed`)),\n passed && c.bold(c.green(`${passed} passed`)),\n skipped && c.yellow(`${skipped} skipped`),\n todo && c.gray(`${todo} todo`),\n ]\n .filter(Boolean)\n .join(c.dim(' | ')) + c.gray(` (${tasks.length})`)\n );\n }\n}\n"],"names":["toArray","array","isTestCase","getTests","suite","tests","arraySuites","s","task","taskTests","test","TinyReporter","ctx","files","errors","logger","failedTests","i","passed","status","statusColor","c","str","tasks","name","failed","skipped","todo"],"mappings":"4RA8FA,SAASA,EAAQC,EAAO,CAIvB,OAHIA,GAAU,OACbA,EAAQ,CAAA,GAEL,MAAM,QAAQA,CAAK,EACfA,EAED,CAACA,CAAK,CACd,CCyKA,SAASC,EAAW,EAAG,CACtB,OAAO,EAAE,OAAS,MACnB,CACA,SAASC,EAASC,EAAO,CACxB,MAAMC,EAAQ,CAAA,EACRC,EAAcN,EAAQI,CAAK,EACjC,UAAWG,KAAKD,EACf,GAAIJ,EAAWK,CAAC,EACfF,EAAM,KAAKE,CAAC,MAEZ,WAAWC,KAAQD,EAAE,MACpB,GAAIL,EAAWM,CAAI,EAClBH,EAAM,KAAKG,CAAI,MACT,CACN,MAAMC,EAAYN,EAASK,CAAI,EAC/B,UAAWE,KAAQD,EAClBJ,EAAM,KAAKK,CAAI,CAEjB,CAIH,OAAOL,CACR,CChSA,MAAqBM,CAAiC,CAEpD,IAAc,OACJ,QAAU,GAEpB,OAAOC,EAAa,CAClB,KAAK,IAAMA,CACb,CAEA,WACEC,EAAQ,KAAK,IAAI,MAAM,WACvBC,EAAS,KAAK,IAAI,MAAM,mBAAA,EACxB,CACA,KAAM,CAAE,OAAAC,GAAW,KAAK,IAClBV,EAAQF,EAASU,CAAK,EACtBG,EAAcX,EAAM,OAAQY,GAAMA,EAAE,QAAQ,QAAU,MAAM,EAAE,OAE9DC,EAAS,EAAEF,EAAcF,EAAO,QAChCK,EAASD,EAAS,SAAgB,SAClCE,EAAcF,EAASG,EAAE,MAAQA,EAAE,IAEzCN,EAAO,IACL,GAAGK,EAAYC,EAAE,KAAKA,EAAE,QAAQ,IAAIF,CAAM,GAAG,CAAC,CAAC,CAAC,IAAIC,EAClDF,EACI,mBACA,GAAGF,CAAW,QAAQA,EAAc,EAAI,IAAM,EAAE,SAAA,CACrD,EAAA,EAEHD,EAAO,IAAI,KAAK,SAAS,YAAY,EAAG,KAAK,eAAeF,CAAK,CAAC,EAClEE,EAAO,IAAI,KAAK,SAAS,OAAO,EAAG,KAAK,eAAeV,CAAK,CAAC,EAEzDS,EAAO,QACTC,EAAO,IACL,KAAK,SAAS,QAAQ,EACtBM,EAAE,KAAKA,EAAE,IAAI,GAAGP,EAAO,MAAM,SAASA,EAAO,OAAS,EAAI,IAAM,EAAE,EAAE,CAAC,CAAA,EAIpEI,IACH,QAAQ,SAAW,EAEvB,CAEA,SAAYI,GAAgBD,EAAE,IAAI,GAAGC,EAAI,SAAS,EAAE,CAAC,GAAG,EAExD,eAAeC,EAAqBC,EAAO,QAAS,CAClD,GAAI,CAACD,EAAM,OACT,OAAOF,EAAE,IAAI,MAAMG,CAAI,EAAE,EAG3B,MAAMN,EAASK,EAAM,OAAQN,GAAMA,EAAE,QAAQ,QAAU,MAAM,EAAE,OACzDQ,EAASF,EAAM,OAAQN,GAAMA,EAAE,QAAQ,QAAU,MAAM,EAAE,OACzDS,EAAUH,EAAM,OAAQN,GAAMA,EAAE,OAAS,MAAM,EAAE,OACjDU,EAAOJ,EAAM,OAAQN,GAAMA,EAAE,OAAS,MAAM,EAAE,OAEpD,MACE,CACEQ,GAAUJ,EAAE,KAAKA,EAAE,IAAI,GAAGI,CAAM,SAAS,CAAC,EAC1CP,GAAUG,EAAE,KAAKA,EAAE,MAAM,GAAGH,CAAM,SAAS,CAAC,EAC5CQ,GAAWL,EAAE,OAAO,GAAGK,CAAO,UAAU,EACxCC,GAAQN,EAAE,KAAK,GAAGM,CAAI,OAAO,CAAA,EAE5B,OAAO,OAAO,EACd,KAAKN,EAAE,IAAI,KAAK,CAAC,EAAIA,EAAE,KAAK,KAAKE,EAAM,MAAM,GAAG,CAEvD,CACF","x_google_ignoreList":[0,1]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vitest-tiny-reporter",
3
- "version": "1.2.0",
3
+ "version": "1.3.0",
4
4
  "description": "Tiny reporter for vitest",
5
5
  "types": "dist/types/index.d.ts",
6
6
  "files": [
@@ -34,8 +34,8 @@
34
34
  },
35
35
  "homepage": "https://github.com/manbearwiz/vitest-tiny-reporter#readme",
36
36
  "peerDependencies": {
37
- "@vitest/runner": "^2.0.0 || ^3.0.2",
38
- "vitest": "^2.0.0 || ^3.0.2"
37
+ "@vitest/runner": "^2.0.0 || ^3.0.2 || ^4.0.0",
38
+ "vitest": "^2.0.0 || ^3.0.2 || ^4.0.0"
39
39
  },
40
40
  "devDependencies": {
41
41
  "@biomejs/biome": "1.9.4",
@@ -43,14 +43,14 @@
43
43
  "@commitlint/config-angular": "^19.3.0",
44
44
  "@tsconfig/recommended": "^1.0.3",
45
45
  "@tsconfig/strictest": "^2.0.2",
46
- "@tsconfig/vite-react": "^3.0.2",
46
+ "@tsconfig/vite-react": "^6.3.6",
47
47
  "@types/node": "^22.10.0",
48
- "@vitest/coverage-v8": "^2.0.0 || ^3.0.2",
49
- "@vitest/ui": "^2.0.0 || ^3.0.2",
50
- "happy-dom": "^16.2.9",
48
+ "@vitest/coverage-v8": "^2.0.0 || ^3.0.2 || ^4.0.0",
49
+ "@vitest/ui": "^2.0.0 || ^3.0.2 || ^4.0.0",
50
+ "happy-dom": "^18.0.1",
51
51
  "semantic-release": "^24.2.0",
52
52
  "typescript": "^5.2.2",
53
- "vite": "^6.0.1"
53
+ "vite": "^7.1.12"
54
54
  },
55
55
  "dependencies": {
56
56
  "tinyrainbow": "^1.2.0 || ^2.0.0"