Stackedit/Gulpfile.js

363 lines
8.2 KiB
JavaScript
Raw Normal View History

2014-08-31 19:51:13 +00:00
/* jshint -W015 */
var gulp = require('gulp');
var util = require('gulp-util');
var clean = require('gulp-clean');
var jshint = require('gulp-jshint');
var requirejs = require('gulp-requirejs');
var bowerRequirejs = require('bower-requirejs');
var uglify = require('gulp-uglify');
var less = require('gulp-less');
var inject = require('gulp-inject');
var replace = require('gulp-replace');
var bump = require('gulp-bump');
2014-09-02 22:19:42 +00:00
var childProcess = require('child_process');
2014-08-31 19:51:13 +00:00
var runSequence = require('run-sequence');
2014-09-01 21:27:15 +00:00
var es = require('event-stream');
2014-08-31 19:51:13 +00:00
var fs = require('fs');
2014-09-01 21:27:15 +00:00
var knox = require('knox');
var zlib = require('zlib');
var mime = require('mime');
var async = require("async");
2014-08-31 19:51:13 +00:00
/** __________________________________________
* constants.js
*/
function getVersion() {
var packageJson = JSON.parse(fs.readFileSync(__dirname + '/package.json', {
encoding: 'utf8'
}));
return packageJson.version;
}
gulp.task('constants', function() {
return gulp.src('./public/res/constants.js')
.pipe(replace(/constants\.VERSION = .*/, 'constants.VERSION = "' + getVersion() + '";'))
.pipe(gulp.dest('./public/res/'));
});
/** __________________________________________
* JSHint
*/
gulp.task('jshint', function() {
return gulp.src([
'./**/*.js',
'!./node_modules/**/*.js',
'!./public/libs/**/*.js',
'!./public/res/libs/**/*.js',
'!./public/res/bower-libs/**/*.js',
'!./public/res-min/**/*.js'
])
.pipe(jshint())
.pipe(jshint.reporter('default'))
.pipe(jshint.reporter('fail'));
});
/** __________________________________________
* RequireJS
*/
gulp.task('clean-requirejs', function() {
return gulp.src([
'./public/res-min/main.js',
'./public/res-min/require.js'
])
.pipe(clean());
});
gulp.task('copy-requirejs', ['clean-requirejs'], function() {
return gulp.src('./public/res/bower-libs/requirejs/require.js')
.pipe(gulp.dest('./public/res-min/'));
});
gulp.task('requirejs', [
'copy-requirejs',
'constants'
], function() {
return requirejs({
baseUrl: 'public/res',
name: 'main',
out: 'main.js',
mainConfigFile: 'public/res/main.js',
optimize: 'uglify2',
inlineText: true,
2014-09-01 21:27:15 +00:00
paths: {
mathjax: 'empty:'
},
2014-08-31 19:51:13 +00:00
excludeShallow: [
'css/css-builder',
'less/lessc-server',
'less/lessc'
]
})
.pipe(uglify({
output: {
beautify: true,
indent_level: 1
}
}))
.pipe(gulp.dest('./public/res-min/'));
});
2014-09-01 21:27:15 +00:00
gulp.task('bower-requirejs', function(cb) {
bowerRequirejs({
config: './public/res/main.js'
}, function() {
cb();
});
});
2014-08-31 19:51:13 +00:00
/** __________________________________________
* Less
*/
gulp.task('clean-less', function() {
return gulp.src('./public/res-min/themes')
.pipe(clean());
});
gulp.task('less', ['clean-less'], function() {
return gulp.src([
'./public/res/styles/base.less',
'./public/res/themes/*.less'
])
.pipe(less({
compress: true
}))
.pipe(gulp.dest('./public/res-min/themes/'));
});
/** __________________________________________
* Fonts
*/
gulp.task('clean-font', function() {
return gulp.src('./public/res-min/font')
.pipe(clean());
});
gulp.task('copy-font', ['clean-font'], function() {
return gulp.src('./public/res/font/*')
.pipe(gulp.dest('./public/res-min/font/'));
});
/** __________________________________________
* Images
*/
gulp.task('clean-img', function() {
return gulp.src('./public/res-min/img')
.pipe(clean());
});
gulp.task('copy-img', ['clean-img'], function() {
return gulp.src('./public/res/img/*')
.pipe(gulp.dest('./public/res-min/img/'));
});
/** __________________________________________
* cache.manifest
*/
function makeCacheManifest(dest, cdn) {
cdn = cdn || '';
return gulp.src('./public/cache.manifest')
.pipe(replace(/(#Date ).*/, '$1' + Date()))
2014-09-01 21:27:15 +00:00
.pipe(inject(gulp.src('./res-min/**/*.*', {
2014-08-31 19:51:13 +00:00
read: false,
cwd: './public'
}),
{
starttag: '# start_inject_resources',
endtag: '# end_inject_resources',
ignoreExtensions: true,
transform: function(filepath) {
2014-09-01 21:27:15 +00:00
return cdn + filepath.substring(1);
}
}))
.pipe(inject(gulp.src([
'./MathJax.js',
'./config/Safe.js',
'./config/TeX-AMS_HTML.js',
'./images/CloseX-31.png',
'./images/MenuArrow-15.png',
'./jax/output/HTML-CSS/jax.js',
'./extensions/**/*.*',
'./fonts/HTML-CSS/TeX/woff/**/*.*',
'./jax/element/**/*.*',
'./jax/output/HTML-CSS/autoload/**/*.*',
'./jax/output/HTML-CSS/fonts/TeX/**/*.*',
'./jax/output/HTML-CSS/fonts/STIX/**/*.*'
], {
read: false,
cwd: './public/res/bower-libs/MathJax'
}),
{
starttag: '# start_inject_mathjax',
endtag: '# end_inject_mathjax',
ignoreExtensions: true,
transform: function(filepath) {
if(filepath == '/MathJax.js') {
2014-08-31 19:51:13 +00:00
filepath += '?config=TeX-AMS_HTML';
}
2014-09-01 21:27:15 +00:00
else {
filepath += '?rev=2.4-beta-2';
}
return '//cdn.mathjax.org/mathjax/2.4-latest' + filepath;
2014-08-31 19:51:13 +00:00
}
}))
.pipe(gulp.dest(dest));
}
gulp.task('cache-manifest', function() {
return makeCacheManifest('./public/');
});
gulp.task('cache-manifest-stackedit-io', function() {
2014-09-02 22:19:42 +00:00
return makeCacheManifest('./public-stackedit.io/', '//stackedit.s3.amazonaws.com/' + getVersion() + '/');
2014-08-31 19:51:13 +00:00
});
gulp.task('clean', [
'clean-requirejs',
'clean-less',
'clean-font',
'clean-img'
]);
2014-08-31 20:35:18 +00:00
gulp.task('default', function(cb) {
runSequence([
2014-08-31 19:51:13 +00:00
'jshint',
'requirejs',
'less',
'copy-font',
'copy-img'
],
2014-08-31 20:35:18 +00:00
'cache-manifest',
2014-09-01 22:37:46 +00:00
'cache-manifest-stackedit-io',
2014-08-31 20:35:18 +00:00
cb);
2014-08-31 19:51:13 +00:00
});
function bumpTask(importance) {
return function() {
return gulp.src([
'./package.json',
'./bower.json'
])
.pipe(bump({type: importance}))
.pipe(gulp.dest('./'));
};
}
gulp.task('bump-patch', bumpTask('patch'));
gulp.task('bump-minor', bumpTask('minor'));
gulp.task('bump-major', bumpTask('major'));
2014-09-02 22:19:42 +00:00
function exec(cmd, cb) {
childProcess.exec(cmd, {cwd: process.cwd()}, function(err, stdout, stderr) {
if(!err) {
util.log(stdout, stderr);
}
cb(err);
});
}
2014-08-31 19:51:13 +00:00
2014-09-02 22:19:42 +00:00
gulp.task('git-tag', function(cb) {
var tag = 'v' + getVersion();
2014-08-31 19:51:13 +00:00
util.log('Tagging as: ' + util.colors.cyan(tag));
2014-09-02 22:19:42 +00:00
exec('git add ./public/res-min', function(err) {
if(err) {
return cb(err);
}
exec('git commit -a -m "Prepare release"', function(err) {
if(err) {
return cb(err);
}
exec('git tag -a ' + tag + ' -m "Version ' + getVersion() + '"', function(err) {
if(err) {
return cb(err);
}
exec('git push origin master --tags', cb);
});
});
});
2014-08-31 19:51:13 +00:00
});
function releaseTask(importance) {
2014-08-31 20:35:18 +00:00
return function(cb) {
runSequence(
2014-08-31 19:51:13 +00:00
'bump-' + importance,
'default',
2014-08-31 20:05:34 +00:00
'git-tag',
2014-08-31 20:35:18 +00:00
cb);
2014-08-31 19:51:13 +00:00
};
}
2014-08-31 20:35:18 +00:00
gulp.task('patch', releaseTask('patch'));
gulp.task('minor', releaseTask('minor'));
2014-09-01 21:27:15 +00:00
gulp.task('major', releaseTask('major'));
gulp.task('deploy-cdn', function() {
var s3Client = knox.createClient({
key: process.env.STACKEDIT_AWS_ACCESS_KEY_ID,
secret: process.env.STACKEDIT_AWS_SECRET_KEY,
2014-09-02 22:19:42 +00:00
bucket: 'stackedit'
2014-09-01 21:27:15 +00:00
});
var zippedFormat = {
'text/plain': true,
'text/html': true,
'text/css': true,
'text/cache-manifest': true,
'application/javascript': true,
'image/svg+xml': true
};
2014-09-02 22:19:42 +00:00
2014-09-01 21:27:15 +00:00
function upload(file, cb) {
var headers = {
'x-amz-acl': 'public-read',
'Content-Length': file.contents.length,
'Content-Type': file.contentType,
'Cache-Control': 'max-age=' + file.maxAge
};
file.contentEncoding && (headers['Content-Encoding'] = file.contentEncoding);
s3Client.putBuffer(file.contents, file.dest + file.relative, headers, cb);
}
2014-09-02 22:19:42 +00:00
2014-09-01 21:27:15 +00:00
var queue = async.queue(upload, 16).push;
var version = getVersion();
return gulp.src([
'./**/*',
2014-09-02 22:19:42 +00:00
'!./res/**/*'
2014-09-01 21:27:15 +00:00
], {
cwd: './public',
buffer: false
})
.pipe(es.map(function(file, cb) {
if(!file.contents) {
return cb(null, file);
}
file.contentType = mime.lookup(file.path);
var stream = file.contents;
if(zippedFormat.hasOwnProperty(file.contentType)) {
var gzip = zlib.createGzip();
stream = stream.pipe(gzip);
file.contentEncoding = 'gzip';
}
var bufs = [];
stream.on('data', function(d) {
bufs.push(d);
});
stream.on('error', function(err) {
cb(err);
});
stream.on('end', function() {
file.contents = Buffer.concat(bufs);
file.dest = 'latest/';
file.maxAge = 86400;
queue(file, function(err) {
file.dest = version + '/';
file.maxAge = 31536000;
err ? cb(err) : queue(file, cb);
});
});
}));
});