Skip to content

Commit

Permalink
Fixed tasks
Browse files Browse the repository at this point in the history
  • Loading branch information
pateketrueke committed Mar 6, 2015
1 parent 7cda79f commit 291f895
Show file tree
Hide file tree
Showing 14 changed files with 291 additions and 185 deletions.
56 changes: 37 additions & 19 deletions bin/cli.js
Expand Up @@ -16,26 +16,44 @@ if ($.argv.version) {
$.exit(1, $.usage('Missing arguments'));
}

var stub = require('./lib/stub');

var stubs = {
'new': {
write: {
'%dest': '*.json'
},
copy: {
'%dest': ['src/**/*.*', '*.coffee']
switch (src) {
case 'new':
var stub = require('./lib/stub');

src = {
write: {
'%dest': '*.json'
},
copy: {
'%dest': ['src/**/*.*', '*.coffee']
}
};

$.writeln('Creating project...\n');

stub(src, dest, $.argv.force, function() {
$.symlink();
$.writeln('\nDone');
});
break;

case 'dev':
case 'test':
case 'build':
$.symlink(true);

var grunt = require('./lib/run'),
testem = require('./run/testem');

if (src === 'test') {
testem();
} else {
grunt(($.argv.clean ? 'clean ' : '') + src + ':fu');
}
}
};
break;

if (!stubs[src] || !dest) {
$.exit(1, $.usage('Missing arguments'));
default:
$.exit(1, $.usage('Unknown action ' + src));
break;
}

$.writeln('Starting a new project...\n');

stub(stubs[src], dest, $.argv.force, function() {
$.writeln('\nDone');
});
}
39 changes: 39 additions & 0 deletions bin/lib/run.js
@@ -0,0 +1,39 @@
'use strict';

var $ = require('../util');

var fs = require('fs'),
path = require('path'),
child_process = require('child_process');

module.exports = function(task) {
var child;

if (!fs.existsSync(path.join(process.cwd(), 'node_modules/grunt-fu-tasks'))) {
$.exit(1, $.usage('Invalid working directory'));
}

var args = [],
flags = ['verbose', 'browser', 'watch', 'port'];

for (var i = 0, c = flags.length; i < c; i += 1) {
var key = flags[i];

if ($.argv[key] === true) {
args.push('--' + key + '=true');
} else if (typeof $.argv[key] !== 'undefined') {
args.push('--' + key + '="' + $.argv[key].replace(/\"/g, '\\\"') + '"');
}
}

child = child_process.exec(['grunt', task, args.join(' ')].join(' '), function() {
// do nothing
});

child.stdout.pipe(process.stdout);
child.stderr.on('data', function(err) {
$.exit(1, (err.message ? err.message : ('Error: ' + err)).trim());
});

$.writeln($.pkg.description + ' (loading ' + task + ' tasks)\n');
};
15 changes: 1 addition & 14 deletions bin/lib/stub.js
Expand Up @@ -34,18 +34,5 @@ module.exports = function(src, dest, force, callback) {

(new Stub(config, function(file, action) {
$.writeln(' ' + $.indent(action, 7) + ' ' + file.dest);
})).run(function() {
var dest = config.dest + '/node_modules',
src = path.resolve(__dirname, '../../node_modules');

if (config.write) {
callback();

if (!fs.existsSync(dest)) {
fs.mkdirSync(dest);
fs.symlinkSync(src + '/grunt', dest + '/grunt', 'dir');
fs.symlinkSync(path.resolve(__dirname, '../..'), dest + '/grunt-fu-tasks', 'dir');
}
}
});
})).run(callback);
};
16 changes: 16 additions & 0 deletions bin/run/testem.js
@@ -0,0 +1,16 @@
'use strict';

var $ = require('../util');

var Testem = require('testem');

