silverstripe-framework/gulpfile.js

248 lines
8.3 KiB
JavaScript

var gulp = require('gulp'),
babel = require('gulp-babel'),
diff = require('gulp-diff'),
notify = require('gulp-notify'),
uglify = require('gulp-uglify');
gulpUtil = require('gulp-util'),
browserify = require('browserify'),
babelify = require('babelify'),
watchify = require('watchify'),
source = require('vinyl-source-stream'),
buffer = require('vinyl-buffer'),
path = require('path'),
glob = require('glob'),
eventStream = require('event-stream'),
semver = require('semver'),
packageJson = require('./package.json');
var PATHS = {
MODULES: './node_modules',
ADMIN_THIRDPARTY: './admin/thirdparty',
ADMIN_JAVASCRIPT_SRC: './admin/javascript/src',
ADMIN_JAVASCRIPT_DIST: './admin/javascript/dist',
FRAMEWORK_THIRDPARTY: './thirdparty',
FRAMEWORK_JAVASCRIPT_SRC: './javascript/src',
FRAMEWORK_JAVASCRIPT_DIST: './javascript/dist'
};
var browserifyOptions = {
cache: {},
packageCache: {},
poll: true,
plugin: [watchify]
};
var blueimpFileUploadConfig = {
src: PATHS.MODULES + '/blueimp-file-upload',
dest: PATHS.FRAMEWORK_THIRDPARTY + '/jquery-fileupload',
files: [
'/cors/jquery.postmessage-transport.js',
'/cors/jquery.xdr-transport.js',
'/jquery.fileupload-ui.js',
'/jquery.fileupload.js',
'/jquery.iframe-transport.js'
]
};
var blueimpLoadImageConfig = {
src: PATHS.MODULES + '/blueimp-load-image',
dest: PATHS.FRAMEWORK_THIRDPARTY + '/javascript-loadimage',
files: ['/load-image.js']
};
var blueimpTmplConfig = {
src: PATHS.MODULES + '/blueimp-tmpl',
dest: PATHS.FRAMEWORK_THIRDPARTY + '/javascript-templates',
files: ['/tmpl.js']
};
var jquerySizesConfig = {
src: PATHS.MODULES + '/jquery-sizes',
dest: PATHS.ADMIN_THIRDPARTY + '/jsizes',
files: ['/lib/jquery.sizes.js']
};
/**
* Copies files from a source directory to a destination directory.
*
* @param object libConfig
* @param string libConfig.src - The source directory
* @param string libConfig.dest - The destination directory
* @param array libConfig.files - The list of files to copy from the source to the destination directory
*/
function copyFiles(libConfig) {
libConfig.files.forEach(function (file) {
var dir = path.parse(file).dir;
gulp.src(libConfig.src + file)
.pipe(gulp.dest(libConfig.dest + dir));
});
}
/**
* Diffs files in a source directory against a destination directory.
*
* @param object libConfig
* @param string libConfig.src - The source directory
* @param string libConfig.dest - The destination directory
* @param array libConfig.files - The list of files to copy from the source to the destination directory
*/
function diffFiles(libConfig) {
libConfig.files.forEach(function (file) {
var dir = path.parse(file).dir;
gulp.src(libConfig.src + file)
.pipe(diff(libConfig.dest + dir))
.pipe(diff.reporter({ fail: true, quiet: true }))
.on('error', function (error) {
console.error(new Error('Sanity check failed. \'' + libConfig.dest + file + '\' has been modified.'));
process.exit(1);
});
});
}
/**
* Transforms the passed JavaScript files to UMD modules.
*
* @param array files - The files to transform.
* @param string dest - The output directory.
* @return object
*/
function transformToUmd(files, dest) {
return eventStream.merge(files.map(function (file) {
return gulp.src(file)
.pipe(babel({
presets: ['es2015'],
moduleId: 'ss.' + path.parse(file).name,
plugins: ['transform-es2015-modules-umd']
}))
.on('error', notify.onError({
message: 'Error: <%= error.message %>',
}))
.pipe(gulp.dest(dest));
}));
}
// Make sure the version of Node being used is valid.
if (!semver.satisfies(process.versions.node, packageJson.engines.node)) {
console.error('Invalid Node.js version. You need to be using ' + packageJson.engines.node + '. If you want to manage multiple Node.js versions try https://github.com/creationix/nvm');
process.exit(1);
}
if (process.env.npm_config_development) {
browserifyOptions.debug = true;
}
gulp.task('build', ['umd', 'umd-watch', 'bundle']);
gulp.task('bundle', ['bundle-lib', 'bundle-leftandmain', 'bundle-react']);
gulp.task('bundle-leftandmain', function bundleLeftAndMain() {
var stream = browserify(Object.assign({}, browserifyOptions, {
entries: PATHS.ADMIN_JAVASCRIPT_SRC + '/bundles/leftandmain.js'
}))
.transform(babelify.configure({
presets: ['es2015'],
ignore: /(thirdparty)/
}))
.on('log', function (msg) { gulpUtil.log('Finished bundle-leftandmain.js ' + msg); })
.on('update', bundleLeftAndMain)
.external('jQuery')
.external('i18n')
.bundle()
.on('error', notify.onError({
message: 'Error: <%= error.message %>',
}))
.pipe(source('bundle-leftandmain.js'))
.pipe(buffer());
if (typeof process.env.npm_config_development === 'undefined') {
stream.pipe(uglify());
}
return stream.pipe(gulp.dest(PATHS.ADMIN_JAVASCRIPT_DIST));
});
gulp.task('bundle-lib', function bundleLib() {
var stream = browserify(Object.assign({}, browserifyOptions, {
entries: PATHS.ADMIN_JAVASCRIPT_SRC + '/bundles/lib.js'
}))
.transform(babelify.configure({
presets: ['es2015'],
ignore: /(thirdparty)/
}))
.on('log', function (msg) { gulpUtil.log('Finished bundle-lib.js ' + msg); })
.on('update', bundleLib)
.require(PATHS.FRAMEWORK_JAVASCRIPT_SRC + '/jQuery.js', { expose: 'jQuery' })
.require(PATHS.FRAMEWORK_JAVASCRIPT_SRC + '/i18n.js', { expose: 'i18n' })
.bundle()
.on('error', notify.onError({
message: 'Error: <%= error.message %>',
}))
.pipe(source('bundle-lib.js'))
.pipe(buffer());
if (typeof process.env.npm_config_development === 'undefined') {
stream.pipe(uglify());
}
return stream.pipe(gulp.dest(PATHS.ADMIN_JAVASCRIPT_DIST));
});
gulp.task('bundle-react', function bundleReact() {
var stream = browserify(Object.assign({}, browserifyOptions))
.on('log', function (msg) { gulpUtil.log('Finished bundle-react.js ' + msg); })
.on('update', bundleReact)
.require('react-addons-test-utils', { expose: 'react-addons-test-utils' })
.require('react', { expose: 'react' })
.require('react-dom', { expose: 'react-dom' })
.require('redux', { expose: 'redux' })
.require('react-redux', { expose: 'react-redux' })
.require('redux-thunk', { expose: 'redux-thunk' })
.require('isomorphic-fetch', { expose: 'isomorphic-fetch' })
.require(PATHS.ADMIN_JAVASCRIPT_DIST + '/SilverStripeComponent', { expose: 'silverstripe-component' })
.bundle()
.on('error', notify.onError({
message: 'Error: <%= error.message %>',
}))
.pipe(source('bundle-react.js'))
.pipe(buffer());
if (typeof process.env.npm_config_development === 'undefined') {
stream.pipe(uglify());
}
return stream.pipe(gulp.dest(PATHS.ADMIN_JAVASCRIPT_DIST));
});
gulp.task('sanity', function () {
diffFiles(blueimpFileUploadConfig);
diffFiles(blueimpLoadImageConfig);
diffFiles(blueimpTmplConfig);
diffFiles(jquerySizesConfig);
});
gulp.task('thirdparty', function () {
copyFiles(blueimpFileUploadConfig);
copyFiles(blueimpLoadImageConfig);
copyFiles(blueimpTmplConfig);
copyFiles(jquerySizesConfig);
});
gulp.task('umd', ['umd-admin', 'umd-framework']);
gulp.task('umd-admin', function () {
var files = glob.sync(PATHS.ADMIN_JAVASCRIPT_SRC + '/*.js', { ignore: PATHS.ADMIN_JAVASCRIPT_SRC + '/LeftAndMain.!(Ping).js' });
return transformToUmd(files, PATHS.ADMIN_JAVASCRIPT_DIST);
});
gulp.task('umd-framework', function () {
return transformToUmd(glob.sync(PATHS.FRAMEWORK_JAVASCRIPT_SRC + '/*.js'), PATHS.FRAMEWORK_JAVASCRIPT_DIST);
});
gulp.task('umd-watch', function () {
gulp.watch(PATHS.ADMIN_JAVASCRIPT_SRC + '/*.js', ['umd-admin']);
gulp.watch(PATHS.FRAMEWORK_JAVASCRIPT_SRC + '/*.js', ['umd-framework']);
});