-
-
Notifications
You must be signed in to change notification settings - Fork 39
/
Copy pathabsolutePath.js
60 lines (51 loc) · 1.53 KB
/
absolutePath.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
function errorMessage(schema, data, message) {
return {
keyword: 'absolutePath',
params: { absolutePath: data },
message,
parentSchema: schema,
};
}
function getErrorFor(shouldBeAbsolute, data, schema) {
const message = shouldBeAbsolute
? `The provided value ${JSON.stringify(data)} is not an absolute path!`
: `A relative path is expected. However, the provided value ${JSON.stringify(
data
)} is an absolute path!`;
return errorMessage(schema, data, message);
}
export default (ajv) => {
ajv.addFormat('absolutePath', () => true);
ajv.addKeyword('absolutePath', {
errors: true,
type: 'string',
compile(expected, schema) {
function callback(data) {
let passes = true;
const isExclamationMarkPresent = data.includes('!');
const isCorrectAbsoluteOrRelativePath =
expected === /^(?:[A-Za-z]:\\|\/)/.test(data);
if (isExclamationMarkPresent) {
callback.errors = [
errorMessage(
schema,
data,
`The provided value ${JSON.stringify(
data
)} contains exclamation mark (!) which is not allowed because it's reserved for loader syntax.`
),
];
passes = false;
}
if (!isCorrectAbsoluteOrRelativePath) {
callback.errors = [getErrorFor(expected, data, schema)];
passes = false;
}
return passes;
}
callback.errors = [];
return callback;
},
});
return ajv;
};