function combineMaps()

in packages/metro/src/shared/output/RamBundle/util.js [79:135]


function combineMaps(
  modules: $ReadOnlyArray<ModuleTransportLike>,
  offsets: ?Array<number>,
  moduleGroups: ?ModuleGroups,
  options: ?CombineOptions,
): Array<IndexMapSection> {
  const sections = [];

  let line = 0;
  modules.forEach((moduleTransport: ModuleTransportLike) => {
    const {code, id, name} = moduleTransport;
    let column = 0;
    let group;
    let groupLines = 0;
    let {map} = moduleTransport;

    if (moduleGroups && moduleGroups.modulesInGroups.has(id)) {
      // this is a module appended to another module
      return;
    }

    if (offsets != null) {
      group = moduleGroups && moduleGroups.groups.get(id);
      if (group && moduleGroups) {
        const {modulesById} = moduleGroups;
        const otherModules: $ReadOnlyArray<ModuleTransportLike> = Array.from(
          group || [],
        )
          .map((moduleId: number) => modulesById.get(moduleId))
          .filter(Boolean); // needed to appease flow
        otherModules.forEach((m: ModuleTransportLike) => {
          groupLines += countLines(m.code);
        });
        map = combineSourceMaps([moduleTransport].concat(otherModules));
      }

      column = options && options.fixWrapperOffset ? wrapperEnd(code) : 0;
    }

    invariant(
      !Array.isArray(map),
      'Random Access Bundle source maps cannot be built from raw mappings',
    );
    sections.push(
      Section(line, column, map || lineToLineSourceMap(code, name)),
    );
    if (offsets != null && id != null) {
      offsets[id] = line;
      for (const moduleId of group || []) {
        offsets[moduleId] = line;
      }
    }
    line += countLines(code) + groupLines;
  });

  return sections;
}