Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 27 additions & 17 deletions build/tasks/build.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ module.exports = function( grunt ) {
const fs = require( "fs" );
const path = require( "path" );
const rollup = require( "rollup" );
const rollupHypothetical = require( "rollup-plugin-hypothetical" );
const rollupFileOverrides = require( "./lib/rollup-plugin-file-overrides" );
const Insight = require( "insight" );
const pkg = require( "../../package.json" );
const srcFolder = path.resolve( `${ __dirname }/../../src` );
Expand Down Expand Up @@ -39,10 +39,18 @@ module.exports = function( grunt ) {
outro: wrapper[ 1 ]
.replace( /^\n*/, "" )
};
const rollupHypotheticalOptions = {
allowFallthrough: true,
files: {}
};
const fileOverrides = new Map();

function getOverride( filePath ) {
return fileOverrides.get( path.resolve( filePath ) );
}

function setOverride( filePath, source ) {

// We want normalized paths in overrides as they will be matched
// against normalized paths in the file overrides Rollup plugin.
fileOverrides.set( path.resolve( filePath ), source );
}

grunt.registerMultiTask(
"build",
Expand Down Expand Up @@ -186,14 +194,14 @@ module.exports = function( grunt ) {

// Remove the jQuery export from the entry file, we'll use our own
// custom wrapper.
rollupHypotheticalOptions.files[ inputRollupOptions.input ] = read( inputFileName )
.replace( /\n*export default jQuery;\n*/, "\n" );
setOverride( inputRollupOptions.input,
read( inputFileName ).replace( /\n*export default jQuery;\n*/, "\n" ) );

// Replace exports/global with a noop noConflict
if ( ( index = excluded.indexOf( "exports/global" ) ) > -1 ) {
rollupHypotheticalOptions.files[ `${ srcFolder }/exports/global.js` ] =
setOverride( `${ srcFolder }/exports/global.js`,
"import jQuery from \"../core.js\";\n\n" +
"jQuery.noConflict = function() {};";
"jQuery.noConflict = function() {};" );
excluded.splice( index, 1 );
}

Expand All @@ -207,9 +215,10 @@ module.exports = function( grunt ) {
}

// Remove the comma for anonymous defines
rollupHypotheticalOptions.files[ `${ srcFolder }/exports/amd.js` ] =
setOverride( `${ srcFolder }/exports/amd.js`,
read( "exports/amd.js" )
.replace( /(\s*)"jquery"(\,\s*)/, amdName ? "$1\"" + amdName + "\"$2" : "" );
.replace( /(\s*)"jquery"(\,\s*)/,
amdName ? "$1\"" + amdName + "\"$2" : "" ) );
}

grunt.verbose.writeflags( excluded, "Excluded" );
Expand All @@ -225,7 +234,7 @@ module.exports = function( grunt ) {

// Replace excluded modules with empty sources.
for ( const module of excluded ) {
rollupHypotheticalOptions.files[ `${ srcFolder }/${ module }.js` ] = "";
setOverride( `${ srcFolder }/${ module }.js`, "" );
}
}

Expand All @@ -234,20 +243,21 @@ module.exports = function( grunt ) {

// Remove the default inclusions, they will be overwritten with the explicitly
// included ones.
rollupHypotheticalOptions.files[ inputRollupOptions.input ] = "";
setOverride( inputRollupOptions.input, "" );

}

// Import the explicitly included modules.
if ( included.length ) {
rollupHypotheticalOptions.files[ inputRollupOptions.input ] += included
.map( module => `import "./${module}.js";` )
.join( "\n" );
setOverride( inputRollupOptions.input,
getOverride( inputRollupOptions.input ) + included
.map( module => `import "./${module}.js";` )
.join( "\n" ) );
}

const bundle = await rollup.rollup( {
...inputRollupOptions,
plugins: [ rollupHypothetical( rollupHypotheticalOptions ) ]
plugins: [ rollupFileOverrides( fileOverrides ) ]
} );

const { output: [ { code } ] } = await bundle.generate( outputRollupOptions );
Expand Down
24 changes: 24 additions & 0 deletions build/tasks/lib/rollup-plugin-file-overrides.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
"use strict";

/**
* A Rollup plugin accepting a file overrides map and changing
* module sources to the overridden ones where provided. Files
* without overrides are loaded from disk.
*
* @param {Map<string, string>} fileOverrides
*/
module.exports = ( fileOverrides ) => {
return {
name: "jquery-file-overrides",
load( id ) {
if ( fileOverrides.has( id ) ) {

// Replace the module by a fake source.
return fileOverrides.get( id );
}

// Handle this module via the file system.
return null;
}
};
};
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I couldn't believe that was going to take so little code! If I knew before, I wouldn't even try using external plugins.

1 change: 0 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,6 @@
"raw-body": "2.3.3",
"requirejs": "2.3.6",
"rollup": "1.25.2",
"rollup-plugin-hypothetical": "2.1.0",
"sinon": "7.3.1",
"strip-json-comments": "2.0.1",
"testswarm": "1.1.0",
Expand Down