1dc51e206SEvan Baconimport path from 'path';
2dc51e206SEvan Bacon
3e330c216SEvan Baconimport { BundleOutput } from './fork-bundleAsync';
4e330c216SEvan Bacon
5dc51e206SEvan Baconexport type BundlePlatform = 'android' | 'ios';
6dc51e206SEvan Bacon
7dc51e206SEvan Bacontype PlatformMetadataAsset = { path: string; ext: string };
8dc51e206SEvan Bacon
9dc51e206SEvan Bacontype PlatformMetadata = { bundle: string; assets: PlatformMetadataAsset[] };
10dc51e206SEvan Bacon
11dc51e206SEvan Bacontype FileMetadata = {
12dc51e206SEvan Bacon  [key in BundlePlatform]: PlatformMetadata;
13dc51e206SEvan Bacon};
14dc51e206SEvan Bacon
15dc51e206SEvan Baconexport function createMetadataJson({
16dc51e206SEvan Bacon  bundles,
17dc51e206SEvan Bacon  fileNames,
18dc51e206SEvan Bacon}: {
19dc51e206SEvan Bacon  bundles: Partial<Record<BundlePlatform, Pick<BundleOutput, 'assets'>>>;
20dc51e206SEvan Bacon  fileNames: Record<string, string>;
21dc51e206SEvan Bacon}): {
22dc51e206SEvan Bacon  version: 0;
23dc51e206SEvan Bacon  bundler: 'metro';
24dc51e206SEvan Bacon  fileMetadata: FileMetadata;
25dc51e206SEvan Bacon} {
26dc51e206SEvan Bacon  // Build metadata.json
27dc51e206SEvan Bacon  return {
28dc51e206SEvan Bacon    version: 0,
29dc51e206SEvan Bacon    bundler: 'metro',
30dc51e206SEvan Bacon    fileMetadata: Object.entries(bundles).reduce<Record<string, Partial<PlatformMetadata>>>(
31*46f023faSEvan Bacon      (metadata, [platform, bundle]) => {
32*46f023faSEvan Bacon        if (platform === 'web') return metadata;
33*46f023faSEvan Bacon
34*46f023faSEvan Bacon        return {
35dc51e206SEvan Bacon          ...metadata,
36dc51e206SEvan Bacon          [platform]: {
37dc51e206SEvan Bacon            // Get the filename for each platform's bundle.
38dc51e206SEvan Bacon            bundle: path.join('bundles', fileNames[platform]!),
39dc51e206SEvan Bacon            // Collect all of the assets and convert them to the serial format.
40dc51e206SEvan Bacon            assets: bundle.assets
418a424bebSJames Ide              .map(
428a424bebSJames Ide                (asset) =>
43dc51e206SEvan Bacon                  // Each asset has multiple hashes which we convert and then flatten.
441c6b79f1SEvan Bacon                  asset.fileHashes?.map((hash) => ({
45dc51e206SEvan Bacon                    path: path.join('assets', hash),
46dc51e206SEvan Bacon                    ext: asset.type,
47dc51e206SEvan Bacon                  }))
48dc51e206SEvan Bacon              )
491c6b79f1SEvan Bacon              .filter(Boolean)
50dc51e206SEvan Bacon              .flat(),
51dc51e206SEvan Bacon          },
52*46f023faSEvan Bacon        };
53*46f023faSEvan Bacon      },
54dc51e206SEvan Bacon      {}
55dc51e206SEvan Bacon    ) as FileMetadata,
56dc51e206SEvan Bacon  };
57dc51e206SEvan Bacon}
58