Matteo Scandolo | 4b3bf7f | 2016-04-12 11:38:40 -0700 | [diff] [blame] | 1 | 'use strict'; |
| 2 | |
| 3 | const protagonist = require('protagonist'); |
| 4 | const fs = require('fs'); |
| 5 | const P = require('bluebird'); |
| 6 | const _ = require('lodash'); |
| 7 | const chalk = require('chalk'); |
| 8 | const Handlebars = require('handlebars'); |
| 9 | |
| 10 | P.promisifyAll(fs); |
| 11 | P.promisifyAll(protagonist); |
| 12 | |
| 13 | const angualarModuleName = 'xos.helpers' |
| 14 | |
| 15 | // format href in angular format |
| 16 | const formatHref = url => url.replace('{', ':').replace('}', ''); |
| 17 | |
| 18 | const formatTitle = title => title.split(' ').join('-'); |
| 19 | |
| 20 | const getParamName = url => url.match(/\{([^)]+)\}/) ? url.match(/\{([^)]+)\}/)[1] : ''; |
| 21 | |
| 22 | // Get Group description |
| 23 | const getGroupDescription = (group) => _.find(group, {element: 'copy'}) ? _.find(group, {element: 'copy'}).content.replace(/\n$/, '') : ''; |
| 24 | |
| 25 | // Loop APIs endpoint |
| 26 | const 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 |
| 41 | const 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 |
| 60 | const loopApiDefinitions = (defs) => { |
| 61 | _.forEach(defs, d => loopApiGroups(d.content)); |
| 62 | }; |
| 63 | |
| 64 | let handlebarsTemplate; |
| 65 | |
| 66 | // read blueprint docs and parse |
| 67 | fs.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 | |