mocha-compat 3.6.5 → 10.8.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.
Files changed (88) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +61 -110
  3. package/bin/_mocha +10 -0
  4. package/bin/mocha.js +142 -0
  5. package/browser-entry.js +61 -22
  6. package/lib/browser/highlight-tags.js +39 -0
  7. package/lib/browser/parse-query.js +24 -0
  8. package/lib/{template.html → browser/template.html} +7 -5
  9. package/lib/cli/cli.js +89 -0
  10. package/lib/cli/collect-files.js +137 -0
  11. package/lib/cli/commands.js +14 -0
  12. package/lib/cli/config.js +100 -0
  13. package/lib/cli/index.js +3 -0
  14. package/lib/cli/init.js +36 -0
  15. package/lib/cli/lookup-files.js +150 -0
  16. package/lib/cli/node-flags.js +85 -0
  17. package/lib/cli/one-and-dones.js +69 -0
  18. package/lib/cli/options.js +284 -0
  19. package/lib/cli/run-helpers.js +304 -0
  20. package/lib/cli/run-option-metadata.js +116 -0
  21. package/lib/cli/run.js +380 -0
  22. package/lib/cli/watch-run.js +377 -0
  23. package/lib/context.js +16 -42
  24. package/lib/errors.js +563 -0
  25. package/lib/hook.js +50 -9
  26. package/lib/interfaces/bdd.js +28 -29
  27. package/lib/interfaces/common.js +56 -21
  28. package/lib/interfaces/exports.js +4 -7
  29. package/lib/interfaces/qunit.js +10 -11
  30. package/lib/interfaces/tdd.js +15 -15
  31. package/lib/mocha.js +1073 -292
  32. package/lib/mocharc.json +10 -0
  33. package/lib/nodejs/buffered-worker-pool.js +188 -0
  34. package/lib/nodejs/esm-utils.js +106 -0
  35. package/lib/nodejs/file-unloader.js +15 -0
  36. package/lib/nodejs/parallel-buffered-runner.js +433 -0
  37. package/lib/nodejs/reporters/parallel-buffered.js +165 -0
  38. package/lib/nodejs/serializer.js +414 -0
  39. package/lib/nodejs/worker.js +151 -0
  40. package/lib/pending.js +3 -3
  41. package/lib/plugin-loader.js +286 -0
  42. package/lib/reporters/base.js +305 -205
  43. package/lib/reporters/doc.js +52 -21
  44. package/lib/reporters/dot.js +31 -18
  45. package/lib/reporters/html.js +153 -81
  46. package/lib/reporters/json-stream.js +53 -24
  47. package/lib/reporters/json.js +88 -18
  48. package/lib/reporters/landing.js +38 -16
  49. package/lib/reporters/list.js +34 -19
  50. package/lib/reporters/markdown.js +28 -15
  51. package/lib/reporters/min.js +22 -8
  52. package/lib/reporters/nyan.js +62 -58
  53. package/lib/reporters/progress.js +32 -19
  54. package/lib/reporters/spec.js +41 -23
  55. package/lib/reporters/tap.js +255 -32
  56. package/lib/reporters/xunit.js +89 -39
  57. package/lib/runnable.js +233 -148
  58. package/lib/runner.js +679 -380
  59. package/lib/stats-collector.js +83 -0
  60. package/lib/suite.js +376 -112
  61. package/lib/test.js +82 -21
  62. package/lib/utils.js +364 -477
  63. package/mocha.css +183 -54
  64. package/mocha.js +19315 -19984
  65. package/mocha.js.map +1 -0
  66. package/package.json +162 -334
  67. package/{lib/to-iso-string → vendor/serialize-javascript}/LICENSE +8 -6
  68. package/vendor/serialize-javascript/README.md +10 -0
  69. package/vendor/serialize-javascript/index.js +349 -0
  70. package/bin/_mocha-compat +0 -572
  71. package/bin/mocha-compat +0 -87
  72. package/bin/options.js +0 -41
  73. package/lib/browser/debug.js +0 -7
  74. package/lib/browser/events.js +0 -195
  75. package/lib/browser/progress.js +0 -119
  76. package/lib/browser/tty.js +0 -13
  77. package/lib/ms.js +0 -130
  78. package/lib/to-iso-string/index.js +0 -37
  79. package/vendor/glob/LICENSE +0 -15
  80. package/vendor/glob/README.md +0 -399
  81. package/vendor/glob/common.js +0 -244
  82. package/vendor/glob/glob.js +0 -788
  83. package/vendor/glob/package.json +0 -55
  84. package/vendor/glob/sync.js +0 -486
  85. package/vendor/inflight/LICENSE +0 -15
  86. package/vendor/inflight/README.md +0 -37
  87. package/vendor/inflight/inflight.js +0 -54
  88. package/vendor/inflight/package.json +0 -29
