|  | "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" | 
|  | ] ); | 
|  | }; |