123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578 |
- 'use strict';
- module.exports = function (grunt) {
- grunt.option('stack', true)
- // Report the elapsed execution time of tasks.
- require('time-grunt')(grunt);
- var COMPRESS_FOR_TESTS = false;
- var git = require('git-rev');
- // Sauce Labs browser
- var browsers = [
- // Desktop browsers
- {
- browserName: 'chrome',
- version: 'latest',
- platform: 'Windows 7'
- },
- {
- browserName: 'firefox',
- version: 'latest',
- platform: 'Linux'
- },
- {
- browserName: 'safari',
- version: '9',
- platform: 'OS X 10.11'
- },
- {
- browserName: 'internet explorer',
- version: '8',
- platform: 'Windows XP'
- },
- {
- browserName: 'internet explorer',
- version: '11',
- platform: 'Windows 8.1'
- },
- {
- browserName: 'edge',
- version: '13',
- platform: 'Windows 10'
- },
- // Mobile browsers
- {
- browserName: 'ipad',
- deviceName: 'iPad Air Simulator',
- deviceOrientation: 'portrait',
- version: '8.4',
- platform: 'OS X 10.9'
- },
- {
- browserName: 'iphone',
- deviceName: 'iPhone 5 Simulator',
- deviceOrientation: 'portrait',
- version: '9.3',
- platform: 'OS X 10.11'
- },
- {
- browserName: 'android',
- deviceName: 'Google Nexus 7 HD Emulator',
- deviceOrientation: 'portrait',
- version: '4.4',
- platform: 'Linux'
- }
- ];
- var sauceJobs = {};
- var browserTests = [
- 'filemanager-plugin',
- 'visitor-plugin',
- 'global-vars',
- 'modify-vars',
- 'production',
- 'rootpath-relative',
- 'rootpath-rewrite-urls',
- 'rootpath',
- 'relative-urls',
- 'rewrite-urls',
- 'browser',
- 'no-js-errors',
- 'legacy'
- ];
- function makeJob(testName) {
- sauceJobs[testName] = {
- options: {
- urls: testName === 'all' ?
- browserTests.map(function(name) {
- return 'http://localhost:8081/tmp/browser/test-runner-' + name + '.html';
- }) :
- ['http://localhost:8081/tmp/browser/test-runner-' + testName + '.html'],
- testname: testName === 'all' ? 'Unit Tests for Less.js' : testName,
- browsers: browsers,
- public: 'public',
- recordVideo: false,
- videoUploadOnPass: false,
- recordScreenshots: process.env.TRAVIS_BRANCH !== 'master',
- build: process.env.TRAVIS_BRANCH === 'master' ? process.env.TRAVIS_JOB_ID : undefined,
- tags: [process.env.TRAVIS_BUILD_NUMBER, process.env.TRAVIS_PULL_REQUEST, process.env.TRAVIS_BRANCH],
- statusCheckAttempts: -1,
- sauceConfig: {
- 'idle-timeout': 100
- },
- throttled: 5,
- onTestComplete: function(result, callback) {
- // Called after a unit test is done, per page, per browser
- // 'result' param is the object returned by the test framework's reporter
- // 'callback' is a Node.js style callback function. You must invoke it after you
- // finish your work.
- // Pass a non-null value as the callback's first parameter if you want to throw an
- // exception. If your function is synchronous you can also throw exceptions
- // directly.
- // Passing true or false as the callback's second parameter passes or fails the
- // test. Passing undefined does not alter the test result. Please note that this
- // only affects the grunt task's result. You have to explicitly update the Sauce
- // Labs job's status via its REST API, if you want so.
- // This should be the encrypted value in Travis
- var user = process.env.SAUCE_USERNAME;
- var pass = process.env.SAUCE_ACCESS_KEY;
- git.short(function(hash) {
- require('phin')({
- method: 'PUT',
- url: ['https://saucelabs.com/rest/v1', user, 'jobs', result.job_id].join('/'),
- auth: { user: user, pass: pass },
- data: {
- passed: result.passed,
- build: 'build-' + hash
- }
- }, function (error, response) {
- if (error) {
- console.log(error);
- callback(error);
- } else if (response.statusCode !== 200) {
- console.log(response);
- callback(new Error('Unexpected response status'));
- } else {
- callback(null, result.passed);
- }
- });
- });
- }
- }
- };
- }
- // Make the SauceLabs jobs
- (['all'].concat(browserTests)).map(makeJob);
- // Project configuration.
- grunt.initConfig({
- pkg: grunt.file.readJSON('package.json'),
- meta: {
- copyright: 'Copyright (c) 2009-<%= grunt.template.today("yyyy") %>',
- banner: '/*!\n' +
- ' * Less - <%= pkg.description %> v<%= pkg.version %>\n' +
- ' * http://lesscss.org\n' +
- ' *\n' +
- ' * <%= meta.copyright %>, <%= pkg.author.name %> <<%= pkg.author.email %>>\n' +
- ' * Licensed under the <%= pkg.license %> License.\n' +
- ' *\n' +
- ' */\n\n' +
- ' /**' +
- ' * @license <%= pkg.license %>\n' +
- ' */\n\n'
- },
- shell: {
- options: {
- stdout: true,
- failOnError: true,
- execOptions: {
- maxBuffer: Infinity
- }
- },
- test: {
- command: 'node test/index.js'
- },
- benchmark: {
- command: 'node benchmark/index.js'
- },
- opts: { // test running with all current options (using `opts` since `options` means something already)
- command: [ // @TODO: make this more thorough
- // CURRENT OPTIONS
- // --math
- 'node bin/lessc --math=always test/less/lazy-eval.less tmp/lazy-eval.css',
- 'node bin/lessc --math=parens-division test/less/lazy-eval.less tmp/lazy-eval.css',
- 'node bin/lessc --math=parens test/less/lazy-eval.less tmp/lazy-eval.css',
- 'node bin/lessc --math=strict test/less/lazy-eval.less tmp/lazy-eval.css',
- 'node bin/lessc --math=strict-legacy test/less/lazy-eval.less tmp/lazy-eval.css',
- // DEPRECATED OPTIONS
- // --strict-math
- 'node bin/lessc --strict-math=on test/less/lazy-eval.less tmp/lazy-eval.css',
- ].join(' && ')
- },
- plugin: {
- command: [
- 'node bin/lessc --clean-css="--s1 --advanced" test/less/lazy-eval.less tmp/lazy-eval.css',
- 'cd lib',
- 'node ../bin/lessc --clean-css="--s1 --advanced" ../test/less/lazy-eval.less ../tmp/lazy-eval.css',
- 'cd ..',
- // Test multiple plugins
- 'node bin/lessc --plugin=clean-css="--s1 --advanced" --plugin=autoprefix="ie 11,Edge >= 13,Chrome >= 47,Firefox >= 45,iOS >= 9.2,Safari >= 9" test/less/lazy-eval.less tmp/lazy-eval.css'
- ].join(' && ')
- },
- 'sourcemap-test': { // quoted value doesn't seem to get picked up by time-grunt, or isn't output, at least; maybe just "sourcemap" is fine?
- command: [
- 'node bin/lessc --source-map=test/sourcemaps/maps/import-map.map test/less/import.less test/sourcemaps/import.css',
- 'node bin/lessc --source-map test/less/sourcemaps/basic.less test/sourcemaps/basic.css'
- ].join(' && ')
- },
- },
- browserify: {
- browser: {
- src: ['./lib/less-browser/bootstrap.js'],
- options: {
- exclude: ['promise'],
- browserifyOptions: {
- standalone: 'less',
- noParse: ['clone']
- }
- },
- dest: 'tmp/less.js'
- }
- },
- concat: {
- options: {
- stripBanners: 'all',
- banner: '<%= meta.banner %>'
- },
- browsertest: {
- src: COMPRESS_FOR_TESTS ? '<%= uglify.test.dest %>' : '<%= browserify.browser.dest %>',
- dest: 'test/browser/less.js'
- },
- dist: {
- src: '<%= browserify.browser.dest %>',
- dest: 'dist/less.js'
- }
- },
- uglify: {
- options: {
- banner: '<%= meta.banner %>',
- mangle: true,
- compress: {
- pure_getters: true
- }
- },
- dist: {
- src: ['<%= concat.dist.dest %>'],
- dest: 'dist/less.min.js'
- },
- test: {
- src: '<%= browserify.browser.dest %>',
- dest: 'tmp/less.min.js'
- }
- },
- eslint: {
- target: ['Gruntfile.js',
- 'test/**/*.js',
- 'lib/less*/**/*.js',
- 'bin/lessc',
- '!test/browser/jasmine-jsreporter.js',
- '!test/less/errors/plugin/plugin-error.js'
- ],
- options: {
- configFile: '.eslintrc.json'
- }
- },
- connect: {
- server: {
- options: {
- port: 8081
- }
- }
- },
- jasmine: {
- options: {
- keepRunner: true,
- host: 'http://localhost:8081/',
- vendor: [
- './node_modules/phantomjs-polyfill-object-assign/object-assign-polyfill.js',
- 'test/browser/vendor/promise.js',
- 'test/browser/jasmine-jsreporter.js',
- 'test/browser/common.js',
- 'test/browser/less.js'
- ],
- template: 'test/browser/test-runner-template.tmpl'
- },
- main: {
- // src is used to build list of less files to compile
- src: [
- 'test/less/*.less',
- '!test/less/plugin-preeval.less', // uses ES6 syntax
- // Don't test NPM import, obviously
- '!test/less/plugin-module.less',
- '!test/less/import-module.less',
- '!test/less/javascript.less',
- '!test/less/urls.less',
- '!test/less/empty.less'
- ],
- options: {
- helpers: 'test/browser/runner-main-options.js',
- specs: 'test/browser/runner-main-spec.js',
- outfile: 'tmp/browser/test-runner-main.html'
- }
- },
- legacy: {
- src: ['test/less/legacy/*.less'],
- options: {
- helpers: 'test/browser/runner-legacy-options.js',
- specs: 'test/browser/runner-legacy-spec.js',
- outfile: 'tmp/browser/test-runner-legacy.html'
- }
- },
- strictUnits: {
- src: ['test/less/strict-units/*.less'],
- options: {
- helpers: 'test/browser/runner-strict-units-options.js',
- specs: 'test/browser/runner-strict-units-spec.js',
- outfile: 'tmp/browser/test-runner-strict-units.html'
- }
- },
- errors: {
- src: ['test/less/errors/*.less', '!test/less/errors/javascript-error.less', 'test/browser/less/errors/*.less'],
- options: {
- timeout: 20000,
- helpers: 'test/browser/runner-errors-options.js',
- specs: 'test/browser/runner-errors-spec.js',
- outfile: 'tmp/browser/test-runner-errors.html'
- }
- },
- noJsErrors: {
- src: ['test/less/no-js-errors/*.less'],
- options: {
- helpers: 'test/browser/runner-no-js-errors-options.js',
- specs: 'test/browser/runner-no-js-errors-spec.js',
- outfile: 'tmp/browser/test-runner-no-js-errors.html'
- }
- },
- browser: {
- src: ['test/browser/less/*.less', 'test/browser/less/plugin/*.less'],
- options: {
- helpers: 'test/browser/runner-browser-options.js',
- specs: 'test/browser/runner-browser-spec.js',
- outfile: 'tmp/browser/test-runner-browser.html'
- }
- },
- relativeUrls: {
- src: ['test/browser/less/relative-urls/*.less'],
- options: {
- helpers: 'test/browser/runner-relative-urls-options.js',
- specs: 'test/browser/runner-relative-urls-spec.js',
- outfile: 'tmp/browser/test-runner-relative-urls.html'
- }
- },
- rewriteUrls: {
- src: ['test/browser/less/rewrite-urls/*.less'],
- options: {
- helpers: 'test/browser/runner-rewrite-urls-options.js',
- specs: 'test/browser/runner-rewrite-urls-spec.js',
- outfile: 'tmp/browser/test-runner-rewrite-urls.html'
- }
- },
- rootpath: {
- src: ['test/browser/less/rootpath/*.less'],
- options: {
- helpers: 'test/browser/runner-rootpath-options.js',
- specs: 'test/browser/runner-rootpath-spec.js',
- outfile: 'tmp/browser/test-runner-rootpath.html'
- }
- },
- rootpathRelative: {
- src: ['test/browser/less/rootpath-relative/*.less'],
- options: {
- helpers: 'test/browser/runner-rootpath-relative-options.js',
- specs: 'test/browser/runner-rootpath-relative-spec.js',
- outfile: 'tmp/browser/test-runner-rootpath-relative.html'
- }
- },
- rootpathRewriteUrls: {
- src: ['test/browser/less/rootpath-rewrite-urls/*.less'],
- options: {
- helpers: 'test/browser/runner-rootpath-rewrite-urls-options.js',
- specs: 'test/browser/runner-rootpath-rewrite-urls-spec.js',
- outfile: 'tmp/browser/test-runner-rootpath-rewrite-urls.html'
- }
- },
- production: {
- src: ['test/browser/less/production/*.less'],
- options: {
- helpers: 'test/browser/runner-production-options.js',
- specs: 'test/browser/runner-production-spec.js',
- outfile: 'tmp/browser/test-runner-production.html'
- }
- },
- modifyVars: {
- src: ['test/browser/less/modify-vars/*.less'],
- options: {
- helpers: 'test/browser/runner-modify-vars-options.js',
- specs: 'test/browser/runner-modify-vars-spec.js',
- outfile: 'tmp/browser/test-runner-modify-vars.html'
- }
- },
- globalVars: {
- src: ['test/browser/less/global-vars/*.less'],
- options: {
- helpers: 'test/browser/runner-global-vars-options.js',
- specs: 'test/browser/runner-global-vars-spec.js',
- outfile: 'tmp/browser/test-runner-global-vars.html'
- }
- },
- postProcessorPlugin: {
- src: ['test/less/postProcessorPlugin/*.less'],
- options: {
- helpers: ['test/plugins/postprocess/index.js','test/browser/runner-postProcessorPlugin-options.js'],
- specs: 'test/browser/runner-postProcessorPlugin.js',
- outfile: 'tmp/browser/test-runner-post-processor-plugin.html'
- }
- },
- preProcessorPlugin: {
- src: ['test/less/preProcessorPlugin/*.less'],
- options: {
- helpers: ['test/plugins/preprocess/index.js','test/browser/runner-preProcessorPlugin-options.js'],
- specs: 'test/browser/runner-preProcessorPlugin.js',
- outfile: 'tmp/browser/test-runner-pre-processor-plugin.html'
- }
- },
- visitorPlugin: {
- src: ['test/less/visitorPlugin/*.less'],
- options: {
- helpers: ['test/plugins/visitor/index.js','test/browser/runner-VisitorPlugin-options.js'],
- specs: 'test/browser/runner-VisitorPlugin.js',
- outfile: 'tmp/browser/test-runner-visitor-plugin.html'
- }
- },
- filemanagerPlugin: {
- src: ['test/less/filemanagerPlugin/*.less'],
- options: {
- helpers: ['test/plugins/filemanager/index.js','test/browser/runner-filemanagerPlugin-options.js'],
- specs: 'test/browser/runner-filemanagerPlugin.js',
- outfile: 'tmp/browser/test-runner-filemanager-plugin.html'
- }
- }
- },
- 'saucelabs-jasmine': sauceJobs,
- // Clean the version of less built for the tests
- clean: {
- test: ['test/browser/less.js', 'tmp', 'test/less-bom'],
- 'sourcemap-test': ['test/sourcemaps/*.css', 'test/sourcemaps/*.map'],
- sauce_log: ['sc_*.log']
- }
- });
- // Load these plugins to provide the necessary tasks
- grunt.loadNpmTasks('grunt-saucelabs');
- require('jit-grunt')(grunt);
- // by default, run tests
- grunt.registerTask('default', [
- 'test'
- ]);
- // Release
- grunt.registerTask('dist', [
- 'browserify:browser',
- 'concat:dist',
- 'uglify:dist'
- ]);
- // Create the browser version of less.js
- grunt.registerTask('browsertest-lessjs', [
- 'browserify:browser',
- 'uglify:test',
- 'concat:browsertest'
- ]);
- // Run all browser tests
- grunt.registerTask('browsertest', [
- 'browsertest-lessjs',
- 'connect',
- 'jasmine'
- ]);
- // setup a web server to run the browser tests in a browser rather than phantom
- grunt.registerTask('browsertest-server', [
- 'browsertest-lessjs',
- 'jasmine::build',
- 'connect::keepalive'
- ]);
- var previous_force_state = grunt.option('force');
- grunt.registerTask('force',function(set) {
- if (set === 'on') {
- grunt.option('force',true);
- }
- else if (set === 'off') {
- grunt.option('force',false);
- }
- else if (set === 'restore') {
- grunt.option('force',previous_force_state);
- }
- });
- grunt.registerTask('sauce', [
- 'browsertest-lessjs',
- 'jasmine::build',
- 'connect',
- 'sauce-after-setup'
- ]);
- grunt.registerTask('sauce-after-setup', [
- 'saucelabs-jasmine:all',
- 'clean:sauce_log'
- ]);
- var testTasks = [
- 'clean',
- 'eslint',
- 'shell:test',
- 'shell:opts',
- 'shell:plugin',
- 'browsertest'
- ];
- if (isNaN(Number(process.env.TRAVIS_PULL_REQUEST, 10)) &&
- Number(process.env.TRAVIS_NODE_VERSION) === 4 &&
- (process.env.TRAVIS_BRANCH === 'master' || process.env.TRAVIS_BRANCH === '3.x')) {
- testTasks.push('force:on');
- testTasks.push('sauce-after-setup');
- testTasks.push('force:off');
- }
- // Run all tests
- grunt.registerTask('test', testTasks);
- // Run shell option tests (includes deprecated options)
- grunt.registerTask('shell-options', ['shell:opts']);
- // Run shell plugin test
- grunt.registerTask('shell-plugin', ['shell:plugin']);
- // Run all tests
- grunt.registerTask('quicktest', testTasks.slice(0, -1));
- // generate a good test environment for testing sourcemaps
- grunt.registerTask('sourcemap-test', [
- 'clean:sourcemap-test',
- 'shell:sourcemap-test',
- 'connect::keepalive'
- ]);
- // Run benchmark
- grunt.registerTask('benchmark', [
- 'shell:benchmark'
- ]);
- };
|