-
Notifications
You must be signed in to change notification settings - Fork 21
/
cloudformation-schema.js
52 lines (47 loc) · 1.01 KB
/
cloudformation-schema.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
'use strict';
const yaml = require('js-yaml');
const _ = require('lodash');
const functionNames = [
'And',
'Base64',
'Cidr',
'Condition',
'Equals',
'FindInMap',
'GetAtt',
'GetAZs',
'If',
'ImportValue',
'Join',
'Not',
'Or',
'Ref',
'Select',
'Split',
'Sub',
];
const yamlType = (name, kind) => {
const functionName = ['Ref', 'Condition'].includes(name) ? name : `Fn::${name}`;
return new yaml.Type(`!${name}`, {
kind,
construct: (data) => {
if (name === 'GetAtt') {
// special GetAtt dot syntax
if (typeof data === 'string') {
const [first, ...tail] = data.split('.');
data = [first, tail.join('.')];
}
}
return { [functionName]: data };
},
});
};
const createSchema = () => {
const types = _.flatten(
functionNames.map((functionName) =>
['mapping', 'scalar', 'sequence'].map((kind) => yamlType(functionName, kind))
)
);
return yaml.DEFAULT_SCHEMA.extend(types);
};
module.exports = createSchema();