UNPKG

wns-angular-package

Version:

Angular interface package/bundle for WNS Middleware

187 lines (158 loc) 4.01 kB
/** * WNS Angular Package -> wnAngularServer * * @copyright: Copyright © 2013- Pedro Nasser ® * @page: http://github.com/pedronasser/wns-angular-package * @license: http://github.com/pedronasser/wns-angular-package/blob/master/LICENSE */ /** * No description yet. * * @author Pedro Nasser */ // Exports module.exports = { /** * Class dependencies */ extend: ['wnComponent'], /** * Private */ private: { _config: { "assetsPath": __dirname+"/assets/", "bowerPath": __dirname+"/../../bower_components/", "useBower": false, "scriptName": "angular.app.js", "compressAngular": false, "compressApp": false, "compressResult": false } }, /** * Public Variables */ public: { preparedApp: false }, /** * Methods */ methods: { /** * Initializer */ init: function () { this.app = this.getParent(); this.attachEvents(this.app); this.prepareApp(); }, /** * Attach events to the application * @param wnApp $app application instance */ attachEvents: function (app) { if (!_(app).isObject()||!app.instanceOf('wnModule')) return false; self.debug('Attaching events to the parent application',1); app.prependListener('newRequest',function (e,req,resp) { resp.angular = _config; if (req.url.indexOf(_config.scriptName)!==-1 && self.preparedApp) { self.debug('Sending angular application.',3); resp.writeHead(200, { 'Content-Type': 'text/javascript' }); resp.write(self.appScript); resp.end(); } else e.next(); }); }, /** * Prepare the angular and application script. */ prepareApp: function () { self.debug('Preparing angular application...',1); var angularCode = self.getAngular(); var classes = this.app.c; var appCode = ''; appCode += self.getApplication(classes.wnAngularApplication)+'\n\n'; for (cc in classes) { if (self.detectAngular(cc,classes[cc])) { appCode+=self.renderClass(classes[cc])+'\n\n'; } } this.appScript=angularCode+'\n\n'+appCode; this.preparedApp=true; }, /** * Returns Angular javascript */ getAngular: function () { if (_config.useBower && _.isString(_config.bowerPath) && fs.existsSync(_config.bowerPath)) { var components = fs.readdirSync(_config.bowerPath); var code = ''; for (var c in components) { if (components[c].indexOf('angular')===-1) continue; try { var bowerJson = fs.readFileSync(_config.bowerPath+components[c]+'/bower.json','utf8'); var bowerConfig = JSON.parse(bowerJson); var mainFile = bowerConfig.main; if (_config.compressAngular && mainFile.indexOf('.min')===-1) mainFile = mainFile.replace('.js','.min.js'); code += fs.readFileSync(_config.bowerPath+components[c]+'/'+mainFile,'utf8')+'\n'; } catch (e) {} } return code; } else { return fs.readFileSync(_config.assetsPath+'/angular'+(_config.compressAngular?'.min':'')+'.js','utf8'); } }, /** * Returns Angular application */ getApplication: function (app) { var obj = new app(_config,app.build); _config.appName = obj.getAppName(); return obj.renderedCode; }, /** * Check if class is a wnAngular class. */ detectAngular: function (targetName,targetClass) { if (!_.isFunction(targetClass) || targetName.indexOf('wnAngular')==0) return false var isAngular=false; var extend = targetClass.build.extend; for (e in extend) { if (extend[e].indexOf('wnAngular') == 0) isAngular=true; } return isAngular; }, /** * Render a Angular Class */ renderClass: function (targetClass) { var obj = new targetClass(_config,targetClass.build); return obj.renderedCode; } } };