vitest-tiny-reporter 1.1.0 → 1.2.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.
|
@@ -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 === 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.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 = void 0) {\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 === 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}\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 === void 0) {\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(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 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 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}\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, getFullName as d, getNames as e, getSuites as f, generateHash as g, getTasks as h, interpretTaskModes as i, getTestName as j, getTests as k, limitConcurrency as l, hasFailed as m, hasTests as n, isAtomTest as o, partitionSuiteChildren as p, 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","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 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,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
|
|
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});
|
|
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 === 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.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 = void 0) {\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 === 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}\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 === void 0) {\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(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 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 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}\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, getFullName as d, getNames as e, getSuites as f, generateHash as g, getTasks as h, interpretTaskModes as i, getTestName as j, getTests as k, limitConcurrency as l, hasFailed as m, hasTests as n, isAtomTest as o, partitionSuiteChildren as p, 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","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":"gcAwCA,SAASA,EAAQC,EAAO,CAItB,OAHIA,GAAU,OACZA,EAAQ,CAAE,GAER,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,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,CCrMA,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":["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]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vitest-tiny-reporter",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "Tiny reporter for vitest",
|
|
5
5
|
"types": "dist/types/index.d.ts",
|
|
6
6
|
"files": [
|
|
@@ -34,26 +34,26 @@
|
|
|
34
34
|
},
|
|
35
35
|
"homepage": "https://github.com/manbearwiz/vitest-tiny-reporter#readme",
|
|
36
36
|
"peerDependencies": {
|
|
37
|
-
"@vitest/runner": "^2.0.0",
|
|
38
|
-
"vitest": "^2.0.0"
|
|
37
|
+
"@vitest/runner": "^2.0.0 || ^3.0.2",
|
|
38
|
+
"vitest": "^2.0.0 || ^3.0.2"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
41
|
-
"@biomejs/biome": "1.
|
|
41
|
+
"@biomejs/biome": "1.9.4",
|
|
42
42
|
"@commitlint/cli": "^19.3.0",
|
|
43
43
|
"@commitlint/config-angular": "^19.3.0",
|
|
44
44
|
"@tsconfig/recommended": "^1.0.3",
|
|
45
45
|
"@tsconfig/strictest": "^2.0.2",
|
|
46
46
|
"@tsconfig/vite-react": "^3.0.2",
|
|
47
47
|
"@types/node": "^22.10.0",
|
|
48
|
-
"@vitest/coverage-v8": "^2.
|
|
49
|
-
"@vitest/ui": "^2.
|
|
50
|
-
"happy-dom": "^
|
|
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",
|
|
51
51
|
"semantic-release": "^24.2.0",
|
|
52
52
|
"typescript": "^5.2.2",
|
|
53
53
|
"vite": "^6.0.1"
|
|
54
54
|
},
|
|
55
55
|
"dependencies": {
|
|
56
|
-
"tinyrainbow": "^1.2.0"
|
|
56
|
+
"tinyrainbow": "^1.2.0 || ^2.0.0"
|
|
57
57
|
},
|
|
58
58
|
"release": {
|
|
59
59
|
"branches": [
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"root":["../src/index.ts"],"version":"5.6.2"}
|