forked from jestjs/jest
/
validation.ts
76 lines (65 loc) 路 2.09 KB
/
validation.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
/**
* Copyright (c) Facebook, Inc. and its affiliates. 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.
*
*/
import chalk = require('chalk');
import type {Global} from '@jest/types';
import pretty from 'pretty-format';
type TemplateData = Global.TemplateData;
const EXPECTED_COLOR = chalk.green;
const RECEIVED_COLOR = chalk.red;
export const validateArrayTable = (table: unknown): void => {
if (!Array.isArray(table)) {
throw new Error(
'`.each` must be called with an Array or Tagged Template Literal.\n\n' +
`Instead was called with: ${pretty(table, {
maxDepth: 1,
min: true,
})}\n`,
);
}
if (isTaggedTemplateLiteral(table)) {
if (isEmptyString(table[0])) {
throw new Error(
'Error: `.each` called with an empty Tagged Template Literal of table data.\n',
);
}
throw new Error(
'Error: `.each` called with a Tagged Template Literal with no data, remember to interpolate with ${expression} syntax.\n',
);
}
if (isEmptyTable(table)) {
throw new Error(
'Error: `.each` called with an empty Array of table data.\n',
);
}
};
const isTaggedTemplateLiteral = (array: any) => array.raw !== undefined;
const isEmptyTable = (table: Array<unknown>) => table.length === 0;
const isEmptyString = (str: string | unknown) =>
typeof str === 'string' && str.trim() === '';
export const validateTemplateTableHeadings = (
headings: Array<string>,
data: TemplateData,
): void => {
const missingData = data.length % headings.length;
if (missingData > 0) {
throw new Error(
'Not enough arguments supplied for given headings:\n' +
EXPECTED_COLOR(headings.join(' | ')) +
'\n\n' +
'Received:\n' +
RECEIVED_COLOR(pretty(data)) +
'\n\n' +
`Missing ${RECEIVED_COLOR(missingData.toString())} ${pluralize(
'argument',
missingData,
)}`,
);
}
};
const pluralize = (word: string, count: number) =>
word + (count === 1 ? '' : 's');