1 | 'use strict';
|
2 | const YAML = require('js-yaml');
|
3 | const _ = require('lodash');
|
4 | const functionNames = [
|
5 | 'Ref',
|
6 | 'GetAtt'
|
7 | ];
|
8 | const yamlType = (name, kind) => {
|
9 | const functionName = _.includes(['Ref'], name) ? name : `Fn::${name}`;
|
10 | return new YAML.Type(`!${name}`, {
|
11 | kind,
|
12 | construct: data => {
|
13 | if (name === 'GetAtt') {
|
14 | if (typeof data === 'string') {
|
15 | const [first, ...tail] = data.split('.');
|
16 | data = [first, tail.join('.')];
|
17 | }
|
18 | }
|
19 | return { [functionName]: data };
|
20 | }
|
21 | });
|
22 | };
|
23 | const createSchema = () => {
|
24 | const types = _.flatten(_.map(functionNames, functionName => _.map(['mapping', 'scalar', 'sequence'], kind => yamlType(functionName, kind))));
|
25 | return YAML.Schema.create(types);
|
26 | };
|
27 | module.exports = {
|
28 | schema: createSchema()
|
29 | };
|