angular-docs-cn/gulpfile.js
Tobias Bosch c79f0c3472 refactor: simplify and make tests work in JS and Dart
* remove `wraps` syntax enhancements for imports
  and support new `import * as module from ...` syntax

  - default imports are the wrong construct for importing
    everything from a module

* moved tests from transpiler to jasmine and karma

  - transpiler tests are included when running karma in main project folder
  - transpiler is reloaded after every test run in karma,
    so no need to restart karma when the transpiler has been changed.
  - removed own gulp build for transpiler and `postinstall.sh`
    as they are no more needed.
  - transpiler tests are now executed in Dart AND JavaScript (used to be executed
    only in Dart), which allowed to catch some bugs (see the bug with the
    import specification above).

* made tests work in dart as well by using the following hack:

  - dependencies are loaded from the `build` folder, which makes
    running `gulp build` necessary before running karma for dart
  - for this to work,
    the dependencies are included in main `pubspec.yaml` of project
  - reason for the hack: `karma-dart` loads all `packages` urls
    directly from disc (should rather use the karma file list)

* added explicit annotations `FIELD`, `ABSTRACT`, ... to `facade/lang.*`

  - needed for now that we can run tests and don't get errors for undefined
    annotations.

* added `README.md` with details about the build and tests
2014-09-28 21:50:38 -07:00

160 lines
4.3 KiB
JavaScript

var gulp = require('gulp');
var rename = require('gulp-rename');
var watch = require('gulp-watch');
var shell = require('gulp-shell');
var mergeStreams = require('event-stream').merge;
var connect = require('gulp-connect');
var clean = require('gulp-rimraf');
var runSequence = require('run-sequence');
var glob = require('glob');
var ejs = require('gulp-ejs');
var path = require('path');
var through2 = require('through2');
var file2moduleName = require('./file2modulename');
var js2es5Options = {
annotations: true, // parse annotations
types: true, // parse types
script: false, // parse as a module
modules: 'register',
typeAssertionModule: 'rtts_assert/rtts_assert',
typeAssertions: true
};
var js2dartOptions = {
annotations: true, // parse annotations
types: true, // parse types
script: false, // parse as a module
outputLanguage: 'dart'
};
var gulpTraceur = require('./tools/transpiler/gulp-traceur');
// ---------
// traceur runtime
gulp.task('jsRuntime/build', function() {
var traceurRuntime = gulp.src(gulpTraceur.RUNTIME_PATH)
.pipe(gulp.dest('build/js'));
return traceurRuntime;
});
// -----------------------
// modules
var sourceTypeConfigs = {
dart: {
compilerOptions: js2dartOptions,
transpileSrc: ['modules/**/*.js'],
htmlSrc: ['modules/*/src/**/*.html'],
copySrc: ['modules/**/*.dart', 'modules/**/*.yaml'],
outputDir: 'build/dart',
outputExt: 'dart',
mimeType: 'application/dart',
postProcess: function(file, done) {
if (file.path.match(/pubspec\.yaml/)) {
console.log(file.path);
shell.task(['pub get'], {
cwd: path.dirname(file.path)
})().on('end', done);
} else {
done();
}
}
},
js: {
compilerOptions: js2es5Options,
transpileSrc: ['modules/**/*.js', 'modules/**/*.es6'],
htmlSrc: ['modules/*/src/**/*.html'],
copySrc: ['modules/**/*.es5'],
outputDir: 'build/js',
outputExt: 'js',
postProcess: function() {
}
}
};
gulp.task('modules/clean', function() {
return gulp.src('build', {read: false})
.pipe(clean());
});
gulp.task('modules/build.dart/src', function() {
return createModuleTask(sourceTypeConfigs.dart);
});
gulp.task('modules/build.dart/analyzer', function() {
var baseDir = sourceTypeConfigs.dart.outputDir;
var files = [].slice.call(glob.sync('*/lib/*.dart', {
cwd: baseDir
}));
files = files.filter(function(fileName) {
return fileName.match(/(\w+)\/lib\/\1/);
});
var commands = files.map(function(fileName) {
return 'dartanalyzer '+baseDir+'/'+fileName
});
return shell.task(commands)();
});
gulp.task('modules/build.dart', function(done) {
runSequence('modules/build.dart/src', 'modules/build.dart/analyzer', done);
});
gulp.task('modules/build.js', function() {
return createModuleTask(sourceTypeConfigs.js);
});
function renameSrcToLib(file) {
file.dirname = file.dirname.replace(/\bsrc\b/, 'lib');
}
function createModuleTask(sourceTypeConfig) {
var transpile = gulp.src(sourceTypeConfig.transpileSrc)
.pipe(rename({extname: '.'+sourceTypeConfig.outputExt}))
.pipe(rename(renameSrcToLib))
.pipe(gulpTraceur(sourceTypeConfig.compilerOptions, file2moduleName))
.pipe(gulp.dest(sourceTypeConfig.outputDir));
var copy = gulp.src(sourceTypeConfig.copySrc)
.pipe(rename(renameSrcToLib))
.pipe(gulp.dest(sourceTypeConfig.outputDir));
// TODO: provide the list of files to the template
// automatically!
var html = gulp.src(sourceTypeConfig.htmlSrc)
.pipe(rename(renameSrcToLib))
.pipe(ejs({
type: sourceTypeConfig.outputExt
}))
.pipe(gulp.dest(sourceTypeConfig.outputDir));
var s = mergeStreams(transpile, copy, html);
return s.pipe(through2.obj(function(file, enc, done) {
sourceTypeConfig.postProcess(file, done);
}));
}
// ------------------
// WEB SERVER
gulp.task('serve', connect.server({
root: [__dirname+'/build'],
port: 8000,
livereload: false,
open: false,
middleware: function() {
return [function(req, resp, next){
if (req.url.match(/\.dart$/)) {
resp.setHeader("Content-Type", "application/dart");
}
next();
}];
}
}));
// --------------
// general targets
gulp.task('clean', ['modules/clean']);
gulp.task('build', ['jsRuntime/build', 'modules/build.dart', 'modules/build.js']);