generator-angular-material-fullstack
Version:
Yeoman generator for creating MEAN stack applications, using MongoDB, Express, AngularJS, and Node
258 lines (225 loc) • 6.84 kB
JavaScript
'use strict';
var markdown = require('marked');
var semver = require('semver');
var _s = require('underscore.string');
var shell = require('shelljs');
var process = require('child_process');
var Q = require('q');
var helpers = require('yeoman-generator').test;
var fs = require('fs-extra');
var path = require('path');
module.exports = function (grunt) {
require('load-grunt-tasks')(grunt);
grunt.initConfig({
config: {
demo: 'demo'
},
pkg: grunt.file.readJSON('package.json'),
changelog: {
options: {
dest: 'CHANGELOG.md',
versionFile: 'package.json'
}
},
release: {
options: {
commitMessage: '<%= version %>',
tagName: 'v<%= version %>',
bump: false, // we have our own bump
file: 'package.json'
}
},
stage: {
options: {
files: ['CHANGELOG.md']
}
},
buildcontrol: {
options: {
dir: 'demo',
commit: true,
push: true,
connectCommits: false,
message: 'Built using Angular Material Fullstack v<%= pkg.version %> from commit %sourceCommit%'
},
release: {
options: {
remote: 'origin',
branch: 'master'
}
}
},
jshint: {
options: {
curly: false,
node: true
},
all: ['Gruntfile.js', '*/index.js']
},
mochaTest: {
test: {
src: [
'test/*.js'
],
options: {
reporter: 'spec',
timeout: 120000
}
}
},
clean: {
demo: {
files: [{
dot: true,
src: [
'<%= config.demo %>/*',
'!<%= config.demo %>/readme.md',
'!<%= config.demo %>/node_modules',
'!<%= config.demo %>/.git',
'!<%= config.demo %>/dist'
]
}]
}
}
});
grunt.registerTask('bump', 'bump manifest version', function (type) {
var options = this.options({
file: grunt.config('pkgFile') || 'package.json'
});
function setup(file, type) {
var pkg = grunt.file.readJSON(file);
var newVersion = pkg.version = semver.inc(pkg.version, type || 'patch');
return {
file: file,
pkg: pkg,
newVersion: newVersion
};
}
var config = setup(options.file, type);
grunt.file.write(config.file, JSON.stringify(config.pkg, null, ' ') + '\n');
grunt.log.ok('Version bumped to ' + config.newVersion);
});
grunt.registerTask('stage', 'git add files before running the release task', function () {
var files = this.options().files;
grunt.util.spawn({
cmd: process.platform === 'win32' ? 'git.cmd' : 'git',
args: ['add'].concat(files)
}, grunt.task.current.async());
});
grunt.registerTask('generateDemo', 'generate demo', function () {
var done = this.async();
shell.mkdir(grunt.config('config').demo);
shell.cd(grunt.config('config').demo);
Q()
.then(generateDemo)
.then(function() {
shell.cd('../');
})
.catch(function(msg){
grunt.fail.warn(msg || 'failed to generate demo')
})
.finally(done);
function generateDemo() {
var deferred = Q.defer();
var options = {
script: 'js',
markup: 'html',
stylesheet: 'sass',
router: 'uirouter',
material: true,
mongoose: true,
auth: true,
oauth: ['googleAuth', 'twitterAuth'],
socketio: true
};
var deps = [
'../app',
[
helpers.createDummyGenerator(),
'ng-component:app'
]
];
var gen = helpers.createGenerator('angular-material-fullstack:app', deps);
helpers.mockPrompt(gen, options);
gen.run({}, function () {
deferred.resolve();
});
return deferred.promise;
}
});
grunt.registerTask('releaseDemoBuild', 'builds and releases demo', function () {
var done = this.async();
shell.cd(grunt.config('config').demo);
Q()
.then(gruntBuild)
.then(gruntRelease)
.then(function() {
shell.cd('../');
})
.catch(function(msg){
grunt.fail.warn(msg || 'failed to release demo')
})
.finally(done);
function run(cmd) {
var deferred = Q.defer();
var generator = shell.exec(cmd, {async:true});
generator.stdout.on('data', function (data) {
grunt.verbose.writeln(data);
});
generator.on('exit', function (code) {
deferred.resolve();
});
return deferred.promise;
}
function gruntBuild() {
return run('grunt');
}
function gruntRelease() {
return run('grunt buildcontrol:heroku');
}
});
grunt.registerTask('updateFixtures', 'updates package and bower fixtures', function() {
var done = this.async();
var packageJson = fs.readFileSync(path.resolve('app/templates/_package.json'), 'utf8');
var bowerJson = fs.readFileSync(path.resolve('app/templates/_bower.json'), 'utf8');
// replace package name
packageJson = packageJson.replace(/"name": "<%(.*)%>"/g, '"name": "tempApp"');
packageJson = packageJson.replace(/<%(.*)%>/g, '');
// remove all ejs conditionals
bowerJson = bowerJson.replace(/"name": "<%(.*)%>"/g, '"name": "tempApp"');
bowerJson = bowerJson.replace(/<%(.*)%>/g, '');
// save files
fs.writeFile(path.resolve(__dirname + '/test/fixtures/package.json'), packageJson, function() {
fs.writeFile(path.resolve(__dirname + '/test/fixtures/bower.json'), bowerJson, function() {
done();
});
});
});
grunt.registerTask('installFixtures', 'install package and bower fixtures', function() {
var done = this.async();
shell.cd('test/fixtures');
grunt.log.ok('installing npm dependencies for generated app');
process.exec('npm install --quiet', {cwd: '../fixtures'}, function (error, stdout, stderr) {
grunt.log.ok('installing bower dependencies for generated app');
process.exec('bower install', {cwd: '../fixtures'}, function (error, stdout, stderr) {
shell.cd('../../');
done();
})
});
});
grunt.registerTask('test', [
'updateFixtures',
'installFixtures',
'mochaTest'
]);
grunt.registerTask('demo', [
'clean:demo',
'generateDemo'
]);
grunt.registerTask('releaseDemo', [
'demo',
'releaseDemoBuild',
'buildcontrol:release'
]);
//grunt.registerTask('default', ['bump', 'changelog', 'stage', 'release']);
};