2016-01-06 04:06:47 +01:00
var gulp = require ( 'gulp' ) ,
2016-01-11 02:25:30 +01:00
babel = require ( 'gulp-babel' ) ,
2016-01-06 04:06:47 +01:00
diff = require ( 'gulp-diff' ) ,
2016-01-11 02:25:30 +01:00
notify = require ( 'gulp-notify' ) ,
2016-02-03 02:32:45 +01:00
postcss = require ( 'gulp-postcss' ) ,
2016-02-10 23:13:32 +01:00
sass = require ( 'gulp-sass' ) ,
2016-02-03 02:32:45 +01:00
uglify = require ( 'gulp-uglify' ) ,
2016-01-11 02:25:30 +01:00
gulpUtil = require ( 'gulp-util' ) ,
2016-02-03 02:32:45 +01:00
autoprefixer = require ( 'autoprefixer' ) ,
2016-01-11 02:25:30 +01:00
browserify = require ( 'browserify' ) ,
babelify = require ( 'babelify' ) ,
watchify = require ( 'watchify' ) ,
source = require ( 'vinyl-source-stream' ) ,
buffer = require ( 'vinyl-buffer' ) ,
2016-01-06 04:06:47 +01:00
path = require ( 'path' ) ,
2016-01-11 02:25:30 +01:00
glob = require ( 'glob' ) ,
eventStream = require ( 'event-stream' ) ,
2016-01-06 04:06:47 +01:00
semver = require ( 'semver' ) ,
2016-02-10 23:13:32 +01:00
packageJson = require ( './package.json' ) ,
sprity = require ( 'sprity' ) ,
gulpif = require ( 'gulp-if' ) ,
sourcemaps = require ( 'gulp-sourcemaps' ) ;
2016-03-21 01:51:33 +01:00
2016-02-10 23:13:32 +01:00
var isDev = typeof process . env . npm _config _development !== 'undefined' ;
2016-01-06 04:06:47 +01:00
2016-01-11 02:25:30 +01:00
var PATHS = {
MODULES : './node_modules' ,
2016-02-10 23:13:32 +01:00
ADMIN : './admin' ,
ADMIN _IMAGES : './admin/images' ,
2016-02-03 02:32:45 +01:00
ADMIN _SCSS : './admin/scss' ,
2016-01-11 02:25:30 +01:00
ADMIN _THIRDPARTY : './admin/thirdparty' ,
ADMIN _JAVASCRIPT _SRC : './admin/javascript/src' ,
ADMIN _JAVASCRIPT _DIST : './admin/javascript/dist' ,
2016-02-03 02:32:45 +01:00
FRAMEWORK : '.' ,
2016-01-11 02:25:30 +01:00
FRAMEWORK _THIRDPARTY : './thirdparty' ,
2016-02-10 23:13:32 +01:00
FRAMEWORK _DEV _INSTALL : './dev/install' ,
2016-01-11 02:25:30 +01:00
FRAMEWORK _JAVASCRIPT _SRC : './javascript/src' ,
FRAMEWORK _JAVASCRIPT _DIST : './javascript/dist'
} ;
2016-02-10 23:13:32 +01:00
// Folders which contain both scss and css folders to be compiled
var rootCompileFolders = [ PATHS . FRAMEWORK , PATHS . ADMIN , PATHS . FRAMEWORK _DEV _INSTALL ]
2016-01-11 02:25:30 +01:00
var browserifyOptions = {
cache : { } ,
packageCache : { } ,
poll : true ,
plugin : [ watchify ]
2016-01-06 04:06:47 +01:00
} ;
2016-02-03 02:32:45 +01:00
// Used for autoprefixing css properties (same as Bootstrap Aplha.2 defaults)
var supportedBrowsers = [
'Chrome >= 35' ,
'Firefox >= 31' ,
'Edge >= 12' ,
'Explorer >= 9' ,
'iOS >= 8' ,
'Safari >= 8' ,
'Android 2.3' ,
'Android >= 4' ,
'Opera >= 12'
] ;
2016-01-06 04:06:47 +01:00
var blueimpFileUploadConfig = {
2016-01-11 02:25:30 +01:00
src : PATHS . MODULES + '/blueimp-file-upload' ,
dest : PATHS . FRAMEWORK _THIRDPARTY + '/jquery-fileupload' ,
2016-01-06 04:06:47 +01:00
files : [
2016-01-11 02:25:30 +01:00
'/cors/jquery.postmessage-transport.js' ,
'/cors/jquery.xdr-transport.js' ,
'/jquery.fileupload-ui.js' ,
'/jquery.fileupload.js' ,
'/jquery.iframe-transport.js'
2016-01-06 04:06:47 +01:00
]
} ;
var blueimpLoadImageConfig = {
2016-01-11 02:25:30 +01:00
src : PATHS . MODULES + '/blueimp-load-image' ,
dest : PATHS . FRAMEWORK _THIRDPARTY + '/javascript-loadimage' ,
files : [ '/load-image.js' ]
2016-01-06 04:06:47 +01:00
} ;
var blueimpTmplConfig = {
2016-01-11 02:25:30 +01:00
src : PATHS . MODULES + '/blueimp-tmpl' ,
dest : PATHS . FRAMEWORK _THIRDPARTY + '/javascript-templates' ,
files : [ '/tmpl.js' ]
2016-01-06 04:06:47 +01:00
} ;
var jquerySizesConfig = {
2016-01-11 02:25:30 +01:00
src : PATHS . MODULES + '/jquery-sizes' ,
dest : PATHS . ADMIN _THIRDPARTY + '/jsizes' ,
files : [ '/lib/jquery.sizes.js' ]
2016-01-06 04:06:47 +01:00
} ;
2016-02-12 04:00:15 +01:00
var tinymceConfig = {
src : PATHS . MODULES + '/tinymce' ,
dest : PATHS . FRAMEWORK _THIRDPARTY + '/tinymce' ,
files : [
'/tinymce.min.js' , // Exclude unminified file to keep repository size down
'/jquery.tinymce.min.js' ,
'/themes/**' ,
'/skins/**' ,
'/plugins/**'
]
} ;
2016-01-06 04:06:47 +01:00
/ * *
* 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 ) ;
} ) ;
} ) ;
}
2016-01-11 02:25:30 +01:00
/ * *
* 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 ,
2016-02-22 23:12:24 +01:00
plugins : [ 'transform-es2015-modules-umd' ] ,
comments : false
2016-01-11 02:25:30 +01:00
} ) )
. on ( 'error' , notify . onError ( {
message : 'Error: <%= error.message %>' ,
} ) )
. pipe ( gulp . dest ( dest ) ) ;
} ) ) ;
}
2016-01-06 04:06:47 +01:00
// 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 ) ;
}
2016-02-10 23:13:32 +01:00
if ( isDev ) {
2016-01-11 02:25:30 +01:00
browserifyOptions . debug = true ;
}
gulp . task ( 'build' , [ 'umd' , 'umd-watch' , 'bundle' ] ) ;
2016-02-09 00:26:39 +01:00
gulp . task ( 'bundle' , [ 'bundle-lib' , 'bundle-leftandmain' , 'bundle-react' ] ) ;
2016-01-11 02:25:30 +01:00
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' ] ,
2016-02-22 23:12:24 +01:00
ignore : /(thirdparty)/ ,
comments : false
2016-01-11 02:25:30 +01:00
} ) )
. 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 ( ) ) ;
2016-02-10 23:13:32 +01:00
if ( ! isDev ) {
2016-01-11 02:25:30 +01:00
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' ] ,
2016-02-22 23:12:24 +01:00
ignore : /(thirdparty)/ ,
comments : false
2016-01-11 02:25:30 +01:00
} ) )
. 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 ( ) ) ;
2016-02-10 23:13:32 +01:00
if ( ! isDev ) {
2016-01-11 02:25:30 +01:00
stream . pipe ( uglify ( ) ) ;
}
2016-02-09 00:26:39 +01:00
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 ( ) ) ;
}
2016-01-11 02:25:30 +01:00
return stream . pipe ( gulp . dest ( PATHS . ADMIN _JAVASCRIPT _DIST ) ) ;
2016-01-06 04:06:47 +01:00
} ) ;
gulp . task ( 'sanity' , function ( ) {
diffFiles ( blueimpFileUploadConfig ) ;
diffFiles ( blueimpLoadImageConfig ) ;
diffFiles ( blueimpTmplConfig ) ;
diffFiles ( jquerySizesConfig ) ;
2016-02-12 04:00:15 +01:00
diffFiles ( tinymceConfig ) ;
2016-01-06 04:06:47 +01:00
} ) ;
2016-01-11 02:25:30 +01:00
gulp . task ( 'thirdparty' , function ( ) {
copyFiles ( blueimpFileUploadConfig ) ;
copyFiles ( blueimpLoadImageConfig ) ;
copyFiles ( blueimpTmplConfig ) ;
copyFiles ( jquerySizesConfig ) ;
2016-02-12 04:00:15 +01:00
copyFiles ( tinymceConfig ) ;
2016-01-11 02:25:30 +01:00
} ) ;
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' ] ) ;
} ) ;
2016-02-10 23:13:32 +01:00
/ *
* Takes individual images and compiles them together into sprites
* /
gulp . task ( 'sprites' , function ( ) {
return sprity . src ( {
src : PATHS . ADMIN _IMAGES + '/sprites/src/**/*.{png,jpg}' ,
cssPath : '../images/sprites/dist' ,
style : './_spritey.scss' ,
processor : 'sass' ,
split : true ,
margin : 0
} )
. pipe ( gulpif ( '*.png' , gulp . dest ( PATHS . ADMIN _IMAGES + '/sprites/dist' ) , gulp . dest ( PATHS . ADMIN _SCSS ) ) )
} ) ;
2016-02-03 02:32:45 +01:00
gulp . task ( 'css' , [ 'compile:css' ] , function ( ) {
if ( isDev ) {
rootCompileFolders . forEach ( function ( folder ) {
gulp . watch ( folder + '/scss/**/*.scss' , [ 'compile:css' ] ) ;
} ) ;
}
} )
2016-02-10 23:13:32 +01:00
/ *
* Compiles scss into css
* Watches for changes if -- development flag is given
* /
2016-02-03 02:32:45 +01:00
gulp . task ( 'compile:css' , function ( ) {
2016-02-10 23:13:32 +01:00
var outputStyle = isDev ? 'expanded' : 'compressed' ;
var tasks = rootCompileFolders . map ( function ( folder ) {
return gulp . src ( folder + '/scss/**/*.scss' )
. pipe ( sourcemaps . init ( ) )
. pipe ( sass ( { outputStyle : outputStyle } )
. on ( 'error' , notify . onError ( {
message : 'Error: <%= error.message %>'
} ) )
)
2016-02-03 02:32:45 +01:00
. pipe ( postcss ( [ autoprefixer ( { browsers : supportedBrowsers } ) ] ) )
2016-02-10 23:13:32 +01:00
. pipe ( sourcemaps . write ( ) )
. pipe ( gulp . dest ( folder + '/css' ) )
} ) ;
return tasks ;
} ) ;