| "use strict"; |
| |
| module.exports = function( grunt ) { |
| function readOptionalJSON( filepath ) { |
| var stripJSONComments = require( "strip-json-comments" ), |
| data = {}; |
| try { |
| data = JSON.parse( stripJSONComments( |
| fs.readFileSync( filepath, { encoding: "utf8" } ) |
| ) ); |
| } catch ( e ) {} |
| return data; |
| } |
| |
| // Support: Node.js <12 |
| // Skip running tasks that dropped support for Node.js 10 |
| // in this Node version. |
| function runIfNewNode( task ) { |
| return oldNode ? "print_old_node_message:" + task : task; |
| } |
| |
| var fs = require( "fs" ), |
| gzip = require( "gzip-js" ), |
| oldNode = /^v10\./.test( process.version ), |
| nodeV17OrNewer = !/^v1[0246]\./.test( process.version ), |
| isCi = process.env.GITHUB_ACTION, |
| ciBrowsers = process.env.BROWSERS && process.env.BROWSERS.split( "," ); |
| |
| 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: [ "@babel/transform-for-of" ] |
| }, |
| tests: { |
| files: { |
| "test/data/core/jquery-iterability-transpiled.js": |
| "test/data/core/jquery-iterability-transpiled-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", "deprecated/ajax-event-alias" ], |
| callbacks: [ "deferred" ], |
| css: [ "effects", "dimensions", "offset" ], |
| "css/showHide": [ "effects" ], |
| deferred: { |
| remove: [ "ajax", "effects", "queue", "core/ready" ], |
| include: [ "core/ready-no-deferred" ] |
| }, |
| event: [ "deprecated/ajax-event-alias", "deprecated/event" ], |
| sizzle: [ "css/hiddenVisibleSelectors", "effects/animatedSelector" ] |
| } |
| } |
| }, |
| npmcopy: { |
| all: { |
| options: { |
| destPrefix: "external" |
| }, |
| files: { |
| "sizzle/dist": "sizzle/dist", |
| "sizzle/LICENSE.txt": "sizzle/LICENSE.txt", |
| |
| "core-js/core-js.js": "core-js/client/core.min.js", |
| "core-js/LICENSE.txt": "core-js/LICENSE", |
| |
| "npo/npo.js": "native-promise-only/lib/npo.src.js", |
| |
| "qunit/qunit.js": "qunit/qunit/qunit.js", |
| "qunit/qunit.css": "qunit/qunit/qunit.css", |
| "qunit/LICENSE.txt": "qunit/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", "dist/jquery.min.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" ) |
| ] |
| } |
| ], |
| client: { |
| qunit: { |
| |
| // We're running `QUnit.start()` ourselves via `loadTests()` |
| // in test/jquery.js |
| autostart: false |
| } |
| }, |
| files: [ |
| "test/data/jquery-1.9.1.js", |
| "external/sinon/sinon.js", |
| "external/npo/npo.js", |
| "external/requirejs/require.js", |
| "test/data/testinit.js", |
| |
| "test/jquery.js", |
| |
| { |
| pattern: "dist/jquery.*", |
| included: false, |
| served: true, |
| nocache: true |
| }, |
| { |
| pattern: "src/**", |
| included: false, |
| served: true, |
| nocache: true |
| }, |
| { |
| pattern: "external/**", |
| included: false, |
| served: true, |
| nocache: true |
| }, |
| { pattern: "node_modules/**", included: false, served: true }, |
| { |
| pattern: "test/**/*.@(js|css|jpg|html|xml|svg)", |
| included: false, |
| served: true, |
| nocache: true |
| } |
| ], |
| reporters: [ "dots" ], |
| autoWatch: false, |
| |
| // 2 minutes; has to be longer than QUnit.config.testTimeout |
| browserNoActivityTimeout: 120e3, |
| |
| concurrency: 3, |
| captureTimeout: 20 * 1000, |
| singleRun: true |
| }, |
| main: { |
| browsers: isCi && ciBrowsers || [ "ChromeHeadless", "FirefoxHeadless" ] |
| }, |
| amd: { |
| browsers: isCi && ciBrowsers || [ "ChromeHeadless" ], |
| options: { |
| client: { |
| qunit: { |
| |
| // We're running `QUnit.start()` ourselves via `loadTests()` |
| // in test/jquery.js |
| autostart: false, |
| |
| amd: true |
| } |
| } |
| } |
| }, |
| |
| jsdom: { |
| options: { |
| files: [ |
| "test/data/jquery-1.9.1.js", |
| "test/data/testinit-jsdom.js", |
| |
| // We don't support various loading methods like AMD, |
| // choosing a version etc. for jsdom. |
| "dist/jquery.js", |
| |
| // A partial replacement for testinit.js#loadTests() |
| "test/data/testrunner.js", |
| |
| // jsdom only runs basic tests |
| "test/unit/basic.js", |
| |
| { pattern: "external/**", included: false, served: true }, |
| { |
| pattern: "test/**/*.@(js|css|jpg|html|xml|svg)", |
| included: false, |
| served: true |
| } |
| ] |
| }, |
| browsers: [ "jsdom" ] |
| }, |
| |
| // 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 |
| }, |
| "ie-debug": { |
| browsers: [ "IE" ], |
| 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) OpenJS 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( "print_old_node_message", ( ...args ) => { |
| var task = args.join( ":" ); |
| grunt.log.writeln( "Old Node.js detected, running the task \"" + task + "\" skipped..." ); |
| } ); |
| |
| grunt.registerTask( "print_jsdom_message", () => { |
| grunt.log.writeln( "Node.js 17 or newer detected, skipping jsdom tests..." ); |
| } ); |
| |
| 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. |
| runIfNewNode( "eslint:dev" ), |
| runIfNewNode( "eslint:dist" ) |
| ] ); |
| |
| grunt.registerTask( "lint:newer", [ |
| "newer:jsonlint", |
| |
| // Don't replace it with just the task; see the above comment. |
| runIfNewNode( "newer:eslint:dev" ), |
| runIfNewNode( "newer:eslint:dist" ) |
| ] ); |
| |
| grunt.registerTask( "test:fast", runIfNewNode( "node_smoke_tests" ) ); |
| grunt.registerTask( "test:slow", [ |
| runIfNewNode( "promises_aplus_tests" ), |
| |
| // Support: Node.js 17+ |
| // jsdom fails to connect to the Karma server in Node 17+. |
| // Until we figure out a fix, skip jsdom tests there. |
| nodeV17OrNewer ? "print_jsdom_message" : runIfNewNode( "karma:jsdom" ) |
| ] ); |
| |
| grunt.registerTask( "test:prepare", [ |
| "qunit_fixture", |
| "babel:tests" |
| ] ); |
| |
| grunt.registerTask( "test", [ |
| "test:prepare", |
| "test:fast", |
| "test:slow" |
| ] ); |
| |
| grunt.registerTask( "dev", [ |
| "build:*:*", |
| runIfNewNode( "newer:eslint:dev" ), |
| "newer:uglify", |
| "remove_map_comment", |
| "dist:*", |
| "qunit_fixture", |
| "compare_size" |
| ] ); |
| |
| grunt.registerTask( "default", [ |
| runIfNewNode( "eslint:dev" ), |
| "build:*:*", |
| "uglify", |
| "remove_map_comment", |
| "dist:*", |
| "test:prepare", |
| runIfNewNode( "eslint:dist" ), |
| "test:fast", |
| "compare_size" |
| ] ); |
| }; |