@japa/runner 3.0.4 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/build/chunk-52OY4QRJ.js +284 -0
  2. package/build/chunk-52OY4QRJ.js.map +1 -0
  3. package/build/chunk-IKX2FPUC.js +505 -0
  4. package/build/chunk-IKX2FPUC.js.map +1 -0
  5. package/build/chunk-OBDV3O36.js +18 -0
  6. package/build/chunk-OBDV3O36.js.map +1 -0
  7. package/build/chunk-PKOB3ULJ.js +270 -0
  8. package/build/chunk-PKOB3ULJ.js.map +1 -0
  9. package/build/factories/main.js +214 -29
  10. package/build/factories/main.js.map +1 -0
  11. package/build/index.js +243 -202
  12. package/build/index.js.map +1 -0
  13. package/build/modules/core/main.d.ts +0 -1
  14. package/build/modules/core/main.js +22 -121
  15. package/build/modules/core/main.js.map +1 -0
  16. package/build/src/files_manager.d.ts +1 -1
  17. package/build/src/reporters/main.js +12 -37
  18. package/build/src/reporters/main.js.map +1 -0
  19. package/build/src/types.d.ts +8 -0
  20. package/build/src/types.js +15 -9
  21. package/build/src/types.js.map +1 -0
  22. package/package.json +42 -26
  23. package/build/factories/create_diverse_tests.js +0 -106
  24. package/build/factories/runner.js +0 -93
  25. package/build/modules/core/reporters/base.js +0 -183
  26. package/build/modules/core/types.js +0 -9
  27. package/build/src/cli_parser.js +0 -75
  28. package/build/src/config_manager.js +0 -168
  29. package/build/src/create_test.js +0 -53
  30. package/build/src/debug.js +0 -10
  31. package/build/src/exceptions_manager.js +0 -85
  32. package/build/src/files_manager.js +0 -57
  33. package/build/src/helpers.js +0 -34
  34. package/build/src/hooks.js +0 -46
  35. package/build/src/planner.js +0 -98
  36. package/build/src/plugins/retry.js +0 -72
  37. package/build/src/reporters/dot.js +0 -41
  38. package/build/src/reporters/ndjson.js +0 -86
  39. package/build/src/reporters/spec.js +0 -152
  40. package/build/src/validator.js +0 -85
