vitest-tiny-reporter 1.0.3 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,7 +4,7 @@ export declare class TinyReporter implements Reporter {
4
4
  ctx: Vitest;
5
5
  protected verbose: boolean;
6
6
  onInit(ctx: Vitest): void;
7
- onFinished(files?: import("vitest").File[], errors?: unknown[]): void;
7
+ onFinished(files?: import("vitest").RunnerTestFile[], errors?: unknown[]): void;
8
8
  padTitle: (str: string) => string;
9
9
  getStateString(tasks: Task[], name?: string): string;
10
10
  }
@@ -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 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 RegExp(input);\n }\n return new RegExp(m[2], m[3]);\n}\nfunction toArray(array) {\n if (array === null || array === void 0) {\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(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 = void 0) {\n const paths = path.replace(/\\[(\\d+)\\]/g, \".$1\").split(\".\");\n let result = source;\n for (const p of paths) {\n result = Object(result)[p];\n if (result === void 0) {\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}\n\nexport { assertTypes, clone, createDefer, deepClone, 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 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 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 interpretTaskModes(suite, namePattern, onlyMode, parentIsOnly, allowOnly) {\n const suiteIsOnly = parentIsOnly || 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 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 {\n interpretTaskModes(t, namePattern, onlyMode, includeTask, allowOnly);\n }\n }\n });\n if (suite.mode === \"run\") {\n if (suite.tasks.length && suite.tasks.every((i) => i.mode !== \"run\")) {\n suite.mode = \"skip\";\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\") {\n t.mode = \"skip\";\n if (t.type === \"suite\") {\n skipAllTasks(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: generateHash(`${path}${projectName || \"\"}`),\n name: path,\n type: \"suite\",\n mode: \"run\",\n filepath,\n tasks: [],\n meta: /* @__PURE__ */ Object.create(null),\n projectName,\n file: void 0,\n pool\n };\n file.file = file;\n return file;\n}\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 isAtomTest(s) {\n return s.type === \"test\" || s.type === \"custom\";\n}\nfunction getTests(suite) {\n const tests = [];\n const arraySuites = toArray(suite);\n for (const s of arraySuites) {\n if (isAtomTest(s)) {\n tests.push(s);\n } else {\n for (const task of s.tasks) {\n if (isAtomTest(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) => isAtomTest(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) => isAtomTest(c) || hasTests(c))\n );\n}\nfunction hasFailed(suite) {\n return toArray(suite).some(\n (s) => {\n var _a;\n return ((_a = s.result) == null ? void 0 : _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 ? void 0 : current.suite) {\n current = current.suite;\n if (current == null ? void 0 : 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}\n\nexport { createFileTask as a, isAtomTest as b, calculateSuiteHash as c, getTests as d, getTasks as e, getSuites as f, generateHash as g, hasTests as h, interpretTaskModes as i, hasFailed as j, getNames as k, createChainable as l, limitConcurrency as m, partitionSuiteChildren as p, someTasksAreOnly as s };\n","import { getTests } from '@vitest/runner/utils';\nimport c from 'tinyrainbow';\nimport type { Task, Vitest } from 'vitest';\nimport type { Reporter } from 'vitest/reporters';\n\nexport 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: Task[], 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\nexport default TinyReporter;\n"],"names":["toArray","array","isAtomTest","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":["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 RegExp(input);\n }\n return new RegExp(m[2], m[3]);\n}\nfunction toArray(array) {\n if (array === null || array === void 0) {\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(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 = void 0) {\n const paths = path.replace(/\\[(\\d+)\\]/g, \".$1\").split(\".\");\n let result = source;\n for (const p of paths) {\n result = Object(result)[p];\n if (result === void 0) {\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}\n\nexport { assertTypes, clone, createDefer, createSimpleStackTrace, deepClone, 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 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 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 interpretTaskModes(suite, namePattern, onlyMode, parentIsOnly, allowOnly) {\n const suiteIsOnly = parentIsOnly || 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 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 {\n interpretTaskModes(t, namePattern, onlyMode, includeTask, allowOnly);\n }\n }\n });\n if (suite.mode === \"run\") {\n if (suite.tasks.length && suite.tasks.every((i) => i.mode !== \"run\")) {\n suite.mode = \"skip\";\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\") {\n t.mode = \"skip\";\n if (t.type === \"suite\") {\n skipAllTasks(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: generateHash(`${path}${projectName || \"\"}`),\n name: path,\n type: \"suite\",\n mode: \"run\",\n filepath,\n tasks: [],\n meta: /* @__PURE__ */ Object.create(null),\n projectName,\n file: void 0,\n pool\n };\n file.file = file;\n return file;\n}\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 isAtomTest(s) {\n return s.type === \"test\" || s.type === \"custom\";\n}\nfunction getTests(suite) {\n const tests = [];\n const arraySuites = toArray(suite);\n for (const s of arraySuites) {\n if (isAtomTest(s)) {\n tests.push(s);\n } else {\n for (const task of s.tasks) {\n if (isAtomTest(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) => isAtomTest(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) => isAtomTest(c) || hasTests(c))\n );\n}\nfunction hasFailed(suite) {\n return toArray(suite).some(\n (s) => {\n var _a;\n return ((_a = s.result) == null ? void 0 : _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 ? void 0 : current.suite) {\n current = current.suite;\n if (current == null ? void 0 : 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}\n\nexport { createFileTask as a, isAtomTest as b, calculateSuiteHash as c, getTests as d, getTasks as e, getSuites as f, generateHash as g, hasTests as h, interpretTaskModes as i, hasFailed as j, getNames as k, createChainable as l, limitConcurrency as m, partitionSuiteChildren as p, someTasksAreOnly as s };\n","import { getTests } from '@vitest/runner/utils';\nimport c from 'tinyrainbow';\nimport type { Task, Vitest } from 'vitest';\nimport type { Reporter } from 'vitest/reporters';\n\nexport 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: Task[], 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\nexport default TinyReporter;\n"],"names":["toArray","array","isAtomTest","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":";;;;AAwCA,SAASA,EAAQC,GAAO;AAItB,SAHIA,KAAU,SACZA,IAAQ,CAAA,IAEN,MAAM,QAAQA,CAAK,IACdA,IAEF,CAACA,CAAK;AACf;ACoIA,SAASC,EAAWC,GAAG;AACrB,SAAOA,EAAE,SAAS,UAAUA,EAAE,SAAS;AACzC;AACA,SAASC,EAASC,GAAO;AACvB,QAAMC,IAAQ,CAAA,GACRC,IAAcP,EAAQK,CAAK;AACjC,aAAWF,KAAKI;AACd,QAAIL,EAAWC,CAAC;AACd,MAAAG,EAAM,KAAKH,CAAC;AAAA;AAEZ,iBAAWK,KAAQL,EAAE;AACnB,YAAID,EAAWM,CAAI;AACjB,UAAAF,EAAM,KAAKE,CAAI;AAAA,aACV;AACL,gBAAMC,IAAYL,EAASI,CAAI;AAC/B,qBAAWE,KAAQD;AACjB,YAAAH,EAAM,KAAKI,CAAI;AAAA,QAElB;AAIP,SAAOJ;AACT;ACtMO,MAAMK,EAAiC;AAAA,EAAvC;AAEL;AAAA,IAAAC,EAAA;AACU,IAAAA,EAAA,iBAAU;AAwCpB,IAAAA,EAAA,kBAAW,CAACC,MAAgBC,EAAE,IAAI,GAAGD,EAAI,SAAS,EAAE,CAAC,GAAG;AAAA;AAAA,EAtCxD,OAAOE,GAAa;AAClB,SAAK,MAAMA;AAAA,EACb;AAAA,EAEA,WACEC,IAAQ,KAAK,IAAI,MAAM,YACvBC,IAAS,KAAK,IAAI,MAAM,mBAAA,GACxB;AACM,UAAA,EAAE,QAAAC,EAAO,IAAI,KAAK,KAClBZ,IAAQF,EAASY,CAAK,GACtBG,IAAcb,EAAM,OAAO,CAACc;;AAAM,eAAAC,IAAAD,EAAE,WAAF,gBAAAC,EAAU,WAAU;AAAA,KAAM,EAAE,QAE9DC,IAAS,EAAEH,IAAcF,EAAO,SAChCM,IAASD,IAAS,WAAgB,UAClCE,IAAcF,IAASR,EAAE,QAAQA,EAAE;AAElC,IAAAI,EAAA;AAAA,MACL,GAAGM,EAAYV,EAAE,KAAKA,EAAE,QAAQ,IAAIS,CAAM,GAAG,CAAC,CAAC,CAAC,IAAIC;AAAA,QAClDF,IACI,qBACA,GAAGH,CAAW,QAAQA,IAAc,IAAI,MAAM,EAAE;AAAA,MAAA,CACrD;AAAA,IAAA,GAEID,EAAA,IAAI,KAAK,SAAS,YAAY,GAAG,KAAK,eAAeF,CAAK,CAAC,GAC3DE,EAAA,IAAI,KAAK,SAAS,OAAO,GAAG,KAAK,eAAeZ,CAAK,CAAC,GAEzDW,EAAO,UACFC,EAAA;AAAA,MACL,KAAK,SAAS,QAAQ;AAAA,MACtBJ,EAAE,KAAKA,EAAE,IAAI,GAAGG,EAAO,MAAM,SAASA,EAAO,SAAS,IAAI,MAAM,EAAE,EAAE,CAAC;AAAA,IAAA,GAIpEK,MACH,QAAQ,WAAW;AAAA,EAEvB;AAAA,EAIA,eAAeG,GAAeC,IAAO,SAAS;AACxC,QAAA,CAACD,EAAM;AACT,aAAOX,EAAE,IAAI,MAAMY,CAAI,EAAE;AAGrB,UAAAJ,IAASG,EAAM,OAAO,CAACL;;AAAM,eAAAC,IAAAD,EAAE,WAAF,gBAAAC,EAAU,WAAU;AAAA,KAAM,EAAE,QACzDM,IAASF,EAAM,OAAO,CAACL;;AAAM,eAAAC,IAAAD,EAAE,WAAF,gBAAAC,EAAU,WAAU;AAAA,KAAM,EAAE,QACzDO,IAAUH,EAAM,OAAO,CAACL,MAAMA,EAAE,SAAS,MAAM,EAAE,QACjDS,IAAOJ,EAAM,OAAO,CAACL,MAAMA,EAAE,SAAS,MAAM,EAAE;AAGlD,WAAA;AAAA,MACEO,KAAUb,EAAE,KAAKA,EAAE,IAAI,GAAGa,CAAM,SAAS,CAAC;AAAA,MAC1CL,KAAUR,EAAE,KAAKA,EAAE,MAAM,GAAGQ,CAAM,SAAS,CAAC;AAAA,MAC5CM,KAAWd,EAAE,OAAO,GAAGc,CAAO,UAAU;AAAA,MACxCC,KAAQf,EAAE,KAAK,GAAGe,CAAI,OAAO;AAAA,IAAA,EAE5B,OAAO,OAAO,EACd,KAAKf,EAAE,IAAI,KAAK,CAAC,IAAIA,EAAE,KAAK,KAAKW,EAAM,MAAM,GAAG;AAAA,EAEvD;AACF;","x_google_ignoreList":[0,1]}
@@ -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 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 RegExp(input);\n }\n return new RegExp(m[2], m[3]);\n}\nfunction toArray(array) {\n if (array === null || array === void 0) {\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(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 = void 0) {\n const paths = path.replace(/\\[(\\d+)\\]/g, \".$1\").split(\".\");\n let result = source;\n for (const p of paths) {\n result = Object(result)[p];\n if (result === void 0) {\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}\n\nexport { assertTypes, clone, createDefer, deepClone, 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 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 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 interpretTaskModes(suite, namePattern, onlyMode, parentIsOnly, allowOnly) {\n const suiteIsOnly = parentIsOnly || 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 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 {\n interpretTaskModes(t, namePattern, onlyMode, includeTask, allowOnly);\n }\n }\n });\n if (suite.mode === \"run\") {\n if (suite.tasks.length && suite.tasks.every((i) => i.mode !== \"run\")) {\n suite.mode = \"skip\";\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\") {\n t.mode = \"skip\";\n if (t.type === \"suite\") {\n skipAllTasks(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: generateHash(`${path}${projectName || \"\"}`),\n name: path,\n type: \"suite\",\n mode: \"run\",\n filepath,\n tasks: [],\n meta: /* @__PURE__ */ Object.create(null),\n projectName,\n file: void 0,\n pool\n };\n file.file = file;\n return file;\n}\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 isAtomTest(s) {\n return s.type === \"test\" || s.type === \"custom\";\n}\nfunction getTests(suite) {\n const tests = [];\n const arraySuites = toArray(suite);\n for (const s of arraySuites) {\n if (isAtomTest(s)) {\n tests.push(s);\n } else {\n for (const task of s.tasks) {\n if (isAtomTest(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) => isAtomTest(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) => isAtomTest(c) || hasTests(c))\n );\n}\nfunction hasFailed(suite) {\n return toArray(suite).some(\n (s) => {\n var _a;\n return ((_a = s.result) == null ? void 0 : _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 ? void 0 : current.suite) {\n current = current.suite;\n if (current == null ? void 0 : 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}\n\nexport { createFileTask as a, isAtomTest as b, calculateSuiteHash as c, getTests as d, getTasks as e, getSuites as f, generateHash as g, hasTests as h, interpretTaskModes as i, hasFailed as j, getNames as k, createChainable as l, limitConcurrency as m, partitionSuiteChildren as p, someTasksAreOnly as s };\n","import { getTests } from '@vitest/runner/utils';\nimport c from 'tinyrainbow';\nimport type { Task, Vitest } from 'vitest';\nimport type { Reporter } from 'vitest/reporters';\n\nexport 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: Task[], 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\nexport default TinyReporter;\n"],"names":["toArray","array","isAtomTest","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":"wcA4BA,SAASA,EAAQC,EAAO,CAItB,OAHIA,GAAU,OACZA,EAAQ,CAAA,GAEN,MAAM,QAAQA,CAAK,EACdA,EAEF,CAACA,CAAK,CACf,CCgJA,SAASC,EAAWC,EAAG,CACrB,OAAOA,EAAE,OAAS,QAAUA,EAAE,OAAS,QACzC,CACA,SAASC,EAASC,EAAO,CACvB,MAAMC,EAAQ,CAAA,EACRC,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,CAElB,CAIP,OAAOJ,CACT,CCtMO,MAAMK,CAAiC,CAAvC,cAELC,EAAA,YACUA,EAAA,eAAU,IAwCpBA,EAAA,gBAAYC,GAAgBC,EAAE,IAAI,GAAGD,EAAI,SAAS,EAAE,CAAC,GAAG,GAtCxD,OAAOE,EAAa,CAClB,KAAK,IAAMA,CACb,CAEA,WACEC,EAAQ,KAAK,IAAI,MAAM,WACvBC,EAAS,KAAK,IAAI,MAAM,mBAAA,EACxB,CACM,KAAA,CAAE,OAAAC,CAAO,EAAI,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,EAAA,EAEID,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,CAAA,EAIpEK,IACH,QAAQ,SAAW,EAEvB,CAIA,eAAeG,EAAeC,EAAO,QAAS,CACxC,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,CAEvD,CACF","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":["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 RegExp(input);\n }\n return new RegExp(m[2], m[3]);\n}\nfunction toArray(array) {\n if (array === null || array === void 0) {\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(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 = void 0) {\n const paths = path.replace(/\\[(\\d+)\\]/g, \".$1\").split(\".\");\n let result = source;\n for (const p of paths) {\n result = Object(result)[p];\n if (result === void 0) {\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}\n\nexport { assertTypes, clone, createDefer, createSimpleStackTrace, deepClone, 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 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 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 interpretTaskModes(suite, namePattern, onlyMode, parentIsOnly, allowOnly) {\n const suiteIsOnly = parentIsOnly || 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 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 {\n interpretTaskModes(t, namePattern, onlyMode, includeTask, allowOnly);\n }\n }\n });\n if (suite.mode === \"run\") {\n if (suite.tasks.length && suite.tasks.every((i) => i.mode !== \"run\")) {\n suite.mode = \"skip\";\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\") {\n t.mode = \"skip\";\n if (t.type === \"suite\") {\n skipAllTasks(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: generateHash(`${path}${projectName || \"\"}`),\n name: path,\n type: \"suite\",\n mode: \"run\",\n filepath,\n tasks: [],\n meta: /* @__PURE__ */ Object.create(null),\n projectName,\n file: void 0,\n pool\n };\n file.file = file;\n return file;\n}\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 isAtomTest(s) {\n return s.type === \"test\" || s.type === \"custom\";\n}\nfunction getTests(suite) {\n const tests = [];\n const arraySuites = toArray(suite);\n for (const s of arraySuites) {\n if (isAtomTest(s)) {\n tests.push(s);\n } else {\n for (const task of s.tasks) {\n if (isAtomTest(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) => isAtomTest(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) => isAtomTest(c) || hasTests(c))\n );\n}\nfunction hasFailed(suite) {\n return toArray(suite).some(\n (s) => {\n var _a;\n return ((_a = s.result) == null ? void 0 : _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 ? void 0 : current.suite) {\n current = current.suite;\n if (current == null ? void 0 : 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}\n\nexport { createFileTask as a, isAtomTest as b, calculateSuiteHash as c, getTests as d, getTasks as e, getSuites as f, generateHash as g, hasTests as h, interpretTaskModes as i, hasFailed as j, getNames as k, createChainable as l, limitConcurrency as m, partitionSuiteChildren as p, someTasksAreOnly as s };\n","import { getTests } from '@vitest/runner/utils';\nimport c from 'tinyrainbow';\nimport type { Task, Vitest } from 'vitest';\nimport type { Reporter } from 'vitest/reporters';\n\nexport 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: Task[], 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\nexport default TinyReporter;\n"],"names":["toArray","array","isAtomTest","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":"wcAwCA,SAASA,EAAQC,EAAO,CAItB,OAHIA,GAAU,OACZA,EAAQ,CAAA,GAEN,MAAM,QAAQA,CAAK,EACdA,EAEF,CAACA,CAAK,CACf,CCoIA,SAASC,EAAWC,EAAG,CACrB,OAAOA,EAAE,OAAS,QAAUA,EAAE,OAAS,QACzC,CACA,SAASC,EAASC,EAAO,CACvB,MAAMC,EAAQ,CAAA,EACRC,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,CAElB,CAIP,OAAOJ,CACT,CCtMO,MAAMK,CAAiC,CAAvC,cAELC,EAAA,YACUA,EAAA,eAAU,IAwCpBA,EAAA,gBAAYC,GAAgBC,EAAE,IAAI,GAAGD,EAAI,SAAS,EAAE,CAAC,GAAG,GAtCxD,OAAOE,EAAa,CAClB,KAAK,IAAMA,CACb,CAEA,WACEC,EAAQ,KAAK,IAAI,MAAM,WACvBC,EAAS,KAAK,IAAI,MAAM,mBAAA,EACxB,CACM,KAAA,CAAE,OAAAC,CAAO,EAAI,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,EAAA,EAEID,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,CAAA,EAIpEK,IACH,QAAQ,SAAW,EAEvB,CAIA,eAAeG,EAAeC,EAAO,QAAS,CACxC,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,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.0.3",
3
+ "version": "1.0.4",
4
4
  "description": "Tiny reporter for vitest",
5
5
  "types": "dist/types/index.d.ts",
6
6
  "files": [
@@ -33,6 +33,10 @@
33
33
  "url": "https://github.com/manbearwiz/vitest-tiny-reporter/issues"
34
34
  },
35
35
  "homepage": "https://github.com/manbearwiz/vitest-tiny-reporter#readme",
36
+ "peerDependencies": {
37
+ "@vitest/runner": "2.0.5",
38
+ "vitest": "2.0.5"
39
+ },
36
40
  "devDependencies": {
37
41
  "@biomejs/biome": "1.8.3",
38
42
  "@commitlint/cli": "^19.3.0",
@@ -41,17 +45,15 @@
41
45
  "@tsconfig/strictest": "^2.0.2",
42
46
  "@tsconfig/vite-react": "^3.0.2",
43
47
  "@types/node": "^20.12.12",
44
- "@vitest/coverage-v8": "^2.0.3",
45
- "@vitest/ui": "^2.0.3",
48
+ "@vitest/coverage-v8": "^2.0.5",
49
+ "@vitest/ui": "^2.0.5",
46
50
  "happy-dom": "^14.12.3",
47
51
  "semantic-release": "^22.0.0",
48
52
  "typescript": "^5.2.2",
49
53
  "vite": "^5.3.4"
50
54
  },
51
55
  "dependencies": {
52
- "@vitest/runner": "^2.0.3",
53
- "tinyrainbow": "^1.2.0",
54
- "vitest": "^2.0.3"
56
+ "tinyrainbow": "^1.2.0"
55
57
  },
56
58
  "release": {
57
59
  "branches": [