function asMultipleFilesRamBundle()

in packages/metro/src/ModuleGraph/output/multiple-files-ram-bundle.js [25:96]


function asMultipleFilesRamBundle({
  dependencyMapReservedName,
  filename,
  globalPrefix,
  idsForPath,
  modules,
  requireCalls,
  preloadedModules,
}: $TEMPORARY$object<{
  dependencyMapReservedName?: ?string,
  enableIDInlining: boolean,
  filename: string,
  globalPrefix: string,
  idsForPath: IdsForPathFn,
  modules: Iterable<Module>,
  preloadedModules: Set<string>,
  ramGroupHeads: ?$ReadOnlyArray<string>,
  requireCalls: Iterable<Module>,
  segmentID: number,
  sourceMapPath?: ?string,
}>): OutputResult<IndexMap> {
  const idForPath = (x: {path: string, ...}) => idsForPath(x).moduleId;
  const [startup, deferred] = partition(modules, preloadedModules);
  const startupModules = [...startup, ...requireCalls];
  const deferredModules = deferred.map((m: Module) =>
    toModuleTransport(m, idsForPath, {dependencyMapReservedName, globalPrefix}),
  );
  const magicFileContents = Buffer.alloc(4);

  // Just concatenate all startup modules, one after the other.
  const code = startupModules
    .map(
      (m: Module) =>
        getModuleCodeAndMap(m, idForPath, {
          dependencyMapReservedName,
          enableIDInlining: true,
          globalPrefix,
        }).moduleCode,
    )
    .join('\n');

  // Write one file per module, wrapped with __d() call if it proceeds.
  const extraFiles = new Map();
  deferredModules.forEach(deferredModule => {
    extraFiles.set(
      path.join(JS_MODULES, deferredModule.id + '.js'),
      deferredModule.code,
    );
  });

  // Prepare and write magic number file.
  magicFileContents.writeUInt32LE(MAGIC_UNBUNDLE_NUMBER, 0);
  extraFiles.set(
    path.join(JS_MODULES, MAGIC_UNBUNDLE_FILENAME),
    magicFileContents,
  );

  // Create the source map (with no module groups, as they are ignored).
  const map = buildSourcemapWithMetadata({
    fixWrapperOffset: false,
    lazyModules: deferredModules,
    moduleGroups: null,
    startupModules: startupModules.map((m: Module) =>
      toModuleTransport(m, idsForPath, {
        dependencyMapReservedName,
        globalPrefix,
      }),
    ),
  });

  return {code, extraFiles, map};
}