mocha 8.1.1 → 8.2.1
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.
- package/CHANGELOG.md +88 -0
- package/README.md +2 -0
- package/browser-entry.js +2 -2
- package/lib/cli/cli.js +19 -8
- package/lib/cli/index.js +0 -6
- package/lib/cli/lookup-files.js +37 -31
- package/lib/cli/node-flags.js +6 -7
- package/lib/cli/options.js +5 -4
- package/lib/cli/run-helpers.js +21 -56
- package/lib/cli/run-option-metadata.js +25 -2
- package/lib/cli/run.js +5 -9
- package/lib/cli/watch-run.js +55 -30
- package/lib/errors.js +142 -20
- package/lib/hook.js +14 -9
- package/lib/mocha.js +266 -66
- package/lib/nodejs/buffered-worker-pool.js +1 -3
- package/lib/nodejs/file-unloader.js +15 -0
- package/lib/nodejs/parallel-buffered-runner.js +156 -18
- package/lib/nodejs/reporters/parallel-buffered.js +61 -29
- package/lib/nodejs/serializer.js +15 -7
- package/lib/nodejs/worker.js +9 -12
- package/lib/plugin-loader.js +286 -0
- package/lib/reporters/json-stream.js +2 -1
- package/lib/reporters/json.js +1 -0
- package/lib/runnable.js +6 -0
- package/lib/runner.js +239 -110
- package/lib/suite.js +34 -15
- package/lib/test.js +6 -2
- package/lib/utils.js +151 -66
- package/mocha.js +7807 -3995
- package/mocha.js.map +1 -1
- package/package.json +68 -56
package/lib/utils.js
CHANGED
|
@@ -9,11 +9,13 @@
|
|
|
9
9
|
* Module dependencies.
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
+
const {nanoid} = require('nanoid/non-secure');
|
|
12
13
|
var path = require('path');
|
|
13
14
|
var util = require('util');
|
|
14
15
|
var he = require('he');
|
|
16
|
+
const errors = require('./errors');
|
|
15
17
|
|
|
16
|
-
|
|
18
|
+
const MOCHA_ID_PROP_NAME = '__mocha_id__';
|
|
17
19
|
|
|
18
20
|
/**
|
|
19
21
|
* Inherit the prototype methods from one constructor into another.
|
|
@@ -127,19 +129,21 @@ function emptyRepresentation(value, typeHint) {
|
|
|
127
129
|
* @param {*} value The value to test.
|
|
128
130
|
* @returns {string} Computed type
|
|
129
131
|
* @example
|
|
130
|
-
*
|
|
131
|
-
*
|
|
132
|
-
*
|
|
133
|
-
*
|
|
134
|
-
*
|
|
135
|
-
*
|
|
136
|
-
*
|
|
137
|
-
*
|
|
138
|
-
*
|
|
139
|
-
*
|
|
140
|
-
*
|
|
132
|
+
* canonicalType({}) // 'object'
|
|
133
|
+
* canonicalType([]) // 'array'
|
|
134
|
+
* canonicalType(1) // 'number'
|
|
135
|
+
* canonicalType(false) // 'boolean'
|
|
136
|
+
* canonicalType(Infinity) // 'number'
|
|
137
|
+
* canonicalType(null) // 'null'
|
|
138
|
+
* canonicalType(new Date()) // 'date'
|
|
139
|
+
* canonicalType(/foo/) // 'regexp'
|
|
140
|
+
* canonicalType('type') // 'string'
|
|
141
|
+
* canonicalType(global) // 'global'
|
|
142
|
+
* canonicalType(new String('foo') // 'object'
|
|
143
|
+
* canonicalType(async function() {}) // 'asyncfunction'
|
|
144
|
+
* canonicalType(await import(name)) // 'module'
|
|
141
145
|
*/
|
|
142
|
-
var
|
|
146
|
+
var canonicalType = (exports.canonicalType = function canonicalType(value) {
|
|
143
147
|
if (value === undefined) {
|
|
144
148
|
return 'undefined';
|
|
145
149
|
} else if (value === null) {
|
|
@@ -153,6 +157,47 @@ var type = (exports.type = function type(value) {
|
|
|
153
157
|
.toLowerCase();
|
|
154
158
|
});
|
|
155
159
|
|
|
160
|
+
/**
|
|
161
|
+
*
|
|
162
|
+
* Returns a general type or data structure of a variable
|
|
163
|
+
* @private
|
|
164
|
+
* @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures
|
|
165
|
+
* @param {*} value The value to test.
|
|
166
|
+
* @returns {string} One of undefined, boolean, number, string, bigint, symbol, object
|
|
167
|
+
* @example
|
|
168
|
+
* type({}) // 'object'
|
|
169
|
+
* type([]) // 'array'
|
|
170
|
+
* type(1) // 'number'
|
|
171
|
+
* type(false) // 'boolean'
|
|
172
|
+
* type(Infinity) // 'number'
|
|
173
|
+
* type(null) // 'null'
|
|
174
|
+
* type(new Date()) // 'object'
|
|
175
|
+
* type(/foo/) // 'object'
|
|
176
|
+
* type('type') // 'string'
|
|
177
|
+
* type(global) // 'object'
|
|
178
|
+
* type(new String('foo') // 'string'
|
|
179
|
+
*/
|
|
180
|
+
exports.type = function type(value) {
|
|
181
|
+
// Null is special
|
|
182
|
+
if (value === null) return 'null';
|
|
183
|
+
const primitives = new Set([
|
|
184
|
+
'undefined',
|
|
185
|
+
'boolean',
|
|
186
|
+
'number',
|
|
187
|
+
'string',
|
|
188
|
+
'bigint',
|
|
189
|
+
'symbol'
|
|
190
|
+
]);
|
|
191
|
+
const _type = typeof value;
|
|
192
|
+
if (_type === 'function') return _type;
|
|
193
|
+
if (primitives.has(_type)) return _type;
|
|
194
|
+
if (value instanceof String) return 'string';
|
|
195
|
+
if (value instanceof Error) return 'error';
|
|
196
|
+
if (Array.isArray(value)) return 'array';
|
|
197
|
+
|
|
198
|
+
return _type;
|
|
199
|
+
};
|
|
200
|
+
|
|
156
201
|
/**
|
|
157
202
|
* Stringify `value`. Different behavior depending on type of value:
|
|
158
203
|
*
|
|
@@ -169,7 +214,7 @@ var type = (exports.type = function type(value) {
|
|
|
169
214
|
* @return {string}
|
|
170
215
|
*/
|
|
171
216
|
exports.stringify = function(value) {
|
|
172
|
-
var typeHint =
|
|
217
|
+
var typeHint = canonicalType(value);
|
|
173
218
|
|
|
174
219
|
if (!~['object', 'array', 'function'].indexOf(typeHint)) {
|
|
175
220
|
if (typeHint === 'buffer') {
|
|
@@ -235,7 +280,7 @@ function jsonStringify(object, spaces, depth) {
|
|
|
235
280
|
}
|
|
236
281
|
|
|
237
282
|
function _stringify(val) {
|
|
238
|
-
switch (
|
|
283
|
+
switch (canonicalType(val)) {
|
|
239
284
|
case 'null':
|
|
240
285
|
case 'undefined':
|
|
241
286
|
val = '[' + val + ']';
|
|
@@ -316,7 +361,7 @@ exports.canonicalize = function canonicalize(value, stack, typeHint) {
|
|
|
316
361
|
/* eslint-disable no-unused-vars */
|
|
317
362
|
var prop;
|
|
318
363
|
/* eslint-enable no-unused-vars */
|
|
319
|
-
typeHint = typeHint ||
|
|
364
|
+
typeHint = typeHint || canonicalType(value);
|
|
320
365
|
function withStack(value, fn) {
|
|
321
366
|
stack.push(value);
|
|
322
367
|
fn();
|
|
@@ -343,7 +388,7 @@ exports.canonicalize = function canonicalize(value, stack, typeHint) {
|
|
|
343
388
|
});
|
|
344
389
|
break;
|
|
345
390
|
case 'function':
|
|
346
|
-
/* eslint-disable
|
|
391
|
+
/* eslint-disable-next-line no-unused-vars */
|
|
347
392
|
for (prop in value) {
|
|
348
393
|
canonicalizedObj = {};
|
|
349
394
|
break;
|
|
@@ -378,50 +423,6 @@ exports.canonicalize = function canonicalize(value, stack, typeHint) {
|
|
|
378
423
|
return canonicalizedObj;
|
|
379
424
|
};
|
|
380
425
|
|
|
381
|
-
/**
|
|
382
|
-
* process.emitWarning or a polyfill
|
|
383
|
-
* @see https://nodejs.org/api/process.html#process_process_emitwarning_warning_options
|
|
384
|
-
* @ignore
|
|
385
|
-
*/
|
|
386
|
-
function emitWarning(msg, type) {
|
|
387
|
-
if (process.emitWarning) {
|
|
388
|
-
process.emitWarning(msg, type);
|
|
389
|
-
} else {
|
|
390
|
-
process.nextTick(function() {
|
|
391
|
-
console.warn(type + ': ' + msg);
|
|
392
|
-
});
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
/**
|
|
397
|
-
* Show a deprecation warning. Each distinct message is only displayed once.
|
|
398
|
-
* Ignores empty messages.
|
|
399
|
-
*
|
|
400
|
-
* @param {string} [msg] - Warning to print
|
|
401
|
-
* @private
|
|
402
|
-
*/
|
|
403
|
-
exports.deprecate = function deprecate(msg) {
|
|
404
|
-
msg = String(msg);
|
|
405
|
-
if (msg && !deprecate.cache[msg]) {
|
|
406
|
-
deprecate.cache[msg] = true;
|
|
407
|
-
emitWarning(msg, 'DeprecationWarning');
|
|
408
|
-
}
|
|
409
|
-
};
|
|
410
|
-
exports.deprecate.cache = {};
|
|
411
|
-
|
|
412
|
-
/**
|
|
413
|
-
* Show a generic warning.
|
|
414
|
-
* Ignores empty messages.
|
|
415
|
-
*
|
|
416
|
-
* @param {string} [msg] - Warning to print
|
|
417
|
-
* @private
|
|
418
|
-
*/
|
|
419
|
-
exports.warn = function warn(msg) {
|
|
420
|
-
if (msg) {
|
|
421
|
-
emitWarning(msg);
|
|
422
|
-
}
|
|
423
|
-
};
|
|
424
|
-
|
|
425
426
|
/**
|
|
426
427
|
* @summary
|
|
427
428
|
* This Filter based on `mocha-clean` module.(see: `github.com/rstacruz/mocha-clean`)
|
|
@@ -508,7 +509,7 @@ exports.isPromise = function isPromise(value) {
|
|
|
508
509
|
* Clamps a numeric value to an inclusive range.
|
|
509
510
|
*
|
|
510
511
|
* @param {number} value - Value to be clamped.
|
|
511
|
-
* @param {
|
|
512
|
+
* @param {number[]} range - Two element array specifying [min, max] range.
|
|
512
513
|
* @returns {number} clamped value
|
|
513
514
|
*/
|
|
514
515
|
exports.clamp = function clamp(value, range) {
|
|
@@ -568,14 +569,14 @@ exports.noop = function() {};
|
|
|
568
569
|
* doesn't support it. Recommended for use in Mocha's public APIs.
|
|
569
570
|
*
|
|
570
571
|
* @public
|
|
571
|
-
* @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map|MDN:Map}
|
|
572
|
+
* @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map#Custom_and_Null_objects|MDN:Map}
|
|
572
573
|
* @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create#Custom_and_Null_objects|MDN:Object.create - Custom objects}
|
|
573
|
-
* @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign|MDN:Object.assign}
|
|
574
|
+
* @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign#Custom_and_Null_objects|MDN:Object.assign}
|
|
574
575
|
* @param {...*} [obj] - Arguments to `Object.assign()`.
|
|
575
576
|
* @returns {Object} An object with no prototype, having `...obj` properties
|
|
576
577
|
*/
|
|
577
578
|
exports.createMap = function(obj) {
|
|
578
|
-
return assign.apply(
|
|
579
|
+
return Object.assign.apply(
|
|
579
580
|
null,
|
|
580
581
|
[Object.create(null)].concat(Array.prototype.slice.call(arguments))
|
|
581
582
|
);
|
|
@@ -594,7 +595,7 @@ exports.createMap = function(obj) {
|
|
|
594
595
|
* @throws {TypeError} if argument is not a non-empty object.
|
|
595
596
|
*/
|
|
596
597
|
exports.defineConstants = function(obj) {
|
|
597
|
-
if (
|
|
598
|
+
if (canonicalType(obj) !== 'object' || !Object.keys(obj).length) {
|
|
598
599
|
throw new TypeError('Invalid argument; expected a non-empty object');
|
|
599
600
|
}
|
|
600
601
|
return Object.freeze(exports.createMap(obj));
|
|
@@ -645,3 +646,87 @@ exports.cwd = function cwd() {
|
|
|
645
646
|
exports.isBrowser = function isBrowser() {
|
|
646
647
|
return Boolean(process.browser);
|
|
647
648
|
};
|
|
649
|
+
|
|
650
|
+
/**
|
|
651
|
+
* Lookup file names at the given `path`.
|
|
652
|
+
*
|
|
653
|
+
* @description
|
|
654
|
+
* Filenames are returned in _traversal_ order by the OS/filesystem.
|
|
655
|
+
* **Make no assumption that the names will be sorted in any fashion.**
|
|
656
|
+
*
|
|
657
|
+
* @public
|
|
658
|
+
* @alias module:lib/cli.lookupFiles
|
|
659
|
+
* @param {string} filepath - Base path to start searching from.
|
|
660
|
+
* @param {string[]} [extensions=[]] - File extensions to look for.
|
|
661
|
+
* @param {boolean} [recursive=false] - Whether to recurse into subdirectories.
|
|
662
|
+
* @return {string[]} An array of paths.
|
|
663
|
+
* @throws {Error} if no files match pattern.
|
|
664
|
+
* @throws {TypeError} if `filepath` is directory and `extensions` not provided.
|
|
665
|
+
* @deprecated Moved to {@link module:lib/cli.lookupFiles}
|
|
666
|
+
*/
|
|
667
|
+
exports.lookupFiles = (...args) => {
|
|
668
|
+
if (exports.isBrowser()) {
|
|
669
|
+
throw errors.createUnsupportedError(
|
|
670
|
+
'lookupFiles() is only supported in Node.js!'
|
|
671
|
+
);
|
|
672
|
+
}
|
|
673
|
+
errors.deprecate(
|
|
674
|
+
'`lookupFiles()` in module `mocha/lib/utils` has moved to module `mocha/lib/cli` and will be removed in the next major revision of Mocha'
|
|
675
|
+
);
|
|
676
|
+
return require('./cli').lookupFiles(...args);
|
|
677
|
+
};
|
|
678
|
+
|
|
679
|
+
/*
|
|
680
|
+
* Casts `value` to an array; useful for optionally accepting array parameters
|
|
681
|
+
*
|
|
682
|
+
* It follows these rules, depending on `value`. If `value` is...
|
|
683
|
+
* 1. `undefined`: return an empty Array
|
|
684
|
+
* 2. `null`: return an array with a single `null` element
|
|
685
|
+
* 3. Any other object: return the value of `Array.from()` _if_ the object is iterable
|
|
686
|
+
* 4. otherwise: return an array with a single element, `value`
|
|
687
|
+
* @param {*} value - Something to cast to an Array
|
|
688
|
+
* @returns {Array<*>}
|
|
689
|
+
*/
|
|
690
|
+
exports.castArray = function castArray(value) {
|
|
691
|
+
if (value === undefined) {
|
|
692
|
+
return [];
|
|
693
|
+
}
|
|
694
|
+
if (value === null) {
|
|
695
|
+
return [null];
|
|
696
|
+
}
|
|
697
|
+
if (
|
|
698
|
+
typeof value === 'object' &&
|
|
699
|
+
(typeof value[Symbol.iterator] === 'function' || value.length !== undefined)
|
|
700
|
+
) {
|
|
701
|
+
return Array.from(value);
|
|
702
|
+
}
|
|
703
|
+
return [value];
|
|
704
|
+
};
|
|
705
|
+
|
|
706
|
+
exports.constants = exports.defineConstants({
|
|
707
|
+
MOCHA_ID_PROP_NAME
|
|
708
|
+
});
|
|
709
|
+
|
|
710
|
+
/**
|
|
711
|
+
* Creates a new unique identifier
|
|
712
|
+
* @returns {string} Unique identifier
|
|
713
|
+
*/
|
|
714
|
+
exports.uniqueID = () => nanoid();
|
|
715
|
+
|
|
716
|
+
exports.assignNewMochaID = obj => {
|
|
717
|
+
const id = exports.uniqueID();
|
|
718
|
+
Object.defineProperty(obj, MOCHA_ID_PROP_NAME, {
|
|
719
|
+
get() {
|
|
720
|
+
return id;
|
|
721
|
+
}
|
|
722
|
+
});
|
|
723
|
+
return obj;
|
|
724
|
+
};
|
|
725
|
+
|
|
726
|
+
/**
|
|
727
|
+
* Retrieves a Mocha ID from an object, if present.
|
|
728
|
+
* @param {*} [obj] - Object
|
|
729
|
+
* @returns {string|void}
|
|
730
|
+
*/
|
|
731
|
+
exports.getMochaID = obj =>
|
|
732
|
+
obj && typeof obj === 'object' ? obj[MOCHA_ID_PROP_NAME] : undefined;
|