expo-asset 8.4.1 → 8.4.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -4
- package/README.md +1 -1
- package/build/Asset.d.ts +68 -4
- package/build/Asset.js +75 -2
- package/build/Asset.js.map +1 -1
- package/build/AssetHooks.d.ts +9 -4
- package/build/AssetHooks.js +10 -4
- package/build/AssetHooks.js.map +1 -1
- package/build/AssetSourceResolver.web.js +2 -2
- package/build/AssetSourceResolver.web.js.map +1 -1
- package/build/AssetSources.js +11 -1
- package/build/AssetSources.js.map +1 -1
- package/build/PlatformUtils.d.ts +2 -0
- package/build/PlatformUtils.js +3 -0
- package/build/PlatformUtils.js.map +1 -1
- package/build/resolveAssetSource.web.js +4 -26
- package/build/resolveAssetSource.web.js.map +1 -1
- package/package.json +2 -2
- package/src/Asset.ts +79 -4
- package/src/AssetHooks.ts +10 -4
- package/src/AssetSourceResolver.web.ts +2 -2
- package/src/AssetSources.ts +15 -1
- package/src/PlatformUtils.ts +5 -0
- package/src/resolveAssetSource.web.ts +5 -29
package/CHANGELOG.md
CHANGED
|
@@ -10,6 +10,18 @@
|
|
|
10
10
|
|
|
11
11
|
### 💡 Others
|
|
12
12
|
|
|
13
|
+
## 8.4.5 — 2021-12-21
|
|
14
|
+
|
|
15
|
+
### 🐛 Bug fixes
|
|
16
|
+
|
|
17
|
+
- Fix an issue preventing the loading of assets using expo-updates manifests during local development. ([#15667](https://github.com/expo/expo/pull/15667)) by [@jonsamp](https://github.com/jonsamp)
|
|
18
|
+
|
|
19
|
+
## 8.4.4 — 2021-11-17
|
|
20
|
+
|
|
21
|
+
### 🐛 Bug fixes
|
|
22
|
+
|
|
23
|
+
- Fix `fromModule` on restrictive (Snack) web environments. ([#14435](https://github.com/expo/expo/pull/14435) by [@IjzerenHein](https://github.com/IjzerenHein))
|
|
24
|
+
|
|
13
25
|
## 8.4.1 — 2021-10-01
|
|
14
26
|
|
|
15
27
|
### 💡 Others
|
|
@@ -20,13 +32,13 @@
|
|
|
20
32
|
|
|
21
33
|
### 🎉 New features
|
|
22
34
|
|
|
23
|
-
- Reapply [#12624](https://github.com/expo/expo/pull/12624)
|
|
35
|
+
- Reapply [#12624](https://github.com/expo/expo/pull/12624) ([#13789](https://github.com/expo/expo/pull/13789) by [@jkhales](https://github.com/jkhales))
|
|
24
36
|
|
|
25
37
|
## 8.3.2 — 2021-04-21
|
|
26
38
|
|
|
27
39
|
### 🎉 New features
|
|
28
40
|
|
|
29
|
-
- Find local assets without extensions.
|
|
41
|
+
- Find local assets without extensions. ([#12624](https://github.com/expo/expo/pull/12624) by [@jkhales](https://github.com/jkhales))
|
|
30
42
|
|
|
31
43
|
## 8.3.1 — 2021-03-23
|
|
32
44
|
|
|
@@ -60,11 +72,11 @@ _This version does not introduce any user-facing changes._
|
|
|
60
72
|
|
|
61
73
|
## 8.1.7 — 2020-05-29
|
|
62
74
|
|
|
63
|
-
|
|
75
|
+
_This version does not introduce any user-facing changes._
|
|
64
76
|
|
|
65
77
|
## 8.1.6 — 2020-05-27
|
|
66
78
|
|
|
67
|
-
|
|
79
|
+
_This version does not introduce any user-facing changes._
|
|
68
80
|
|
|
69
81
|
## 8.1.5
|
|
70
82
|
|
package/README.md
CHANGED
|
@@ -13,7 +13,7 @@ For managed [managed](https://docs.expo.io/versions/latest/introduction/managed-
|
|
|
13
13
|
|
|
14
14
|
# Installation in bare React Native projects
|
|
15
15
|
|
|
16
|
-
For bare React Native projects, you must ensure that you have [installed and configured the `
|
|
16
|
+
For bare React Native projects, you must ensure that you have [installed and configured the `expo` package](https://docs.expo.dev/bare/installing-expo-modules/) before continuing.
|
|
17
17
|
|
|
18
18
|
### Add the package to your npm dependencies
|
|
19
19
|
|
package/build/Asset.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import
|
|
2
|
-
declare type AssetDescriptor = {
|
|
1
|
+
import { AssetMetadata } from './AssetSources';
|
|
2
|
+
export declare type AssetDescriptor = {
|
|
3
3
|
name: string;
|
|
4
4
|
type: string;
|
|
5
5
|
hash?: string | null;
|
|
@@ -11,25 +11,89 @@ declare type DownloadPromiseCallbacks = {
|
|
|
11
11
|
resolve: () => void;
|
|
12
12
|
reject: (error: Error) => void;
|
|
13
13
|
};
|
|
14
|
-
export
|
|
14
|
+
export { AssetMetadata };
|
|
15
|
+
/**
|
|
16
|
+
* The `Asset` class represents an asset in your app. It gives metadata about the asset (such as its
|
|
17
|
+
* name and type) and provides facilities to load the asset data.
|
|
18
|
+
*/
|
|
15
19
|
export declare class Asset {
|
|
20
|
+
/**
|
|
21
|
+
* @private
|
|
22
|
+
*/
|
|
16
23
|
static byHash: {};
|
|
24
|
+
/**
|
|
25
|
+
* @private
|
|
26
|
+
*/
|
|
17
27
|
static byUri: {};
|
|
28
|
+
/**
|
|
29
|
+
* The name of the asset file without the extension. Also without the part from `@` onward in the
|
|
30
|
+
* filename (used to specify scale factor for images).
|
|
31
|
+
*/
|
|
18
32
|
name: string;
|
|
33
|
+
/**
|
|
34
|
+
* The extension of the asset filename.
|
|
35
|
+
*/
|
|
19
36
|
type: string;
|
|
37
|
+
/**
|
|
38
|
+
* The MD5 hash of the asset's data.
|
|
39
|
+
*/
|
|
20
40
|
hash: string | null;
|
|
41
|
+
/**
|
|
42
|
+
* A URI that points to the asset's data on the remote server. When running the published version
|
|
43
|
+
* of your app, this refers to the location on Expo's asset server where Expo has stored your
|
|
44
|
+
* asset. When running the app from Expo CLI during development, this URI points to Expo CLI's
|
|
45
|
+
* server running on your computer and the asset is served directly from your computer.
|
|
46
|
+
*/
|
|
21
47
|
uri: string;
|
|
48
|
+
/**
|
|
49
|
+
* If the asset has been downloaded (by calling [`downloadAsync()`](#downloadasync)), the
|
|
50
|
+
* `file://` URI pointing to the local file on the device that contains the asset data.
|
|
51
|
+
*/
|
|
22
52
|
localUri: string | null;
|
|
53
|
+
/**
|
|
54
|
+
* If the asset is an image, the width of the image data divided by the scale factor. The scale
|
|
55
|
+
* factor is the number after `@` in the filename, or `1` if not present.
|
|
56
|
+
*/
|
|
23
57
|
width: number | null;
|
|
58
|
+
/**
|
|
59
|
+
* If the asset is an image, the height of the image data divided by the scale factor. The scale factor is the number after `@` in the filename, or `1` if not present.
|
|
60
|
+
*/
|
|
24
61
|
height: number | null;
|
|
25
62
|
downloading: boolean;
|
|
26
63
|
downloaded: boolean;
|
|
64
|
+
/**
|
|
65
|
+
* @private
|
|
66
|
+
*/
|
|
27
67
|
_downloadCallbacks: DownloadPromiseCallbacks[];
|
|
28
68
|
constructor({ name, type, hash, uri, width, height }: AssetDescriptor);
|
|
69
|
+
/**
|
|
70
|
+
* A helper that wraps `Asset.fromModule(module).downloadAsync` for convenience.
|
|
71
|
+
* @param moduleId An array of `require('path/to/file')` or external network URLs. Can also be
|
|
72
|
+
* just one module or URL without an Array.
|
|
73
|
+
* @return Returns a Promise that fulfills with an array of `Asset`s when the asset(s) has been
|
|
74
|
+
* saved to disk.
|
|
75
|
+
* @example
|
|
76
|
+
* ```ts
|
|
77
|
+
* const [{ localUri }] = await Asset.loadAsync(require('./assets/snack-icon.png'));
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
29
80
|
static loadAsync(moduleId: number | number[] | string | string[]): Promise<Asset[]>;
|
|
81
|
+
/**
|
|
82
|
+
* Returns the [`Asset`](#asset) instance representing an asset given its module or URL.
|
|
83
|
+
* @param virtualAssetModule The value of `require('path/to/file')` for the asset or external
|
|
84
|
+
* network URL
|
|
85
|
+
* @return The [`Asset`](#asset) instance for the asset.
|
|
86
|
+
*/
|
|
30
87
|
static fromModule(virtualAssetModule: number | string): Asset;
|
|
31
88
|
static fromMetadata(meta: AssetMetadata): Asset;
|
|
32
89
|
static fromURI(uri: string): Asset;
|
|
90
|
+
/**
|
|
91
|
+
* Downloads the asset data to a local file in the device's cache directory. Once the returned
|
|
92
|
+
* promise is fulfilled without error, the [`localUri`](#assetlocaluri) field of this asset points
|
|
93
|
+
* to a local file containing the asset data. The asset is only downloaded if an up-to-date local
|
|
94
|
+
* file for the asset isn't already present due to an earlier download. The downloaded `Asset`
|
|
95
|
+
* will be returned when the promise is resolved.
|
|
96
|
+
* @return Returns a Promise which fulfills with an `Asset` instance.
|
|
97
|
+
*/
|
|
33
98
|
downloadAsync(): Promise<this>;
|
|
34
99
|
}
|
|
35
|
-
export {};
|
package/build/Asset.js
CHANGED
|
@@ -1,23 +1,66 @@
|
|
|
1
1
|
import { Platform } from 'expo-modules-core';
|
|
2
2
|
import { getAssetByID } from './AssetRegistry';
|
|
3
|
-
import
|
|
3
|
+
import { selectAssetSource } from './AssetSources';
|
|
4
4
|
import * as AssetUris from './AssetUris';
|
|
5
5
|
import * as ImageAssets from './ImageAssets';
|
|
6
6
|
import { getLocalAssetUri } from './LocalAssets';
|
|
7
7
|
import { downloadAsync, IS_ENV_WITH_UPDATES_ENABLED } from './PlatformUtils';
|
|
8
8
|
import resolveAssetSource from './resolveAssetSource';
|
|
9
|
+
// @needsAudit
|
|
10
|
+
/**
|
|
11
|
+
* The `Asset` class represents an asset in your app. It gives metadata about the asset (such as its
|
|
12
|
+
* name and type) and provides facilities to load the asset data.
|
|
13
|
+
*/
|
|
9
14
|
export class Asset {
|
|
15
|
+
/**
|
|
16
|
+
* @private
|
|
17
|
+
*/
|
|
10
18
|
static byHash = {};
|
|
19
|
+
/**
|
|
20
|
+
* @private
|
|
21
|
+
*/
|
|
11
22
|
static byUri = {};
|
|
23
|
+
/**
|
|
24
|
+
* The name of the asset file without the extension. Also without the part from `@` onward in the
|
|
25
|
+
* filename (used to specify scale factor for images).
|
|
26
|
+
*/
|
|
12
27
|
name;
|
|
28
|
+
/**
|
|
29
|
+
* The extension of the asset filename.
|
|
30
|
+
*/
|
|
13
31
|
type;
|
|
32
|
+
/**
|
|
33
|
+
* The MD5 hash of the asset's data.
|
|
34
|
+
*/
|
|
14
35
|
hash = null;
|
|
36
|
+
/**
|
|
37
|
+
* A URI that points to the asset's data on the remote server. When running the published version
|
|
38
|
+
* of your app, this refers to the location on Expo's asset server where Expo has stored your
|
|
39
|
+
* asset. When running the app from Expo CLI during development, this URI points to Expo CLI's
|
|
40
|
+
* server running on your computer and the asset is served directly from your computer.
|
|
41
|
+
*/
|
|
15
42
|
uri;
|
|
43
|
+
/**
|
|
44
|
+
* If the asset has been downloaded (by calling [`downloadAsync()`](#downloadasync)), the
|
|
45
|
+
* `file://` URI pointing to the local file on the device that contains the asset data.
|
|
46
|
+
*/
|
|
16
47
|
localUri = null;
|
|
48
|
+
/**
|
|
49
|
+
* If the asset is an image, the width of the image data divided by the scale factor. The scale
|
|
50
|
+
* factor is the number after `@` in the filename, or `1` if not present.
|
|
51
|
+
*/
|
|
17
52
|
width = null;
|
|
53
|
+
/**
|
|
54
|
+
* If the asset is an image, the height of the image data divided by the scale factor. The scale factor is the number after `@` in the filename, or `1` if not present.
|
|
55
|
+
*/
|
|
18
56
|
height = null;
|
|
57
|
+
// @docsMissing
|
|
19
58
|
downloading = false;
|
|
59
|
+
// @docsMissing
|
|
20
60
|
downloaded = false;
|
|
61
|
+
/**
|
|
62
|
+
* @private
|
|
63
|
+
*/
|
|
21
64
|
_downloadCallbacks = [];
|
|
22
65
|
constructor({ name, type, hash = null, uri, width, height }) {
|
|
23
66
|
this.name = name;
|
|
@@ -45,10 +88,29 @@ export class Asset {
|
|
|
45
88
|
}
|
|
46
89
|
}
|
|
47
90
|
}
|
|
91
|
+
// @needsAudit
|
|
92
|
+
/**
|
|
93
|
+
* A helper that wraps `Asset.fromModule(module).downloadAsync` for convenience.
|
|
94
|
+
* @param moduleId An array of `require('path/to/file')` or external network URLs. Can also be
|
|
95
|
+
* just one module or URL without an Array.
|
|
96
|
+
* @return Returns a Promise that fulfills with an array of `Asset`s when the asset(s) has been
|
|
97
|
+
* saved to disk.
|
|
98
|
+
* @example
|
|
99
|
+
* ```ts
|
|
100
|
+
* const [{ localUri }] = await Asset.loadAsync(require('./assets/snack-icon.png'));
|
|
101
|
+
* ```
|
|
102
|
+
*/
|
|
48
103
|
static loadAsync(moduleId) {
|
|
49
104
|
const moduleIds = Array.isArray(moduleId) ? moduleId : [moduleId];
|
|
50
105
|
return Promise.all(moduleIds.map((moduleId) => Asset.fromModule(moduleId).downloadAsync()));
|
|
51
106
|
}
|
|
107
|
+
// @needsAudit
|
|
108
|
+
/**
|
|
109
|
+
* Returns the [`Asset`](#asset) instance representing an asset given its module or URL.
|
|
110
|
+
* @param virtualAssetModule The value of `require('path/to/file')` for the asset or external
|
|
111
|
+
* network URL
|
|
112
|
+
* @return The [`Asset`](#asset) instance for the asset.
|
|
113
|
+
*/
|
|
52
114
|
static fromModule(virtualAssetModule) {
|
|
53
115
|
if (typeof virtualAssetModule === 'string') {
|
|
54
116
|
return Asset.fromURI(virtualAssetModule);
|
|
@@ -82,6 +144,7 @@ export class Asset {
|
|
|
82
144
|
}
|
|
83
145
|
return Asset.fromMetadata(meta);
|
|
84
146
|
}
|
|
147
|
+
// @docsMissing
|
|
85
148
|
static fromMetadata(meta) {
|
|
86
149
|
// The hash of the whole asset, not to be confused with the hash of a specific file returned
|
|
87
150
|
// from `selectAssetSource`
|
|
@@ -89,7 +152,7 @@ export class Asset {
|
|
|
89
152
|
if (Asset.byHash[metaHash]) {
|
|
90
153
|
return Asset.byHash[metaHash];
|
|
91
154
|
}
|
|
92
|
-
const { uri, hash } =
|
|
155
|
+
const { uri, hash } = selectAssetSource(meta);
|
|
93
156
|
const asset = new Asset({
|
|
94
157
|
name: meta.name,
|
|
95
158
|
type: meta.type,
|
|
@@ -101,6 +164,7 @@ export class Asset {
|
|
|
101
164
|
Asset.byHash[metaHash] = asset;
|
|
102
165
|
return asset;
|
|
103
166
|
}
|
|
167
|
+
// @docsMissing
|
|
104
168
|
static fromURI(uri) {
|
|
105
169
|
if (Asset.byUri[uri]) {
|
|
106
170
|
return Asset.byUri[uri];
|
|
@@ -123,6 +187,15 @@ export class Asset {
|
|
|
123
187
|
Asset.byUri[uri] = asset;
|
|
124
188
|
return asset;
|
|
125
189
|
}
|
|
190
|
+
// @needsAudit
|
|
191
|
+
/**
|
|
192
|
+
* Downloads the asset data to a local file in the device's cache directory. Once the returned
|
|
193
|
+
* promise is fulfilled without error, the [`localUri`](#assetlocaluri) field of this asset points
|
|
194
|
+
* to a local file containing the asset data. The asset is only downloaded if an up-to-date local
|
|
195
|
+
* file for the asset isn't already present due to an earlier download. The downloaded `Asset`
|
|
196
|
+
* will be returned when the promise is resolved.
|
|
197
|
+
* @return Returns a Promise which fulfills with an `Asset` instance.
|
|
198
|
+
*/
|
|
126
199
|
async downloadAsync() {
|
|
127
200
|
if (this.downloaded) {
|
|
128
201
|
return this;
|
package/build/Asset.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Asset.js","sourceRoot":"","sources":["../src/Asset.ts"],"names":[],"mappings":"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","sourcesContent":["import { Platform } from 'expo-modules-core';\n\nimport { getAssetByID } from './AssetRegistry';\nimport * as AssetSources from './AssetSources';\nimport * as AssetUris from './AssetUris';\nimport * as ImageAssets from './ImageAssets';\nimport { getLocalAssetUri } from './LocalAssets';\nimport { downloadAsync, IS_ENV_WITH_UPDATES_ENABLED } from './PlatformUtils';\nimport resolveAssetSource from './resolveAssetSource';\n\ntype AssetDescriptor = {\n name: string;\n type: string;\n hash?: string | null;\n uri: string;\n width?: number | null;\n height?: number | null;\n};\n\ntype DownloadPromiseCallbacks = {\n resolve: () => void;\n reject: (error: Error) => void;\n};\n\nexport type AssetMetadata = AssetSources.AssetMetadata;\n\nexport class Asset {\n static byHash = {};\n static byUri = {};\n\n name: string;\n type: string;\n hash: string | null = null;\n uri: string;\n localUri: string | null = null;\n width: number | null = null;\n height: number | null = null;\n downloading: boolean = false;\n downloaded: boolean = false;\n _downloadCallbacks: DownloadPromiseCallbacks[] = [];\n\n constructor({ name, type, hash = null, uri, width, height }: AssetDescriptor) {\n this.name = name;\n this.type = type;\n this.hash = hash;\n this.uri = uri;\n\n if (typeof width === 'number') {\n this.width = width;\n }\n if (typeof height === 'number') {\n this.height = height;\n }\n\n if (hash) {\n this.localUri = getLocalAssetUri(hash, type);\n if (this.localUri) {\n this.downloaded = true;\n }\n }\n\n if (Platform.OS === 'web') {\n if (!name) {\n this.name = AssetUris.getFilename(uri);\n }\n if (!type) {\n this.type = AssetUris.getFileExtension(uri);\n }\n }\n }\n\n static loadAsync(moduleId: number | number[] | string | string[]): Promise<Asset[]> {\n const moduleIds = Array.isArray(moduleId) ? moduleId : [moduleId];\n return Promise.all(moduleIds.map((moduleId) => Asset.fromModule(moduleId).downloadAsync()));\n }\n\n static fromModule(virtualAssetModule: number | string): Asset {\n if (typeof virtualAssetModule === 'string') {\n return Asset.fromURI(virtualAssetModule);\n }\n\n const meta = getAssetByID(virtualAssetModule);\n if (!meta) {\n throw new Error(`Module \"${virtualAssetModule}\" is missing from the asset registry`);\n }\n\n // Outside of the managed env we need the moduleId to initialize the asset\n // because resolveAssetSource depends on it\n if (!IS_ENV_WITH_UPDATES_ENABLED) {\n const { uri } = resolveAssetSource(virtualAssetModule);\n const asset = new Asset({\n name: meta.name,\n type: meta.type,\n hash: meta.hash,\n uri,\n width: meta.width,\n height: meta.height,\n });\n\n // TODO: FileSystem should probably support 'downloading' from drawable\n // resources But for now it doesn't (it only supports raw resources) and\n // React Native's Image works fine with drawable resource names for\n // images.\n if (Platform.OS === 'android' && !uri.includes(':') && (meta.width || meta.height)) {\n asset.localUri = asset.uri;\n asset.downloaded = true;\n }\n\n Asset.byHash[meta.hash] = asset;\n return asset;\n }\n\n return Asset.fromMetadata(meta);\n }\n\n static fromMetadata(meta: AssetMetadata): Asset {\n // The hash of the whole asset, not to be confused with the hash of a specific file returned\n // from `selectAssetSource`\n const metaHash = meta.hash;\n if (Asset.byHash[metaHash]) {\n return Asset.byHash[metaHash];\n }\n\n const { uri, hash } = AssetSources.selectAssetSource(meta);\n const asset = new Asset({\n name: meta.name,\n type: meta.type,\n hash,\n uri,\n width: meta.width,\n height: meta.height,\n });\n Asset.byHash[metaHash] = asset;\n return asset;\n }\n\n static fromURI(uri: string): Asset {\n if (Asset.byUri[uri]) {\n return Asset.byUri[uri];\n }\n\n // Possibly a Base64-encoded URI\n let type = '';\n if (uri.indexOf(';base64') > -1) {\n type = uri.split(';')[0].split('/')[1];\n } else {\n const extension = AssetUris.getFileExtension(uri);\n type = extension.startsWith('.') ? extension.substring(1) : extension;\n }\n\n const asset = new Asset({\n name: '',\n type,\n hash: null,\n uri,\n });\n\n Asset.byUri[uri] = asset;\n\n return asset;\n }\n\n async downloadAsync(): Promise<this> {\n if (this.downloaded) {\n return this;\n }\n if (this.downloading) {\n await new Promise<void>((resolve, reject) => {\n this._downloadCallbacks.push({ resolve, reject });\n });\n return this;\n }\n this.downloading = true;\n\n try {\n if (Platform.OS === 'web') {\n if (ImageAssets.isImageType(this.type)) {\n const { width, height, name } = await ImageAssets.getImageInfoAsync(this.uri);\n this.width = width;\n this.height = height;\n this.name = name;\n } else {\n this.name = AssetUris.getFilename(this.uri);\n }\n }\n this.localUri = await downloadAsync(this.uri, this.hash, this.type, this.name);\n\n this.downloaded = true;\n this._downloadCallbacks.forEach(({ resolve }) => resolve());\n } catch (e) {\n this._downloadCallbacks.forEach(({ reject }) => reject(e));\n throw e;\n } finally {\n this.downloading = false;\n this._downloadCallbacks = [];\n }\n return this;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Asset.js","sourceRoot":"","sources":["../src/Asset.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAiB,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,KAAK,SAAS,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,WAAW,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AAC7E,OAAO,kBAAkB,MAAM,sBAAsB,CAAC;AAmBtD,cAAc;AACd;;;GAGG;AACH,MAAM,OAAO,KAAK;IAChB;;OAEG;IACH,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC;IACnB;;OAEG;IACH,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC;IAElB;;;OAGG;IACH,IAAI,CAAS;IACb;;OAEG;IACH,IAAI,CAAS;IACb;;OAEG;IACH,IAAI,GAAkB,IAAI,CAAC;IAC3B;;;;;OAKG;IACH,GAAG,CAAS;IACZ;;;OAGG;IACH,QAAQ,GAAkB,IAAI,CAAC;IAC/B;;;OAGG;IACH,KAAK,GAAkB,IAAI,CAAC;IAC5B;;OAEG;IACH,MAAM,GAAkB,IAAI,CAAC;IAC7B,eAAe;IACf,WAAW,GAAY,KAAK,CAAC;IAC7B,eAAe;IACf,UAAU,GAAY,KAAK,CAAC;IAE5B;;OAEG;IACH,kBAAkB,GAA+B,EAAE,CAAC;IAEpD,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAmB;QAC1E,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QAEf,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YAC7B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;SACpB;QACD,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;YAC9B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;SACtB;QAED,IAAI,IAAI,EAAE;YACR,IAAI,CAAC,QAAQ,GAAG,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC7C,IAAI,IAAI,CAAC,QAAQ,EAAE;gBACjB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;aACxB;SACF;QAED,IAAI,QAAQ,CAAC,EAAE,KAAK,KAAK,EAAE;YACzB,IAAI,CAAC,IAAI,EAAE;gBACT,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;aACxC;YACD,IAAI,CAAC,IAAI,EAAE;gBACT,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;aAC7C;SACF;IACH,CAAC;IAED,cAAc;IACd;;;;;;;;;;OAUG;IACH,MAAM,CAAC,SAAS,CAAC,QAA+C;QAC9D,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAClE,OAAO,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;IAC9F,CAAC;IAED,cAAc;IACd;;;;;OAKG;IACH,MAAM,CAAC,UAAU,CAAC,kBAAmC;QACnD,IAAI,OAAO,kBAAkB,KAAK,QAAQ,EAAE;YAC1C,OAAO,KAAK,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;SAC1C;QAED,MAAM,IAAI,GAAG,YAAY,CAAC,kBAAkB,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,EAAE;YACT,MAAM,IAAI,KAAK,CAAC,WAAW,kBAAkB,sCAAsC,CAAC,CAAC;SACtF;QAED,0EAA0E;QAC1E,2CAA2C;QAC3C,IAAI,CAAC,2BAA2B,EAAE;YAChC,MAAM,EAAE,GAAG,EAAE,GAAG,kBAAkB,CAAC,kBAAkB,CAAC,CAAC;YACvD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;gBACtB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,GAAG;gBACH,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAC;YAEH,uEAAuE;YACvE,wEAAwE;YACxE,mEAAmE;YACnE,UAAU;YACV,IAAI,QAAQ,CAAC,EAAE,KAAK,SAAS,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE;gBAClF,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC;gBAC3B,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC;aACzB;YAED,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;YAChC,OAAO,KAAK,CAAC;SACd;QAED,OAAO,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,eAAe;IACf,MAAM,CAAC,YAAY,CAAC,IAAmB;QACrC,4FAA4F;QAC5F,2BAA2B;QAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC;QAC3B,IAAI,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;YAC1B,OAAO,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;SAC/B;QAED,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;YACtB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI;YACJ,GAAG;YACH,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CAAC;QACH,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;QAC/B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,eAAe;IACf,MAAM,CAAC,OAAO,CAAC,GAAW;QACxB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;YACpB,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SACzB;QAED,gCAAgC;QAChC,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,IAAI,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE;YAC/B,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SACxC;aAAM;YACL,MAAM,SAAS,GAAG,SAAS,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;YAClD,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;SACvE;QAED,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;YACtB,IAAI,EAAE,EAAE;YACR,IAAI;YACJ,IAAI,EAAE,IAAI;YACV,GAAG;SACJ,CAAC,CAAC;QAEH,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAEzB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,cAAc;IACd;;;;;;;OAOG;IACH,KAAK,CAAC,aAAa;QACjB,IAAI,IAAI,CAAC,UAAU,EAAE;YACnB,OAAO,IAAI,CAAC;SACb;QACD,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC1C,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YACpD,CAAC,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;SACb;QACD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAExB,IAAI;YACF,IAAI,QAAQ,CAAC,EAAE,KAAK,KAAK,EAAE;gBACzB,IAAI,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;oBACtC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,WAAW,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBAC9E,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;oBACnB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;oBACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;iBAClB;qBAAM;oBACL,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;iBAC7C;aACF;YACD,IAAI,CAAC,QAAQ,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAE/E,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;SAC7D;QAAC,OAAO,CAAC,EAAE;YACV,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3D,MAAM,CAAC,CAAC;SACT;gBAAS;YACR,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;YACzB,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAC;SAC9B;QACD,OAAO,IAAI,CAAC;IACd,CAAC","sourcesContent":["import { Platform } from 'expo-modules-core';\n\nimport { getAssetByID } from './AssetRegistry';\nimport { AssetMetadata, selectAssetSource } from './AssetSources';\nimport * as AssetUris from './AssetUris';\nimport * as ImageAssets from './ImageAssets';\nimport { getLocalAssetUri } from './LocalAssets';\nimport { downloadAsync, IS_ENV_WITH_UPDATES_ENABLED } from './PlatformUtils';\nimport resolveAssetSource from './resolveAssetSource';\n\n// @docsMissing\nexport type AssetDescriptor = {\n name: string;\n type: string;\n hash?: string | null;\n uri: string;\n width?: number | null;\n height?: number | null;\n};\n\ntype DownloadPromiseCallbacks = {\n resolve: () => void;\n reject: (error: Error) => void;\n};\n\nexport { AssetMetadata };\n\n// @needsAudit\n/**\n * The `Asset` class represents an asset in your app. It gives metadata about the asset (such as its\n * name and type) and provides facilities to load the asset data.\n */\nexport class Asset {\n /**\n * @private\n */\n static byHash = {};\n /**\n * @private\n */\n static byUri = {};\n\n /**\n * The name of the asset file without the extension. Also without the part from `@` onward in the\n * filename (used to specify scale factor for images).\n */\n name: string;\n /**\n * The extension of the asset filename.\n */\n type: string;\n /**\n * The MD5 hash of the asset's data.\n */\n hash: string | null = null;\n /**\n * A URI that points to the asset's data on the remote server. When running the published version\n * of your app, this refers to the location on Expo's asset server where Expo has stored your\n * asset. When running the app from Expo CLI during development, this URI points to Expo CLI's\n * server running on your computer and the asset is served directly from your computer.\n */\n uri: string;\n /**\n * If the asset has been downloaded (by calling [`downloadAsync()`](#downloadasync)), the\n * `file://` URI pointing to the local file on the device that contains the asset data.\n */\n localUri: string | null = null;\n /**\n * If the asset is an image, the width of the image data divided by the scale factor. The scale\n * factor is the number after `@` in the filename, or `1` if not present.\n */\n width: number | null = null;\n /**\n * If the asset is an image, the height of the image data divided by the scale factor. The scale factor is the number after `@` in the filename, or `1` if not present.\n */\n height: number | null = null;\n // @docsMissing\n downloading: boolean = false;\n // @docsMissing\n downloaded: boolean = false;\n\n /**\n * @private\n */\n _downloadCallbacks: DownloadPromiseCallbacks[] = [];\n\n constructor({ name, type, hash = null, uri, width, height }: AssetDescriptor) {\n this.name = name;\n this.type = type;\n this.hash = hash;\n this.uri = uri;\n\n if (typeof width === 'number') {\n this.width = width;\n }\n if (typeof height === 'number') {\n this.height = height;\n }\n\n if (hash) {\n this.localUri = getLocalAssetUri(hash, type);\n if (this.localUri) {\n this.downloaded = true;\n }\n }\n\n if (Platform.OS === 'web') {\n if (!name) {\n this.name = AssetUris.getFilename(uri);\n }\n if (!type) {\n this.type = AssetUris.getFileExtension(uri);\n }\n }\n }\n\n // @needsAudit\n /**\n * A helper that wraps `Asset.fromModule(module).downloadAsync` for convenience.\n * @param moduleId An array of `require('path/to/file')` or external network URLs. Can also be\n * just one module or URL without an Array.\n * @return Returns a Promise that fulfills with an array of `Asset`s when the asset(s) has been\n * saved to disk.\n * @example\n * ```ts\n * const [{ localUri }] = await Asset.loadAsync(require('./assets/snack-icon.png'));\n * ```\n */\n static loadAsync(moduleId: number | number[] | string | string[]): Promise<Asset[]> {\n const moduleIds = Array.isArray(moduleId) ? moduleId : [moduleId];\n return Promise.all(moduleIds.map((moduleId) => Asset.fromModule(moduleId).downloadAsync()));\n }\n\n // @needsAudit\n /**\n * Returns the [`Asset`](#asset) instance representing an asset given its module or URL.\n * @param virtualAssetModule The value of `require('path/to/file')` for the asset or external\n * network URL\n * @return The [`Asset`](#asset) instance for the asset.\n */\n static fromModule(virtualAssetModule: number | string): Asset {\n if (typeof virtualAssetModule === 'string') {\n return Asset.fromURI(virtualAssetModule);\n }\n\n const meta = getAssetByID(virtualAssetModule);\n if (!meta) {\n throw new Error(`Module \"${virtualAssetModule}\" is missing from the asset registry`);\n }\n\n // Outside of the managed env we need the moduleId to initialize the asset\n // because resolveAssetSource depends on it\n if (!IS_ENV_WITH_UPDATES_ENABLED) {\n const { uri } = resolveAssetSource(virtualAssetModule);\n const asset = new Asset({\n name: meta.name,\n type: meta.type,\n hash: meta.hash,\n uri,\n width: meta.width,\n height: meta.height,\n });\n\n // TODO: FileSystem should probably support 'downloading' from drawable\n // resources But for now it doesn't (it only supports raw resources) and\n // React Native's Image works fine with drawable resource names for\n // images.\n if (Platform.OS === 'android' && !uri.includes(':') && (meta.width || meta.height)) {\n asset.localUri = asset.uri;\n asset.downloaded = true;\n }\n\n Asset.byHash[meta.hash] = asset;\n return asset;\n }\n\n return Asset.fromMetadata(meta);\n }\n\n // @docsMissing\n static fromMetadata(meta: AssetMetadata): Asset {\n // The hash of the whole asset, not to be confused with the hash of a specific file returned\n // from `selectAssetSource`\n const metaHash = meta.hash;\n if (Asset.byHash[metaHash]) {\n return Asset.byHash[metaHash];\n }\n\n const { uri, hash } = selectAssetSource(meta);\n const asset = new Asset({\n name: meta.name,\n type: meta.type,\n hash,\n uri,\n width: meta.width,\n height: meta.height,\n });\n Asset.byHash[metaHash] = asset;\n return asset;\n }\n\n // @docsMissing\n static fromURI(uri: string): Asset {\n if (Asset.byUri[uri]) {\n return Asset.byUri[uri];\n }\n\n // Possibly a Base64-encoded URI\n let type = '';\n if (uri.indexOf(';base64') > -1) {\n type = uri.split(';')[0].split('/')[1];\n } else {\n const extension = AssetUris.getFileExtension(uri);\n type = extension.startsWith('.') ? extension.substring(1) : extension;\n }\n\n const asset = new Asset({\n name: '',\n type,\n hash: null,\n uri,\n });\n\n Asset.byUri[uri] = asset;\n\n return asset;\n }\n\n // @needsAudit\n /**\n * Downloads the asset data to a local file in the device's cache directory. Once the returned\n * promise is fulfilled without error, the [`localUri`](#assetlocaluri) field of this asset points\n * to a local file containing the asset data. The asset is only downloaded if an up-to-date local\n * file for the asset isn't already present due to an earlier download. The downloaded `Asset`\n * will be returned when the promise is resolved.\n * @return Returns a Promise which fulfills with an `Asset` instance.\n */\n async downloadAsync(): Promise<this> {\n if (this.downloaded) {\n return this;\n }\n if (this.downloading) {\n await new Promise<void>((resolve, reject) => {\n this._downloadCallbacks.push({ resolve, reject });\n });\n return this;\n }\n this.downloading = true;\n\n try {\n if (Platform.OS === 'web') {\n if (ImageAssets.isImageType(this.type)) {\n const { width, height, name } = await ImageAssets.getImageInfoAsync(this.uri);\n this.width = width;\n this.height = height;\n this.name = name;\n } else {\n this.name = AssetUris.getFilename(this.uri);\n }\n }\n this.localUri = await downloadAsync(this.uri, this.hash, this.type, this.name);\n\n this.downloaded = true;\n this._downloadCallbacks.forEach(({ resolve }) => resolve());\n } catch (e) {\n this._downloadCallbacks.forEach(({ reject }) => reject(e));\n throw e;\n } finally {\n this.downloading = false;\n this._downloadCallbacks = [];\n }\n return this;\n }\n}\n"]}
|
package/build/AssetHooks.d.ts
CHANGED
|
@@ -4,14 +4,19 @@ import { Asset } from './Asset';
|
|
|
4
4
|
* After the assets are loaded, this hook returns a list of asset instances.
|
|
5
5
|
* If something went wrong when loading the assets, an error is returned.
|
|
6
6
|
*
|
|
7
|
-
* Note, the assets are not "reloaded" when you dynamically change the asset list.
|
|
7
|
+
* > Note, the assets are not "reloaded" when you dynamically change the asset list.
|
|
8
|
+
*
|
|
9
|
+
* @return Returns an array containing:
|
|
10
|
+
* - on the first position, a list of all loaded assets. If they aren't loaded yet, this value is
|
|
11
|
+
* `undefined`.
|
|
12
|
+
* - on the second position, an error which encountered when loading the assets. If there was no
|
|
13
|
+
* error, this value is `undefined`.
|
|
8
14
|
*
|
|
9
|
-
* @see https://docs.expo.io/versions/latest/sdk/asset/
|
|
10
15
|
* @example
|
|
11
16
|
* ```tsx
|
|
12
|
-
* const [assets, error] = useAssets(require('path/to/asset.jpg'));
|
|
17
|
+
* const [assets, error] = useAssets([require('path/to/asset.jpg'), require('path/to/other.png')]);
|
|
13
18
|
*
|
|
14
|
-
* return
|
|
19
|
+
* return assets ? <Image source={assets[0]} /> : null;
|
|
15
20
|
* ```
|
|
16
21
|
*/
|
|
17
22
|
export declare function useAssets(moduleIds: number | number[]): [Asset[] | undefined, Error | undefined];
|
package/build/AssetHooks.js
CHANGED
|
@@ -1,18 +1,24 @@
|
|
|
1
1
|
import { useEffect, useState } from 'react';
|
|
2
2
|
import { Asset } from './Asset';
|
|
3
|
+
// @needsAudit
|
|
3
4
|
/**
|
|
4
5
|
* Downloads and stores one or more assets locally.
|
|
5
6
|
* After the assets are loaded, this hook returns a list of asset instances.
|
|
6
7
|
* If something went wrong when loading the assets, an error is returned.
|
|
7
8
|
*
|
|
8
|
-
* Note, the assets are not "reloaded" when you dynamically change the asset list.
|
|
9
|
+
* > Note, the assets are not "reloaded" when you dynamically change the asset list.
|
|
10
|
+
*
|
|
11
|
+
* @return Returns an array containing:
|
|
12
|
+
* - on the first position, a list of all loaded assets. If they aren't loaded yet, this value is
|
|
13
|
+
* `undefined`.
|
|
14
|
+
* - on the second position, an error which encountered when loading the assets. If there was no
|
|
15
|
+
* error, this value is `undefined`.
|
|
9
16
|
*
|
|
10
|
-
* @see https://docs.expo.io/versions/latest/sdk/asset/
|
|
11
17
|
* @example
|
|
12
18
|
* ```tsx
|
|
13
|
-
* const [assets, error] = useAssets(require('path/to/asset.jpg'));
|
|
19
|
+
* const [assets, error] = useAssets([require('path/to/asset.jpg'), require('path/to/other.png')]);
|
|
14
20
|
*
|
|
15
|
-
* return
|
|
21
|
+
* return assets ? <Image source={assets[0]} /> : null;
|
|
16
22
|
* ```
|
|
17
23
|
*/
|
|
18
24
|
export function useAssets(moduleIds) {
|
package/build/AssetHooks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssetHooks.js","sourceRoot":"","sources":["../src/AssetHooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE5C,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC
|
|
1
|
+
{"version":3,"file":"AssetHooks.js","sourceRoot":"","sources":["../src/AssetHooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE5C,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,cAAc;AACd;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,SAAS,CAAC,SAA4B;IACpD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,EAAW,CAAC;IAChD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,EAAS,CAAC;IAE5C,SAAS,CAAC,GAAG,EAAE;QACb,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC7D,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AACzB,CAAC","sourcesContent":["import { useEffect, useState } from 'react';\n\nimport { Asset } from './Asset';\n\n// @needsAudit\n/**\n * Downloads and stores one or more assets locally.\n * After the assets are loaded, this hook returns a list of asset instances.\n * If something went wrong when loading the assets, an error is returned.\n *\n * > Note, the assets are not \"reloaded\" when you dynamically change the asset list.\n *\n * @return Returns an array containing:\n * - on the first position, a list of all loaded assets. If they aren't loaded yet, this value is\n * `undefined`.\n * - on the second position, an error which encountered when loading the assets. If there was no\n * error, this value is `undefined`.\n *\n * @example\n * ```tsx\n * const [assets, error] = useAssets([require('path/to/asset.jpg'), require('path/to/other.png')]);\n *\n * return assets ? <Image source={assets[0]} /> : null;\n * ```\n */\nexport function useAssets(moduleIds: number | number[]): [Asset[] | undefined, Error | undefined] {\n const [assets, setAssets] = useState<Asset[]>();\n const [error, setError] = useState<Error>();\n\n useEffect(() => {\n Asset.loadAsync(moduleIds).then(setAssets).catch(setError);\n }, []);\n\n return [assets, error];\n}\n"]}
|
|
@@ -14,7 +14,7 @@ function getScaledAssetPath(asset) {
|
|
|
14
14
|
const scale = AssetSourceResolver.pickScale(asset.scales, getScale());
|
|
15
15
|
const scaleSuffix = scale === 1 ? '' : '@' + scale + 'x';
|
|
16
16
|
const assetDir = getBasePath(asset);
|
|
17
|
-
return assetDir + '/' + asset.name + scaleSuffix +
|
|
17
|
+
return assetDir + '/' + asset.name + scaleSuffix + (asset.type ? `.${asset.type}` : '');
|
|
18
18
|
}
|
|
19
19
|
export default class AssetSourceResolver {
|
|
20
20
|
serverUrl;
|
|
@@ -52,7 +52,7 @@ export default class AssetSourceResolver {
|
|
|
52
52
|
return this.fromSource(getScaledAssetPath(this.asset));
|
|
53
53
|
}
|
|
54
54
|
scaledAssetURLNearBundle() {
|
|
55
|
-
const path = this.jsbundleUrl || '
|
|
55
|
+
const path = this.jsbundleUrl || '';
|
|
56
56
|
return this.fromSource(path + getScaledAssetPath(this.asset));
|
|
57
57
|
}
|
|
58
58
|
resourceIdentifierWithoutScale() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssetSourceResolver.web.js","sourceRoot":"","sources":["../src/AssetSourceResolver.web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,SAAS,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAc1C,SAAS,WAAW,CAAC,EAAE,kBAAkB,EAAiB;IACxD,IAAI,kBAAkB,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;QACjC,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;KACrC;IACD,OAAO,kBAAkB,CAAC;AAC5B,CAAC;AAUD,SAAS,QAAQ;IACf,OAAO,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC;AACxC,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAK;IAC/B,MAAM,KAAK,GAAG,mBAAmB,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IACtE,MAAM,WAAW,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,GAAG,GAAG,CAAC;IACzD,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACpC,OAAO,QAAQ,GAAG,GAAG,GAAG,KAAK,CAAC,IAAI,GAAG,WAAW,GAAG,
|
|
1
|
+
{"version":3,"file":"AssetSourceResolver.web.js","sourceRoot":"","sources":["../src/AssetSourceResolver.web.ts"],"names":[],"mappings":"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","sourcesContent":["import { Platform, UnavailabilityError } from 'expo-modules-core';\nimport invariant from 'invariant';\nimport { Dimensions } from 'react-native';\n\ntype PackagerAsset = {\n __packager_asset: boolean;\n fileSystemLocation: string;\n httpServerLocation: string;\n width?: number;\n height?: number;\n scales: number[];\n hash: string;\n name: string;\n type: string;\n};\n\nfunction getBasePath({ httpServerLocation }: PackagerAsset): string {\n if (httpServerLocation[0] === '/') {\n return httpServerLocation.substr(1);\n }\n return httpServerLocation;\n}\n\nexport type ResolvedAssetSource = {\n __packager_asset: boolean;\n width?: number;\n height?: number;\n uri: string;\n scale: number;\n};\n\nfunction getScale(): number {\n return Dimensions.get('window').scale;\n}\n\nfunction getScaledAssetPath(asset): string {\n const scale = AssetSourceResolver.pickScale(asset.scales, getScale());\n const scaleSuffix = scale === 1 ? '' : '@' + scale + 'x';\n const assetDir = getBasePath(asset);\n return assetDir + '/' + asset.name + scaleSuffix + (asset.type ? `.${asset.type}` : '');\n}\n\nexport default class AssetSourceResolver {\n serverUrl?: string | null;\n // where the jsbundle is being run from\n jsbundleUrl?: string | null;\n // the asset to resolve\n asset: PackagerAsset;\n\n constructor(\n serverUrl: string | undefined | null,\n jsbundleUrl: string | undefined | null,\n asset: PackagerAsset\n ) {\n this.serverUrl = serverUrl;\n this.jsbundleUrl = jsbundleUrl;\n this.asset = asset;\n }\n isLoadedFromServer(): boolean {\n return !!this.serverUrl;\n }\n isLoadedFromFileSystem(): boolean {\n return !!(this.jsbundleUrl && this.jsbundleUrl.startsWith('file://'));\n }\n defaultAsset(): ResolvedAssetSource {\n if (this.isLoadedFromServer()) {\n return this.assetServerURL();\n }\n\n return this.scaledAssetURLNearBundle();\n }\n assetServerURL(): ResolvedAssetSource {\n invariant(!!this.serverUrl, 'need server to load from');\n return this.fromSource(\n this.serverUrl +\n getScaledAssetPath(this.asset) +\n '?platform=' +\n Platform.OS +\n '&hash=' +\n this.asset.hash\n );\n }\n scaledAssetPath(): ResolvedAssetSource {\n return this.fromSource(getScaledAssetPath(this.asset));\n }\n scaledAssetURLNearBundle(): ResolvedAssetSource {\n const path = this.jsbundleUrl || '';\n return this.fromSource(path + getScaledAssetPath(this.asset));\n }\n resourceIdentifierWithoutScale(): ResolvedAssetSource {\n throw new UnavailabilityError('react-native', 'resourceIdentifierWithoutScale()');\n }\n drawableFolderInBundle(): ResolvedAssetSource {\n throw new UnavailabilityError('react-native', 'drawableFolderInBundle()');\n }\n fromSource(source: string): ResolvedAssetSource {\n return {\n __packager_asset: true,\n width: this.asset.width,\n height: this.asset.height,\n uri: source,\n scale: AssetSourceResolver.pickScale(this.asset.scales, getScale()),\n };\n }\n\n static pickScale(scales: number[], deviceScale: number): number {\n for (let i = 0; i < scales.length; i++) {\n if (scales[i] >= deviceScale) {\n return scales[i];\n }\n }\n return scales[scales.length - 1] || 1;\n }\n}\n"]}
|
package/build/AssetSources.js
CHANGED
|
@@ -3,7 +3,7 @@ import path from 'path-browserify';
|
|
|
3
3
|
import { PixelRatio } from 'react-native';
|
|
4
4
|
import URL from 'url-parse';
|
|
5
5
|
import AssetSourceResolver from './AssetSourceResolver';
|
|
6
|
-
import { manifestBaseUrl, getManifest } from './PlatformUtils';
|
|
6
|
+
import { manifestBaseUrl, getManifest, getManifest2 } from './PlatformUtils';
|
|
7
7
|
// Fast lookup check if asset map has any overrides in the manifest
|
|
8
8
|
const assetMapOverride = getManifest().assetMapOverride;
|
|
9
9
|
/**
|
|
@@ -42,6 +42,16 @@ export function selectAssetSource(meta) {
|
|
|
42
42
|
const uri = meta.httpServerLocation + suffix;
|
|
43
43
|
return { uri, hash };
|
|
44
44
|
}
|
|
45
|
+
// For assets during development using manifest2, we use the development server's URL origin
|
|
46
|
+
const manifest2 = getManifest2();
|
|
47
|
+
if (manifest2?.extra?.expoGo?.developer) {
|
|
48
|
+
const baseUrl = new URL(`http://${manifest2.extra.expoGo.debuggerHost}`);
|
|
49
|
+
baseUrl.set('pathname', meta.httpServerLocation + suffix);
|
|
50
|
+
return {
|
|
51
|
+
uri: baseUrl.href,
|
|
52
|
+
hash,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
45
55
|
// For assets during development, we use the development server's URL origin
|
|
46
56
|
if (getManifest().developer) {
|
|
47
57
|
const baseUrl = new URL(getManifest().bundleUrl);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssetSources.js","sourceRoot":"","sources":["../src/AssetSources.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,IAAI,MAAM,iBAAiB,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,GAAG,MAAM,WAAW,CAAC;AAE5B,OAAO,mBAAmB,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"AssetSources.js","sourceRoot":"","sources":["../src/AssetSources.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,IAAI,MAAM,iBAAiB,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,GAAG,MAAM,WAAW,CAAC;AAE5B,OAAO,mBAAmB,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAqB7E,mEAAmE;AACnE,MAAM,gBAAgB,GAAG,WAAW,EAAE,CAAC,gBAAgB,CAAC;AAExD;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAmB;IACnD,uDAAuD;IACvD,IAAI,gBAAgB,IAAI,gBAAgB,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QAClE,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;KACpD;IAED,kGAAkG;IAClG,2BAA2B;IAC3B,MAAM,KAAK,GAAG,mBAAmB,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC;IAC3E,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IAExF,6DAA6D;IAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;IAChF,IAAI,GAAG,EAAE;QACP,OAAO,EAAE,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC;KACvC;IAED,uDAAuD;IACvD,MAAM,gBAAgB,GAAG,WAAW,EAAE,CAAC,gBAAgB,CAAC;IACxD,IAAI,gBAAgB,EAAE;QACpB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;QAC9C,OAAO,EAAE,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC;KACvC;IAED,MAAM,SAAS,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC;IAClD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3E,MAAM,MAAM,GAAG,IAAI,kBAAkB,CACnC,IAAI,CAAC,IAAI,CACV,GAAG,SAAS,GAAG,aAAa,aAAa,kBAAkB,CAC1D,QAAQ,CAAC,EAAE,CACZ,SAAS,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAE1C,iGAAiG;IACjG,kDAAkD;IAClD,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE;QAChD,MAAM,GAAG,GAAG,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC;QAC7C,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;KACtB;IAED,4FAA4F;IAC5F,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IAEjC,IAAI,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE;QACvC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,UAAU,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC,CAAC;QAE1D,OAAO;YACL,GAAG,EAAE,OAAO,CAAC,IAAI;YACjB,IAAI;SACL,CAAC;KACH;IAED,4EAA4E;IAC5E,IAAI,WAAW,EAAE,CAAC,SAAS,EAAE;QAC3B,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC,CAAC;QAC1D,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;KACpC;IAED,wDAAwD;IACxD,OAAO;QACL,GAAG,EAAE,iDAAiD,kBAAkB,CAAC,IAAI,CAAC,EAAE;QAChF,IAAI;KACL,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,IAAI,CAAC,eAAe,EAAE;QACpB,OAAO,GAAG,CAAC;KACZ;IAED,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,QAAQ,KAAK,EAAE,EAAE;QACnB,OAAO,GAAG,CAAC;KACZ;IAED,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,CAAC;IACzC,MAAM,YAAY,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAClF,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IACtC,OAAO,OAAO,CAAC,IAAI,CAAC;AACtB,CAAC","sourcesContent":["import { Platform } from 'expo-modules-core';\nimport path from 'path-browserify';\nimport { PixelRatio } from 'react-native';\nimport URL from 'url-parse';\n\nimport AssetSourceResolver from './AssetSourceResolver';\nimport { manifestBaseUrl, getManifest, getManifest2 } from './PlatformUtils';\n\n// @docsMissing\nexport type AssetMetadata = {\n hash: string;\n name: string;\n type: string;\n width?: number;\n height?: number;\n scales: number[];\n httpServerLocation: string;\n uri?: string;\n fileHashes?: string[];\n fileUris?: string[];\n};\n\nexport type AssetSource = {\n uri: string;\n hash: string;\n};\n\n// Fast lookup check if asset map has any overrides in the manifest\nconst assetMapOverride = getManifest().assetMapOverride;\n\n/**\n * Selects the best file for the given asset (ex: choosing the best scale for images) and returns\n * a { uri, hash } pair for the specific asset file.\n *\n * If the asset isn't an image with multiple scales, the first file is selected.\n */\nexport function selectAssetSource(meta: AssetMetadata): AssetSource {\n // Override with the asset map in manifest if available\n if (assetMapOverride && assetMapOverride.hasOwnProperty(meta.hash)) {\n meta = { ...meta, ...assetMapOverride[meta.hash] };\n }\n\n // This logic is based on that of AssetSourceResolver, with additional support for file hashes and\n // explicitly provided URIs\n const scale = AssetSourceResolver.pickScale(meta.scales, PixelRatio.get());\n const index = meta.scales.findIndex((s) => s === scale);\n const hash = meta.fileHashes ? meta.fileHashes[index] || meta.fileHashes[0] : meta.hash;\n\n // Allow asset processors to directly provide the URL to load\n const uri = meta.fileUris ? meta.fileUris[index] || meta.fileUris[0] : meta.uri;\n if (uri) {\n return { uri: resolveUri(uri), hash };\n }\n\n // Check if the assetUrl was overridden in the manifest\n const assetUrlOverride = getManifest().assetUrlOverride;\n if (assetUrlOverride) {\n const uri = path.join(assetUrlOverride, hash);\n return { uri: resolveUri(uri), hash };\n }\n\n const fileScale = scale === 1 ? '' : `@${scale}x`;\n const fileExtension = meta.type ? `.${encodeURIComponent(meta.type)}` : '';\n const suffix = `/${encodeURIComponent(\n meta.name\n )}${fileScale}${fileExtension}?platform=${encodeURIComponent(\n Platform.OS\n )}&hash=${encodeURIComponent(meta.hash)}`;\n\n // For assets with a specified absolute URL, we use the existing origin instead of prepending the\n // development server or production CDN URL origin\n if (/^https?:\\/\\//.test(meta.httpServerLocation)) {\n const uri = meta.httpServerLocation + suffix;\n return { uri, hash };\n }\n\n // For assets during development using manifest2, we use the development server's URL origin\n const manifest2 = getManifest2();\n\n if (manifest2?.extra?.expoGo?.developer) {\n const baseUrl = new URL(`http://${manifest2.extra.expoGo.debuggerHost}`);\n baseUrl.set('pathname', meta.httpServerLocation + suffix);\n\n return {\n uri: baseUrl.href,\n hash,\n };\n }\n\n // For assets during development, we use the development server's URL origin\n if (getManifest().developer) {\n const baseUrl = new URL(getManifest().bundleUrl);\n baseUrl.set('pathname', meta.httpServerLocation + suffix);\n return { uri: baseUrl.href, hash };\n }\n\n // Production CDN URIs are based on each asset file hash\n return {\n uri: `https://d1wp6m56sqw74a.cloudfront.net/~assets/${encodeURIComponent(hash)}`,\n hash,\n };\n}\n\n/**\n * Resolves the given URI to an absolute URI. If the given URI is already an absolute URI, it is\n * simply returned. Otherwise, if it is a relative URI, it is resolved relative to the manifest's\n * base URI.\n */\nexport function resolveUri(uri: string): string {\n if (!manifestBaseUrl) {\n return uri;\n }\n\n const { protocol } = new URL(uri);\n if (protocol !== '') {\n return uri;\n }\n\n const baseUrl = new URL(manifestBaseUrl);\n const resolvedPath = uri.startsWith('/') ? uri : path.join(baseUrl.pathname, uri);\n baseUrl.set('pathname', resolvedPath);\n return baseUrl.href;\n}\n"]}
|
package/build/PlatformUtils.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Manifest } from 'expo-constants/build/Constants.types';
|
|
1
2
|
export declare const IS_MANAGED_ENV: boolean;
|
|
2
3
|
export declare const IS_BARE_ENV_WITH_UPDATES: boolean;
|
|
3
4
|
export declare const IS_ENV_WITH_UPDATES_ENABLED: boolean;
|
|
@@ -6,5 +7,6 @@ export declare function getLocalAssets(): any;
|
|
|
6
7
|
export declare function getManifest(): {
|
|
7
8
|
[key: string]: any;
|
|
8
9
|
};
|
|
10
|
+
export declare function getManifest2(): Manifest | undefined;
|
|
9
11
|
export declare const manifestBaseUrl: string | null;
|
|
10
12
|
export declare function downloadAsync(uri: any, hash: any, type: any, name: any): Promise<string>;
|
package/build/PlatformUtils.js
CHANGED
|
@@ -24,6 +24,9 @@ export function getLocalAssets() {
|
|
|
24
24
|
export function getManifest() {
|
|
25
25
|
return Constants.__unsafeNoWarnManifest ?? {};
|
|
26
26
|
}
|
|
27
|
+
export function getManifest2() {
|
|
28
|
+
return Constants.__unsafeNoWarnManifest2;
|
|
29
|
+
}
|
|
27
30
|
// Compute manifest base URL if available
|
|
28
31
|
export const manifestBaseUrl = Constants.experienceUrl
|
|
29
32
|
? getManifestBaseUrl(Constants.experienceUrl)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlatformUtils.js","sourceRoot":"","sources":["../src/PlatformUtils.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,aAAa,CAAC;AACrC,OAAO,SAAS,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"PlatformUtils.js","sourceRoot":"","sources":["../src/PlatformUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import computeMd5 from 'blueimp-md5';\nimport Constants from 'expo-constants';\nimport { Manifest } from 'expo-constants/build/Constants.types';\nimport * as FileSystem from 'expo-file-system';\nimport { NativeModulesProxy } from 'expo-modules-core';\n\nimport { getManifestBaseUrl } from './AssetUris';\n\n// Constants.appOwnership is only available in managed apps (Expo client and standalone)\nexport const IS_MANAGED_ENV = !!Constants.appOwnership;\n\n// In the future (SDK38+) expo-updates is likely to be used in managed apps, so we decide\n// that you are in a bare app with updates if you're not in a managed app and you have\n// local assets available.\nexport const IS_BARE_ENV_WITH_UPDATES =\n !IS_MANAGED_ENV &&\n !!NativeModulesProxy.ExpoUpdates?.isEnabled &&\n // if expo-updates is installed but we're running directly from the embedded bundle, we don't want\n // to override the AssetSourceResolver\n !NativeModulesProxy.ExpoUpdates?.isUsingEmbeddedAssets;\n\nexport const IS_ENV_WITH_UPDATES_ENABLED = IS_MANAGED_ENV || IS_BARE_ENV_WITH_UPDATES;\n\n// If it's not managed or bare w/ updates, then it must be bare w/o updates!\nexport const IS_BARE_ENV_WITHOUT_UPDATES = !IS_MANAGED_ENV && !IS_BARE_ENV_WITH_UPDATES;\n\n// Get the localAssets property from the ExpoUpdates native module so that we do\n// not need to include expo-updates as a dependency of expo-asset\nexport function getLocalAssets() {\n return NativeModulesProxy.ExpoUpdates?.localAssets ?? {};\n}\n\nexport function getManifest(): { [key: string]: any } {\n return Constants.__unsafeNoWarnManifest ?? {};\n}\n\nexport function getManifest2(): Manifest | undefined {\n return Constants.__unsafeNoWarnManifest2;\n}\n\n// Compute manifest base URL if available\nexport const manifestBaseUrl = Constants.experienceUrl\n ? getManifestBaseUrl(Constants.experienceUrl)\n : null;\n\n// TODO: how should this behave in bare app with updates? re: hashAssetFiles\nexport async function downloadAsync(uri, hash, type, name): Promise<string> {\n if (IS_MANAGED_ENV) {\n return _downloadAsyncManagedEnv(uri, hash, type, name);\n }\n\n return _downloadAsyncUnmanagedEnv(uri, hash, type);\n}\n\n/**\n * Check if the file exists on disk already, perform integrity check if so.\n * Otherwise, download it.\n */\nasync function _downloadAsyncManagedEnv(uri, hash, type, name): Promise<string> {\n const cacheFileId = hash || computeMd5(uri);\n const localUri = `${FileSystem.cacheDirectory}ExponentAsset-${cacheFileId}.${type}`;\n let { exists, md5 } = await FileSystem.getInfoAsync(localUri, {\n md5: true,\n });\n if (!exists || (hash !== null && md5 !== hash)) {\n ({ md5 } = await FileSystem.downloadAsync(uri, localUri, {\n md5: true,\n }));\n if (hash !== null && md5 !== hash) {\n throw new Error(\n `Downloaded file for asset '${name}.${type}' ` +\n `Located at ${uri} ` +\n `failed MD5 integrity check`\n );\n }\n }\n return localUri;\n}\n\n/**\n * Just download the asset, don't perform integrity check because we don't have\n * the hash to compare it with (we don't have hashAssetFiles plugin). Hash is\n * only used for the file name.\n */\nasync function _downloadAsyncUnmanagedEnv(uri, hash, type): Promise<string> {\n // TODO: does this make sense to bail out if it's already at a file URL\n // because it's already available locally?\n if (uri.startsWith('file://')) {\n return uri;\n }\n\n const cacheFileId = hash || computeMd5(uri);\n const localUri = `${FileSystem.cacheDirectory}ExponentAsset-${cacheFileId}.${type}`;\n\n // We don't check the FileSystem for an existing version of the asset and we\n // also don't perform an integrity check!\n await FileSystem.downloadAsync(uri, localUri);\n return localUri;\n}\n"]}
|
|
@@ -3,17 +3,16 @@ import { getAssetByID } from './AssetRegistry';
|
|
|
3
3
|
import AssetSourceResolver from './AssetSourceResolver';
|
|
4
4
|
let _customSourceTransformer;
|
|
5
5
|
let _serverURL;
|
|
6
|
-
let _scriptURL;
|
|
7
6
|
let _sourceCodeScriptURL;
|
|
8
7
|
function getSourceCodeScriptURL() {
|
|
9
8
|
if (_sourceCodeScriptURL) {
|
|
10
9
|
return _sourceCodeScriptURL;
|
|
11
10
|
}
|
|
12
|
-
let sourceCode = nativeExtensions
|
|
11
|
+
let sourceCode = typeof nativeExtensions !== 'undefined' ? nativeExtensions.SourceCode : null;
|
|
13
12
|
if (!sourceCode) {
|
|
14
|
-
sourceCode = NativeModules
|
|
13
|
+
sourceCode = NativeModules?.SourceCode;
|
|
15
14
|
}
|
|
16
|
-
_sourceCodeScriptURL = sourceCode
|
|
15
|
+
_sourceCodeScriptURL = sourceCode?.scriptURL;
|
|
17
16
|
return _sourceCodeScriptURL;
|
|
18
17
|
}
|
|
19
18
|
function getDevServerURL() {
|
|
@@ -31,27 +30,6 @@ function getDevServerURL() {
|
|
|
31
30
|
}
|
|
32
31
|
return _serverURL;
|
|
33
32
|
}
|
|
34
|
-
function _coerceLocalScriptURL(scriptURL) {
|
|
35
|
-
if (scriptURL) {
|
|
36
|
-
if (scriptURL.startsWith('assets://')) {
|
|
37
|
-
// android: running from within assets, no offline path to use
|
|
38
|
-
return null;
|
|
39
|
-
}
|
|
40
|
-
scriptURL = scriptURL.substring(0, scriptURL.lastIndexOf('/') + 1);
|
|
41
|
-
if (!scriptURL.includes('://')) {
|
|
42
|
-
// Add file protocol in case we have an absolute file path and not a URL.
|
|
43
|
-
// This shouldn't really be necessary. scriptURL should be a URL.
|
|
44
|
-
scriptURL = 'file://' + scriptURL;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
return null;
|
|
48
|
-
}
|
|
49
|
-
function getScriptURL() {
|
|
50
|
-
if (_scriptURL === undefined) {
|
|
51
|
-
_scriptURL = _coerceLocalScriptURL(getSourceCodeScriptURL());
|
|
52
|
-
}
|
|
53
|
-
return _scriptURL;
|
|
54
|
-
}
|
|
55
33
|
export function setCustomSourceTransformer(transformer) {
|
|
56
34
|
_customSourceTransformer = transformer;
|
|
57
35
|
}
|
|
@@ -67,7 +45,7 @@ export default function resolveAssetSource(source) {
|
|
|
67
45
|
if (!asset) {
|
|
68
46
|
return undefined;
|
|
69
47
|
}
|
|
70
|
-
const resolver = new AssetSourceResolver(getDevServerURL(),
|
|
48
|
+
const resolver = new AssetSourceResolver(getDevServerURL(), null, asset);
|
|
71
49
|
if (_customSourceTransformer) {
|
|
72
50
|
return _customSourceTransformer(resolver);
|
|
73
51
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolveAssetSource.web.js","sourceRoot":"","sources":["../src/resolveAssetSource.web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,mBAA4C,MAAM,uBAAuB,CAAC;AAIjF,IAAI,wBAAwB,CAAC;AAC7B,IAAI,UAAqC,CAAC;AAC1C,IAAI,
|
|
1
|
+
{"version":3,"file":"resolveAssetSource.web.js","sourceRoot":"","sources":["../src/resolveAssetSource.web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,mBAA4C,MAAM,uBAAuB,CAAC;AAIjF,IAAI,wBAAwB,CAAC;AAC7B,IAAI,UAAqC,CAAC;AAC1C,IAAI,oBAA+C,CAAC;AAEpD,SAAS,sBAAsB;IAC7B,IAAI,oBAAoB,EAAE;QACxB,OAAO,oBAAoB,CAAC;KAC7B;IAED,IAAI,UAAU,GAAG,OAAO,gBAAgB,KAAK,WAAW,CAAC,CAAC,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9F,IAAI,CAAC,UAAU,EAAE;QACf,UAAU,GAAG,aAAa,EAAE,UAAU,CAAC;KACxC;IACD,oBAAoB,GAAG,UAAU,EAAE,SAAS,CAAC;IAC7C,OAAO,oBAAoB,CAAC;AAC9B,CAAC;AAED,SAAS,eAAe;IACtB,IAAI,UAAU,KAAK,SAAS,EAAE;QAC5B,MAAM,mBAAmB,GAAG,sBAAsB,EAAE,CAAC;QACrD,MAAM,KAAK,GAAG,mBAAmB,IAAI,mBAAmB,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACpF,IAAI,KAAK,EAAE;YACT,mCAAmC;YACnC,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;SACvB;aAAM;YACL,gCAAgC;YAChC,UAAU,GAAG,IAAI,CAAC;SACnB;KACF;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,WAAmE;IAEnE,wBAAwB,GAAG,WAAW,CAAC;AACzC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,MAAW;IACpD,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;QAC9B,OAAO,MAAM,CAAC;KACf;IAED,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACnC,IAAI,CAAC,KAAK,EAAE;QACV,OAAO,SAAS,CAAC;KAClB;IAED,MAAM,QAAQ,GAAG,IAAI,mBAAmB,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IACzE,IAAI,wBAAwB,EAAE;QAC5B,OAAO,wBAAwB,CAAC,QAAQ,CAAC,CAAC;KAC3C;IACD,OAAO,QAAQ,CAAC,YAAY,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,CAAC,cAAc,CAAC,kBAAkB,EAAE,4BAA4B,EAAE;IACtE,GAAG;QACD,OAAO,0BAA0B,CAAC;IACpC,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,mBAAmB,CAAC","sourcesContent":["import { NativeModules } from 'react-native';\n\nimport { getAssetByID } from './AssetRegistry';\nimport AssetSourceResolver, { ResolvedAssetSource } from './AssetSourceResolver';\n\ndeclare let nativeExtensions: { SourceCode?: { scriptURL: string } } | undefined;\n\nlet _customSourceTransformer;\nlet _serverURL: string | undefined | null;\nlet _sourceCodeScriptURL: string | undefined | null;\n\nfunction getSourceCodeScriptURL(): string | undefined | null {\n if (_sourceCodeScriptURL) {\n return _sourceCodeScriptURL;\n }\n\n let sourceCode = typeof nativeExtensions !== 'undefined' ? nativeExtensions.SourceCode : null;\n if (!sourceCode) {\n sourceCode = NativeModules?.SourceCode;\n }\n _sourceCodeScriptURL = sourceCode?.scriptURL;\n return _sourceCodeScriptURL;\n}\n\nfunction getDevServerURL(): string | null {\n if (_serverURL === undefined) {\n const sourceCodeScriptURL = getSourceCodeScriptURL();\n const match = sourceCodeScriptURL && sourceCodeScriptURL.match(/^https?:\\/\\/.*?\\//);\n if (match) {\n // jsBundle was loaded from network\n _serverURL = match[0];\n } else {\n // jsBundle was loaded from file\n _serverURL = null;\n }\n }\n return _serverURL;\n}\n\nexport function setCustomSourceTransformer(\n transformer: (resolver: AssetSourceResolver) => ResolvedAssetSource\n): void {\n _customSourceTransformer = transformer;\n}\n\n/**\n * `source` is either a number (opaque type returned by require('./foo.png'))\n * or an `ImageSource` like { uri: '<http location || file path>' }\n */\nexport default function resolveAssetSource(source: any): ResolvedAssetSource | undefined {\n if (typeof source === 'object') {\n return source;\n }\n\n const asset = getAssetByID(source);\n if (!asset) {\n return undefined;\n }\n\n const resolver = new AssetSourceResolver(getDevServerURL(), null, asset);\n if (_customSourceTransformer) {\n return _customSourceTransformer(resolver);\n }\n return resolver.defaultAsset();\n}\n\nObject.defineProperty(resolveAssetSource, 'setCustomSourceTransformer', {\n get() {\n return setCustomSourceTransformer;\n },\n});\n\nexport const { pickScale } = AssetSourceResolver;\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "expo-asset",
|
|
3
|
-
"version": "8.4.
|
|
3
|
+
"version": "8.4.5",
|
|
4
4
|
"description": "An Expo universal module to download assets and pass them into other APIs",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"types": "build/index.d.ts",
|
|
@@ -48,5 +48,5 @@
|
|
|
48
48
|
"@types/url-parse": "^1.4.1",
|
|
49
49
|
"expo-module-scripts": "^2.0.0"
|
|
50
50
|
},
|
|
51
|
-
"gitHead": "
|
|
51
|
+
"gitHead": "3ac0ad398f8013472dfbbc9613955456eeeb44b5"
|
|
52
52
|
}
|
package/src/Asset.ts
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { Platform } from 'expo-modules-core';
|
|
2
2
|
|
|
3
3
|
import { getAssetByID } from './AssetRegistry';
|
|
4
|
-
import
|
|
4
|
+
import { AssetMetadata, selectAssetSource } from './AssetSources';
|
|
5
5
|
import * as AssetUris from './AssetUris';
|
|
6
6
|
import * as ImageAssets from './ImageAssets';
|
|
7
7
|
import { getLocalAssetUri } from './LocalAssets';
|
|
8
8
|
import { downloadAsync, IS_ENV_WITH_UPDATES_ENABLED } from './PlatformUtils';
|
|
9
9
|
import resolveAssetSource from './resolveAssetSource';
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
// @docsMissing
|
|
12
|
+
export type AssetDescriptor = {
|
|
12
13
|
name: string;
|
|
13
14
|
type: string;
|
|
14
15
|
hash?: string | null;
|
|
@@ -22,21 +23,65 @@ type DownloadPromiseCallbacks = {
|
|
|
22
23
|
reject: (error: Error) => void;
|
|
23
24
|
};
|
|
24
25
|
|
|
25
|
-
export
|
|
26
|
+
export { AssetMetadata };
|
|
26
27
|
|
|
28
|
+
// @needsAudit
|
|
29
|
+
/**
|
|
30
|
+
* The `Asset` class represents an asset in your app. It gives metadata about the asset (such as its
|
|
31
|
+
* name and type) and provides facilities to load the asset data.
|
|
32
|
+
*/
|
|
27
33
|
export class Asset {
|
|
34
|
+
/**
|
|
35
|
+
* @private
|
|
36
|
+
*/
|
|
28
37
|
static byHash = {};
|
|
38
|
+
/**
|
|
39
|
+
* @private
|
|
40
|
+
*/
|
|
29
41
|
static byUri = {};
|
|
30
42
|
|
|
43
|
+
/**
|
|
44
|
+
* The name of the asset file without the extension. Also without the part from `@` onward in the
|
|
45
|
+
* filename (used to specify scale factor for images).
|
|
46
|
+
*/
|
|
31
47
|
name: string;
|
|
48
|
+
/**
|
|
49
|
+
* The extension of the asset filename.
|
|
50
|
+
*/
|
|
32
51
|
type: string;
|
|
52
|
+
/**
|
|
53
|
+
* The MD5 hash of the asset's data.
|
|
54
|
+
*/
|
|
33
55
|
hash: string | null = null;
|
|
56
|
+
/**
|
|
57
|
+
* A URI that points to the asset's data on the remote server. When running the published version
|
|
58
|
+
* of your app, this refers to the location on Expo's asset server where Expo has stored your
|
|
59
|
+
* asset. When running the app from Expo CLI during development, this URI points to Expo CLI's
|
|
60
|
+
* server running on your computer and the asset is served directly from your computer.
|
|
61
|
+
*/
|
|
34
62
|
uri: string;
|
|
63
|
+
/**
|
|
64
|
+
* If the asset has been downloaded (by calling [`downloadAsync()`](#downloadasync)), the
|
|
65
|
+
* `file://` URI pointing to the local file on the device that contains the asset data.
|
|
66
|
+
*/
|
|
35
67
|
localUri: string | null = null;
|
|
68
|
+
/**
|
|
69
|
+
* If the asset is an image, the width of the image data divided by the scale factor. The scale
|
|
70
|
+
* factor is the number after `@` in the filename, or `1` if not present.
|
|
71
|
+
*/
|
|
36
72
|
width: number | null = null;
|
|
73
|
+
/**
|
|
74
|
+
* If the asset is an image, the height of the image data divided by the scale factor. The scale factor is the number after `@` in the filename, or `1` if not present.
|
|
75
|
+
*/
|
|
37
76
|
height: number | null = null;
|
|
77
|
+
// @docsMissing
|
|
38
78
|
downloading: boolean = false;
|
|
79
|
+
// @docsMissing
|
|
39
80
|
downloaded: boolean = false;
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* @private
|
|
84
|
+
*/
|
|
40
85
|
_downloadCallbacks: DownloadPromiseCallbacks[] = [];
|
|
41
86
|
|
|
42
87
|
constructor({ name, type, hash = null, uri, width, height }: AssetDescriptor) {
|
|
@@ -69,11 +114,30 @@ export class Asset {
|
|
|
69
114
|
}
|
|
70
115
|
}
|
|
71
116
|
|
|
117
|
+
// @needsAudit
|
|
118
|
+
/**
|
|
119
|
+
* A helper that wraps `Asset.fromModule(module).downloadAsync` for convenience.
|
|
120
|
+
* @param moduleId An array of `require('path/to/file')` or external network URLs. Can also be
|
|
121
|
+
* just one module or URL without an Array.
|
|
122
|
+
* @return Returns a Promise that fulfills with an array of `Asset`s when the asset(s) has been
|
|
123
|
+
* saved to disk.
|
|
124
|
+
* @example
|
|
125
|
+
* ```ts
|
|
126
|
+
* const [{ localUri }] = await Asset.loadAsync(require('./assets/snack-icon.png'));
|
|
127
|
+
* ```
|
|
128
|
+
*/
|
|
72
129
|
static loadAsync(moduleId: number | number[] | string | string[]): Promise<Asset[]> {
|
|
73
130
|
const moduleIds = Array.isArray(moduleId) ? moduleId : [moduleId];
|
|
74
131
|
return Promise.all(moduleIds.map((moduleId) => Asset.fromModule(moduleId).downloadAsync()));
|
|
75
132
|
}
|
|
76
133
|
|
|
134
|
+
// @needsAudit
|
|
135
|
+
/**
|
|
136
|
+
* Returns the [`Asset`](#asset) instance representing an asset given its module or URL.
|
|
137
|
+
* @param virtualAssetModule The value of `require('path/to/file')` for the asset or external
|
|
138
|
+
* network URL
|
|
139
|
+
* @return The [`Asset`](#asset) instance for the asset.
|
|
140
|
+
*/
|
|
77
141
|
static fromModule(virtualAssetModule: number | string): Asset {
|
|
78
142
|
if (typeof virtualAssetModule === 'string') {
|
|
79
143
|
return Asset.fromURI(virtualAssetModule);
|
|
@@ -113,6 +177,7 @@ export class Asset {
|
|
|
113
177
|
return Asset.fromMetadata(meta);
|
|
114
178
|
}
|
|
115
179
|
|
|
180
|
+
// @docsMissing
|
|
116
181
|
static fromMetadata(meta: AssetMetadata): Asset {
|
|
117
182
|
// The hash of the whole asset, not to be confused with the hash of a specific file returned
|
|
118
183
|
// from `selectAssetSource`
|
|
@@ -121,7 +186,7 @@ export class Asset {
|
|
|
121
186
|
return Asset.byHash[metaHash];
|
|
122
187
|
}
|
|
123
188
|
|
|
124
|
-
const { uri, hash } =
|
|
189
|
+
const { uri, hash } = selectAssetSource(meta);
|
|
125
190
|
const asset = new Asset({
|
|
126
191
|
name: meta.name,
|
|
127
192
|
type: meta.type,
|
|
@@ -134,6 +199,7 @@ export class Asset {
|
|
|
134
199
|
return asset;
|
|
135
200
|
}
|
|
136
201
|
|
|
202
|
+
// @docsMissing
|
|
137
203
|
static fromURI(uri: string): Asset {
|
|
138
204
|
if (Asset.byUri[uri]) {
|
|
139
205
|
return Asset.byUri[uri];
|
|
@@ -160,6 +226,15 @@ export class Asset {
|
|
|
160
226
|
return asset;
|
|
161
227
|
}
|
|
162
228
|
|
|
229
|
+
// @needsAudit
|
|
230
|
+
/**
|
|
231
|
+
* Downloads the asset data to a local file in the device's cache directory. Once the returned
|
|
232
|
+
* promise is fulfilled without error, the [`localUri`](#assetlocaluri) field of this asset points
|
|
233
|
+
* to a local file containing the asset data. The asset is only downloaded if an up-to-date local
|
|
234
|
+
* file for the asset isn't already present due to an earlier download. The downloaded `Asset`
|
|
235
|
+
* will be returned when the promise is resolved.
|
|
236
|
+
* @return Returns a Promise which fulfills with an `Asset` instance.
|
|
237
|
+
*/
|
|
163
238
|
async downloadAsync(): Promise<this> {
|
|
164
239
|
if (this.downloaded) {
|
|
165
240
|
return this;
|
package/src/AssetHooks.ts
CHANGED
|
@@ -2,19 +2,25 @@ import { useEffect, useState } from 'react';
|
|
|
2
2
|
|
|
3
3
|
import { Asset } from './Asset';
|
|
4
4
|
|
|
5
|
+
// @needsAudit
|
|
5
6
|
/**
|
|
6
7
|
* Downloads and stores one or more assets locally.
|
|
7
8
|
* After the assets are loaded, this hook returns a list of asset instances.
|
|
8
9
|
* If something went wrong when loading the assets, an error is returned.
|
|
9
10
|
*
|
|
10
|
-
* Note, the assets are not "reloaded" when you dynamically change the asset list.
|
|
11
|
+
* > Note, the assets are not "reloaded" when you dynamically change the asset list.
|
|
12
|
+
*
|
|
13
|
+
* @return Returns an array containing:
|
|
14
|
+
* - on the first position, a list of all loaded assets. If they aren't loaded yet, this value is
|
|
15
|
+
* `undefined`.
|
|
16
|
+
* - on the second position, an error which encountered when loading the assets. If there was no
|
|
17
|
+
* error, this value is `undefined`.
|
|
11
18
|
*
|
|
12
|
-
* @see https://docs.expo.io/versions/latest/sdk/asset/
|
|
13
19
|
* @example
|
|
14
20
|
* ```tsx
|
|
15
|
-
* const [assets, error] = useAssets(require('path/to/asset.jpg'));
|
|
21
|
+
* const [assets, error] = useAssets([require('path/to/asset.jpg'), require('path/to/other.png')]);
|
|
16
22
|
*
|
|
17
|
-
* return
|
|
23
|
+
* return assets ? <Image source={assets[0]} /> : null;
|
|
18
24
|
* ```
|
|
19
25
|
*/
|
|
20
26
|
export function useAssets(moduleIds: number | number[]): [Asset[] | undefined, Error | undefined] {
|
|
@@ -37,7 +37,7 @@ function getScaledAssetPath(asset): string {
|
|
|
37
37
|
const scale = AssetSourceResolver.pickScale(asset.scales, getScale());
|
|
38
38
|
const scaleSuffix = scale === 1 ? '' : '@' + scale + 'x';
|
|
39
39
|
const assetDir = getBasePath(asset);
|
|
40
|
-
return assetDir + '/' + asset.name + scaleSuffix +
|
|
40
|
+
return assetDir + '/' + asset.name + scaleSuffix + (asset.type ? `.${asset.type}` : '');
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
export default class AssetSourceResolver {
|
|
@@ -84,7 +84,7 @@ export default class AssetSourceResolver {
|
|
|
84
84
|
return this.fromSource(getScaledAssetPath(this.asset));
|
|
85
85
|
}
|
|
86
86
|
scaledAssetURLNearBundle(): ResolvedAssetSource {
|
|
87
|
-
const path = this.jsbundleUrl || '
|
|
87
|
+
const path = this.jsbundleUrl || '';
|
|
88
88
|
return this.fromSource(path + getScaledAssetPath(this.asset));
|
|
89
89
|
}
|
|
90
90
|
resourceIdentifierWithoutScale(): ResolvedAssetSource {
|
package/src/AssetSources.ts
CHANGED
|
@@ -4,8 +4,9 @@ import { PixelRatio } from 'react-native';
|
|
|
4
4
|
import URL from 'url-parse';
|
|
5
5
|
|
|
6
6
|
import AssetSourceResolver from './AssetSourceResolver';
|
|
7
|
-
import { manifestBaseUrl, getManifest } from './PlatformUtils';
|
|
7
|
+
import { manifestBaseUrl, getManifest, getManifest2 } from './PlatformUtils';
|
|
8
8
|
|
|
9
|
+
// @docsMissing
|
|
9
10
|
export type AssetMetadata = {
|
|
10
11
|
hash: string;
|
|
11
12
|
name: string;
|
|
@@ -73,6 +74,19 @@ export function selectAssetSource(meta: AssetMetadata): AssetSource {
|
|
|
73
74
|
return { uri, hash };
|
|
74
75
|
}
|
|
75
76
|
|
|
77
|
+
// For assets during development using manifest2, we use the development server's URL origin
|
|
78
|
+
const manifest2 = getManifest2();
|
|
79
|
+
|
|
80
|
+
if (manifest2?.extra?.expoGo?.developer) {
|
|
81
|
+
const baseUrl = new URL(`http://${manifest2.extra.expoGo.debuggerHost}`);
|
|
82
|
+
baseUrl.set('pathname', meta.httpServerLocation + suffix);
|
|
83
|
+
|
|
84
|
+
return {
|
|
85
|
+
uri: baseUrl.href,
|
|
86
|
+
hash,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
|
|
76
90
|
// For assets during development, we use the development server's URL origin
|
|
77
91
|
if (getManifest().developer) {
|
|
78
92
|
const baseUrl = new URL(getManifest().bundleUrl);
|
package/src/PlatformUtils.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import computeMd5 from 'blueimp-md5';
|
|
2
2
|
import Constants from 'expo-constants';
|
|
3
|
+
import { Manifest } from 'expo-constants/build/Constants.types';
|
|
3
4
|
import * as FileSystem from 'expo-file-system';
|
|
4
5
|
import { NativeModulesProxy } from 'expo-modules-core';
|
|
5
6
|
|
|
@@ -33,6 +34,10 @@ export function getManifest(): { [key: string]: any } {
|
|
|
33
34
|
return Constants.__unsafeNoWarnManifest ?? {};
|
|
34
35
|
}
|
|
35
36
|
|
|
37
|
+
export function getManifest2(): Manifest | undefined {
|
|
38
|
+
return Constants.__unsafeNoWarnManifest2;
|
|
39
|
+
}
|
|
40
|
+
|
|
36
41
|
// Compute manifest base URL if available
|
|
37
42
|
export const manifestBaseUrl = Constants.experienceUrl
|
|
38
43
|
? getManifestBaseUrl(Constants.experienceUrl)
|
|
@@ -3,11 +3,10 @@ import { NativeModules } from 'react-native';
|
|
|
3
3
|
import { getAssetByID } from './AssetRegistry';
|
|
4
4
|
import AssetSourceResolver, { ResolvedAssetSource } from './AssetSourceResolver';
|
|
5
5
|
|
|
6
|
-
declare let nativeExtensions:
|
|
6
|
+
declare let nativeExtensions: { SourceCode?: { scriptURL: string } } | undefined;
|
|
7
7
|
|
|
8
8
|
let _customSourceTransformer;
|
|
9
9
|
let _serverURL: string | undefined | null;
|
|
10
|
-
let _scriptURL: string | undefined | null;
|
|
11
10
|
let _sourceCodeScriptURL: string | undefined | null;
|
|
12
11
|
|
|
13
12
|
function getSourceCodeScriptURL(): string | undefined | null {
|
|
@@ -15,11 +14,11 @@ function getSourceCodeScriptURL(): string | undefined | null {
|
|
|
15
14
|
return _sourceCodeScriptURL;
|
|
16
15
|
}
|
|
17
16
|
|
|
18
|
-
let sourceCode = nativeExtensions
|
|
17
|
+
let sourceCode = typeof nativeExtensions !== 'undefined' ? nativeExtensions.SourceCode : null;
|
|
19
18
|
if (!sourceCode) {
|
|
20
|
-
sourceCode = NativeModules
|
|
19
|
+
sourceCode = NativeModules?.SourceCode;
|
|
21
20
|
}
|
|
22
|
-
_sourceCodeScriptURL = sourceCode
|
|
21
|
+
_sourceCodeScriptURL = sourceCode?.scriptURL;
|
|
23
22
|
return _sourceCodeScriptURL;
|
|
24
23
|
}
|
|
25
24
|
|
|
@@ -38,29 +37,6 @@ function getDevServerURL(): string | null {
|
|
|
38
37
|
return _serverURL;
|
|
39
38
|
}
|
|
40
39
|
|
|
41
|
-
function _coerceLocalScriptURL(scriptURL: string | undefined | null): string | null {
|
|
42
|
-
if (scriptURL) {
|
|
43
|
-
if (scriptURL.startsWith('assets://')) {
|
|
44
|
-
// android: running from within assets, no offline path to use
|
|
45
|
-
return null;
|
|
46
|
-
}
|
|
47
|
-
scriptURL = scriptURL.substring(0, scriptURL.lastIndexOf('/') + 1);
|
|
48
|
-
if (!scriptURL.includes('://')) {
|
|
49
|
-
// Add file protocol in case we have an absolute file path and not a URL.
|
|
50
|
-
// This shouldn't really be necessary. scriptURL should be a URL.
|
|
51
|
-
scriptURL = 'file://' + scriptURL;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
return null;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
function getScriptURL(): string | null {
|
|
58
|
-
if (_scriptURL === undefined) {
|
|
59
|
-
_scriptURL = _coerceLocalScriptURL(getSourceCodeScriptURL());
|
|
60
|
-
}
|
|
61
|
-
return _scriptURL;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
40
|
export function setCustomSourceTransformer(
|
|
65
41
|
transformer: (resolver: AssetSourceResolver) => ResolvedAssetSource
|
|
66
42
|
): void {
|
|
@@ -81,7 +57,7 @@ export default function resolveAssetSource(source: any): ResolvedAssetSource | u
|
|
|
81
57
|
return undefined;
|
|
82
58
|
}
|
|
83
59
|
|
|
84
|
-
const resolver = new AssetSourceResolver(getDevServerURL(),
|
|
60
|
+
const resolver = new AssetSourceResolver(getDevServerURL(), null, asset);
|
|
85
61
|
if (_customSourceTransformer) {
|
|
86
62
|
return _customSourceTransformer(resolver);
|
|
87
63
|
}
|