From: Michał Gołębiowski-Owczarek Date: Tue, 7 Jan 2020 23:35:55 +0000 (+0100) Subject: Build: Make dev mode work in Karma again, serve source files from disk X-Git-Tag: 4.0.0-beta~215 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=437f389a24a6bef213d4df507909e7e69062300b;p=jquery.git Build: Make dev mode work in Karma again, serve source files from disk PR gh-4550 added support for running ES modules & AMD tests via Karma. This required reading the `esmodules` & `amd` props from both `QUnit.config` & `QUnit.urlParams`. By picking these two properties manually, the `dev` one stopped being respected while ones handled directly by QUnit were fine (like `hidepassed`). Instead of maintaining the full list of options, the code now iterates over QUnit URL config and handles the fallbacks in a more generic way. Apart from that, all jQuery source & test files are now read directly from disk instead of being cached by Karma so that one can run `grunt karma:chrome-debug` & work on a fix without restarting that Karma run after each change. A similar effect could have been achieved by setting `autoWatch` to `true` but then the main Karma page runs tests in an iframe by default when `grunt karma:chrome-debug` is run instead of relying on the current debug flow. Closes gh-4574 Ref gh-4550 --- diff --git a/Gruntfile.js b/Gruntfile.js index c966ef99e..562d286f6 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -158,14 +158,31 @@ module.exports = function( grunt ) { "test/jquery.js", - { pattern: "dist/jquery.*", included: false, served: true }, - { pattern: "src/**", type: "module", included: false, served: true }, - { pattern: "amd/**", included: false, served: true }, + { + pattern: "dist/jquery.*", + included: false, + served: true, + nocache: true + }, + { + pattern: "src/**", + type: "module", + included: false, + served: true, + nocache: true + }, + { + pattern: "amd/**", + 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 + served: true, + nocache: true } ], reporters: [ "dots" ], diff --git a/test/jquery.js b/test/jquery.js index be2445395..2d12a5ff3 100644 --- a/test/jquery.js +++ b/test/jquery.js @@ -2,29 +2,34 @@ ( function() { /* global loadTests: false */ - var dynamicImportSource, + var dynamicImportSource, config, src, FILEPATH = "/test/jquery.js", activeScript = [].slice.call( document.getElementsByTagName( "script" ), -1 )[ 0 ], parentUrl = activeScript && activeScript.src ? activeScript.src.replace( /[?#].*/, "" ) + FILEPATH.replace( /[^/]+/g, ".." ) + "/" : "../", QUnit = window.QUnit, - require = window.require, + require = window.require; + + function getQUnitConfig() { + var config = Object.create( null ); // Default to unminified jQuery for directly-opened iframes - config = QUnit ? + if ( !QUnit ) { + config.dev = true; + } else { // QUnit.config is populated from QUnit.urlParams but only at the beginning // of the test run. We need to read both. - { - esmodules: !!( QUnit.config.esmodules || QUnit.urlParams.esmodules ), - amd: !!( QUnit.config.amd || QUnit.urlParams.amd ) - } : + QUnit.config.urlConfig.forEach( function( entry ) { + config[ entry.id ] = QUnit.config[ entry.id ] != null ? + QUnit.config[ entry.id ] : + QUnit.urlParams[ entry.id ]; + } ); + } - { dev: true }, - src = config.dev ? - "dist/jquery.js" : - "dist/jquery.min.js"; + return config; + } // Define configuration parameters controlling how jQuery is loaded if ( QUnit ) { @@ -43,6 +48,12 @@ } ); } + config = getQUnitConfig(); + + src = config.dev ? + "dist/jquery.js" : + "dist/jquery.min.js"; + // Honor ES modules loading on the main window (detected by seeing QUnit on it). // This doesn't apply to iframes because they synchronously expect jQuery to be there. if ( config.esmodules && QUnit ) {