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
This commit is contained in:
Michał Gołębiowski-Owczarek 2020-01-08 00:35:55 +01:00 committed by GitHub
parent 0f780ba7cc
commit 437f389a24
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 43 additions and 15 deletions

View File

@ -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" ],

33
test/jquery.js vendored
View File

@ -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 ) {