/** * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * @flow * @format */ 'use strict'; import type {Ast} from '@babel/core'; import type {BabelSourceMap} from '@babel/core'; import type {FBSourceMap, MetroSourceMap} from 'metro-source-map'; import type {TransformResultDependency} from 'metro/src/DeltaBundler'; export type BuildResult = GraphResult; export type Callback<A = void, B = void> = (Error => void) & ((null | void, A, B) => void); export type Dependency = {| id: string, +isAsync: boolean, +isPrefetchOnly: boolean, path: string, |}; export type File = {| code: string, map: ?BabelSourceMap, path: string, type: CodeFileTypes, libraryIdx: ?number, soundResources?: ?Array<string>, |}; type CodeFileTypes = 'module' | 'script'; export type GraphFn = ( entryPoints: Iterable<string>, // platform: string, ) => GraphResult; export type GraphResult = {| entryModules: Array<Module>, modules: Array<Module>, |}; export type ModuleIds = {| /** * The module ID is global across all bundles and identifies the module * uniquely. This is useful to cache modules that has been loaded already at * the app level. */ +moduleId: number, /** * The local ID is local to each bundle. For example bundle zero may have a * module with local ID 1, and bundle one a module with the same local ID. * This is useful so that RAM bundles tables start at zero, but the `moduleId` * will be used otherwise. */ +localId: number, |}; /** * Indempotent function that gets us the IDs corresponding to a particular * module identified by path. */ export type IdsForPathFn = ({path: string}) => ModuleIds; export type LoadResult = { file: File, dependencies: $ReadOnlyArray<TransformResultDependency>, }; export type LoadFn = (file: string) => LoadResult; export type Module = {| dependencies: Array<Dependency>, file: File, |}; export type PostProcessModules = ( modules: $ReadOnlyArray<Module>, entryPoints: Array<string>, ) => $ReadOnlyArray<Module>; export type OutputFn< M: FBSourceMap | MetroSourceMap = FBSourceMap | MetroSourceMap, > = ({| filename: string, idsForPath: IdsForPathFn, modules: Iterable<Module>, requireCalls: Iterable<Module>, sourceMapPath?: ?string, bundleOrderFile?: ?string, enableIDInlining: boolean, segmentID: number, |}) => OutputResult<M>; type OutputResult<M: FBSourceMap | MetroSourceMap> = {| code: string | Buffer, extraFiles?: Iterable<[string, string | Buffer]>, map: M, |}; export type PackageData = {| browser?: Object | string, main?: string, name?: string, 'react-native'?: Object | string, |}; export type ResolveFn = (id: string, source: ?string) => string; export type TransformerResult = {| ast: ?Ast, code: string, map: ?BabelSourceMap, |}; export type TransformResult = {| code: string, dependencies: $ReadOnlyArray<TransformResultDependency>, dependencyMapName?: string, map: ?BabelSourceMap, requireName: string, soundResources?: ?Array<string>, importNames?: {all: string, default: string}, |}; export type TransformResults = {[string]: TransformResult}; export type TransformVariants = {+[name: string]: {}}; export type TransformedCodeFile = {| +file: string, +hasteID: ?string, package?: PackageData, +transformed: TransformResults, +type: CodeFileTypes, |}; export type ImageSize = {|+width: number, +height: number|}; export type AssetFile = {| /** * The path of the asset that is shared by all potential variants * of this asset. For example `foo/bar@3x.png` would have the * asset path `foo/bar.png`. */ +assetPath: string, /** * The content is encoded in Base64 so that it can be stored in JSON files, * that are used to communicate between different commands of a Buck * build worker, for example. */ +contentBase64: string, /** * Guessed from the file extension, for example `png` or `html`. */ +contentType: string, /** * Hash of the asset file content. */ +hash: string, /** * The path of the original file for this asset. For example * `foo/bar@3x.ios.png`. This is most useful for reporting purposes, such as * error messages. */ +filePath: string, /** * If the asset is an image, this contain the size in physical pixels (ie. * regarless of whether it's a `@2x` or `@3x` version of a smaller image). */ +physicalSize: ?ImageSize, /** * The platform this asset is designed for, for example `ios` if the file name * is `foo.ios.js`. `null` if the asset is not platform-specific. */ +platform: ?string, /** * The scale this asset is designed for, for example `2` * if the file name is `foo@2x.png`. */ +scale: number, |}; export type TransformedSourceFile = | {| +type: 'code', +details: TransformedCodeFile, |} | {| +type: 'asset', +details: AssetFile, |} | {| +type: 'unknown', |}; export type LibraryOptions = {| dependencies?: Array<string>, optimize: boolean, platform?: string, rebasePath: string => string, |}; export type Base64Content = string; export type AssetContents = { +data: Base64Content, +outputPath: string, }; export type AssetContentsByPath = { +[moduleFilePath: string]: $ReadOnlyArray<AssetContents>, }; export type ResolvedCodeFile = {| +codeFile: TransformedCodeFile, /** * Imagine we have a source file that contains a `require('foo')`. The library * will resolve the path of the module `foo` and store it in this field along * all the other dependencies. For example, it could be * `{'foo': 'bar/foo.js', 'bar': 'node_modules/bar/index.js'}`. */ +filePathsByDependencyName: {[dependencyName: string]: string}, |}; export type LibraryBoundCodeFile = {| ...ResolvedCodeFile, /** * Index of the library that this code file has been exported from. */ +libraryIdx: number, |}; /** * Describe a set of JavaScript files and the associated assets. It could be * depending on modules from other libraries. To be able to resolve these * dependencies, these libraries need to be provided by callsites (ex. Buck). */ export type Library = {| +files: Array<TransformedCodeFile>, /* cannot be a Map because it's JSONified later on */ +assets: AssetContentsByPath, |}; /** * Just like a `Library`, but it also contains module resolutions. For example * if there is a `require('foo')` in some JavaScript file, we keep track of the * path it resolves to, ex. `beep/glo/foo.js`. */ export type ResolvedLibrary = {| +files: $ReadOnlyArray<ResolvedCodeFile>, /* cannot be a Map because it's JSONified later on */ +assets: AssetContentsByPath, |};