@japa/runner 3.1.0 → 3.1.2

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.
@@ -83,7 +83,7 @@ var SpecReporter = class extends BaseReporter {
83
83
  * Returns the test message
84
84
  */
85
85
  #getTestMessage(payload) {
86
- const message = typeof payload.title === "string" ? payload.title : payload.title.expanded;
86
+ const message = payload.title.expanded;
87
87
  if (payload.isTodo) {
88
88
  return colors.blue(message);
89
89
  }
@@ -281,4 +281,4 @@ export {
281
281
  dot,
282
282
  ndjson
283
283
  };
284
- //# sourceMappingURL=chunk-52OY4QRJ.js.map
284
+ //# sourceMappingURL=chunk-6IZE72CL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/helpers.ts","../src/reporters/dot.ts","../src/reporters/spec.ts","../src/reporters/ndjson.ts","../src/reporters/main.ts"],"sourcesContent":["/*\n * @japa/runner\n *\n * (c) Japa\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nimport useColors from '@poppinss/colors'\nimport { Colors } from '@poppinss/colors/types'\n\nexport const colors: Colors = useColors.ansi()\n\n/**\n * A collection of platform specific icons\n */\nexport const icons =\n process.platform === 'win32' && !process.env.WT_SESSION\n ? {\n tick: '√',\n cross: '×',\n bullet: '*',\n nodejs: '♦',\n pointer: '>',\n info: 'i',\n warning: '‼',\n squareSmallFilled: '[█]',\n }\n : {\n tick: '✔',\n cross: '✖',\n bullet: '●',\n nodejs: '⬢',\n pointer: '❯',\n info: 'ℹ',\n warning: '⚠',\n squareSmallFilled: '◼',\n }\n","/*\n * @japa/runner\n *\n * (c) Japa\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nimport { colors, icons } from '../helpers.js'\nimport type { TestEndNode } from '../../modules/core/types.js'\nimport { BaseReporter } from '../../modules/core/reporters/base.js'\n\n/**\n * Minimal reporter that prints each test as an icon.\n */\nexport class DotReporter extends BaseReporter {\n /**\n * When a test ended\n */\n protected onTestEnd(payload: TestEndNode) {\n let output = ''\n if (payload.isTodo) {\n output = colors.cyan(icons.info)\n } else if (payload.hasError || payload.isFailing) {\n output = payload.hasError ? colors.magenta(icons.squareSmallFilled) : colors.red(icons.cross)\n } else if (payload.isSkipped) {\n output = colors.yellow(icons.bullet)\n } else {\n output = colors.green(icons.tick)\n }\n\n process.stdout.write(`${output}`)\n }\n\n /**\n * When test runner ended\n */\n protected async end() {\n console.log('')\n await this.printSummary(this.runner!.getSummary())\n }\n}\n","/*\n * @japa/runner\n *\n * (c) Japa\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nimport ms from 'ms'\nimport { relative } from 'node:path'\n\nimport { colors, icons } from '../helpers.js'\nimport { BaseReporter } from '../../modules/core/main.js'\nimport { GroupStartNode, TestEndNode } from '../../modules/core/types.js'\n\n/**\n * Pretty prints the tests on the console\n */\nexport class SpecReporter extends BaseReporter {\n /**\n * Tracking if the first event we get is for a test without any parent group\n * We need this to decide the display style for tests without groups.\n */\n #isFirstLoneTest = true\n\n /**\n * Returns the icon for the test\n */\n #getTestIcon(payload: TestEndNode) {\n if (payload.isTodo) {\n return colors.cyan(icons.info)\n }\n\n if (payload.isFailing) {\n return payload.hasError ? colors.magenta(icons.squareSmallFilled) : colors.red(icons.cross)\n }\n\n if (payload.hasError) {\n return colors.red(icons.cross)\n }\n\n if (payload.isSkipped) {\n return colors.yellow(icons.bullet)\n }\n\n return colors.green(icons.tick)\n }\n\n /**\n * Returns the test message\n */\n #getTestMessage(payload: TestEndNode) {\n const message = payload.title.expanded\n\n if (payload.isTodo) {\n return colors.blue(message)\n }\n\n if (payload.isFailing) {\n return payload.hasError ? colors.magenta(message) : colors.red(message)\n }\n\n if (payload.hasError) {\n return colors.red(message)\n }\n\n if (payload.isSkipped) {\n return colors.yellow(message)\n }\n\n return colors.grey(message)\n }\n\n /**\n * Returns the subtext message for the test\n */\n #getSubText(payload: TestEndNode): string | undefined {\n if (payload.isSkipped && payload.skipReason) {\n return colors.yellow(payload.skipReason)\n }\n\n if (!payload.isFailing) {\n return\n }\n\n if (!payload.hasError) {\n return colors.magenta(`Test marked with \".fails()\" must finish with an error`)\n }\n\n if (payload.failReason) {\n return colors.magenta(payload.failReason)\n }\n\n const testErrorMessage = payload.errors.find((error) => error.phase === 'test')\n if (testErrorMessage && testErrorMessage.error) {\n return colors.magenta(testErrorMessage.error.message)\n }\n }\n\n /**\n * Returns the filename relative from the current working dir\n */\n #getRelativeFilename(fileName: string) {\n return relative(process.cwd(), fileName)\n }\n\n /**\n * Prints the test details\n */\n #printTest(payload: TestEndNode) {\n const icon = this.#getTestIcon(payload)\n const message = this.#getTestMessage(payload)\n const prefix = payload.isPinned ? colors.yellow('[PINNED] ') : ''\n const indentation = this.currentFileName || this.currentGroupName ? ' ' : ''\n const duration = colors.dim(`(${ms(Number(payload.duration.toFixed(2)))})`)\n const retries =\n payload.retryAttempt && payload.retryAttempt > 1\n ? colors.dim(`(x${payload.retryAttempt}) `)\n : ''\n\n let subText = this.#getSubText(payload)\n subText = subText ? `\\n${indentation} ${subText}` : ''\n\n console.log(`${indentation}${icon} ${prefix}${retries}${message} ${duration}${subText}`)\n }\n\n /**\n * Prints the group name\n */\n #printGroup(payload: GroupStartNode) {\n const title =\n this.currentSuiteName !== 'default'\n ? `${this.currentSuiteName} / ${payload.title}`\n : payload.title\n\n const suffix = this.currentFileName\n ? colors.dim(` (${this.#getRelativeFilename(this.currentFileName)})`)\n : ''\n\n console.log(`\\n${title}${suffix}`)\n }\n\n protected onTestStart(): void {\n /**\n * Display the filename when\n *\n * - The filename exists\n * - The test is not under a group\n * - Test is first in a sequence\n */\n if (this.currentFileName && this.#isFirstLoneTest) {\n console.log(`\\n${colors.dim(this.#getRelativeFilename(this.currentFileName))}`)\n }\n this.#isFirstLoneTest = false\n }\n\n protected onTestEnd(payload: TestEndNode): void {\n this.#printTest(payload)\n }\n\n protected onGroupStart(payload: GroupStartNode): void {\n /**\n * When a group starts, we mark the upcoming test as NOT a\n * lone test\n */\n this.#isFirstLoneTest = false\n this.#printGroup(payload)\n }\n\n protected onGroupEnd(): void {\n /**\n * When the group ends we assume that the next test can\n * be out of the group, hence a lone test.\n *\n * If this assumption is false, then the `onGroupStart` method\n * will toggle the boolean\n */\n this.#isFirstLoneTest = true\n }\n\n protected async end() {\n const summary = this.runner!.getSummary()\n await this.printSummary(summary)\n }\n}\n","/*\n * @japa/runner\n *\n * (c) Japa\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nimport { relative } from 'node:path'\nimport { serializeError } from 'serialize-error'\n\nimport { BaseReporter } from '../../modules/core/main.js'\nimport type {\n TestEndNode,\n SuiteEndNode,\n GroupEndNode,\n SuiteStartNode,\n GroupStartNode,\n} from '../../modules/core/types.js'\n\n/**\n * Prints tests progress as JSON. Each event is emitted\n * independently\n */\nexport class NdJSONReporter extends BaseReporter {\n /**\n * Returns the filename relative from the current working dir\n */\n #getRelativeFilename(fileName: string) {\n return relative(process.cwd(), fileName)\n }\n\n /**\n * Serialize errors to JSON\n */\n #serializeErrors(errors: TestEndNode['errors']) {\n return errors.map((error) => ({\n phase: error.phase,\n error: serializeError(error.error),\n }))\n }\n\n protected onTestEnd(payload: TestEndNode): void {\n console.log(\n JSON.stringify({\n event: 'test:end',\n filePath: this.currentFileName,\n relativePath: this.currentFileName\n ? this.#getRelativeFilename(this.currentFileName)\n : undefined,\n title: payload.title,\n duration: payload.duration,\n failReason: payload.failReason,\n isFailing: payload.isFailing,\n skipReason: payload.skipReason,\n isSkipped: payload.isSkipped,\n isTodo: payload.isTodo,\n isPinned: payload.isPinned,\n retryAttempt: payload.retryAttempt,\n retries: payload.retries,\n errors: this.#serializeErrors(payload.errors),\n })\n )\n }\n\n protected onGroupStart(payload: GroupStartNode): void {\n console.log(\n JSON.stringify({\n event: 'group:start',\n title: payload.title,\n })\n )\n }\n\n protected onGroupEnd(payload: GroupEndNode): void {\n JSON.stringify({\n event: 'group:end',\n title: payload.title,\n errors: this.#serializeErrors(payload.errors),\n })\n }\n\n protected onSuiteStart(payload: SuiteStartNode): void {\n console.log(\n JSON.stringify({\n event: 'suite:start',\n ...payload,\n })\n )\n }\n\n protected onSuiteEnd(payload: SuiteEndNode): void {\n console.log(\n JSON.stringify({\n event: 'suite:end',\n ...payload,\n })\n )\n }\n\n protected async end() {\n const summary = this.runner!.getSummary()\n console.log(\n JSON.stringify({\n aggregates: summary.aggregates,\n duration: summary.duration,\n failedTestsTitles: summary.failedTestsTitles,\n hasError: summary.hasError,\n })\n )\n }\n}\n","/*\n * @japa/runner\n *\n * (c) Japa\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nimport { DotReporter } from './dot.js'\nimport { SpecReporter } from './spec.js'\nimport { NdJSONReporter } from './ndjson.js'\nimport type { BaseReporterOptions, NamedReporterContract } from '../types.js'\n\n/**\n * Create an instance of the spec reporter\n */\nexport const spec: (options?: BaseReporterOptions) => NamedReporterContract = (options) => {\n return {\n name: 'spec',\n handler: (...args) => new SpecReporter(options).boot(...args),\n }\n}\n\n/**\n * Create an instance of the dot reporter\n */\nexport const dot: (options?: BaseReporterOptions) => NamedReporterContract = (options) => {\n return {\n name: 'dot',\n handler: (...args) => new DotReporter(options).boot(...args),\n }\n}\n\n/**\n * Create an instance of the ndjson reporter\n */\nexport const ndjson: (options?: BaseReporterOptions) => NamedReporterContract = (options) => {\n return {\n name: 'ndjson',\n handler: (...args) => new NdJSONReporter(options).boot(...args),\n }\n}\n"],"mappings":"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","names":["relative","relative"]}
@@ -2,7 +2,7 @@ import {
2
2
  dot,
3
3
  ndjson,
4
4
  spec
5
- } from "./chunk-52OY4QRJ.js";
5
+ } from "./chunk-6IZE72CL.js";
6
6
  import {
7
7
  Group,
8
8
  Refiner,
@@ -502,4 +502,4 @@ export {
502
502
  createTest,
503
503
  createTestGroup
504
504
  };
505
- //# sourceMappingURL=chunk-IKX2FPUC.js.map
505
+ //# sourceMappingURL=chunk-PSL75GNC.js.map
@@ -5,8 +5,8 @@ import {
5
5
  Planner,
6
6
  createTest,
7
7
  createTestGroup
8
- } from "../chunk-IKX2FPUC.js";
9
- import "../chunk-52OY4QRJ.js";
8
+ } from "../chunk-PSL75GNC.js";
9
+ import "../chunk-6IZE72CL.js";
10
10
  import {
11
11
  Emitter,
12
12
  Runner,
package/build/index.js CHANGED
@@ -7,10 +7,10 @@ import {
7
7
  createTestGroup,
8
8
  debug_default,
9
9
  validator_default
10
- } from "./chunk-IKX2FPUC.js";
10
+ } from "./chunk-PSL75GNC.js";
11
11
  import {
12
12
  colors
13
- } from "./chunk-52OY4QRJ.js";
13
+ } from "./chunk-6IZE72CL.js";
14
14
  import {
15
15
  Emitter,
16
16
  Runner,
@@ -2,7 +2,7 @@ import {
2
2
  dot,
3
3
  ndjson,
4
4
  spec
5
- } from "../../chunk-52OY4QRJ.js";
5
+ } from "../../chunk-6IZE72CL.js";
6
6
  import "../../chunk-PKOB3ULJ.js";
