‘use strict’; // bower install angular#^1.2 –save; bower install angular-animate#^1.2 angular-i18n#^1.2 angular-mocks#^1.2 angular-route#^1.2 angular-sanitize#^1.2 angular-scenario#^1.2 –save-dev // bower install angular#^1.3 –save; bower install angular-animate#^1.3 angular-i18n#^1.3 angular-mocks#^1.3 angular-route#^1.3 angular-sanitize#^1.3 angular-scenario#^1.3 –save-dev
var gulp = require(‘gulp’); var path = require(‘path’); var util = require(‘util’); var gutil = require(‘gulp-util’); var merge = require(‘merge-stream’); var changed = require(‘gulp-changed’); var rename = require(‘gulp-rename’); var pkg = require(‘./package.json’); var chalk = require(‘chalk’); var fs = require(‘fs’);
// CONFIG //
var src = {
cwd: 'src', dist: 'dist', scripts: '*/*.js', index: 'module.js', templates: '*/*.tpl.html',
};
var docs = {
cwd: 'docs', tmp: '.tmp', dist: 'pages', index: 'index.html', views: 'views/**/*.html', scripts: 'scripts/**/*.js', images: 'images/{,*/}*.{jpg,png,svg}', styles: 'styles/*.less', watch: { styles: 'styles/**/*.less' }
};
var ports = {
docs: 9090, pages: 9090
};
var banner = gutil.template(‘/**n’ +
' * <%= pkg.name %>\n' + ' * @version v<%= pkg.version %> - <%= today %>\n' + ' * @link <%= pkg.homepage %>\n' + ' * @author <%= pkg.author.name %> (<%= pkg.author.email %>)\n' + ' * @license MIT License, http://www.opensource.org/licenses/MIT\n' + ' */\n', {file: '', pkg: pkg, today: new Date().toISOString().substr(0, 10)});
// CLEAN // var clean = require(‘gulp-clean’); gulp.task(‘clean:tmp’, function() {
return gulp.src(['.tmp/*'], {read: false}) .pipe(clean());
}); gulp.task(‘clean:test’, function() {
return gulp.src(['test/.tmp/*', 'test/coverage/*'], {read: false}) .pipe(clean());
}); gulp.task(‘clean:dist’, function() {
return gulp.src([src.dist + '/*'], {read: false}) .pipe(clean());
}); gulp.task(‘clean:pages’, function() {
return gulp.src([docs.dist + '/*', '!' + docs.dist + '/1.0', '!' + docs.dist + '/static', '!' + docs.dist + '/dist', '!' + docs.dist + '/.git'], {read: false}) .pipe(clean());
});
// CONNECT // var connect = require(‘gulp-connect’); gulp.task(‘connect:docs’, function() {
connect.server({ root: ['.tmp', '.dev', docs.cwd, src.cwd], port: ports.docs, livereload: true });
}); gulp.task(‘connect:pages’, function() {
connect.server({ root: [docs.dist], port: ports.pages, });
}); var chrome = require(‘gulp-open’); gulp.task(‘open:docs’, function(){
gulp.src(docs.index, {cwd: docs.cwd}) .pipe(chrome('', {url: 'http://localhost:' + ports.docs}));
}); gulp.task(‘open:pages’, function(){
gulp.src(docs.index, {cwd: docs.dist}) .pipe(chrome('', {url: 'http://localhost:' + ports.pages}));
});
// WATCH //
var watch = require(‘gulp-watch’); gulp.task(‘watch:docs’, function() {
watch(docs.scripts, {cwd: docs.cwd}, function(files) { return files.pipe(connect.reload()); }); watch(docs.watch.styles, {cwd: docs.cwd}, function(files) { return gulp.start('styles:docs'); }); watch([docs.index, docs.views], {cwd: docs.cwd}, function(files) { return files.pipe(connect.reload()); });
}); gulp.task(‘watch:dev’, function() {
watch(src.scripts, {cwd: src.cwd}, function(files) { return files.pipe(connect.reload()); });
});
// SCRIPTS // var uglify = require(‘gulp-uglify’); var ngAnnotate = require(‘gulp-ng-annotate’); var ngmin = require(‘gulp-ngmin’); var concat = require(‘gulp-concat-util’); var sourcemaps = require(‘gulp-sourcemaps’); gulp.task(‘scripts:dist’, function(foo) {
var merged = merge( // Build unified package gulp.src([src.index, src.scripts], {cwd: src.cwd}) .pipe(sourcemaps.init()) .pipe(ngAnnotate()) .pipe(concat(pkg.name + '.js', {process: function(src) { return '// Source: ' + path.basename(this.path) + '\n' + (src.trim() + '\n').replace(/(^|\n)[ \t]*('use strict'|"use strict");?\s*/g, '$1'); }})) .pipe(concat.header('(function(window, document, undefined) {\n\'use strict\';\n')) .pipe(concat.footer('\n})(window, document);\n')) .pipe(concat.header(banner)) .pipe(gulp.dest(src.dist)) .pipe(rename(function(path) { path.extname = '.min.js'; })) .pipe(uglify()) .pipe(concat.header(banner)) .pipe(sourcemaps.write('./')) .pipe(gulp.dest(src.dist)), // Build individual modules gulp.src(src.scripts, {cwd: src.cwd}) .pipe(sourcemaps.init()) .pipe(ngAnnotate()) .pipe(rename(function(path){ path.dirname = ''; })) // flatten .pipe(concat.header(banner)) .pipe(gulp.dest(path.join(src.dist, 'modules'))) .pipe(rename(function(path) { path.extname = '.min.js'; })) .pipe(uglify()) .pipe(concat.header(banner)) .pipe(sourcemaps.write('./')) .pipe(gulp.dest(path.join(src.dist, 'modules'))) ); merged.on('error', function(err) { gutil.log(chalk.red(util.format('Plugin error: %s', err.message))); }); return merged;
}); gulp.task(‘scripts:pages’, function(foo) {
var merged = merge( // Build unified package gulp.src([src.index, src.scripts], {cwd: src.cwd}) .pipe(sourcemaps.init()) .pipe(ngmin()) .pipe(concat(pkg.name + '.js', {process: function(src) { return '// Source: ' + path.basename(this.path) + '\n' + (src.trim() + '\n').replace(/(^|\n)[ \t]*('use strict'|"use strict");?\s*/g, '$1'); }})) .pipe(concat.header('(function(window, document, undefined) {\n\'use strict\';\n')) .pipe(concat.footer('\n})(window, document);\n')) .pipe(concat.header(banner)) .pipe(gulp.dest(path.join(docs.dist, 'scripts'))) .pipe(rename(function(path) { path.extname = '.min.js'; })) .pipe(uglify()) .pipe(concat.header(banner)) .pipe(sourcemaps.write('./')) .pipe(gulp.dest(path.join(docs.dist, 'scripts'))) ); merged.on('error', function(err) { gutil.log(chalk.red(util.format('Plugin error: %s', err.message))); }); return merged;
});
// TEMPLATES // var ngtemplate = require(‘gulp-ngtemplate’); var uglify = require(‘gulp-uglify’); var ngmin = require(‘gulp-ngmin’); var createModuleName = function(src) { return ‘mgcrea.ngStrap.’ + src.split(path.sep); }; gulp.task(‘templates:dist’, function() {
var merged = merge( // Build unified package gulp.src(src.templates, {cwd: src.cwd}) .pipe(htmlmin({removeComments: true, collapseWhitespace: true})) .pipe(ngtemplate({module: createModuleName})) .pipe(ngAnnotate()) .pipe(concat(pkg.name + '.tpl.js', {process: function(src) { return '// Source: ' + path.basename(this.path) + '\n' + (src.trim() + '\n').replace(/(^|\n)[ \t]*('use strict'|"use strict");?\s*/g, '$1'); }})) .pipe(concat.header('(function(window, document, undefined) {\n\'use strict\';\n\n')) .pipe(concat.footer('\n\n})(window, document);\n')) .pipe(concat.header(banner)) .pipe(gulp.dest(src.dist)) .pipe(rename(function(path) { path.extname = '.min.js'; })) .pipe(uglify()) .pipe(concat.header(banner)) .pipe(gulp.dest(src.dist)), // Build individual modules gulp.src(src.templates, {cwd: src.cwd}) .pipe(htmlmin({removeComments: true, collapseWhitespace: true})) .pipe(ngtemplate({module: createModuleName})) .pipe(ngAnnotate()) .pipe(rename(function(path){ path.dirname = ''; })) // flatten .pipe(concat.header(banner)) .pipe(gulp.dest(path.join(src.dist, 'modules'))) .pipe(rename(function(path) { path.extname = '.min.js'; })) .pipe(uglify()) .pipe(concat.header(banner)) .pipe(gulp.dest(path.join(src.dist, 'modules'))) ); merged.on('error', function(err) { gutil.log(chalk.red(util.format('Plugin error: %s', err.message))); }); return merged;
}); gulp.task(‘templates:pages’, function() {
var merged = merge( // Build docs partials gulp.src(['views/sidebar.html', 'views/partials/*.html'], {cwd: docs.cwd, base: docs.cwd}) .pipe(htmlmin({removeComments: true, collapseWhitespace: true})) .pipe(ngtemplate({module: 'mgcrea.ngStrapDocs'})) .pipe(ngAnnotate()) .pipe(concat('docs.tpl.js', {process: function(src) { return '// Source: ' + path.basename(this.path) + '\n' + (src.trim() + '\n').replace(/(^|\n)[ \t]*('use strict'|"use strict");?\s*/g, '$1'); }})) .pipe(concat.header('(function(window, document, undefined) {\n\'use strict\';\n\n')) .pipe(concat.footer('\n\n})(window, document);\n')) .pipe(gulp.dest(path.join(docs.dist, 'scripts'))) .pipe(rename(function(path) { path.extname = '.min.js'; })) .pipe(uglify()) .pipe(concat.header(banner)) .pipe(gulp.dest(path.join(docs.dist, 'scripts'))), // Build demo partials gulp.src('*/docs/*.tpl.demo.html', {cwd: src.cwd}) .pipe(htmlmin({removeComments: true, collapseWhitespace: true})) .pipe(ngtemplate({module: 'mgcrea.ngStrapDocs'})) .pipe(ngAnnotate()) .pipe(concat('demo.tpl.js', {process: function(src) { return '// Source: ' + path.basename(this.path) + '\n' + (src.trim() + '\n').replace(/(^|\n)[ \t]*('use strict'|"use strict");?\s*/g, '$1'); }})) .pipe(concat.header('(function(window, document, undefined) {\n\'use strict\';\n\n')) .pipe(concat.footer('\n\n})(window, document);\n')) .pipe(concat.header(banner)) .pipe(gulp.dest(path.join(docs.dist, 'scripts'))) .pipe(rename(function(path) { path.extname = '.min.js'; })) .pipe(uglify()) .pipe(concat.header(banner)) .pipe(gulp.dest(path.join(docs.dist, 'scripts'))), // Build unified package gulp.src(src.templates, {cwd: src.cwd}) .pipe(htmlmin({removeComments: true, collapseWhitespace: true})) .pipe(ngtemplate({module: createModuleName})) .pipe(ngAnnotate()) .pipe(concat(pkg.name + '.tpl.js', {process: function(src) { return '// Source: ' + path.basename(this.path) + '\n' + (src.trim() + '\n').replace(/(^|\n)[ \t]*('use strict'|"use strict");?\s*/g, '$1'); }})) .pipe(concat.header('(function(window, document, undefined) {\n\'use strict\';\n\n')) .pipe(concat.footer('\n\n})(window, document);\n')) .pipe(concat.header(banner)) .pipe(gulp.dest(path.join(docs.dist, 'scripts'))) .pipe(rename(function(path) { path.extname = '.min.js'; })) .pipe(uglify()) .pipe(concat.header(banner)) .pipe(gulp.dest(path.join(docs.dist, 'scripts'))) ); merged.on('error', function(err) { gutil.log(chalk.red(util.format('Plugin error: %s', err.message))); }); return merged;
}); gulp.task(‘templates:test’, function() {
// Build individual modules return gulp.src(src.templates, {cwd: src.cwd}) .pipe(htmlmin({removeComments: true, collapseWhitespace: true})) .pipe(ngtemplate({module: createModuleName})) .pipe(ngmin()) .pipe(rename(function(path){ path.dirname = ''; })) // flatten .pipe(concat.header(banner)) .pipe(gulp.dest('test/.tmp/templates'));
});
// STYLES // var prefix = require(‘gulp-autoprefixer’); var less = require(‘gulp-less’); var safeLess = merge(less()); safeLess.on(‘error’, function(err) {
gutil.log(chalk.red(util.format('Plugin error: %s', err.message)));
}); gulp.task(‘styles:docs’, function() {
return gulp.src(docs.styles, {cwd: docs.cwd, base: docs.cwd}) .pipe(changed('.tmp/styles')) .pipe(less()) .pipe(prefix('last 1 version')) .pipe(gulp.dest(docs.tmp)) .pipe(connect.reload());
}); gulp.task(‘styles:pages’, function() {
return gulp.src(docs.styles, {cwd: docs.cwd, base: docs.cwd}) .pipe(safeLess) .pipe(prefix('last 1 version', '> 1%', 'ie 8')) .pipe(concat.header(banner)) .pipe(gulp.dest(docs.dist));
});
// VIEWS // var htmlmin = require(‘gulp-htmlmin’); var usemin = require(‘gulp-usemin’); var nginclude = require(‘gulp-nginclude’); var cleancss = require(‘gulp-cleancss’); gulp.task(‘views:pages’, function() {
var merged = merge( // Build views // gulp.src(docs.views, {cwd: docs.cwd}) // .pipe(htmlmin({collapseWhitespace: true})) // .pipe(gulp.dest(docs.dist)), // Build index gulp.src(docs.index, {cwd: docs.cwd}) .pipe(nginclude({assetsDirs: [src.cwd]})) .pipe(usemin({ js: [ngmin(), uglify(), concat.header(banner)], lib: ['concat'], // supeseeded by scripts:pages & templates:pages css: [cleancss(), concat.header(banner)] })) .pipe(gulp.dest(docs.dist)) ); merged.on('error', function(err) { gutil.log(chalk.red(util.format('Plugin error: %s', err.message))); }); return merged;
});
// TEST // var jshint = require(‘gulp-jshint’); var stylish = require(‘jshint-stylish’); var testTimezone = ”; gulp.task(‘jshint’, function() {
gulp.src(src.scripts, {cwd: src.cwd}) .pipe(changed(src.scripts)) .pipe(jshint()) .pipe(jshint.reporter(stylish));
}); var karma = require(‘karma’).server; gulp.task(‘karma:unit’, [‘templates:test’], function() {
// if testTimezone has value, set the environment timezone // before starting karma, so PhantomJS picks up the // timezone setting if (testTimezone) { console.log('Setting timezone to => [' + testTimezone + ']'); process.env.TZ = testTimezone; } karma.start({ configFile: path.join(__dirname, 'test/karma.conf.js'), browsers: ['PhantomJS'], reporters: ['dots'], singleRun: true }, function(code) { gutil.log('Karma has exited with ' + code); process.exit(code); });
}); gulp.task(‘karma:server’, [‘templates:test’], function() {
karma.start({ configFile: path.join(__dirname, 'test/karma.conf.js'), browsers: ['PhantomJS'], reporters: ['progress'], autoWatch: true, singleRun: false }, function(code) { gutil.log('Karma has exited with ' + code); process.exit(code); });
}); // codeclimate-test-reporter gulp.task(‘karma:travis’, [‘templates:test’], function() {
karma.start({ configFile: path.join(__dirname, 'test/karma.conf.js'), browsers: ['PhantomJS'], reporters: ['dots', 'coverage'], singleRun: true }, function(code) { gutil.log('Karma has exited with ' + code); process.exit(code); // gulp.src('test/coverage/**/lcov.info') // .pipe(coveralls()) // .on('end', function() { // process.exit(code); // }); });
}); gulp.task(‘karma:travis~1.2.0’, [‘templates:test’], function() {
karma.start({ configFile: path.join(__dirname, 'test/~1.2.0/karma.conf.js'), browsers: ['PhantomJS'], reporters: ['dots'], singleRun: true }, function(code) { gutil.log('Karma has exited with ' + code); process.exit(code); });
});
// COPY // gulp.task(‘copy:pages’, function() {
gulp.src(['favicon.ico', docs.images], {cwd: docs.cwd, base: docs.cwd}) .pipe(gulp.dest(docs.dist)); gulp.src('**/*.js', {cwd: src.dist, base: src.dist}) .pipe(gulp.dest(path.join(docs.dist, src.dist)));
});
// DEFAULT // var runSequence = require(‘run-sequence’); gulp.task(‘default’, [‘dist’]); gulp.task(‘build’, [‘dist’]); gulp.task(‘test’, function() {
runSequence('clean:test', 'templates:test', ['jshint', 'karma:unit']);
}); gulp.task(‘test:timezone’, function() {
// parse command line argument for optional timezone // invoke like this: // gulp test:timezone --Europe/Paris var timezone = process.argv[3] || ''; testTimezone = timezone.replace(/-/g, ''); runSequence('clean:test', 'templates:test', ['jshint', 'karma:unit']);
}); gulp.task(‘test:server’, function() {
runSequence('clean:test', 'templates:test', 'karma:server');
}); gulp.task(‘dist’, function() {
runSequence('clean:dist', ['templates:dist', 'scripts:dist']);
}); gulp.task(‘pages’, function() {
runSequence('clean:pages', 'styles:docs', 'views:pages', ['templates:pages', 'scripts:pages', 'copy:pages']);
}); gulp.task(‘serve’, function() {
runSequence('clean:tmp', ['styles:docs', 'connect:docs'], ['open:docs', 'watch:docs', 'watch:dev']);
}); gulp.task(‘serve:pages’, [‘connect:pages’, ‘open:pages’]);