split compass sass

pull/12065/head
Carlos Matallín 8 years ago
parent fb5b7e6f42
commit 8986017184

@ -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.js').task(), compass: require('./lib/build/tasks/compass').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);
});
}
};

@ -4,7 +4,7 @@
# Set this to the root of your project when deployed: # Set this to the root of your project when deployed:
http_path = "/" http_path = "/"
css_dir = "dist/css" css_dir = "dist/css"
sass_dir = "tmp/sass/" sass_dir = "tmp/sass/editor"
images_dir = "app/assets/images/" images_dir = "app/assets/images/"
#javascripts_dir = "lib/assets/javascripts" #javascripts_dir = "lib/assets/javascripts"

@ -124,7 +124,6 @@ module.exports = {
] ]
} }
}, },
common_editor3: { common_editor3: {
src: editor3Bundles.common.map(require.resolve), src: editor3Bundles.common.map(require.resolve),
dest: '<%= assets_dir %>/javascripts/common_editor3.js', dest: '<%= assets_dir %>/javascripts/common_editor3.js',
@ -138,7 +137,6 @@ module.exports = {
] ]
} }
}, },
dataset: { dataset: {
src: [ src: [
'lib/assets/javascripts/cartodb3/dataset.js' 'lib/assets/javascripts/cartodb3/dataset.js'
@ -148,7 +146,6 @@ module.exports = {
external: editor3Bundles.vendor.concat(editor3Bundles.common) external: editor3Bundles.vendor.concat(editor3Bundles.common)
} }
}, },
editor3: { editor3: {
src: [ src: [
'lib/assets/javascripts/cartodb3/editor.js' 'lib/assets/javascripts/cartodb3/editor.js'
@ -158,7 +155,6 @@ module.exports = {
external: editor3Bundles.vendor.concat(editor3Bundles.common) external: editor3Bundles.vendor.concat(editor3Bundles.common)
} }
}, },
public_editor3: { public_editor3: {
src: [ src: [
'lib/assets/javascripts/cartodb3/public_editor.js' 'lib/assets/javascripts/cartodb3/public_editor.js'
@ -171,7 +167,6 @@ module.exports = {
] ]
} }
}, },
'cartodb3-specs': { 'cartodb3-specs': {
src: [ src: [
'lib/build/source-map-support.js', 'lib/build/source-map-support.js',

@ -1,7 +1,5 @@
var css_files; var css_files;
module.exports = css_files = { module.exports = css_files = {
cdb: [ cdb: [
'<%= assets_dir %>/stylesheets/map/leaflet.css', '<%= assets_dir %>/stylesheets/map/leaflet.css',
'<%= assets_dir %>/stylesheets/vendor/cartodb.css' '<%= assets_dir %>/stylesheets/vendor/cartodb.css'
@ -224,7 +222,6 @@ module.exports = css_files = {
api_keys: [ api_keys: [
'<%= assets_dir %>/stylesheets/api_keys/*.css' '<%= assets_dir %>/stylesheets/api_keys/*.css'
] ]
}; };
var _all_css = []; var _all_css = [];

@ -1,23 +1,21 @@
/**
* Clean task config
*/
/** exports.task = function() {
* Clean task config return {
*/ options: {
force: true
exports.task = function() { },
dist: [
return { '.grunt',
options: { '.sass-cache',
force: true 'tmp/sass',
}, 'lib/build/app_config.js',
src: [ '<%= assets_dir %>',
"lib/build/app_config.js", 'lib/assets/javascripts/cartodb3',
".sass-cache", 'lib/assets/test/{spec,jasmine}/cartodb3',
"tmp/sass", 'lib/assets/locale'
"<%= assets_dir %>", ]
".grunt",
"lib/assets/javascripts/cartodb3",
"lib/assets/test/{spec,jasmine}/cartodb3",
"lib/assets/locale"
]
}
} }
}

@ -7,19 +7,10 @@ exports.task = function () {
dist: { dist: {
options: { options: {
importPath: [ importPath: [
'tmp/sass/common',
'tmp/sass/cartoassets' 'tmp/sass/cartoassets'
], ],
sassDir: 'tmp/sass', sassDir: 'tmp/sass/editor',
cssDir: '<%= assets_dir %>/stylesheets', cssDir: '<%= assets_dir %>/stylesheets',
specify: [
'tmp/sass/**/*.scss',
'!tmp/sass/deep-insights/**/*.scss',
'tmp/sass/deep-insights/main.scss',
'tmp/sass/deep-insights/entry.scss',
'!tmp/sass/cartodbjs_v4/**/*.scss',
'tmp/sass/cartodbjs_v4/entry.scss'
],
fontsDir: '<%= assets_dir %>/fonts', fontsDir: '<%= assets_dir %>/fonts',
httpFontsPath: '<%= env.http_path_prefix %>/assets/<%= pkg.version %>/fonts', httpFontsPath: '<%= env.http_path_prefix %>/assets/<%= pkg.version %>/fonts',

@ -1,47 +1,45 @@
/**
/** * Copy task config
* Copy task config */
*/
exports.task = function (grunt) {
exports.task = function (grunt) { return {
vendor: {
return { expand: true,
cwd: 'vendor/assets/stylesheets/',
// Vendor stylesheets src: ['**/*.css'],
dest: 'tmp/sass/vendor/',
vendor: { rename: function (dest, src) {
expand: true, return dest + src.replace(/\.css$/, '.scss');
cwd: 'vendor/assets/stylesheets/', },
src: ['**/*.css'], options: {
dest: 'tmp/sass/vendor/', // Change all routes from img to asset version path
rename: function (dest, src) { process: function (content, srcpath) {
return dest + src.replace(/\.css$/, '.scss'); // return content.replace(/\.\.\/img/gi,"/assets/<%= pkg.version %>/images/themes");
}, var path = grunt.template.process('<%= env.http_path_prefix %>/assets/<%= pkg.version %>/images/themes');
options: { return content.replace(/\.\.\/img/gi, path);
// Change all routes from img to asset version path
process: function (content, srcpath) {
// return content.replace(/\.\.\/img/gi,"/assets/<%= pkg.version %>/images/themes");
var path = grunt.template.process('<%= env.http_path_prefix %>/assets/<%= pkg.version %>/images/themes');
return content.replace(/\.\.\/img/gi, path);
}
} }
}, }
},
cartoassets: { app: {
files: [{
expand: true,
dot: true,
cwd: 'node_modules/cartoassets/src/fonts',
src: '**/*.*',
dest: '<%= assets_dir %>/fonts/'
}, {
expand: true, expand: true,
cwd: 'node_modules/cartoassets/src/scss/', cwd: 'node_modules/cartoassets/src/scss/',
src: '**/*.scss', src: '**/*.scss',
dest: 'tmp/sass/cartoassets/' dest: 'tmp/sass/cartoassets/'
}, }, {
perfect_scrollbar: {
expand: true, expand: true,
cwd: 'node_modules/perfect-scrollbar/src/css/', cwd: 'node_modules/perfect-scrollbar/src/css/',
src: '*.scss', src: '*.scss',
dest: 'tmp/sass/deep-insights/' dest: 'tmp/sass/deep-insights/'
}, }, {
colorpicker: {
expand: true, expand: true,
cwd: 'node_modules/bootstrap-colorpicker/dist/css/', cwd: 'node_modules/bootstrap-colorpicker/dist/css/',
src: 'bootstrap-colorpicker.css', src: 'bootstrap-colorpicker.css',
@ -49,310 +47,204 @@
rename: function (dest, src) { rename: function (dest, src) {
return dest + src.replace(/\.css$/, '.scss'); return dest + src.replace(/\.css$/, '.scss');
} }
}, }, {
deep_insights: {
expand: true, expand: true,
cwd: 'node_modules/cartodb-deep-insights.js/themes/scss', cwd: 'node_modules/cartodb-deep-insights.js/themes/scss',
src: '**/*.scss', src: '**/*.scss',
dest: 'tmp/sass/deep-insights/' dest: 'tmp/sass/deep-insights/'
}, }, {
cartodbjs_v4: {
expand: true, expand: true,
cwd: 'node_modules/cartodb.js/themes/scss', cwd: 'node_modules/cartodb.js/themes/scss',
src: '**/*.scss', src: '**/*.scss',
dest: 'tmp/sass/cartodbjs_v4/' dest: 'tmp/sass/cartodbjs_v4/'
}, }, {
// TODO: remove editor
iconfont: {
expand: true, expand: true,
cwd: 'node_modules/cartoassets/src/scss/', cwd: 'app/assets/stylesheets/editor',
src: 'cdb-icon-font.scss', src: ['**/*.css.scss', '**/*.scss'],
dest: 'tmp/sass/common/' dest: 'tmp/sass/editor/',
}, rename: function (dest, src) {
return dest + src.replace(/\.css.scss$/, '.scss');
}
}, {
// TODO: remove editor
expand: true,
cwd: 'app/assets/stylesheets/builder',
src: ['**/*.scss'],
dest: 'tmp/sass/builder/',
rename: function (dest, src) {
return dest + src.replace(/\.css.scss$/, '.scss');
}
}, {
expand: true,
cwd: 'lib/assets/javascripts/cdb/themes/css/',
src: ['cartodb.css'],
dest: '<%= assets_dir %>/stylesheets/tmp/embeds/',
rename: function (dest, src) {
return dest + src.replace(/\.css$/, '.scss');
}
}, {
// Client stylesheets
expand: true,
cwd: 'app/assets/client/stylesheets/',
src: [
'**/*.css.scss',
'**/*.scss'
],
dest: 'tmp/sass/client/',
rename: function (dest, src) {
return dest + src.replace(/\.css.scss$/, '.scss');
}
}, {
expand: true,
cwd: 'app/assets/images/',
src: ['**/*'],
dest: '<%= assets_dir %>/images/'
}, {
// Some images should be placed in a unversioned folder
expand: true,
cwd: 'app/assets/images/',
src: ['avatars/**/*', 'alphamarker.png', 'google-maps-basemap-icons/*'],
dest: '<%= root_assets_dir %>/unversioned/images/'
}, {
// CARTO.js images
expand: true,
cwd: 'lib/assets/javascripts/cdb/themes/img/',
src: ['**/*'],
dest: '<%= assets_dir %>/images/themes/'
}, {
// Fonts
expand: true,
cwd: 'app/assets/fonts/',
src: ['*.{svg,ttf,eot,woff,woff2}'],
dest: '<%= assets_dir %>/fonts/'
}, {
// Client fonts
expand: true,
cwd: 'app/assets/client/fonts/',
src: ['*.{svg,ttf,eot,woff,woff2}'],
dest: '<%= assets_dir %>/fonts/'
}, {
// Flash
expand: true,
cwd: 'app/assets/flash/',
src: ['**/*'],
dest: '<%= assets_dir %>/flash/'
}, {
// Favicons
expand: true,
cwd: 'public/favicons/',
src: ['**/*'],
dest: '<%= assets_dir %>/favicons/'
}, {
// Client favicons
expand: true,
cwd: 'app/assets/client/favicons/',
src: ['**/*'],
dest: '<%= assets_dir %>/favicons/'
}]
},
css_tests: {
expand: true,
cwd: 'lib/assets/test/lib/jasmine-1.3.1/',
src: ['**/*.css'],
dest: 'tmp/sass/specs/',
rename: function (dest, src) {
return dest + src.replace(/\.css$/, '.scss');
}
},
cartofonts: { js_cartodb: {
files: [{ files: [
{
expand: true, expand: true,
dot: true, cwd: 'lib/assets/core/javascripts/cartodb/organization/',
cwd: 'node_modules/cartoassets/src/fonts', src: ['**/*'],
src: '**/*.*', dest: 'lib/assets/javascripts/cartodb/organization/'
dest: '<%= assets_dir %>/fonts/' } , {
}] expand: true,
}, cwd: 'lib/assets/client/javascripts/cartodb/organization/',
src: ['**/*'],
app: { dest: 'lib/assets/javascripts/cartodb/organization/'
}
files: [ ]
},
/**
* Stylesheets
*/
// App stylesheets
{
expand: true,
cwd: 'app/assets/stylesheets/',
src: ['**/*.css.scss', '**/*.scss'],
dest: 'tmp/sass/',
rename: function (dest, src) {
return dest + src.replace(/\.css.scss$/, '.scss');
}
},
// Vendor stylesheets
{
expand: true,
cwd: 'vendor/assets/stylesheets/',
src: ['**/*.css.scss', '**/*.scss'],
dest: 'tmp/sass/',
rename: function (dest, src) {
return dest + src.replace(/\.css.scss$/, '.scss');
}
},
// Jasmine stylesheets
{
expand: true,
cwd: 'lib/assets/test/lib/jasmine-1.3.1/',
src: ['**/*.css'],
dest: 'tmp/sass/specs/',
rename: function (dest, src) {
return dest + src.replace(/\.css$/, '.scss');
}
},
// Embed stylesheets
{
expand: true,
cwd: 'lib/assets/javascripts/cdb/themes/css/',
src: ['cartodb.css'],
dest: '<%= assets_dir %>/stylesheets/tmp/embeds/',
rename: function (dest, src) {
return dest + src.replace(/\.css$/, '.scss');
}
},
// Client stylesheets
{
expand: true,
cwd: 'app/assets/client/stylesheets/',
src: [
'**/*.css.scss',
'**/*.scss'
],
dest: 'tmp/sass/client/',
rename: function (dest, src) {
return dest + src.replace(/\.css.scss$/, '.scss');
}
},
/**
* Images
*/
// public images
{
expand: true,
cwd: 'app/assets/images/',
src: ['**/*'],
dest: '<%= assets_dir %>/images/'
},
// some images should be placed in a unversioned folder
{
expand: true,
cwd: 'app/assets/images/',
src: ['avatars/**/*', 'alphamarker.png', 'google-maps-basemap-icons/*'],
dest: '<%= root_assets_dir %>/unversioned/images/'
},
// CartoDB.js images
{
expand: true,
cwd: 'lib/assets/javascripts/cdb/themes/img/',
src: ['**/*'],
dest: '<%= assets_dir %>/images/themes/'
},
/**
* Fonts
*/
{
expand: true,
cwd: 'app/assets/fonts/',
src: ['*.{svg,ttf,eot,woff,woff2}'],
dest: '<%= assets_dir %>/fonts/'
},
{
expand: true,
cwd: 'vendor/assets/fonts/',
src: ['*.{svg,ttf,eot,woff,woff2}'],
dest: '<%= assets_dir %>/fonts/'
},
// client fonts
{
expand: true,
cwd: 'app/assets/client/fonts/',
src: ['*.{svg,ttf,eot,woff,woff2}'],
dest: '<%= assets_dir %>/fonts/'
},
/**
* Flash
*/
{
expand: true,
cwd: 'app/assets/flash/',
src: ['**/*'],
dest: '<%= assets_dir %>/flash/'
},
/**
* Favicons
*/
{
expand: true,
cwd: 'public/favicons/',
src: ['**/*'],
dest: '<%= assets_dir %>/favicons/'
},
// client Favicons
{
expand: true,
cwd: 'app/assets/client/favicons/',
src: ['**/*'],
dest: '<%= assets_dir %>/favicons/'
}
]
},
js_core_cartodb: {
files: [
{
expand: true,
cwd: 'lib/assets/core/javascripts/cartodb/organization/',
src: ['**/*'],
dest: 'lib/assets/javascripts/cartodb/organization/'
}
]
},
js_client_cartodb: {
files: [
{
expand: true,
cwd: 'lib/assets/client/javascripts/cartodb/organization/',
src: ['**/*'],
dest: 'lib/assets/javascripts/cartodb/organization/'
}
]
},
js_core_cartodb3: {
files: [
{
expand: true,
cwd: 'lib/assets/core/javascripts/cartodb3/',
src: ['**/*'],
dest: 'lib/assets/javascripts/cartodb3/'
}
]
},
js_client_cartodb3: {
files: [
{
expand: true,
cwd: 'lib/assets/client/javascripts/cartodb3/',
src: ['**/*'],
dest: 'lib/assets/javascripts/cartodb3/'
}
]
},
js_test_spec_core_cartodb3: {
files: [
{
expand: true,
cwd: 'lib/assets/core/test/spec/cartodb3/',
src: ['**/*'],
dest: 'lib/assets/test/spec/cartodb3/'
}
]
},
js_test_jasmine_core_cartodb3: {
files: [
{
expand: true,
cwd: 'lib/assets/core/test/jasmine/cartodb3/',
src: ['**/*'],
dest: 'lib/assets/test/jasmine/cartodb3/'
}
]
},
js_test_spec_client_cartodb3: {
files: [
{
expand: true,
cwd: 'lib/assets/client/test/spec/cartodb3/',
src: ['**/*'],
dest: 'lib/assets/test/spec/cartodb3/'
}
]
},
js_test_jasmine_client_cartodb3: { js_cartodb3: {
files: [ files: [
{ {
expand: true, expand: true,
cwd: 'lib/assets/client/test/jasmine/cartodb3/', cwd: 'lib/assets/core/javascripts/cartodb3/',
src: ['**/*'], src: ['**/*'],
dest: 'lib/assets/test/jasmine/cartodb3/' dest: 'lib/assets/javascripts/cartodb3/'
} }, {
] expand: true,
}, cwd: 'lib/assets/client/javascripts/cartodb3/',
src: ['**/*'],
dest: 'lib/assets/javascripts/cartodb3/'
}
]
},
locale_core: { js_test_spec_cartodb3: {
files: [ files: [
{ {
expand: true, expand: true,
cwd: 'lib/assets/core/locale/', cwd: 'lib/assets/core/test/spec/cartodb3/',
src: ['**/*'], src: ['**/*'],
dest: 'lib/assets/locale/' dest: 'lib/assets/test/spec/cartodb3/'
} } , {
] expand: true,
}, cwd: 'lib/assets/client/test/spec/cartodb3/',
src: ['**/*'],
dest: 'lib/assets/test/spec/cartodb3/'
}
]
},
locale_client: { js_test_jasmine_cartodb3: {
files: [ files: [
{ {
expand: true, expand: true,
cwd: 'lib/assets/client/locale/', cwd: 'lib/assets/core/test/jasmine/cartodb3/',
src: ['**/*'], src: ['**/*'],
dest: 'lib/assets/locale/' dest: 'lib/assets/test/jasmine/cartodb3/'
} } , {
] expand: true,
}, cwd: 'lib/assets/client/test/jasmine/cartodb3/',
src: ['**/*'],
dest: 'lib/assets/test/jasmine/cartodb3/'
}
]
},
js: { locale: {
files: [{ files: [
{
expand: true, expand: true,
cwd: '<%= assets_dir %>/javascripts/', cwd: 'lib/assets/core/locale/',
src: ['**/*.js'], src: ['**/*'],
dest: '<%= assets_dir %>/javascripts/', dest: 'lib/assets/locale/'
rename: function (dest, src) { }, {
return dest + src.replace(/\.js$/, '.uncompressed.js'); expand: true,
} cwd: 'lib/assets/client/locale/',
}] src: ['**/*'],
} dest: 'lib/assets/locale/'
}; }
]
},
js: {
files: [{
expand: true,
cwd: '<%= assets_dir %>/javascripts/',
src: ['**/*.js'],
dest: '<%= assets_dir %>/javascripts/',
rename: function (dest, src) {
return dest + src.replace(/\.js$/, '.uncompressed.js');
}
}]
}
}; };
};

@ -1,6 +1,4 @@
module.exports = { module.exports = {
task: function() { task: function() {
return {} return {}
}, },

@ -0,0 +1,43 @@
/**
* Compass task config
*/
exports.task = function () {
return {
options: {
sourceMap: true,
sourceMapEmbed: true,
sourceMapContents: true,
includePaths: [
'tmp/sass/cartoassets/'
]
},
dist: {
files: [{
expand: true,
cwd: 'tmp/sass/builder/',
src: [
'**/*.scss'
],
dest: '<%= assets_dir %>/stylesheets',
ext: '.css'
}, {
expand: true,
cwd: 'tmp/sass/',
src: [
'**/*.scss',
'!builder/**/*',
'!editor/**/*',
// TODO: this can be achieved prepending the asstes with _
'!deep-insights/**/*.scss',
'deep-insights/main.scss',
'deep-insights/entry.scss',
'!cartodbjs_v4/**/*.scss',
'cartodbjs_v4/entry.scss'
],
dest: '<%= assets_dir %>/stylesheets',
ext: '.css'
}]
},
};
};

@ -1,6 +1,6 @@
{ {
"name": "cartodb-ui", "name": "cartodb-ui",
"version": "4.6.81", "version": "4.6.81.11962.02",
"description": "CARTO UI frontend", "description": "CARTO UI frontend",
"repository": { "repository": {
"type": "git", "type": "git",
@ -69,6 +69,7 @@
"grunt-contrib-watch": "1.0.0", "grunt-contrib-watch": "1.0.0",
"grunt-exorcise": "2.1.0", "grunt-exorcise": "2.1.0",
"grunt-postcss": "0.5.5", "grunt-postcss": "0.5.5",
"grunt-sass": "^2.0.0",
"grunt-timer": "0.3.3", "grunt-timer": "0.3.3",
"jasmine": "2.5.2", "jasmine": "2.5.2",
"jasmine-ajax": "git://github.com/nobuti/jasmine-ajax.git#master", "jasmine-ajax": "git://github.com/nobuti/jasmine-ajax.git#master",

Loading…
Cancel
Save