blob: 20f286954ff3716eab8266a36311c77b277d09d7 [file] [log] [blame]
Matteo Scandolo4b3bf7f2016-04-12 11:38:40 -07001'use strict';
2
3const protagonist = require('protagonist');
4const fs = require('fs');
5const P = require('bluebird');
6const _ = require('lodash');
7const chalk = require('chalk');
8const Handlebars = require('handlebars');
9
10P.promisifyAll(fs);
11P.promisifyAll(protagonist);
12
13const angualarModuleName = 'xos.helpers'
14
15// format href in angular format
16const formatHref = url => url.replace('{', ':').replace('}', '');
17
18const formatTitle = title => title.split(' ').join('-');
19
20const getParamName = url => url.match(/\{([^)]+)\}/) ? url.match(/\{([^)]+)\}/)[1] : '';
21
22// Get Group description
23const getGroupDescription = (group) => _.find(group, {element: 'copy'}) ? _.find(group, {element: 'copy'}).content.replace(/\n$/, '') : '';
24
25// Loop APIs endpoint
26const loopApiEndpoint = (group) => {
27 // {name: 'ResourceName', attributes: {href: '/ahhsiiis'}}
28 _.remove(group, {element: 'copy'})
29 // console.log(group);
30 // _.forEach(group, d => console.log(d));
31
32 return _.map(group, g => {
33 return {
34 name: formatTitle(g.meta.title),
35 param: {href: formatHref(g.attributes.href), name: getParamName(g.attributes.href)},
36 }
37 })
38};
39
40// Loop APIs groups
41const loopApiGroups = (defs) => {
42 if (!Array.isArray(defs)) {
43 return;
44 }
45 _.forEach(defs, d => {
46 console.info(chalk.blue.bold(`Parsing Group: ${d.meta.title}`));
47 var data = {
48 description: getGroupDescription(d.content),
49 ngModule: angualarModuleName,
50 resources: loopApiEndpoint(d.content)
51 };
52 fs.writeFileSync(`../xosHelpers/src/services/rest/${formatTitle(d.meta.title)}.js`, handlebarsTemplate(data));
53 });
54
55 console.info(chalk.green.bold(`Api Generated`));
56
57};
58
59// Loop the top level definitions
60const loopApiDefinitions = (defs) => {
61 _.forEach(defs, d => loopApiGroups(d.content));
62};
63
64let handlebarsTemplate;
65
66// read blueprint docs and parse
67fs.readFileAsync('./ngResourceTemplate.handlebars', 'utf8')
68.then((template) => {
69 handlebarsTemplate = Handlebars.compile(template);
70 return fs.readFileAsync('../../../xos/tests/api/apiary.apib', 'utf8')
71})
72.then(data => protagonist.parseAsync(data))
73.then(result => loopApiDefinitions(result.content))
74.catch(console.warn);
75