diff --git a/lib/utils/injectRefreshLoader.js b/lib/utils/injectRefreshLoader.js index 86b42abc..65687354 100644 --- a/lib/utils/injectRefreshLoader.js +++ b/lib/utils/injectRefreshLoader.js @@ -25,29 +25,33 @@ const refreshUtilsPath = path.join(__dirname, '../runtime/RefreshUtils'); function injectRefreshLoader(moduleData, injectOptions) { const { match, options } = injectOptions; + // Include and exclude user-specified files + if (!match(moduleData.matchResource || moduleData.resource)) return moduleData; + // Include and exclude dynamically generated modules from other loaders + if (moduleData.matchResource && !match(moduleData.request)) return moduleData; + // Exclude files referenced as assets + if (moduleData.type.includes('asset')) return moduleData; + // Check to prevent double injection + if (moduleData.loaders.find(({ loader }) => loader === resolvedLoader)) return moduleData; + // Skip react-refresh and the plugin's runtime utils to prevent self-referencing - + // this is useful when using the plugin as a direct dependency, + // or when node_modules are specified to be processed. if ( - // Include and exclude user-specified files - match(moduleData.matchResource || moduleData.resource) && - // Exclude files referenced as assets - !moduleData.type.includes('asset') && - // Skip react-refresh and the plugin's runtime utils to prevent self-referencing - - // this is useful when using the plugin as a direct dependency, - // or when node_modules are specified to be processed. - !moduleData.resource.includes(reactRefreshPath) && - !moduleData.resource.includes(refreshUtilsPath) && - // Check to prevent double injection - !moduleData.loaders.find(({ loader }) => loader === resolvedLoader) + moduleData.resource.includes(reactRefreshPath) || + moduleData.resource.includes(refreshUtilsPath) ) { - // As we inject runtime code for each module, - // it is important to run the injected loader after everything. - // This way we can ensure that all code-processing have been done, - // and we won't risk breaking tools like Flow or ESLint. - moduleData.loaders.unshift({ - loader: resolvedLoader, - options, - }); + return moduleData; } + // As we inject runtime code for each module, + // it is important to run the injected loader after everything. + // This way we can ensure that all code-processing have been done, + // and we won't risk breaking tools like Flow or ESLint. + moduleData.loaders.unshift({ + loader: resolvedLoader, + options, + }); + return moduleData; }