expo 55.0.8 → 55.0.9
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/android/build.gradle
CHANGED
|
@@ -10,7 +10,7 @@ buildscript {
|
|
|
10
10
|
}
|
|
11
11
|
|
|
12
12
|
group = 'host.exp.exponent'
|
|
13
|
-
version = '55.0.
|
|
13
|
+
version = '55.0.9'
|
|
14
14
|
|
|
15
15
|
expoModule {
|
|
16
16
|
// We can't prebuild the module because it depends on the generated files.
|
|
@@ -21,7 +21,7 @@ android {
|
|
|
21
21
|
namespace "expo.core"
|
|
22
22
|
defaultConfig {
|
|
23
23
|
versionCode 1
|
|
24
|
-
versionName "55.0.
|
|
24
|
+
versionName "55.0.9"
|
|
25
25
|
consumerProguardFiles("proguard-rules.pro")
|
|
26
26
|
}
|
|
27
27
|
testOptions {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"@expo/fingerprint": "~0.16.6",
|
|
3
|
-
"@expo/metro-runtime": "~55.0.
|
|
3
|
+
"@expo/metro-runtime": "~55.0.7",
|
|
4
4
|
"@expo/vector-icons": "^15.0.2",
|
|
5
|
-
"@expo/ui": "~55.0.
|
|
5
|
+
"@expo/ui": "~55.0.6",
|
|
6
6
|
"@react-native-async-storage/async-storage": "2.2.0",
|
|
7
7
|
"@react-native-community/datetimepicker": "8.6.0",
|
|
8
8
|
"@react-native-masked-view/masked-view": "0.3.2",
|
|
@@ -20,27 +20,27 @@
|
|
|
20
20
|
"expo-application": "~55.0.10",
|
|
21
21
|
"expo-asset": "~55.0.10",
|
|
22
22
|
"expo-audio": "~55.0.9",
|
|
23
|
-
"expo-auth-session": "~55.0.
|
|
23
|
+
"expo-auth-session": "~55.0.10",
|
|
24
24
|
"expo-background-fetch": "~55.0.10",
|
|
25
25
|
"expo-background-task": "~55.0.10",
|
|
26
26
|
"expo-battery": "~55.0.9",
|
|
27
27
|
"expo-blur": "~55.0.10",
|
|
28
28
|
"expo-brightness": "~55.0.9",
|
|
29
|
-
"expo-brownfield": "~55.0.
|
|
29
|
+
"expo-brownfield": "~55.0.16",
|
|
30
30
|
"expo-build-properties": "~55.0.10",
|
|
31
31
|
"expo-calendar": "~55.0.10",
|
|
32
|
-
"expo-camera": "~55.0.
|
|
32
|
+
"expo-camera": "~55.0.11",
|
|
33
33
|
"expo-cellular": "~55.0.9",
|
|
34
34
|
"expo-checkbox": "~55.0.3",
|
|
35
35
|
"expo-clipboard": "~55.0.9",
|
|
36
36
|
"expo-constants": "~55.0.9",
|
|
37
37
|
"expo-contacts": "~55.0.9",
|
|
38
38
|
"expo-crypto": "~55.0.10",
|
|
39
|
-
"expo-dev-client": "~55.0.
|
|
39
|
+
"expo-dev-client": "~55.0.19",
|
|
40
40
|
"expo-device": "~55.0.10",
|
|
41
41
|
"expo-document-picker": "~55.0.9",
|
|
42
42
|
"expo-eas-observe": "~0.0.32",
|
|
43
|
-
"expo-file-system": "~55.0.
|
|
43
|
+
"expo-file-system": "~55.0.12",
|
|
44
44
|
"expo-font": "~55.0.4",
|
|
45
45
|
"expo-gl": "~55.0.10",
|
|
46
46
|
"expo-glass-effect": "~55.0.8",
|
|
@@ -49,29 +49,29 @@
|
|
|
49
49
|
"expo-image": "~55.0.6",
|
|
50
50
|
"expo-image-loader": "~55.0.0",
|
|
51
51
|
"expo-image-manipulator": "~55.0.11",
|
|
52
|
-
"expo-image-picker": "~55.0.
|
|
52
|
+
"expo-image-picker": "~55.0.14",
|
|
53
53
|
"expo-intent-launcher": "~55.0.9",
|
|
54
|
-
"expo-insights": "~55.0.
|
|
54
|
+
"expo-insights": "~55.0.12",
|
|
55
55
|
"expo-keep-awake": "~55.0.4",
|
|
56
56
|
"expo-linear-gradient": "~55.0.9",
|
|
57
|
-
"expo-linking": "~55.0.
|
|
57
|
+
"expo-linking": "~55.0.9",
|
|
58
58
|
"expo-local-authentication": "~55.0.9",
|
|
59
59
|
"expo-localization": "~55.0.9",
|
|
60
60
|
"expo-location": "~55.1.4",
|
|
61
61
|
"expo-mail-composer": "~55.0.9",
|
|
62
62
|
"expo-manifests": "~55.0.11",
|
|
63
|
-
"expo-maps": "~55.0.
|
|
63
|
+
"expo-maps": "~55.0.12",
|
|
64
64
|
"expo-mcp": "~0.2.1",
|
|
65
65
|
"expo-media-library": "~55.0.10",
|
|
66
66
|
"expo-mesh-gradient": "~55.0.9",
|
|
67
67
|
"expo-module-template": "~55.0.13",
|
|
68
|
-
"expo-modules-core": "~55.0.
|
|
68
|
+
"expo-modules-core": "~55.0.18",
|
|
69
69
|
"expo-navigation-bar": "~55.0.9",
|
|
70
70
|
"expo-network": "~55.0.9",
|
|
71
|
-
"expo-notifications": "~55.0.
|
|
71
|
+
"expo-notifications": "~55.0.14",
|
|
72
72
|
"expo-print": "~55.0.9",
|
|
73
73
|
"expo-live-photo": "~55.0.9",
|
|
74
|
-
"expo-router": "~55.0.
|
|
74
|
+
"expo-router": "~55.0.8",
|
|
75
75
|
"expo-screen-capture": "~55.0.9",
|
|
76
76
|
"expo-screen-orientation": "~55.0.9",
|
|
77
77
|
"expo-secure-store": "~55.0.9",
|
|
@@ -80,15 +80,15 @@
|
|
|
80
80
|
"expo-sharing": "~55.0.14",
|
|
81
81
|
"expo-sms": "~55.0.9",
|
|
82
82
|
"expo-speech": "~55.0.9",
|
|
83
|
-
"expo-splash-screen": "~55.0.
|
|
83
|
+
"expo-splash-screen": "~55.0.13",
|
|
84
84
|
"expo-sqlite": "~55.0.11",
|
|
85
85
|
"expo-status-bar": "~55.0.4",
|
|
86
86
|
"expo-store-review": "~55.0.9",
|
|
87
87
|
"expo-symbols": "~55.0.5",
|
|
88
|
-
"expo-system-ui": "~55.0.
|
|
88
|
+
"expo-system-ui": "~55.0.11",
|
|
89
89
|
"expo-task-manager": "~55.0.10",
|
|
90
90
|
"expo-tracking-transparency": "~55.0.9",
|
|
91
|
-
"expo-updates": "~55.0.
|
|
91
|
+
"expo-updates": "~55.0.16",
|
|
92
92
|
"expo-video-thumbnails": "~55.0.11",
|
|
93
93
|
"expo-video": "~55.0.11",
|
|
94
94
|
"expo-web-browser": "~55.0.10",
|
|
@@ -96,7 +96,7 @@
|
|
|
96
96
|
"lottie-react-native": "~7.3.4",
|
|
97
97
|
"react": "19.2.0",
|
|
98
98
|
"react-dom": "19.2.0",
|
|
99
|
-
"react-native": "0.83.
|
|
99
|
+
"react-native": "0.83.4",
|
|
100
100
|
"react-native-web": "~0.21.0",
|
|
101
101
|
"react-native-gesture-handler": "~2.30.0",
|
|
102
102
|
"react-native-get-random-values": "~1.11.0",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "expo",
|
|
3
|
-
"version": "55.0.
|
|
3
|
+
"version": "55.0.9",
|
|
4
4
|
"description": "The Expo SDK",
|
|
5
5
|
"main": "src/Expo.ts",
|
|
6
6
|
"module": "src/Expo.ts",
|
|
@@ -77,39 +77,39 @@
|
|
|
77
77
|
"homepage": "https://github.com/expo/expo/tree/main/packages/expo",
|
|
78
78
|
"dependencies": {
|
|
79
79
|
"@babel/runtime": "^7.20.0",
|
|
80
|
-
"@expo/cli": "55.0.
|
|
81
|
-
"@expo/config": "~55.0.
|
|
80
|
+
"@expo/cli": "55.0.19",
|
|
81
|
+
"@expo/config": "~55.0.11",
|
|
82
82
|
"@expo/config-plugins": "~55.0.7",
|
|
83
83
|
"@expo/devtools": "55.0.2",
|
|
84
84
|
"@expo/fingerprint": "0.16.6",
|
|
85
85
|
"@expo/local-build-cache-provider": "55.0.7",
|
|
86
|
-
"@expo/log-box": "55.0.
|
|
86
|
+
"@expo/log-box": "55.0.8",
|
|
87
87
|
"@expo/metro": "~54.2.0",
|
|
88
88
|
"@expo/metro-config": "55.0.11",
|
|
89
89
|
"@expo/vector-icons": "^15.0.2",
|
|
90
90
|
"@ungap/structured-clone": "^1.3.0",
|
|
91
|
-
"babel-preset-expo": "~55.0.
|
|
91
|
+
"babel-preset-expo": "~55.0.13",
|
|
92
92
|
"expo-asset": "~55.0.10",
|
|
93
93
|
"expo-constants": "~55.0.9",
|
|
94
|
-
"expo-file-system": "~55.0.
|
|
94
|
+
"expo-file-system": "~55.0.12",
|
|
95
95
|
"expo-font": "~55.0.4",
|
|
96
96
|
"expo-keep-awake": "~55.0.4",
|
|
97
|
-
"expo-modules-autolinking": "55.0.
|
|
98
|
-
"expo-modules-core": "55.0.
|
|
97
|
+
"expo-modules-autolinking": "55.0.12",
|
|
98
|
+
"expo-modules-core": "55.0.18",
|
|
99
99
|
"pretty-format": "^29.7.0",
|
|
100
100
|
"react-refresh": "^0.14.2",
|
|
101
101
|
"whatwg-url-minimum": "^0.1.1"
|
|
102
102
|
},
|
|
103
103
|
"devDependencies": {
|
|
104
104
|
"@expo/dom-webview": "^55.0.3",
|
|
105
|
-
"@expo/metro-runtime": "^55.0.
|
|
105
|
+
"@expo/metro-runtime": "^55.0.7",
|
|
106
106
|
"@types/node": "^22.14.0",
|
|
107
107
|
"@types/react": "~19.2.0",
|
|
108
108
|
"@types/react-test-renderer": "~19.1.0",
|
|
109
109
|
"expo-module-scripts": "^55.0.2",
|
|
110
110
|
"react": "19.2.0",
|
|
111
111
|
"react-dom": "19.2.0",
|
|
112
|
-
"react-native": "0.83.
|
|
112
|
+
"react-native": "0.83.4",
|
|
113
113
|
"web-streams-polyfill": "^3.3.2"
|
|
114
114
|
},
|
|
115
115
|
"peerDependencies": {
|
|
@@ -130,5 +130,5 @@
|
|
|
130
130
|
"optional": true
|
|
131
131
|
}
|
|
132
132
|
},
|
|
133
|
-
"gitHead": "
|
|
133
|
+
"gitHead": "f63217deac00dcd278f75d9846933c11e5c6f9a3"
|
|
134
134
|
}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for asyncRequireModule.ts — verifies that the optional `moduleName`
|
|
3
|
+
* parameter is forwarded through `asyncRequire` and `asyncRequireImpl` to
|
|
4
|
+
* `require.importAll`.
|
|
5
|
+
*
|
|
6
|
+
* Since the module uses `(require as unknown as MetroRequire).importAll(...)`,
|
|
7
|
+
* and jest provides each module its own `require`, we need to evaluate the
|
|
8
|
+
* module source in a controlled environment similar to how Metro does.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
// The module references `__METRO_GLOBAL_PREFIX__` as a free variable
|
|
12
|
+
declare let __METRO_GLOBAL_PREFIX__: string;
|
|
13
|
+
|
|
14
|
+
describe('asyncRequireModule', () => {
|
|
15
|
+
let mockImportAll: jest.Mock;
|
|
16
|
+
let mockRequire: any;
|
|
17
|
+
let asyncRequire: any;
|
|
18
|
+
|
|
19
|
+
beforeEach(() => {
|
|
20
|
+
mockImportAll = jest.fn((id: number, _moduleName?: string) => ({
|
|
21
|
+
default: `module-${id}`,
|
|
22
|
+
}));
|
|
23
|
+
|
|
24
|
+
// Build a fake require that has importAll attached
|
|
25
|
+
mockRequire = Object.assign(jest.fn(), {
|
|
26
|
+
importAll: mockImportAll,
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
// Set up the Metro global prefix
|
|
30
|
+
(globalThis as any).__METRO_GLOBAL_PREFIX__ = '';
|
|
31
|
+
|
|
32
|
+
// Clear any previous __loadBundleAsync
|
|
33
|
+
delete (globalThis as any).__loadBundleAsync;
|
|
34
|
+
|
|
35
|
+
// Evaluate the compiled module in a scope where `require` is our mock.
|
|
36
|
+
// We use Function constructor to create a scope with our own `require`.
|
|
37
|
+
const moduleObj = { exports: {} as any };
|
|
38
|
+
// eslint-disable-next-line no-new-func
|
|
39
|
+
const moduleFn = new Function(
|
|
40
|
+
'require',
|
|
41
|
+
'module',
|
|
42
|
+
'exports',
|
|
43
|
+
'__METRO_GLOBAL_PREFIX__',
|
|
44
|
+
`
|
|
45
|
+
"use strict";
|
|
46
|
+
|
|
47
|
+
function makeWorkerContent(url) {
|
|
48
|
+
return '';
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function maybeLoadBundle(moduleID, paths) {
|
|
52
|
+
var loadBundle = globalThis[(__METRO_GLOBAL_PREFIX__ || '') + '__loadBundleAsync'];
|
|
53
|
+
if (loadBundle != null) {
|
|
54
|
+
var stringModuleID = String(moduleID);
|
|
55
|
+
if (paths != null) {
|
|
56
|
+
var bundlePath = paths[stringModuleID];
|
|
57
|
+
if (bundlePath != null) {
|
|
58
|
+
return loadBundle(bundlePath);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function asyncRequireImpl(moduleID, paths, moduleName) {
|
|
66
|
+
var maybeLoadBundlePromise = maybeLoadBundle(moduleID, paths);
|
|
67
|
+
var importAll = function() { return require.importAll(moduleID, moduleName); };
|
|
68
|
+
|
|
69
|
+
if (maybeLoadBundlePromise != null) {
|
|
70
|
+
return maybeLoadBundlePromise.then(importAll);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return importAll();
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
async function asyncRequire(moduleID, paths, moduleName) {
|
|
77
|
+
return asyncRequireImpl(moduleID, paths, moduleName);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
asyncRequire.unstable_importMaybeSync = function(moduleID, paths) {
|
|
81
|
+
return asyncRequireImpl(moduleID, paths);
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
asyncRequire.prefetch = function(moduleID, paths, moduleName) {
|
|
85
|
+
var p = maybeLoadBundle(moduleID, paths);
|
|
86
|
+
if (p) p.then(function(){}, function(){});
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
module.exports = asyncRequire;
|
|
90
|
+
`
|
|
91
|
+
);
|
|
92
|
+
moduleFn(mockRequire, moduleObj, moduleObj.exports, '');
|
|
93
|
+
asyncRequire = moduleObj.exports;
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
afterEach(() => {
|
|
97
|
+
delete (globalThis as any).__loadBundleAsync;
|
|
98
|
+
delete (globalThis as any).__METRO_GLOBAL_PREFIX__;
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it('calls importAll with moduleID and moduleName when no bundle loading needed', async () => {
|
|
102
|
+
const result = await asyncRequire(42, null, 'my-module');
|
|
103
|
+
|
|
104
|
+
expect(mockImportAll).toHaveBeenCalledWith(42, 'my-module');
|
|
105
|
+
expect(result).toEqual({ default: 'module-42' });
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it('calls importAll without moduleName when not provided', async () => {
|
|
109
|
+
const result = await asyncRequire(42, null);
|
|
110
|
+
|
|
111
|
+
expect(mockImportAll).toHaveBeenCalledWith(42, undefined);
|
|
112
|
+
expect(result).toEqual({ default: 'module-42' });
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
it('passes moduleName through when bundle loading is required', async () => {
|
|
116
|
+
let resolveBundle!: () => void;
|
|
117
|
+
const bundlePromise = new Promise<void>((resolve) => {
|
|
118
|
+
resolveBundle = resolve;
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
(globalThis as any).__loadBundleAsync = jest.fn(() => bundlePromise);
|
|
122
|
+
|
|
123
|
+
const paths = { '42': '/bundles/my-module.bundle' };
|
|
124
|
+
const resultPromise = asyncRequire(42, paths, 'my-module');
|
|
125
|
+
|
|
126
|
+
// importAll should not have been called yet (waiting for bundle)
|
|
127
|
+
expect(mockImportAll).not.toHaveBeenCalled();
|
|
128
|
+
|
|
129
|
+
// Resolve the bundle loading
|
|
130
|
+
resolveBundle();
|
|
131
|
+
const result = await resultPromise;
|
|
132
|
+
|
|
133
|
+
expect(mockImportAll).toHaveBeenCalledWith(42, 'my-module');
|
|
134
|
+
expect(result).toEqual({ default: 'module-42' });
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
describe('unstable_importMaybeSync', () => {
|
|
138
|
+
it('returns synchronously when no bundle loading needed', () => {
|
|
139
|
+
const result = asyncRequire.unstable_importMaybeSync(42, null);
|
|
140
|
+
|
|
141
|
+
expect(mockImportAll).toHaveBeenCalledWith(42, undefined);
|
|
142
|
+
expect(result).toEqual({ default: 'module-42' });
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
describe('prefetch', () => {
|
|
147
|
+
it('does not call importAll (only triggers bundle loading)', () => {
|
|
148
|
+
(globalThis as any).__loadBundleAsync = jest.fn(() => Promise.resolve());
|
|
149
|
+
|
|
150
|
+
const paths = { '42': '/bundles/my-module.bundle' };
|
|
151
|
+
asyncRequire.prefetch(42, paths, 'my-module');
|
|
152
|
+
|
|
153
|
+
expect(mockImportAll).not.toHaveBeenCalled();
|
|
154
|
+
expect((globalThis as any).__loadBundleAsync).toHaveBeenCalledWith(
|
|
155
|
+
'/bundles/my-module.bundle'
|
|
156
|
+
);
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
});
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
|
|
13
13
|
type MetroRequire = {
|
|
14
14
|
(id: number): unknown;
|
|
15
|
-
importAll: <T>(id: number) => T;
|
|
15
|
+
importAll: <T>(id: number, moduleName?: string) => T;
|
|
16
16
|
};
|
|
17
17
|
|
|
18
18
|
type DependencyMapPaths = { [moduleID: number | string]: unknown } | null;
|
|
@@ -62,9 +62,13 @@ function maybeLoadBundle(moduleID: number, paths: DependencyMapPaths): void | Pr
|
|
|
62
62
|
return undefined;
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
-
function asyncRequireImpl<T>(
|
|
65
|
+
function asyncRequireImpl<T>(
|
|
66
|
+
moduleID: number,
|
|
67
|
+
paths: DependencyMapPaths,
|
|
68
|
+
moduleName?: string
|
|
69
|
+
): Promise<T> | T {
|
|
66
70
|
const maybeLoadBundlePromise = maybeLoadBundle(moduleID, paths);
|
|
67
|
-
const importAll = () => (require as unknown as MetroRequire).importAll<T>(moduleID);
|
|
71
|
+
const importAll = () => (require as unknown as MetroRequire).importAll<T>(moduleID, moduleName);
|
|
68
72
|
|
|
69
73
|
if (maybeLoadBundlePromise != null) {
|
|
70
74
|
return maybeLoadBundlePromise.then(importAll);
|
|
@@ -76,9 +80,9 @@ function asyncRequireImpl<T>(moduleID: number, paths: DependencyMapPaths): Promi
|
|
|
76
80
|
async function asyncRequire<T>(
|
|
77
81
|
moduleID: number,
|
|
78
82
|
paths: DependencyMapPaths,
|
|
79
|
-
moduleName?: string
|
|
83
|
+
moduleName?: string
|
|
80
84
|
): Promise<T> {
|
|
81
|
-
return asyncRequireImpl<T>(moduleID, paths);
|
|
85
|
+
return asyncRequireImpl<T>(moduleID, paths, moduleName);
|
|
82
86
|
}
|
|
83
87
|
|
|
84
88
|
// Synchronous version of asyncRequire, which can still return a promise
|
package/template.tgz
CHANGED
|
Binary file
|