diff --git a/build/gulpfile.extensions.js b/build/gulpfile.extensions.js index c7591abc6c6da..1d0ac3da216a7 100644 --- a/build/gulpfile.extensions.js +++ b/build/gulpfile.extensions.js @@ -47,11 +47,7 @@ const tasks = compilations.map(function (tsconfigFile) { const clean = 'clean-extension:' + name; const compile = 'compile-extension:' + name; const watch = 'watch-extension:' + name; - - // Build Tasks - const cleanBuild = 'clean-extension-build:' + name; const compileBuild = 'compile-extension-build:' + name; - const watchBuild = 'watch-extension-build:' + name; const root = path.join('extensions', relativeDirname); const srcBase = path.join(root, 'src'); @@ -112,15 +108,18 @@ const tasks = compilations.map(function (tsconfigFile) { const srcOpts = { cwd: path.dirname(__dirname), base: srcBase }; gulp.task(clean, cb => rimraf(out, cb)); + const cleanTask = () => util.primraf(out); - gulp.task(compile, [clean], () => { + gulp.task(compile, util.taskSeries(cleanTask, () => { const pipeline = createPipeline(false, true); const input = gulp.src(src, srcOpts); - return input + return util.streamToPromise( + input .pipe(pipeline()) - .pipe(gulp.dest(out)); - }); + .pipe(gulp.dest(out)) + ); + })); gulp.task(watch, [clean], () => { const pipeline = createPipeline(false); @@ -132,39 +131,24 @@ const tasks = compilations.map(function (tsconfigFile) { .pipe(gulp.dest(out)); }); - gulp.task(cleanBuild, cb => rimraf(out, cb)); - - gulp.task(compileBuild, [clean], () => { + gulp.task(compileBuild, util.taskSeries(cleanTask, () => { const pipeline = createPipeline(true, true); const input = gulp.src(src, srcOpts); - return input + return util.streamToPromise( + input .pipe(pipeline()) - .pipe(gulp.dest(out)); - }); - - gulp.task(watchBuild, [clean], () => { - const pipeline = createPipeline(true); - const input = gulp.src(src, srcOpts); - const watchInput = watcher(src, srcOpts); - - return watchInput - .pipe(util.incremental(() => pipeline(), input)) - .pipe(gulp.dest(out)); - }); + .pipe(gulp.dest(out)) + ); + })); return { - clean: clean, compile: compile, watch: watch, - cleanBuild: cleanBuild, - compileBuild: compileBuild, - watchBuild: watchBuild + compileBuild: compileBuild }; }); gulp.task('compile-extensions', tasks.map(t => t.compile)); gulp.task('watch-extensions', tasks.map(t => t.watch)); - gulp.task('compile-extensions-build', tasks.map(t => t.compileBuild)); -gulp.task('watch-extensions-build', tasks.map(t => t.watchBuild)); diff --git a/build/lib/util.js b/build/lib/util.js index e6f041f3d60d8..a03adac0f37e4 100644 --- a/build/lib/util.js +++ b/build/lib/util.js @@ -183,6 +183,39 @@ function rimraf(dir) { return cb => retry(cb); } exports.rimraf = rimraf; +/** + * Like rimraf (with 5 retries), but with a promise instead of a callback. + */ +function primraf(dir) { + const fn = rimraf(dir); + return new Promise((resolve, reject) => { + fn((err) => { + if (err) { + return reject(err); + } + resolve(); + }); + }); +} +exports.primraf = primraf; +/** + * Convert a stream to a promise. + */ +function streamToPromise(stream) { + return new Promise((resolve, reject) => { + stream.on('end', _ => resolve()); + stream.on('error', err => reject(err)); + }); +} +exports.streamToPromise = streamToPromise; +function taskSeries(...tasks) { + return async () => { + for (let i = 0; i < tasks.length; i++) { + await tasks[i](); + } + }; +} +exports.taskSeries = taskSeries; function getVersion(root) { let version = process.env['BUILD_SOURCEVERSION']; if (!version || !/^[0-9a-f]{40}$/i.test(version)) { diff --git a/build/lib/util.ts b/build/lib/util.ts index 4617cc83f2f04..918c2295b3b1b 100644 --- a/build/lib/util.ts +++ b/build/lib/util.ts @@ -237,6 +237,40 @@ export function rimraf(dir: string): (cb: any) => void { return cb => retry(cb); } +/** + * Like rimraf (with 5 retries), but with a promise instead of a callback. + */ +export function primraf(dir: string): Promise { + const fn = rimraf(dir); + return new Promise((resolve, reject) => { + fn((err: any) => { + if (err) { + return reject(err); + } + resolve(); + }); + }); +} + +/** + * Convert a stream to a promise. + */ +export function streamToPromise(stream: NodeJS.ReadWriteStream): Promise { + return new Promise((resolve, reject) => { + stream.on('end', _ => resolve()); + stream.on('error', err => reject(err)); + }); +} + +export type PromiseTask = () => Promise; +export function taskSeries(...tasks: PromiseTask[]): () => Promise { + return async () => { + for (let i = 0; i < tasks.length; i++) { + await tasks[i](); + } + }; +} + export function getVersion(root: string): string | undefined { let version = process.env['BUILD_SOURCEVERSION']; diff --git a/gulpfile.js b/gulpfile.js index 133717f6c3ae4..882d7f8414747 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -21,7 +21,6 @@ gulp.task('watch-client', ['clean-client'], compilation.watchTask('out', false)) // Full compile, including nls and inline sources in sourcemaps, for build gulp.task('clean-client-build', util.rimraf('out-build')); gulp.task('compile-client-build', ['clean-client-build'], compilation.compileTask('src', 'out-build', true)); -gulp.task('watch-client-build', ['clean-client-build'], compilation.watchTask('out-build', true)); // Default gulp.task('default', ['compile']); @@ -32,7 +31,6 @@ gulp.task('watch', [/* 'monaco-typecheck-watch', */ 'watch-client', 'watch-exten // All Build gulp.task('compile-build', ['compile-client-build', 'compile-extensions-build']); -gulp.task('watch-build', ['watch-client-build', 'watch-extensions-build']); process.on('unhandledRejection', (reason, p) => { console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);