@@ -0,0 +1,284 @@
1
+ import {
2
+ BaseReporter
3
+ } from "./chunk-PKOB3ULJ.js";
4
+
5
+ // src/helpers.ts
6
+ import useColors from "@poppinss/colors";
7
+ var colors = useColors.ansi();
8
+ var icons = process.platform === "win32" && !process.env.WT_SESSION ? {
9
+ tick: "\u221A",
10
+ cross: "\xD7",
11
+ bullet: "*",
12
+ nodejs: "\u2666",
13
+ pointer: ">",
14
+ info: "i",
15
+ warning: "\u203C",
16
+ squareSmallFilled: "[\u2588]"
17
+ } : {
18
+ tick: "\u2714",
19
+ cross: "\u2716",
20
+ bullet: "\u25CF",
21
+ nodejs: "\u2B22",
22
+ pointer: "\u276F",
23
+ info: "\u2139",
24
+ warning: "\u26A0",
25
+ squareSmallFilled: "\u25FC"
26
+ };
27
+
28
+ // src/reporters/dot.ts
29
+ var DotReporter = class extends BaseReporter {
30
+ /**
31
+ * When a test ended
32
+ */
33
+ onTestEnd(payload) {
34
+ let output = "";
35
+ if (payload.isTodo) {
36
+ output = colors.cyan(icons.info);
37
+ } else if (payload.hasError || payload.isFailing) {
38
+ output = payload.hasError ? colors.magenta(icons.squareSmallFilled) : colors.red(icons.cross);
39
+ } else if (payload.isSkipped) {
40
+ output = colors.yellow(icons.bullet);
41
+ } else {
42
+ output = colors.green(icons.tick);
43
+ }
44
+ process.stdout.write(`${output}`);
45
+ }
46
+ /**
47
+ * When test runner ended
48
+ */
49
+ async end() {
50
+ console.log("");
51
+ await this.printSummary(this.runner.getSummary());
52
+ }
53
+ };
54
+
55
+ // src/reporters/spec.ts
56
+ import ms from "ms";
57
+ import { relative } from "node:path";
58
+ var SpecReporter = class extends BaseReporter {
59
+ /**
60
+ * Tracking if the first event we get is for a test without any parent group
61
+ * We need this to decide the display style for tests without groups.
62
+ */
63
+ #isFirstLoneTest = true;
64
+ /**
65
+ * Returns the icon for the test
66
+ */
67
+ #getTestIcon(payload) {
68
+ if (payload.isTodo) {
69
+ return colors.cyan(icons.info);
70
+ }
71
+ if (payload.isFailing) {
72
+ return payload.hasError ? colors.magenta(icons.squareSmallFilled) : colors.red(icons.cross);
73
+ }
74
+ if (payload.hasError) {
75
+ return colors.red(icons.cross);
76
+ }
77
+ if (payload.isSkipped) {
78
+ return colors.yellow(icons.bullet);
79
+ }
80
+ return colors.green(icons.tick);
81
+ }
82
+ /**
83
+ * Returns the test message
84
+ */
85
+ #getTestMessage(payload) {
86
+ const message = typeof payload.title === "string" ? payload.title : payload.title.expanded;
87
+ if (payload.isTodo) {
88
+ return colors.blue(message);
89
+ }
90
+ if (payload.isFailing) {
91
+ return payload.hasError ? colors.magenta(message) : colors.red(message);
92
+ }
93
+ if (payload.hasError) {
94
+ return colors.red(message);
95
+ }
96
+ if (payload.isSkipped) {
97
+ return colors.yellow(message);
98
+ }
99
+ return colors.grey(message);
100
+ }
101
+ /**
102
+ * Returns the subtext message for the test
103
+ */
104
+ #getSubText(payload) {
105
+ if (payload.isSkipped && payload.skipReason) {
106
+ return colors.yellow(payload.skipReason);
107
+ }
108
+ if (!payload.isFailing) {
109
+ return;
110
+ }
111
+ if (!payload.hasError) {
112
+ return colors.magenta(`Test marked with ".fails()" must finish with an error`);
113
+ }
114
+ if (payload.failReason) {
115
+ return colors.magenta(payload.failReason);
116
+ }
117
+ const testErrorMessage = payload.errors.find((error) => error.phase === "test");
118
+ if (testErrorMessage && testErrorMessage.error) {
119
+ return colors.magenta(testErrorMessage.error.message);
120
+ }
121
+ }
122
+ /**
123
+ * Returns the filename relative from the current working dir
124
+ */
125
+ #getRelativeFilename(fileName) {
126
+ return relative(process.cwd(), fileName);
127
+ }
128
+ /**
129
+ * Prints the test details
130
+ */
131
+ #printTest(payload) {
132
+ const icon = this.#getTestIcon(payload);
133
+ const message = this.#getTestMessage(payload);
134
+ const prefix = payload.isPinned ? colors.yellow("[PINNED] ") : "";
135
+ const indentation = this.currentFileName || this.currentGroupName ? " " : "";
136
+ const duration = colors.dim(`(${ms(Number(payload.duration.toFixed(2)))})`);
137
+ const retries = payload.retryAttempt && payload.retryAttempt > 1 ? colors.dim(`(x${payload.retryAttempt}) `) : "";
138
+ let subText = this.#getSubText(payload);
139
+ subText = subText ? `
140
+ ${indentation} ${subText}` : "";
141
+ console.log(`${indentation}${icon} ${prefix}${retries}${message} ${duration}${subText}`);
142
+ }
143
+ /**
144
+ * Prints the group name
145
+ */
146
+ #printGroup(payload) {
147
+ const title = this.currentSuiteName !== "default" ? `${this.currentSuiteName} / ${payload.title}` : payload.title;
148
+ const suffix = this.currentFileName ? colors.dim(` (${this.#getRelativeFilename(this.currentFileName)})`) : "";
149
+ console.log(`
150
+ ${title}${suffix}`);
151
+ }
152
+ onTestStart() {
153
+ if (this.currentFileName && this.#isFirstLoneTest) {
154
+ console.log(`
155
+ ${colors.dim(this.#getRelativeFilename(this.currentFileName))}`);
156
+ }
157
+ this.#isFirstLoneTest = false;
158
+ }
159
+ onTestEnd(payload) {
160
+ this.#printTest(payload);
161
+ }
162
+ onGroupStart(payload) {
163
+ this.#isFirstLoneTest = false;
164
+ this.#printGroup(payload);
165
+ }
166
+ onGroupEnd() {
167
+ this.#isFirstLoneTest = true;
168
+ }
169
+ async end() {
170
+ const summary = this.runner.getSummary();
171
+ await this.printSummary(summary);
172
+ }
173
+ };
174
+
175
+ // src/reporters/ndjson.ts
176
+ import { relative as relative2 } from "node:path";
177
+ import { serializeError } from "serialize-error";
178
+ var NdJSONReporter = class extends BaseReporter {
179
+ /**
180
+ * Returns the filename relative from the current working dir
181
+ */
182
+ #getRelativeFilename(fileName) {
183
+ return relative2(process.cwd(), fileName);
184
+ }
185
+ /**
186
+ * Serialize errors to JSON
187
+ */
188
+ #serializeErrors(errors) {
189
+ return errors.map((error) => ({
190
+ phase: error.phase,
191
+ error: serializeError(error.error)
192
+ }));
193
+ }
194
+ onTestEnd(payload) {
195
+ console.log(
196
+ JSON.stringify({
197
+ event: "test:end",
198
+ filePath: this.currentFileName,
199
+ relativePath: this.currentFileName ? this.#getRelativeFilename(this.currentFileName) : void 0,
200
+ title: payload.title,
201
+ duration: payload.duration,
202
+ failReason: payload.failReason,
203
+ isFailing: payload.isFailing,
204
+ skipReason: payload.skipReason,
205
+ isSkipped: payload.isSkipped,
206
+ isTodo: payload.isTodo,
207
+ isPinned: payload.isPinned,
208
+ retryAttempt: payload.retryAttempt,
209
+ retries: payload.retries,
210
+ errors: this.#serializeErrors(payload.errors)
211
+ })
212
+ );
213
+ }
214
+ onGroupStart(payload) {
215
+ console.log(
216
+ JSON.stringify({
217
+ event: "group:start",
218
+ title: payload.title
219
+ })
220
+ );
221
+ }
222
+ onGroupEnd(payload) {
223
+ JSON.stringify({
224
+ event: "group:end",
225
+ title: payload.title,
226
+ errors: this.#serializeErrors(payload.errors)
227
+ });
228
+ }
229
+ onSuiteStart(payload) {
230
+ console.log(
231
+ JSON.stringify({
232
+ event: "suite:start",
233
+ ...payload
234
+ })
235
+ );
236
+ }
237
+ onSuiteEnd(payload) {
238
+ console.log(
239
+ JSON.stringify({
240
+ event: "suite:end",
241
+ ...payload
242
+ })
243
+ );
244
+ }
245
+ async end() {
246
+ const summary = this.runner.getSummary();
247
+ console.log(
248
+ JSON.stringify({
249
+ aggregates: summary.aggregates,
250
+ duration: summary.duration,
251
+ failedTestsTitles: summary.failedTestsTitles,
252
+ hasError: summary.hasError
253
+ })
254
+ );
255
+ }
256
+ };
257
+
258
+ // src/reporters/main.ts
259
+ var spec = (options) => {
260
+ return {
261
+ name: "spec",
262
+ handler: (...args) => new SpecReporter(options).boot(...args)
263
+ };
264
+ };
265
+ var dot = (options) => {
266
+ return {
267
+ name: "dot",
268
+ handler: (...args) => new DotReporter(options).boot(...args)
269
+ };
270
+ };
271
+ var ndjson = (options) => {
272
+ return {
273
+ name: "ndjson",
274
+ handler: (...args) => new NdJSONReporter(options).boot(...args)
275
+ };
276
+ };
277
+
278
+ export {
279
+ colors,
280
+ spec,
281
+ dot,
282
+ ndjson
283
+ };
284
+ //# sourceMappingURL=chunk-52OY4QRJ.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 = 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"]}