7
7
  import "../../chunk-OBDV3O36.js";
8
8
  export {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@japa/runner",
3
3
  "description": "Runner for Japa testing framework",
4
- "version": "3.1.0",
4
+ "version": "3.1.2",
5
5
  "engines": {
6
6
  "node": ">=18.16.0"
7
7
  },
@@ -37,37 +37,37 @@
37
37
  "sync-labels": "github-label-sync --labels .github/labels.json japa/runner"
38
38
  },
39
39
  "devDependencies": {
40
- "@adonisjs/eslint-config": "^1.1.9",
41
- "@adonisjs/prettier-config": "^1.1.9",
42
- "@adonisjs/tsconfig": "^1.1.9",
43
- "@commitlint/cli": "^18.4.3",
44
- "@commitlint/config-conventional": "^18.4.3",
45
- "@swc/core": "^1.3.99",
46
- "@types/chai": "^4.3.11",
40
+ "@adonisjs/eslint-config": "^1.3.0",
41
+ "@adonisjs/prettier-config": "^1.3.0",
42
+ "@adonisjs/tsconfig": "^1.3.0",
43
+ "@commitlint/cli": "^19.2.1",
44
+ "@commitlint/config-conventional": "^19.1.0",
45
+ "@swc/core": "^1.4.11",
46
+ "@types/chai": "^4.3.14",
47
47
  "@types/chai-subset": "^1.3.5",
48
48
  "@types/find-cache-dir": "^5.0.0",
49
49
  "@types/ms": "^0.7.34",
50
- "@types/node": "^20.9.4",
51
- "c8": "^8.0.1",
52
- "chai": "^4.3.10",
50
+ "@types/node": "^20.11.30",
51
+ "c8": "^9.1.0",
52
+ "chai": "^5.1.0",
53
53
  "chai-subset": "^1.6.0",
54
54
  "cross-env": "^7.0.3",
55
55
  "del-cli": "^5.1.0",
56
- "eslint": "^8.54.0",
56
+ "eslint": "^8.57.0",
57
57
  "github-label-sync": "^2.3.1",
58
- "glob": "^10.3.10",
59
- "husky": "^8.0.3",
60
- "np": "^8.0.4",
61
- "prettier": "^3.1.0",
62
- "ts-node": "^10.9.1",
63
- "tsup": "^8.0.1",
64
- "typescript": "5.2.2"
58
+ "glob": "^10.3.12",
59
+ "husky": "^9.0.11",
60
+ "np": "^10.0.2",
61
+ "prettier": "^3.2.5",
62
+ "ts-node": "^10.9.2",
63
+ "tsup": "^8.0.2",
64
+ "typescript": "^5.4.3"
65
65
  },