package/lib/cli/run.js ADDED
@@ -0,0 +1,380 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Definition for Mocha's default ("run tests") command
5
+ *
6
+ * @module
7
+ * @private
8
+ */
9
+
10
+ const symbols = require('log-symbols');
11
+ const ansi = require('ansi-colors');
12
+ const Mocha = require('../mocha');
13
+ const {
14
+ createUnsupportedError,
15
+ createInvalidArgumentValueError,
16
+ createMissingArgumentError
17
+ } = require('../errors');
18
+
19
+ const {
20
+ list,
21
+ handleRequires,
22
+ validateLegacyPlugin,
23
+ runMocha
24
+ } = require('./run-helpers');
25
+ const {ONE_AND_DONES, ONE_AND_DONE_ARGS} = require('./one-and-dones');
26
+ const debug = require('debug')('mocha:cli:run');
27
+ const defaults = require('../mocharc.json');
28
+ const {types, aliases} = require('./run-option-metadata');
29
+
30
+ /**
31
+ * Logical option groups
32
+ * @constant
33
+ */
34
+ const GROUPS = {
35
+ FILES: 'File Handling',
36
+ FILTERS: 'Test Filters',
37
+ NODEJS: 'Node.js & V8',
38
+ OUTPUT: 'Reporting & Output',
39
+ RULES: 'Rules & Behavior',
40
+ CONFIG: 'Configuration'
41
+ };
42
+
43
+ exports.command = ['$0 [spec..]', 'inspect'];
44
+
45
+ exports.describe = 'Run tests with Mocha';
46
+
47
+ exports.builder = yargs =>
48
+ yargs
49
+ .options({
50
+ 'allow-uncaught': {
51
+ description: 'Allow uncaught errors to propagate',
52
+ group: GROUPS.RULES
53
+ },
54
+ 'async-only': {
55
+ description:
56
+ 'Require all tests to use a callback (async) or return a Promise',
57
+ group: GROUPS.RULES
58
+ },
59
+ bail: {
60
+ description: 'Abort ("bail") after first test failure',
61
+ group: GROUPS.RULES
62
+ },
63
+ 'check-leaks': {
64
+ description: 'Check for global variable leaks',
65
+ group: GROUPS.RULES
66
+ },
67
+ color: {
68
+ description: 'Force-enable color output',
69
+ group: GROUPS.OUTPUT
70
+ },
71
+ config: {
72
+ config: true,
73
+ defaultDescription: '(nearest rc file)',
74
+ description: 'Path to config file',
75
+ group: GROUPS.CONFIG
76
+ },
77
+ delay: {
78
+ description: 'Delay initial execution of root suite',
79
+ group: GROUPS.RULES
80
+ },
81
+ diff: {
82
+ default: true,
83
+ description: 'Show diff on failure',
84
+ group: GROUPS.OUTPUT
85
+ },
86
+ 'dry-run': {
87
+ description: 'Report tests without executing them',
88
+ group: GROUPS.RULES
89
+ },
90
+ exit: {
91
+ description: 'Force Mocha to quit after tests complete',
92
+ group: GROUPS.RULES
93
+ },
94
+ extension: {
95
+ default: defaults.extension,
96
+ description: 'File extension(s) to load',
97
+ group: GROUPS.FILES,
98
+ requiresArg: true,
99
+ coerce: list
100
+ },
101
+ 'pass-on-failing-test-suite': {
102
+ default: false,
103
+ description: 'Not fail test run if tests were failed',
104
+ group: GROUPS.RULES
105
+ },
106
+ 'fail-zero': {
107
+ description: 'Fail test run if no test(s) encountered',
108
+ group: GROUPS.RULES
109
+ },
110
+ fgrep: {
111
+ conflicts: 'grep',
112
+ description: 'Only run tests containing this string',
113
+ group: GROUPS.FILTERS,
114
+ requiresArg: true
115
+ },
116
+ file: {
117
+ defaultDescription: '(none)',
118
+ description:
119
+ 'Specify file(s) to be loaded prior to root suite execution',
120
+ group: GROUPS.FILES,
121
+ normalize: true,
122
+ requiresArg: true
123
+ },
124
+ 'forbid-only': {
125
+ description: 'Fail if exclusive test(s) encountered',
126
+ group: GROUPS.RULES
127
+ },
128
+ 'forbid-pending': {
129
+ description: 'Fail if pending test(s) encountered',
130
+ group: GROUPS.RULES
131
+ },
132
+ 'full-trace': {
133
+ description: 'Display full stack traces',
134
+ group: GROUPS.OUTPUT
135
+ },
136
+ global: {
137
+ coerce: list,
138
+ description: 'List of allowed global variables',
139
+ group: GROUPS.RULES,
140
+ requiresArg: true
141
+ },
142
+ grep: {
143
+ coerce: value => (!value ? null : value),
144
+ conflicts: 'fgrep',
145
+ description: 'Only run tests matching this string or regexp',
146
+ group: GROUPS.FILTERS,
147
+ requiresArg: true
148
+ },
149
+ ignore: {
150
+ defaultDescription: '(none)',
151
+ description: 'Ignore file(s) or glob pattern(s)',
152
+ group: GROUPS.FILES,
153
+ requiresArg: true
154
+ },
155
+ 'inline-diffs': {
156
+ description:
157
+ 'Display actual/expected differences inline within each string',
158
+ group: GROUPS.OUTPUT
159
+ },
160
+ invert: {
161
+ description: 'Inverts --grep and --fgrep matches',
162
+ group: GROUPS.FILTERS
163
+ },
164
+ jobs: {
165
+ description:
166
+ 'Number of concurrent jobs for --parallel; use 1 to run in serial',
167
+ defaultDescription: '(number of CPU cores - 1)',
168
+ requiresArg: true,
169
+ group: GROUPS.RULES
170
+ },
171
+ 'list-interfaces': {
172
+ conflicts: Array.from(ONE_AND_DONE_ARGS),
173
+ description: 'List built-in user interfaces & exit'
174
+ },
175
+ 'list-reporters': {
176
+ conflicts: Array.from(ONE_AND_DONE_ARGS),
177
+ description: 'List built-in reporters & exit'
178
+ },
179
+ 'no-colors': {
180
+ description: 'Force-disable color output',
181
+ group: GROUPS.OUTPUT,
182
+ hidden: true
183
+ },
184
+ 'node-option': {
185
+ description: 'Node or V8 option (no leading "--")',
186
+ group: GROUPS.CONFIG
187
+ },
188
+ package: {
189
+ description: 'Path to package.json for config',
190
+ group: GROUPS.CONFIG,
191
+ normalize: true,
192
+ requiresArg: true
193
+ },
194
+ parallel: {
195
+ description: 'Run tests in parallel',
196
+ group: GROUPS.RULES
197
+ },
198
+ recursive: {
199
+ description: 'Look for tests in subdirectories',
200
+ group: GROUPS.FILES
201
+ },
202
+ reporter: {
203
+ default: defaults.reporter,
204
+ description: 'Specify reporter to use',
205
+ group: GROUPS.OUTPUT,
206
+ requiresArg: true
207
+ },
208
+ 'reporter-option': {
209
+ coerce: opts =>
210
+ list(opts).reduce((acc, opt) => {
211
+ const pair = opt.split('=');
212
+
213
+ if (pair.length > 2 || !pair.length) {
214
+ throw createInvalidArgumentValueError(
215
+ `invalid reporter option '${opt}'`,
216
+ '--reporter-option',
217
+ opt,
218
+ 'expected "key=value" format'
219
+ );
220
+ }
221
+
222
+ acc[pair[0]] = pair.length === 2 ? pair[1] : true;
223
+ return acc;
224
+ }, {}),
225
+ description: 'Reporter-specific options (<k=v,[k1=v1,..]>)',
226
+ group: GROUPS.OUTPUT,
227
+ requiresArg: true
228
+ },
229
+ require: {
230
+ defaultDescription: '(none)',
231
+ description: 'Require module',
232
+ group: GROUPS.FILES,
233
+ requiresArg: true
234
+ },
235
+ retries: {
236
+ description: 'Retry failed tests this many times',
237
+ group: GROUPS.RULES
238
+ },
239
+ slow: {
240
+ default: defaults.slow,
241
+ description: 'Specify "slow" test threshold (in milliseconds)',
242
+ group: GROUPS.RULES
243
+ },
244
+ sort: {
245
+ description: 'Sort test files',
246
+ group: GROUPS.FILES
247
+ },
248
+ timeout: {
249
+ default: defaults.timeout,
250
+ description: 'Specify test timeout threshold (in milliseconds)',
251
+ group: GROUPS.RULES
252
+ },
253
+ ui: {
254
+ default: defaults.ui,
255
+ description: 'Specify user interface',
256
+ group: GROUPS.RULES,
257
+ requiresArg: true
258
+ },
259
+ watch: {
260
+ description: 'Watch files in the current working directory for changes',
261
+ group: GROUPS.FILES
262
+ },
263
+ 'watch-files': {
264
+ description: 'List of paths or globs to watch',
265
+ group: GROUPS.FILES,
266
+ requiresArg: true,
267
+ coerce: list
268
+ },
269
+ 'watch-ignore': {
270
+ description: 'List of paths or globs to exclude from watching',
271
+ group: GROUPS.FILES,
272
+ requiresArg: true,
273
+ coerce: list,
274
+ default: defaults['watch-ignore']
275
+ }
276
+ })
277
+ .positional('spec', {
278
+ default: ['test'],
279
+ description: 'One or more files, directories, or globs to test',
280
+ type: 'array'
281
+ })
282
+ .check(argv => {
283
+ // "one-and-dones"; let yargs handle help and version
284
+ Object.keys(ONE_AND_DONES).forEach(opt => {
285
+ if (argv[opt]) {
286
+ ONE_AND_DONES[opt].call(null, yargs);
287
+ process.exit();
288
+ }
289
+ });
290
+
291
+ // yargs.implies() isn't flexible enough to handle this
292
+ if (argv.invert && !('fgrep' in argv || 'grep' in argv)) {
293
+ throw createMissingArgumentError(
294
+ '"--invert" requires one of "--fgrep <str>" or "--grep <regexp>"',
295
+ '--fgrep|--grep',
296
+ 'string|regexp'
297
+ );
298
+ }
299
+
300
+ if (argv.parallel) {
301
+ // yargs.conflicts() can't deal with `--file foo.js --no-parallel`, either
302
+ if (argv.file) {
303
+ throw createUnsupportedError(
304
+ '--parallel runs test files in a non-deterministic order, and is mutually exclusive with --file'
305
+ );
306
+ }
307
+
308
+ // or this
309
+ if (argv.sort) {
310
+ throw createUnsupportedError(
311
+ '--parallel runs test files in a non-deterministic order, and is mutually exclusive with --sort'
312
+ );
313
+ }
314
+
315
+ if (argv.reporter === 'progress') {
316
+ throw createUnsupportedError(
317
+ '--reporter=progress is mutually exclusive with --parallel'
318
+ );
319
+ }
320
+
321
+ if (argv.reporter === 'markdown') {
322
+ throw createUnsupportedError(
323
+ '--reporter=markdown is mutually exclusive with --parallel'
324
+ );
325
+ }
326
+
327
+ if (argv.reporter === 'json-stream') {
328
+ throw createUnsupportedError(
329
+ '--reporter=json-stream is mutually exclusive with --parallel'
330
+ );
331
+ }
332
+ }
333
+
334
+ if (argv.compilers) {
335
+ throw createUnsupportedError(
336
+ `--compilers is DEPRECATED and no longer supported.
337
+ See https://github.com/mochajs/mocha/wiki/compilers-deprecation for migration information.`
338
+ );
339
+ }
340
+
341
+ if (argv.opts) {
342
+ throw createUnsupportedError(
343
+ `--opts: configuring Mocha via 'mocha.opts' is DEPRECATED and no longer supported.
344
+ Please use a configuration file instead.`
345
+ );
346
+ }
347
+
348
+ return true;
349
+ })
350
+ .middleware(async (argv, yargs) => {
351
+ // currently a failing middleware does not work nicely with yargs' `fail()`.
352
+ try {
353
+ // load requires first, because it can impact "plugin" validation
354
+ const plugins = await handleRequires(argv.require);
355
+ validateLegacyPlugin(argv, 'reporter', Mocha.reporters);
356
+ validateLegacyPlugin(argv, 'ui', Mocha.interfaces);
357
+ Object.assign(argv, plugins);
358
+ } catch (err) {
359
+ // this could be a bad --require, bad reporter, ui, etc.
360
+ console.error(`\n${symbols.error} ${ansi.red('ERROR:')}`, err);
361
+ yargs.exit(1);
362
+ }
363
+ })
364
+ .array(types.array)
365
+ .boolean(types.boolean)
366
+ .string(types.string)
367
+ .number(types.number)
368
+ .alias(aliases);
369
+
370
+ exports.handler = async function (argv) {
371
+ debug('post-yargs config', argv);
372
+ const mocha = new Mocha(argv);
373
+
374
+ try {
375
+ await runMocha(mocha, argv);
376
+ } catch (err) {
377
+ console.error('\n Exception during run:', err);
378
+ process.exit(1);
379
+ }
380
+ };