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 (
    moduleData.resource.includes(reactRefreshPath) ||
    moduleData.resource.includes(refreshUtilsPath)
  ) {
    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;
}
Injects refresh loader to all JavaScript-like and user-specified files.
@param {*} moduleData Module factory creation data.
@param {InjectLoaderOptions} injectOptions Options to alter how the loader is injected.
@returns {*} The injected module factory creation data.