mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
248 lines
8.3 KiB
JavaScript
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']);
|
|
});
|