text: let ConcatenatedModule;
  try {
    // eslint-disable-next-line global-require,import/no-unresolved,import/no-extraneous-dependencies
    ConcatenatedModule = require('webpack/lib/optimize/ConcatenatedModule');
    // eslint-disable-next-line no-empty
  } catch (e) {}
  
  /**
   * Get all modules from main & child compilations.
   * Merge modules from ConcatenatedModule (when webpack.optimize.ModuleConcatenationPlugin is used)
   * @param {Compilation} compilation
   * @return {NormalModule[]}
   */
  function getAllModules(compilation) {
    let modules = compilation.modules;
  
    // Look up in child compilations
    if (compilation.children.length > 0) {
      const childModules = compilation.children.map(getAllModules)
        .reduce((acc, compilationModules) => acc.concat(compilationModules), []);
  
      modules = modules.concat(childModules);
    }
  
    // Merge modules from ConcatenatedModule
    if (ConcatenatedModule) {
      const concatenatedModules = modules
        .filter(m => m instanceof ConcatenatedModule)
        .reduce((acc, m) => {
          /**
           * @see https://git.io/v7XDu
           * In webpack@3.5.1 `modules` public property was removed
           * To workaround this private `_orderedConcatenationList` property is used to collect modules
           */
          const subModules = 'modules' in m
            ? m.modules
            : m._orderedConcatenationList.map(entry => entry.module);
  
          return acc.concat(subModules);
        }, []);
  
      if (concatenatedModules.length > 0) {
        modules = modules.concat(concatenatedModules);
      }
    }
  
    return modules;
  }
  
  module.exports = getAllModules;
  