66
66
  "dependencies": {
67
- "@japa/core": "^8.1.2",
68
- "@japa/errors-printer": "^3.0.1",
69
- "@poppinss/colors": "^4.1.1",
70
- "@poppinss/hooks": "^7.2.1",
67
+ "@japa/core": "^9.0.1",
68
+ "@japa/errors-printer": "^3.0.3",
69
+ "@poppinss/colors": "^4.1.3",
70
+ "@poppinss/hooks": "^7.2.3",
71
71
  "fast-glob": "^3.3.2",
72
72
  "find-cache-dir": "^5.0.0",
73
73
  "getopts": "^2.3.0",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/helpers.ts","../src/reporters/dot.ts","../src/reporters/spec.ts","../src/reporters/ndjson.ts","../src/reporters/main.ts"],"sourcesContent":["/*\n * @japa/runner\n *\n * (c) Japa\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nimport useColors from '@poppinss/colors'\nimport { Colors } from '@poppinss/colors/types'\n\nexport const colors: Colors = useColors.ansi()\n\n/**\n * A collection of platform specific icons\n */\nexport const icons =\n process.platform === 'win32' && !process.env.WT_SESSION\n ? {\n tick: '√',\n cross: '×',\n bullet: '*',\n nodejs: '♦',\n pointer: '>',\n info: 'i',\n warning: '‼',\n squareSmallFilled: '[█]',\n }\n : {\n tick: '✔',\n cross: '✖',\n bullet: '●',\n nodejs: '⬢',\n pointer: '❯',\n info: 'ℹ',\n warning: '⚠',\n squareSmallFilled: '◼',\n }\n","/*\n * @japa/runner\n *\n * (c) Japa\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nimport { colors, icons } from '../helpers.js'\nimport type { TestEndNode } from '../../modules/core/types.js'\nimport { BaseReporter } from '../../modules/core/reporters/base.js'\n\n/**\n * Minimal reporter that prints each test as an icon.\n */\nexport class DotReporter extends BaseReporter {\n /**\n * When a test ended\n */\n protected onTestEnd(payload: TestEndNode) {\n let output = ''\n if (payload.isTodo) {\n output = colors.cyan(icons.info)\n } else if (payload.hasError || payload.isFailing) {\n output = payload.hasError ? colors.magenta(icons.squareSmallFilled) : colors.red(icons.cross)\n } else if (payload.isSkipped) {\n output = colors.yellow(icons.bullet)\n } else {\n output = colors.green(icons.tick)\n }\n\n process.stdout.write(`${output}`)\n }\n\n /**\n * When test runner ended\n */\n protected async end() {\n console.log('')\n await this.printSummary(this.runner!.getSummary())\n }\n}\n","/*\n * @japa/runner\n *\n * (c) Japa\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nimport ms from 'ms'\nimport { relative } from 'node:path'\n\nimport { colors, icons } from '../helpers.js'\nimport { BaseReporter } from '../../modules/core/main.js'\nimport { GroupStartNode, TestEndNode } from '../../modules/core/types.js'\n\n/**\n * Pretty prints the tests on the console\n */\nexport class SpecReporter extends BaseReporter {\n /**\n * Tracking if the first event we get is for a test without any parent group\n * We need this to decide the display style for tests without groups.\n */\n #isFirstLoneTest = true\n\n /**\n * Returns the icon for the test\n */\n #getTestIcon(payload: TestEndNode) {\n if (payload.isTodo) {\n return colors.cyan(icons.info)\n }\n\n if (payload.isFailing) {\n return payload.hasError ? colors.magenta(icons.squareSmallFilled) : colors.red(icons.cross)\n }\n\n if (payload.hasError) {\n return colors.red(icons.cross)\n }\n\n if (payload.isSkipped) {\n return colors.yellow(icons.bullet)\n }\n\n return colors.green(icons.tick)\n }\n\n /**\n * Returns the test message\n */\n #getTestMessage(payload: TestEndNode) {\n const message = typeof payload.title === 'string' ? payload.title : payload.title.expanded\n\n if (payload.isTodo) {\n return colors.blue(message)\n }\n\n if (payload.isFailing) {\n return payload.hasError ? colors.magenta(message) : colors.red(message)\n }\n\n if (payload.hasError) {\n return colors.red(message)\n }\n\n if (payload.isSkipped) {\n return colors.yellow(message)\n }\n\n return colors.grey(message)\n }\n\n /**\n * Returns the subtext message for the test\n */\n #getSubText(payload: TestEndNode): string | undefined {\n if (payload.isSkipped && payload.skipReason) {\n return colors.yellow(payload.skipReason)\n }\n\n if (!payload.isFailing) {\n return\n }\n\n if (!payload.hasError) {\n return colors.magenta(`Test marked with \".fails()\" must finish with an error`)\n }\n\n if (payload.failReason) {\n return colors.magenta(payload.failReason)\n }\n\n const testErrorMessage = payload.errors.find((error) => error.phase === 'test')\n if (testErrorMessage && testErrorMessage.error) {\n return colors.magenta(testErrorMessage.error.message)\n }\n }\n\n /**\n * Returns the filename relative from the current working dir\n */\n #getRelativeFilename(fileName: string) {\n return relative(process.cwd(), fileName)\n }\n\n /**\n * Prints the test details\n */\n #printTest(payload: TestEndNode) {\n const icon = this.#getTestIcon(payload)\n const message = this.#getTestMessage(payload)\n const prefix = payload.isPinned ? colors.yellow('[PINNED] ') : ''\n const indentation = this.currentFileName || this.currentGroupName ? ' ' : ''\n const duration = colors.dim(`(${ms(Number(payload.duration.toFixed(2)))})`)\n const retries =\n payload.retryAttempt && payload.retryAttempt > 1\n ? colors.dim(`(x${payload.retryAttempt}) `)\n : ''\n\n let subText = this.#getSubText(payload)\n subText = subText ? `\\n${indentation} ${subText}` : ''\n\n console.log(`${indentation}${icon} ${prefix}${retries}${message} ${duration}${subText}`)\n }\n\n /**\n * Prints the group name\n */\n #printGroup(payload: GroupStartNode) {\n const title =\n this.currentSuiteName !== 'default'\n ? `${this.currentSuiteName} / ${payload.title}`\n : payload.title\n\n const suffix = this.currentFileName\n ? colors.dim(` (${this.#getRelativeFilename(this.currentFileName)})`)\n : ''\n\n console.log(`\\n${title}${suffix}`)\n }\n\n protected onTestStart(): void {\n /**\n * Display the filename when\n *\n * - The filename exists\n * - The test is not under a group\n * - Test is first in a sequence\n */\n if (this.currentFileName && this.#isFirstLoneTest) {\n console.log(`\\n${colors.dim(this.#getRelativeFilename(this.currentFileName))}`)\n }\n this.#isFirstLoneTest = false\n }\n\n protected onTestEnd(payload: TestEndNode): void {\n this.#printTest(payload)\n }\n\n protected onGroupStart(payload: GroupStartNode): void {\n /**\n * When a group starts, we mark the upcoming test as NOT a\n * lone test\n */\n this.#isFirstLoneTest = false\n this.#printGroup(payload)\n }\n\n protected onGroupEnd(): void {\n /**\n * When the group ends we assume that the next test can\n * be out of the group, hence a lone test.\n *\n * If this assumption is false, then the `onGroupStart` method\n * will toggle the boolean\n */\n this.#isFirstLoneTest = true\n }\n\n protected async end() {\n const summary = this.runner!.getSummary()\n await this.printSummary(summary)\n }\n}\n","/*\n * @japa/runner\n *\n * (c) Japa\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nimport { relative } from 'node:path'\nimport { serializeError } from 'serialize-error'\n\nimport { BaseReporter } from '../../modules/core/main.js'\nimport type {\n TestEndNode,\n SuiteEndNode,\n GroupEndNode,\n SuiteStartNode,\n GroupStartNode,\n} from '../../modules/core/types.js'\n\n/**\n * Prints tests progress as JSON. Each event is emitted\n * independently\n */\nexport class NdJSONReporter extends BaseReporter {\n /**\n * Returns the filename relative from the current working dir\n */\n #getRelativeFilename(fileName: string) {\n return relative(process.cwd(), fileName)\n }\n\n /**\n * Serialize errors to JSON\n */\n #serializeErrors(errors: TestEndNode['errors']) {\n return errors.map((error) => ({\n phase: error.phase,\n error: serializeError(error.error),\n }))\n }\n\n protected onTestEnd(payload: TestEndNode): void {\n console.log(\n JSON.stringify({\n event: 'test:end',\n filePath: this.currentFileName,\n relativePath: this.currentFileName\n ? this.#getRelativeFilename(this.currentFileName)\n : undefined,\n title: payload.title,\n duration: payload.duration,\n failReason: payload.failReason,\n isFailing: payload.isFailing,\n skipReason: payload.skipReason,\n isSkipped: payload.isSkipped,\n isTodo: payload.isTodo,\n isPinned: payload.isPinned,\n retryAttempt: payload.retryAttempt,\n retries: payload.retries,\n errors: this.#serializeErrors(payload.errors),\n })\n )\n }\n\n protected onGroupStart(payload: GroupStartNode): void {\n console.log(\n JSON.stringify({\n event: 'group:start',\n title: payload.title,\n })\n )\n }\n\n protected onGroupEnd(payload: GroupEndNode): void {\n JSON.stringify({\n event: 'group:end',\n title: payload.title,\n errors: this.#serializeErrors(payload.errors),\n })\n }\n\n protected onSuiteStart(payload: SuiteStartNode): void {\n console.log(\n JSON.stringify({\n event: 'suite:start',\n ...payload,\n })\n )\n }\n\n protected onSuiteEnd(payload: SuiteEndNode): void {\n console.log(\n JSON.stringify({\n event: 'suite:end',\n ...payload,\n })\n )\n }\n\n protected async end() {\n const summary = this.runner!.getSummary()\n console.log(\n JSON.stringify({\n aggregates: summary.aggregates,\n duration: summary.duration,\n failedTestsTitles: summary.failedTestsTitles,\n hasError: summary.hasError,\n })\n )\n }\n}\n","/*\n * @japa/runner\n *\n * (c) Japa\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nimport { DotReporter } from './dot.js'\nimport { SpecReporter } from './spec.js'\nimport { NdJSONReporter } from './ndjson.js'\nimport type { BaseReporterOptions, NamedReporterContract } from '../types.js'\n\n/**\n * Create an instance of the spec reporter\n */\nexport const spec: (options?: BaseReporterOptions) => NamedReporterContract = (options) => {\n return {\n name: 'spec',\n handler: (...args) => new SpecReporter(options).boot(...args),\n }\n}\n\n/**\n * Create an instance of the dot reporter\n */\nexport const dot: (options?: BaseReporterOptions) => NamedReporterContract = (options) => {\n return {\n name: 'dot',\n handler: (...args) => new DotReporter(options).boot(...args),\n }\n}\n\n/**\n * Create an instance of the ndjson reporter\n */\nexport const ndjson: (options?: BaseReporterOptions) => NamedReporterContract = (options) => {\n return {\n name: 'ndjson',\n handler: (...args) => new NdJSONReporter(options).boot(...args),\n }\n}\n"],"mappings":"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","names":["relative","relative"]}