UNPKG

3.72 kBJavaScriptView Raw
1/*eslint-env node*/
2'use strict';
3
4const gulp = require('gulp');
5const babel = require('gulp-babel');
6const browserify = require('browserify');
7const concat = require('gulp-concat');
8const eslint = require('gulp-eslint');
9const karma = require('karma');
10const mocha = require('gulp-mocha');
11const path = require('path');
12const rename = require('gulp-rename');
13const source = require('vinyl-source-stream');
14const sourcemaps = require('gulp-sourcemaps');
15const through = require('through2');
16const uglify = require('gulp-uglify');
17
18
19function toStringModule() {
20 return through.obj((file, enc, done) => {
21 if (file.isBuffer()) {
22 var newContents = 'module.exports = ' + JSON.stringify(file.contents.toString(enc)) + ';';
23 file.contents = new Buffer(newContents, enc);
24 } else if (file.isStream()) {
25 throw new Error('Streams are not yet supported.');
26 }
27 done(null, file);
28 });
29}
30
31function runKarma(options, done) {
32 if (typeof options === 'function') {
33 done = options;
34 options = {};
35 }
36 options.configFile = path.join(__dirname, '/karma.conf.js');
37
38 new karma.Server(options, exitCode => {
39 if (exitCode === 0) {
40 done();
41 } else {
42 done(new Error('Karma quit with exit code ' + exitCode));
43 }
44 }).start();
45}
46
47
48// Fix for gulp not terminating after mocha finishes
49gulp.doneCallback = error => {
50 process.exit(error ? 1 : 0); // eslint-disable-line no-process-exit
51};
52
53
54gulp.task('lint', () => {
55 return gulp.src(['src/**/*.js', 'src/**/*.js.txt', 'test/spec/*.js'])
56 .pipe(eslint())
57 .pipe(eslint.format())
58 .pipe(eslint.failOnError());
59});
60
61
62gulp.task('copy-slave', () => {
63 return gulp.src('src/worker.browser/slave.js.txt')
64 .pipe(rename('slave.js'))
65 .pipe(gulp.dest('dist/'));
66});
67
68
69gulp.task('babel-lib', () => {
70 return gulp.src('src/**/*.js')
71 .pipe(sourcemaps.init())
72 .pipe(babel())
73 .pipe(sourcemaps.write('.'))
74 .pipe(gulp.dest('lib/'));
75});
76
77gulp.task('babel-spec', () => {
78 return gulp.src('test/spec/**/*.js')
79 .pipe(babel())
80 .pipe(gulp.dest('test/spec-build'));
81});
82
83
84gulp.task('browser-slave-module', () => {
85 return gulp.src('./src/worker.browser/slave.js.txt')
86 .pipe(toStringModule())
87 .pipe(rename('slave-code.js'))
88 .pipe(gulp.dest('./lib/worker.browser/'));
89});
90
91
92gulp.task('browserify-lib', ['babel-lib', 'browser-slave-module'], () => {
93 return browserify({ standalone: 'threads' })
94 .add('./lib/index.js')
95
96 // overrides, so the node-specific files won't make their way into the bundle
97 .require('./lib/worker.browser/worker.js', { expose : './worker' })
98 .require('./lib/defaults.browser.js', { expose : './defaults' })
99 .bundle()
100 .pipe(source('threads.browser.js'))
101 .pipe(gulp.dest('dist/'));
102});
103
104gulp.task('uglify-lib', ['browserify-lib'], () => {
105 return gulp.src('dist/threads.browser.js')
106 .pipe(uglify())
107 .pipe(concat('threads.browser.min.js'))
108 .pipe(gulp.dest('dist/'));
109});
110
111gulp.task('uglify-slave', ['copy-slave'], () => {
112 return gulp.src('dist/slave.js')
113 .pipe(uglify())
114 .pipe(concat('slave.min.js'))
115 .pipe(gulp.dest('dist/'));
116});
117
118gulp.task('uglify', ['uglify-lib', 'uglify-slave']);
119
120
121gulp.task('test-browser', ['dist', 'babel-spec'], done => {
122 runKarma(done);
123});
124
125gulp.task('test-browser-after-node', ['test-node'], done => {
126 runKarma(done);
127});
128
129gulp.task('test-node', ['dist', 'babel-spec'], () => {
130 return gulp.src('test/spec-build/*.spec.js', { read: false })
131 .pipe(mocha());
132});
133
134
135gulp.task('dist', ['lint', 'browserify-lib', 'uglify']);
136gulp.task('test', ['test-node', 'test-browser-after-node']);
137
138gulp.task('default', ['dist', 'test']);