grunt-loopback-angular-addmodeldata-fork
Version:
Fork of grunt-loopback-angular-addmodeldata that abides by default slc model generator file naming standards.
77 lines (63 loc) • 2.7 kB
JavaScript
/*
* grunt-loopback-angular-addmodeldata-fork
* https://github.com/lukeblechlmbww/grunt-loopback-angular-addmodeldata-fork
*
* Copyright (c) 2015 Luke Blechl
* Licensed under the MIT license.
*/
;
var path = require('path');
module.exports = function(grunt) {
// Please see the Grunt documentation for more information regarding task
// creation: http://gruntjs.com/creating-tasks
grunt.registerMultiTask('loopback_angular_addModelData_fork', 'Extends grunt-loopback-angular. Auto-generated Angular $resource services for loopback will include model data for use at runtime on angular clients', function() {
// Merge task-specific and/or target-specific options with these defaults.
var options = this.options({
modelConfig: 'server/model-config.json',
modelDir: 'common/models',
serviceFile: 'client/app/scripts/lb-services.js'
});
var serviceFile;
grunt.log.ok(options.serviceFile);
try {
serviceFile = grunt.file.read(options.serviceFile);
grunt.log.ok('Loaded LoopBack service file %j', options.serviceFile);
} catch (e) {
var errService = new Error('Cannot load LoopBack service file ' + options.serviceFile);
errService.origError = e;
grunt.fail.warn(errService);
}
var models;
try {
models = require(path.resolve(options.modelConfig));
grunt.log.ok('Loaded LoopBack models file %j', options.modelConfig);
} catch (e) {
var err = new Error('Cannot load LoopBack models file ' + options.modelConfig);
err.origError = e;
grunt.fail.warn(err);
}
for (var modelName in models) {
if (models[modelName].public){
modelName = modelName.charAt(0).toUpperCase() + modelName.slice(1);
// Get the model JSON file name that would be created by slc model generator
// CamelCaseModelName will become camel-case-model-name.json
var modelJSONFileName = String(modelName.split(/(?=[A-Z][a-z]+)/).join('-')+".json").toLowerCase();
grunt.log.ok('Check '+modelName);
try {
var model = require(path.resolve(options.modelDir+modelJSONFileName));
for (var prop in model.properties) {
model.properties[prop].key = prop;
}
var regex = new RegExp("(module\\.factory\\([\\s]*\""+modelName+"\"[\\s\\S]*?)(return R;)");
var replace = '$1'+'R.model='+JSON.stringify(model)+';\n\n'+'$2';
serviceFile = serviceFile.replace(regex,replace);
} catch (e) {
grunt.log.ok('Did not find a model.json file for ' + modelName);
}
}
}
//grunt.log.ok(serviceFile);
grunt.file.write(options.serviceFile,serviceFile);
grunt.log.ok('Modified angular services to include a new property "model" which holds the model json object', options.output);
});
};