@expo/cli 0.7.3 → 0.9.0
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/README.md +1 -1
- package/build/bin/cli +17 -3
- package/build/bin/cli.map +1 -1
- package/build/src/api/getExpoGoIntermediateCertificate.js +0 -2
- package/build/src/api/getExpoGoIntermediateCertificate.js.map +1 -1
- package/build/src/api/getProjectDevelopmentCertificate.js +0 -2
- package/build/src/api/getProjectDevelopmentCertificate.js.map +1 -1
- package/build/src/api/graphql/queries/AppQuery.js +39 -0
- package/build/src/api/graphql/queries/AppQuery.js.map +1 -0
- package/build/src/api/graphql/queries/UserQuery.js +10 -3
- package/build/src/api/graphql/queries/UserQuery.js.map +1 -1
- package/build/src/api/graphql/types/App.js +23 -0
- package/build/src/api/graphql/types/App.js.map +1 -0
- package/build/src/api/signManifest.js +0 -12
- package/build/src/api/signManifest.js.map +1 -1
- package/build/src/api/user/UserSettings.js.map +1 -1
- package/build/src/api/user/user.js.map +1 -1
- package/build/src/config/configAsync.js +3 -0
- package/build/src/config/configAsync.js.map +1 -1
- package/build/src/customize/customizeAsync.js +3 -0
- package/build/src/customize/customizeAsync.js.map +1 -1
- package/build/src/export/createBundles.js +8 -3
- package/build/src/export/createBundles.js.map +1 -1
- package/build/src/export/embed/exportEmbedAsync.js +23 -0
- package/build/src/export/embed/exportEmbedAsync.js.map +1 -0
- package/build/src/export/embed/index.js +117 -0
- package/build/src/export/embed/index.js.map +1 -0
- package/build/src/export/embed/resolveOptions.js +63 -0
- package/build/src/export/embed/resolveOptions.js.map +1 -0
- package/build/src/export/exportApp.js +58 -31
- package/build/src/export/exportApp.js.map +1 -1
- package/build/src/export/exportAssets.js +17 -0
- package/build/src/export/exportAssets.js.map +1 -1
- package/build/src/export/exportAsync.js +3 -0
- package/build/src/export/exportAsync.js.map +1 -1
- package/build/src/export/exportStaticAsync.js +179 -0
- package/build/src/export/exportStaticAsync.js.map +1 -0
- package/build/src/export/fork-bundleAsync.js +15 -43
- package/build/src/export/fork-bundleAsync.js.map +1 -1
- package/build/src/export/html.js +21 -0
- package/build/src/export/html.js.map +1 -0
- package/build/src/export/index.js +5 -1
- package/build/src/export/index.js.map +1 -1
- package/build/src/export/printBundleSizes.js +2 -2
- package/build/src/export/printBundleSizes.js.map +1 -1
- package/build/src/export/resolveOptions.js +1 -0
- package/build/src/export/resolveOptions.js.map +1 -1
- package/build/src/export/web/exportWebAsync.js +3 -0
- package/build/src/export/web/exportWebAsync.js.map +1 -1
- package/build/src/export/writeContents.js +5 -2
- package/build/src/export/writeContents.js.map +1 -1
- package/build/src/graphql/generated.js +462 -0
- package/build/src/graphql/generated.js.map +1 -0
- package/build/src/install/checkPackages.js +6 -0
- package/build/src/install/checkPackages.js.map +1 -1
- package/build/src/install/installAsync.js +18 -1
- package/build/src/install/installAsync.js.map +1 -1
- package/build/src/prebuild/clearNativeFolder.js +6 -1
- package/build/src/prebuild/clearNativeFolder.js.map +1 -1
- package/build/src/prebuild/copyTemplateFiles.js +3 -33
- package/build/src/prebuild/copyTemplateFiles.js.map +1 -1
- package/build/src/prebuild/ensureConfigAsync.js +1 -12
- package/build/src/prebuild/ensureConfigAsync.js.map +1 -1
- package/build/src/prebuild/prebuildAsync.js +7 -2
- package/build/src/prebuild/prebuildAsync.js.map +1 -1
- package/build/src/prebuild/resolveOptions.js +7 -8
- package/build/src/prebuild/resolveOptions.js.map +1 -1
- package/build/src/prebuild/resolveTemplate.js +5 -0
- package/build/src/prebuild/resolveTemplate.js.map +1 -1
- package/build/src/prebuild/updateFromTemplate.js +6 -8
- package/build/src/prebuild/updateFromTemplate.js.map +1 -1
- package/build/src/prebuild/updatePackageJson.js +33 -47
- package/build/src/prebuild/updatePackageJson.js.map +1 -1
- package/build/src/prebuild/validateTemplatePlatforms.js +48 -0
- package/build/src/prebuild/validateTemplatePlatforms.js.map +1 -0
- package/build/src/run/android/runAndroidAsync.js +4 -0
- package/build/src/run/android/runAndroidAsync.js.map +1 -1
- package/build/src/run/ios/appleDevice/AppleDevice.js +25 -19
- package/build/src/run/ios/appleDevice/AppleDevice.js.map +1 -1
- package/build/src/run/ios/appleDevice/client/InstallationProxyClient.js.map +1 -1
- package/build/src/run/ios/options/resolveNativeScheme.js +13 -4
- package/build/src/run/ios/options/resolveNativeScheme.js.map +1 -1
- package/build/src/run/ios/runIosAsync.js +3 -0
- package/build/src/run/ios/runIosAsync.js.map +1 -1
- package/build/src/run/startBundler.js +4 -0
- package/build/src/run/startBundler.js.map +1 -1
- package/build/src/start/doctor/Prerequisite.js.map +1 -1
- package/build/src/start/doctor/dependencies/ensureDependenciesAsync.js +12 -6
- package/build/src/start/doctor/dependencies/ensureDependenciesAsync.js.map +1 -1
- package/build/src/start/doctor/dependencies/getVersionedPackages.js +13 -2
- package/build/src/start/doctor/dependencies/getVersionedPackages.js.map +1 -1
- package/build/src/start/doctor/dependencies/validateDependenciesVersions.js +12 -4
- package/build/src/start/doctor/dependencies/validateDependenciesVersions.js.map +1 -1
- package/build/src/start/doctor/typescript/TypeScriptProjectPrerequisite.js +31 -5
- package/build/src/start/doctor/typescript/TypeScriptProjectPrerequisite.js.map +1 -1
- package/build/src/start/doctor/typescript/updateTSConfig.js +6 -0
- package/build/src/start/doctor/typescript/updateTSConfig.js.map +1 -1
- package/build/src/start/doctor/web/WebSupportProjectPrerequisite.js +1 -0
- package/build/src/start/doctor/web/WebSupportProjectPrerequisite.js.map +1 -1
- package/build/src/start/index.js +3 -1
- package/build/src/start/index.js.map +1 -1
- package/build/src/start/platforms/android/adb.js +1 -1
- package/build/src/start/platforms/android/adb.js.map +1 -1
- package/build/src/start/platforms/ios/AppleDeviceManager.js +1 -1
- package/build/src/start/platforms/ios/AppleDeviceManager.js.map +1 -1
- package/build/src/start/server/BundlerDevServer.js +16 -2
- package/build/src/start/server/BundlerDevServer.js.map +1 -1
- package/build/src/start/server/DevServerManager.js +33 -2
- package/build/src/start/server/DevServerManager.js.map +1 -1
- package/build/src/start/server/getStaticRenderFunctions.js +167 -0
- package/build/src/start/server/getStaticRenderFunctions.js.map +1 -0
- package/build/src/start/server/metro/MetroBundlerDevServer.js +262 -3
- package/build/src/start/server/metro/MetroBundlerDevServer.js.map +1 -1
- package/build/src/start/server/metro/MetroTerminalReporter.js +2 -34
- package/build/src/start/server/metro/MetroTerminalReporter.js.map +1 -1
- package/build/src/start/server/metro/externals.js +72 -0
- package/build/src/start/server/metro/externals.js.map +1 -0
- package/build/src/start/server/metro/getCssModulesFromBundler.js +77 -0
- package/build/src/start/server/metro/getCssModulesFromBundler.js.map +1 -0
- package/build/src/start/server/metro/inspector-proxy/index.js +2 -2
- package/build/src/start/server/metro/inspector-proxy/index.js.map +1 -1
- package/build/src/start/server/metro/inspector-proxy/proxy.js +1 -3
- package/build/src/start/server/metro/inspector-proxy/proxy.js.map +1 -1
- package/build/src/start/server/metro/instantiateMetro.js +47 -48
- package/build/src/start/server/metro/instantiateMetro.js.map +1 -1
- package/build/src/start/server/metro/metroErrorInterface.js +137 -0
- package/build/src/start/server/metro/metroErrorInterface.js.map +1 -0
- package/build/src/start/server/metro/metroWatchTypeScriptFiles.js +51 -0
- package/build/src/start/server/metro/metroWatchTypeScriptFiles.js.map +1 -0
- package/build/src/start/server/metro/resolveFromProject.js +26 -3
- package/build/src/start/server/metro/resolveFromProject.js.map +1 -1
- package/build/src/start/server/metro/router.js +15 -2
- package/build/src/start/server/metro/router.js.map +1 -1
- package/build/src/start/server/metro/runServer-fork.js +107 -0
- package/build/src/start/server/metro/runServer-fork.js.map +1 -0
- package/build/src/start/server/metro/symbolicate.js +6 -0
- package/build/src/start/server/metro/symbolicate.js.map +1 -0
- package/build/src/start/server/metro/waitForMetroToObserveTypeScriptFile.js +70 -0
- package/build/src/start/server/metro/waitForMetroToObserveTypeScriptFile.js.map +1 -0
- package/build/src/start/server/metro/withMetroMultiPlatform.js +188 -45
- package/build/src/start/server/metro/withMetroMultiPlatform.js.map +1 -1
- package/build/src/start/server/middleware/ClassicManifestMiddleware.js +8 -1
- package/build/src/start/server/middleware/ClassicManifestMiddleware.js.map +1 -1
- package/build/src/start/server/middleware/CreateFileMiddleware.js +6 -3
- package/build/src/start/server/middleware/CreateFileMiddleware.js.map +1 -1
- package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js +113 -47
- package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js.map +1 -1
- package/build/src/start/server/middleware/ManifestMiddleware.js +59 -20
- package/build/src/start/server/middleware/ManifestMiddleware.js.map +1 -1
- package/build/src/start/server/type-generation/expo-env.js +27 -0
- package/build/src/start/server/type-generation/expo-env.js.map +1 -0
- package/build/src/start/server/type-generation/index.js +57 -0
- package/build/src/start/server/type-generation/index.js.map +1 -0
- package/build/src/start/server/type-generation/routes.js +291 -0
- package/build/src/start/server/type-generation/routes.js.map +1 -0
- package/build/src/start/server/type-generation/tsconfig.js +89 -0
- package/build/src/start/server/type-generation/tsconfig.js.map +1 -0
- package/build/src/start/server/webTemplate.js +20 -4
- package/build/src/start/server/webTemplate.js.map +1 -1
- package/build/src/start/server/webpack/WebpackBundlerDevServer.js +4 -6
- package/build/src/start/server/webpack/WebpackBundlerDevServer.js.map +1 -1
- package/build/src/start/startAsync.js +30 -8
- package/build/src/start/startAsync.js.map +1 -1
- package/build/src/utils/FileNotifier.js +11 -4
- package/build/src/utils/FileNotifier.js.map +1 -1
- package/build/src/utils/analytics/getMetroProperties.js +1 -1
- package/build/src/utils/analytics/getMetroProperties.js.map +1 -1
- package/build/src/utils/analytics/rudderstackClient.js +2 -2
- package/build/src/utils/codesigning.js +31 -7
- package/build/src/utils/codesigning.js.map +1 -1
- package/build/src/utils/dir.js +16 -6
- package/build/src/utils/dir.js.map +1 -1
- package/build/src/utils/env.js +6 -0
- package/build/src/utils/env.js.map +1 -1
- package/build/src/utils/mergeGitIgnorePaths.js +42 -0
- package/build/src/utils/mergeGitIgnorePaths.js.map +1 -1
- package/build/src/utils/nodeEnv.js +11 -0
- package/build/src/utils/nodeEnv.js.map +1 -0
- package/build/src/utils/resolveArgs.js +43 -0
- package/build/src/utils/resolveArgs.js.map +1 -1
- package/build/src/utils/strings.js +24 -0
- package/build/src/utils/strings.js.map +1 -0
- package/build/src/utils/template.js +21 -0
- package/build/src/utils/template.js.map +1 -0
- package/build/src/utils/tsconfig/evaluateTsConfig.js +61 -0
- package/build/src/utils/tsconfig/evaluateTsConfig.js.map +1 -0
- package/build/src/utils/tsconfig/loadTsConfigPaths.js +69 -0
- package/build/src/utils/tsconfig/loadTsConfigPaths.js.map +1 -0
- package/build/src/utils/tsconfig/matchTsConfigPathAlias.js +88 -0
- package/build/src/utils/tsconfig/matchTsConfigPathAlias.js.map +1 -0
- package/build/src/utils/tsconfig/resolveWithTsConfigPaths.js +41 -0
- package/build/src/utils/tsconfig/resolveWithTsConfigPaths.js.map +1 -0
- package/package.json +16 -10
- package/static/template/metro.config.js +4 -1
- package/build/src/api/getProject.js +0 -19
- package/build/src/api/getProject.js.map +0 -1
- package/build/src/api/graphql/generated.js +0 -113
- package/build/src/api/graphql/generated.js.map +0 -1
- package/build/src/prebuild/writeMetroConfig.js +0 -89
- package/build/src/prebuild/writeMetroConfig.js.map +0 -1
|
@@ -2,21 +2,19 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", {
|
|
3
3
|
value: true
|
|
4
4
|
});
|
|
5
|
+
exports.ResponseContentType = void 0;
|
|
5
6
|
var _configPlugins = require("@expo/config-plugins");
|
|
6
7
|
var _accepts = _interopRequireDefault(require("accepts"));
|
|
7
|
-
var _assert = _interopRequireDefault(require("assert"));
|
|
8
8
|
var _crypto = _interopRequireDefault(require("crypto"));
|
|
9
9
|
var _formData = _interopRequireDefault(require("form-data"));
|
|
10
10
|
var _structuredHeaders = require("structured-headers");
|
|
11
|
-
var _getProject = require("../../../api/getProject");
|
|
12
11
|
var _settings = require("../../../api/settings");
|
|
13
|
-
var _signManifest = require("../../../api/signManifest");
|
|
14
12
|
var _userSettings = _interopRequireDefault(require("../../../api/user/UserSettings"));
|
|
15
13
|
var _user = require("../../../api/user/user");
|
|
14
|
+
var Log = _interopRequireWildcard(require("../../../log"));
|
|
16
15
|
var _rudderstackClient = require("../../../utils/analytics/rudderstackClient");
|
|
17
16
|
var _codesigning = require("../../../utils/codesigning");
|
|
18
17
|
var _errors = require("../../../utils/errors");
|
|
19
|
-
var _fn = require("../../../utils/fn");
|
|
20
18
|
var _url = require("../../../utils/url");
|
|
21
19
|
var _manifestMiddleware = require("./ManifestMiddleware");
|
|
22
20
|
var _resolvePlatform = require("./resolvePlatform");
|
|
@@ -25,7 +23,36 @@ function _interopRequireDefault(obj) {
|
|
|
25
23
|
default: obj
|
|
26
24
|
};
|
|
27
25
|
}
|
|
26
|
+
function _interopRequireWildcard(obj) {
|
|
27
|
+
if (obj && obj.__esModule) {
|
|
28
|
+
return obj;
|
|
29
|
+
} else {
|
|
30
|
+
var newObj = {};
|
|
31
|
+
if (obj != null) {
|
|
32
|
+
for(var key in obj){
|
|
33
|
+
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
34
|
+
var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {};
|
|
35
|
+
if (desc.get || desc.set) {
|
|
36
|
+
Object.defineProperty(newObj, key, desc);
|
|
37
|
+
} else {
|
|
38
|
+
newObj[key] = obj[key];
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
newObj.default = obj;
|
|
44
|
+
return newObj;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
28
47
|
const debug = require("debug")("expo:start:server:middleware:ExpoGoManifestHandlerMiddleware");
|
|
48
|
+
var ResponseContentType;
|
|
49
|
+
exports.ResponseContentType = ResponseContentType;
|
|
50
|
+
(function(ResponseContentType) {
|
|
51
|
+
ResponseContentType[ResponseContentType["TEXT_PLAIN"] = 0] = "TEXT_PLAIN";
|
|
52
|
+
ResponseContentType[ResponseContentType["APPLICATION_JSON"] = 1] = "APPLICATION_JSON";
|
|
53
|
+
ResponseContentType[ResponseContentType["APPLICATION_EXPO_JSON"] = 2] = "APPLICATION_EXPO_JSON";
|
|
54
|
+
ResponseContentType[ResponseContentType["MULTIPART_MIXED"] = 3] = "MULTIPART_MIXED";
|
|
55
|
+
})(ResponseContentType || (exports.ResponseContentType = ResponseContentType = {}));
|
|
29
56
|
class ExpoGoManifestHandlerMiddleware extends _manifestMiddleware.ManifestMiddleware {
|
|
30
57
|
getParsedHeaders(req) {
|
|
31
58
|
let platform = (0, _resolvePlatform).parsePlatformHeader(req);
|
|
@@ -39,15 +66,32 @@ class ExpoGoManifestHandlerMiddleware extends _manifestMiddleware.ManifestMiddle
|
|
|
39
66
|
// URLs in a browser, we denote the response as "text/plain" if the user agent appears not to be
|
|
40
67
|
// an Expo Updates client.
|
|
41
68
|
const accept = (0, _accepts).default(req);
|
|
42
|
-
const
|
|
69
|
+
const acceptedType = accept.types([
|
|
43
70
|
"unknown/unknown",
|
|
44
|
-
"multipart/mixed"
|
|
45
|
-
|
|
71
|
+
"multipart/mixed",
|
|
72
|
+
"application/json",
|
|
73
|
+
"application/expo+json",
|
|
74
|
+
"text/plain",
|
|
75
|
+
]);
|
|
76
|
+
let responseContentType;
|
|
77
|
+
switch(acceptedType){
|
|
78
|
+
case "multipart/mixed":
|
|
79
|
+
responseContentType = 3;
|
|
80
|
+
break;
|
|
81
|
+
case "application/json":
|
|
82
|
+
responseContentType = 1;
|
|
83
|
+
break;
|
|
84
|
+
case "application/expo+json":
|
|
85
|
+
responseContentType = 2;
|
|
86
|
+
break;
|
|
87
|
+
default:
|
|
88
|
+
responseContentType = 0;
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
46
91
|
const expectSignature = req.headers["expo-expect-signature"];
|
|
47
92
|
return {
|
|
48
|
-
|
|
93
|
+
responseContentType,
|
|
49
94
|
platform,
|
|
50
|
-
acceptSignature: this.getLegacyAcceptSignatureHeader(req),
|
|
51
95
|
expectSignature: expectSignature ? String(expectSignature) : null,
|
|
52
96
|
hostname: (0, _url).stripPort(req.headers["host"])
|
|
53
97
|
};
|
|
@@ -75,12 +119,10 @@ class ExpoGoManifestHandlerMiddleware extends _manifestMiddleware.ManifestMiddle
|
|
|
75
119
|
}
|
|
76
120
|
const codeSigningInfo = await (0, _codesigning).getCodeSigningInfoAsync(exp, requestOptions.expectSignature, this.options.privateKeyPath);
|
|
77
121
|
const easProjectId = (ref = exp.extra) == null ? void 0 : (ref1 = ref.eas) == null ? void 0 : ref1.projectId;
|
|
78
|
-
const
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
}
|
|
83
|
-
const scopeKey = shouldUseAnonymousManifest ? `@${_user.ANONYMOUS_USERNAME}/${exp.slug}-${userAnonymousIdentifier}` : await this.getScopeKeyForProjectIdAsync(easProjectId);
|
|
122
|
+
const scopeKey = await ExpoGoManifestHandlerMiddleware.getScopeKeyAsync({
|
|
123
|
+
slug: exp.slug,
|
|
124
|
+
codeSigningInfo
|
|
125
|
+
});
|
|
84
126
|
const expoUpdatesManifest = {
|
|
85
127
|
id: _crypto.default.randomUUID(),
|
|
86
128
|
createdAt: new Date().toISOString(),
|
|
@@ -104,11 +146,6 @@ class ExpoGoManifestHandlerMiddleware extends _manifestMiddleware.ManifestMiddle
|
|
|
104
146
|
scopeKey
|
|
105
147
|
}
|
|
106
148
|
};
|
|
107
|
-
const headers = this.getDefaultResponseHeaders();
|
|
108
|
-
if (requestOptions.acceptSignature && !shouldUseAnonymousManifest) {
|
|
109
|
-
const manifestSignature = await this.getSignedManifestStringAsync(expoUpdatesManifest);
|
|
110
|
-
headers.set("expo-manifest-signature", manifestSignature);
|
|
111
|
-
}
|
|
112
149
|
const stringifiedManifest = JSON.stringify(expoUpdatesManifest);
|
|
113
150
|
let manifestPartHeaders = null;
|
|
114
151
|
let certificateChainBody = null;
|
|
@@ -123,17 +160,51 @@ class ExpoGoManifestHandlerMiddleware extends _manifestMiddleware.ManifestMiddle
|
|
|
123
160
|
};
|
|
124
161
|
certificateChainBody = codeSigningInfo.certificateChainForResponse.join("\n");
|
|
125
162
|
}
|
|
126
|
-
const
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
163
|
+
const headers = this.getDefaultResponseHeaders();
|
|
164
|
+
switch(requestOptions.responseContentType){
|
|
165
|
+
case 3:
|
|
166
|
+
{
|
|
167
|
+
const form = this.getFormData({
|
|
168
|
+
stringifiedManifest,
|
|
169
|
+
manifestPartHeaders,
|
|
170
|
+
certificateChainBody
|
|
171
|
+
});
|
|
172
|
+
headers.set("content-type", `multipart/mixed; boundary=${form.getBoundary()}`);
|
|
173
|
+
return {
|
|
174
|
+
body: form.getBuffer().toString(),
|
|
175
|
+
version: runtimeVersion,
|
|
176
|
+
headers
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
case 2:
|
|
180
|
+
case 1:
|
|
181
|
+
case 0:
|
|
182
|
+
{
|
|
183
|
+
headers.set("content-type", ExpoGoManifestHandlerMiddleware.getContentTypeForResponseContentType(requestOptions.responseContentType));
|
|
184
|
+
if (manifestPartHeaders) {
|
|
185
|
+
Object.entries(manifestPartHeaders).forEach(([key, value])=>{
|
|
186
|
+
headers.set(key, value);
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
return {
|
|
190
|
+
body: stringifiedManifest,
|
|
191
|
+
version: runtimeVersion,
|
|
192
|
+
headers
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
static getContentTypeForResponseContentType(responseContentType) {
|
|
198
|
+
switch(responseContentType){
|
|
199
|
+
case 3:
|
|
200
|
+
return "multipart/mixed";
|
|
201
|
+
case 2:
|
|
202
|
+
return "application/expo+json";
|
|
203
|
+
case 1:
|
|
204
|
+
return "application/json";
|
|
205
|
+
case 0:
|
|
206
|
+
return "text/plain";
|
|
207
|
+
}
|
|
137
208
|
}
|
|
138
209
|
getFormData({ stringifiedManifest , manifestPartHeaders , certificateChainBody }) {
|
|
139
210
|
const form = new _formData.default();
|
|
@@ -155,24 +226,19 @@ class ExpoGoManifestHandlerMiddleware extends _manifestMiddleware.ManifestMiddle
|
|
|
155
226
|
runtimeVersion: version
|
|
156
227
|
});
|
|
157
228
|
}
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
* a. If code signing not accepted by client (only legacy manifest signing is supported), then use anonymous scope key
|
|
166
|
-
* b. If code signing accepted by client and no development code signing certificate is cached, then use anonymous scope key
|
|
167
|
-
*/ async function shouldUseAnonymousManifestAsync(easProjectId, codeSigningInfo) {
|
|
168
|
-
if (!easProjectId || _settings.APISettings.isOffline && codeSigningInfo === null) {
|
|
169
|
-
return true;
|
|
229
|
+
static async getScopeKeyAsync({ slug , codeSigningInfo }) {
|
|
230
|
+
const scopeKeyFromCodeSigningInfo = codeSigningInfo == null ? void 0 : codeSigningInfo.scopeKey;
|
|
231
|
+
if (scopeKeyFromCodeSigningInfo) {
|
|
232
|
+
return scopeKeyFromCodeSigningInfo;
|
|
233
|
+
}
|
|
234
|
+
Log.warn(_settings.APISettings.isOffline ? "Using anonymous scope key in manifest for offline mode." : "Using anonymous scope key in manifest.");
|
|
235
|
+
return await getAnonymousScopeKeyAsync(slug);
|
|
170
236
|
}
|
|
171
|
-
return !await (0, _user).getUserAsync();
|
|
172
237
|
}
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
238
|
+
exports.ExpoGoManifestHandlerMiddleware = ExpoGoManifestHandlerMiddleware;
|
|
239
|
+
async function getAnonymousScopeKeyAsync(slug) {
|
|
240
|
+
const userAnonymousIdentifier = await _userSettings.default.getAnonymousIdentifierAsync();
|
|
241
|
+
return `@${_user.ANONYMOUS_USERNAME}/${slug}-${userAnonymousIdentifier}`;
|
|
176
242
|
}
|
|
177
243
|
function convertToDictionaryItemsRepresentation(obj) {
|
|
178
244
|
return new Map(Object.entries(obj).map(([k, v])=>{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/start/server/middleware/ExpoGoManifestHandlerMiddleware.ts"],"sourcesContent":["import { ExpoUpdatesManifest } from '@expo/config';\nimport { Updates } from '@expo/config-plugins';\nimport accepts from 'accepts';\nimport assert from 'assert';\nimport crypto from 'crypto';\nimport FormData from 'form-data';\nimport { serializeDictionary, Dictionary } from 'structured-headers';\n\nimport { getProjectAsync } from '../../../api/getProject';\nimport { APISettings } from '../../../api/settings';\nimport { signExpoGoManifestAsync } from '../../../api/signManifest';\nimport UserSettings from '../../../api/user/UserSettings';\nimport { ANONYMOUS_USERNAME, getUserAsync } from '../../../api/user/user';\nimport { logEventAsync } from '../../../utils/analytics/rudderstackClient';\nimport {\n CodeSigningInfo,\n getCodeSigningInfoAsync,\n signManifestString,\n} from '../../../utils/codesigning';\nimport { CommandError } from '../../../utils/errors';\nimport { memoize } from '../../../utils/fn';\nimport { stripPort } from '../../../utils/url';\nimport { ManifestMiddleware, ManifestRequestInfo } from './ManifestMiddleware';\nimport { assertRuntimePlatform, parsePlatformHeader } from './resolvePlatform';\nimport { ServerHeaders, ServerRequest } from './server.types';\n\nconst debug = require('debug')('expo:start:server:middleware:ExpoGoManifestHandlerMiddleware');\n\ninterface ExpoGoManifestRequestInfo extends ManifestRequestInfo {\n explicitlyPrefersMultipartMixed: boolean;\n expectSignature: string | null;\n}\n\nexport class ExpoGoManifestHandlerMiddleware extends ManifestMiddleware<ExpoGoManifestRequestInfo> {\n public getParsedHeaders(req: ServerRequest): ExpoGoManifestRequestInfo {\n let platform = parsePlatformHeader(req);\n\n if (!platform) {\n debug(\n `No \"expo-platform\" header or \"platform\" query parameter specified. Falling back to \"none\".`\n );\n platform = 'none';\n }\n\n assertRuntimePlatform(platform);\n\n // Expo Updates clients explicitly accept \"multipart/mixed\" responses while browsers implicitly\n // accept them with \"accept: */*\". To make it easier to debug manifest responses by visiting their\n // URLs in a browser, we denote the response as \"text/plain\" if the user agent appears not to be\n // an Expo Updates client.\n const accept = accepts(req);\n const explicitlyPrefersMultipartMixed =\n accept.types(['unknown/unknown', 'multipart/mixed']) === 'multipart/mixed';\n\n const expectSignature = req.headers['expo-expect-signature'];\n\n return {\n explicitlyPrefersMultipartMixed,\n platform,\n acceptSignature: this.getLegacyAcceptSignatureHeader(req),\n expectSignature: expectSignature ? String(expectSignature) : null,\n hostname: stripPort(req.headers['host']),\n };\n }\n\n private getDefaultResponseHeaders(): ServerHeaders {\n const headers = new Map<string, number | string | readonly string[]>();\n // set required headers for Expo Updates manifest specification\n headers.set('expo-protocol-version', 0);\n headers.set('expo-sfv-version', 0);\n headers.set('cache-control', 'private, max-age=0');\n return headers;\n }\n\n public async _getManifestResponseAsync(requestOptions: ExpoGoManifestRequestInfo): Promise<{\n body: string;\n version: string;\n headers: ServerHeaders;\n }> {\n const { exp, hostUri, expoGoConfig, bundleUrl } = await this._resolveProjectSettingsAsync(\n requestOptions\n );\n\n const runtimeVersion = Updates.getRuntimeVersion(\n { ...exp, runtimeVersion: exp.runtimeVersion ?? { policy: 'sdkVersion' } },\n requestOptions.platform\n );\n if (!runtimeVersion) {\n throw new CommandError(\n 'MANIFEST_MIDDLEWARE',\n `Unable to determine runtime version for platform '${requestOptions.platform}'`\n );\n }\n\n const codeSigningInfo = await getCodeSigningInfoAsync(\n exp,\n requestOptions.expectSignature,\n this.options.privateKeyPath\n );\n\n const easProjectId = exp.extra?.eas?.projectId;\n const shouldUseAnonymousManifest = await shouldUseAnonymousManifestAsync(\n easProjectId,\n codeSigningInfo\n );\n const userAnonymousIdentifier = await UserSettings.getAnonymousIdentifierAsync();\n if (!shouldUseAnonymousManifest) {\n assert(easProjectId);\n }\n const scopeKey = shouldUseAnonymousManifest\n ? `@${ANONYMOUS_USERNAME}/${exp.slug}-${userAnonymousIdentifier}`\n : await this.getScopeKeyForProjectIdAsync(easProjectId);\n\n const expoUpdatesManifest: ExpoUpdatesManifest = {\n id: crypto.randomUUID(),\n createdAt: new Date().toISOString(),\n runtimeVersion,\n launchAsset: {\n key: 'bundle',\n contentType: 'application/javascript',\n url: bundleUrl,\n },\n assets: [], // assets are not used in development\n metadata: {}, // required for the client to detect that this is an expo-updates manifest\n extra: {\n eas: {\n projectId: easProjectId ?? undefined,\n },\n expoClient: {\n ...exp,\n hostUri,\n },\n expoGo: expoGoConfig,\n scopeKey,\n },\n };\n\n const headers = this.getDefaultResponseHeaders();\n if (requestOptions.acceptSignature && !shouldUseAnonymousManifest) {\n const manifestSignature = await this.getSignedManifestStringAsync(expoUpdatesManifest);\n headers.set('expo-manifest-signature', manifestSignature);\n }\n\n const stringifiedManifest = JSON.stringify(expoUpdatesManifest);\n\n let manifestPartHeaders: { 'expo-signature': string } | null = null;\n let certificateChainBody: string | null = null;\n if (codeSigningInfo) {\n const signature = signManifestString(stringifiedManifest, codeSigningInfo);\n manifestPartHeaders = {\n 'expo-signature': serializeDictionary(\n convertToDictionaryItemsRepresentation({\n keyid: codeSigningInfo.keyId,\n sig: signature,\n alg: 'rsa-v1_5-sha256',\n })\n ),\n };\n certificateChainBody = codeSigningInfo.certificateChainForResponse.join('\\n');\n }\n\n const form = this.getFormData({\n stringifiedManifest,\n manifestPartHeaders,\n certificateChainBody,\n });\n\n headers.set(\n 'content-type',\n requestOptions.explicitlyPrefersMultipartMixed\n ? `multipart/mixed; boundary=${form.getBoundary()}`\n : 'text/plain'\n );\n\n return {\n body: form.getBuffer().toString(),\n version: runtimeVersion,\n headers,\n };\n }\n\n private getFormData({\n stringifiedManifest,\n manifestPartHeaders,\n certificateChainBody,\n }: {\n stringifiedManifest: string;\n manifestPartHeaders: { 'expo-signature': string } | null;\n certificateChainBody: string | null;\n }): FormData {\n const form = new FormData();\n form.append('manifest', stringifiedManifest, {\n contentType: 'application/json',\n header: {\n ...manifestPartHeaders,\n },\n });\n if (certificateChainBody && certificateChainBody.length > 0) {\n form.append('certificate_chain', certificateChainBody, {\n contentType: 'application/x-pem-file',\n });\n }\n return form;\n }\n\n protected trackManifest(version?: string) {\n logEventAsync('Serve Expo Updates Manifest', {\n runtimeVersion: version,\n });\n }\n\n private getSignedManifestStringAsync = memoize(signExpoGoManifestAsync);\n\n private getScopeKeyForProjectIdAsync = memoize(getScopeKeyForProjectIdAsync);\n}\n\n/**\n * 1. No EAS project ID in config, then use anonymous scope key\n * 2. When offline or not logged in\n * a. If code signing not accepted by client (only legacy manifest signing is supported), then use anonymous scope key\n * b. If code signing accepted by client and no development code signing certificate is cached, then use anonymous scope key\n */\nasync function shouldUseAnonymousManifestAsync(\n easProjectId: string | undefined | null,\n codeSigningInfo: CodeSigningInfo | null\n): Promise<boolean> {\n if (!easProjectId || (APISettings.isOffline && codeSigningInfo === null)) {\n return true;\n }\n\n return !(await getUserAsync());\n}\n\nasync function getScopeKeyForProjectIdAsync(projectId: string): Promise<string> {\n const project = await getProjectAsync(projectId);\n return project.scopeKey;\n}\n\nfunction convertToDictionaryItemsRepresentation(obj: { [key: string]: string }): Dictionary {\n return new Map(\n Object.entries(obj).map(([k, v]) => {\n return [k, [v, new Map()]];\n })\n );\n}\n"],"names":["debug","require","ExpoGoManifestHandlerMiddleware","ManifestMiddleware","getParsedHeaders","req","platform","parsePlatformHeader","assertRuntimePlatform","accept","accepts","explicitlyPrefersMultipartMixed","types","expectSignature","headers","acceptSignature","getLegacyAcceptSignatureHeader","String","hostname","stripPort","getDefaultResponseHeaders","Map","set","_getManifestResponseAsync","requestOptions","exp","hostUri","expoGoConfig","bundleUrl","_resolveProjectSettingsAsync","runtimeVersion","Updates","getRuntimeVersion","policy","CommandError","codeSigningInfo","getCodeSigningInfoAsync","options","privateKeyPath","easProjectId","extra","eas","projectId","shouldUseAnonymousManifest","shouldUseAnonymousManifestAsync","userAnonymousIdentifier","UserSettings","getAnonymousIdentifierAsync","assert","scopeKey","ANONYMOUS_USERNAME","slug","getScopeKeyForProjectIdAsync","expoUpdatesManifest","id","crypto","randomUUID","createdAt","Date","toISOString","launchAsset","key","contentType","url","assets","metadata","undefined","expoClient","expoGo","manifestSignature","getSignedManifestStringAsync","stringifiedManifest","JSON","stringify","manifestPartHeaders","certificateChainBody","signature","signManifestString","serializeDictionary","convertToDictionaryItemsRepresentation","keyid","keyId","sig","alg","certificateChainForResponse","join","form","getFormData","getBoundary","body","getBuffer","toString","version","FormData","append","header","length","trackManifest","logEventAsync","memoize","signExpoGoManifestAsync","APISettings","isOffline","getUserAsync","project","getProjectAsync","obj","Object","entries","map","k","v"],"mappings":"AAAA;;;;AACwB,IAAA,cAAsB,WAAtB,sBAAsB,CAAA;AAC1B,IAAA,QAAS,kCAAT,SAAS,EAAA;AACV,IAAA,OAAQ,kCAAR,QAAQ,EAAA;AACR,IAAA,OAAQ,kCAAR,QAAQ,EAAA;AACN,IAAA,SAAW,kCAAX,WAAW,EAAA;AACgB,IAAA,kBAAoB,WAApB,oBAAoB,CAAA;AAEpC,IAAA,WAAyB,WAAzB,yBAAyB,CAAA;AAC7B,IAAA,SAAuB,WAAvB,uBAAuB,CAAA;AACX,IAAA,aAA2B,WAA3B,2BAA2B,CAAA;AAC1C,IAAA,aAAgC,kCAAhC,gCAAgC,EAAA;AACR,IAAA,KAAwB,WAAxB,wBAAwB,CAAA;AAC3C,IAAA,kBAA4C,WAA5C,4CAA4C,CAAA;AAKnE,IAAA,YAA4B,WAA5B,4BAA4B,CAAA;AACN,IAAA,OAAuB,WAAvB,uBAAuB,CAAA;AAC5B,IAAA,GAAmB,WAAnB,mBAAmB,CAAA;AACjB,IAAA,IAAoB,WAApB,oBAAoB,CAAA;AACU,IAAA,mBAAsB,WAAtB,sBAAsB,CAAA;AACnB,IAAA,gBAAmB,WAAnB,mBAAmB,CAAA;;;;;;AAG9E,MAAMA,KAAK,GAAGC,OAAO,CAAC,OAAO,CAAC,CAAC,8DAA8D,CAAC,AAAC;AAOxF,MAAMC,+BAA+B,SAASC,mBAAkB,mBAAA;IACrE,AAAOC,gBAAgB,CAACC,GAAkB,EAA6B;QACrE,IAAIC,QAAQ,GAAGC,CAAAA,GAAAA,gBAAmB,AAAK,CAAA,oBAAL,CAACF,GAAG,CAAC,AAAC;QAExC,IAAI,CAACC,QAAQ,EAAE;YACbN,KAAK,CACH,CAAC,0FAA0F,CAAC,CAC7F,CAAC;YACFM,QAAQ,GAAG,MAAM,CAAC;SACnB;QAEDE,CAAAA,GAAAA,gBAAqB,AAAU,CAAA,sBAAV,CAACF,QAAQ,CAAC,CAAC;QAEhC,+FAA+F;QAC/F,kGAAkG;QAClG,gGAAgG;QAChG,0BAA0B;QAC1B,MAAMG,MAAM,GAAGC,CAAAA,GAAAA,QAAO,AAAK,CAAA,QAAL,CAACL,GAAG,CAAC,AAAC;QAC5B,MAAMM,+BAA+B,GACnCF,MAAM,CAACG,KAAK,CAAC;YAAC,iBAAiB;YAAE,iBAAiB;SAAC,CAAC,KAAK,iBAAiB,AAAC;QAE7E,MAAMC,eAAe,GAAGR,GAAG,CAACS,OAAO,CAAC,uBAAuB,CAAC,AAAC;QAE7D,OAAO;YACLH,+BAA+B;YAC/BL,QAAQ;YACRS,eAAe,EAAE,IAAI,CAACC,8BAA8B,CAACX,GAAG,CAAC;YACzDQ,eAAe,EAAEA,eAAe,GAAGI,MAAM,CAACJ,eAAe,CAAC,GAAG,IAAI;YACjEK,QAAQ,EAAEC,CAAAA,GAAAA,IAAS,AAAqB,CAAA,UAArB,CAACd,GAAG,CAACS,OAAO,CAAC,MAAM,CAAC,CAAC;SACzC,CAAC;KACH;IAED,AAAQM,yBAAyB,GAAkB;QACjD,MAAMN,OAAO,GAAG,IAAIO,GAAG,EAA+C,AAAC;QACvE,+DAA+D;QAC/DP,OAAO,CAACQ,GAAG,CAAC,uBAAuB,EAAE,CAAC,CAAC,CAAC;QACxCR,OAAO,CAACQ,GAAG,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC;QACnCR,OAAO,CAACQ,GAAG,CAAC,eAAe,EAAE,oBAAoB,CAAC,CAAC;QACnD,OAAOR,OAAO,CAAC;KAChB;IAED,MAAaS,yBAAyB,CAACC,cAAyC,EAI7E;YAsBoBC,GAAS;QArB9B,MAAM,EAAEA,GAAG,CAAA,EAAEC,OAAO,CAAA,EAAEC,YAAY,CAAA,EAAEC,SAAS,CAAA,EAAE,GAAG,MAAM,IAAI,CAACC,4BAA4B,CACvFL,cAAc,CACf,AAAC;YAG0BC,eAAkB;QAD9C,MAAMK,cAAc,GAAGC,cAAO,QAAA,CAACC,iBAAiB,CAC9C;YAAE,GAAGP,GAAG;YAAEK,cAAc,EAAEL,CAAAA,eAAkB,GAAlBA,GAAG,CAACK,cAAc,YAAlBL,eAAkB,GAAI;gBAAEQ,MAAM,EAAE,YAAY;aAAE;SAAE,EAC1ET,cAAc,CAAClB,QAAQ,CACxB,AAAC;QACF,IAAI,CAACwB,cAAc,EAAE;YACnB,MAAM,IAAII,OAAY,aAAA,CACpB,qBAAqB,EACrB,CAAC,kDAAkD,EAAEV,cAAc,CAAClB,QAAQ,CAAC,CAAC,CAAC,CAChF,CAAC;SACH;QAED,MAAM6B,eAAe,GAAG,MAAMC,CAAAA,GAAAA,YAAuB,AAIpD,CAAA,wBAJoD,CACnDX,GAAG,EACHD,cAAc,CAACX,eAAe,EAC9B,IAAI,CAACwB,OAAO,CAACC,cAAc,CAC5B,AAAC;QAEF,MAAMC,YAAY,GAAGd,CAAAA,GAAS,GAATA,GAAG,CAACe,KAAK,SAAK,GAAdf,KAAAA,CAAc,GAAdA,QAAAA,GAAS,CAAEgB,GAAG,SAAA,GAAdhB,KAAAA,CAAc,QAAEiB,SAAS,AAAX,AAAY;QAC/C,MAAMC,0BAA0B,GAAG,MAAMC,+BAA+B,CACtEL,YAAY,EACZJ,eAAe,CAChB,AAAC;QACF,MAAMU,uBAAuB,GAAG,MAAMC,aAAY,QAAA,CAACC,2BAA2B,EAAE,AAAC;QACjF,IAAI,CAACJ,0BAA0B,EAAE;YAC/BK,CAAAA,GAAAA,OAAM,AAAc,CAAA,QAAd,CAACT,YAAY,CAAC,CAAC;SACtB;QACD,MAAMU,QAAQ,GAAGN,0BAA0B,GACvC,CAAC,CAAC,EAAEO,KAAkB,mBAAA,CAAC,CAAC,EAAEzB,GAAG,CAAC0B,IAAI,CAAC,CAAC,EAAEN,uBAAuB,CAAC,CAAC,GAC/D,MAAM,IAAI,CAACO,4BAA4B,CAACb,YAAY,CAAC,AAAC;QAE1D,MAAMc,mBAAmB,GAAwB;YAC/CC,EAAE,EAAEC,OAAM,QAAA,CAACC,UAAU,EAAE;YACvBC,SAAS,EAAE,IAAIC,IAAI,EAAE,CAACC,WAAW,EAAE;YACnC7B,cAAc;YACd8B,WAAW,EAAE;gBACXC,GAAG,EAAE,QAAQ;gBACbC,WAAW,EAAE,wBAAwB;gBACrCC,GAAG,EAAEnC,SAAS;aACf;YACDoC,MAAM,EAAE,EAAE;YACVC,QAAQ,EAAE,EAAE;YACZzB,KAAK,EAAE;gBACLC,GAAG,EAAE;oBACHC,SAAS,EAAEH,YAAY,WAAZA,YAAY,GAAI2B,SAAS;iBACrC;gBACDC,UAAU,EAAE;oBACV,GAAG1C,GAAG;oBACNC,OAAO;iBACR;gBACD0C,MAAM,EAAEzC,YAAY;gBACpBsB,QAAQ;aACT;SACF,AAAC;QAEF,MAAMnC,OAAO,GAAG,IAAI,CAACM,yBAAyB,EAAE,AAAC;QACjD,IAAII,cAAc,CAACT,eAAe,IAAI,CAAC4B,0BAA0B,EAAE;YACjE,MAAM0B,iBAAiB,GAAG,MAAM,IAAI,CAACC,4BAA4B,CAACjB,mBAAmB,CAAC,AAAC;YACvFvC,OAAO,CAACQ,GAAG,CAAC,yBAAyB,EAAE+C,iBAAiB,CAAC,CAAC;SAC3D;QAED,MAAME,mBAAmB,GAAGC,IAAI,CAACC,SAAS,CAACpB,mBAAmB,CAAC,AAAC;QAEhE,IAAIqB,mBAAmB,GAAwC,IAAI,AAAC;QACpE,IAAIC,oBAAoB,GAAkB,IAAI,AAAC;QAC/C,IAAIxC,eAAe,EAAE;YACnB,MAAMyC,SAAS,GAAGC,CAAAA,GAAAA,YAAkB,AAAsC,CAAA,mBAAtC,CAACN,mBAAmB,EAAEpC,eAAe,CAAC,AAAC;YAC3EuC,mBAAmB,GAAG;gBACpB,gBAAgB,EAAEI,CAAAA,GAAAA,kBAAmB,AAMpC,CAAA,oBANoC,CACnCC,sCAAsC,CAAC;oBACrCC,KAAK,EAAE7C,eAAe,CAAC8C,KAAK;oBAC5BC,GAAG,EAAEN,SAAS;oBACdO,GAAG,EAAE,iBAAiB;iBACvB,CAAC,CACH;aACF,CAAC;YACFR,oBAAoB,GAAGxC,eAAe,CAACiD,2BAA2B,CAACC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC/E;QAED,MAAMC,IAAI,GAAG,IAAI,CAACC,WAAW,CAAC;YAC5BhB,mBAAmB;YACnBG,mBAAmB;YACnBC,oBAAoB;SACrB,CAAC,AAAC;QAEH7D,OAAO,CAACQ,GAAG,CACT,cAAc,EACdE,cAAc,CAACb,+BAA+B,GAC1C,CAAC,0BAA0B,EAAE2E,IAAI,CAACE,WAAW,EAAE,CAAC,CAAC,GACjD,YAAY,CACjB,CAAC;QAEF,OAAO;YACLC,IAAI,EAAEH,IAAI,CAACI,SAAS,EAAE,CAACC,QAAQ,EAAE;YACjCC,OAAO,EAAE9D,cAAc;YACvBhB,OAAO;SACR,CAAC;KACH;IAED,AAAQyE,WAAW,CAAC,EAClBhB,mBAAmB,CAAA,EACnBG,mBAAmB,CAAA,EACnBC,oBAAoB,CAAA,EAKrB,EAAY;QACX,MAAMW,IAAI,GAAG,IAAIO,SAAQ,QAAA,EAAE,AAAC;QAC5BP,IAAI,CAACQ,MAAM,CAAC,UAAU,EAAEvB,mBAAmB,EAAE;YAC3CT,WAAW,EAAE,kBAAkB;YAC/BiC,MAAM,EAAE;gBACN,GAAGrB,mBAAmB;aACvB;SACF,CAAC,CAAC;QACH,IAAIC,oBAAoB,IAAIA,oBAAoB,CAACqB,MAAM,GAAG,CAAC,EAAE;YAC3DV,IAAI,CAACQ,MAAM,CAAC,mBAAmB,EAAEnB,oBAAoB,EAAE;gBACrDb,WAAW,EAAE,wBAAwB;aACtC,CAAC,CAAC;SACJ;QACD,OAAOwB,IAAI,CAAC;KACb;IAED,AAAUW,aAAa,CAACL,OAAgB,EAAE;QACxCM,CAAAA,GAAAA,kBAAa,AAEX,CAAA,cAFW,CAAC,6BAA6B,EAAE;YAC3CpE,cAAc,EAAE8D,OAAO;SACxB,CAAC,CAAC;KACJ;IAED,AAAQtB,4BAA4B,GAAG6B,CAAAA,GAAAA,GAAO,AAAyB,CAAA,QAAzB,CAACC,aAAuB,wBAAA,CAAC,CAAC;IAExE,AAAQhD,4BAA4B,GAAG+C,CAAAA,GAAAA,GAAO,AAA8B,CAAA,QAA9B,CAAC/C,4BAA4B,CAAC,CAAC;CAC9E;QArLYlD,+BAA+B,GAA/BA,+BAA+B;AAuL5C;;;;;GAKG,CACH,eAAe0C,+BAA+B,CAC5CL,YAAuC,EACvCJ,eAAuC,EACrB;IAClB,IAAI,CAACI,YAAY,IAAK8D,SAAW,YAAA,CAACC,SAAS,IAAInE,eAAe,KAAK,IAAI,AAAC,EAAE;QACxE,OAAO,IAAI,CAAC;KACb;IAED,OAAO,CAAE,MAAMoE,CAAAA,GAAAA,KAAY,AAAE,CAAA,aAAF,EAAE,AAAC,CAAC;CAChC;AAED,eAAenD,4BAA4B,CAACV,SAAiB,EAAmB;IAC9E,MAAM8D,OAAO,GAAG,MAAMC,CAAAA,GAAAA,WAAe,AAAW,CAAA,gBAAX,CAAC/D,SAAS,CAAC,AAAC;IACjD,OAAO8D,OAAO,CAACvD,QAAQ,CAAC;CACzB;AAED,SAAS8B,sCAAsC,CAAC2B,GAA8B,EAAc;IAC1F,OAAO,IAAIrF,GAAG,CACZsF,MAAM,CAACC,OAAO,CAACF,GAAG,CAAC,CAACG,GAAG,CAAC,CAAC,CAACC,CAAC,EAAEC,CAAC,CAAC,GAAK;QAClC,OAAO;YAACD,CAAC;YAAE;gBAACC,CAAC;gBAAE,IAAI1F,GAAG,EAAE;aAAC;SAAC,CAAC;KAC5B,CAAC,CACH,CAAC;CACH"}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/server/middleware/ExpoGoManifestHandlerMiddleware.ts"],"sourcesContent":["import { ExpoUpdatesManifest } from '@expo/config';\nimport { Updates } from '@expo/config-plugins';\nimport accepts from 'accepts';\nimport crypto from 'crypto';\nimport FormData from 'form-data';\nimport { serializeDictionary, Dictionary } from 'structured-headers';\n\nimport { APISettings } from '../../../api/settings';\nimport UserSettings from '../../../api/user/UserSettings';\nimport { ANONYMOUS_USERNAME } from '../../../api/user/user';\nimport * as Log from '../../../log';\nimport { logEventAsync } from '../../../utils/analytics/rudderstackClient';\nimport {\n CodeSigningInfo,\n getCodeSigningInfoAsync,\n signManifestString,\n} from '../../../utils/codesigning';\nimport { CommandError } from '../../../utils/errors';\nimport { stripPort } from '../../../utils/url';\nimport { ManifestMiddleware, ManifestRequestInfo } from './ManifestMiddleware';\nimport { assertRuntimePlatform, parsePlatformHeader } from './resolvePlatform';\nimport { ServerHeaders, ServerRequest } from './server.types';\n\nconst debug = require('debug')('expo:start:server:middleware:ExpoGoManifestHandlerMiddleware');\n\nexport enum ResponseContentType {\n TEXT_PLAIN,\n APPLICATION_JSON,\n APPLICATION_EXPO_JSON,\n MULTIPART_MIXED,\n}\n\ninterface ExpoGoManifestRequestInfo extends ManifestRequestInfo {\n responseContentType: ResponseContentType;\n expectSignature: string | null;\n}\n\nexport class ExpoGoManifestHandlerMiddleware extends ManifestMiddleware<ExpoGoManifestRequestInfo> {\n public getParsedHeaders(req: ServerRequest): ExpoGoManifestRequestInfo {\n let platform = parsePlatformHeader(req);\n\n if (!platform) {\n debug(\n `No \"expo-platform\" header or \"platform\" query parameter specified. Falling back to \"none\".`\n );\n platform = 'none';\n }\n\n assertRuntimePlatform(platform);\n\n // Expo Updates clients explicitly accept \"multipart/mixed\" responses while browsers implicitly\n // accept them with \"accept: */*\". To make it easier to debug manifest responses by visiting their\n // URLs in a browser, we denote the response as \"text/plain\" if the user agent appears not to be\n // an Expo Updates client.\n const accept = accepts(req);\n const acceptedType = accept.types([\n 'unknown/unknown',\n 'multipart/mixed',\n 'application/json',\n 'application/expo+json',\n 'text/plain',\n ]);\n\n let responseContentType;\n switch (acceptedType) {\n case 'multipart/mixed':\n responseContentType = ResponseContentType.MULTIPART_MIXED;\n break;\n case 'application/json':\n responseContentType = ResponseContentType.APPLICATION_JSON;\n break;\n case 'application/expo+json':\n responseContentType = ResponseContentType.APPLICATION_EXPO_JSON;\n break;\n default:\n responseContentType = ResponseContentType.TEXT_PLAIN;\n break;\n }\n\n const expectSignature = req.headers['expo-expect-signature'];\n\n return {\n responseContentType,\n platform,\n expectSignature: expectSignature ? String(expectSignature) : null,\n hostname: stripPort(req.headers['host']),\n };\n }\n\n private getDefaultResponseHeaders(): ServerHeaders {\n const headers = new Map<string, number | string | readonly string[]>();\n // set required headers for Expo Updates manifest specification\n headers.set('expo-protocol-version', 0);\n headers.set('expo-sfv-version', 0);\n headers.set('cache-control', 'private, max-age=0');\n return headers;\n }\n\n public async _getManifestResponseAsync(requestOptions: ExpoGoManifestRequestInfo): Promise<{\n body: string;\n version: string;\n headers: ServerHeaders;\n }> {\n const { exp, hostUri, expoGoConfig, bundleUrl } = await this._resolveProjectSettingsAsync(\n requestOptions\n );\n\n const runtimeVersion = Updates.getRuntimeVersion(\n { ...exp, runtimeVersion: exp.runtimeVersion ?? { policy: 'sdkVersion' } },\n requestOptions.platform\n );\n if (!runtimeVersion) {\n throw new CommandError(\n 'MANIFEST_MIDDLEWARE',\n `Unable to determine runtime version for platform '${requestOptions.platform}'`\n );\n }\n\n const codeSigningInfo = await getCodeSigningInfoAsync(\n exp,\n requestOptions.expectSignature,\n this.options.privateKeyPath\n );\n\n const easProjectId = exp.extra?.eas?.projectId as string | undefined | null;\n const scopeKey = await ExpoGoManifestHandlerMiddleware.getScopeKeyAsync({\n slug: exp.slug,\n codeSigningInfo,\n });\n\n const expoUpdatesManifest: ExpoUpdatesManifest = {\n id: crypto.randomUUID(),\n createdAt: new Date().toISOString(),\n runtimeVersion,\n launchAsset: {\n key: 'bundle',\n contentType: 'application/javascript',\n url: bundleUrl,\n },\n assets: [], // assets are not used in development\n metadata: {}, // required for the client to detect that this is an expo-updates manifest\n extra: {\n eas: {\n projectId: easProjectId ?? undefined,\n },\n expoClient: {\n ...exp,\n hostUri,\n },\n expoGo: expoGoConfig,\n scopeKey,\n },\n };\n\n const stringifiedManifest = JSON.stringify(expoUpdatesManifest);\n\n let manifestPartHeaders: { 'expo-signature': string } | null = null;\n let certificateChainBody: string | null = null;\n if (codeSigningInfo) {\n const signature = signManifestString(stringifiedManifest, codeSigningInfo);\n manifestPartHeaders = {\n 'expo-signature': serializeDictionary(\n convertToDictionaryItemsRepresentation({\n keyid: codeSigningInfo.keyId,\n sig: signature,\n alg: 'rsa-v1_5-sha256',\n })\n ),\n };\n certificateChainBody = codeSigningInfo.certificateChainForResponse.join('\\n');\n }\n\n const headers = this.getDefaultResponseHeaders();\n\n switch (requestOptions.responseContentType) {\n case ResponseContentType.MULTIPART_MIXED: {\n const form = this.getFormData({\n stringifiedManifest,\n manifestPartHeaders,\n certificateChainBody,\n });\n headers.set('content-type', `multipart/mixed; boundary=${form.getBoundary()}`);\n return {\n body: form.getBuffer().toString(),\n version: runtimeVersion,\n headers,\n };\n }\n case ResponseContentType.APPLICATION_EXPO_JSON:\n case ResponseContentType.APPLICATION_JSON:\n case ResponseContentType.TEXT_PLAIN: {\n headers.set(\n 'content-type',\n ExpoGoManifestHandlerMiddleware.getContentTypeForResponseContentType(\n requestOptions.responseContentType\n )\n );\n if (manifestPartHeaders) {\n Object.entries(manifestPartHeaders).forEach(([key, value]) => {\n headers.set(key, value);\n });\n }\n\n return {\n body: stringifiedManifest,\n version: runtimeVersion,\n headers,\n };\n }\n }\n }\n\n private static getContentTypeForResponseContentType(\n responseContentType: ResponseContentType\n ): string {\n switch (responseContentType) {\n case ResponseContentType.MULTIPART_MIXED:\n return 'multipart/mixed';\n case ResponseContentType.APPLICATION_EXPO_JSON:\n return 'application/expo+json';\n case ResponseContentType.APPLICATION_JSON:\n return 'application/json';\n case ResponseContentType.TEXT_PLAIN:\n return 'text/plain';\n }\n }\n\n private getFormData({\n stringifiedManifest,\n manifestPartHeaders,\n certificateChainBody,\n }: {\n stringifiedManifest: string;\n manifestPartHeaders: { 'expo-signature': string } | null;\n certificateChainBody: string | null;\n }): FormData {\n const form = new FormData();\n form.append('manifest', stringifiedManifest, {\n contentType: 'application/json',\n header: {\n ...manifestPartHeaders,\n },\n });\n if (certificateChainBody && certificateChainBody.length > 0) {\n form.append('certificate_chain', certificateChainBody, {\n contentType: 'application/x-pem-file',\n });\n }\n return form;\n }\n\n protected trackManifest(version?: string) {\n logEventAsync('Serve Expo Updates Manifest', {\n runtimeVersion: version,\n });\n }\n\n private static async getScopeKeyAsync({\n slug,\n codeSigningInfo,\n }: {\n slug: string;\n codeSigningInfo: CodeSigningInfo | null;\n }): Promise<string> {\n const scopeKeyFromCodeSigningInfo = codeSigningInfo?.scopeKey;\n if (scopeKeyFromCodeSigningInfo) {\n return scopeKeyFromCodeSigningInfo;\n }\n\n Log.warn(\n APISettings.isOffline\n ? 'Using anonymous scope key in manifest for offline mode.'\n : 'Using anonymous scope key in manifest.'\n );\n return await getAnonymousScopeKeyAsync(slug);\n }\n}\n\nasync function getAnonymousScopeKeyAsync(slug: string): Promise<string> {\n const userAnonymousIdentifier = await UserSettings.getAnonymousIdentifierAsync();\n return `@${ANONYMOUS_USERNAME}/${slug}-${userAnonymousIdentifier}`;\n}\n\nfunction convertToDictionaryItemsRepresentation(obj: { [key: string]: string }): Dictionary {\n return new Map(\n Object.entries(obj).map(([k, v]) => {\n return [k, [v, new Map()]];\n })\n );\n}\n"],"names":["Log","debug","require","ResponseContentType","TEXT_PLAIN","APPLICATION_JSON","APPLICATION_EXPO_JSON","MULTIPART_MIXED","ExpoGoManifestHandlerMiddleware","ManifestMiddleware","getParsedHeaders","req","platform","parsePlatformHeader","assertRuntimePlatform","accept","accepts","acceptedType","types","responseContentType","expectSignature","headers","String","hostname","stripPort","getDefaultResponseHeaders","Map","set","_getManifestResponseAsync","requestOptions","exp","hostUri","expoGoConfig","bundleUrl","_resolveProjectSettingsAsync","runtimeVersion","Updates","getRuntimeVersion","policy","CommandError","codeSigningInfo","getCodeSigningInfoAsync","options","privateKeyPath","easProjectId","extra","eas","projectId","scopeKey","getScopeKeyAsync","slug","expoUpdatesManifest","id","crypto","randomUUID","createdAt","Date","toISOString","launchAsset","key","contentType","url","assets","metadata","undefined","expoClient","expoGo","stringifiedManifest","JSON","stringify","manifestPartHeaders","certificateChainBody","signature","signManifestString","serializeDictionary","convertToDictionaryItemsRepresentation","keyid","keyId","sig","alg","certificateChainForResponse","join","form","getFormData","getBoundary","body","getBuffer","toString","version","getContentTypeForResponseContentType","Object","entries","forEach","value","FormData","append","header","length","trackManifest","logEventAsync","scopeKeyFromCodeSigningInfo","warn","APISettings","isOffline","getAnonymousScopeKeyAsync","userAnonymousIdentifier","UserSettings","getAnonymousIdentifierAsync","ANONYMOUS_USERNAME","obj","map","k","v"],"mappings":"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"}
|
|
@@ -3,7 +3,10 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
3
3
|
value: true
|
|
4
4
|
});
|
|
5
5
|
exports.getWorkspaceRoot = getWorkspaceRoot;
|
|
6
|
+
exports.getEntryWithServerRoot = getEntryWithServerRoot;
|
|
6
7
|
exports.getMetroServerRoot = getMetroServerRoot;
|
|
8
|
+
exports.resolveMainModuleName = resolveMainModuleName;
|
|
9
|
+
exports.createBundleUrlPath = createBundleUrlPath;
|
|
7
10
|
exports.DEVELOPER_TOOL = void 0;
|
|
8
11
|
var _config = require("@expo/config");
|
|
9
12
|
var _findYarnWorkspaceRoot = _interopRequireDefault(require("find-yarn-workspace-root"));
|
|
@@ -56,6 +59,9 @@ function getWorkspaceRoot(projectRoot) {
|
|
|
56
59
|
throw error;
|
|
57
60
|
}
|
|
58
61
|
}
|
|
62
|
+
function getEntryWithServerRoot(projectRoot, projectConfig, platform) {
|
|
63
|
+
return _path.default.relative(getMetroServerRoot(projectRoot), (0, _resolveEntryPoint).resolveAbsoluteEntryPoint(projectRoot, platform, projectConfig));
|
|
64
|
+
}
|
|
59
65
|
function getMetroServerRoot(projectRoot) {
|
|
60
66
|
if (_env.env.EXPO_USE_METRO_WORKSPACE_ROOT) {
|
|
61
67
|
var ref;
|
|
@@ -63,6 +69,31 @@ function getMetroServerRoot(projectRoot) {
|
|
|
63
69
|
}
|
|
64
70
|
return projectRoot;
|
|
65
71
|
}
|
|
72
|
+
function resolveMainModuleName(projectRoot, projectConfig, platform) {
|
|
73
|
+
const entryPoint = getEntryWithServerRoot(projectRoot, projectConfig, platform);
|
|
74
|
+
debug(`Resolved entry point: ${entryPoint} (project root: ${projectRoot})`);
|
|
75
|
+
return (0, _url1).stripExtension(entryPoint, "js");
|
|
76
|
+
}
|
|
77
|
+
function createBundleUrlPath({ platform , mainModuleName , mode , minify =mode === "production" , environment , serializerOutput }) {
|
|
78
|
+
const queryParams = new URLSearchParams({
|
|
79
|
+
platform: encodeURIComponent(platform),
|
|
80
|
+
dev: String(mode !== "production"),
|
|
81
|
+
// TODO: Is this still needed?
|
|
82
|
+
hot: String(false),
|
|
83
|
+
lazy: String(!_env.env.EXPO_NO_METRO_LAZY)
|
|
84
|
+
});
|
|
85
|
+
if (minify) {
|
|
86
|
+
queryParams.append("minify", String(minify));
|
|
87
|
+
}
|
|
88
|
+
if (environment) {
|
|
89
|
+
queryParams.append("resolver.environment", environment);
|
|
90
|
+
queryParams.append("transform.environment", environment);
|
|
91
|
+
}
|
|
92
|
+
if (serializerOutput) {
|
|
93
|
+
queryParams.append("serializer.output", serializerOutput);
|
|
94
|
+
}
|
|
95
|
+
return `/${encodeURI(mainModuleName)}.bundle?${queryParams.toString()}`;
|
|
96
|
+
}
|
|
66
97
|
const DEVELOPER_TOOL = "expo-cli";
|
|
67
98
|
exports.DEVELOPER_TOOL = DEVELOPER_TOOL;
|
|
68
99
|
class ManifestMiddleware extends _expoMiddleware.ExpoMiddleware {
|
|
@@ -107,7 +138,7 @@ class ManifestMiddleware extends _expoMiddleware.ExpoMiddleware {
|
|
|
107
138
|
};
|
|
108
139
|
}
|
|
109
140
|
/** Get the main entry module ID (file) relative to the project root. */ resolveMainModuleName(projectConfig, platform) {
|
|
110
|
-
let entryPoint =
|
|
141
|
+
let entryPoint = getEntryWithServerRoot(this.projectRoot, projectConfig, platform);
|
|
111
142
|
debug(`Resolved entry point: ${entryPoint} (project root: ${this.projectRoot})`);
|
|
112
143
|
// NOTE(Bacon): Webpack is currently hardcoded to index.bundle on native
|
|
113
144
|
// in the future (TODO) we should move this logic into a Webpack plugin and use
|
|
@@ -120,13 +151,6 @@ class ManifestMiddleware extends _expoMiddleware.ExpoMiddleware {
|
|
|
120
151
|
}
|
|
121
152
|
return (0, _url1).stripExtension(entryPoint, "js");
|
|
122
153
|
}
|
|
123
|
-
/**
|
|
124
|
-
* This header is specified as a string "true" or "false", in one of two headers:
|
|
125
|
-
* - exponent-accept-signature
|
|
126
|
-
* - expo-accept-signature
|
|
127
|
-
*/ getLegacyAcceptSignatureHeader(req) {
|
|
128
|
-
return req.headers["exponent-accept-signature"] === "true" || req.headers["expo-accept-signature"] === "true";
|
|
129
|
-
}
|
|
130
154
|
/** Store device IDs that were sent in the request headers. */ async saveDevicesAsync(req) {
|
|
131
155
|
var ref;
|
|
132
156
|
const deviceIds = (ref = req.headers) == null ? void 0 : ref["expo-dev-client-id"];
|
|
@@ -136,7 +160,10 @@ class ManifestMiddleware extends _expoMiddleware.ExpoMiddleware {
|
|
|
136
160
|
}
|
|
137
161
|
}
|
|
138
162
|
/** Create the bundle URL (points to the single JS entry file). Exposed for testing. */ _getBundleUrl({ platform , mainModuleName , hostname }) {
|
|
139
|
-
|
|
163
|
+
var _mode;
|
|
164
|
+
const path = createBundleUrlPath({
|
|
165
|
+
mode: (_mode = this.options.mode) != null ? _mode : "development",
|
|
166
|
+
minify: this.options.minify,
|
|
140
167
|
platform,
|
|
141
168
|
mainModuleName
|
|
142
169
|
});
|
|
@@ -151,7 +178,8 @@ class ManifestMiddleware extends _expoMiddleware.ExpoMiddleware {
|
|
|
151
178
|
platform: encodeURIComponent(platform),
|
|
152
179
|
dev: String(this.options.mode !== "production"),
|
|
153
180
|
// TODO: Is this still needed?
|
|
154
|
-
hot: String(false)
|
|
181
|
+
hot: String(false),
|
|
182
|
+
lazy: String(!_env.env.EXPO_NO_METRO_LAZY)
|
|
155
183
|
});
|
|
156
184
|
if (this.options.minify) {
|
|
157
185
|
queryParams.append("minify", String(this.options.minify));
|
|
@@ -204,19 +232,23 @@ class ManifestMiddleware extends _expoMiddleware.ExpoMiddleware {
|
|
|
204
232
|
// The server normally inserts this but if we're offline we'll do it here
|
|
205
233
|
await (0, _resolveAssets).resolveGoogleServicesFile(this.projectRoot, manifest);
|
|
206
234
|
}
|
|
235
|
+
getWebBundleUrl() {
|
|
236
|
+
const platform = "web";
|
|
237
|
+
// Read from headers
|
|
238
|
+
const mainModuleName = this.resolveMainModuleName(this.initialProjectConfig, platform);
|
|
239
|
+
return this._getBundleUrlPath({
|
|
240
|
+
platform,
|
|
241
|
+
mainModuleName
|
|
242
|
+
});
|
|
243
|
+
}
|
|
207
244
|
/**
|
|
208
245
|
* Web platforms should create an index.html response using the same script resolution as native.
|
|
209
246
|
*
|
|
210
247
|
* Instead of adding a `bundleUrl` to a `manifest.json` (native) we'll add a `<script src="">`
|
|
211
248
|
* to an `index.html`, this enables the web platform to load JavaScript from the server.
|
|
212
249
|
*/ async handleWebRequestAsync(req, res) {
|
|
213
|
-
const platform = "web";
|
|
214
250
|
// Read from headers
|
|
215
|
-
const
|
|
216
|
-
const bundleUrl = this._getBundleUrlPath({
|
|
217
|
-
platform,
|
|
218
|
-
mainModuleName
|
|
219
|
-
});
|
|
251
|
+
const bundleUrl = this.getWebBundleUrl();
|
|
220
252
|
res.setHeader("Content-Type", "text/html");
|
|
221
253
|
res.end(await (0, _webTemplate).createTemplateHtmlFromExpoConfigAsync(this.projectRoot, {
|
|
222
254
|
exp: this.initialProjectConfig.exp,
|
|
@@ -225,7 +257,7 @@ class ManifestMiddleware extends _expoMiddleware.ExpoMiddleware {
|
|
|
225
257
|
]
|
|
226
258
|
}));
|
|
227
259
|
}
|
|
228
|
-
/** Exposed for testing. */ async checkBrowserRequestAsync(req, res) {
|
|
260
|
+
/** Exposed for testing. */ async checkBrowserRequestAsync(req, res, next) {
|
|
229
261
|
// Read the config
|
|
230
262
|
const bundlers = (0, _platformBundlers).getPlatformBundlers(this.initialProjectConfig.exp);
|
|
231
263
|
if (bundlers.web === "metro") {
|
|
@@ -235,15 +267,22 @@ class ManifestMiddleware extends _expoMiddleware.ExpoMiddleware {
|
|
|
235
267
|
const platform = (0, _resolvePlatform).parsePlatformHeader(req);
|
|
236
268
|
// On web, serve the public folder
|
|
237
269
|
if (!platform || platform === "web") {
|
|
238
|
-
|
|
239
|
-
|
|
270
|
+
var ref;
|
|
271
|
+
if (((ref = this.initialProjectConfig.exp.web) == null ? void 0 : ref.output) === "static") {
|
|
272
|
+
// Skip the spa-styled index.html when static generation is enabled.
|
|
273
|
+
next();
|
|
274
|
+
return true;
|
|
275
|
+
} else {
|
|
276
|
+
await this.handleWebRequestAsync(req, res);
|
|
277
|
+
return true;
|
|
278
|
+
}
|
|
240
279
|
}
|
|
241
280
|
}
|
|
242
281
|
return false;
|
|
243
282
|
}
|
|
244
283
|
async handleRequestAsync(req, res, next) {
|
|
245
284
|
// First check for standard JavaScript runtimes (aka legacy browsers like Chrome).
|
|
246
|
-
if (await this.checkBrowserRequestAsync(req, res)) {
|
|
285
|
+
if (await this.checkBrowserRequestAsync(req, res, next)) {
|
|
247
286
|
return;
|
|
248
287
|
}
|
|
249
288
|
// Save device IDs for dev client.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/start/server/middleware/ManifestMiddleware.ts"],"sourcesContent":["import { ExpoConfig, ExpoGoConfig, getConfig, ProjectConfig } from '@expo/config';\nimport findWorkspaceRoot from 'find-yarn-workspace-root';\nimport path from 'path';\nimport { resolve } from 'url';\n\nimport * as Log from '../../../log';\nimport { env } from '../../../utils/env';\nimport { stripExtension } from '../../../utils/url';\nimport * as ProjectDevices from '../../project/devices';\nimport { UrlCreator } from '../UrlCreator';\nimport { getPlatformBundlers } from '../platformBundlers';\nimport { createTemplateHtmlFromExpoConfigAsync } from '../webTemplate';\nimport { ExpoMiddleware } from './ExpoMiddleware';\nimport { resolveGoogleServicesFile, resolveManifestAssets } from './resolveAssets';\nimport { resolveAbsoluteEntryPoint } from './resolveEntryPoint';\nimport { parsePlatformHeader, RuntimePlatform } from './resolvePlatform';\nimport { ServerHeaders, ServerNext, ServerRequest, ServerResponse } from './server.types';\n\nconst debug = require('debug')('expo:start:server:middleware:manifest') as typeof console.log;\n\n/** Wraps `findWorkspaceRoot` and guards against having an empty `package.json` file in an upper directory. */\nexport function getWorkspaceRoot(projectRoot: string): string | null {\n try {\n return findWorkspaceRoot(projectRoot);\n } catch (error: any) {\n if (error.message.includes('Unexpected end of JSON input')) {\n return null;\n }\n throw error;\n }\n}\n\nexport function getMetroServerRoot(projectRoot: string) {\n if (env.EXPO_USE_METRO_WORKSPACE_ROOT) {\n return getWorkspaceRoot(projectRoot) ?? projectRoot;\n }\n\n return projectRoot;\n}\n\n/** Info about the computer hosting the dev server. */\nexport interface HostInfo {\n host: string;\n server: 'expo';\n serverVersion: string;\n serverDriver: string | null;\n serverOS: NodeJS.Platform;\n serverOSVersion: string;\n}\n\n/** Parsed values from the supported request headers. */\nexport interface ManifestRequestInfo {\n /** Should return the signed manifest. */\n acceptSignature: boolean;\n /** Platform to serve. */\n platform: RuntimePlatform;\n /** Requested host name. */\n hostname?: string | null;\n}\n\n/** Project related info. */\nexport type ResponseProjectSettings = {\n expoGoConfig: ExpoGoConfig;\n hostUri: string;\n bundleUrl: string;\n exp: ExpoConfig;\n};\n\nexport const DEVELOPER_TOOL = 'expo-cli';\n\nexport type ManifestMiddlewareOptions = {\n /** Should start the dev servers in development mode (minify). */\n mode?: 'development' | 'production';\n /** Should instruct the bundler to create minified bundles. */\n minify?: boolean;\n constructUrl: UrlCreator['constructUrl'];\n isNativeWebpack?: boolean;\n privateKeyPath?: string;\n};\n\n/** Base middleware creator for serving the Expo manifest (like the index.html but for native runtimes). */\nexport abstract class ManifestMiddleware<\n TManifestRequestInfo extends ManifestRequestInfo\n> extends ExpoMiddleware {\n private initialProjectConfig: ProjectConfig;\n\n constructor(protected projectRoot: string, protected options: ManifestMiddlewareOptions) {\n super(\n projectRoot,\n /**\n * Only support `/`, `/manifest`, `/index.exp` for the manifest middleware.\n */\n ['/', '/manifest', '/index.exp']\n );\n this.initialProjectConfig = getConfig(projectRoot);\n }\n\n /** Exposed for testing. */\n public async _resolveProjectSettingsAsync({\n platform,\n hostname,\n }: Pick<TManifestRequestInfo, 'hostname' | 'platform'>): Promise<ResponseProjectSettings> {\n // Read the config\n const projectConfig = getConfig(this.projectRoot);\n\n // Read from headers\n const mainModuleName = this.resolveMainModuleName(projectConfig, platform);\n\n // Create the manifest and set fields within it\n const expoGoConfig = this.getExpoGoConfig({\n mainModuleName,\n hostname,\n });\n\n const hostUri = this.options.constructUrl({ scheme: '', hostname });\n\n const bundleUrl = this._getBundleUrl({\n platform,\n mainModuleName,\n hostname,\n });\n\n // Resolve all assets and set them on the manifest as URLs\n await this.mutateManifestWithAssetsAsync(projectConfig.exp, bundleUrl);\n\n return {\n expoGoConfig,\n hostUri,\n bundleUrl,\n exp: projectConfig.exp,\n };\n }\n\n /** Get the main entry module ID (file) relative to the project root. */\n private resolveMainModuleName(projectConfig: ProjectConfig, platform: string): string {\n let entryPoint = path.relative(\n getMetroServerRoot(this.projectRoot),\n resolveAbsoluteEntryPoint(this.projectRoot, platform, projectConfig)\n );\n\n debug(`Resolved entry point: ${entryPoint} (project root: ${this.projectRoot})`);\n\n // NOTE(Bacon): Webpack is currently hardcoded to index.bundle on native\n // in the future (TODO) we should move this logic into a Webpack plugin and use\n // a generated file name like we do on web.\n // const server = getDefaultDevServer();\n // // TODO: Move this into BundlerDevServer and read this info from self.\n // const isNativeWebpack = server instanceof WebpackBundlerDevServer && server.isTargetingNative();\n if (this.options.isNativeWebpack) {\n entryPoint = 'index.js';\n }\n\n return stripExtension(entryPoint, 'js');\n }\n\n /** Parse request headers into options. */\n public abstract getParsedHeaders(req: ServerRequest): TManifestRequestInfo;\n\n /**\n * This header is specified as a string \"true\" or \"false\", in one of two headers:\n * - exponent-accept-signature\n * - expo-accept-signature\n */\n protected getLegacyAcceptSignatureHeader(req: ServerRequest): boolean {\n return (\n req.headers['exponent-accept-signature'] === 'true' ||\n req.headers['expo-accept-signature'] === 'true'\n );\n }\n\n /** Store device IDs that were sent in the request headers. */\n private async saveDevicesAsync(req: ServerRequest) {\n const deviceIds = req.headers?.['expo-dev-client-id'];\n if (deviceIds) {\n await ProjectDevices.saveDevicesAsync(this.projectRoot, deviceIds).catch((e) =>\n Log.exception(e)\n );\n }\n }\n\n /** Create the bundle URL (points to the single JS entry file). Exposed for testing. */\n public _getBundleUrl({\n platform,\n mainModuleName,\n hostname,\n }: {\n platform: string;\n hostname?: string | null;\n mainModuleName: string;\n }): string {\n const path = this._getBundleUrlPath({ platform, mainModuleName });\n\n return (\n this.options.constructUrl({\n scheme: 'http',\n // hostType: this.options.location.hostType,\n hostname,\n }) + path\n );\n }\n\n public _getBundleUrlPath({\n platform,\n mainModuleName,\n }: {\n platform: string;\n mainModuleName: string;\n }): string {\n const queryParams = new URLSearchParams({\n platform: encodeURIComponent(platform),\n dev: String(this.options.mode !== 'production'),\n // TODO: Is this still needed?\n hot: String(false),\n });\n\n if (this.options.minify) {\n queryParams.append('minify', String(this.options.minify));\n }\n\n return `/${encodeURI(mainModuleName)}.bundle?${queryParams.toString()}`;\n }\n\n /** Log telemetry. */\n protected abstract trackManifest(version?: string): void;\n\n /** Get the manifest response to return to the runtime. This file contains info regarding where the assets can be loaded from. Exposed for testing. */\n public abstract _getManifestResponseAsync(options: TManifestRequestInfo): Promise<{\n body: string;\n version: string;\n headers: ServerHeaders;\n }>;\n\n private getExpoGoConfig({\n mainModuleName,\n hostname,\n }: {\n mainModuleName: string;\n hostname?: string | null;\n }): ExpoGoConfig {\n return {\n // localhost:19000\n debuggerHost: this.options.constructUrl({ scheme: '', hostname }),\n // http://localhost:19000/logs -- used to send logs to the CLI for displaying in the terminal.\n // This is deprecated in favor of the WebSocket connection setup in Metro.\n logUrl: this.options.constructUrl({ scheme: 'http', hostname }) + '/logs',\n // Required for Expo Go to function.\n developer: {\n tool: DEVELOPER_TOOL,\n projectRoot: this.projectRoot,\n },\n packagerOpts: {\n // Required for dev client.\n dev: this.options.mode !== 'production',\n },\n // Indicates the name of the main bundle.\n mainModuleName,\n // Add this string to make Flipper register React Native / Metro as \"running\".\n // Can be tested by running:\n // `METRO_SERVER_PORT=19000 open -a flipper.app`\n // Where 19000 is the port where the Expo project is being hosted.\n __flipperHack: 'React Native packager is running',\n };\n }\n\n /** Resolve all assets and set them on the manifest as URLs */\n private async mutateManifestWithAssetsAsync(manifest: ExpoConfig, bundleUrl: string) {\n await resolveManifestAssets(this.projectRoot, {\n manifest,\n resolver: async (path) => {\n if (this.options.isNativeWebpack) {\n // When using our custom dev server, just do assets normally\n // without the `assets/` subpath redirect.\n return resolve(bundleUrl!.match(/^https?:\\/\\/.*?\\//)![0], path);\n }\n return bundleUrl!.match(/^https?:\\/\\/.*?\\//)![0] + 'assets/' + path;\n },\n });\n // The server normally inserts this but if we're offline we'll do it here\n await resolveGoogleServicesFile(this.projectRoot, manifest);\n }\n\n /**\n * Web platforms should create an index.html response using the same script resolution as native.\n *\n * Instead of adding a `bundleUrl` to a `manifest.json` (native) we'll add a `<script src=\"\">`\n * to an `index.html`, this enables the web platform to load JavaScript from the server.\n */\n private async handleWebRequestAsync(req: ServerRequest, res: ServerResponse) {\n const platform = 'web';\n // Read from headers\n const mainModuleName = this.resolveMainModuleName(this.initialProjectConfig, platform);\n const bundleUrl = this._getBundleUrlPath({\n platform,\n mainModuleName,\n });\n\n res.setHeader('Content-Type', 'text/html');\n\n res.end(\n await createTemplateHtmlFromExpoConfigAsync(this.projectRoot, {\n exp: this.initialProjectConfig.exp,\n scripts: [bundleUrl],\n })\n );\n }\n\n /** Exposed for testing. */\n async checkBrowserRequestAsync(req: ServerRequest, res: ServerResponse) {\n // Read the config\n const bundlers = getPlatformBundlers(this.initialProjectConfig.exp);\n if (bundlers.web === 'metro') {\n // NOTE(EvanBacon): This effectively disables the safety check we do on custom runtimes to ensure\n // the `expo-platform` header is included. When `web.bundler=web`, if the user has non-standard Expo\n // code loading then they'll get a web bundle without a clear assertion of platform support.\n const platform = parsePlatformHeader(req);\n // On web, serve the public folder\n if (!platform || platform === 'web') {\n await this.handleWebRequestAsync(req, res);\n return true;\n }\n }\n return false;\n }\n\n async handleRequestAsync(\n req: ServerRequest,\n res: ServerResponse,\n next: ServerNext\n ): Promise<void> {\n // First check for standard JavaScript runtimes (aka legacy browsers like Chrome).\n if (await this.checkBrowserRequestAsync(req, res)) {\n return;\n }\n\n // Save device IDs for dev client.\n await this.saveDevicesAsync(req);\n\n // Read from headers\n const options = this.getParsedHeaders(req);\n const { body, version, headers } = await this._getManifestResponseAsync(options);\n for (const [headerName, headerValue] of headers) {\n res.setHeader(headerName, headerValue);\n }\n res.end(body);\n\n // Log analytics\n this.trackManifest(version ?? null);\n }\n}\n"],"names":["getWorkspaceRoot","getMetroServerRoot","Log","ProjectDevices","debug","require","projectRoot","findWorkspaceRoot","error","message","includes","env","EXPO_USE_METRO_WORKSPACE_ROOT","DEVELOPER_TOOL","ManifestMiddleware","ExpoMiddleware","constructor","options","initialProjectConfig","getConfig","_resolveProjectSettingsAsync","platform","hostname","projectConfig","mainModuleName","resolveMainModuleName","expoGoConfig","getExpoGoConfig","hostUri","constructUrl","scheme","bundleUrl","_getBundleUrl","mutateManifestWithAssetsAsync","exp","entryPoint","path","relative","resolveAbsoluteEntryPoint","isNativeWebpack","stripExtension","getLegacyAcceptSignatureHeader","req","headers","saveDevicesAsync","deviceIds","catch","e","exception","_getBundleUrlPath","queryParams","URLSearchParams","encodeURIComponent","dev","String","mode","hot","minify","append","encodeURI","toString","debuggerHost","logUrl","developer","tool","packagerOpts","__flipperHack","manifest","resolveManifestAssets","resolver","resolve","match","resolveGoogleServicesFile","handleWebRequestAsync","res","setHeader","end","createTemplateHtmlFromExpoConfigAsync","scripts","checkBrowserRequestAsync","bundlers","getPlatformBundlers","web","parsePlatformHeader","handleRequestAsync","next","getParsedHeaders","body","version","_getManifestResponseAsync","headerName","headerValue","trackManifest"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/server/middleware/ManifestMiddleware.ts"],"sourcesContent":["import { ExpoConfig, ExpoGoConfig, getConfig, ProjectConfig } from '@expo/config';\nimport findWorkspaceRoot from 'find-yarn-workspace-root';\nimport path from 'path';\nimport { resolve } from 'url';\n\nimport * as Log from '../../../log';\nimport { env } from '../../../utils/env';\nimport { stripExtension } from '../../../utils/url';\nimport * as ProjectDevices from '../../project/devices';\nimport { UrlCreator } from '../UrlCreator';\nimport { getPlatformBundlers } from '../platformBundlers';\nimport { createTemplateHtmlFromExpoConfigAsync } from '../webTemplate';\nimport { ExpoMiddleware } from './ExpoMiddleware';\nimport { resolveGoogleServicesFile, resolveManifestAssets } from './resolveAssets';\nimport { resolveAbsoluteEntryPoint } from './resolveEntryPoint';\nimport { parsePlatformHeader, RuntimePlatform } from './resolvePlatform';\nimport { ServerHeaders, ServerNext, ServerRequest, ServerResponse } from './server.types';\n\nconst debug = require('debug')('expo:start:server:middleware:manifest') as typeof console.log;\n\n/** Wraps `findWorkspaceRoot` and guards against having an empty `package.json` file in an upper directory. */\nexport function getWorkspaceRoot(projectRoot: string): string | null {\n try {\n return findWorkspaceRoot(projectRoot);\n } catch (error: any) {\n if (error.message.includes('Unexpected end of JSON input')) {\n return null;\n }\n throw error;\n }\n}\n\nexport function getEntryWithServerRoot(\n projectRoot: string,\n projectConfig: ProjectConfig,\n platform: string\n) {\n return path.relative(\n getMetroServerRoot(projectRoot),\n resolveAbsoluteEntryPoint(projectRoot, platform, projectConfig)\n );\n}\n\nexport function getMetroServerRoot(projectRoot: string) {\n if (env.EXPO_USE_METRO_WORKSPACE_ROOT) {\n return getWorkspaceRoot(projectRoot) ?? projectRoot;\n }\n\n return projectRoot;\n}\n\n/** Get the main entry module ID (file) relative to the project root. */\nexport function resolveMainModuleName(\n projectRoot: string,\n projectConfig: ProjectConfig,\n platform: string\n): string {\n const entryPoint = getEntryWithServerRoot(projectRoot, projectConfig, platform);\n\n debug(`Resolved entry point: ${entryPoint} (project root: ${projectRoot})`);\n\n return stripExtension(entryPoint, 'js');\n}\n\nexport function createBundleUrlPath({\n platform,\n mainModuleName,\n mode,\n minify = mode === 'production',\n environment,\n serializerOutput,\n}: {\n platform: string;\n mainModuleName: string;\n mode: string;\n minify?: boolean;\n environment?: string;\n serializerOutput?: 'static';\n}): string {\n const queryParams = new URLSearchParams({\n platform: encodeURIComponent(platform),\n dev: String(mode !== 'production'),\n // TODO: Is this still needed?\n hot: String(false),\n lazy: String(!env.EXPO_NO_METRO_LAZY),\n });\n\n if (minify) {\n queryParams.append('minify', String(minify));\n }\n if (environment) {\n queryParams.append('resolver.environment', environment);\n queryParams.append('transform.environment', environment);\n }\n if (serializerOutput) {\n queryParams.append('serializer.output', serializerOutput);\n }\n\n return `/${encodeURI(mainModuleName)}.bundle?${queryParams.toString()}`;\n}\n\n/** Info about the computer hosting the dev server. */\nexport interface HostInfo {\n host: string;\n server: 'expo';\n serverVersion: string;\n serverDriver: string | null;\n serverOS: NodeJS.Platform;\n serverOSVersion: string;\n}\n\n/** Parsed values from the supported request headers. */\nexport interface ManifestRequestInfo {\n /** Platform to serve. */\n platform: RuntimePlatform;\n /** Requested host name. */\n hostname?: string | null;\n}\n\n/** Project related info. */\nexport type ResponseProjectSettings = {\n expoGoConfig: ExpoGoConfig;\n hostUri: string;\n bundleUrl: string;\n exp: ExpoConfig;\n};\n\nexport const DEVELOPER_TOOL = 'expo-cli';\n\nexport type ManifestMiddlewareOptions = {\n /** Should start the dev servers in development mode (minify). */\n mode?: 'development' | 'production';\n /** Should instruct the bundler to create minified bundles. */\n minify?: boolean;\n constructUrl: UrlCreator['constructUrl'];\n isNativeWebpack?: boolean;\n privateKeyPath?: string;\n};\n\n/** Base middleware creator for serving the Expo manifest (like the index.html but for native runtimes). */\nexport abstract class ManifestMiddleware<\n TManifestRequestInfo extends ManifestRequestInfo\n> extends ExpoMiddleware {\n private initialProjectConfig: ProjectConfig;\n\n constructor(protected projectRoot: string, protected options: ManifestMiddlewareOptions) {\n super(\n projectRoot,\n /**\n * Only support `/`, `/manifest`, `/index.exp` for the manifest middleware.\n */\n ['/', '/manifest', '/index.exp']\n );\n this.initialProjectConfig = getConfig(projectRoot);\n }\n\n /** Exposed for testing. */\n public async _resolveProjectSettingsAsync({\n platform,\n hostname,\n }: Pick<TManifestRequestInfo, 'hostname' | 'platform'>): Promise<ResponseProjectSettings> {\n // Read the config\n const projectConfig = getConfig(this.projectRoot);\n\n // Read from headers\n const mainModuleName = this.resolveMainModuleName(projectConfig, platform);\n\n // Create the manifest and set fields within it\n const expoGoConfig = this.getExpoGoConfig({\n mainModuleName,\n hostname,\n });\n\n const hostUri = this.options.constructUrl({ scheme: '', hostname });\n\n const bundleUrl = this._getBundleUrl({\n platform,\n mainModuleName,\n hostname,\n });\n\n // Resolve all assets and set them on the manifest as URLs\n await this.mutateManifestWithAssetsAsync(projectConfig.exp, bundleUrl);\n\n return {\n expoGoConfig,\n hostUri,\n bundleUrl,\n exp: projectConfig.exp,\n };\n }\n\n /** Get the main entry module ID (file) relative to the project root. */\n private resolveMainModuleName(projectConfig: ProjectConfig, platform: string): string {\n let entryPoint = getEntryWithServerRoot(this.projectRoot, projectConfig, platform);\n\n debug(`Resolved entry point: ${entryPoint} (project root: ${this.projectRoot})`);\n\n // NOTE(Bacon): Webpack is currently hardcoded to index.bundle on native\n // in the future (TODO) we should move this logic into a Webpack plugin and use\n // a generated file name like we do on web.\n // const server = getDefaultDevServer();\n // // TODO: Move this into BundlerDevServer and read this info from self.\n // const isNativeWebpack = server instanceof WebpackBundlerDevServer && server.isTargetingNative();\n if (this.options.isNativeWebpack) {\n entryPoint = 'index.js';\n }\n\n return stripExtension(entryPoint, 'js');\n }\n\n /** Parse request headers into options. */\n public abstract getParsedHeaders(req: ServerRequest): TManifestRequestInfo;\n\n /** Store device IDs that were sent in the request headers. */\n private async saveDevicesAsync(req: ServerRequest) {\n const deviceIds = req.headers?.['expo-dev-client-id'];\n if (deviceIds) {\n await ProjectDevices.saveDevicesAsync(this.projectRoot, deviceIds).catch((e) =>\n Log.exception(e)\n );\n }\n }\n\n /** Create the bundle URL (points to the single JS entry file). Exposed for testing. */\n public _getBundleUrl({\n platform,\n mainModuleName,\n hostname,\n }: {\n platform: string;\n hostname?: string | null;\n mainModuleName: string;\n }): string {\n const path = createBundleUrlPath({\n mode: this.options.mode ?? 'development',\n minify: this.options.minify,\n platform,\n mainModuleName,\n });\n\n return (\n this.options.constructUrl({\n scheme: 'http',\n // hostType: this.options.location.hostType,\n hostname,\n }) + path\n );\n }\n\n public _getBundleUrlPath({\n platform,\n mainModuleName,\n }: {\n platform: string;\n mainModuleName: string;\n }): string {\n const queryParams = new URLSearchParams({\n platform: encodeURIComponent(platform),\n dev: String(this.options.mode !== 'production'),\n // TODO: Is this still needed?\n hot: String(false),\n lazy: String(!env.EXPO_NO_METRO_LAZY),\n });\n\n if (this.options.minify) {\n queryParams.append('minify', String(this.options.minify));\n }\n\n return `/${encodeURI(mainModuleName)}.bundle?${queryParams.toString()}`;\n }\n\n /** Log telemetry. */\n protected abstract trackManifest(version?: string): void;\n\n /** Get the manifest response to return to the runtime. This file contains info regarding where the assets can be loaded from. Exposed for testing. */\n public abstract _getManifestResponseAsync(options: TManifestRequestInfo): Promise<{\n body: string;\n version: string;\n headers: ServerHeaders;\n }>;\n\n private getExpoGoConfig({\n mainModuleName,\n hostname,\n }: {\n mainModuleName: string;\n hostname?: string | null;\n }): ExpoGoConfig {\n return {\n // localhost:19000\n debuggerHost: this.options.constructUrl({ scheme: '', hostname }),\n // http://localhost:19000/logs -- used to send logs to the CLI for displaying in the terminal.\n // This is deprecated in favor of the WebSocket connection setup in Metro.\n logUrl: this.options.constructUrl({ scheme: 'http', hostname }) + '/logs',\n // Required for Expo Go to function.\n developer: {\n tool: DEVELOPER_TOOL,\n projectRoot: this.projectRoot,\n },\n packagerOpts: {\n // Required for dev client.\n dev: this.options.mode !== 'production',\n },\n // Indicates the name of the main bundle.\n mainModuleName,\n // Add this string to make Flipper register React Native / Metro as \"running\".\n // Can be tested by running:\n // `METRO_SERVER_PORT=19000 open -a flipper.app`\n // Where 19000 is the port where the Expo project is being hosted.\n __flipperHack: 'React Native packager is running',\n };\n }\n\n /** Resolve all assets and set them on the manifest as URLs */\n private async mutateManifestWithAssetsAsync(manifest: ExpoConfig, bundleUrl: string) {\n await resolveManifestAssets(this.projectRoot, {\n manifest,\n resolver: async (path) => {\n if (this.options.isNativeWebpack) {\n // When using our custom dev server, just do assets normally\n // without the `assets/` subpath redirect.\n return resolve(bundleUrl!.match(/^https?:\\/\\/.*?\\//)![0], path);\n }\n return bundleUrl!.match(/^https?:\\/\\/.*?\\//)![0] + 'assets/' + path;\n },\n });\n // The server normally inserts this but if we're offline we'll do it here\n await resolveGoogleServicesFile(this.projectRoot, manifest);\n }\n\n public getWebBundleUrl() {\n const platform = 'web';\n // Read from headers\n const mainModuleName = this.resolveMainModuleName(this.initialProjectConfig, platform);\n return this._getBundleUrlPath({\n platform,\n mainModuleName,\n });\n }\n\n /**\n * Web platforms should create an index.html response using the same script resolution as native.\n *\n * Instead of adding a `bundleUrl` to a `manifest.json` (native) we'll add a `<script src=\"\">`\n * to an `index.html`, this enables the web platform to load JavaScript from the server.\n */\n private async handleWebRequestAsync(req: ServerRequest, res: ServerResponse) {\n // Read from headers\n const bundleUrl = this.getWebBundleUrl();\n\n res.setHeader('Content-Type', 'text/html');\n\n res.end(\n await createTemplateHtmlFromExpoConfigAsync(this.projectRoot, {\n exp: this.initialProjectConfig.exp,\n scripts: [bundleUrl],\n })\n );\n }\n\n /** Exposed for testing. */\n async checkBrowserRequestAsync(req: ServerRequest, res: ServerResponse, next: ServerNext) {\n // Read the config\n const bundlers = getPlatformBundlers(this.initialProjectConfig.exp);\n if (bundlers.web === 'metro') {\n // NOTE(EvanBacon): This effectively disables the safety check we do on custom runtimes to ensure\n // the `expo-platform` header is included. When `web.bundler=web`, if the user has non-standard Expo\n // code loading then they'll get a web bundle without a clear assertion of platform support.\n const platform = parsePlatformHeader(req);\n // On web, serve the public folder\n if (!platform || platform === 'web') {\n if (this.initialProjectConfig.exp.web?.output === 'static') {\n // Skip the spa-styled index.html when static generation is enabled.\n next();\n return true;\n } else {\n await this.handleWebRequestAsync(req, res);\n return true;\n }\n }\n }\n return false;\n }\n\n async handleRequestAsync(\n req: ServerRequest,\n res: ServerResponse,\n next: ServerNext\n ): Promise<void> {\n // First check for standard JavaScript runtimes (aka legacy browsers like Chrome).\n if (await this.checkBrowserRequestAsync(req, res, next)) {\n return;\n }\n\n // Save device IDs for dev client.\n await this.saveDevicesAsync(req);\n\n // Read from headers\n const options = this.getParsedHeaders(req);\n const { body, version, headers } = await this._getManifestResponseAsync(options);\n for (const [headerName, headerValue] of headers) {\n res.setHeader(headerName, headerValue);\n }\n res.end(body);\n\n // Log analytics\n this.trackManifest(version ?? null);\n }\n}\n"],"names":["getWorkspaceRoot","getEntryWithServerRoot","getMetroServerRoot","resolveMainModuleName","createBundleUrlPath","Log","ProjectDevices","debug","require","projectRoot","findWorkspaceRoot","error","message","includes","projectConfig","platform","path","relative","resolveAbsoluteEntryPoint","env","EXPO_USE_METRO_WORKSPACE_ROOT","entryPoint","stripExtension","mainModuleName","mode","minify","environment","serializerOutput","queryParams","URLSearchParams","encodeURIComponent","dev","String","hot","lazy","EXPO_NO_METRO_LAZY","append","encodeURI","toString","DEVELOPER_TOOL","ManifestMiddleware","ExpoMiddleware","constructor","options","initialProjectConfig","getConfig","_resolveProjectSettingsAsync","hostname","expoGoConfig","getExpoGoConfig","hostUri","constructUrl","scheme","bundleUrl","_getBundleUrl","mutateManifestWithAssetsAsync","exp","isNativeWebpack","saveDevicesAsync","req","deviceIds","headers","catch","e","exception","_getBundleUrlPath","debuggerHost","logUrl","developer","tool","packagerOpts","__flipperHack","manifest","resolveManifestAssets","resolver","resolve","match","resolveGoogleServicesFile","getWebBundleUrl","handleWebRequestAsync","res","setHeader","end","createTemplateHtmlFromExpoConfigAsync","scripts","checkBrowserRequestAsync","next","bundlers","getPlatformBundlers","web","parsePlatformHeader","output","handleRequestAsync","getParsedHeaders","body","version","_getManifestResponseAsync","headerName","headerValue","trackManifest"],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
exports.writeExpoEnvDTS = writeExpoEnvDTS;
|
|
6
|
+
exports.removeExpoEnvDTS = removeExpoEnvDTS;
|
|
7
|
+
var _promises = _interopRequireDefault(require("fs/promises"));
|
|
8
|
+
var _path = _interopRequireDefault(require("path"));
|
|
9
|
+
function _interopRequireDefault(obj) {
|
|
10
|
+
return obj && obj.__esModule ? obj : {
|
|
11
|
+
default: obj
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
const template = `/// <reference types="expo-router/types" />
|
|
15
|
+
|
|
16
|
+
// NOTE: This file should not be edited and should be in your git ignore`;
|
|
17
|
+
async function writeExpoEnvDTS(projectRoot) {
|
|
18
|
+
return _promises.default.writeFile(_path.default.join(projectRoot, "expo-env.d.ts"), template);
|
|
19
|
+
}
|
|
20
|
+
async function removeExpoEnvDTS(projectRoot) {
|
|
21
|
+
// Force removal of expo-env.d.ts - Ignore any errors if the file does not exist
|
|
22
|
+
return _promises.default.rm(_path.default.join(projectRoot, "expo-env.d.ts"), {
|
|
23
|
+
force: true
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
//# sourceMappingURL=expo-env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/server/type-generation/expo-env.ts"],"sourcesContent":["import fs from 'fs/promises';\nimport path from 'path';\n\nconst template = `/// <reference types=\"expo-router/types\" />\n\n// NOTE: This file should not be edited and should be in your git ignore`;\n\nexport async function writeExpoEnvDTS(projectRoot: string) {\n return fs.writeFile(path.join(projectRoot, 'expo-env.d.ts'), template);\n}\n\nexport async function removeExpoEnvDTS(projectRoot: string) {\n // Force removal of expo-env.d.ts - Ignore any errors if the file does not exist\n return fs.rm(path.join(projectRoot, 'expo-env.d.ts'), { force: true });\n}\n"],"names":["writeExpoEnvDTS","removeExpoEnvDTS","template","projectRoot","fs","writeFile","path","join","rm","force"],"mappings":"AAAA;;;;QAOsBA,eAAe,GAAfA,eAAe;QAIfC,gBAAgB,GAAhBA,gBAAgB;AAXvB,IAAA,SAAa,kCAAb,aAAa,EAAA;AACX,IAAA,KAAM,kCAAN,MAAM,EAAA;;;;;;AAEvB,MAAMC,QAAQ,GAAG,CAAC;;wEAEsD,CAAC,AAAC;AAEnE,eAAeF,eAAe,CAACG,WAAmB,EAAE;IACzD,OAAOC,SAAE,QAAA,CAACC,SAAS,CAACC,KAAI,QAAA,CAACC,IAAI,CAACJ,WAAW,EAAE,eAAe,CAAC,EAAED,QAAQ,CAAC,CAAC;CACxE;AAEM,eAAeD,gBAAgB,CAACE,WAAmB,EAAE;IAC1D,gFAAgF;IAChF,OAAOC,SAAE,QAAA,CAACI,EAAE,CAACF,KAAI,QAAA,CAACC,IAAI,CAACJ,WAAW,EAAE,eAAe,CAAC,EAAE;QAAEM,KAAK,EAAE,IAAI;KAAE,CAAC,CAAC;CACxE"}
|