module.exports = function() {
(new Testem())[$.argv.watch ? 'startDev' : 'startCI']({
src_files: ['src/app/tests/unit/**/*-test.{js,coffee,litcoffee}'],
serve_files: ['generated/tests.js'],
before_tests: 'grunt eslint:tests coffeelint:tests webpack:fu --testing',
framework: 'jasmine2',
launch_in_ci: ['PhantomJS'],
launch_in_dev: ['Chrome', 'Chromium', 'Safari', 'Firefox']
});
};
119 changes: 80 additions & 39 deletions bin/util.js
Expand Up @@ -6,58 +6,99 @@ var fs = require('fs'),
path = require('path'),
minimist = require('minimist');

module.exports = {
pkg: require('../package.json'),

exit: function(status, message) {
if (message) {
process.stderr.write(message + '\n');
}
var pkg = require(path.resolve(__dirname, '../package.json'));

die(status);
var argv = minimist(process.argv.slice(2), {
alias: {
p: 'port',
o: 'open',
c: 'clean',
w: 'watch',
b: 'browser',
l: 'dry-run',
v: 'version',
h: 'help'
},
string: ['port', 'open', 'clean', 'watch', 'browser'],
boolean: ['help', 'force', 'version', 'dry-run']
});

writeln: function(message) {
process.stdout.write(message + '\n');
},
function usage(header) {
var message = [];

indent: function(text, length) {
var diff = length - text.length,
pad = (new Array(diff + 1)).join(' ');
if (header) {
message.push(header + '\n');
}

return text + pad;
},
message.push('Usage:');
message.push(' ' + Object.keys(pkg.bin)[0] + ' new <name> [OPTIONS]\n');

message.push('Available commands:');
message.push(' new Create a new project');
message.push(' dev Run development tasks');
message.push(' test Execute all found tests');
message.push(' build Compile and bundle artifacts\n');

message.push('Options:');
message.push(' -p, --port The default port for develop');
message.push(' -o, --open Open the default browser on develop');
message.push(' -c, --clean Remove all previously generated artifacts');
message.push(' -w, --watch Enables watching for testem/nightwatch');
message.push(' -b, --browser Enables custom browser(s) for testing');
message.push(' -l, --dry-run Lists changes to perform only');
message.push(' -v, --version Show the current version');
message.push(' -h, --help Display this help');

return message.join('\n');
}

usage: function(header) {
var message = [];
function exit(status, message) {
if (message) {
process.stderr.write(message + '\n');
}

var grunt_fu_tasks = path.join(process.cwd(), 'node_modules/grunt-fu-tasks');
die(status);
}

if (fs.existsSync(grunt_fu_tasks)) {
message.push('Run `grunt fu` to list all available actions');
} else {
if (header) {
message.push(header + '\n');
function is_dir(path) {
return fs.existsSync(path) && fs.statSync(path).isDirectory();
}

module.exports = {
pkg: pkg,
argv: argv,
exit: exit,
usage: usage,

symlink: function(verify) {
var dest = path.join(process.cwd(), 'node_modules'),
src = path.resolve(__dirname, '../node_modules');

if (!is_dir(dest)) {
if (verify) {
exit(1, usage('Missing node_modules'));
} else {
fs.mkdirSync(dest);
}
}

message.push('Usage:');
message.push(' ' + Object.keys(this.pkg.bin)[0] + ' new <name> [OPTIONS]\n');
if (is_dir(dest) && !is_dir(path.join(dest, 'grunt'))) {
fs.symlinkSync(path.join(src, 'grunt'), path.join(dest, 'grunt'), 'dir');
}

message.push('Options:');
message.push(' -l, --dry-run Lists changes to perform only');
message.push(' -v, --version Show the current version');
message.push(' -h, --help Display this help');
if (is_dir(dest) && !is_dir(path.join(dest, 'grunt-fu-tasks'))) {
fs.symlinkSync(path.resolve(__dirname, '..'), path.join(dest, 'grunt-fu-tasks'), 'dir');
}
},

return message.join('\n');
writeln: function(message) {
process.stdout.write(message + '\n');
},

argv: minimist(process.argv.slice(2), {
alias: {
h: 'help',
v: 'version',
l: 'dry-run'
},
boolean: ['help', 'force', 'version', 'dry-run']
})
indent: function(text, length) {
var diff = length - text.length,
pad = (new Array(diff + 1)).join(' ');

return text + pad;
}
};
30 changes: 30 additions & 0 deletions coffeelint.json
@@ -0,0 +1,30 @@
{
"cyclomatic_complexity": {
"value": 11,
"level": "warn"
},
"line_endings": {
"value": "unix",
"level": "error"
},
"arrow_spacing": {
"level": "error"
},
"indentation": {
"value": 2,
"level": "error"
},
"space_operators": {
"level": "error"
},
"no_unnecessary_fat_arrows": {
"level": "error"
},
"no_plusplus": {
"level": "error"
},
"max_line_length": {
"value": 120,
"level": "error"
}
}
2 changes: 1 addition & 1 deletion package.json
Expand Up @@ -24,8 +24,8 @@
"dependencies": {
"async-parts": "^0.2.1",
"bower": "^1.3.12",
"browser-sync": "^2.2.2",
"coffee-loader": "^0.7.2",
"grunt-browser-sync": "^2.0.0",
"grunt-coffeelint": "0.0.13",
"grunt-contrib-clean": "^0.6.0",
"grunt-contrib-copy": "^0.7.0",
Expand Down
37 changes: 7 additions & 30 deletions tasks/grunt-fu-tasks.coffee
Expand Up @@ -5,28 +5,6 @@ module.exports = (grunt) ->
task = grunt.config
_ = grunt.util._

grunt.registerTask 'fu', ->
pkg = grunt.file.readJSON(path.resolve(__dirname, '../package.json'))
echo = grunt.log.writeln.bind(grunt.log)

grunt.log.subhead [
pkg.description
' (' + [pkg.name, pkg.version].join(' v') + ')'
].join ''

echo ''
echo ' Available tasks:'
echo " #{'dev:fu'.green} Run development tasks"
echo " #{'build:fu'.green} Compile and bundle artifacts"
echo " #{'testem:fu'.green} Execute your tests with Test'em"
echo " #{'nightwatch:fu'.green} Execute your tests with Nightwatch\n"

echo ' Options:'
echo ' -p, --port The default port for devevelopment'
echo ' -o, --open Open the default browser on development'
echo ' -b, --browser Use this browser on running testem/nightwatch'
echo ' -l, --headless Use a headless browser on running testem/nightwatch'

time(grunt)

params =
Expand Down Expand Up @@ -57,27 +35,26 @@ module.exports = (grunt) ->
task path.basename(file).replace('.coffee', ''), require(file).apply(params)

grunt.registerTask 'bundle:fu',
['tarima', 'copy:fonts', 'copy:images', 'sprite', 'bower:fu', 'webpack:fu']
['bower:fu', 'copy:fonts', 'copy:images', 'tarima', 'sprite']

grunt.registerTask 'lint:fu',
['eslint', 'coffeelint']

grunt.registerTask 'dev:fu',
['bundle:fu', 'browserSync', 'watch']
['bundle:fu', 'browser-sync:fu', 'watch']

grunt.registerTask 'test:fu',
['bundle:fu', 'browser-sync:fu', 'y2nw', 'nightwatch']
.concat(unless params.isHeadless then ['watch'] else [])

grunt.registerTask 'build:fu',
['bundle:fu', 'copy:resources', 'imagemin', 'cssmin', 'uglify']

['bower', 'testem', 'webpack'].forEach (name) ->
['bower', 'webpack', 'browser-sync'].forEach (name) ->
grunt.registerTask name + ':fu', 'Custom bundling for ' + name, (target) ->
require("./hooks/#{name}").apply _.extend({}, params, task: @)

grunt.registerTask 'nightwatch:fu',
['bundle:fu', 'browserSync', 'y2nw', 'nightwatch']
.concat(unless params.isHeadless then ['watch'] else [])

map =
bower: 'grunt-bower-task'
tarima: 'grunt-tarima-task'
sprite: 'grunt-spritesmith'

Expand Down

0 comments on commit 291f895

Please sign in to comment.