wns-angular-package
Version:
Angular interface package/bundle for WNS Middleware
187 lines (158 loc) • 4.01 kB
JavaScript
/**
* 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;
}
}
};