snakeskin
Version:
Компилятор блочных шаблонов c поддержкой наследования.
157 lines (126 loc) • 4.22 kB
JavaScript
// https://github.com/termi/es6-transpiler/issues/66
String.prototype.contains = String.prototype.contains || function (str, opt_pos) {
return String.prototype.indexOf.apply(this, arguments) !== -1;
};
var gulp = require('gulp'),
path = require('path');
var es6 = require('gulp-es6-transpiler'),
monic = require('gulp-monic'),
gcc = require('gulp-closure-compiler'),
rename = require('gulp-rename'),
header = require('gulp-header'),
replace = require('gulp-replace'),
bump = require('gulp-bump'),
istanbul = require('gulp-istanbul'),
jasmine = require('gulp-jasmine');
function getVersion() {
delete require.cache[require.resolve('./lib/core')];
return require('./lib/core').VERSION.join('.');
}
function getBuilds() {
delete require.cache[require.resolve('./builds')];
return Object(require('./builds'));
}
gulp.task('build', function (callback) {
var builds = getBuilds(),
i = 0;
for (var key in builds) {
if (!builds.hasOwnProperty(key)) {
continue;
}
i++;
var fullHead =
'/*!\n' +
' * Snakeskin v' + getVersion() + (key !== 'snakeskin' ? ' (' + key.replace(/^snakeskin\./, '') + ')' : '') + '\n' +
' * https://github.com/kobezzza/Snakeskin\n' +
' *\n' +
' * Released under the MIT license\n' +
' * https://github.com/kobezzza/Snakeskin/blob/master/LICENSE\n' +
' *\n' +
' * Date: ' + new Date().toUTCString() + '\n' +
' */\n\n';
gulp.src('./lib/core.js')
.pipe(monic({flags: builds[key]}))
.pipe(es6({
disallowUnknownReferences: false,
disallowDuplicated: false
}))
.pipe(replace(/\/\/\/\/#include/g, '//#include'))
.pipe(monic())
// https://github.com/termi/es6-transpiler/issues/61
.pipe(replace(/(for\s*\(\s*var\s+[^=]+)= void 0 in/g, '$1 in'))
// Фикс @param {foo} [bar=1] -> @param {foo} [bar]
.pipe(replace(/(@param {.*?[^=]}) \[(\w+)=.*?[^\]]]/g, '$1 $2'))
// {...string} -> {...(string|Array)}
.pipe(replace(/{\.\.\.\(?([^}]+)\)?}/g, '{...($1|Array)}'))
// *//*, foo *//* -> , foo
.pipe(replace(/\/\*, (\w+) \*\//g, ', $1'))
// *//*= foo *//* -> foo
.pipe(replace(/\/\*= (\w+) \*\//g, '$1'))
// //= foo -> foo
.pipe(replace(/\/\/= (.*)/g, '$1'))
// Пробельные символы в строках-шаблонах
.pipe(replace(/\/\* cbws \*\/.*?[(]+"[\s\S]*?[^\\"]"[)]+;?(?:$|[}]+$)/gm, function (sstr) {
return sstr.replace(/\\n|\t/g, '');
}))
.pipe(header(fullHead))
.pipe(rename(key + '.js'))
.pipe(gulp.dest('./dist/'))
.on('end', function () {
i--;
if (!i) {
callback();
}
});
}
});
gulp.task('test', ['build'], function (callback) {
gulp.src('./dist/snakeskin.js')
.pipe(istanbul())
.on('finish', function () {
gulp.src(['./test/test.dev.js'])
.pipe(jasmine())
.pipe(istanbul.writeReports())
.on('end', callback);
});
});
function compile(dev) {
return function () {
var builds = getBuilds();
for (var key in builds) {
if (!builds.hasOwnProperty(key)) {
continue;
}
var params = {
compilerPath: 'bower_components/closure-compiler/compiler.jar',
fileName: key + '.min.js',
compilerFlags: {
compilation_level: 'ADVANCED_OPTIMIZATIONS',
use_types_for_optimization: null,
language_in: 'ECMASCRIPT5',
externs: [
'predefs.js'
]
}
};
if (dev) {
params.compilerFlags.jscomp_warning = 'invalidCasts';
}
gulp.src(path.join('./dist/', key + '.js'))
.pipe(gcc(params))
.pipe(header('/*! Snakeskin v' + getVersion() + (key !== 'snakeskin' ? ' (' + key.replace(/^snakeskin\./, '') + ')' : '') + ' | https://github.com/kobezzza/Snakeskin/blob/master/LICENSE */\n'))
.pipe(gulp.dest('./dist/'));
}
}
}
gulp.task('compile', ['test'], compile());
gulp.task('compile-dev', ['test'], compile(true));
gulp.task('bump', function () {
gulp.src('./*.json')
.pipe(bump({version: getVersion()}))
.pipe(gulp.dest('./'));
});
gulp.task('watch', function () {
gulp.watch('./lib/*.js', ['build', 'bump']);
});
gulp.task('default', ['compile', 'bump']);