2bcdec5aaf
Several flakes on CI have been tied to long running SimpleHTTPServer that was put in place temporarily after the package splitup.
1584 lines
56 KiB
JavaScript
1584 lines
56 KiB
JavaScript
'use strict';
|
|
|
|
// THIS CHECK SHOULD BE THE FIRST THING IN THIS FILE
|
|
// This is to ensure that we catch env issues before we error while requiring other dependencies.
|
|
require('./tools/check-environment')(
|
|
{requiredNpmVersion: '>=3.5.3 <4.0.0', requiredNodeVersion: '>=5.4.1 <6.0.0'});
|
|
|
|
|
|
var fse = require('fs-extra');
|
|
var gulp = require('gulp');
|
|
var gulpPlugins = require('gulp-load-plugins')();
|
|
var merge = require('merge');
|
|
var merge2 = require('merge2');
|
|
var minimist = require('minimist');
|
|
var os = require('os');
|
|
var path = require('path');
|
|
var runSequence = require('run-sequence');
|
|
var shell = require('gulp-shell');
|
|
|
|
var licenseWrap = require('./tools/build/licensewrap');
|
|
var analytics = require('./tools/analytics/analytics');
|
|
var pubget = require('./tools/build/pubget');
|
|
var linknodemodules = require('./tools/build/linknodemodules');
|
|
var pubbuild = require('./tools/build/pubbuild');
|
|
var jsserve = require('./tools/build/jsserve');
|
|
var pubserve = require('./tools/build/pubserve');
|
|
var runServerDartTests = require('./tools/build/run_server_dart_tests');
|
|
var util = require('./tools/build/util');
|
|
var buildRouter = require('./modules/angular1_router/build');
|
|
var shouldLog = require('./tools/build/logging');
|
|
var dartSdk = require('./tools/build/dart');
|
|
var browserProvidersConf = require('./browser-providers.conf.js');
|
|
|
|
|
|
|
|
var cliArgs = minimist(process.argv.slice(2));
|
|
|
|
if (cliArgs.projects) {
|
|
// normalize for analytics
|
|
cliArgs.projects.split(',').sort().join(',');
|
|
}
|
|
|
|
// --projects=angular2 => {angular2: true}
|
|
var allProjects =
|
|
'angular1_router,angular2,benchmarks,benchmarks_external,benchpress,playground,payload_tests,bundle_deps';
|
|
var cliArgsProjects = (cliArgs.projects || allProjects)
|
|
.split(',')
|
|
.reduce((map, projectName) => {
|
|
map[projectName] = true;
|
|
return map;
|
|
}, {});
|
|
var generateEs6 = !cliArgs.projects;
|
|
|
|
function printModulesWarning() {
|
|
if (!cliArgs.projects && !process.env.CI) {
|
|
// if users didn't specify projects to build, tell them why and how they should
|
|
console.warn(
|
|
"Pro Tip: Did you know that you can speed up your build by specifying project name(s)?");
|
|
console.warn(" It's like pressing the turbo button in the old days, but better!");
|
|
console.warn(" Examples: --project=angular2 or --project=angular2");
|
|
}
|
|
}
|
|
|
|
|
|
// Make it easy to quiet down portions of the build.
|
|
// --logs=all -> log everything (This is the default)
|
|
// --logs=quiet -> log nothing
|
|
// --logs=<comma-separated-list> -> log listed items.
|
|
//
|
|
// Not all commands support optional logging, feel free
|
|
// to add support by adding a new key to this list,
|
|
// and toggling output from the command based on it.
|
|
var logs = {dartfmt: shouldLog('dartfmt')};
|
|
|
|
// dynamic require in build.tools so we can bootstrap TypeScript compilation
|
|
function throwToolsBuildMissingError() {
|
|
throw new Error('ERROR: build.tools task should have been run before using angularBuilder');
|
|
}
|
|
|
|
var angularBuilder = {
|
|
rebuildBrowserDevTree: throwToolsBuildMissingError,
|
|
rebuildBrowserProdTree: throwToolsBuildMissingError,
|
|
rebuildNodeTree: throwToolsBuildMissingError,
|
|
rebuildDartTree: throwToolsBuildMissingError,
|
|
uninitialized: true
|
|
};
|
|
|
|
|
|
function sequenceComplete(done) {
|
|
return function(err) {
|
|
if (err) {
|
|
var error = new Error('build sequence failed');
|
|
error.showStack = false;
|
|
done(error);
|
|
} else {
|
|
done();
|
|
}
|
|
};
|
|
}
|
|
|
|
|
|
var treatTestErrorsAsFatal = true;
|
|
|
|
function runJasmineTests(globs, done) {
|
|
var fork = require('child_process').fork;
|
|
var args = ['--'].concat(globs);
|
|
|
|
fork('./dist/tools/cjs-jasmine', args, {stdio: 'inherit'})
|
|
.on('close', function jasmineCloseHandler(exitCode) {
|
|
if (exitCode && treatTestErrorsAsFatal) {
|
|
var err = new Error('Jasmine tests failed');
|
|
// Mark the error for gulp similar to how gulp-utils.PluginError does it.
|
|
// The stack is not useful in this context.
|
|
err.showStack = false;
|
|
done(err);
|
|
} else {
|
|
done();
|
|
}
|
|
});
|
|
}
|
|
|
|
// Note: when DART_SDK is not found, all gulp tasks ending with `.dart` will be skipped.
|
|
var DART_SDK = dartSdk.detect(gulp);
|
|
|
|
// -----------------------
|
|
// configuration
|
|
|
|
var CONFIG = {
|
|
dest: {
|
|
js: {
|
|
all: 'dist/js',
|
|
dev: {es6: 'dist/js/dev/es6', es5: 'dist/js/dev/es5'},
|
|
prod: {es6: 'dist/js/prod/es6', es5: 'dist/js/prod/es5'},
|
|
cjs: 'dist/js/cjs',
|
|
dart2js: 'dist/js/dart2js',
|
|
dart_dev_compiler: 'dist/js/ddc'
|
|
},
|
|
dart: 'dist/dart',
|
|
docs: 'dist/docs',
|
|
docs_angular_io: 'dist/angular.io',
|
|
bundles: {all: 'dist/build', benchpress: 'dist/build/benchpress_bundle/'}
|
|
}
|
|
};
|
|
|
|
var ANGULAR2_BUNDLE_CONFIG = [
|
|
'angular2/common',
|
|
'angular2/core',
|
|
'angular2/compiler',
|
|
'angular2/instrumentation',
|
|
'angular2/platform/browser',
|
|
'angular2/platform/common_dom'
|
|
];
|
|
|
|
var NG2_BUNDLE_CONTENT = ANGULAR2_BUNDLE_CONFIG.join(' + ') + ' - rxjs/*';
|
|
var HTTP_BUNDLE_CONTENT = 'angular2/http - rxjs/* - ' + ANGULAR2_BUNDLE_CONFIG.join(' - ');
|
|
var ROUTER_BUNDLE_CONTENT = 'angular2/router + angular2/router/router_link_dsl - rxjs/* - ' +
|
|
ANGULAR2_BUNDLE_CONFIG.join(' - ');
|
|
var ALT_ROUTER_BUNDLE_CONTENT =
|
|
'angular2/alt_router - rxjs/* - ' + ANGULAR2_BUNDLE_CONFIG.join(' - ');
|
|
var TESTING_BUNDLE_CONTENT =
|
|
'angular2/testing + angular2/http/testing + angular2/router/testing + angular2/platform/testing/browser - rxjs/* - ' +
|
|
ANGULAR2_BUNDLE_CONFIG.join(' - ');
|
|
var UPGRADE_BUNDLE_CONTENT = 'angular2/upgrade - rxjs/* - ' + ANGULAR2_BUNDLE_CONFIG.join(' - ');
|
|
|
|
var BENCHPRESS_BUNDLE_CONFIG = {
|
|
entries: ['./dist/js/cjs/benchpress/index.js'],
|
|
packageJson: './dist/js/cjs/benchpress/package.json',
|
|
includes: ['angular2'],
|
|
excludes: ['reflect-metadata', 'selenium-webdriver', 'zone.js'],
|
|
ignore: [],
|
|
dest: CONFIG.dest.bundles.benchpress
|
|
};
|
|
|
|
var PAYLOAD_TESTS_CONFIG = {
|
|
ts: {
|
|
bundleName: 'app-bundle-deps.min.js',
|
|
cases: ['hello_world'],
|
|
dist: function(caseName, packaging) {
|
|
return path.join(__dirname, CONFIG.dest.js.prod.es5, 'payload_tests', caseName,
|
|
'ts/' + packaging);
|
|
},
|
|
systemjs: {sizeLimits: {'uncompressed': 880 * 1024, 'gzip level=9': 170 * 1024}},
|
|
webpack: {sizeLimits: {'uncompressed': 560 * 1024, 'gzip level=9': 130 * 1024}}
|
|
}
|
|
};
|
|
|
|
// ------------
|
|
// clean
|
|
|
|
gulp.task('build/clean.tools', (done) => fse.remove(path.join('dist', 'tools'), done));
|
|
|
|
gulp.task('build/clean.js', (done) => fse.remove(CONFIG.dest.js.all, done));
|
|
|
|
gulp.task('build/clean.dart', (done) => fse.remove(CONFIG.dest.dart, done));
|
|
|
|
gulp.task('build/clean.docs', (done) => fse.remove(CONFIG.dest.docs, done));
|
|
|
|
gulp.task('build/clean.docs_angular_io', (done) => fse.remove(CONFIG.dest.docs_angular_io, done));
|
|
|
|
gulp.task('build/clean.bundles', (done) => fse.remove(CONFIG.dest.bundles.all, done));
|
|
|
|
gulp.task('build/clean.bundles.benchpress',
|
|
(done) => fse.remove(CONFIG.dest.bundles.benchpress, done));
|
|
|
|
// ------------
|
|
// transpile
|
|
|
|
gulp.task('build/tree.dart', ['build/clean.dart', 'build.tools'],
|
|
function(done) { runSequence('!build/tree.dart', sequenceComplete(done)); });
|
|
|
|
|
|
gulp.task('!build/tree.dart',
|
|
function() { return angularBuilder.rebuildDartTree(cliArgsProjects); });
|
|
|
|
|
|
// ------------
|
|
// pubspec
|
|
|
|
// Run a top-level `pub get` for this project.
|
|
gulp.task('pubget.dart', pubget.dir(gulp, gulpPlugins, {dir: '.', command: DART_SDK.PUB}));
|
|
|
|
// Run `pub get` only on the angular2 dir of CONFIG.dest.dart
|
|
gulp.task('!build/pubget.angular2.dart',
|
|
pubget.dir(gulp, gulpPlugins,
|
|
{dir: path.join(CONFIG.dest.dart, 'angular2'), command: DART_SDK.PUB}));
|
|
|
|
// Run `pub get` over CONFIG.dest.dart
|
|
gulp.task('build/pubspec.dart',
|
|
pubget.subDir(gulp, gulpPlugins, {dir: CONFIG.dest.dart, command: DART_SDK.PUB}));
|
|
|
|
|
|
// This is a hacky way to work around dart's pub that creates `packages` symlink in every directory
|
|
// that contains a dart file with the main method. For our tests this means that every test
|
|
// subfolder
|
|
// has a link to the root `packages` directory which causes Karma to sift through 80k files during
|
|
// each `karma run` invocation.
|
|
//
|
|
// Since these directories are not needed for karma tests to run, it's safe to delete them without
|
|
// breaking any functionality.
|
|
//
|
|
// See #2437 for more info.
|
|
gulp.task('!build/remove-pub-symlinks', function(done) {
|
|
var exec = require('child_process').exec;
|
|
|
|
if (process.platform == 'win32') {
|
|
done();
|
|
return;
|
|
}
|
|
|
|
exec('find dist/dart/angular2/test/ -name packages | xargs rm -r',
|
|
function(error, stdout, stderr) {
|
|
if (error) {
|
|
done(stderr);
|
|
return;
|
|
}
|
|
done();
|
|
});
|
|
});
|
|
|
|
// ------------
|
|
// dartanalyzer
|
|
|
|
|
|
gulp.task('build/analyze.dart', () => {
|
|
var dartanalyzer = require('./tools/build/dartanalyzer');
|
|
|
|
return dartanalyzer(gulp, gulpPlugins, {dest: CONFIG.dest.dart, command: DART_SDK.ANALYZER});
|
|
});
|
|
|
|
|
|
gulp.task('build/analyze.ddc.dart', () => {
|
|
var dartanalyzer = require('./tools/build/dartanalyzer');
|
|
|
|
return dartanalyzer(gulp, gulpPlugins,
|
|
{dest: CONFIG.dest.dart, command: DART_SDK.ANALYZER, use_ddc: true});
|
|
});
|
|
|
|
|
|
gulp.task('build/check.apidocs.dart', () => {
|
|
var dartapidocs = require('./tools/build/dartapidocs');
|
|
|
|
return dartapidocs(gulp, gulpPlugins,
|
|
{dest: CONFIG.dest.dart, output: os.tmpdir(), command: DART_SDK.DARTDOCGEN});
|
|
});
|
|
|
|
|
|
// ------------
|
|
// pubbuild
|
|
// WARNING: this task is very slow (~15m as of July 2015)
|
|
|
|
gulp.task(
|
|
'build/pubbuild.dart',
|
|
pubbuild.subdirs(gulp, gulpPlugins,
|
|
{src: CONFIG.dest.dart, dest: CONFIG.dest.js.dart2js, command: DART_SDK.PUB}));
|
|
|
|
// ------------
|
|
// formatting
|
|
|
|
function doCheckFormat() {
|
|
var clangFormat = require('clang-format');
|
|
var gulpFormat = require('gulp-clang-format');
|
|
|
|
return gulp.src([
|
|
'modules/**/*.ts',
|
|
'tools/**/*.ts',
|
|
'!**/typings/**/*.d.ts',
|
|
// workaround https://github.com/angular/clang-format/issues/28
|
|
'!tools/compiler_cli/src/main.ts',
|
|
'gulpfile.js'
|
|
])
|
|
.pipe(gulpFormat.checkFormat('file', clangFormat));
|
|
}
|
|
|
|
gulp.task('check-format', function() {
|
|
return doCheckFormat().on('warning', function(e) {
|
|
console.log("NOTE: this will be promoted to an ERROR in the continuous build");
|
|
});
|
|
});
|
|
|
|
gulp.task('enforce-format', function() {
|
|
return doCheckFormat().on('warning', function(e) {
|
|
console.log("ERROR: You forgot to run clang-format on your change.");
|
|
console.log("See https://github.com/angular/angular/blob/master/DEVELOPER.md#clang-format");
|
|
process.exit(1);
|
|
});
|
|
});
|
|
|
|
gulp.task('lint', ['build.tools'], function() {
|
|
var tslint = require('gulp-tslint');
|
|
// Built-in rules are at
|
|
// https://github.com/palantir/tslint#supported-rules
|
|
var tslintConfig = require('./tslint.json');
|
|
return gulp.src(['modules/angular2/src/**/*.ts', '!modules/angular2/src/testing/**'])
|
|
.pipe(tslint({
|
|
tslint: require('tslint').default,
|
|
configuration: tslintConfig,
|
|
rulesDirectory: 'dist/tools/tslint'
|
|
}))
|
|
.pipe(tslint.report('prose', {emitError: true}));
|
|
});
|
|
|
|
// ------------
|
|
// check circular dependencies in Node.js context
|
|
gulp.task('build/checkCircularDependencies', function(done) {
|
|
var madge = require('madge');
|
|
|
|
var dependencyObject = madge([CONFIG.dest.js.dev.es5], {
|
|
format: 'cjs',
|
|
extensions: ['.js'],
|
|
onParseFile: function(data) { data.src = data.src.replace(/\/\* circular \*\//g, "//"); }
|
|
});
|
|
var circularDependencies = dependencyObject.circular().getArray();
|
|
if (circularDependencies.length > 0) {
|
|
console.log(circularDependencies);
|
|
process.exit(1);
|
|
}
|
|
done();
|
|
});
|
|
|
|
function jsServeDev() {
|
|
return jsserve(gulp, gulpPlugins, {path: CONFIG.dest.js.dev.es5, port: 8000})();
|
|
}
|
|
|
|
function jsServeProd() {
|
|
return jsserve(gulp, gulpPlugins, {path: CONFIG.dest.js.prod.es5, port: 8001})();
|
|
}
|
|
|
|
function jsServeDartJs() {
|
|
return jsserve(gulp, gulpPlugins, {path: CONFIG.dest.js.dart2js, port: 8002})();
|
|
}
|
|
|
|
function jsServeDartDevCompiler() {
|
|
return jsserve(gulp, gulpPlugins, {path: CONFIG.dest.js.dart_dev_compiler, port: 8003})();
|
|
}
|
|
|
|
function proxyServeDart() {
|
|
return jsserve(gulp, gulpPlugins, {
|
|
port: 8002,
|
|
proxies: [
|
|
{route: '/playground', url: 'http://localhost:8004'},
|
|
{route: '/benchmarks_external', url: 'http://localhost:8008'},
|
|
{route: '/benchmarks', url: 'http://localhost:8006'}
|
|
]
|
|
})();
|
|
}
|
|
|
|
// ------------------
|
|
// web servers
|
|
gulp.task('serve.js.dev', ['build.js.dev', 'build.js.cjs'], function(neverDone) {
|
|
var watch = require('./tools/build/watch');
|
|
|
|
watch('modules/**', {ignoreInitial: true}, '!broccoli.js.dev');
|
|
jsServeDev();
|
|
});
|
|
|
|
gulp.task('serve.js.prod', jsServeProd);
|
|
|
|
gulp.task('serve.e2e.dev', ['build.js.dev', 'build.js.cjs'], function(neverDone) {
|
|
var watch = require('./tools/build/watch');
|
|
|
|
watch('modules/**', {ignoreInitial: true}, ['!broccoli.js.dev', '!build.js.cjs']);
|
|
jsServeDev();
|
|
});
|
|
|
|
gulp.task('serve.e2e.prod', ['build.js.prod', 'build.js.cjs'], function(neverDone) {
|
|
var watch = require('./tools/build/watch');
|
|
|
|
watch('modules/**', {ignoreInitial: true}, ['!broccoli.js.prod', '!build.js.cjs']);
|
|
jsServeProd();
|
|
});
|
|
|
|
gulp.task('serve.js.dart2js', jsServeDartJs);
|
|
|
|
gulp.task('serve.js.ddc', jsServeDartDevCompiler);
|
|
|
|
gulp.task('!proxyServeDart', proxyServeDart);
|
|
|
|
gulp.task('serve.dart', function(done) {
|
|
runSequence(
|
|
[
|
|
'!proxyServeDart',
|
|
'serve/playground.dart',
|
|
'serve/benchmarks.dart',
|
|
'serve/benchmarks_external.dart'
|
|
],
|
|
done);
|
|
});
|
|
|
|
gulp.task('serve/playground.dart',
|
|
pubserve(gulp, gulpPlugins,
|
|
{command: DART_SDK.PUB, path: CONFIG.dest.dart + '/playground', port: 8004}));
|
|
|
|
gulp.task('serve/benchmarks.dart',
|
|
pubserve(gulp, gulpPlugins,
|
|
{command: DART_SDK.PUB, path: CONFIG.dest.dart + '/benchmarks', port: 8006}));
|
|
|
|
gulp.task(
|
|
'serve/benchmarks_external.dart',
|
|
pubserve(gulp, gulpPlugins,
|
|
{command: DART_SDK.PUB, path: CONFIG.dest.dart + '/benchmarks_external', port: 8008}));
|
|
|
|
gulp.task('serve.e2e.dart', ['build.js.cjs'], function(neverDone) {
|
|
var watch = require('./tools/build/watch');
|
|
|
|
// Note: we are not using build.dart as the dart analyzer takes too long...
|
|
watch('modules/**', {ignoreInitial: true}, ['!build/tree.dart', '!build.js.cjs']);
|
|
runSequence('build/packages.dart', 'build/pubspec.dart', 'serve.dart');
|
|
});
|
|
|
|
|
|
// ------------------
|
|
// CI tests suites
|
|
|
|
function execProcess(name, args, done) {
|
|
var exec = require('child_process').exec;
|
|
|
|
var cmd = process.platform === 'win32' ? 'node_modules\\.bin\\' + name + ' ' :
|
|
'node node_modules/.bin/' + name + ' ';
|
|
cmd += args;
|
|
exec(cmd, done);
|
|
}
|
|
function runKarma(configFile, done) {
|
|
execProcess('karma', 'run ' + configFile, function(e, stdout) {
|
|
// ignore errors, we don't want to fail the build in the interactive (non-ci) mode
|
|
// karma server will print all test failures
|
|
done();
|
|
});
|
|
}
|
|
|
|
// Gulp-typescript doesn't work with typescript@next:
|
|
// https://github.com/ivogabe/gulp-typescript/issues/331
|
|
function runTsc(project, done) {
|
|
execProcess('tsc', '-p ' + project, function(e, stdout, stderr) {
|
|
if (e) {
|
|
console.log(stdout);
|
|
console.error(stderr);
|
|
done(e);
|
|
} else {
|
|
done();
|
|
}
|
|
});
|
|
}
|
|
|
|
gulp.task('test.js', function(done) {
|
|
runSequence('test.compiler_cli', 'test.unit.tools/ci', 'test.transpiler.unittest',
|
|
'test.unit.js/ci', 'test.unit.cjs/ci', 'test.typings', 'check-public-api',
|
|
sequenceComplete(done));
|
|
});
|
|
|
|
gulp.task('test.dart', function(done) {
|
|
runSequence('versions.dart', 'test.transpiler.unittest', 'test.unit.dart/ci',
|
|
sequenceComplete(done));
|
|
});
|
|
|
|
gulp.task('versions.dart', function() { dartSdk.logVersion(DART_SDK); });
|
|
|
|
// Reuse the Travis scripts
|
|
// TODO: rename test_*.sh to test_all_*.sh
|
|
gulp.task('test.all.js', shell.task(['./scripts/ci/test_js.sh']));
|
|
gulp.task('test.all.dart', shell.task(['./scripts/ci/test_dart.sh']));
|
|
|
|
// karma tests
|
|
// These tests run in the browser and are allowed to access
|
|
// HTML DOM APIs.
|
|
function getBrowsersFromCLI(provider, isDart) {
|
|
var isProvider = false;
|
|
var rawInput =
|
|
cliArgs.browsers ? cliArgs.browsers : (isDart ? 'DartiumWithWebPlatform' : 'Chrome');
|
|
var inputList = rawInput.replace(' ', '').split(',');
|
|
var outputList = [];
|
|
for (var i = 0; i < inputList.length; i++) {
|
|
var input = inputList[i];
|
|
var karmaChromeLauncher = require('karma-chrome-launcher');
|
|
if (browserProvidersConf.customLaunchers.hasOwnProperty(input) ||
|
|
karmaChromeLauncher.hasOwnProperty("launcher:" + input)) {
|
|
// In case of non-sauce browsers, or browsers defined in karma-chrome-launcher (Chrome,
|
|
// ChromeCanary and Dartium):
|
|
// overrides everything, ignoring other options
|
|
outputList = [input];
|
|
isProvider = false;
|
|
break;
|
|
} else if (provider &&
|
|
browserProvidersConf.customLaunchers.hasOwnProperty(provider + "_" +
|
|
input.toUpperCase())) {
|
|
isProvider = true;
|
|
outputList.push(provider + "_" + input.toUpperCase());
|
|
} else if (provider && provider == 'SL' &&
|
|
browserProvidersConf.sauceAliases.hasOwnProperty(input.toUpperCase())) {
|
|
outputList = outputList.concat(browserProvidersConf.sauceAliases[input.toUpperCase()]);
|
|
isProvider = true;
|
|
} else if (provider && provider == 'BS' &&
|
|
browserProvidersConf.browserstackAliases.hasOwnProperty(input.toUpperCase())) {
|
|
outputList = outputList.concat(browserProvidersConf.browserstackAliases[input.toUpperCase()]);
|
|
isProvider = true;
|
|
} else {
|
|
throw new Error('ERROR: unknown browser found in getBrowsersFromCLI()');
|
|
}
|
|
}
|
|
return {
|
|
browsersToRun:
|
|
outputList.filter(function(item, pos, self) { return self.indexOf(item) == pos; }),
|
|
isProvider: isProvider
|
|
};
|
|
}
|
|
|
|
gulp.task('test.unit.js', ['build.js.dev'], function(neverDone) {
|
|
var watch = require('./tools/build/watch');
|
|
|
|
printModulesWarning();
|
|
runSequence('!test.unit.js/karma-server', function() {
|
|
watch('modules/**', {ignoreInitial: true}, ['!broccoli.js.dev', '!test.unit.js/karma-run']);
|
|
});
|
|
});
|
|
|
|
gulp.task('watch.js.dev', ['build.js.dev'], function(neverDone) {
|
|
var watch = require('./tools/build/watch');
|
|
|
|
printModulesWarning();
|
|
watch('modules/**', ['!broccoli.js.dev']);
|
|
});
|
|
|
|
gulp.task('test.unit.js.sauce', ['build.js.dev'], function(done) {
|
|
printModulesWarning();
|
|
var browserConf = getBrowsersFromCLI('SL');
|
|
if (browserConf.isProvider) {
|
|
launchKarmaWithExternalBrowsers(['dots'], browserConf.browsersToRun, done);
|
|
} else {
|
|
throw new Error('ERROR: no Saucelabs browsers provided, add them with the --browsers option');
|
|
}
|
|
});
|
|
|
|
gulp.task('test.unit.js.browserstack', ['build.js.dev'], function(done) {
|
|
printModulesWarning();
|
|
var browserConf = getBrowsersFromCLI('BS');
|
|
if (browserConf.isProvider) {
|
|
launchKarmaWithExternalBrowsers(['dots'], browserConf.browsersToRun, done);
|
|
} else {
|
|
throw new Error(
|
|
'ERROR: no Browserstack browsers provided, add them with the --browsers option');
|
|
}
|
|
});
|
|
|
|
function launchKarmaWithExternalBrowsers(reporters, browsers, done) {
|
|
var karma = require('karma');
|
|
|
|
new karma.Server(
|
|
{
|
|
configFile: __dirname + '/karma-js.conf.js',
|
|
singleRun: true,
|
|
browserNoActivityTimeout: 240000,
|
|
captureTimeout: 120000,
|
|
reporters: reporters,
|
|
browsers: browsers
|
|
},
|
|
function(err) {
|
|
done();
|
|
process.exit(err ? 1 : 0);
|
|
})
|
|
.start();
|
|
}
|
|
|
|
gulp.task('!test.unit.js/karma-server', function(done) {
|
|
var karma = require('karma');
|
|
|
|
var watchStarted = false;
|
|
var server = new karma.Server({configFile: __dirname + '/karma-js.conf.js'});
|
|
server.on('run_complete', function() {
|
|
if (!watchStarted) {
|
|
watchStarted = true;
|
|
done();
|
|
}
|
|
});
|
|
server.start();
|
|
});
|
|
|
|
|
|
gulp.task('!test.unit.js/karma-run', function(done) {
|
|
// run the run command in a new process to avoid duplicate logging by both server and runner from
|
|
// a single process
|
|
runKarma('karma-js.conf.js', done);
|
|
});
|
|
|
|
gulp.task('test.unit.router', function(neverDone) {
|
|
var watch = require('./tools/build/watch');
|
|
|
|
runSequence('!test.unit.router/karma-server', function() {
|
|
watch('modules/**', ['buildRouter.dev', '!test.unit.router/karma-run']);
|
|
});
|
|
});
|
|
|
|
gulp.task('!test.unit.router/karma-server', function() {
|
|
var karma = require('karma');
|
|
|
|
new karma.Server({configFile: __dirname + '/modules/angular1_router/karma-router.conf.js'})
|
|
.start();
|
|
});
|
|
|
|
|
|
gulp.task('!test.unit.router/karma-run', function(done) {
|
|
var karma = require('karma');
|
|
|
|
karma.runner.run({configFile: __dirname + '/modules/angular1_router/karma-router.conf.js'},
|
|
function(exitCode) {
|
|
// ignore exitCode, we don't want to fail the build in the interactive (non-ci)
|
|
// mode
|
|
// karma will print all test failures
|
|
done();
|
|
});
|
|
});
|
|
|
|
gulp.task('buildRouter.dev', function() {
|
|
var modulesSrcDir = __dirname + '/modules';
|
|
var distDir = __dirname + '/dist';
|
|
buildRouter(modulesSrcDir, distDir);
|
|
});
|
|
|
|
gulp.task('test.unit.dart', function(done) {
|
|
printModulesWarning();
|
|
runSequence('build/tree.dart', 'build/pure-packages.dart', '!build/pubget.angular2.dart',
|
|
'!build/remove-pub-symlinks', function(error) {
|
|
var watch = require('./tools/build/watch');
|
|
|
|
// if initial build failed (likely due to build or formatting step) then exit
|
|
// otherwise karma server doesn't start and we can't continue running properly
|
|
if (error) {
|
|
done(error);
|
|
return;
|
|
}
|
|
// treatTestErrorsAsFatal = false;
|
|
|
|
watch(['modules/angular2/**'],
|
|
['!build/tree.dart', '!test.unit.dart/run/angular2']);
|
|
});
|
|
});
|
|
|
|
// Dart Payload Size Test
|
|
// This test will fail if the size of our hello_world app goes beyond one of
|
|
// these values when compressed at the specified level.
|
|
// Measure in bytes.
|
|
var _DART_PAYLOAD_SIZE_LIMITS = {'uncompressed': 320 * 1024, 'gzip level=9': 90 * 1024};
|
|
gulp.task('test.payload.dart/ci', function(done) {
|
|
runSequence('build/packages.dart', '!pubget.payload.dart', '!pubbuild.payload.dart',
|
|
'!checkAndReport.payload.dart', done);
|
|
});
|
|
|
|
gulp.task('!pubget.payload.dart',
|
|
pubget.dir(gulp, gulpPlugins,
|
|
{dir: 'modules_dart/payload/hello_world', command: DART_SDK.PUB}));
|
|
|
|
gulp.task('!pubbuild.payload.dart',
|
|
pubbuild.single(gulp, gulpPlugins,
|
|
{command: DART_SDK.PUB, src: 'modules_dart/payload/hello_world'}));
|
|
|
|
gulp.task('!checkAndReport.payload.dart', function() {
|
|
var reportSize = require('./tools/analytics/reportsize');
|
|
return reportSize('modules_dart/payload/hello_world/build/web/*.dart.js',
|
|
{failConditions: _DART_PAYLOAD_SIZE_LIMITS, prefix: 'hello_world'});
|
|
});
|
|
|
|
// JS payload size tracking
|
|
gulp.task('test.payload.js/ci', function(done) {
|
|
runSequence('build.payload.js', '!checkAndReport.payload.js', sequenceComplete(done));
|
|
});
|
|
|
|
gulp.task('build.payload.js', ['build.js'], function(done) {
|
|
runSequence('!build.payload.js.webpack', '!build.payload.js.systemjs', sequenceComplete(done));
|
|
});
|
|
|
|
gulp.task('!build.payload.js.webpack', function() {
|
|
var webpack = require('./tools/build/webpack/promiseify');
|
|
|
|
var ES5_PROD_ROOT = __dirname + '/' + CONFIG.dest.js.prod.es5;
|
|
|
|
return Promise.all(PAYLOAD_TESTS_CONFIG.ts.cases.map(function(caseName) {
|
|
var CASE_PATH = PAYLOAD_TESTS_CONFIG.ts.dist(caseName, 'webpack');
|
|
|
|
return webpack({
|
|
// bundle app + framework
|
|
entry: CASE_PATH + '/index.js',
|
|
output: {path: CASE_PATH, filename: "app-bundle.js"},
|
|
resolve: {
|
|
extensions: ['', '.js'],
|
|
packageAlias: '', // option added to ignore "broken" package.json in our dist folder
|
|
root: [ES5_PROD_ROOT]
|
|
}
|
|
})
|
|
.then(function() { // pad bundle with mandatory dependencies
|
|
return new Promise(function(resolve, reject) {
|
|
gulp.src([
|
|
'node_modules/zone.js/dist/zone.js',
|
|
'node_modules/zone.js/dist/long-stack-trace-zone.js',
|
|
'node_modules/reflect-metadata/Reflect.js',
|
|
CASE_PATH + '/app-bundle.js'
|
|
])
|
|
.pipe(gulpPlugins.concat(PAYLOAD_TESTS_CONFIG.ts.bundleName))
|
|
.pipe(gulpPlugins.uglify())
|
|
.pipe(gulp.dest(CASE_PATH))
|
|
.on('end', resolve)
|
|
.on('error', reject);
|
|
});
|
|
});
|
|
}));
|
|
});
|
|
|
|
gulp.task('!build.payload.js.systemjs', function() {
|
|
var bundler = require('./tools/build/bundle');
|
|
|
|
return Promise.all(PAYLOAD_TESTS_CONFIG.ts.cases.map(function(caseName) {
|
|
var CASE_PATH = PAYLOAD_TESTS_CONFIG.ts.dist(caseName, 'systemjs');
|
|
|
|
return bundler
|
|
.bundle(
|
|
{
|
|
paths: {'index': CASE_PATH + '/index.js'},
|
|
meta: {'angular2/core': {build: false}, 'angular2/platform/browser': {build: false}}
|
|
},
|
|
'index', CASE_PATH + '/index.register.js', {})
|
|
.then(function() {
|
|
return new Promise(function(resolve, reject) {
|
|
gulp.src([
|
|
'node_modules/systemjs/dist/system.src.js',
|
|
'dist/js/prod/es5/bundle/angular2-polyfills.js',
|
|
'dist/js/prod/es5/bundle/angular2.js',
|
|
'dist/js/prod/es5//rxjs/bundles/Rx.js',
|
|
CASE_PATH + '/index.register.js',
|
|
'tools/build/systemjs/payload_tests_import.js'
|
|
])
|
|
.pipe(gulpPlugins.concat(PAYLOAD_TESTS_CONFIG.ts.bundleName))
|
|
.pipe(gulpPlugins.uglify())
|
|
.pipe(gulp.dest(CASE_PATH))
|
|
.on('end', resolve)
|
|
.on('error', reject);
|
|
});
|
|
});
|
|
}));
|
|
});
|
|
|
|
gulp.task('!checkAndReport.payload.js', function() {
|
|
var reportSize = require('./tools/analytics/reportsize');
|
|
|
|
function caseSizeStream(caseName, packaging) {
|
|
return reportSize(PAYLOAD_TESTS_CONFIG.ts.dist(caseName, packaging) + '/' +
|
|
PAYLOAD_TESTS_CONFIG.ts.bundleName,
|
|
{
|
|
failConditions: PAYLOAD_TESTS_CONFIG.ts[packaging].sizeLimits,
|
|
prefix: caseName + '_' + packaging
|
|
});
|
|
}
|
|
|
|
return PAYLOAD_TESTS_CONFIG.ts.cases.reduce(function(sizeReportingStreams, caseName) {
|
|
sizeReportingStreams.add(caseSizeStream(caseName, 'systemjs'));
|
|
sizeReportingStreams.add(caseSizeStream(caseName, 'webpack'));
|
|
}, merge2());
|
|
});
|
|
|
|
gulp.task('watch.dart.dev', function(done) {
|
|
runSequence('build/tree.dart', 'build/pure-packages.dart', '!build/pubget.angular2.dart',
|
|
'!build/remove-pub-symlinks', function(error) {
|
|
var watch = require('./tools/build/watch');
|
|
|
|
// if initial build failed (likely due to build or formatting step) then exit
|
|
// otherwise karma server doesn't start and we can't continue running properly
|
|
if (error) {
|
|
done(error);
|
|
return;
|
|
}
|
|
|
|
watch(['modules/angular2/**', 'modules_dart/**'], {ignoreInitial: true},
|
|
['!build/tree.dart', 'build/pure-packages.dart']);
|
|
});
|
|
});
|
|
|
|
gulp.task('test.unit.router/ci', function(done) {
|
|
var karma = require('karma');
|
|
|
|
var browserConf = getBrowsersFromCLI();
|
|
new karma.Server(
|
|
{
|
|
configFile: __dirname + '/modules/angular1_router/karma-router.conf.js',
|
|
singleRun: true,
|
|
reporters: ['dots'],
|
|
browsers: browserConf.browsersToRun
|
|
},
|
|
done)
|
|
.start();
|
|
});
|
|
|
|
gulp.task('test.unit.js/ci', function(done) {
|
|
var karma = require('karma');
|
|
|
|
var browserConf = getBrowsersFromCLI();
|
|
new karma.Server(
|
|
{
|
|
configFile: __dirname + '/karma-js.conf.js',
|
|
singleRun: true,
|
|
reporters: ['dots'],
|
|
browsers: browserConf.browsersToRun
|
|
},
|
|
function(err) { done(); })
|
|
.start();
|
|
});
|
|
|
|
gulp.task('test.unit.js.sauce/ci', function(done) {
|
|
var browsers = browserProvidersConf.sauceAliases.CI_REQUIRED;
|
|
if (cliArgs.mode && cliArgs.mode == 'saucelabs_optional') {
|
|
browsers = browserProvidersConf.sauceAliases.CI_OPTIONAL;
|
|
}
|
|
launchKarmaWithExternalBrowsers(['dots', 'saucelabs'], browsers, done);
|
|
});
|
|
|
|
gulp.task('test.unit.js.browserstack/ci', function(done) {
|
|
var browsers = browserProvidersConf.browserstackAliases.CI_REQUIRED;
|
|
if (cliArgs.mode && cliArgs.mode == 'browserstack_optional') {
|
|
browsers = browserProvidersConf.browserstackAliases.CI_OPTIONAL;
|
|
}
|
|
launchKarmaWithExternalBrowsers(['dots'], browsers, done);
|
|
});
|
|
|
|
gulp.task('test.unit.dart/ci', function(done) {
|
|
runSequence('test.dart.dartium_symlink', '!test.unit.dart/run/angular2',
|
|
'!test.unit.dart/run/angular2_testing', '!test.unit.dart/run/benchpress',
|
|
sequenceComplete(done));
|
|
});
|
|
|
|
// At the moment, dart test requires dartium to be an executable on the path.
|
|
// Make a temporary directory and symlink dartium from there (just for this command)
|
|
// so that it can run.
|
|
// TODO(juliemr): this won't work with windows - remove the hack and make this platform agnostic.
|
|
var dartiumTmpdir = path.join(os.tmpdir(), 'dartium' + new Date().getTime().toString());
|
|
var dartiumPathPrefix = 'PATH=$PATH:' + dartiumTmpdir + ' ';
|
|
gulp.task(
|
|
'test.dart.dartium_symlink',
|
|
shell.task(['mkdir ' + dartiumTmpdir, 'ln -s $DARTIUM_BIN ' + dartiumTmpdir + '/dartium']));
|
|
|
|
gulp.task('!test.unit.dart/run/angular2', function() {
|
|
var pubtest = require('./tools/build/pubtest');
|
|
return pubtest({
|
|
dir: path.join(CONFIG.dest.dart, 'angular2'),
|
|
dartiumTmpdir: dartiumTmpdir,
|
|
command: DART_SDK.PUB,
|
|
files: '**/*_spec.dart',
|
|
bunchFiles: true,
|
|
useExclusiveTests: true
|
|
});
|
|
});
|
|
|
|
gulp.task('!test.unit.dart/run/angular2_testing', function() {
|
|
var pubtest = require('./tools/build/pubtest');
|
|
|
|
return pubtest({
|
|
dir: path.join(CONFIG.dest.dart, 'angular2_testing'),
|
|
dartiumTmpdir: dartiumTmpdir,
|
|
command: DART_SDK.PUB,
|
|
files: '**/*_test.dart',
|
|
useExclusiveTests: true
|
|
});
|
|
});
|
|
|
|
gulp.task('!test.unit.dart/run/benchpress', function() {
|
|
var pubtest = require('./tools/build/pubtest');
|
|
|
|
return pubtest({
|
|
dir: path.join(CONFIG.dest.dart, 'benchpress'),
|
|
dartiumTmpdir: dartiumTmpdir,
|
|
command: DART_SDK.PUB,
|
|
files: '**/*_spec.dart',
|
|
useExclusiveTests: true
|
|
});
|
|
});
|
|
|
|
gulp.task('test.unit.cjs/ci', function(done) {
|
|
runJasmineTests(['dist/js/cjs/{angular2,benchpress}/test/**/*_spec.js'], done);
|
|
});
|
|
|
|
gulp.task('check-public-api', ['build.tools'],
|
|
function(done) { runJasmineTests(['dist/tools/public_api_guard/**/*_spec.js'], done); });
|
|
|
|
gulp.task('test.unit.cjs', ['build/clean.js', 'build.tools'], function(neverDone) {
|
|
var watch = require('./tools/build/watch');
|
|
|
|
printModulesWarning();
|
|
treatTestErrorsAsFatal = false;
|
|
watch('modules/**', ['!build.js.cjs', 'test.unit.cjs/ci']);
|
|
});
|
|
|
|
// Use this target to continuously run dartvm unit-tests (such as transformer
|
|
// tests) while coding. Note: these tests do not use Karma.
|
|
gulp.task('test.unit.dartvm', function(neverDone) {
|
|
var watch = require('./tools/build/watch');
|
|
|
|
runSequence('build/tree.dart', 'build/pure-packages.dart', '!build/pubget.angular2.dart',
|
|
'!test.unit.dartvm/run', function(error) {
|
|
// Watch for changes made in the TS and Dart code under "modules" and
|
|
// run ts2dart and test change detector generator prior to rerunning the
|
|
// tests.
|
|
watch('modules/angular2/**', {ignoreInitial: true},
|
|
['!build/tree.dart', '!test.unit.dartvm/run']);
|
|
|
|
// Watch for changes made in Dart code under "modules_dart", then copy it
|
|
// to dist and run test change detector generator prior to retunning the
|
|
// tests.
|
|
watch('modules_dart/**', {ignoreInitial: true},
|
|
['build/pure-packages.dart', '!test.unit.dartvm/run']);
|
|
});
|
|
});
|
|
|
|
gulp.task('!test.unit.dartvm/run',
|
|
runServerDartTests(gulp, gulpPlugins, {dir: 'dist/dart/angular2'}));
|
|
|
|
|
|
gulp.task('test.unit.tools/ci', function(done) {
|
|
runJasmineTests(['dist/tools/**/*.spec.js', 'tools/**/*.spec.js'], done);
|
|
});
|
|
|
|
|
|
gulp.task('test.unit.tools', ['build/clean.tools'], function(neverDone) {
|
|
var watch = require('./tools/build/watch');
|
|
treatTestErrorsAsFatal = false;
|
|
|
|
watch(['tools/**', '!tools/**/test-fixtures/**'], ['!build.tools', 'test.unit.tools/ci']);
|
|
});
|
|
|
|
|
|
// ------------------
|
|
// server tests
|
|
// These tests run on the VM on the command-line and are
|
|
// allowed to access the file system and network.
|
|
gulp.task('test.server.dart', runServerDartTests(gulp, gulpPlugins, {dest: 'dist/dart'}));
|
|
|
|
// -----------------
|
|
// test builders
|
|
gulp.task('test.transpiler.unittest',
|
|
function(done) { runJasmineTests(['tools/transpiler/unittest/**/*.js'], done); });
|
|
|
|
// -----------------
|
|
// Pre-test checks
|
|
|
|
gulp.task('pre-test-checks', function(done) {
|
|
runSequence('build/checkCircularDependencies', sequenceComplete(done));
|
|
});
|
|
|
|
// -----------------
|
|
// Checks which should fail the build, but should not block us running the tests.
|
|
// This task is run in a separate travis worker, so these checks provide faster
|
|
// feedback while allowing tests to execute.
|
|
gulp.task('static-checks', ['!build.tools'], function(done) {
|
|
runSequence(
|
|
// We do not run test.typings here because it requires building, which is too slow.
|
|
['enforce-format', 'lint'], sequenceComplete(done));
|
|
});
|
|
|
|
|
|
// -----------------
|
|
// Tests for the typings we deliver for TS users
|
|
//
|
|
// Typings are contained in individual .d.ts files produced by the compiler,
|
|
// distributed in our npm package, and loaded from node_modules by
|
|
// the typescript compiler.
|
|
|
|
// Make sure the typings tests are isolated, by running in a tempdir
|
|
var tmpdir = path.join(os.tmpdir(), 'test.typings', new Date().getTime().toString());
|
|
gulp.task('!pre.test.typings.layoutNodeModule', function() {
|
|
return gulp.src(['dist/js/cjs/angular2/**/*', 'node_modules/rxjs/**/*'], {base: 'dist/js/cjs'})
|
|
.pipe(gulp.dest(path.join(tmpdir, 'node_modules')));
|
|
});
|
|
|
|
gulp.task('!pre.test.typings.copyDeps', function() {
|
|
return gulp.src(
|
|
[
|
|
'modules/angular2/typings/angular-protractor/*.ts',
|
|
'modules/angular2/typings/jasmine/*.ts',
|
|
'modules/angular2/typings/selenium-webdriver/*.ts',
|
|
],
|
|
{base: 'modules/angular2/typings'})
|
|
.pipe(gulp.dest(tmpdir));
|
|
});
|
|
|
|
gulp.task('!pre.test.typings.copyTypingsSpec', function() {
|
|
return gulp.src(['modules/angular2/examples/**/*.ts']).pipe(gulp.dest(tmpdir));
|
|
});
|
|
|
|
gulp.task('!test.typings',
|
|
[
|
|
'!pre.test.typings.layoutNodeModule',
|
|
'!pre.test.typings.copyTypingsSpec',
|
|
'!pre.test.typings.copyDeps'
|
|
],
|
|
function() {
|
|
var tsc = require('gulp-typescript');
|
|
|
|
return gulp.src([tmpdir + '/**/*.ts', '!' + tmpdir + '/node_modules/**/*'])
|
|
.pipe(tsc({
|
|
target: 'ES6',
|
|
module: 'commonjs',
|
|
experimentalDecorators: true,
|
|
noImplicitAny: true,
|
|
moduleResolution: 'node',
|
|
typescript: require('typescript')
|
|
}));
|
|
});
|
|
|
|
gulp.task('test.typings', ['build.js.cjs'],
|
|
function(done) { runSequence('!test.typings', sequenceComplete(done)); });
|
|
|
|
gulp.task('!build.compiler_cli', function(done) { runTsc('tools/compiler_cli/src', done); });
|
|
|
|
gulp.task('!clean.compiler_cli', function(done) {
|
|
fse.remove(path.join('dist', 'tools', 'compiler_cli', 'test'),
|
|
fse.remove(path.join('tools', 'compiler_cli', 'test', 'src', '*.ngfactory.ts'),
|
|
fse.remove(path.join('tools', 'compiler_cli', 'test', 'src', 'a',
|
|
'*.ngfactory.ts'),
|
|
done)));
|
|
});
|
|
|
|
gulp.task('!test.compiler_cli.codegen', function(done) {
|
|
try {
|
|
require('./dist/tools/compiler_cli/main')
|
|
.main("tools/compiler_cli/test")
|
|
.then(done)
|
|
.catch(function(rej) { done(rej); });
|
|
} catch (err) {
|
|
done(err);
|
|
}
|
|
});
|
|
|
|
gulp.task('!test.compiler_cli.unit',
|
|
function(done) { runJasmineTests(['dist/tools/compiler_cli/**/*_spec.js'], done) });
|
|
|
|
// This task overwrites our careful tsickle-lowered Decorators with normal .js emit.
|
|
// So it should only be run after asserting on the .js file content.
|
|
gulp.task('!test.compiler_cli.verify_codegen',
|
|
function(done) { runTsc('tools/compiler_cli/test', done); });
|
|
|
|
// End-to-end test for compiler CLI.
|
|
// Calls the compiler using its command-line interface, then compiles the app with the codegen.
|
|
// TODO(alexeagle): wire up the playground tests with offline compilation, similar to dart.
|
|
gulp.task('test.compiler_cli', ['!build.compiler_cli'], function(done) {
|
|
runSequence('!clean.compiler_cli', '!test.compiler_cli.codegen', '!test.compiler_cli.unit',
|
|
'!test.compiler_cli.verify_codegen', sequenceComplete(done));
|
|
});
|
|
|
|
// -----------------
|
|
// orchestrated targets
|
|
|
|
// Pure Dart packages only contain Dart code and conform to pub package layout.
|
|
// These packages need no transpilation. All code is copied over to `dist`
|
|
// unmodified and directory structure is preserved.
|
|
//
|
|
// This task is expected to be run after build/tree.dart
|
|
gulp.task('build/pure-packages.dart', function(done) {
|
|
runSequence('build/pure-packages.dart/standalone', 'build/pure-packages.dart/license',
|
|
'build/pure-packages.dart/angular2', sequenceComplete(done));
|
|
});
|
|
|
|
|
|
gulp.task('build/pure-packages.dart/standalone', function() {
|
|
return gulp.src([
|
|
'modules_dart/**/*',
|
|
'!modules_dart/**/*.proto',
|
|
'!modules_dart/**/packages{,/**}',
|
|
'!modules_dart/**/.packages',
|
|
'!modules_dart/payload{,/**}',
|
|
'!modules_dart/transform{,/**}',
|
|
])
|
|
.pipe(gulp.dest(CONFIG.dest.dart));
|
|
});
|
|
|
|
gulp.task('build/pure-packages.dart/license', function() {
|
|
return gulp.src(['LICENSE']).pipe(gulp.dest(path.join(CONFIG.dest.dart, 'angular2_testing')));
|
|
});
|
|
|
|
|
|
gulp.task('build/pure-packages.dart/angular2', function() {
|
|
return gulp.src([
|
|
'modules_dart/transform/**/*',
|
|
'!modules_dart/transform/**/*.proto',
|
|
'!modules_dart/transform/pubspec.yaml',
|
|
'!modules_dart/transform/**/packages{,/**}',
|
|
])
|
|
.pipe(gulp.dest(path.join(CONFIG.dest.dart, 'angular2')));
|
|
});
|
|
|
|
// Builds all Dart packages, but does not compile them
|
|
gulp.task('build/packages.dart', function(done) {
|
|
runSequence('lint_protos.dart', 'pubget.dart', 'build/tree.dart', 'build/pure-packages.dart',
|
|
// Run after 'build/tree.dart' because broccoli clears the dist/dart folder
|
|
'!build/pubget.angular2.dart', sequenceComplete(done));
|
|
});
|
|
|
|
// Builds and compiles all Dart packages
|
|
gulp.task('build.dart', function(done) {
|
|
runSequence('build/packages.dart', 'build/pubspec.dart', 'build/analyze.dart',
|
|
'build/check.apidocs.dart', sequenceComplete(done));
|
|
});
|
|
|
|
|
|
// public task to build tools
|
|
gulp.task('build.tools', ['build/clean.tools'],
|
|
function(done) { runSequence('!build.tools', sequenceComplete(done)); });
|
|
|
|
|
|
// private task to build tools
|
|
gulp.task('!build.tools', function() {
|
|
var sourcemaps = require('gulp-sourcemaps');
|
|
var tsc = require('gulp-typescript');
|
|
|
|
var stream = gulp.src(['tools/**/*.ts', '!tools/compiler_cli/**'])
|
|
.pipe(sourcemaps.init())
|
|
.pipe(tsc({
|
|
target: 'ES5',
|
|
module: 'commonjs',
|
|
declaration: true,
|
|
noImplicitAny: true,
|
|
// Don't use the version of typescript that gulp-typescript depends on
|
|
// see https://github.com/ivogabe/gulp-typescript#typescript-version
|
|
typescript: require('typescript')
|
|
}));
|
|
stream =
|
|
merge2([stream.js.pipe(gulp.dest('dist/tools')), stream.dts.pipe(gulp.dest('dist/tools'))])
|
|
.on('error',
|
|
function(error) {
|
|
// nodejs doesn't propagate errors from the src stream into the final
|
|
// stream so we are
|
|
// forwarding the error into the final stream
|
|
stream.emit('error', error);
|
|
})
|
|
.pipe(sourcemaps.write('.'))
|
|
.on('end', function() {
|
|
var AngularBuilder = require('./dist/tools/broccoli/angular_builder').AngularBuilder;
|
|
angularBuilder =
|
|
new AngularBuilder({outputPath: 'dist', dartSDK: DART_SDK, logs: logs});
|
|
});
|
|
|
|
return stream;
|
|
});
|
|
|
|
gulp.task('broccoli.js.dev', ['build.tools'],
|
|
function(done) { runSequence('!broccoli.js.dev', sequenceComplete(done)); });
|
|
|
|
gulp.task('!broccoli.js.dev', () => angularBuilder.rebuildBrowserDevTree({
|
|
generateEs6: generateEs6,
|
|
projects: cliArgsProjects,
|
|
noTypeChecks: cliArgs.noTypeChecks,
|
|
useBundles: cliArgs.useBundles
|
|
}));
|
|
|
|
gulp.task('!broccoli.js.prod', () => angularBuilder.rebuildBrowserProdTree({
|
|
generateEs6: generateEs6,
|
|
projects: cliArgsProjects,
|
|
noTypeChecks: cliArgs.noTypeChecks,
|
|
useBundles: cliArgs.useBundles
|
|
}));
|
|
|
|
gulp.task('build.js.dev', ['build/clean.js'],
|
|
function(done) { runSequence('broccoli.js.dev', sequenceComplete(done)); });
|
|
|
|
gulp.task('build.js.prod', ['build.tools'],
|
|
function(done) { runSequence('!broccoli.js.prod', sequenceComplete(done)); });
|
|
|
|
|
|
/**
|
|
* public task
|
|
*/
|
|
gulp.task('build.js.cjs', ['build.tools'],
|
|
function(done) { runSequence('!build.js.cjs', sequenceComplete(done)); });
|
|
|
|
|
|
var firstBuildJsCjs = true;
|
|
|
|
/**
|
|
* private task
|
|
*/
|
|
gulp.task('!build.js.cjs', function() {
|
|
return angularBuilder.rebuildNodeTree({
|
|
generateEs6: generateEs6,
|
|
projects: cliArgsProjects,
|
|
noTypeChecks: cliArgs.noTypeChecks,
|
|
useBundles: cliArgs.useBundles
|
|
})
|
|
.then(function() {
|
|
if (firstBuildJsCjs) {
|
|
firstBuildJsCjs = false;
|
|
console.log('creating node_modules symlink hack');
|
|
// linknodemodules is all sync
|
|
linknodemodules(gulp, gulpPlugins, {dir: CONFIG.dest.js.cjs})();
|
|
}
|
|
});
|
|
});
|
|
|
|
|
|
var bundleConfig = {
|
|
paths: {"*": "dist/js/prod/es5/*.js"},
|
|
// Files that end up empty after transpilation confuse system-builder
|
|
// and need to be explitily listed here.
|
|
// TODO: upgrade system builder and find a way to declare all input as cjs.
|
|
meta: {
|
|
'angular2/src/router/route_definition': {format: 'cjs'},
|
|
'angular2/src/common/directives/observable_list_diff': {format: 'cjs'},
|
|
'angular2/lifecycle_hooks': {format: 'cjs'}
|
|
}
|
|
};
|
|
|
|
// production build
|
|
gulp.task('!bundle.js.prod', ['build.js.prod'], function() {
|
|
var bundler = require('./tools/build/bundle');
|
|
var bundlerConfig = {sourceMaps: true};
|
|
|
|
return bundler.bundle(bundleConfig, NG2_BUNDLE_CONTENT, './dist/build/angular2.js', bundlerConfig)
|
|
.then(function() {
|
|
return Promise.all([
|
|
bundler.bundle(bundleConfig, HTTP_BUNDLE_CONTENT, './dist/build/http.js', bundlerConfig),
|
|
bundler.bundle(bundleConfig, ROUTER_BUNDLE_CONTENT, './dist/build/router.js',
|
|
bundlerConfig),
|
|
bundler.bundle(bundleConfig, ALT_ROUTER_BUNDLE_CONTENT, './dist/build/alt_router.js',
|
|
bundlerConfig),
|
|
bundler.bundle(bundleConfig, UPGRADE_BUNDLE_CONTENT, './dist/build/upgrade.js',
|
|
bundlerConfig)
|
|
]);
|
|
});
|
|
});
|
|
|
|
// minified production build
|
|
gulp.task('!bundle.js.min', ['build.js.prod'], function() {
|
|
var bundler = require('./tools/build/bundle');
|
|
var bundlerConfig =
|
|
{sourceMaps: true, minify: true, mangle: false, uglify: {compress: {keep_fnames: true}}};
|
|
|
|
return bundler.bundle(bundleConfig, NG2_BUNDLE_CONTENT, './dist/build/angular2.min.js',
|
|
bundlerConfig)
|
|
.then(function() {
|
|
return Promise.all([
|
|
bundler.bundle(bundleConfig, HTTP_BUNDLE_CONTENT, './dist/build/http.min.js',
|
|
bundlerConfig),
|
|
bundler.bundle(bundleConfig, ROUTER_BUNDLE_CONTENT, './dist/build/router.min.js',
|
|
bundlerConfig),
|
|
bundler.bundle(bundleConfig, ALT_ROUTER_BUNDLE_CONTENT, './dist/build/alt_router.min.js',
|
|
bundlerConfig),
|
|
bundler.bundle(bundleConfig, UPGRADE_BUNDLE_CONTENT, './dist/build/upgrade.min.js',
|
|
bundlerConfig)
|
|
]);
|
|
});
|
|
});
|
|
|
|
// development build
|
|
gulp.task('!bundle.js.dev', ['build.js.dev'], function() {
|
|
var bundler = require('./tools/build/bundle');
|
|
var bundlerConfig = {sourceMaps: true};
|
|
|
|
var devBundleConfig = merge(true, bundleConfig);
|
|
devBundleConfig.paths = merge(true, devBundleConfig.paths, {"*": "dist/js/dev/es5/*.js"});
|
|
|
|
return bundler.bundle(devBundleConfig, NG2_BUNDLE_CONTENT, './dist/build/angular2.dev.js',
|
|
bundlerConfig)
|
|
.then(function() {
|
|
return Promise.all([
|
|
bundler.bundle(devBundleConfig, HTTP_BUNDLE_CONTENT, './dist/build/http.dev.js',
|
|
bundlerConfig),
|
|
bundler.bundle(devBundleConfig, ROUTER_BUNDLE_CONTENT, './dist/build/router.dev.js',
|
|
bundlerConfig),
|
|
bundler.bundle(devBundleConfig, ALT_ROUTER_BUNDLE_CONTENT,
|
|
'./dist/build/alt_router.dev.js', bundlerConfig),
|
|
bundler.bundle(devBundleConfig, UPGRADE_BUNDLE_CONTENT, './dist/build/upgrade.dev.js',
|
|
bundlerConfig)
|
|
]);
|
|
});
|
|
});
|
|
|
|
// WebWorker build
|
|
gulp.task("!bundle.web_worker.js.dev", ["build.js.dev"], function() {
|
|
var bundler = require('./tools/build/bundle');
|
|
var devBundleConfig = merge(true, bundleConfig);
|
|
|
|
devBundleConfig.paths = merge(true, devBundleConfig.paths, {"*": "dist/js/dev/es5/*.js"});
|
|
|
|
return bundler.bundle(devBundleConfig, 'angular2/web_worker/ui',
|
|
'./dist/build/web_worker/ui.dev.js', {sourceMaps: true})
|
|
.then(function() {
|
|
return bundler.bundle(devBundleConfig, 'angular2/web_worker/worker',
|
|
'./dist/build/web_worker/worker.dev.js', {sourceMaps: true});
|
|
});
|
|
});
|
|
|
|
gulp.task('!bundle.testing', ['build.js.dev'], function() {
|
|
var bundler = require('./tools/build/bundle');
|
|
|
|
var devBundleConfig = merge(true, bundleConfig);
|
|
devBundleConfig.paths = merge(true, devBundleConfig.paths, {"*": "dist/js/dev/es5/*.js"});
|
|
|
|
return bundler.bundle(devBundleConfig, TESTING_BUNDLE_CONTENT, './dist/js/bundle/testing.dev.js',
|
|
{sourceMaps: true});
|
|
});
|
|
|
|
gulp.task('!bundles.js.docs', ['clean'], function() {
|
|
return gulp.src('modules/angular2/docs/bundles/*').pipe(gulp.dest('dist/js/bundle'));
|
|
});
|
|
|
|
gulp.task('!bundles.js.umd', ['build.js.dev'], function() {
|
|
var webpack = require('./tools/build/webpack/promiseify');
|
|
|
|
function resolveOptions(devOrProd) {
|
|
return {
|
|
root: __dirname + '/dist/js/' + devOrProd + '/es5',
|
|
packageAlias: '' // this option is added to ignore "broken" package.json in our dist folder
|
|
};
|
|
}
|
|
|
|
function outputOptions(outFileName, devOrProd) {
|
|
return {
|
|
filename:
|
|
'dist/js/bundle/' + outFileName + '.umd' + (devOrProd === 'dev' ? '.dev' : '') + '.js',
|
|
library: 'ng',
|
|
libraryTarget: 'umd'
|
|
};
|
|
}
|
|
|
|
function webPackConf(entryPoints, outFileName, devOrProd) {
|
|
return {
|
|
entry: entryPoints,
|
|
resolve: resolveOptions(devOrProd),
|
|
module: {preLoaders: [{test: /\.js$/, loader: 'source-map-loader'}]},
|
|
devtool: devOrProd === 'dev' ? 'inline-source-map' : undefined,
|
|
output: outputOptions(outFileName, devOrProd),
|
|
externals: {
|
|
'rxjs/Observable': 'umd Rx',
|
|
'rxjs/Subject': 'umd Rx',
|
|
'rxjs/subject/ReplaySubject': {
|
|
commonjs: 'rxjs/subject/ReplaySubject',
|
|
commonjs2: 'rxjs/subject/ReplaySubject',
|
|
amd: 'rxjs/subject/ReplaySubject',
|
|
root: ['Rx']
|
|
},
|
|
'rxjs/operator/take': {
|
|
commonjs: 'rxjs/operator/take',
|
|
commonjs2: 'rxjs/operator/take',
|
|
amd: 'rxjs/operator/take',
|
|
root: ['Rx', 'Observable', 'prototype']
|
|
},
|
|
'rxjs/observable/fromPromise': {
|
|
commonjs: 'rxjs/observable/fromPromise',
|
|
commonjs2: 'rxjs/observable/fromPromise',
|
|
amd: 'rxjs/observable/fromPromise',
|
|
root: ['Rx', 'Observable']
|
|
},
|
|
'rxjs/operator/toPromise': {
|
|
commonjs: 'rxjs/operator/toPromise',
|
|
commonjs2: 'rxjs/operator/toPromise',
|
|
amd: 'rxjs/operator/toPromise',
|
|
root: ['Rx', 'Observable', 'prototype']
|
|
}
|
|
}
|
|
};
|
|
}
|
|
|
|
return Promise.all([
|
|
webpack(webPackConf([__dirname + '/tools/build/webpack/angular2-all.umd.js'], 'angular2-all',
|
|
'dev')),
|
|
webpack(webPackConf([__dirname + '/tools/build/webpack/angular2-all.umd.js'], 'angular2-all',
|
|
'prod')),
|
|
webpack(webPackConf([__dirname + '/tools/build/webpack/angular2-all-testing.umd.js'],
|
|
'angular2-all-testing', 'dev'))
|
|
]);
|
|
});
|
|
|
|
gulp.task('bundles.js.umd.min', ['!bundles.js.umd', '!bundle.ng.polyfills'], function() {
|
|
var rename = require('gulp-rename');
|
|
var uglify = require('gulp-uglify');
|
|
|
|
// minify production bundles
|
|
return gulp.src(['dist/js/bundle/angular2-polyfills.js', 'dist/js/bundle/angular2-all.umd.js'])
|
|
.pipe(uglify())
|
|
.pipe(rename({extname: '.min.js'}))
|
|
.pipe(gulp.dest('dist/js/bundle'));
|
|
});
|
|
|
|
gulp.task('!bundle.js.prod.deps', ['!bundle.js.prod'], function() {
|
|
var bundler = require('./tools/build/bundle');
|
|
|
|
return merge2(bundler.modify(['dist/build/angular2.js'], 'angular2.js'),
|
|
bundler.modify(['dist/build/http.js'], 'http.js'),
|
|
bundler.modify(['dist/build/router.js'], 'router.js'),
|
|
bundler.modify(['dist/build/alt_router.js'], 'alt_router.js'),
|
|
bundler.modify(['dist/build/upgrade.js'], 'upgrade.js'))
|
|
.pipe(gulp.dest('dist/js/bundle'));
|
|
});
|
|
|
|
gulp.task('!bundle.js.min.deps', ['!bundle.js.min'], function() {
|
|
var bundler = require('./tools/build/bundle');
|
|
var uglify = require('gulp-uglify');
|
|
|
|
return merge2(bundler.modify(['dist/build/angular2.min.js'], 'angular2.min.js'),
|
|
bundler.modify(['dist/build/http.min.js'], 'http.min.js'),
|
|
bundler.modify(['dist/build/router.min.js'], 'router.min.js'),
|
|
bundler.modify(['dist/build/alt_router.min.js'], 'alt_router.min.js'),
|
|
bundler.modify(['dist/build/upgrade.min.js'], 'upgrade.min.js'))
|
|
.pipe(uglify())
|
|
.pipe(gulp.dest('dist/js/bundle'));
|
|
});
|
|
|
|
gulp.task('!bundle.ng.polyfills', ['clean'],
|
|
function() { return addDevDependencies('angular2-polyfills.js'); });
|
|
|
|
var JS_DEV_DEPS = [
|
|
licenseWrap('node_modules/zone.js/LICENSE', true),
|
|
'node_modules/zone.js/dist/zone.js',
|
|
'node_modules/zone.js/dist/long-stack-trace-zone.js',
|
|
licenseWrap('node_modules/reflect-metadata/LICENSE', true),
|
|
'node_modules/reflect-metadata/Reflect.js'
|
|
];
|
|
|
|
|
|
function addDevDependencies(outputFile) {
|
|
var bundler = require('./tools/build/bundle');
|
|
var insert = require('gulp-insert');
|
|
|
|
return bundler.modify(JS_DEV_DEPS.concat(['dist/build/' + outputFile]), outputFile)
|
|
.pipe(gulp.dest('dist/js/bundle'));
|
|
}
|
|
|
|
gulp.task('!bundle.js.dev.deps', ['!bundle.js.dev'], function() {
|
|
var bundler = require('./tools/build/bundle');
|
|
|
|
return merge2(bundler.modify(['dist/build/angular2.dev.js'], 'angular2.dev.js'),
|
|
bundler.modify(['dist/build/http.dev.js'], 'http.dev.js'),
|
|
bundler.modify(['dist/build/router.dev.js'], 'router.dev.js'),
|
|
bundler.modify(['dist/build/alt_router.dev.js'], 'alt_router.dev.js'),
|
|
bundler.modify(['dist/build/upgrade.dev.js'], 'upgrade.dev.js'))
|
|
.pipe(gulp.dest('dist/js/bundle'));
|
|
});
|
|
|
|
gulp.task('!bundle.web_worker.js.dev.deps', ['!bundle.web_worker.js.dev'], function() {
|
|
var bundler = require('./tools/build/bundle');
|
|
return merge2(bundler.modify(['dist/build/web_worker/ui.dev.js'], "web_worker/ui.dev.js"),
|
|
bundler.modify(['dist/build/web_worker/worker.dev.js'], "web_worker/worker.dev.js"))
|
|
.pipe(gulp.dest('dist/js/bundle'));
|
|
});
|
|
|
|
gulp.task('!bundle.copy', function() {
|
|
return merge2(gulp.src('dist/js/bundle/**').pipe(gulp.dest('dist/js/prod/es5/bundle')),
|
|
gulp.src('dist/js/bundle/**').pipe(gulp.dest('dist/js/dev/es5/bundle')));
|
|
});
|
|
|
|
gulp.task('!bundles.js.checksize', function(done) {
|
|
var reportSize = require('./tools/analytics/reportsize');
|
|
return reportSize('dist/js/bundle/**/*.js', {printToConsole: ['gzip level=2']});
|
|
});
|
|
|
|
gulp.task('bundles.js',
|
|
[
|
|
'!bundle.js.prod.deps',
|
|
'!bundle.js.dev.deps',
|
|
'!bundle.js.min.deps',
|
|
'!bundle.web_worker.js.dev.deps',
|
|
'bundles.js.umd.min',
|
|
'!bundle.testing',
|
|
'!bundle.ng.polyfills',
|
|
'!bundles.js.docs'
|
|
],
|
|
function(done) { runSequence('!bundle.copy', '!bundles.js.checksize', done); });
|
|
|
|
gulp.task('build.js',
|
|
['build.js.dev', 'build.js.prod', 'build.js.cjs', 'bundles.js', 'benchpress.bundle']);
|
|
|
|
gulp.task('clean', [
|
|
'build/clean.tools',
|
|
'build/clean.js',
|
|
'build/clean.dart',
|
|
'build/clean.docs',
|
|
'build/clean.bundles'
|
|
]);
|
|
|
|
gulp.task('build', ['build.js', 'build.dart']);
|
|
|
|
// ------------
|
|
// transform codegen
|
|
gulp.task('lint_protos.dart', function(done) {
|
|
var proto = require('./tools/build/proto');
|
|
|
|
return proto.lint({dir: 'modules_dart/transform/lib/src/transform/common/model/'}, done);
|
|
});
|
|
|
|
gulp.task('gen_protos.dart', function(done) {
|
|
var proto = require('./tools/build/proto');
|
|
|
|
return proto.generate(
|
|
{
|
|
dir: 'modules_dart/transform/lib/src/transform/common/model/',
|
|
plugin: 'tools/build/protoc-gen-dart'
|
|
},
|
|
done);
|
|
});
|
|
|
|
// ------------
|
|
|
|
gulp.task('cleanup.builder', function() { return angularBuilder.cleanup(); });
|
|
|
|
gulp.task('benchpress.bundle', ['build/clean.bundles.benchpress', 'build.js.cjs'], function(cb) {
|
|
var bundler = require('./tools/build/bundle');
|
|
|
|
bundler.benchpressBundle(BENCHPRESS_BUNDLE_CONFIG.entries, BENCHPRESS_BUNDLE_CONFIG.packageJson,
|
|
BENCHPRESS_BUNDLE_CONFIG.includes, BENCHPRESS_BUNDLE_CONFIG.excludes,
|
|
BENCHPRESS_BUNDLE_CONFIG.ignore, BENCHPRESS_BUNDLE_CONFIG.dest, cb);
|
|
});
|
|
|
|
|
|
// register cleanup listener for ctrl+c/kill used to quit any persistent task (autotest or serve
|
|
// tasks)
|
|
process.on('SIGINT', function() {
|
|
if (!angularBuilder.uninitialized) {
|
|
runSequence('cleanup.builder', function() { process.exit(); });
|
|
} else {
|
|
process.exit();
|
|
}
|
|
});
|
|
|
|
|
|
// register cleanup listener for all non-persistent tasks
|
|
var beforeExitRan = false;
|
|
|
|
process.on('beforeExit', function() {
|
|
if (beforeExitRan) return;
|
|
|
|
beforeExitRan = true;
|
|
|
|
if (!angularBuilder.uninitialized) {
|
|
gulp.start('cleanup.builder');
|
|
}
|
|
});
|
|
|
|
|
|
var firstTask = true;
|
|
|
|
|
|
|
|
gulp.on('task_start', (e) => {
|
|
if (firstTask) {
|
|
firstTask = false;
|
|
analytics.buildSuccess('gulp <startup>', process.uptime() * 1000);
|
|
}
|
|
|
|
analytics.buildStart('gulp ' + e.task);
|
|
});
|
|
gulp.on('task_stop', (e) => { analytics.buildSuccess('gulp ' + e.task, e.duration * 1000); });
|
|
gulp.on('task_err', (e) => { analytics.buildError('gulp ' + e.task, e.duration * 1000); });
|