UNPKG

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
/* * grunt-loopback-angular-addmodeldata-fork * https://github.com/lukeblechlmbww/grunt-loopback-angular-addmodeldata-fork * * Copyright (c) 2015 Luke Blechl * Licensed under the MIT license. */ 'use strict'; 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); }); };