UNPKG

arrow-admin

Version:
157 lines (132 loc) 3.9 kB
var crypto = require('crypto'), fs = require('fs'), path = require('path'), _ = require('lodash'); function md5(value) { return crypto.createHash('md5').update(value).digest('hex'); } function redirect(res, url) { res.redirect(url); } function html(res, content) { res.set('Content-Type','text/html'); res.send(content || '<html></html>'); } function javascript(res, content) { res.set('Content-Type','text/javascript'); res.send(content || '/* */'); } function css(res, content) { res.set('Content-Type','text/css'); res.send(content || '/* */'); } function json(res, content) { res.json(content); } function nocontent(res) { res.sendStatus(204); } function gravatar(email) { return 'http://www.gravatar.com/avatar/'+md5(email)+'.png'; } function home() { return process.env.HOME || process.env.HOMEPATH || process.env.USERPROFILE; } function preferences () { var _home = home(), cfg = {}; ['.appcelerator/appc-cli.json','.acs','.titanium/config.json'].forEach(function(name){ var p = path.join(_home, name); if (fs.existsSync(p)) { _.defaults(cfg, JSON.parse(fs.readFileSync(p).toString())); } }); if (!cfg.username) { cfg.username = process.env.APPC_SESSION_USERNAME || cfg.user && cfg.user.email; } return cfg; } function etag(stats) { if (typeof stats === 'string') { return md5(stats); } return md5(stats.ino + stats.mtime); } const VERBMAP = { 'GET': 'read', 'PUT': 'update', 'POST': 'create', 'DELETE': 'delete' }; function safeName(name) { return name.replace(/^\//,'').split('/')[0].replace(/\s+/g,'-'); } function generateAPIName(def) { if (def.filename && fs.existsSync(def.filename)) { return def.filename; } var name = safeName(def.group) + '-' + safeName(def.path) + '-' + VERBMAP[def.method] + '.js'; return path.join(process.cwd(), 'apis', name); } function generateModelName(config, name) { return path.join(config.dir || process.cwd(), 'models', safeName(name)+'.js'); } function generateAPI(def) { var path = (def.path || '').substring(1).split('/'), parameters = {}; path.forEach(function(token){ if (token.charAt(0)===':') { var name = token.substring(1); if (/\?$/.test(name)) { name = name.substring(0,name.length-1); parameters[name] = {description:name+' parameter', optional: true}; } else { parameters[name] = {description:name+' parameter'}; } } }); var count = Object.keys(parameters).length; var code = "var Arrow = require('arrow');\n\n"; code+="var API = Arrow.API.extend({\n"; code+="\tgroup: '"+def.group+"',\n"; code+="\tpath: '"+def.path+"',\n"; code+="\tmethod: '"+def.method+"',\n"; code+="\tdescription: '"+def.description+"',\n"; code+="\tmodel: "+JSON.stringify(def.model)+",\n"; code+="\tbefore: "+JSON.stringify(def.before||[])+",\n"; code+="\tafter: "+JSON.stringify(def.after||[])+",\n"; code+="\tparameters: {\n"; Object.keys(parameters).forEach(function(key, index){ code+="\t\t'"+key+"': "+JSON.stringify(parameters[key]); code+=((index+1<count) ? ',' : '')+"\n"; }); code+="\t},\n"; if (def.action) { code+='\t'+def.action.name+': function '+def.action.name+'('+def.action.args.join(', ')+') {\n'; code+=def.action.body.split(/\n/).map(function(line){return '\t\t'+line;}).join('\n')+'\n'; code+='\t}\n'; } else { code+="\taction: function action (req, resp, next) {\n"; code+="\t\t//TODO implement\n"; code+="\t\tresp.nocontent(next);\n"; code+="\t}\n"; } code+="});\n\n"; code+="module.exports = API;"; return code; } exports.md5 = md5; exports.redirect = redirect; exports.html = html; exports.css = css; exports.json = json; exports.nocontent = nocontent; exports.javascript = javascript; exports.gravatar = gravatar; exports.preferences = preferences; exports.etag = etag; exports.generateAPI = generateAPI; exports.generateAPIName = generateAPIName; exports.generateModelName = generateModelName;