module.exports = function( grunt ) { "use strict"; function readOptionalJSON( filepath ) { var stripJSONComments = require( "strip-json-comments" ), data = {}; try { data = JSON.parse( stripJSONComments( fs.readFileSync( filepath, { encoding: "utf8" } ) ) ); } catch ( e ) {} return data; } var fs = require( "fs" ), gzip = require( "gzip-js" ), isTravis = process.env.TRAVIS; if ( !grunt.option( "filename" ) ) { grunt.option( "filename", "jquery.js" ); } grunt.initConfig( { pkg: grunt.file.readJSON( "package.json" ), dst: readOptionalJSON( "dist/.destination.json" ), "compare_size": { files: [ "dist/jquery.js", "dist/jquery.min.js" ], options: { compress: { gz: function( contents ) { return gzip.zip( contents, {} ).length; } }, cache: "build/.sizecache.json" } }, babel: { options: { sourceMap: "inline", retainLines: true, plugins: [ "transform-es2015-for-of" ] }, nodeSmokeTests: { files: { "test/node_smoke_tests/lib/ensure_iterability.js": "test/node_smoke_tests/lib/ensure_iterability_es6.js" } } }, build: { all: { dest: "dist/jquery.js", minimum: [ "core", "selector" ], // Exclude specified modules if the module matching the key is removed removeWith: { ajax: [ "manipulation/_evalUrl", "event/ajax" ], callbacks: [ "deferred" ], css: [ "effects", "dimensions", "offset" ], "css/showHide": [ "effects" ], deferred: { remove: [ "ajax", "effects", "queue", "core/ready" ], include: [ "core/ready-no-deferred" ] }, sizzle: [ "css/hiddenVisibleSelectors", "effects/animatedSelector" ] } } }, npmcopy: { all: { options: { destPrefix: "external" }, files: { "sizzle/dist": "sizzle/dist", "sizzle/LICENSE.txt": "sizzle/LICENSE.txt", "npo/npo.js": "native-promise-only/npo.js", "qunit/qunit.js": "qunitjs/qunit/qunit.js", "qunit/qunit.css": "qunitjs/qunit/qunit.css", "qunit/LICENSE.txt": "qunitjs/LICENSE.txt", "qunit-assert-step/qunit-assert-step.js": "qunit-assert-step/qunit-assert-step.js", "qunit-assert-step/MIT-LICENSE.txt": "qunit-assert-step/MIT-LICENSE.txt", "requirejs/require.js": "requirejs/require.js", "sinon/sinon.js": "sinon/pkg/sinon.js", "sinon/LICENSE.txt": "sinon/LICENSE" } } }, jsonlint: { pkg: { src: [ "package.json" ] } }, eslint: { options: { // See https://github.com/sindresorhus/grunt-eslint/issues/119 quiet: true }, // We have to explicitly declare "src" property otherwise "newer" // task wouldn't work properly :/ dist: { src: "dist/jquery.js" }, dev: { src: [ "src/**/*.js", "Gruntfile.js", "test/**/*.js", "build/**/*.js" ] } }, testswarm: { tests: [ // A special module with basic tests, meant for // not fully supported environments like Android 2.3, // jsdom or PhantomJS. We run it everywhere, though, // to make sure tests are not broken. "basic", "ajax", "animation", "attributes", "callbacks", "core", "css", "data", "deferred", "deprecated", "dimensions", "effects", "event", "manipulation", "offset", "queue", "selector", "serialize", "support", "traversing", "tween" ] }, karma: { options: { customContextFile: "test/karma.context.html", customDebugFile: "test/karma.debug.html", customLaunchers: { ChromeHeadlessNoSandbox: { base: "ChromeHeadless", flags: [ "--no-sandbox" ] } }, frameworks: [ "qunit" ], middleware: [ "mockserver" ], plugins: [ "karma-*", { "middleware:mockserver": [ "factory", require( "./test/middleware-mockserver.js" ) ] } ], files: [ "test/data/jquery-1.9.1.js", "external/qunit-assert-step/qunit-assert-step.js", "external/sinon/sinon.js", "external/npo/npo.js", "external/requirejs/require.js", "test/data/testinit.js", "test/jquery.js", // Replacement for testinit.js#loadTests() "test/data/testrunner.js", "test/unit/basic.js", "test/unit/core.js", "test/unit/callbacks.js", "test/unit/deferred.js", "test/unit/deprecated.js", "test/unit/support.js", "test/unit/data.js", "test/unit/queue.js", "test/unit/attributes.js", "test/unit/event.js", "test/unit/selector.js", "test/unit/traversing.js", "test/unit/manipulation.js", "test/unit/wrap.js", "test/unit/css.js", "test/unit/serialize.js", "test/unit/ajax.js", "test/unit/effects.js", "test/unit/offset.js", "test/unit/dimensions.js", "test/unit/animation.js", "test/unit/tween.js", "test/unit/ready.js", { pattern: "dist/jquery.*", included: false, served: true }, { pattern: "src/**", included: false, served: true }, { pattern: "external/**", included: false, served: true }, { pattern: "test/**/*.@(js|css|jpg|html|xml|svg)", included: false, served: true } ], reporters: [ "dots" ], autoWatch: false, concurrency: 3, captureTimeout: 20 * 1000, singleRun: true }, main: { // The Chrome sandbox doesn't work on Travis. browsers: [ isTravis ? "ChromeHeadlessNoSandbox" : "ChromeHeadless" ] }, // To debug tests with Karma: // 1. Run 'grunt karma:chrome-debug' or 'grunt karma:firefox-debug' // (any karma subtask that has singleRun=false) // 2. Press "Debug" in the opened browser window to start // the tests. Unlike the other karma tasks, the debug task will // keep the browser window open. "chrome-debug": { browsers: [ "Chrome" ], singleRun: false }, "firefox-debug": { browsers: [ "Firefox" ], singleRun: false } }, watch: { files: [ "<%= eslint.dev.src %>" ], tasks: [ "dev" ] }, uglify: { all: { files: { "dist/<%= grunt.option('filename').replace('.js', '.min.js') %>": "dist/<%= grunt.option('filename') %>" }, options: { preserveComments: false, sourceMap: true, sourceMapName: "dist/<%= grunt.option('filename').replace('.js', '.min.map') %>", report: "min", output: { "ascii_only": true, // Support: Android 4.0 only // UglifyJS 3 breaks Android 4.0 if this option is not enabled. // This is in lieu of setting ie8 for all of mangle, compress, and output "ie8": true }, banner: "/*! jQuery v<%= pkg.version %> | " + "(c) JS Foundation and other contributors | jquery.org/license */", compress: { "hoist_funs": false, loops: false, // Support: IE <11 // typeofs transformation is unsafe for IE9-10 // See https://github.com/mishoo/UglifyJS2/issues/2198 typeofs: false } } } } } ); // Load grunt tasks from NPM packages require( "load-grunt-tasks" )( grunt ); // Integrate jQuery specific tasks grunt.loadTasks( "build/tasks" ); grunt.registerTask( "lint", [ "jsonlint", // Running the full eslint task without breaking it down to targets // would run the dist target first which would point to errors in the built // file, making it harder to fix them. We want to check the built file only // if we already know the source files pass the linter. "eslint:dev", "eslint:dist" ] ); grunt.registerTask( "lint:newer", [ "newer:jsonlint", // Don't replace it with just the task; see the above comment. "newer:eslint:dev", "newer:eslint:dist" ] ); grunt.registerTask( "test:fast", "node_smoke_tests" ); grunt.registerTask( "test:slow", "promises_aplus_tests" ); grunt.registerTask( "test", [ "test:fast", "test:slow" ] ); grunt.registerTask( "dev", [ "build:*:*", "newer:eslint:dev", "newer:uglify", "remove_map_comment", "dist:*", "qunit_fixture", "compare_size" ] ); grunt.registerTask( "default", [ "eslint:dev", "build:*:*", "uglify", "remove_map_comment", "dist:*", "qunit_fixture", "eslint:dist", "test:fast", "compare_size" ] ); };