text: import path from 'path';
  
  function getModulePackageName(module) {
    if (!module.context) return null;
  
    const nodeModulesPath = path.join(__dirname, '../node_modules/');
    if (module.context.substring(0, nodeModulesPath.length) !== nodeModulesPath) {
      return null;
    }
  
    const moduleRelativePath = module.context.substring(nodeModulesPath.length);
    const [moduleDirName] = moduleRelativePath.split(path.sep);
    let packageName = moduleDirName;
    // handle tree shaking
    if (packageName && packageName.match('^_')) {
      // eslint-disable-next-line prefer-destructuring
      packageName = packageName.match(/^_(@?[^@]+)/)[1];
    }
    return packageName;
  }
  
  const webpackPlugin = (config) => {
    // optimize chunks
    config.optimization
      // share the same chunks across different modules
      .runtimeChunk(false)
      .splitChunks({
        chunks: 'async',
        name: 'vendors',
        maxInitialRequests: Infinity,
        minSize: 0,
        cacheGroups: {
          vendors: {
            test: (module) => {
              const packageName = getModulePackageName(module) || '';
              if (packageName) {
                return ['echarts', 'd3', 'three'].includes(packageName);
              }
              return false;
            },
            name(module) {
              const packageName = getModulePackageName(module);
              if (packageName) {
                if (['echarts', 'd3', 'three'].indexOf(packageName) >= 0) {
                  return 'viz'; // visualization package
                }
              }
              return 'misc';
            },
          },
        },
      });
  };
  
  export default webpackPlugin;
  