const { hasBuildInfo, getCacheFile, isPwdFile } = require('./build.js');
const bundleBuInfo = require('./config/bundleBuInfo.json');
const {mergeConfig, getDefaultConfig} = require('@react-native/metro-config');
function postProcessModulesFilter(module) {
  if (
    module.path.indexOf('__prelude__') >= 0 ||
    module.path.indexOf('polyfills') >= 0
  ) {
    return false;
  }

  return !hasBuildInfo('./config/bundleCommonInfo.json', module.path);
}

// 不要使用 string 会导致 bundle 体积陡增
function createModuleIdFactory() {
  // 如果是业务 模块请以 10000000 来自增命名
  const fileToIdMap = new Map();
  let nextId = 10000000;
  let isFirst = false;

  return (path) => {
    if (getCacheFile('./config/bundleCommonInfo.json', path)) {
      return getCacheFile('./config/bundleCommonInfo.json', path);
    }

    if (!isFirst && isPwdFile(path)) {
      nextId = bundleBuInfo[isPwdFile(path)];
      isFirst = true;
    }

    let id = fileToIdMap.get(path);
    if (typeof id !== 'number') {
      id = nextId++;
      fileToIdMap.set(path, id);
    }
    return id;
  };
}

const config = {
  serializer: {
    createModuleIdFactory: createModuleIdFactory, // 给 bundle 一个id 避免冲突 cli 源码中这个id 是从1 开始 自增的
    processModuleFilter: postProcessModulesFilter, // 返回false 就不会build 进去
  },
};

module.exports = mergeConfig(getDefaultConfig(__dirname), config);
