Skip to content

Commit bd91796

Browse files
committed
errors: allow option validation with validators.js
`name` argument is now able to be and object with a `name` and `type` keys. If `type` is `'option'` then `ERR_INVALID_OPT_TYPE` and `ERR_INVALID_OPT_VALUE` errors will be used.
1 parent 5951669 commit bd91796

File tree

1 file changed

+38
-19
lines changed

1 file changed

+38
-19
lines changed

lib/internal/validators.js

Lines changed: 38 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ const {
1111
codes: {
1212
ERR_INVALID_ARG_TYPE,
1313
ERR_INVALID_ARG_VALUE,
14+
ERR_INVALID_OPT_TYPE,
15+
ERR_INVALID_OPT_VALUE,
1416
ERR_OUT_OF_RANGE,
1517
ERR_UNKNOWN_SIGNAL
1618
}
@@ -67,65 +69,84 @@ function parseFileMode(value, name, def) {
6769
throw new ERR_INVALID_ARG_VALUE(name, value, modeDesc);
6870
}
6971

72+
const handleValueName = (name) => {
73+
let TypeErr = ERR_INVALID_ARG_TYPE;
74+
let ValueErr = ERR_INVALID_ARG_VALUE;
75+
if (typeof name === 'object') {
76+
if (name.type === 'option') {
77+
TypeErr = ERR_INVALID_OPT_TYPE;
78+
ValueErr = ERR_INVALID_OPT_VALUE;
79+
}
80+
name = name.name;
81+
}
82+
return { valueName: name, TypeErr, ValueErr };
83+
};
84+
7085
const validateInteger = hideStackFrames(
7186
(value, name, min = NumberMIN_SAFE_INTEGER, max = NumberMAX_SAFE_INTEGER) => {
87+
const { valueName, TypeErr } = handleValueName(name);
7288
if (typeof value !== 'number')
73-
throw new ERR_INVALID_ARG_TYPE(name, 'number', value);
89+
throw new TypeErr(valueName, 'number', value);
7490
if (!NumberIsInteger(value))
75-
throw new ERR_OUT_OF_RANGE(name, 'an integer', value);
91+
throw new ERR_OUT_OF_RANGE(valueName, 'an integer', value);
7692
if (value < min || value > max)
77-
throw new ERR_OUT_OF_RANGE(name, `>= ${min} && <= ${max}`, value);
93+
throw new ERR_OUT_OF_RANGE(valueName, `>= ${min} && <= ${max}`, value);
7894
}
7995
);
8096

8197
const validateInt32 = hideStackFrames(
8298
(value, name, min = -2147483648, max = 2147483647) => {
8399
// The defaults for min and max correspond to the limits of 32-bit integers.
100+
const { valueName, TypeErr } = handleValueName(name);
84101
if (!isInt32(value)) {
85102
if (typeof value !== 'number') {
86-
throw new ERR_INVALID_ARG_TYPE(name, 'number', value);
103+
throw new TypeErr(valueName, 'number', value);
87104
}
88105
if (!NumberIsInteger(value)) {
89-
throw new ERR_OUT_OF_RANGE(name, 'an integer', value);
106+
throw new ERR_OUT_OF_RANGE(valueName, 'an integer', value);
90107
}
91-
throw new ERR_OUT_OF_RANGE(name, `>= ${min} && <= ${max}`, value);
108+
throw new ERR_OUT_OF_RANGE(valueName, `>= ${min} && <= ${max}`, value);
92109
}
93110
if (value < min || value > max) {
94-
throw new ERR_OUT_OF_RANGE(name, `>= ${min} && <= ${max}`, value);
111+
throw new ERR_OUT_OF_RANGE(valueName, `>= ${min} && <= ${max}`, value);
95112
}
96113
}
97114
);
98115

99116
const validateUint32 = hideStackFrames((value, name, positive) => {
117+
const { valueName, TypeErr } = handleValueName(name);
100118
if (!isUint32(value)) {
101119
if (typeof value !== 'number') {
102-
throw new ERR_INVALID_ARG_TYPE(name, 'number', value);
120+
throw new TypeErr(valueName, 'number', value);
103121
}
104122
if (!NumberIsInteger(value)) {
105-
throw new ERR_OUT_OF_RANGE(name, 'an integer', value);
123+
throw new ERR_OUT_OF_RANGE(valueName, 'an integer', value);
106124
}
107125
const min = positive ? 1 : 0;
108126
// 2 ** 32 === 4294967296
109-
throw new ERR_OUT_OF_RANGE(name, `>= ${min} && < 4294967296`, value);
127+
throw new ERR_OUT_OF_RANGE(valueName, `>= ${min} && < 4294967296`, value);
110128
}
111129
if (positive && value === 0) {
112-
throw new ERR_OUT_OF_RANGE(name, '>= 1 && < 4294967296', value);
130+
throw new ERR_OUT_OF_RANGE(valueName, '>= 1 && < 4294967296', value);
113131
}
114132
});
115133

116134
function validateString(value, name) {
135+
const { valueName, TypeErr } = handleValueName(name);
117136
if (typeof value !== 'string')
118-
throw new ERR_INVALID_ARG_TYPE(name, 'string', value);
137+
throw new TypeErr(valueName, 'string', value);
119138
}
120139

121140
function validateNumber(value, name) {
141+
const { valueName, TypeErr } = handleValueName(name);
122142
if (typeof value !== 'number')
123-
throw new ERR_INVALID_ARG_TYPE(name, 'number', value);
143+
throw new TypeErr(valueName, 'number', value);
124144
}
125145

126146
function validateSignalName(signal, name = 'signal') {
147+
const { valueName, TypeErr } = handleValueName(name);
127148
if (typeof signal !== 'string')
128-
throw new ERR_INVALID_ARG_TYPE(name, 'string', signal);
149+
throw new TypeErr(valueName, 'string', signal);
129150

130151
if (signals[signal] === undefined) {
131152
if (signals[signal.toUpperCase()] !== undefined) {
@@ -138,11 +159,9 @@ function validateSignalName(signal, name = 'signal') {
138159
}
139160

140161
const validateBuffer = hideStackFrames((buffer, name = 'buffer') => {
141-
if (!isArrayBufferView(buffer)) {
142-
throw new ERR_INVALID_ARG_TYPE(name,
143-
['Buffer', 'TypedArray', 'DataView'],
144-
buffer);
145-
}
162+
const { valueName, TypeErr } = handleValueName(name);
163+
if (!isArrayBufferView(buffer))
164+
throw new TypeErr(valueName, ['Buffer', 'TypedArray', 'DataView'], buffer);
146165
});
147166

148167
function validateEncoding(data, encoding) {

0 commit comments

Comments
 (0)