1import { getAssetByID } from 'react-native/Libraries/Image/AssetRegistry';
2
3import AssetSourceResolver, { ResolvedAssetSource } from './AssetSourceResolver';
4
5let _customSourceTransformer;
6
7export function setCustomSourceTransformer(
8  transformer: (resolver: AssetSourceResolver) => ResolvedAssetSource
9): void {
10  _customSourceTransformer = transformer;
11}
12
13/**
14 * `source` is either a number (opaque type returned by require('./foo.png'))
15 * or an `ImageSource` like { uri: '<http location || file path>' }
16 */
17export default function resolveAssetSource(source: any): ResolvedAssetSource | undefined {
18  if (typeof source === 'object') {
19    return source;
20  }
21
22  const asset = getAssetByID(source);
23  if (!asset) {
24    return undefined;
25  }
26
27  const resolver = new AssetSourceResolver(
28    // Doesn't matter since this is removed on web
29    'https://expo.dev',
30    null,
31    asset
32  );
33  if (_customSourceTransformer) {
34    return _customSourceTransformer(resolver);
35  }
36  return resolver.defaultAsset();
37}
38
39Object.defineProperty(resolveAssetSource, 'setCustomSourceTransformer', {
40  get() {
41    return setCustomSourceTransformer;
42  },
43});
44
45export const { pickScale } = AssetSourceResolver;
46