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