-
Notifications
You must be signed in to change notification settings - Fork 2
/
validate-args.js
103 lines (94 loc) · 2.51 KB
/
validate-args.js
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import isArray from './is-array.js';
import isFunction from './is-function.js';
import isObject from './is-object.js';
import PaveError from './pave-error.js';
const _validateArgs = ({ args, context, path = [], schema, type, value }) => {
const fail = (code, extra) => {
throw new PaveError(code, {
args,
context,
path,
schema,
type,
value,
...extra
});
};
let isNullable = true;
do {
if (type == null) {
if (value == null && !isNullable) fail('expectedNonNull');
return value;
} else if (!isObject(type)) {
if (schema[type]) type = schema[type];
else fail('unknownType');
} else if (value === undefined && type.defaultValue !== undefined) {
value = type.defaultValue;
} else if (type.nonNull) {
if (value == null) fail('expectedNonNull');
type = type.nonNull;
isNullable = false;
} else if (value == null) return value;
else if (type.arrayOf) {
if (!isArray(value)) fail('expectedArray');
return value.map((value, i) =>
_validateArgs({
args,
context,
path: path.concat(i),
schema,
type: type.arrayOf,
value
})
);
} else if (type.oneOf) type = type.resolveType(value);
else if (type.fields) {
let check = {};
for (const field in type.fields) check[field] = undefined;
check = { ...check, ...value };
const _value = {};
for (const field in check) {
let value = check[field];
const _type = type.fields[field];
if (!_type) fail('unknownField', { field });
value = _validateArgs({
args,
context,
path: path.concat(field),
schema,
type: _type,
value
});
if (value !== undefined) _value[field] = value;
}
return _value;
} else {
let _value = 'resolve' in type ? type.resolve : value;
if (isFunction(_value)) {
_value = _value({
args: validateArgs({
context,
path: path.concat('_args'),
schema,
type,
value: args
}),
context,
value
});
}
args = type.typeArgs;
type = type.type;
value = _value;
}
} while (true);
};
const validateArgs = ({ context, path, schema, type, value }) =>
_validateArgs({
context,
path,
schema,
type: { defaultValue: {}, fields: type.args },
value
});
export default validateArgs;