UNPKG

@gravityforms/dependency-extraction-webpack-plugin

Version:

Dependency extraction webpack plugin for use in Gravity Forms development. Extends the WordPress plugin.

111 lines (93 loc) 3.64 kB
const WPDependencyExtractionWebpackPlugin = require( '@wordpress/dependency-extraction-webpack-plugin' ); const getPackages = require( '../assets/get-packages' ); const ROOT_NAMESPACE = 'gform'; const LIBRARY_REQUEST_MAP = { react: 'React', 'react-dom': 'ReactDOM', 'react-dom/client': 'ReactDOM', 'react/jsx-runtime': 'React', 'react/jsx-dev-runtime': 'React', 'react-dnd': 'ReactDND', 'react-dnd-html5-backend': 'ReactDNDHtml5Backend', 'react-dnd-multi-backend': 'ReactDNDMultiBackend', 'rdndmb-html5-to-touch': 'ReactDNDHtml5ToTouch', }; const gfRequestToExternal = ( request, excludedExternals, rootNameSpace ) => { const packages = getPackages( rootNameSpace ); if ( packages.hasOwnProperty( request ) ) { // Check if the request is in the excludedExternals array if ( ( excludedExternals || [] ).includes( request ) ) { return; } // Return the external array return packages[ request ].external; } }; const gfRequestToHandle = ( request, rootNameSpace ) => { const packages = getPackages( rootNameSpace ); if ( packages.hasOwnProperty( request ) ) { return packages[ request ].handle; } }; class DependencyExtractionWebpackPlugin extends WPDependencyExtractionWebpackPlugin { externalizeWpDeps( _context, request, callback ) { const rootNameSpace = this.options.rootNamespace || ROOT_NAMESPACE; const bundledPackages = this.options.bundledPackages || []; if ( LIBRARY_REQUEST_MAP.hasOwnProperty( request ) && ! bundledPackages.includes( request ) ) { this.externalizedDeps.add( request ); return callback( null, [ rootNameSpace, 'libraries', LIBRARY_REQUEST_MAP[ request ] ] ); } let externalRequest; // Determine if @gravityforms/components is bundled const isGravityComponentsBundled = ( this.options.bundledPackages || [] ).includes( '@gravityforms/components' ); // If @gravityforms/components is bundled, exclude all requests that start with @gravityforms/components if ( isGravityComponentsBundled && request.startsWith( '@gravityforms/components' ) ) { return callback(); } // Handle via options.requestToExternal first if ( typeof this.options.requestToExternal === 'function' ) { externalRequest = this.options.requestToExternal( request ); } // Cascade to default if unhandled and enabled if ( typeof externalRequest === 'undefined' && this.options.useDefaults ) { externalRequest = gfRequestToExternal( request, this.options.bundledPackages || [], rootNameSpace ); } if ( externalRequest ) { this.externalizedDeps.add( request ); return callback( null, externalRequest ); } // Fall back to the WP method return super.externalizeWpDeps( _context, request, callback ); } mapRequestToDependency( request ) { const rootNameSpace = this.options.rootNamespace || ROOT_NAMESPACE; const bundledPackages = this.options.bundledPackages || []; if ( LIBRARY_REQUEST_MAP.hasOwnProperty( request ) && ! bundledPackages.includes( request ) ) { return `${ rootNameSpace }_gravityforms_libraries`; } // Handle via options.requestToHandle first if ( typeof this.options.requestToHandle === 'function' ) { const scriptDependency = this.options.requestToHandle( request ); if ( scriptDependency ) { return scriptDependency; } } // Cascade to default if enabled if ( this.options.useDefaults ) { const scriptDependency = gfRequestToHandle( request, rootNameSpace ); if ( scriptDependency ) { return scriptDependency; } } // Fall back to the WP method return super.mapRequestToDependency( request ); } } module.exports = DependencyExtractionWebpackPlugin;