238 lines
6.1 KiB
JavaScript
238 lines
6.1 KiB
JavaScript
'use strict';
|
|
|
|
Object.defineProperty(exports, '__esModule', {
|
|
value: true
|
|
});
|
|
|
|
var _util;
|
|
|
|
function _load_util() {
|
|
return (_util = _interopRequireDefault(require('util')));
|
|
}
|
|
|
|
var _chalk;
|
|
|
|
function _load_chalk() {
|
|
return (_chalk = _interopRequireDefault(require('chalk')));
|
|
}
|
|
|
|
var _prettyFormat;
|
|
|
|
function _load_prettyFormat() {
|
|
return (_prettyFormat = _interopRequireDefault(require('pretty-format')));
|
|
}
|
|
|
|
function _interopRequireDefault(obj) {
|
|
return obj && obj.__esModule ? obj : {default: obj};
|
|
}
|
|
|
|
function _toArray(arr) {
|
|
return Array.isArray(arr) ? arr : Array.from(arr);
|
|
}
|
|
|
|
function _toConsumableArray(arr) {
|
|
if (Array.isArray(arr)) {
|
|
for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++)
|
|
arr2[i] = arr[i];
|
|
return arr2;
|
|
} else {
|
|
return Array.from(arr);
|
|
}
|
|
}
|
|
/**
|
|
* Copyright (c) 2018-present, Facebook, Inc. All rights reserved.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
*
|
|
*/
|
|
|
|
const EXPECTED_COLOR = (_chalk || _load_chalk()).default.green;
|
|
const RECEIVED_COLOR = (_chalk || _load_chalk()).default.red;
|
|
const SUPPORTED_PLACEHOLDERS = /%[sdifjoOp%]/g;
|
|
const PRETTY_PLACEHOLDER = '%p';
|
|
const INDEX_PLACEHOLDER = '%#';
|
|
|
|
exports.default = function(cb) {
|
|
let supportsDone =
|
|
arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
|
return function() {
|
|
for (
|
|
var _len = arguments.length, args = Array(_len), _key = 0;
|
|
_key < _len;
|
|
_key++
|
|
) {
|
|
args[_key] = arguments[_key];
|
|
}
|
|
|
|
return function eachBind(title, test, timeout) {
|
|
if (args.length === 1) {
|
|
const table = args[0].every(Array.isArray)
|
|
? args[0]
|
|
: args[0].map(entry => [entry]);
|
|
return table.forEach((row, i) =>
|
|
cb(
|
|
arrayFormat.apply(
|
|
undefined,
|
|
[title, i].concat(_toConsumableArray(row))
|
|
),
|
|
applyRestParams(supportsDone, row, test),
|
|
timeout
|
|
)
|
|
);
|
|
}
|
|
|
|
const templateStrings = args[0];
|
|
const data = args.slice(1);
|
|
|
|
const keys = getHeadingKeys(templateStrings[0]);
|
|
const table = buildTable(data, keys.length, keys);
|
|
|
|
const missingData = data.length % keys.length;
|
|
|
|
if (missingData > 0) {
|
|
const error = new Error(
|
|
'Not enough arguments supplied for given headings:\n' +
|
|
EXPECTED_COLOR(keys.join(' | ')) +
|
|
'\n\n' +
|
|
'Received:\n' +
|
|
RECEIVED_COLOR(
|
|
(0, (_prettyFormat || _load_prettyFormat()).default)(data)
|
|
) +
|
|
'\n\n' +
|
|
`Missing ${RECEIVED_COLOR(missingData.toString())} ${pluralize(
|
|
'argument',
|
|
missingData
|
|
)}`
|
|
);
|
|
|
|
if (Error.captureStackTrace) {
|
|
Error.captureStackTrace(error, eachBind);
|
|
}
|
|
|
|
return cb(title, () => {
|
|
throw error;
|
|
});
|
|
}
|
|
|
|
return table.forEach(row =>
|
|
cb(
|
|
interpolate(title, row),
|
|
applyObjectParams(supportsDone, row, test),
|
|
timeout
|
|
)
|
|
);
|
|
};
|
|
};
|
|
};
|
|
|
|
const getPrettyIndexes = placeholders =>
|
|
placeholders.reduce(
|
|
(indexes, placeholder, index) =>
|
|
placeholder === PRETTY_PLACEHOLDER ? indexes.concat(index) : indexes,
|
|
[]
|
|
);
|
|
|
|
const arrayFormat = function(title, rowIndex) {
|
|
for (
|
|
var _len2 = arguments.length,
|
|
args = Array(_len2 > 2 ? _len2 - 2 : 0),
|
|
_key2 = 2;
|
|
_key2 < _len2;
|
|
_key2++
|
|
) {
|
|
args[_key2 - 2] = arguments[_key2];
|
|
}
|
|
|
|
const placeholders = title.match(SUPPORTED_PLACEHOLDERS) || [];
|
|
const prettyIndexes = getPrettyIndexes(placeholders);
|
|
|
|
var _args$reduce = args.reduce(
|
|
(acc, arg, index) => {
|
|
if (prettyIndexes.indexOf(index) !== -1) {
|
|
return {
|
|
args: acc.args,
|
|
title: acc.title.replace(
|
|
PRETTY_PLACEHOLDER,
|
|
(0, (_prettyFormat || _load_prettyFormat()).default)(arg, {
|
|
maxDepth: 1,
|
|
min: true
|
|
})
|
|
)
|
|
};
|
|
}
|
|
|
|
return {
|
|
args: acc.args.concat([arg]),
|
|
title: acc.title
|
|
};
|
|
},
|
|
{args: [], title: title}
|
|
);
|
|
|
|
const prettyTitle = _args$reduce.title,
|
|
remainingArgs = _args$reduce.args;
|
|
|
|
return (_util || _load_util()).default.format.apply(
|
|
(_util || _load_util()).default,
|
|
[prettyTitle.replace(INDEX_PLACEHOLDER, rowIndex.toString())].concat(
|
|
_toConsumableArray(
|
|
remainingArgs.slice(0, placeholders.length - prettyIndexes.length)
|
|
)
|
|
)
|
|
);
|
|
};
|
|
|
|
const applyRestParams = (supportsDone, params, test) =>
|
|
supportsDone && params.length < test.length
|
|
? done => test.apply(undefined, _toConsumableArray(params).concat([done]))
|
|
: () => test.apply(undefined, _toConsumableArray(params));
|
|
|
|
const getHeadingKeys = headings => headings.replace(/\s/g, '').split('|');
|
|
|
|
const buildTable = (data, rowSize, keys) =>
|
|
Array.from({length: data.length / rowSize})
|
|
.map((_, index) => data.slice(index * rowSize, index * rowSize + rowSize))
|
|
.map(row =>
|
|
row.reduce(
|
|
(acc, value, index) => Object.assign({}, acc, {[keys[index]]: value}),
|
|
{}
|
|
)
|
|
);
|
|
|
|
const getMatchingKeyPaths = title => (matches, key) =>
|
|
matches.concat(title.match(new RegExp(`\\$${key}[\\.\\w]*`, 'g')) || []);
|
|
|
|
const replaceKeyPathWithValue = data => (title, match) => {
|
|
const keyPath = match.replace('$', '').split('.');
|
|
const value = getPath(data, keyPath);
|
|
return title.replace(
|
|
match,
|
|
(0, (_prettyFormat || _load_prettyFormat()).default)(value, {
|
|
maxDepth: 1,
|
|
min: true
|
|
})
|
|
);
|
|
};
|
|
|
|
const interpolate = (title, data) =>
|
|
Object.keys(data)
|
|
.reduce(getMatchingKeyPaths(title), []) // aka flatMap
|
|
.reduce(replaceKeyPathWithValue(data), title);
|
|
|
|
const applyObjectParams = (supportsDone, obj, test) =>
|
|
supportsDone && test.length > 1 ? done => test(obj, done) : () => test(obj);
|
|
|
|
const pluralize = (word, count) => word + (count === 1 ? '' : 's');
|
|
|
|
const getPath = (o, _ref) => {
|
|
var _ref2 = _toArray(_ref);
|
|
|
|
let head = _ref2[0],
|
|
tail = _ref2.slice(1);
|
|
|
|
if (!head || !o.hasOwnProperty || !o.hasOwnProperty(head)) return o;
|
|
return getPath(o[head], tail);
|
|
};
|