1 | 'use strict';
|
2 |
|
3 | var gulp = require('gulp');
|
4 | var gutil = require('gulp-util');
|
5 | var jshint = require('gulp-jshint');
|
6 | var stylish = require('jshint-stylish');
|
7 | var mocha = require('gulp-mocha');
|
8 | var mochaPhantomJS = require('gulp-mocha-phantomjs');
|
9 | var webserver = require('gulp-webserver');
|
10 | var del = require('del');
|
11 | var path = require('path');
|
12 | var source = require('vinyl-source-stream');
|
13 | var through = require('through2');
|
14 | var browserify = require('browserify');
|
15 | var licensify = require('licensify');
|
16 | var derequire = require('gulp-derequire');
|
17 | var dereserve = require('gulp-dereserve');
|
18 | var config = {
|
19 | dist: {
|
20 | destDir: './build',
|
21 | destName: 'power-assert-formatter.js'
|
22 | },
|
23 | jshint: {
|
24 | src: './lib/**/*.js'
|
25 | },
|
26 | bundle: {
|
27 | standalone: 'powerAssertFormatter',
|
28 | srcFile: './index.js',
|
29 | destDir: './local_build',
|
30 | destName: 'power-assert-formatter.js'
|
31 | },
|
32 | assert_bundle: {
|
33 | standalone: 'assert',
|
34 | require: 'assert',
|
35 | destDir: './local_build',
|
36 | destName: 'assert.js'
|
37 | },
|
38 | escodegen_bundle: {
|
39 | standalone: 'escodegen',
|
40 | srcFile: './node_modules/escodegen/escodegen.js',
|
41 | destDir: './local_build',
|
42 | destName: 'escodegen.js'
|
43 | },
|
44 | coverage: {
|
45 | filename: 'coverage.lcov'
|
46 | },
|
47 | test: {
|
48 | base: './test/',
|
49 | pattern: '**/*_test.js',
|
50 | amd: 'test/test-amd.html',
|
51 | browser: 'test/test-browser.html'
|
52 | }
|
53 | };
|
54 | var LOCAL_BUILDS = ['assert', 'escodegen'];
|
55 |
|
56 | function captureStdout (filespec) {
|
57 | var orig, log = '';
|
58 | function spy (str) {
|
59 | log += str;
|
60 | }
|
61 | function pass (file, encoding, callback) {
|
62 | this.push(file);
|
63 | callback();
|
64 | }
|
65 | return {
|
66 | start: through.obj(pass, function (callback) {
|
67 | orig = process.stdout.write;
|
68 | process.stdout.write = spy;
|
69 | callback();
|
70 | }),
|
71 | finish: through.obj(pass, function (callback) {
|
72 | var file = new gutil.File(filespec);
|
73 | file.contents = new Buffer(log);
|
74 | this.push(file);
|
75 | process.stdout.write = orig;
|
76 | log = '';
|
77 | orig = null;
|
78 | callback();
|
79 | })
|
80 | };
|
81 | }
|
82 |
|
83 | function runMochaWithBlanket() {
|
84 | var blanket = require('./coverage/blanket');
|
85 | var capt = captureStdout({
|
86 | cwd: __dirname,
|
87 | base: __dirname,
|
88 | path: __dirname + '/' + config.coverage.filename
|
89 | });
|
90 | return gulp
|
91 | .src(config.test.base + config.test.pattern, {read: false})
|
92 | .pipe(capt.start)
|
93 | .pipe(mocha({
|
94 | ui: 'tdd',
|
95 | reporter: 'mocha-lcov-reporter'
|
96 | }))
|
97 | .pipe(capt.finish)
|
98 | .pipe(gulp.dest('.'))
|
99 | .on('error', gutil.log);
|
100 | }
|
101 |
|
102 | function runMochaSimply() {
|
103 | return gulp
|
104 | .src(config.test.base + config.test.pattern, {read: false})
|
105 | .pipe(mocha({
|
106 | ui: 'tdd',
|
107 | reporter: 'dot'
|
108 | }))
|
109 | .on('error', gutil.log);
|
110 | }
|
111 |
|
112 | gulp.task('serve', function() {
|
113 | gulp.src(__dirname)
|
114 | .pipe(webserver({
|
115 | port: 9001,
|
116 | directoryListing: true
|
117 | }));
|
118 | });
|
119 |
|
120 | gulp.task('watch', function () {
|
121 | gulp.watch('index.js', runMochaSimply);
|
122 | gulp.watch('{lib,test}/**/*.js', runMochaSimply);
|
123 | runMochaSimply();
|
124 | });
|
125 |
|
126 | gulp.task('clean_bundle', function () {
|
127 | del.sync([path.join(config.bundle.destDir, config.bundle.destName)]);
|
128 | });
|
129 |
|
130 | gulp.task('clean_coverage', function (done) {
|
131 | del([config.coverage.filename], done);
|
132 | });
|
133 |
|
134 | gulp.task('bundle', ['clean_bundle'], function() {
|
135 | var b = browserify({entries: config.bundle.srcFile, standalone: config.bundle.standalone});
|
136 | b.plugin(licensify);
|
137 | var bundleStream = b.bundle();
|
138 | return bundleStream
|
139 | .pipe(source(config.bundle.destName))
|
140 | .pipe(dereserve())
|
141 | .pipe(derequire())
|
142 | .pipe(gulp.dest(config.bundle.destDir));
|
143 | });
|
144 |
|
145 | gulp.task('unit', function () {
|
146 | return runMochaSimply();
|
147 | });
|
148 |
|
149 | gulp.task('coverage', ['clean_coverage'], function () {
|
150 | return runMochaWithBlanket();
|
151 | });
|
152 |
|
153 | gulp.task('test_amd', ['bundle', 'build_deps'], function () {
|
154 | return gulp
|
155 | .src(config.test.amd)
|
156 | .pipe(mochaPhantomJS({reporter: 'dot'}));
|
157 | });
|
158 |
|
159 | gulp.task('test_browser', ['bundle', 'build_deps'], function () {
|
160 | return gulp
|
161 | .src(config.test.browser)
|
162 | .pipe(mochaPhantomJS({reporter: 'dot'}));
|
163 | });
|
164 |
|
165 | gulp.task('lint', function() {
|
166 | return gulp.src(config.jshint.src)
|
167 | .pipe(jshint())
|
168 | .pipe(jshint.reporter(stylish));
|
169 | });
|
170 |
|
171 | LOCAL_BUILDS.forEach(function (name) {
|
172 | gulp.task('clean_' + name + '_bundle', function () {
|
173 | del.sync([path.join(config[name + '_bundle'].destDir, config[name + '_bundle'].destName)]);
|
174 | });
|
175 | gulp.task(name + '_bundle', ['clean_' + name + '_bundle'], function() {
|
176 | var b = browserify({standalone: config[name + '_bundle'].standalone});
|
177 | if (config[name + '_bundle'].srcFile) {
|
178 | b.add(config[name + '_bundle'].srcFile);
|
179 | }
|
180 | if (config[name + '_bundle'].require) {
|
181 | b.require(config[name + '_bundle'].require);
|
182 | }
|
183 | return b.bundle()
|
184 | .pipe(source(config[name + '_bundle'].destName))
|
185 | .pipe(derequire())
|
186 | .pipe(gulp.dest(config[name + '_bundle'].destDir));
|
187 | });
|
188 | });
|
189 | gulp.task('clean_deps', LOCAL_BUILDS.map(function (name) { return 'clean_' + name + '_bundle'; }));
|
190 | gulp.task('build_deps', LOCAL_BUILDS.map(function (name) { return name + '_bundle'; }));
|
191 |
|
192 | gulp.task('clean_dist', function () {
|
193 | del.sync([config.dist.destDir]);
|
194 | });
|
195 |
|
196 | gulp.task('dist', ['clean_dist', 'bundle'], function () {
|
197 | return gulp
|
198 | .src(path.join(config.bundle.destDir, config.bundle.destName))
|
199 | .pipe(gulp.dest(config.dist.destDir));
|
200 | });
|
201 |
|
202 | gulp.task('clean', ['clean_dist', 'clean_coverage', 'clean_bundle', 'clean_deps']);
|
203 |
|
204 | gulp.task('test', ['unit','test_browser','test_amd']);
|