@ -48,425 +48,484 @@ function isRunningTask (taskName, grunt) {
/ * *
/ * *
* CartoDB UI assets generation
* CartoDB UI assets generation
* /
* /
module . exports = function ( grunt ) {
module . exports = function ( grunt ) {
if ( timer ) timer . init ( grunt ) ;
if ( timer ) timer . init ( grunt ) ;
var environment = grunt . option ( 'environment' ) || DEVELOPMENT ;
grunt . log . writeln ( 'Environment: ' + environment ) ;
var environment = grunt . option ( 'environment' ) || DEVELOPMENT ;
grunt . log . writeln ( 'Environment: ' + environment ) ;
var runningTasks = grunt . cli . tasks ;
var runningTasks = grunt . cli . tasks ;
if ( runningTasks . length === 0 ) {
if ( runningTasks . length === 0 ) {
grunt . log . writeln ( 'Running default task.' ) ;
grunt . log . writeln ( 'Running default task.' ) ;
} else {
} else {
grunt . log . writeln ( 'Running tasks: ' + runningTasks ) ;
grunt . log . writeln ( 'Running tasks: ' + runningTasks ) ;
}
}
function preFlight ( requiredNodeVersion , requiredNpmVersion , logFn ) {
function preFlight ( requiredNodeVersion , requiredNpmVersion , logFn ) {
function checkVersion ( cmd , versionRange , name , logFn ) {
function checkVersion ( cmd , versionRange , name , logFn ) {
grunt . log . writeln ( 'Required ' + name + ' version: ' + versionRange ) ;
grunt . log . writeln ( 'Required ' + name + ' version: ' + versionRange ) ;
require ( "child_process" ) . exec ( cmd , function ( error , stdout , stderr ) {
require ( "child_process" ) . exec ( cmd , function ( error , stdout , stderr ) {
var err = null ;
var err = null ;
if ( error ) {
if ( error ) {
err = 'failed to check version for ' + name ;
err = 'failed to check version for ' + name ;
} else {
} else {
var installed = semver . clean ( stdout ) ;
var installed = semver . clean ( stdout ) ;
if ( ! semver . satisfies ( installed , versionRange ) ) {
if ( ! semver . satisfies ( installed , versionRange ) ) {
err = 'Installed ' + name + ' version does not match with required [' + versionRange + "] Installed: " + installed ;
err = 'Installed ' + name + ' version does not match with required [' + versionRange + "] Installed: " + installed ;
}
}
if ( err ) {
grunt . log . fail ( err ) ;
}
}
logFn && logFn ( err ? new Error ( err ) : null ) ;
}
} ) ;
if ( err ) {
}
grunt . log . fail ( err ) ;
checkVersion ( 'node -v' , requiredNodeVersion , 'node' , logFn ) ;
}
checkVersion ( 'npm -v' , requiredNpmVersion , 'npm' , logFn ) ;
logFn && logFn ( err ? new Error ( err ) : null ) ;
}
} ) ;
var mustCheckNodeVersion = grunt . option ( 'no-node-checker' ) ;
if ( ! mustCheckNodeVersion ) {
preFlight ( REQUIRED _NODE _VERSION , REQUIRED _NPM _VERSION , logVersionsError ) ;
grunt . log . writeln ( '' ) ;
}
}
// checkVersion('node -v', requiredNodeVersion, 'node', logFn);
// checkVersion('npm -v', requiredNpmVersion, 'npm', logFn);
}
var dependenciesWithDifferentVersion = shrinkwrapDependencies . checkDependenciesVersion (
var mustCheckNodeVersion = grunt . option ( 'no-node-checker' ) ;
require ( './npm-shrinkwrap-010.json' ) ,
if ( ! mustCheckNodeVersion ) {
require ( './npm-shrinkwrap-69.json' ) ,
preFlight ( REQUIRED _NODE _VERSION , REQUIRED _NPM _VERSION , logVersionsError ) ;
SHRINKWRAP _MODULES _TO _VALIDATE
grunt . log . writeln ( '' ) ;
) ;
}
if ( dependenciesWithDifferentVersion . length > 0 ) {
grunt . log . fail ( "############### /!\\ CAUTION /!\\ #################" ) ;
grunt . log . fail ( "Dependencies with different version in shrinkwraps for node 0.10 and node 6.9.2 found." ) ;
grunt . log . fail ( JSON . stringify ( dependenciesWithDifferentVersion , null , 4 ) ) ;
grunt . log . fail ( "#################################################" ) ;
process . exit ( 1 ) ;
}
var duplicatedModules = shrinkwrapDependencies . checkDuplicatedDependencies ( require ( './npm-shrinkwrap.json' ) , SHRINKWRAP _MODULES _TO _VALIDATE ) ;
var dependenciesWithDifferentVersion = shrinkwrapDependencies . checkDependenciesVersion (
if ( duplicatedModules . length > 0 ) {
require ( './npm-shrinkwrap-010.json' ) ,
grunt . log . fail ( "############### /!\\ CAUTION /!\\ #################" ) ;
require ( './npm-shrinkwrap-69.json' ) ,
grunt . log . fail ( "Duplicated dependencies found in npm-shrinkwrap.json file." ) ;
SHRINKWRAP _MODULES _TO _VALIDATE
grunt . log . fail ( JSON . stringify ( duplicatedModules , null , 4 ) ) ;
) ;
grunt . log . fail ( "#################################################" ) ;
if ( dependenciesWithDifferentVersion . length > 0 ) {
process . exit ( 1 ) ;
grunt . log . fail ( "############### /!\\ CAUTION /!\\ #################" ) ;
}
grunt . log . fail ( "Dependencies with different version in shrinkwraps for node 0.10 and node 6.9.2 found." ) ;
grunt . log . fail ( JSON . stringify ( dependenciesWithDifferentVersion , null , 4 ) ) ;
grunt . log . fail ( "#################################################" ) ;
process . exit ( 1 ) ;
}
var ROOT _ASSETS _DIR = './public/assets/' ;
var duplicatedModules = shrinkwrapDependencies . checkDuplicatedDependencies ( require ( './npm-shrinkwrap.json' ) , SHRINKWRAP _MODULES _TO _VALIDATE ) ;
var ASSETS _DIR = './public/assets/<%= pkg.version %>' ;
if ( duplicatedModules . length > 0 ) {
grunt . log . fail ( "############### /!\\ CAUTION /!\\ #################" ) ;
grunt . log . fail ( "Duplicated dependencies found in npm-shrinkwrap.json file." ) ;
grunt . log . fail ( JSON . stringify ( duplicatedModules , null , 4 ) ) ;
grunt . log . fail ( "#################################################" ) ;
process . exit ( 1 ) ;
}
// use grunt --environment production
var ROOT _ASSETS _DIR = './public/assets/' ;
var env = './config/grunt_' + environment + '.json' ;
var ASSETS _DIR = './public/assets/<%= pkg.version %>' ;
grunt . log . writeln ( 'env: ' + env ) ;
if ( grunt . file . exists ( env ) ) {
env = grunt . file . readJSON ( env )
} else {
throw grunt . util . error ( env + ' file is missing! See ' + env + '.sample for how it should look like' ) ;
}
var aws = { } ;
/ * *
if ( grunt . file . exists ( './lib/build/grunt-aws.json' ) ) {
* ` grunt --environment=production `
aws = grunt . file . readJSON ( './lib/build/grunt-aws.json' ) ;
* /
}
var env = './config/grunt_' + environment + '.json' ;
grunt . log . writeln ( 'env: ' + env ) ;
// Project configuration.
if ( grunt . file . exists ( env ) ) {
grunt. initConfig ( {
env = grunt . file . readJSON ( env )
pkg : grunt . file . readJSON ( 'package.json' ) ,
} else {
aws : aws ,
throw grunt . util . error ( env + ' file is missing! See ' + env + '.sample for how it should look like' ) ;
env : env ,
}
assets _dir : ASSETS _DIR ,
var aws = { } ;
root _assets _dir : ROOT _ASSETS _DIR ,
if ( grunt . file . exists ( './lib/build/grunt-aws.json' ) ) {
aws = grunt . file . readJSON ( './lib/build/grunt-aws.json' ) ;
}
// Concat task
// Project configuration.
concat : require ( './lib/build/tasks/concat' ) . task ( ) ,
grunt . initConfig ( {
pkg : grunt . file . readJSON ( 'package.json' ) ,
aws : aws ,
env : env ,
// JST generation task
assets _dir : ASSETS _DIR ,
jst : require ( './lib/build/tasks/jst' ) . task ( ) ,
root _assets _dir : ROOT _ASSETS _DIR ,
// Compass files generation
// Concat task
compass : require ( './lib/build/tasks/compass ') . task ( ) ,
concat : require ( './lib/build/tasks/concat ') . task ( ) ,
// Copy assets (stylesheets, javascripts, images...)
// JST generation task
copy : require ( './lib/build/tasks/copy' ) . task ( grunt ) ,
jst : require ( './lib/build/tasks/jst' ) . task ( ) ,
// Watch actions
// Compass files generation
watch : require ( './lib/build/tasks/watch.j s') . task ( ) ,
compass : require ( './lib/build/tasks/compas s') . task ( ) ,
// Clean folders before other tasks
// Copy assets (stylesheets, javascripts, images...)
clean : require ( './lib/build/tasks/clean' ) . task ( ) ,
copy : require ( './lib/build/tasks/copy' ) . task ( grunt ) ,
jasmine : jasmineCfg ,
// Watch actions
watch : require ( './lib/build/tasks/watch.js' ) . task ( ) ,
s3 : require ( './lib/build/tasks/s3.js' ) . task ( ) ,
// Clean folders before other tasks
clean : require ( './lib/build/tasks/clean' ) . task ( ) ,
exorcise : require ( './lib/build/tasks/exorcise.js' ) . task ( ) ,
jasmine : jasmineCfg ,
uglify : require ( './lib/build/tasks/uglify .js') . task ( ) ,
s3 : require ( './lib/build/tasks/s3 .js') . task ( ) ,
browserify : require ( './lib/build/tasks/browserify .js') . task ( ) ,
exorcise : require ( './lib/build/tasks/exorcise .js') . task ( ) ,
connect : require ( './lib/build/tasks/connect .js') . task ( ) ,
uglify : require ( './lib/build/tasks/uglify .js') . task ( ) ,
availabletasks : require ( './lib/build/tasks/availabletasks.js' ) . task ( )
browserify : require ( './lib/build/tasks/browserify.js' ) . task ( ) ,
} ) ;
// $ grunt availabletasks
connect : require ( './lib/build/tasks/connect.js' ) . task ( ) ,
grunt . loadNpmTasks ( 'grunt-available-tasks' ) ;
// Load Grunt tasks
availabletasks : require ( './lib/build/tasks/availabletasks.js' ) . task ( ) ,
require ( 'load-grunt-tasks' ) ( grunt , {
pattern : [ 'grunt-*' , '@*/grunt-*' , '!grunt-timer' ]
} ) ;
require ( './lib/build/tasks/manifest' ) . register ( grunt , ASSETS _DIR ) ;
sass : require ( './lib/build/tasks/sass.js' ) . task ( )
} ) ;
// builds cdb
/ * *
grunt . registerTask ( 'cdb' , "builds cartodb.js" , function ( ) {
* ` grunt availabletasks `
var done = this . async ( ) ;
* /
require ( "child_process" ) . exec ( 'make update_cdb' , function ( error , stdout , stderr ) {
grunt . loadNpmTasks ( 'grunt-available-tasks' ) ;
if ( error ) {
grunt . log . fail ( 'cartodb.js not updated (due to ' + stdout + ", " + stderr + ")" ) ;
} else {
grunt . log . ok ( 'cartodb.js updated' ) ;
}
done ( ) ;
} ) ;
} ) ;
grunt . registerTask ( 'invalidate' , "invalidate cache" , function ( ) {
// Load Grunt tasks
var done = this . async ( ) ;
require ( 'load-grunt-tasks' ) ( grunt , {
var url = require ( 'url' ) ;
pattern : [ 'grunt-*' , '@*/grunt-*' , '!grunt-timer' ]
var https = require ( 'https' ) ;
} ) ;
var options = url . parse ( grunt . template . process ( 'https://api.fastly.com/service/<%= aws.FASTLY_CARTODB_SERVICE %>/purge_all' ) ) ;
options [ 'method' ] = 'POST' ;
options [ 'headers' ] = {
'Fastly-Key' : aws . FASTLY _API _KEY ,
'Content-Length' : '0' //Disables chunked encoding
} ;
console . log ( options ) ;
https . request ( options , function ( response ) {
if ( response . statusCode == 200 ) {
grunt . log . ok ( 'CDN invalidated (fastly)' ) ;
} else {
grunt . log . error ( 'CDN not invalidated (fastly), code: ' + response . statusCode )
}
done ( ) ;
} ) . on ( 'error' , function ( e ) {
grunt . log . error ( 'CDN not invalidated (fastly)' ) ;
done ( ) ;
} ) . end ( ) ;
} ) ;
grunt . registerTask ( 'config' , "generates assets config for current configuration" , function ( ) {
require ( './lib/build/tasks/manifest' ) . register ( grunt , ASSETS _DIR ) ;
// Set assets url for static assets in our app
var config = grunt . template . process ( "cdb.config.set('assets_url', '<%= env.http_path_prefix %>/assets/<%= pkg.version %>');" ) ;
config += grunt . template . process ( "\nconsole.log('cartodbui v<%= pkg.version %>');" ) ;
grunt . file . write ( "lib/build/app_config.js" , config ) ;
} ) ;
grunt . registerTask ( 'check_release' , "checks release can be done" , function ( ) {
grunt . registerTask ( 'invalidate' , 'invalidate cache' , function ( ) {
if ( environment === DEVELOPMENT ) {
var done = this . async ( ) ;
grunt . log . error ( "you can't release running development environment" ) ;
var url = require ( 'url' ) ;
return false ;
var https = require ( 'https' ) ;
}
grunt . log . ok ( "************************************************" ) ;
grunt . log . ok ( " you are going to deploy to " + env ) ;
grunt . log . ok ( "************************************************" ) ;
} ) ;
grunt . event . on ( 'watch' , function ( action , filepath , subtask ) {
var options = url . parse ( grunt . template . process ( 'https://api.fastly.com/service/<%= aws.FASTLY_CARTODB_SERVICE %>/purge_all' ) ) ;
// configure copy vendor to only run on changed file
options [ 'method' ] = 'POST' ;
var cfg = grunt . config . get ( 'copy.vendor' ) ;
options [ 'headers' ] = {
if ( filepath . indexOf ( cfg . cwd ) !== - 1 ) {
'Fastly-Key' : aws . FASTLY _API _KEY ,
grunt . config ( 'copy.vendor.src' , filepath . replace ( cfg . cwd , '' ) ) ;
'Content-Length' : '0' // Disables chunked encoding
} else {
} ;
grunt . config ( 'copy.vendor.src' , [ ] ) ;
console . log ( options ) ;
}
var builderFiles = [
https . request ( options , function ( response ) {
'js_core_cartodb3' ,
if ( response . statusCode == 200 ) {
'js_client_cartodb3' ,
grunt . log . ok ( 'CDN invalidated (fastly)' ) ;
'js_test_spec_core_cartodb3' ,
'js_test_spec_client_cartodb3'
] ;
var otherFiles = [
'app' ,
'js_core_cartodb' ,
'js_client_cartodb' ,
'js_test_jasmine_core_cartodb3' ,
'js_test_jasmine_client_cartodb3'
] ;
var COPY _PATHS = [ ] ;
if ( subtask === 'js_affected' ) {
COPY _PATHS = COPY _PATHS . concat ( builderFiles ) ;
} else {
} else {
COPY_PATHS = COPY _PATHS . concat ( otherFiles ) . concat ( builderFiles ) ;
grunt . log . error ( 'CDN not invalidated (fastly), code: ' + response . statusCode )
}
}
done ( ) ;
} ) . on ( 'error' , function ( e ) {
grunt . log . error ( 'CDN not invalidated (fastly)' ) ;
done ( ) ;
} ) . end ( ) ;
} ) ;
grunt . registerTask ( 'config' , 'generates assets config for current configuration' , function ( ) {
// Set assets url for static assets in our app
var config = grunt . template . process ( "cdb.config.set('assets_url', '<%= env.http_path_prefix %>/assets/<%= pkg.version %>');" ) ;
config += grunt . template . process ( "\nconsole.log('cartodbui v<%= pkg.version %>');" ) ;
grunt . file . write ( "lib/build/app_config.js" , config ) ;
} ) ;
grunt . registerTask ( 'check_release' , 'checks release can be done' , function ( ) {
if ( environment === DEVELOPMENT ) {
grunt . log . error ( "you can't release running development environment" ) ;
return false ;
}
// configure copy paths to only run on changed files
grunt . log . ok ( "************************************************" ) ;
for ( var j = 0 , m = COPY _PATHS . length ; j < m ; ++ j ) {
grunt . log . ok ( " you are going to deploy to " + env ) ;
var copy _path = COPY _PATHS [ j ] ;
grunt . log . ok ( "************************************************" ) ;
var files = grunt . config . get ( 'copy.' + copy _path + '.files' ) ;
} ) ;
for ( var i = 0 , l = files . length ; i < l ; ++ i ) {
var cfg = grunt . config . get ( 'copy.' + copy _path + '.files.' + i ) ;
if ( filepath . indexOf ( cfg . cwd ) !== - 1 ) {
grunt . config ( 'copy.' + copy _path + '.files.' + i + '.src' , filepath . replace ( cfg . cwd , '' ) ) ;
} else {
grunt . config ( 'copy.' + copy _path + '.files.' + i + '.src' , [ ] ) ;
}
}
}
} ) ;
grunt . registerTask ( 'setConfig' , 'Set a config property' , function ( name , val ) {
grunt . event . on ( 'watch' , function ( action , filepath , subtask ) {
grunt . config . set ( name , val ) ;
// Configure copy vendor to only run on changed file
} ) ;
var cfg = grunt . config . get ( 'copy.vendor' ) ;
if ( filepath . indexOf ( cfg . cwd ) !== - 1 ) {
grunt . config ( 'copy.vendor.src' , filepath . replace ( cfg . cwd , '' ) ) ;
} else {
grunt . config ( 'copy.vendor.src' , [ ] ) ;
}
// still have to use this custom task because registerCmdTask outputs tons of warnings like:
var builderFiles = [
// path/to/some/ignored/files:0:0: File ignored because of your .eslintignore file. Use --no-ignore to override.
'js_cartodb3' ,
grunt . registerTask ( 'lint' , 'lint source files' , function ( ) {
'js_test_spec_cartodb3'
var done = this . async ( ) ;
] ;
require ( 'child_process' ) . exec ( '(git diff --name-only --relative; git diff origin/master.. --name-only --relative) | grep \'\\.js\\?$\' | xargs node_modules/.bin/semistandard' , function ( error , stdout , stderr ) {
var otherFiles = [
if ( error ) {
'app' ,
grunt . log . fail ( error ) ;
'js_cartodb' ,
'js_test_jasmine_cartodb3'
] ;
var COPY _PATHS = [ ] ;
if ( subtask === 'js_affected' ) {
COPY _PATHS = COPY _PATHS . concat ( builderFiles ) ;
} else {
COPY _PATHS = COPY _PATHS . concat ( otherFiles ) . concat ( builderFiles ) ;
}
// Filter out lines that are ignored,
// Configure copy paths to only run on changed files
// e.g. "src/foobar.js:0:0: File ignored because of your .eslintignore file. Use --no-ignore to override."
for ( var j = 0 , m = COPY _PATHS . length ; j < m ; ++ j ) {
grunt . log . fail ( stdout . replace ( /.+--no-ignore.+(\r?\n|\r)/g , '' ) ) ;
var copy _path = COPY _PATHS [ j ] ;
grunt . fail . warn ( 'try `node_modules/.bin/semistandard --format src/filename.js` to auto-format code (you might still need to fix some things manually).' ) ;
var files = grunt . config . get ( 'copy.' + copy _path + '.files' ) ;
for ( var i = 0 , l = files . length ; i < l ; ++ i ) {
var cfg = grunt . config . get ( 'copy.' + copy _path + '.files.' + i ) ;
if ( filepath . indexOf ( cfg . cwd ) !== - 1 ) {
grunt . config ( 'copy.' + copy _path + '.files.' + i + '.src' , filepath . replace ( cfg . cwd , '' ) ) ;
} else {
} else {
grunt . log . ok ( 'All linted files OK!' ) ;
grunt . config ( 'copy.' + copy _path + '.files.' + i + '.src' , [ ] ) ;
grunt . log . writelns ( '>> Note that files listed in .eslintignore are not linted' ) ;
}
}
done ( ) ;
} ) ;
} ) ;
grunt . registerTask ( 'pre_client' , [
'copy:locale_core' ,
'copy:locale_client' ,
'copy:js_core_cartodb' ,
'copy:js_client_cartodb' ,
'copy:js_core_cartodb3' ,
'copy:js_client_cartodb3' ,
'copy:js_test_spec_core_cartodb3' ,
'copy:js_test_spec_client_cartodb3' ,
'copy:js_test_jasmine_core_cartodb3' ,
'copy:js_test_jasmine_client_cartodb3'
] ) ;
grunt . registerTask ( 'js' , [ 'cdb' , 'pre_client' , 'run_browserify' , 'concat:js' , 'jst' ] ) ;
grunt . registerTask ( 'pre_default' , [ 'clean' , 'config' , 'js' ] ) ;
grunt . registerTask ( 'test' , '(CI env) Re-build JS files and run all tests. For manual testing use `grunt jasmine` directly' , [
'pre_default' ,
'jasmine:cartodbui' ,
'jasmine:cartodb3' ,
'lint'
] ) ;
grunt . registerTask ( 'editor3' , [
'browserify:vendor_editor3' ,
'browserify:common_editor3' ,
'browserify:editor3' ,
'browserify:public_editor3'
] ) ;
grunt . registerTask ( 'css_editor_3' , [
'copy:cartofonts' ,
'copy:iconfont' ,
'copy:cartoassets' ,
'copy:perfect_scrollbar' ,
'copy:colorpicker' ,
'copy:deep_insights' ,
'copy:cartodbjs_v4'
] ) ;
grunt . registerTask ( 'css' , [ 'copy:vendor' , 'css_editor_3' , 'copy:app' , 'compass' , 'concat:css' ] ) ;
grunt . registerTask ( 'default' , [ 'pre_default' , 'css' , 'manifest' ] ) ;
grunt . registerTask ( 'minimize' , [ 'default' , 'copy:js' , 'exorcise' , 'uglify' ] ) ;
grunt . registerTask ( 'release' , [ 'check_release' , 'minimize' , 's3' , 'invalidate' ] ) ;
grunt . registerTask ( 'build-jasmine-specrunners' , _
. chain ( jasmineCfg )
. keys ( )
. map ( function ( name ) {
return [ 'jasmine' , name , 'build' ] . join ( ':' ) ;
} )
. value ( ) ) ;
grunt . registerTask ( 'dev' , 'Typical task for frontend development (watch JS/CSS changes)' , [
'setConfig:env.browserify_watch:true' ,
'run_browserify' ,
'build-jasmine-specrunners' ,
'connect:server' ,
'run_watch:builder_specs=false' ] ) ;
grunt . registerTask ( 'sourcemaps' ,
'generate sourcemaps, to be used w/ trackjs.com for bughunting' , [
'setConfig:assets_dir:./tmp/sourcemaps' ,
'config' ,
'js' ,
'copy:js' ,
'exorcise' ,
'uglify'
] ) ;
grunt . registerTask ( 'run_watch' , 'All watch tasks except those that watch spec changes' , function ( option ) {
if ( option === 'builder_specs=false' ) {
delete grunt . config . data . watch . js _test _spec _core _cartodb3 ;
delete grunt . config . data . watch . js _test _spec _client _cartodb3 ;
delete grunt . config . data . watch . js _test _jasmine _core _cartodb3 ;
delete grunt . config . data . watch . js _test _jasmine _client _cartodb3 ;
delete grunt . config . data . watch . js _affected ;
}
}
grunt . task . run ( 'watch' ) ;
}
} ) ;
} ) ;
grunt . registerTask ( 'run_browserify' , 'Browserify task with options' , function ( option ) {
grunt . registerTask ( 'css' , [
var skipAllSpecs = false ;
'copy:vendor' ,
var skipBuilderSpecs = false ;
'copy:app' ,
'compass' ,
if ( environment !== DEVELOPMENT ) {
'sass' ,
grunt . log . writeln ( 'Skipping all specs generation by browserify because not in development environment.' ) ;
// TODO: migrate mixins to postcss
skipAllSpecs = true ;
// 'postcss',
} else if ( ! isRunningTask ( 'test' , grunt ) ) {
'concat:css'
] ) ;
grunt . registerTask ( 'run_browserify' , 'Browserify task with options' , function ( option ) {
var skipEditor = false ;
var skipBuilder = false ;
var skipAllSpecs = false ;
var skipEditorSpecs = false ;
var skipBuilderSpecs = false ;
if ( environment === DEVELOPMENT ) {
if ( ! isRunningTask ( 'test' , grunt ) ) {
grunt . log . writeln ( 'Skipping only Builder specs generation by browserify because we are not running the `test` task.' ) ;
grunt . log . writeln ( 'Skipping only Builder specs generation by browserify because we are not running the `test` task.' ) ;
skipBuilderSpecs = true ;
skipBuilderSpecs = true ;
}
}
if ( skipAllSpecs ) {
if ( option === 'builder' ) {
delete grunt . config . data . browserify [ 'test_specs_for_browserify_modules' ] ;
grunt . log . writeln ( 'Skipping Editor assets and specs generation by browserify because we are running the `dev` task.' ) ;
delete grunt . config . data . browserify [ 'cartodb3-specs' ] ;
skipEditor = true ;
} else if ( skipBuilderSpecs ) {
skipEditorSpecs = true ;
delete grunt . config . data . browserify [ 'cartodb3-specs' ] ;
} else {
grunt . log . writeln ( 'Skipping Builder assets generation by browserify because we are running the `dev` task later.' ) ;
skipBuilder = true ;
}
}
} else {
grunt . log . writeln ( 'Skipping all specs generation by browserify because not in development environment.' ) ;
skipAllSpecs = true ;
}
grunt . task . run ( 'browserify' ) ;
if ( skipEditor ) {
} ) ;
delete grunt . config . data . browserify [ 'explore' ] ;
delete grunt . config . data . browserify [ 'user_feed' ] ;
delete grunt . config . data . browserify [ 'account' ] ;
delete grunt . config . data . browserify [ 'confirmation' ] ;
delete grunt . config . data . browserify [ 'editor' ] ;
delete grunt . config . data . browserify [ 'dashboard' ] ;
delete grunt . config . data . browserify [ 'keys' ] ;
delete grunt . config . data . browserify [ 'new_public_table' ] ;
delete grunt . config . data . browserify [ 'organization' ] ;
delete grunt . config . data . browserify [ 'public_dashboard' ] ;
delete grunt . config . data . browserify [ 'data_library' ] ;
delete grunt . config . data . browserify [ 'public_map' ] ;
delete grunt . config . data . browserify [ 'mobile_apps' ] ;
}
grunt . registerTask ( 'copy_builder' , 'Multitask with all the tasks responsible for copying builder files.' , [
if ( skipBuilder ) {
'copy:locale_core' ,
delete grunt . config . data . browserify [ 'vendor_editor3' ] ;
'copy:locale_client' ,
delete grunt . config . data . browserify [ 'common_editor3' ] ;
'copy:js_core_cartodb3' ,
delete grunt . config . data . browserify [ 'dataset' ] ;
'copy:js_client_cartodb3' ,
delete grunt . config . data . browserify [ 'editor3' ] ;
'copy:js_test_spec_core_cartodb3' ,
delete grunt . config . data . browserify [ 'public_editor3' ] ;
'copy:js_test_spec_client_cartodb3'
}
] ) ;
// Affected specs section - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
if ( skipAllSpecs ) {
delete grunt . config . data . browserify [ 'test_specs_for_browserify_modules' ] ;
delete grunt . config . data . browserify [ 'cartodb3-specs' ] ;
} else if ( skipEditorSpecs ) {
delete grunt . config . data . browserify [ 'test_specs_for_browserify_modules' ] ;
} else if ( skipBuilderSpecs ) {
delete grunt . config . data . browserify [ 'cartodb3-specs' ] ;
}
grunt . registerTask ( 'affected' , 'Generate only affected specs' , function ( ) {
grunt . task . run ( 'browserify' ) ;
requireWebpackTask ( ) . affected . call ( this , grunt ) ;
} ) ;
} ) ;
grunt . registerTask ( 'bootstrap_webpack_builder_specs' , 'Create the webpack compiler' , function ( ) {
grunt . registerTask ( 'cdb' , 'builds cartodb.js' , function ( ) {
requireWebpackTask ( ) . bootstrap . call ( this , 'builder_specs' , grunt ) ;
var done = this . async ( ) ;
} ) ;
grunt . registerTask ( 'webpack:builder_specs' , 'Webpack compilation task for builder specs' , function ( ) {
require ( 'child_process' ) . exec ( 'make update_cdb' , function ( error , stdout , stderr ) {
requireWebpackTask ( ) . compile . call ( this , 'builder_specs' ) ;
if ( error ) {
grunt . log . fail ( 'cartodb.js not updated (due to ' + stdout + ', ' + stderr + ')' ) ;
} else {
grunt . log . ok ( 'cartodb.js updated' ) ;
}
done ( ) ;
} ) ;
} ) ;
} ) ;
/ * *
* ` grunt affected_specs ` compile Builder specs using only affected ones by the current branch .
grunt . registerTask ( 'copy_builder' , 'Multitask with all the tasks responsible for copying builder files.' , [
* ` grunt affected_specs --specs=all ` compile all Builder specs .
'copy:locale' ,
* /
'copy:js_cartodb3' ,
grunt . registerTask ( 'affected_specs' , 'Build only specs affected by changes in current branch' , [
'copy:js_test_spec_cartodb3'
'copy_builder' ,
] ) ;
'affected' ,
'bootstrap_webpack_builder_specs' ,
grunt . registerTask ( 'js' , [
'webpack:builder_specs' ,
'cdb' ,
'jasmine:affected:build' ,
'copy_builder' ,
'connect:specs' ,
'copy:js_cartodb' ,
'watch:js_affected'
'copy:js_test_jasmine_cartodb3' ,
] ) ;
'run_browserify' ,
'concat:js' ,
// / Affected specs section - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
'jst'
] ) ;
/ * *
* Delegate task to commandline .
grunt . registerTask ( 'prepare' , [
* @ param { String } name - If taskname starts with npm it ' s run a npm script ( i . e . ` npm run foobar `
'clean' ,
* @ param { Object } d - d as in data
'config' ,
* @ param { Array } d . args - arguments to pass to the d . cmd
'js'
* @ param { String } [ d . cmd = process . execPath ]
] ) ;
* @ param { String } [ d . desc = '' ] - description
* @ param { ... string } args space - separated arguments passed to the cmd
/ * *
* /
* ` grunt ` default task to compile Editor assets , builder assets will be compiled by ` grunt dev ` task .
function registerCmdTask ( name , opts ) {
* ` grunt --environment=production ` default task to compile Builder and Editor assets .
opts = _ . extend ( {
* /
cmd : process . execPath ,
grunt . registerTask ( 'default' , [
desc : '' ,
'prepare' ,
args : [ ]
'css' ,
} , opts ) ;
'manifest'
grunt . registerTask ( name , opts . desc , function ( ) {
] ) ;
// adapted from http://stackoverflow.com/a/24796749
var done = this . async ( ) ;
grunt . registerTask ( 'run_watch' , 'All watch tasks except those that watch spec changes' , function ( option ) {
grunt . util . spawn ( {
if ( option === 'builder_specs=false' ) {
cmd : opts . cmd ,
delete grunt . config . data . watch . js _test _spec _cartodb3 ;
args : opts . args ,
delete grunt . config . data . watch . js _test _jasmine _cartodb3 ;
opts : { stdio : 'inherit' }
delete grunt . config . data . watch . js _affected ;
} , done ) ;
} ) ;
}
}
} ;
grunt . task . run ( 'watch' ) ;
} ) ;
grunt . registerTask ( 'build-jasmine-specrunners' , _ . chain ( jasmineCfg )
. keys ( )
. map ( function ( name ) {
return [ 'jasmine' , name , 'build' ] . join ( ':' ) ;
} )
. value ( ) ) ;
grunt . registerTask ( 'setConfig' , 'Set a config property' , function ( name , val ) {
grunt . config . set ( name , val ) ;
} ) ;
/ * *
* ` grunt dev ` compile and watch Builder assets .
* /
grunt . registerTask ( 'dev' , 'Frontend development task (watch JS/CSS changes)' , [
'setConfig:env.browserify_watch:true' ,
'run_browserify:builder' ,
'build-jasmine-specrunners' ,
// 'connect:server',
// 'run_watch:builder_specs=false'
] ) ;
// still have to use this custom task because registerCmdTask outputs tons of warnings like:
// path/to/some/ignored/files:0:0: File ignored because of your .eslintignore file. Use --no-ignore to override.
grunt . registerTask ( 'lint' , 'lint source files' , function ( ) {
var done = this . async ( ) ;
require ( 'child_process' ) . exec ( '(git diff --name-only --relative; git diff origin/master.. --name-only --relative) | grep \'\\.js\\?$\' | xargs node_modules/.bin/semistandard' , function ( error , stdout , stderr ) {
if ( error ) {
grunt . log . fail ( error ) ;
// Filter out lines that are ignored,
// e.g. "src/foobar.js:0:0: File ignored because of your .eslintignore file. Use --no-ignore to override."
grunt . log . fail ( stdout . replace ( /.+--no-ignore.+(\r?\n|\r)/g , '' ) ) ;
grunt . fail . warn ( 'try `node_modules/.bin/semistandard --format src/filename.js` to auto-format code (you might still need to fix some things manually).' ) ;
} else {
grunt . log . ok ( 'All linted files OK!' ) ;
grunt . log . writelns ( '>> Note that files listed in .eslintignore are not linted' ) ;
}
done ( ) ;
} ) ;
} ) ;
/ * *
* ` grunt test `
* /
grunt . registerTask ( 'test' , '(CI env) Re-build JS files and run all tests. For manual testing use `grunt jasmine` directly' , [
'prepare' ,
'jasmine:cartodbui' ,
'jasmine:cartodb3' ,
'lint'
] ) ;
grunt . registerTask ( 'sourcemaps' , 'generate sourcemaps, to be used w/ trackjs.com for bughunting' , [
'setConfig:assets_dir:./tmp/sourcemaps' ,
'config' ,
'js' ,
'copy:js' ,
'exorcise' ,
'uglify'
] ) ;
grunt . registerTask ( 'minimize' , [
'default' ,
'copy:js' ,
'exorcise' ,
'uglify'
] ) ;
/ * *
* ` grunt release `
* /
grunt . registerTask ( 'release' , [
'check_release' ,
'minimize' ,
's3' ,
'invalidate'
] ) ;
grunt . registerTask ( 'affected' , 'Generate only affected specs' , function ( ) {
requireWebpackTask ( ) . affected . call ( this , grunt ) ;
} ) ;
grunt . registerTask ( 'bootstrap_webpack_builder_specs' , 'Create the webpack compiler' , function ( ) {
requireWebpackTask ( ) . bootstrap . call ( this , 'builder_specs' , grunt ) ;
} ) ;
grunt . registerTask ( 'webpack:builder_specs' , 'Webpack compilation task for builder specs' , function ( ) {
requireWebpackTask ( ) . compile . call ( this , 'builder_specs' ) ;
} ) ;
/ * *
* ` grunt affected_specs ` compile Builder specs using only affected ones by the current branch .
* ` grunt affected_specs --specs=all ` compile all Builder specs .
* /
grunt . registerTask ( 'affected_specs' , 'Build only specs affected by changes in current branch' , [
'copy_builder' ,
'affected' ,
'bootstrap_webpack_builder_specs' ,
'webpack:builder_specs' ,
'jasmine:affected:build' ,
'connect:specs' ,
'watch:js_affected'
] ) ;
/ * *
* Delegate task to command line .
* @ param { String } name - If taskname starts with npm it ' s run a npm script ( i . e . ` npm run foobar `
* @ param { Object } d - d as in data
* @ param { Array } d . args - arguments to pass to the d . cmd
* @ param { String } [ d . cmd = process . execPath ]
* @ param { String } [ d . desc = '' ] - description
* @ param { ... string } args space - separated arguments passed to the cmd
* /
function registerCmdTask ( name , opts ) {
opts = _ . extend ( {
cmd : process . execPath ,
desc : '' ,
args : [ ]
} , opts ) ;
grunt . registerTask ( name , opts . desc , function ( ) {
// adapted from http://stackoverflow.com/a/24796749
var done = this . async ( ) ;
grunt . util . spawn ( {
cmd : opts . cmd ,
args : opts . args ,
opts : { stdio : 'inherit' }
} , done ) ;
} ) ;
}
} ;