@expo/cli 0.11.0 → 0.12.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/build/bin/cli +2 -2
- package/build/src/api/getExpoGoIntermediateCertificate.js +1 -1
- package/build/src/api/getExpoGoIntermediateCertificate.js.map +1 -1
- package/build/src/api/getExpoSchema.js +1 -1
- package/build/src/api/getExpoSchema.js.map +1 -1
- package/build/src/api/getNativeModuleVersions.js +1 -1
- package/build/src/api/getNativeModuleVersions.js.map +1 -1
- package/build/src/api/getProjectDevelopmentCertificate.js +1 -1
- package/build/src/api/getProjectDevelopmentCertificate.js.map +1 -1
- package/build/src/api/getVersions.js +1 -1
- package/build/src/api/getVersions.js.map +1 -1
- package/build/src/api/rest/cache/wrapFetchWithCache.js.map +1 -1
- package/build/src/api/rest/client.js +5 -5
- package/build/src/api/rest/client.js.map +1 -1
- package/build/src/api/rest/wrapFetchWithOffline.js.map +1 -1
- package/build/src/api/rest/wrapFetchWithProgress.js.map +1 -1
- package/build/src/api/rest/wrapFetchWithProxy.js.map +1 -1
- package/build/src/api/updateDevelopmentSession.js +1 -1
- package/build/src/api/updateDevelopmentSession.js.map +1 -1
- package/build/src/api/user/actions.js +2 -2
- package/build/src/api/user/actions.js.map +1 -1
- package/build/src/api/user/otp.js +1 -1
- package/build/src/api/user/otp.js.map +1 -1
- package/build/src/api/user/user.js +2 -2
- package/build/src/api/user/user.js.map +1 -1
- package/build/src/config/configAsync.js +17 -1
- package/build/src/config/configAsync.js.map +1 -1
- package/build/src/customize/customizeAsync.js +1 -1
- package/build/src/customize/customizeAsync.js.map +1 -1
- package/build/src/customize/generate.js +29 -2
- package/build/src/customize/generate.js.map +1 -1
- package/build/src/customize/templates.js +8 -0
- package/build/src/customize/templates.js.map +1 -1
- package/build/src/customize/typescript.js +54 -0
- package/build/src/customize/typescript.js.map +1 -0
- package/build/src/export/createBundles.js +1 -1
- package/build/src/export/createBundles.js.map +1 -1
- package/build/src/export/createMetadataJson.js.map +1 -1
- package/build/src/export/embed/exportEmbedAsync.js +50 -4
- package/build/src/export/embed/exportEmbedAsync.js.map +1 -1
- package/build/src/export/embed/index.js +1 -3
- package/build/src/export/embed/index.js.map +1 -1
- package/build/src/export/embed/resolveOptions.js +6 -10
- package/build/src/export/embed/resolveOptions.js.map +1 -1
- package/build/src/export/exportApp.js +50 -41
- package/build/src/export/exportApp.js.map +1 -1
- package/build/src/export/exportAssets.js +2 -2
- package/build/src/export/exportAssets.js.map +1 -1
- package/build/src/export/exportAsync.js +1 -1
- package/build/src/export/exportAsync.js.map +1 -1
- package/build/src/export/exportStaticAsync.js +42 -12
- package/build/src/export/exportStaticAsync.js.map +1 -1
- package/build/src/export/fork-bundleAsync.js +27 -2
- package/build/src/export/fork-bundleAsync.js.map +1 -1
- package/build/src/export/getPublicExpoManifest.js +1 -1
- package/build/src/export/getPublicExpoManifest.js.map +1 -1
- package/build/src/export/getResolvedLocales.js.map +1 -1
- package/build/src/export/printBundleSizes.js.map +1 -1
- package/build/src/export/web/exportWebAsync.js.map +1 -1
- package/build/src/export/writeContents.js +5 -1
- package/build/src/export/writeContents.js.map +1 -1
- package/build/src/install/checkPackages.js +1 -1
- package/build/src/install/checkPackages.js.map +1 -1
- package/build/src/install/installAsync.js +1 -1
- package/build/src/install/installAsync.js.map +1 -1
- package/build/src/prebuild/configureProjectAsync.js +5 -9
- package/build/src/prebuild/configureProjectAsync.js.map +1 -1
- package/build/src/prebuild/prebuildAsync.js +5 -5
- package/build/src/prebuild/prebuildAsync.js.map +1 -1
- package/build/src/prebuild/updateFromTemplate.js +8 -5
- package/build/src/prebuild/updateFromTemplate.js.map +1 -1
- package/build/src/register/registerAsync.js +0 -1
- package/build/src/register/registerAsync.js.map +1 -1
- package/build/src/run/android/resolveInstallApkName.js.map +1 -1
- package/build/src/run/android/resolveOptions.js +1 -1
- package/build/src/run/android/resolveOptions.js.map +1 -1
- package/build/src/run/android/runAndroidAsync.js +2 -2
- package/build/src/run/android/runAndroidAsync.js.map +1 -1
- package/build/src/run/ios/XcodeBuild.js +2 -2
- package/build/src/run/ios/XcodeBuild.js.map +1 -1
- package/build/src/run/ios/appleDevice/AppleDevice.js +4 -4
- package/build/src/run/ios/appleDevice/AppleDevice.js.map +1 -1
- package/build/src/run/ios/appleDevice/ClientManager.js +1 -1
- package/build/src/run/ios/appleDevice/ClientManager.js.map +1 -1
- package/build/src/run/ios/appleDevice/client/AFCClient.js +1 -1
- package/build/src/run/ios/appleDevice/client/AFCClient.js.map +1 -1
- package/build/src/run/ios/appleDevice/client/DebugserverClient.js +1 -1
- package/build/src/run/ios/appleDevice/client/DebugserverClient.js.map +1 -1
- package/build/src/run/ios/appleDevice/client/InstallationProxyClient.js +1 -1
- package/build/src/run/ios/appleDevice/client/InstallationProxyClient.js.map +1 -1
- package/build/src/run/ios/appleDevice/client/LockdowndClient.js +1 -1
- package/build/src/run/ios/appleDevice/client/LockdowndClient.js.map +1 -1
- package/build/src/run/ios/appleDevice/client/MobileImageMounterClient.js +1 -1
- package/build/src/run/ios/appleDevice/client/MobileImageMounterClient.js.map +1 -1
- package/build/src/run/ios/appleDevice/client/ServiceClient.js.map +1 -1
- package/build/src/run/ios/appleDevice/client/UsbmuxdClient.js +1 -1
- package/build/src/run/ios/appleDevice/client/UsbmuxdClient.js.map +1 -1
- package/build/src/run/ios/appleDevice/installOnDeviceAsync.js +1 -1
- package/build/src/run/ios/appleDevice/installOnDeviceAsync.js.map +1 -1
- package/build/src/run/ios/appleDevice/protocol/AFCProtocol.js +1 -1
- package/build/src/run/ios/appleDevice/protocol/AFCProtocol.js.map +1 -1
- package/build/src/run/ios/appleDevice/protocol/AbstractProtocol.js.map +1 -1
- package/build/src/run/ios/appleDevice/protocol/GDBProtocol.js +1 -1
- package/build/src/run/ios/appleDevice/protocol/GDBProtocol.js.map +1 -1
- package/build/src/run/ios/appleDevice/protocol/LockdownProtocol.js +1 -1
- package/build/src/run/ios/appleDevice/protocol/LockdownProtocol.js.map +1 -1
- package/build/src/run/ios/codeSigning/configureCodeSigning.js +1 -1
- package/build/src/run/ios/codeSigning/configureCodeSigning.js.map +1 -1
- package/build/src/run/ios/codeSigning/resolveCertificateSigningIdentity.js +2 -2
- package/build/src/run/ios/codeSigning/resolveCertificateSigningIdentity.js.map +1 -1
- package/build/src/run/ios/codeSigning/xcodeCodeSigning.js +3 -0
- package/build/src/run/ios/codeSigning/xcodeCodeSigning.js.map +1 -1
- package/build/src/run/ios/index.js.map +1 -1
- package/build/src/run/ios/launchApp.js +2 -2
- package/build/src/run/ios/launchApp.js.map +1 -1
- package/build/src/run/ios/options/resolveDevice.js +1 -1
- package/build/src/run/ios/options/resolveDevice.js.map +1 -1
- package/build/src/run/ios/options/resolveOptions.js +2 -2
- package/build/src/run/ios/options/resolveOptions.js.map +1 -1
- package/build/src/run/ios/runIosAsync.js +3 -3
- package/build/src/run/ios/runIosAsync.js.map +1 -1
- package/build/src/start/doctor/apple/XcodePrerequisite.js +43 -2
- package/build/src/start/doctor/apple/XcodePrerequisite.js.map +1 -1
- package/build/src/start/doctor/dependencies/ensureDependenciesAsync.js +1 -1
- package/build/src/start/doctor/dependencies/ensureDependenciesAsync.js.map +1 -1
- package/build/src/start/doctor/dependencies/getVersionedPackages.js +5 -3
- package/build/src/start/doctor/dependencies/getVersionedPackages.js.map +1 -1
- package/build/src/start/doctor/dependencies/validateDependenciesVersions.js +1 -1
- package/build/src/start/doctor/dependencies/validateDependenciesVersions.js.map +1 -1
- package/build/src/start/doctor/ngrok/ExternalModule.js.map +1 -1
- package/build/src/start/doctor/typescript/TypeScriptProjectPrerequisite.js +7 -7
- package/build/src/start/doctor/typescript/TypeScriptProjectPrerequisite.js.map +1 -1
- package/build/src/start/doctor/typescript/updateTSConfig.js +11 -10
- package/build/src/start/doctor/typescript/updateTSConfig.js.map +1 -1
- package/build/src/start/index.js +0 -2
- package/build/src/start/index.js.map +1 -1
- package/build/src/start/interface/interactiveActions.js +1 -1
- package/build/src/start/interface/interactiveActions.js.map +1 -1
- package/build/src/start/interface/startInterface.js +3 -3
- package/build/src/start/interface/startInterface.js.map +1 -1
- package/build/src/start/platforms/ExpoGoInstaller.js.map +1 -1
- package/build/src/start/platforms/PlatformManager.js.map +1 -1
- package/build/src/start/platforms/android/ADBServer.js +1 -1
- package/build/src/start/platforms/android/ADBServer.js.map +1 -1
- package/build/src/start/platforms/android/AndroidDeviceManager.js +5 -5
- package/build/src/start/platforms/android/AndroidDeviceManager.js.map +1 -1
- package/build/src/start/platforms/android/AndroidPlatformManager.js +1 -1
- package/build/src/start/platforms/android/AndroidPlatformManager.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/android/adbReverse.js +2 -2
- package/build/src/start/platforms/android/adbReverse.js.map +1 -1
- package/build/src/start/platforms/android/emulator.js +1 -1
- package/build/src/start/platforms/android/emulator.js.map +1 -1
- package/build/src/start/platforms/android/getDevices.js +1 -1
- package/build/src/start/platforms/android/getDevices.js.map +1 -1
- package/build/src/start/platforms/android/promptAndroidDevice.js +1 -1
- package/build/src/start/platforms/android/promptAndroidDevice.js.map +1 -1
- package/build/src/start/platforms/ios/AppleDeviceManager.js +5 -5
- package/build/src/start/platforms/ios/AppleDeviceManager.js.map +1 -1
- package/build/src/start/platforms/ios/ApplePlatformManager.js +1 -1
- package/build/src/start/platforms/ios/ApplePlatformManager.js.map +1 -1
- package/build/src/start/platforms/ios/ensureSimulatorAppRunning.js.map +1 -1
- package/build/src/start/platforms/ios/getBestSimulator.js +1 -1
- package/build/src/start/platforms/ios/getBestSimulator.js.map +1 -1
- package/build/src/start/platforms/ios/promptAppleDevice.js +1 -1
- package/build/src/start/platforms/ios/promptAppleDevice.js.map +1 -1
- package/build/src/start/platforms/ios/simctl.js +1 -1
- package/build/src/start/platforms/ios/simctl.js.map +1 -1
- package/build/src/start/platforms/ios/simctlLogging.js +1 -1
- package/build/src/start/platforms/ios/simctlLogging.js.map +1 -1
- package/build/src/start/resolveOptions.js +0 -5
- package/build/src/start/resolveOptions.js.map +1 -1
- package/build/src/start/server/AsyncNgrok.js +4 -3
- package/build/src/start/server/AsyncNgrok.js.map +1 -1
- package/build/src/start/server/BundlerDevServer.js +4 -11
- package/build/src/start/server/BundlerDevServer.js.map +1 -1
- package/build/src/start/server/DevServerManager.js +3 -2
- package/build/src/start/server/DevServerManager.js.map +1 -1
- package/build/src/start/server/UrlCreator.js +2 -1
- package/build/src/start/server/UrlCreator.js.map +1 -1
- package/build/src/start/server/getStaticRenderFunctions.js +2 -2
- package/build/src/start/server/getStaticRenderFunctions.js.map +1 -1
- package/build/src/start/server/metro/MetroBundlerDevServer.js +42 -25
- package/build/src/start/server/metro/MetroBundlerDevServer.js.map +1 -1
- package/build/src/start/server/metro/MetroTerminalReporter.js +14 -3
- package/build/src/start/server/metro/MetroTerminalReporter.js.map +1 -1
- package/build/src/start/server/metro/TerminalReporter.js.map +1 -1
- package/build/src/start/server/metro/TerminalReporter.types.js.map +1 -1
- package/build/src/start/server/metro/inspector-proxy/device.js.map +1 -1
- package/build/src/start/server/metro/inspector-proxy/handlers/NetworkResponse.js.map +1 -1
- package/build/src/start/server/metro/inspector-proxy/handlers/PageReload.js.map +1 -1
- package/build/src/start/server/metro/inspector-proxy/handlers/VscodeDebuggerGetPossibleBreakpoints.js.map +1 -1
- package/build/src/start/server/metro/inspector-proxy/handlers/VscodeDebuggerScriptParsed.js.map +1 -1
- package/build/src/start/server/metro/inspector-proxy/handlers/VscodeDebuggerSetBreakpointByUrl.js.map +1 -1
- package/build/src/start/server/metro/inspector-proxy/handlers/VscodeRuntimeGetProperties.js.map +1 -1
- package/build/src/start/server/metro/inspector-proxy/handlers/types.js.map +1 -1
- package/build/src/start/server/metro/inspector-proxy/index.js +1 -1
- package/build/src/start/server/metro/inspector-proxy/index.js.map +1 -1
- package/build/src/start/server/metro/instantiateMetro.js +49 -8
- package/build/src/start/server/metro/instantiateMetro.js.map +1 -1
- package/build/src/start/server/metro/resolveFromProject.js +0 -4
- package/build/src/start/server/metro/resolveFromProject.js.map +1 -1
- package/build/src/start/server/metro/runServer-fork.js +1 -1
- package/build/src/start/server/metro/runServer-fork.js.map +1 -1
- package/build/src/start/server/metro/withMetroMultiPlatform.js +59 -9
- package/build/src/start/server/metro/withMetroMultiPlatform.js.map +1 -1
- package/build/src/start/server/metro/withMetroResolvers.js +6 -5
- package/build/src/start/server/metro/withMetroResolvers.js.map +1 -1
- package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js +2 -2
- package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js.map +1 -1
- package/build/src/start/server/middleware/ExpoMiddleware.js.map +1 -1
- package/build/src/start/server/middleware/FaviconMiddleware.js +1 -1
- package/build/src/start/server/middleware/FaviconMiddleware.js.map +1 -1
- package/build/src/start/server/middleware/ManifestMiddleware.js +8 -11
- package/build/src/start/server/middleware/ManifestMiddleware.js.map +1 -1
- package/build/src/start/server/middleware/RuntimeRedirectMiddleware.js +1 -1
- package/build/src/start/server/middleware/RuntimeRedirectMiddleware.js.map +1 -1
- package/build/src/start/server/middleware/ServeStaticMiddleware.js +1 -1
- package/build/src/start/server/middleware/ServeStaticMiddleware.js.map +1 -1
- package/build/src/start/server/middleware/resolvePlatform.js.map +1 -1
- package/build/src/start/server/middleware/server.types.js.map +1 -1
- package/build/src/start/server/openPlatforms.js.map +1 -1
- package/build/src/start/server/type-generation/__typetests__/fixtures/basic.js.map +1 -1
- package/build/src/start/server/type-generation/routes.js +6 -6
- package/build/src/start/server/type-generation/routes.js.map +1 -1
- package/build/src/start/server/type-generation/startTypescriptTypeGeneration.js +3 -3
- package/build/src/start/server/type-generation/startTypescriptTypeGeneration.js.map +1 -1
- package/build/src/start/server/webpack/WebpackBundlerDevServer.js +10 -5
- package/build/src/start/server/webpack/WebpackBundlerDevServer.js.map +1 -1
- package/build/src/start/server/webpack/compile.js +1 -1
- package/build/src/start/server/webpack/compile.js.map +1 -1
- package/build/src/start/startAsync.js +10 -32
- package/build/src/start/startAsync.js.map +1 -1
- package/build/src/utils/FileNotifier.js +1 -1
- package/build/src/utils/FileNotifier.js.map +1 -1
- package/build/src/utils/analytics/metroDebuggerMiddleware.js +1 -1
- package/build/src/utils/analytics/metroDebuggerMiddleware.js.map +1 -1
- package/build/src/utils/analytics/rudderstackClient.js +2 -2
- package/build/src/utils/array.js.map +1 -1
- package/build/src/utils/cocoapods.js +2 -2
- package/build/src/utils/cocoapods.js.map +1 -1
- package/build/src/utils/codesigning.js +2 -2
- package/build/src/utils/codesigning.js.map +1 -1
- package/build/src/utils/downloadAppAsync.js +1 -1
- package/build/src/utils/downloadAppAsync.js.map +1 -1
- package/build/src/utils/downloadExpoGoAsync.js +2 -2
- package/build/src/utils/downloadExpoGoAsync.js.map +1 -1
- package/build/src/utils/editor.js +1 -1
- package/build/src/utils/editor.js.map +1 -1
- package/build/src/utils/env.js +1 -1
- package/build/src/utils/env.js.map +1 -1
- package/build/src/utils/errors.js.map +1 -1
- package/build/src/utils/getOrPromptApplicationId.js +2 -2
- package/build/src/utils/getOrPromptApplicationId.js.map +1 -1
- package/build/src/utils/git.js +1 -1
- package/build/src/utils/git.js.map +1 -1
- package/build/src/utils/modifyConfigAsync.js +1 -1
- package/build/src/utils/modifyConfigAsync.js.map +1 -1
- package/build/src/utils/modifyConfigPlugins.js +1 -1
- package/build/src/utils/modifyConfigPlugins.js.map +1 -1
- package/build/src/utils/npm.js +1 -1
- package/build/src/utils/npm.js.map +1 -1
- package/build/src/utils/obj.js.map +1 -1
- package/build/src/utils/plist.js +1 -1
- package/build/src/utils/plist.js.map +1 -1
- package/build/src/utils/port.js +1 -1
- package/build/src/utils/port.js.map +1 -1
- package/build/src/utils/profile.js +1 -1
- package/build/src/utils/profile.js.map +1 -1
- package/build/src/utils/scheme.js +1 -1
- package/build/src/utils/scheme.js.map +1 -1
- package/build/src/utils/tsconfig/loadTsConfigPaths.js +1 -1
- package/build/src/utils/tsconfig/loadTsConfigPaths.js.map +1 -1
- package/build/src/utils/validateApplicationId.js +85 -5
- package/build/src/utils/validateApplicationId.js.map +1 -1
- package/package.json +11 -8
- package/build/src/api/signManifest.js +0 -26
- package/build/src/api/signManifest.js.map +0 -1
- package/build/src/start/server/middleware/ClassicManifestMiddleware.js +0 -155
- package/build/src/start/server/middleware/ClassicManifestMiddleware.js.map +0 -1
package/build/bin/cli
CHANGED
|
@@ -132,7 +132,7 @@ const args = (0, _arg).default({
|
|
|
132
132
|
});
|
|
133
133
|
if (args["--version"]) {
|
|
134
134
|
// Version is added in the build script.
|
|
135
|
-
console.log("0.
|
|
135
|
+
console.log("0.12.0");
|
|
136
136
|
process.exit(0);
|
|
137
137
|
}
|
|
138
138
|
if (args["--non-interactive"]) {
|
|
@@ -262,7 +262,7 @@ commands[command]().then((exec)=>{
|
|
|
262
262
|
logEventAsync("action", {
|
|
263
263
|
action: `expo ${command}`,
|
|
264
264
|
source: "expo/cli",
|
|
265
|
-
source_version: "0.
|
|
265
|
+
source_version: "0.12.0"
|
|
266
266
|
});
|
|
267
267
|
});
|
|
268
268
|
|
|
@@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
3
3
|
value: true
|
|
4
4
|
});
|
|
5
5
|
exports.getExpoGoIntermediateCertificateAsync = getExpoGoIntermediateCertificateAsync;
|
|
6
|
-
var _errors = require("../utils/errors");
|
|
7
6
|
var _client = require("./rest/client");
|
|
7
|
+
var _errors = require("../utils/errors");
|
|
8
8
|
async function getExpoGoIntermediateCertificateAsync(easProjectId) {
|
|
9
9
|
const response = await (0, _client).fetchAsync(`projects/${encodeURIComponent(easProjectId)}/development-certificates/expo-go-intermediate-certificate`, {
|
|
10
10
|
method: "GET"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/api/getExpoGoIntermediateCertificate.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"sources":["../../../src/api/getExpoGoIntermediateCertificate.ts"],"sourcesContent":["import { fetchAsync } from './rest/client';\nimport { CommandError } from '../utils/errors';\n\nexport async function getExpoGoIntermediateCertificateAsync(easProjectId: string): Promise<string> {\n const response = await fetchAsync(\n `projects/${encodeURIComponent(\n easProjectId\n )}/development-certificates/expo-go-intermediate-certificate`,\n {\n method: 'GET',\n }\n );\n if (!response.ok) {\n throw new CommandError('API', `Unexpected error from Expo servers: ${response.statusText}.`);\n }\n const buffer = await response.buffer();\n return buffer.toString('utf8');\n}\n"],"names":["getExpoGoIntermediateCertificateAsync","easProjectId","response","fetchAsync","encodeURIComponent","method","ok","CommandError","statusText","buffer","toString"],"mappings":"AAAA;;;;QAGsBA,qCAAqC,GAArCA,qCAAqC;AAHhC,IAAA,OAAe,WAAf,eAAe,CAAA;AACb,IAAA,OAAiB,WAAjB,iBAAiB,CAAA;AAEvC,eAAeA,qCAAqC,CAACC,YAAoB,EAAmB;IACjG,MAAMC,QAAQ,GAAG,MAAMC,CAAAA,GAAAA,OAAU,AAOhC,CAAA,WAPgC,CAC/B,CAAC,SAAS,EAAEC,kBAAkB,CAC5BH,YAAY,CACb,CAAC,0DAA0D,CAAC,EAC7D;QACEI,MAAM,EAAE,KAAK;KACd,CACF,AAAC;IACF,IAAI,CAACH,QAAQ,CAACI,EAAE,EAAE;QAChB,MAAM,IAAIC,OAAY,aAAA,CAAC,KAAK,EAAE,CAAC,oCAAoC,EAAEL,QAAQ,CAACM,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;KAC9F;IACD,MAAMC,MAAM,GAAG,MAAMP,QAAQ,CAACO,MAAM,EAAE,AAAC;IACvC,OAAOA,MAAM,CAACC,QAAQ,CAAC,MAAM,CAAC,CAAC;CAChC"}
|
|
@@ -6,9 +6,9 @@ exports.getAssetSchemasAsync = getAssetSchemasAsync;
|
|
|
6
6
|
var _fs = _interopRequireDefault(require("fs"));
|
|
7
7
|
var _jsonSchemaDerefSync = _interopRequireDefault(require("json-schema-deref-sync"));
|
|
8
8
|
var _path = _interopRequireDefault(require("path"));
|
|
9
|
+
var _client = require("./rest/client");
|
|
9
10
|
var _env = require("../utils/env");
|
|
10
11
|
var _errors = require("../utils/errors");
|
|
11
|
-
var _client = require("./rest/client");
|
|
12
12
|
function _interopRequireDefault(obj) {
|
|
13
13
|
return obj && obj.__esModule ? obj : {
|
|
14
14
|
default: obj
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/api/getExpoSchema.ts"],"sourcesContent":["import { JSONObject } from '@expo/json-file';\nimport fs from 'fs';\nimport schemaDerefSync from 'json-schema-deref-sync';\nimport path from 'path';\n\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../src/api/getExpoSchema.ts"],"sourcesContent":["import { JSONObject } from '@expo/json-file';\nimport fs from 'fs';\nimport schemaDerefSync from 'json-schema-deref-sync';\nimport path from 'path';\n\nimport { createCachedFetch } from './rest/client';\nimport { env } from '../utils/env';\nimport { CommandError } from '../utils/errors';\n\nexport type Schema = any;\n\nexport type AssetSchema = {\n fieldPath: string;\n};\n\nconst schemaJson: { [sdkVersion: string]: Schema } = {};\n\n// TODO: Maybe move json-schema-deref-sync out of api (1.58MB -- lodash)\n// https://packagephobia.com/result?p=json-schema-deref-sync\nasync function getSchemaAsync(sdkVersion: string): Promise<Schema> {\n const json = await getSchemaJSONAsync(sdkVersion);\n return schemaDerefSync(json.schema);\n}\n\n/**\n * Array of schema nodes that refer to assets along with their field path (eg. 'notification.icon')\n *\n * @param sdkVersion\n */\nexport async function getAssetSchemasAsync(sdkVersion: string = 'UNVERSIONED'): Promise<string[]> {\n // If no SDK version is available then fall back to unversioned\n const schema = await getSchemaAsync(sdkVersion);\n const assetSchemas: string[] = [];\n const visit = (node: Schema, fieldPath: string) => {\n if (node.meta && node.meta.asset) {\n assetSchemas.push(fieldPath);\n }\n const properties = node.properties;\n if (properties) {\n Object.keys(properties).forEach((property) =>\n visit(properties[property], `${fieldPath}${fieldPath.length > 0 ? '.' : ''}${property}`)\n );\n }\n };\n visit(schema, '');\n\n return assetSchemas;\n}\n\nasync function getSchemaJSONAsync(sdkVersion: string): Promise<{ schema: Schema }> {\n if (env.EXPO_UNIVERSE_DIR) {\n return JSON.parse(\n fs\n .readFileSync(\n path.join(\n env.EXPO_UNIVERSE_DIR,\n 'server',\n 'www',\n 'xdl-schemas',\n 'UNVERSIONED-schema.json'\n )\n )\n .toString()\n );\n }\n\n if (!schemaJson[sdkVersion]) {\n try {\n schemaJson[sdkVersion] = await getConfigurationSchemaAsync(sdkVersion);\n } catch (e: any) {\n if (e.code === 'INVALID_JSON') {\n throw new CommandError('INVALID_JSON', `Couldn't read schema from server`);\n }\n\n throw e;\n }\n }\n\n return schemaJson[sdkVersion];\n}\n\nasync function getConfigurationSchemaAsync(sdkVersion: string): Promise<JSONObject> {\n // Reconstruct the cached fetch since caching could be disabled.\n const fetchAsync = createCachedFetch({\n cacheDirectory: 'schema-cache',\n // We'll use a 1 week cache for versions so older versions get flushed out eventually.\n ttl: 1000 * 60 * 60 * 24 * 7,\n });\n const response = await fetchAsync(`project/configuration/schema/${sdkVersion}`);\n const { data } = await response.json();\n return data;\n}\n"],"names":["getAssetSchemasAsync","schemaJson","getSchemaAsync","sdkVersion","json","getSchemaJSONAsync","schemaDerefSync","schema","assetSchemas","visit","node","fieldPath","meta","asset","push","properties","Object","keys","forEach","property","length","env","EXPO_UNIVERSE_DIR","JSON","parse","fs","readFileSync","path","join","toString","getConfigurationSchemaAsync","e","code","CommandError","fetchAsync","createCachedFetch","cacheDirectory","ttl","response","data"],"mappings":"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"}
|
|
@@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
3
3
|
value: true
|
|
4
4
|
});
|
|
5
5
|
exports.getNativeModuleVersionsAsync = getNativeModuleVersionsAsync;
|
|
6
|
-
var _errors = require("../utils/errors");
|
|
7
6
|
var _client = require("./rest/client");
|
|
7
|
+
var _errors = require("../utils/errors");
|
|
8
8
|
async function getNativeModuleVersionsAsync(sdkVersion) {
|
|
9
9
|
const fetchAsync = (0, _client).createCachedFetch({
|
|
10
10
|
cacheDirectory: "native-modules-cache",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/api/getNativeModuleVersions.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"sources":["../../../src/api/getNativeModuleVersions.ts"],"sourcesContent":["import { createCachedFetch } from './rest/client';\nimport { CommandError } from '../utils/errors';\n\ninterface NativeModule {\n npmPackage: string;\n versionRange: string;\n}\ntype BundledNativeModuleList = NativeModule[];\n\nexport type BundledNativeModules = Record<string, string>;\n\n/**\n * The endpoint returns the list of bundled native modules for a given SDK version.\n * The data is populated by the `et sync-bundled-native-modules` script from expo/expo repo.\n * See the code for more details:\n * https://github.com/expo/expo/blob/main/tools/src/commands/SyncBundledNativeModules.ts\n *\n * Example result:\n * [\n * {\n * id: \"79285187-e5c4-47f7-b6a9-664f5d16f0db\",\n * sdkVersion: \"41.0.0\",\n * npmPackage: \"expo-camera\",\n * versionRange: \"~10.1.0\",\n * createdAt: \"2021-04-29T09:34:32.825Z\",\n * updatedAt: \"2021-04-29T09:34:32.825Z\"\n * },\n * ...\n * ]\n */\nexport async function getNativeModuleVersionsAsync(\n sdkVersion: string\n): Promise<BundledNativeModules> {\n const fetchAsync = createCachedFetch({\n cacheDirectory: 'native-modules-cache',\n // 1 minute cache\n ttl: 1000 * 60 * 1,\n });\n const results = await fetchAsync(`sdks/${sdkVersion}/native-modules`);\n if (!results.ok) {\n throw new CommandError(\n 'API',\n `Unexpected response when fetching version info from Expo servers: ${results.statusText}.`\n );\n }\n const { data } = await results.json();\n if (!data.length) {\n throw new CommandError('VERSIONS', 'The bundled native module list from the Expo API is empty');\n }\n return fromBundledNativeModuleList(data);\n}\n\nfunction fromBundledNativeModuleList(list: BundledNativeModuleList): BundledNativeModules {\n return list.reduce((acc, i) => {\n acc[i.npmPackage] = i.versionRange;\n return acc;\n }, {} as BundledNativeModules);\n}\n"],"names":["getNativeModuleVersionsAsync","sdkVersion","fetchAsync","createCachedFetch","cacheDirectory","ttl","results","ok","CommandError","statusText","data","json","length","fromBundledNativeModuleList","list","reduce","acc","i","npmPackage","versionRange"],"mappings":"AAAA;;;;QA8BsBA,4BAA4B,GAA5BA,4BAA4B;AA9BhB,IAAA,OAAe,WAAf,eAAe,CAAA;AACpB,IAAA,OAAiB,WAAjB,iBAAiB,CAAA;AA6BvC,eAAeA,4BAA4B,CAChDC,UAAkB,EACa;IAC/B,MAAMC,UAAU,GAAGC,CAAAA,GAAAA,OAAiB,AAIlC,CAAA,kBAJkC,CAAC;QACnCC,cAAc,EAAE,sBAAsB;QACtC,iBAAiB;QACjBC,GAAG,EAAE,IAAI,GAAG,EAAE,GAAG,CAAC;KACnB,CAAC,AAAC;IACH,MAAMC,OAAO,GAAG,MAAMJ,UAAU,CAAC,CAAC,KAAK,EAAED,UAAU,CAAC,eAAe,CAAC,CAAC,AAAC;IACtE,IAAI,CAACK,OAAO,CAACC,EAAE,EAAE;QACf,MAAM,IAAIC,OAAY,aAAA,CACpB,KAAK,EACL,CAAC,kEAAkE,EAAEF,OAAO,CAACG,UAAU,CAAC,CAAC,CAAC,CAC3F,CAAC;KACH;IACD,MAAM,EAAEC,IAAI,CAAA,EAAE,GAAG,MAAMJ,OAAO,CAACK,IAAI,EAAE,AAAC;IACtC,IAAI,CAACD,IAAI,CAACE,MAAM,EAAE;QAChB,MAAM,IAAIJ,OAAY,aAAA,CAAC,UAAU,EAAE,2DAA2D,CAAC,CAAC;KACjG;IACD,OAAOK,2BAA2B,CAACH,IAAI,CAAC,CAAC;CAC1C;AAED,SAASG,2BAA2B,CAACC,IAA6B,EAAwB;IACxF,OAAOA,IAAI,CAACC,MAAM,CAAC,CAACC,GAAG,EAAEC,CAAC,GAAK;QAC7BD,GAAG,CAACC,CAAC,CAACC,UAAU,CAAC,GAAGD,CAAC,CAACE,YAAY,CAAC;QACnC,OAAOH,GAAG,CAAC;KACZ,EAAE,EAAE,CAAyB,CAAC;CAChC"}
|
|
@@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
3
3
|
value: true
|
|
4
4
|
});
|
|
5
5
|
exports.getProjectDevelopmentCertificateAsync = getProjectDevelopmentCertificateAsync;
|
|
6
|
-
var _errors = require("../utils/errors");
|
|
7
6
|
var _client = require("./rest/client");
|
|
7
|
+
var _errors = require("../utils/errors");
|
|
8
8
|
async function getProjectDevelopmentCertificateAsync(easProjectId, csrPEM) {
|
|
9
9
|
const response = await (0, _client).fetchAsync(`projects/${encodeURIComponent(easProjectId)}/development-certificates`, {
|
|
10
10
|
method: "POST",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/api/getProjectDevelopmentCertificate.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"sources":["../../../src/api/getProjectDevelopmentCertificate.ts"],"sourcesContent":["import { fetchAsync } from './rest/client';\nimport { CommandError } from '../utils/errors';\n\nexport async function getProjectDevelopmentCertificateAsync(\n easProjectId: string,\n csrPEM: string\n): Promise<string> {\n const response = await fetchAsync(\n `projects/${encodeURIComponent(easProjectId)}/development-certificates`,\n {\n method: 'POST',\n body: JSON.stringify({\n csrPEM,\n }),\n }\n );\n if (!response.ok) {\n throw new CommandError('API', `Unexpected error from Expo servers: ${response.statusText}.`);\n }\n const buffer = await response.buffer();\n return buffer.toString('utf8');\n}\n"],"names":["getProjectDevelopmentCertificateAsync","easProjectId","csrPEM","response","fetchAsync","encodeURIComponent","method","body","JSON","stringify","ok","CommandError","statusText","buffer","toString"],"mappings":"AAAA;;;;QAGsBA,qCAAqC,GAArCA,qCAAqC;AAHhC,IAAA,OAAe,WAAf,eAAe,CAAA;AACb,IAAA,OAAiB,WAAjB,iBAAiB,CAAA;AAEvC,eAAeA,qCAAqC,CACzDC,YAAoB,EACpBC,MAAc,EACG;IACjB,MAAMC,QAAQ,GAAG,MAAMC,CAAAA,GAAAA,OAAU,AAQhC,CAAA,WARgC,CAC/B,CAAC,SAAS,EAAEC,kBAAkB,CAACJ,YAAY,CAAC,CAAC,yBAAyB,CAAC,EACvE;QACEK,MAAM,EAAE,MAAM;QACdC,IAAI,EAAEC,IAAI,CAACC,SAAS,CAAC;YACnBP,MAAM;SACP,CAAC;KACH,CACF,AAAC;IACF,IAAI,CAACC,QAAQ,CAACO,EAAE,EAAE;QAChB,MAAM,IAAIC,OAAY,aAAA,CAAC,KAAK,EAAE,CAAC,oCAAoC,EAAER,QAAQ,CAACS,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;KAC9F;IACD,MAAMC,MAAM,GAAG,MAAMV,QAAQ,CAACU,MAAM,EAAE,AAAC;IACvC,OAAOA,MAAM,CAACC,QAAQ,CAAC,MAAM,CAAC,CAAC;CAChC"}
|
|
@@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
3
3
|
value: true
|
|
4
4
|
});
|
|
5
5
|
exports.getVersionsAsync = getVersionsAsync;
|
|
6
|
-
var _errors = require("../utils/errors");
|
|
7
6
|
var _client = require("./rest/client");
|
|
7
|
+
var _errors = require("../utils/errors");
|
|
8
8
|
async function getVersionsAsync({ skipCache } = {}) {
|
|
9
9
|
// Reconstruct the cached fetch since caching could be disabled.
|
|
10
10
|
const fetchAsync = (0, _client).createCachedFetch({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/api/getVersions.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"sources":["../../../src/api/getVersions.ts"],"sourcesContent":["import { createCachedFetch } from './rest/client';\nimport { CommandError } from '../utils/errors';\n\n/** Represents version info for a particular SDK. */\nexport type SDKVersion = {\n /** @example \"2.16.1\" */\n iosVersion?: string;\n /** @example \"https://dpq5q02fu5f55.cloudfront.net/Exponent-2.17.4.tar.gz\" */\n iosClientUrl?: string;\n /** @example \"https://dev.to/expo/expo-sdk-38-is-now-available-5aa0\" */\n releaseNoteUrl?: string;\n /** @example \"2.17.4\" */\n iosClientVersion?: string;\n /** @example \"https://d1ahtucjixef4r.cloudfront.net/Exponent-2.16.1.apk\" */\n androidClientUrl?: string;\n /** @example \"2.16.1\" */\n androidClientVersion?: string;\n /** @example { \"typescript\": \"~3.9.5\" } */\n relatedPackages?: Record<string, string>;\n\n facebookReactNativeVersion: string;\n\n facebookReactVersion?: string;\n\n beta?: boolean;\n};\n\nexport type SDKVersions = Record<string, SDKVersion>;\n\nexport type Versions = {\n androidUrl: string;\n androidVersion: string;\n iosUrl: string;\n iosVersion: string;\n sdkVersions: SDKVersions;\n};\n\n/** Get versions from remote endpoint. */\nexport async function getVersionsAsync({\n skipCache,\n}: { skipCache?: boolean } = {}): Promise<Versions> {\n // Reconstruct the cached fetch since caching could be disabled.\n const fetchAsync = createCachedFetch({\n skipCache,\n cacheDirectory: 'versions-cache',\n // We'll use a 5 minute cache to ensure we stay relatively up to date.\n ttl: 1000 * 60 * 5,\n });\n\n const results = await fetchAsync('versions/latest');\n if (!results.ok) {\n throw new CommandError(\n 'API',\n `Unexpected response when fetching version info from Expo servers: ${results.statusText}.`\n );\n }\n const json = await results.json();\n return json.data;\n}\n"],"names":["getVersionsAsync","skipCache","fetchAsync","createCachedFetch","cacheDirectory","ttl","results","ok","CommandError","statusText","json","data"],"mappings":"AAAA;;;;QAsCsBA,gBAAgB,GAAhBA,gBAAgB;AAtCJ,IAAA,OAAe,WAAf,eAAe,CAAA;AACpB,IAAA,OAAiB,WAAjB,iBAAiB,CAAA;AAqCvC,eAAeA,gBAAgB,CAAC,EACrCC,SAAS,CAAA,EACe,GAAG,EAAE,EAAqB;IAClD,gEAAgE;IAChE,MAAMC,UAAU,GAAGC,CAAAA,GAAAA,OAAiB,AAKlC,CAAA,kBALkC,CAAC;QACnCF,SAAS;QACTG,cAAc,EAAE,gBAAgB;QAChC,sEAAsE;QACtEC,GAAG,EAAE,IAAI,GAAG,EAAE,GAAG,CAAC;KACnB,CAAC,AAAC;IAEH,MAAMC,OAAO,GAAG,MAAMJ,UAAU,CAAC,iBAAiB,CAAC,AAAC;IACpD,IAAI,CAACI,OAAO,CAACC,EAAE,EAAE;QACf,MAAM,IAAIC,OAAY,aAAA,CACpB,KAAK,EACL,CAAC,kEAAkE,EAAEF,OAAO,CAACG,UAAU,CAAC,CAAC,CAAC,CAC3F,CAAC;KACH;IACD,MAAMC,IAAI,GAAG,MAAMJ,OAAO,CAACI,IAAI,EAAE,AAAC;IAClC,OAAOA,IAAI,CAACC,IAAI,CAAC;CAClB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/api/rest/cache/wrapFetchWithCache.ts"],"sourcesContent":["/**\n * Copyright (c) 2021 Expo, Inc.\n * Copyright (c) 2020 mistval.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * Based on https://github.com/mistval/node-fetch-cache/blob/9c40ddf786b0de22ce521d8bdaa6347bc44dd629/src/index.js#L1\n * But with TypeScript support to fix Jest tests, and removed unused code.\n */\nimport crypto from 'crypto';\nimport FormData from 'form-data';\nimport fs from 'fs';\nimport { Request, RequestInfo, RequestInit, Response } from 'node-fetch';\nimport { URLSearchParams } from 'url';\n\nimport { FetchLike } from '../client.types';\nimport { FileSystemCache } from './FileSystemCache';\nimport { NFCResponse } from './response';\n\nconst CACHE_VERSION = 3;\n\nconst lockPromiseForKey: Record<string, Promise<any>> = {};\nconst unlockFunctionForKey: Record<string, any> = {};\n\n/**\n * Take out a lock. When this function returns (asynchronously),\n * you have the lock.\n * @param {string} key - The key to lock on. Anyone else who\n * tries to lock on the same key will need to wait for it to\n * be unlocked.\n */\nasync function lock(key: string) {\n if (!lockPromiseForKey[key]) {\n lockPromiseForKey[key] = Promise.resolve();\n }\n\n const takeLockPromise = lockPromiseForKey[key];\n lockPromiseForKey[key] = takeLockPromise.then(\n () =>\n new Promise((fulfill) => {\n unlockFunctionForKey[key] = fulfill;\n })\n );\n\n return takeLockPromise;\n}\n\n/**\n * Release a lock.\n * @param {string} key - The key to release the lock for.\n * The next person in line will now be able to take out\n * the lock for that key.\n */\nfunction unlock(key: string) {\n if (unlockFunctionForKey[key]) {\n unlockFunctionForKey[key]();\n delete unlockFunctionForKey[key];\n }\n}\n\nfunction md5(str: string) {\n return crypto.createHash('md5').update(str).digest('hex');\n}\n\n// Since the boundary in FormData is random,\n// we ignore it for purposes of calculating\n// the cache key.\nfunction getFormDataCacheKey(formData: FormData) {\n const cacheKey = { ...formData };\n const boundary = formData.getBoundary();\n\n // @ts-expect-error\n delete cacheKey._boundary;\n\n const boundaryReplaceRegex = new RegExp(boundary, 'g');\n\n // @ts-expect-error\n cacheKey._streams = cacheKey._streams.map((s) => {\n if (typeof s === 'string') {\n return s.replace(boundaryReplaceRegex, '');\n }\n\n return s;\n });\n\n return cacheKey;\n}\n\nfunction getBodyCacheKeyJson(body: any) {\n if (!body) {\n return body;\n }\n if (typeof body === 'string') {\n return body;\n }\n if (body instanceof URLSearchParams) {\n return body.toString();\n }\n if (body instanceof fs.ReadStream) {\n return body.path;\n }\n if (body.toString && body.toString() === '[object FormData]') {\n return getFormDataCacheKey(body);\n }\n if (body instanceof Buffer) {\n return body.toString();\n }\n\n throw new Error(\n 'Unsupported body type. Supported body types are: string, number, undefined, null, url.URLSearchParams, fs.ReadStream, FormData'\n );\n}\n\nfunction getRequestCacheKey(req: any) {\n return {\n cache: req.cache,\n credentials: req.credentials,\n destination: req.destination,\n headers: req.headers,\n integrity: req.integrity,\n method: req.method,\n redirect: req.redirect,\n referrer: req.referrer,\n referrerPolicy: req.referrerPolicy,\n url: req.url,\n body: getBodyCacheKeyJson(req.body),\n };\n}\n\nfunction getCacheKey(requestArguments: any[]) {\n const resource = requestArguments[0];\n const init = requestArguments[1] || {};\n\n const resourceCacheKeyJson =\n resource instanceof Request ? getRequestCacheKey(resource) : { url: resource };\n\n const initCacheKeyJson = { ...init };\n\n // @ts-ignore\n resourceCacheKeyJson.body = getBodyCacheKeyJson(resourceCacheKeyJson.body);\n initCacheKeyJson.body = getBodyCacheKeyJson(initCacheKeyJson.body);\n\n delete initCacheKeyJson.agent;\n\n return md5(JSON.stringify([resourceCacheKeyJson, initCacheKeyJson, CACHE_VERSION]));\n}\n\nexport function wrapFetchWithCache(\n fetch: FetchLike,\n cache: FileSystemCache\n): (url: RequestInfo, init?: RequestInit | undefined) => Promise<Response> {\n async function getResponse(\n cache: FileSystemCache,\n url: RequestInfo,\n init?: RequestInit | undefined\n ) {\n const cacheKey = getCacheKey([url, init]);\n let cachedValue = await cache.get(cacheKey);\n\n const ejectSelfFromCache = () => cache.remove(cacheKey);\n\n if (cachedValue) {\n return new NFCResponse(\n cachedValue.bodyStream,\n cachedValue.metaData,\n ejectSelfFromCache,\n true\n );\n }\n\n await lock(cacheKey);\n try {\n cachedValue = await cache.get(cacheKey);\n if (cachedValue) {\n return new NFCResponse(\n cachedValue.bodyStream,\n cachedValue.metaData,\n ejectSelfFromCache,\n true\n );\n }\n\n const fetchResponse = await fetch(url, init);\n const serializedMeta = NFCResponse.serializeMetaFromNodeFetchResponse(fetchResponse);\n\n const newlyCachedData = await cache.set(\n cacheKey,\n // @ts-expect-error\n fetchResponse.body,\n serializedMeta\n );\n\n return new NFCResponse(\n newlyCachedData!.bodyStream,\n newlyCachedData!.metaData,\n ejectSelfFromCache,\n false\n );\n } finally {\n unlock(cacheKey);\n }\n }\n return (url: RequestInfo, init?: RequestInit | undefined) => getResponse(cache, url, init);\n}\n"],"names":["wrapFetchWithCache","CACHE_VERSION","lockPromiseForKey","unlockFunctionForKey","lock","key","Promise","resolve","takeLockPromise","then","fulfill","unlock","md5","str","crypto","createHash","update","digest","getFormDataCacheKey","formData","cacheKey","boundary","getBoundary","_boundary","boundaryReplaceRegex","RegExp","_streams","map","s","replace","getBodyCacheKeyJson","body","URLSearchParams","toString","fs","ReadStream","path","Buffer","Error","getRequestCacheKey","req","cache","credentials","destination","headers","integrity","method","redirect","referrer","referrerPolicy","url","getCacheKey","requestArguments","resource","init","resourceCacheKeyJson","Request","initCacheKeyJson","agent","JSON","stringify","fetch","getResponse","cachedValue","get","ejectSelfFromCache","remove","NFCResponse","bodyStream","metaData","fetchResponse","serializedMeta","serializeMetaFromNodeFetchResponse","newlyCachedData","set"],"mappings":"AAUA;;;;QA0IgBA,kBAAkB,GAAlBA,kBAAkB;AA1If,IAAA,OAAQ,kCAAR,QAAQ,EAAA;AAEZ,IAAA,GAAI,kCAAJ,IAAI,EAAA;AACyC,IAAA,UAAY,WAAZ,YAAY,CAAA;AACxC,IAAA,IAAK,WAAL,KAAK,CAAA;AAIT,IAAA,SAAY,WAAZ,YAAY,CAAA;;;;;;AAExC,MAAMC,aAAa,GAAG,CAAC,AAAC;AAExB,MAAMC,iBAAiB,GAAiC,EAAE,AAAC;AAC3D,MAAMC,oBAAoB,GAAwB,EAAE,AAAC;AAErD;;;;;;GAMG,CACH,eAAeC,IAAI,CAACC,GAAW,EAAE;IAC/B,IAAI,CAACH,iBAAiB,CAACG,GAAG,CAAC,EAAE;QAC3BH,iBAAiB,CAACG,GAAG,CAAC,GAAGC,OAAO,CAACC,OAAO,EAAE,CAAC;KAC5C;IAED,MAAMC,eAAe,GAAGN,iBAAiB,CAACG,GAAG,CAAC,AAAC;IAC/CH,iBAAiB,CAACG,GAAG,CAAC,GAAGG,eAAe,CAACC,IAAI,CAC3C,IACE,IAAIH,OAAO,CAAC,CAACI,OAAO,GAAK;YACvBP,oBAAoB,CAACE,GAAG,CAAC,GAAGK,OAAO,CAAC;SACrC,CAAC;IAAA,CACL,CAAC;IAEF,OAAOF,eAAe,CAAC;CACxB;AAED;;;;;GAKG,CACH,SAASG,MAAM,CAACN,GAAW,EAAE;IAC3B,IAAIF,oBAAoB,CAACE,GAAG,CAAC,EAAE;QAC7BF,oBAAoB,CAACE,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAOF,oBAAoB,CAACE,GAAG,CAAC,CAAC;KAClC;CACF;AAED,SAASO,GAAG,CAACC,GAAW,EAAE;IACxB,OAAOC,OAAM,QAAA,CAACC,UAAU,CAAC,KAAK,CAAC,CAACC,MAAM,CAACH,GAAG,CAAC,CAACI,MAAM,CAAC,KAAK,CAAC,CAAC;CAC3D;AAED,4CAA4C;AAC5C,2CAA2C;AAC3C,iBAAiB;AACjB,SAASC,mBAAmB,CAACC,QAAkB,EAAE;IAC/C,MAAMC,QAAQ,GAAG;QAAE,GAAGD,QAAQ;KAAE,AAAC;IACjC,MAAME,QAAQ,GAAGF,QAAQ,CAACG,WAAW,EAAE,AAAC;IAExC,mBAAmB;IACnB,OAAOF,QAAQ,CAACG,SAAS,CAAC;IAE1B,MAAMC,oBAAoB,GAAG,IAAIC,MAAM,CAACJ,QAAQ,EAAE,GAAG,CAAC,AAAC;IAEvD,mBAAmB;IACnBD,QAAQ,CAACM,QAAQ,GAAGN,QAAQ,CAACM,QAAQ,CAACC,GAAG,CAAC,CAACC,CAAC,GAAK;QAC/C,IAAI,OAAOA,CAAC,KAAK,QAAQ,EAAE;YACzB,OAAOA,CAAC,CAACC,OAAO,CAACL,oBAAoB,EAAE,EAAE,CAAC,CAAC;SAC5C;QAED,OAAOI,CAAC,CAAC;KACV,CAAC,CAAC;IAEH,OAAOR,QAAQ,CAAC;CACjB;AAED,SAASU,mBAAmB,CAACC,IAAS,EAAE;IACtC,IAAI,CAACA,IAAI,EAAE;QACT,OAAOA,IAAI,CAAC;KACb;IACD,IAAI,OAAOA,IAAI,KAAK,QAAQ,EAAE;QAC5B,OAAOA,IAAI,CAAC;KACb;IACD,IAAIA,IAAI,YAAYC,IAAe,gBAAA,EAAE;QACnC,OAAOD,IAAI,CAACE,QAAQ,EAAE,CAAC;KACxB;IACD,IAAIF,IAAI,YAAYG,GAAE,QAAA,CAACC,UAAU,EAAE;QACjC,OAAOJ,IAAI,CAACK,IAAI,CAAC;KAClB;IACD,IAAIL,IAAI,CAACE,QAAQ,IAAIF,IAAI,CAACE,QAAQ,EAAE,KAAK,mBAAmB,EAAE;QAC5D,OAAOf,mBAAmB,CAACa,IAAI,CAAC,CAAC;KAClC;IACD,IAAIA,IAAI,YAAYM,MAAM,EAAE;QAC1B,OAAON,IAAI,CAACE,QAAQ,EAAE,CAAC;KACxB;IAED,MAAM,IAAIK,KAAK,CACb,gIAAgI,CACjI,CAAC;CACH;AAED,SAASC,kBAAkB,CAACC,GAAQ,EAAE;IACpC,OAAO;QACLC,KAAK,EAAED,GAAG,CAACC,KAAK;QAChBC,WAAW,EAAEF,GAAG,CAACE,WAAW;QAC5BC,WAAW,EAAEH,GAAG,CAACG,WAAW;QAC5BC,OAAO,EAAEJ,GAAG,CAACI,OAAO;QACpBC,SAAS,EAAEL,GAAG,CAACK,SAAS;QACxBC,MAAM,EAAEN,GAAG,CAACM,MAAM;QAClBC,QAAQ,EAAEP,GAAG,CAACO,QAAQ;QACtBC,QAAQ,EAAER,GAAG,CAACQ,QAAQ;QACtBC,cAAc,EAAET,GAAG,CAACS,cAAc;QAClCC,GAAG,EAAEV,GAAG,CAACU,GAAG;QACZnB,IAAI,EAAED,mBAAmB,CAACU,GAAG,CAACT,IAAI,CAAC;KACpC,CAAC;CACH;AAED,SAASoB,WAAW,CAACC,gBAAuB,EAAE;IAC5C,MAAMC,QAAQ,GAAGD,gBAAgB,CAAC,CAAC,CAAC,AAAC;IACrC,MAAME,IAAI,GAAGF,gBAAgB,CAAC,CAAC,CAAC,IAAI,EAAE,AAAC;IAEvC,MAAMG,oBAAoB,GACxBF,QAAQ,YAAYG,UAAO,QAAA,GAAGjB,kBAAkB,CAACc,QAAQ,CAAC,GAAG;QAAEH,GAAG,EAAEG,QAAQ;KAAE,AAAC;IAEjF,MAAMI,gBAAgB,GAAG;QAAE,GAAGH,IAAI;KAAE,AAAC;IAErC,aAAa;IACbC,oBAAoB,CAACxB,IAAI,GAAGD,mBAAmB,CAACyB,oBAAoB,CAACxB,IAAI,CAAC,CAAC;IAC3E0B,gBAAgB,CAAC1B,IAAI,GAAGD,mBAAmB,CAAC2B,gBAAgB,CAAC1B,IAAI,CAAC,CAAC;IAEnE,OAAO0B,gBAAgB,CAACC,KAAK,CAAC;IAE9B,OAAO9C,GAAG,CAAC+C,IAAI,CAACC,SAAS,CAAC;QAACL,oBAAoB;QAAEE,gBAAgB;QAAExD,aAAa;KAAC,CAAC,CAAC,CAAC;CACrF;AAEM,SAASD,kBAAkB,CAChC6D,KAAgB,EAChBpB,MAAsB,EACmD;IACzE,eAAeqB,WAAW,CACxBrB,KAAsB,EACtBS,GAAgB,EAChBI,IAA8B,EAC9B;QACA,MAAMlC,QAAQ,GAAG+B,WAAW,CAAC;YAACD,GAAG;YAAEI,IAAI;SAAC,CAAC,AAAC;QAC1C,IAAIS,WAAW,GAAG,MAAMtB,KAAK,CAACuB,GAAG,CAAC5C,QAAQ,CAAC,AAAC;QAE5C,MAAM6C,kBAAkB,GAAG,IAAMxB,KAAK,CAACyB,MAAM,CAAC9C,QAAQ,CAAC;QAAC;QAExD,IAAI2C,WAAW,EAAE;YACf,OAAO,IAAII,SAAW,YAAA,CACpBJ,WAAW,CAACK,UAAU,EACtBL,WAAW,CAACM,QAAQ,EACpBJ,kBAAkB,EAClB,IAAI,CACL,CAAC;SACH;QAED,MAAM7D,IAAI,CAACgB,QAAQ,CAAC,CAAC;QACrB,IAAI;YACF2C,WAAW,GAAG,MAAMtB,KAAK,CAACuB,GAAG,CAAC5C,QAAQ,CAAC,CAAC;YACxC,IAAI2C,WAAW,EAAE;gBACf,OAAO,IAAII,SAAW,YAAA,CACpBJ,WAAW,CAACK,UAAU,EACtBL,WAAW,CAACM,QAAQ,EACpBJ,kBAAkB,EAClB,IAAI,CACL,CAAC;aACH;YAED,MAAMK,aAAa,GAAG,MAAMT,KAAK,CAACX,GAAG,EAAEI,IAAI,CAAC,AAAC;YAC7C,MAAMiB,cAAc,GAAGJ,SAAW,YAAA,CAACK,kCAAkC,CAACF,aAAa,CAAC,AAAC;YAErF,MAAMG,eAAe,GAAG,MAAMhC,KAAK,CAACiC,GAAG,CACrCtD,QAAQ,EACR,mBAAmB;YACnBkD,aAAa,CAACvC,IAAI,EAClBwC,cAAc,CACf,AAAC;YAEF,OAAO,IAAIJ,SAAW,YAAA,CACpBM,eAAe,CAAEL,UAAU,EAC3BK,eAAe,CAAEJ,QAAQ,EACzBJ,kBAAkB,EAClB,KAAK,CACN,CAAC;SACH,QAAS;YACRtD,MAAM,CAACS,QAAQ,CAAC,CAAC;SAClB;KACF;IACD,OAAO,CAAC8B,GAAgB,EAAEI,IAA8B,GAAKQ,WAAW,CAACrB,MAAK,EAAES,GAAG,EAAEI,IAAI,CAAC;IAAA,CAAC;CAC5F"}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/api/rest/cache/wrapFetchWithCache.ts"],"sourcesContent":["/**\n * Copyright (c) 2021 Expo, Inc.\n * Copyright (c) 2020 mistval.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * Based on https://github.com/mistval/node-fetch-cache/blob/9c40ddf786b0de22ce521d8bdaa6347bc44dd629/src/index.js#L1\n * But with TypeScript support to fix Jest tests, and removed unused code.\n */\nimport crypto from 'crypto';\nimport FormData from 'form-data';\nimport fs from 'fs';\nimport { Request, RequestInfo, RequestInit, Response } from 'node-fetch';\nimport { URLSearchParams } from 'url';\n\nimport { FileSystemCache } from './FileSystemCache';\nimport { NFCResponse } from './response';\nimport { FetchLike } from '../client.types';\n\nconst CACHE_VERSION = 3;\n\nconst lockPromiseForKey: Record<string, Promise<any>> = {};\nconst unlockFunctionForKey: Record<string, any> = {};\n\n/**\n * Take out a lock. When this function returns (asynchronously),\n * you have the lock.\n * @param {string} key - The key to lock on. Anyone else who\n * tries to lock on the same key will need to wait for it to\n * be unlocked.\n */\nasync function lock(key: string) {\n if (!lockPromiseForKey[key]) {\n lockPromiseForKey[key] = Promise.resolve();\n }\n\n const takeLockPromise = lockPromiseForKey[key];\n lockPromiseForKey[key] = takeLockPromise.then(\n () =>\n new Promise((fulfill) => {\n unlockFunctionForKey[key] = fulfill;\n })\n );\n\n return takeLockPromise;\n}\n\n/**\n * Release a lock.\n * @param {string} key - The key to release the lock for.\n * The next person in line will now be able to take out\n * the lock for that key.\n */\nfunction unlock(key: string) {\n if (unlockFunctionForKey[key]) {\n unlockFunctionForKey[key]();\n delete unlockFunctionForKey[key];\n }\n}\n\nfunction md5(str: string) {\n return crypto.createHash('md5').update(str).digest('hex');\n}\n\n// Since the boundary in FormData is random,\n// we ignore it for purposes of calculating\n// the cache key.\nfunction getFormDataCacheKey(formData: FormData) {\n const cacheKey = { ...formData };\n const boundary = formData.getBoundary();\n\n // @ts-expect-error\n delete cacheKey._boundary;\n\n const boundaryReplaceRegex = new RegExp(boundary, 'g');\n\n // @ts-expect-error\n cacheKey._streams = cacheKey._streams.map((s) => {\n if (typeof s === 'string') {\n return s.replace(boundaryReplaceRegex, '');\n }\n\n return s;\n });\n\n return cacheKey;\n}\n\nfunction getBodyCacheKeyJson(body: any) {\n if (!body) {\n return body;\n }\n if (typeof body === 'string') {\n return body;\n }\n if (body instanceof URLSearchParams) {\n return body.toString();\n }\n if (body instanceof fs.ReadStream) {\n return body.path;\n }\n if (body.toString && body.toString() === '[object FormData]') {\n return getFormDataCacheKey(body);\n }\n if (body instanceof Buffer) {\n return body.toString();\n }\n\n throw new Error(\n 'Unsupported body type. Supported body types are: string, number, undefined, null, url.URLSearchParams, fs.ReadStream, FormData'\n );\n}\n\nfunction getRequestCacheKey(req: any) {\n return {\n cache: req.cache,\n credentials: req.credentials,\n destination: req.destination,\n headers: req.headers,\n integrity: req.integrity,\n method: req.method,\n redirect: req.redirect,\n referrer: req.referrer,\n referrerPolicy: req.referrerPolicy,\n url: req.url,\n body: getBodyCacheKeyJson(req.body),\n };\n}\n\nfunction getCacheKey(requestArguments: any[]) {\n const resource = requestArguments[0];\n const init = requestArguments[1] || {};\n\n const resourceCacheKeyJson =\n resource instanceof Request ? getRequestCacheKey(resource) : { url: resource };\n\n const initCacheKeyJson = { ...init };\n\n // @ts-ignore\n resourceCacheKeyJson.body = getBodyCacheKeyJson(resourceCacheKeyJson.body);\n initCacheKeyJson.body = getBodyCacheKeyJson(initCacheKeyJson.body);\n\n delete initCacheKeyJson.agent;\n\n return md5(JSON.stringify([resourceCacheKeyJson, initCacheKeyJson, CACHE_VERSION]));\n}\n\nexport function wrapFetchWithCache(\n fetch: FetchLike,\n cache: FileSystemCache\n): (url: RequestInfo, init?: RequestInit | undefined) => Promise<Response> {\n async function getResponse(\n cache: FileSystemCache,\n url: RequestInfo,\n init?: RequestInit | undefined\n ) {\n const cacheKey = getCacheKey([url, init]);\n let cachedValue = await cache.get(cacheKey);\n\n const ejectSelfFromCache = () => cache.remove(cacheKey);\n\n if (cachedValue) {\n return new NFCResponse(\n cachedValue.bodyStream,\n cachedValue.metaData,\n ejectSelfFromCache,\n true\n );\n }\n\n await lock(cacheKey);\n try {\n cachedValue = await cache.get(cacheKey);\n if (cachedValue) {\n return new NFCResponse(\n cachedValue.bodyStream,\n cachedValue.metaData,\n ejectSelfFromCache,\n true\n );\n }\n\n const fetchResponse = await fetch(url, init);\n const serializedMeta = NFCResponse.serializeMetaFromNodeFetchResponse(fetchResponse);\n\n const newlyCachedData = await cache.set(\n cacheKey,\n // @ts-expect-error\n fetchResponse.body,\n serializedMeta\n );\n\n return new NFCResponse(\n newlyCachedData!.bodyStream,\n newlyCachedData!.metaData,\n ejectSelfFromCache,\n false\n );\n } finally {\n unlock(cacheKey);\n }\n }\n return (url: RequestInfo, init?: RequestInit | undefined) => getResponse(cache, url, init);\n}\n"],"names":["wrapFetchWithCache","CACHE_VERSION","lockPromiseForKey","unlockFunctionForKey","lock","key","Promise","resolve","takeLockPromise","then","fulfill","unlock","md5","str","crypto","createHash","update","digest","getFormDataCacheKey","formData","cacheKey","boundary","getBoundary","_boundary","boundaryReplaceRegex","RegExp","_streams","map","s","replace","getBodyCacheKeyJson","body","URLSearchParams","toString","fs","ReadStream","path","Buffer","Error","getRequestCacheKey","req","cache","credentials","destination","headers","integrity","method","redirect","referrer","referrerPolicy","url","getCacheKey","requestArguments","resource","init","resourceCacheKeyJson","Request","initCacheKeyJson","agent","JSON","stringify","fetch","getResponse","cachedValue","get","ejectSelfFromCache","remove","NFCResponse","bodyStream","metaData","fetchResponse","serializedMeta","serializeMetaFromNodeFetchResponse","newlyCachedData","set"],"mappings":"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"}
|
|
@@ -8,17 +8,17 @@ exports.fetchAsync = void 0;
|
|
|
8
8
|
var _getUserState = require("@expo/config/build/getUserState");
|
|
9
9
|
var _nodeFetch = _interopRequireDefault(require("node-fetch"));
|
|
10
10
|
var _path = _interopRequireDefault(require("path"));
|
|
11
|
-
var _env = require("../../utils/env");
|
|
12
|
-
var _errors = require("../../utils/errors");
|
|
13
|
-
var _endpoint = require("../endpoint");
|
|
14
|
-
var _settings = require("../settings");
|
|
15
|
-
var _userSettings = _interopRequireDefault(require("../user/UserSettings"));
|
|
16
11
|
var _fileSystemCache = require("./cache/FileSystemCache");
|
|
17
12
|
var _wrapFetchWithCache = require("./cache/wrapFetchWithCache");
|
|
18
13
|
var _wrapFetchWithBaseUrl = require("./wrapFetchWithBaseUrl");
|
|
19
14
|
var _wrapFetchWithOffline = require("./wrapFetchWithOffline");
|
|
20
15
|
var _wrapFetchWithProgress = require("./wrapFetchWithProgress");
|
|
21
16
|
var _wrapFetchWithProxy = require("./wrapFetchWithProxy");
|
|
17
|
+
var _env = require("../../utils/env");
|
|
18
|
+
var _errors = require("../../utils/errors");
|
|
19
|
+
var _endpoint = require("../endpoint");
|
|
20
|
+
var _settings = require("../settings");
|
|
21
|
+
var _userSettings = _interopRequireDefault(require("../user/UserSettings"));
|
|
22
22
|
function _interopRequireDefault(obj) {
|
|
23
23
|
return obj && obj.__esModule ? obj : {
|
|
24
24
|
default: obj
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/api/rest/client.ts"],"sourcesContent":["import { getExpoHomeDirectory } from '@expo/config/build/getUserState';\nimport { JSONValue } from '@expo/json-file';\nimport fetchInstance from 'node-fetch';\nimport path from 'path';\n\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../../src/api/rest/client.ts"],"sourcesContent":["import { getExpoHomeDirectory } from '@expo/config/build/getUserState';\nimport { JSONValue } from '@expo/json-file';\nimport fetchInstance from 'node-fetch';\nimport path from 'path';\n\nimport { FileSystemCache } from './cache/FileSystemCache';\nimport { wrapFetchWithCache } from './cache/wrapFetchWithCache';\nimport { FetchLike } from './client.types';\nimport { wrapFetchWithBaseUrl } from './wrapFetchWithBaseUrl';\nimport { wrapFetchWithOffline } from './wrapFetchWithOffline';\nimport { wrapFetchWithProgress } from './wrapFetchWithProgress';\nimport { wrapFetchWithProxy } from './wrapFetchWithProxy';\nimport { env } from '../../utils/env';\nimport { CommandError } from '../../utils/errors';\nimport { getExpoApiBaseUrl } from '../endpoint';\nimport { disableNetwork } from '../settings';\nimport UserSettings from '../user/UserSettings';\n\nexport class ApiV2Error extends Error {\n readonly name = 'ApiV2Error';\n readonly code: string;\n readonly expoApiV2ErrorCode: string;\n readonly expoApiV2ErrorDetails?: JSONValue;\n readonly expoApiV2ErrorServerStack?: string;\n readonly expoApiV2ErrorMetadata?: object;\n\n constructor(response: {\n message: string;\n code: string;\n stack?: string;\n details?: JSONValue;\n metadata?: object;\n }) {\n super(response.message);\n this.code = response.code;\n this.expoApiV2ErrorCode = response.code;\n this.expoApiV2ErrorDetails = response.details;\n this.expoApiV2ErrorServerStack = response.stack;\n this.expoApiV2ErrorMetadata = response.metadata;\n }\n}\n\n/**\n * An Expo server error that didn't return the expected error JSON information.\n * The only 'expected' place for this is in testing, all other cases are bugs with the server.\n */\nexport class UnexpectedServerError extends Error {\n readonly name = 'UnexpectedServerError';\n}\n\n/**\n * @returns a `fetch` function that will inject user authentication information and handle errors from the Expo API.\n */\nexport function wrapFetchWithCredentials(fetchFunction: FetchLike): FetchLike {\n return async function fetchWithCredentials(url, options = {}) {\n if (Array.isArray(options.headers)) {\n throw new Error('request headers must be in object form');\n }\n\n const resolvedHeaders = options.headers ?? ({} as any);\n\n const token = UserSettings.getAccessToken();\n if (token) {\n resolvedHeaders.authorization = `Bearer ${token}`;\n } else {\n const sessionSecret = UserSettings.getSession()?.sessionSecret;\n if (sessionSecret) {\n resolvedHeaders['expo-session'] = sessionSecret;\n }\n }\n\n try {\n const results = await fetchFunction(url, {\n ...options,\n headers: resolvedHeaders,\n });\n\n if (results.status >= 400 && results.status < 500) {\n const body = await results.text();\n try {\n const data = JSON.parse(body);\n if (data?.errors?.length) {\n throw new ApiV2Error(data.errors[0]);\n }\n } catch (error: any) {\n // Server returned non-json response.\n if (error.message.includes('in JSON at position')) {\n throw new UnexpectedServerError(body);\n }\n throw error;\n }\n }\n return results;\n } catch (error: any) {\n // Specifically, when running `npx expo start` and the wifi is connected but not really (public wifi, airplanes, etc).\n if ('code' in error && error.code === 'ENOTFOUND') {\n disableNetwork();\n\n throw new CommandError(\n 'OFFLINE',\n 'Network connection is unreliable. Try again with the environment variable `EXPO_OFFLINE=1` to skip network requests.'\n );\n }\n\n throw error;\n }\n };\n}\n\nconst fetchWithOffline = wrapFetchWithOffline(fetchInstance);\n\nconst fetchWithBaseUrl = wrapFetchWithBaseUrl(fetchWithOffline, getExpoApiBaseUrl() + '/v2/');\n\nconst fetchWithProxy = wrapFetchWithProxy(fetchWithBaseUrl);\n\nconst fetchWithCredentials = wrapFetchWithProgress(wrapFetchWithCredentials(fetchWithProxy));\n\n/**\n * Create an instance of the fully qualified fetch command (auto authentication and api) but with caching in the '~/.expo' directory.\n * Caching is disabled automatically if the EXPO_NO_CACHE or EXPO_BETA environment variables are enabled.\n */\nexport function createCachedFetch({\n fetch = fetchWithCredentials,\n cacheDirectory,\n ttl,\n skipCache,\n}: {\n fetch?: FetchLike;\n cacheDirectory: string;\n ttl?: number;\n skipCache?: boolean;\n}): FetchLike {\n // Disable all caching in EXPO_BETA.\n if (skipCache || env.EXPO_BETA || env.EXPO_NO_CACHE) {\n return fetch;\n }\n\n return wrapFetchWithCache(\n fetch,\n new FileSystemCache({\n cacheDirectory: path.join(getExpoHomeDirectory(), cacheDirectory),\n ttl,\n })\n );\n}\n\n/** Instance of fetch with automatic base URL pointing to the Expo API, user credential injection, and API error handling. Caching not included. */\nexport const fetchAsync = wrapFetchWithProgress(wrapFetchWithCredentials(fetchWithProxy));\n"],"names":["wrapFetchWithCredentials","createCachedFetch","ApiV2Error","Error","name","constructor","response","message","code","expoApiV2ErrorCode","expoApiV2ErrorDetails","details","expoApiV2ErrorServerStack","stack","expoApiV2ErrorMetadata","metadata","UnexpectedServerError","fetchFunction","fetchWithCredentials","url","options","Array","isArray","headers","resolvedHeaders","token","UserSettings","getAccessToken","authorization","sessionSecret","getSession","results","status","body","text","data","JSON","parse","errors","length","error","includes","disableNetwork","CommandError","fetchWithOffline","wrapFetchWithOffline","fetchInstance","fetchWithBaseUrl","wrapFetchWithBaseUrl","getExpoApiBaseUrl","fetchWithProxy","wrapFetchWithProxy","wrapFetchWithProgress","fetch","cacheDirectory","ttl","skipCache","env","EXPO_BETA","EXPO_NO_CACHE","wrapFetchWithCache","FileSystemCache","path","join","getExpoHomeDirectory","fetchAsync"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/api/rest/wrapFetchWithOffline.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"sources":["../../../../src/api/rest/wrapFetchWithOffline.ts"],"sourcesContent":["import { FetchLike } from './client.types';\nimport { env } from '../../utils/env';\n\nconst debug = require('debug')('expo:api:fetch:offline') as typeof console.log;\n\n/** Wrap fetch with support for `EXPO_OFFLINE` to disable network requests. */\nexport function wrapFetchWithOffline(fetchFunction: FetchLike): FetchLike {\n // NOTE(EvanBacon): DO NOT RETURN AN ASYNC WRAPPER. THIS BREAKS LOADING INDICATORS.\n return function fetchWithOffline(url, options = {}) {\n if (env.EXPO_OFFLINE) {\n debug('Skipping network request: ' + url);\n options.timeout = 1;\n }\n return fetchFunction(url, options);\n };\n}\n"],"names":["wrapFetchWithOffline","debug","require","fetchFunction","fetchWithOffline","url","options","env","EXPO_OFFLINE","timeout"],"mappings":"AAAA;;;;QAMgBA,oBAAoB,GAApBA,oBAAoB;AALhB,IAAA,IAAiB,WAAjB,iBAAiB,CAAA;AAErC,MAAMC,KAAK,GAAGC,OAAO,CAAC,OAAO,CAAC,CAAC,wBAAwB,CAAC,AAAsB,AAAC;AAGxE,SAASF,oBAAoB,CAACG,aAAwB,EAAa;IACxE,mFAAmF;IACnF,OAAO,SAASC,gBAAgB,CAACC,GAAG,EAAEC,OAAO,GAAG,EAAE,EAAE;QAClD,IAAIC,IAAG,IAAA,CAACC,YAAY,EAAE;YACpBP,KAAK,CAAC,4BAA4B,GAAGI,GAAG,CAAC,CAAC;YAC1CC,OAAO,CAACG,OAAO,GAAG,CAAC,CAAC;SACrB;QACD,OAAON,aAAa,CAACE,GAAG,EAAEC,OAAO,CAAC,CAAC;KACpC,CAAC;CACH"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/api/rest/wrapFetchWithProgress.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"sources":["../../../../src/api/rest/wrapFetchWithProgress.ts"],"sourcesContent":["import { FetchLike } from './client.types';\nimport * as Log from '../../log';\nconst debug = require('debug')('expo:api:fetch:progress') as typeof console.log;\n\nexport function wrapFetchWithProgress(fetch: FetchLike): FetchLike {\n return (url, init) => {\n return fetch(url, init).then((res) => {\n if (res.ok && init?.onProgress) {\n const totalDownloadSize = res.headers.get('Content-Length');\n const total = Number(totalDownloadSize);\n\n debug(`Download size: ${totalDownloadSize}`);\n if (!totalDownloadSize || isNaN(total) || total < 0) {\n Log.warn(\n 'Progress callback not supported for network request because \"Content-Length\" header missing or invalid in response from URL:',\n url.toString()\n );\n return res;\n }\n\n let length = 0;\n\n debug(`Starting progress animation for ${url}`);\n res.body.on('data', (chunk) => {\n length += Buffer.byteLength(chunk);\n onProgress();\n });\n\n res.body.on('end', () => {\n debug(`Finished progress animation for ${url}`);\n onProgress();\n });\n\n const onProgress = () => {\n const progress = length / total || 0;\n init.onProgress?.({\n progress,\n total,\n loaded: length,\n });\n };\n }\n return res;\n });\n };\n}\n"],"names":["wrapFetchWithProgress","Log","debug","require","fetch","url","init","then","res","ok","onProgress","totalDownloadSize","headers","get","total","Number","isNaN","warn","toString","length","body","on","chunk","Buffer","byteLength","progress","loaded"],"mappings":"AAAA;;;;QAIgBA,qBAAqB,GAArBA,qBAAqB;AAHzBC,IAAAA,GAAG,mCAAM,WAAW,EAAjB;;;;;;;;;;;;;;;;;;;;;;AACf,MAAMC,KAAK,GAAGC,OAAO,CAAC,OAAO,CAAC,CAAC,yBAAyB,CAAC,AAAsB,AAAC;AAEzE,SAASH,qBAAqB,CAACI,KAAgB,EAAa;IACjE,OAAO,CAACC,GAAG,EAAEC,IAAI,GAAK;QACpB,OAAOF,KAAK,CAACC,GAAG,EAAEC,IAAI,CAAC,CAACC,IAAI,CAAC,CAACC,GAAG,GAAK;YACpC,IAAIA,GAAG,CAACC,EAAE,IAAIH,CAAAA,IAAI,QAAY,GAAhBA,KAAAA,CAAgB,GAAhBA,IAAI,CAAEI,UAAU,CAAA,EAAE;gBAC9B,MAAMC,iBAAiB,GAAGH,GAAG,CAACI,OAAO,CAACC,GAAG,CAAC,gBAAgB,CAAC,AAAC;gBAC5D,MAAMC,KAAK,GAAGC,MAAM,CAACJ,iBAAiB,CAAC,AAAC;gBAExCT,KAAK,CAAC,CAAC,eAAe,EAAES,iBAAiB,CAAC,CAAC,CAAC,CAAC;gBAC7C,IAAI,CAACA,iBAAiB,IAAIK,KAAK,CAACF,KAAK,CAAC,IAAIA,KAAK,GAAG,CAAC,EAAE;oBACnDb,GAAG,CAACgB,IAAI,CACN,8HAA8H,EAC9HZ,GAAG,CAACa,QAAQ,EAAE,CACf,CAAC;oBACF,OAAOV,GAAG,CAAC;iBACZ;gBAED,IAAIW,MAAM,GAAG,CAAC,AAAC;gBAEfjB,KAAK,CAAC,CAAC,gCAAgC,EAAEG,GAAG,CAAC,CAAC,CAAC,CAAC;gBAChDG,GAAG,CAACY,IAAI,CAACC,EAAE,CAAC,MAAM,EAAE,CAACC,KAAK,GAAK;oBAC7BH,MAAM,IAAII,MAAM,CAACC,UAAU,CAACF,KAAK,CAAC,CAAC;oBACnCZ,UAAU,EAAE,CAAC;iBACd,CAAC,CAAC;gBAEHF,GAAG,CAACY,IAAI,CAACC,EAAE,CAAC,KAAK,EAAE,IAAM;oBACvBnB,KAAK,CAAC,CAAC,gCAAgC,EAAEG,GAAG,CAAC,CAAC,CAAC,CAAC;oBAChDK,UAAU,EAAE,CAAC;iBACd,CAAC,CAAC;gBAEH,MAAMA,UAAU,GAAG,IAAM;oBACvB,MAAMe,QAAQ,GAAGN,MAAM,GAAGL,KAAK,IAAI,CAAC,AAAC;oBACrCR,IAAI,CAACI,UAAU,QAIb,GAJFJ,KAAAA,CAIE,GAJFA,IAAI,CAACI,UAAU,CAAG;wBAChBe,QAAQ;wBACRX,KAAK;wBACLY,MAAM,EAAEP,MAAM;qBACf,CAAC,AAvCZ,CAuCa;iBACJ,AAAC;aACH;YACD,OAAOX,GAAG,CAAC;SACZ,CAAC,CAAC;KACJ,CAAC;CACH"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/api/rest/wrapFetchWithProxy.ts"],"sourcesContent":["import createHttpsProxyAgent from 'https-proxy-agent';\n\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../../src/api/rest/wrapFetchWithProxy.ts"],"sourcesContent":["import createHttpsProxyAgent from 'https-proxy-agent';\n\nimport { FetchLike } from './client.types';\nimport { env } from '../../utils/env';\n\nconst debug = require('debug')('expo:api:fetch:proxy') as typeof console.log;\n\n/** Wrap fetch with support for proxies. */\nexport function wrapFetchWithProxy(fetchFunction: FetchLike): FetchLike {\n // NOTE(EvanBacon): DO NOT RETURN AN ASYNC WRAPPER. THIS BREAKS LOADING INDICATORS.\n return function fetchWithProxy(url, options = {}) {\n const proxy = env.HTTP_PROXY;\n if (!options.agent && proxy) {\n debug('Using proxy:', proxy);\n options.agent = createHttpsProxyAgent(proxy);\n }\n return fetchFunction(url, options);\n };\n}\n"],"names":["wrapFetchWithProxy","debug","require","fetchFunction","fetchWithProxy","url","options","proxy","env","HTTP_PROXY","agent","createHttpsProxyAgent"],"mappings":"AAAA;;;;QAQgBA,kBAAkB,GAAlBA,kBAAkB;AARA,IAAA,gBAAmB,kCAAnB,mBAAmB,EAAA;AAGjC,IAAA,IAAiB,WAAjB,iBAAiB,CAAA;;;;;;AAErC,MAAMC,KAAK,GAAGC,OAAO,CAAC,OAAO,CAAC,CAAC,sBAAsB,CAAC,AAAsB,AAAC;AAGtE,SAASF,kBAAkB,CAACG,aAAwB,EAAa;IACtE,mFAAmF;IACnF,OAAO,SAASC,cAAc,CAACC,GAAG,EAAEC,OAAO,GAAG,EAAE,EAAE;QAChD,MAAMC,KAAK,GAAGC,IAAG,IAAA,CAACC,UAAU,AAAC;QAC7B,IAAI,CAACH,OAAO,CAACI,KAAK,IAAIH,KAAK,EAAE;YAC3BN,KAAK,CAAC,cAAc,EAAEM,KAAK,CAAC,CAAC;YAC7BD,OAAO,CAACI,KAAK,GAAGC,CAAAA,GAAAA,gBAAqB,AAAO,CAAA,QAAP,CAACJ,KAAK,CAAC,CAAC;SAC9C;QACD,OAAOJ,aAAa,CAACE,GAAG,EAAEC,OAAO,CAAC,CAAC;KACpC,CAAC;CACH"}
|
|
@@ -7,8 +7,8 @@ exports.updateDevelopmentSessionAsync = updateDevelopmentSessionAsync;
|
|
|
7
7
|
exports.closeDevelopmentSessionAsync = closeDevelopmentSessionAsync;
|
|
8
8
|
var _os = _interopRequireDefault(require("os"));
|
|
9
9
|
var _url = require("url");
|
|
10
|
-
var _errors = require("../utils/errors");
|
|
11
10
|
var _client = require("./rest/client");
|
|
11
|
+
var _errors = require("../utils/errors");
|
|
12
12
|
function _interopRequireDefault(obj) {
|
|
13
13
|
return obj && obj.__esModule ? obj : {
|
|
14
14
|
default: obj
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/api/updateDevelopmentSession.ts"],"sourcesContent":["import { ExpoConfig } from '@expo/config';\nimport os from 'os';\nimport { URLSearchParams } from 'url';\n\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../src/api/updateDevelopmentSession.ts"],"sourcesContent":["import { ExpoConfig } from '@expo/config';\nimport os from 'os';\nimport { URLSearchParams } from 'url';\n\nimport { fetchAsync } from './rest/client';\nimport { CommandError } from '../utils/errors';\n\n/** Create the expected session info. */\nexport function createSessionInfo({\n exp,\n runtime,\n url,\n}: {\n exp: Pick<ExpoConfig, 'name' | 'description' | 'slug' | 'primaryColor'>;\n runtime: 'native' | 'web';\n url: string;\n}) {\n return {\n session: {\n description: `${exp.name} on ${os.hostname()}`,\n hostname: os.hostname(),\n platform: runtime,\n config: {\n // TODO: if icons are specified, upload a url for them too so people can distinguish\n description: exp.description,\n name: exp.name,\n slug: exp.slug,\n primaryColor: exp.primaryColor,\n },\n url,\n source: 'desktop',\n },\n };\n}\n\n/** Send a request to Expo API to keep the 'development session' alive for the provided devices. */\nexport async function updateDevelopmentSessionAsync({\n deviceIds,\n exp,\n runtime,\n url,\n}: {\n deviceIds: string[];\n exp: Pick<ExpoConfig, 'name' | 'description' | 'slug' | 'primaryColor'>;\n runtime: 'native' | 'web';\n url: string;\n}) {\n const searchParams = new URLSearchParams();\n deviceIds.forEach((id) => {\n searchParams.append('deviceId', id);\n });\n\n const results = await fetchAsync('development-sessions/notify-alive', {\n searchParams,\n method: 'POST',\n body: JSON.stringify({\n data: createSessionInfo({ exp, runtime, url }),\n }),\n });\n\n if (!results.ok) {\n throw new CommandError(\n 'API',\n `Unexpected response when updating the development session on Expo servers: ${results.statusText}.`\n );\n }\n}\n\n/** Send a request to Expo API to close the 'development session' for the provided devices. */\nexport async function closeDevelopmentSessionAsync({\n deviceIds,\n url,\n}: {\n deviceIds: string[];\n url: string;\n}) {\n const searchParams = new URLSearchParams();\n deviceIds.forEach((id) => {\n searchParams.append('deviceId', id);\n });\n\n const results = await fetchAsync('development-sessions/notify-close', {\n searchParams,\n method: 'POST',\n body: JSON.stringify({\n session: { url },\n }),\n });\n\n if (!results.ok) {\n throw new CommandError(\n 'API',\n `Unexpected response when closing the development session on Expo servers: ${results.statusText}.`\n );\n }\n}\n"],"names":["createSessionInfo","updateDevelopmentSessionAsync","closeDevelopmentSessionAsync","exp","runtime","url","session","description","name","os","hostname","platform","config","slug","primaryColor","source","deviceIds","searchParams","URLSearchParams","forEach","id","append","results","fetchAsync","method","body","JSON","stringify","data","ok","CommandError","statusText"],"mappings":"AAAA;;;;QAQgBA,iBAAiB,GAAjBA,iBAAiB;QA4BXC,6BAA6B,GAA7BA,6BAA6B;QAiC7BC,4BAA4B,GAA5BA,4BAA4B;AApEnC,IAAA,GAAI,kCAAJ,IAAI,EAAA;AACa,IAAA,IAAK,WAAL,KAAK,CAAA;AAEV,IAAA,OAAe,WAAf,eAAe,CAAA;AACb,IAAA,OAAiB,WAAjB,iBAAiB,CAAA;;;;;;AAGvC,SAASF,iBAAiB,CAAC,EAChCG,GAAG,CAAA,EACHC,OAAO,CAAA,EACPC,GAAG,CAAA,EAKJ,EAAE;IACD,OAAO;QACLC,OAAO,EAAE;YACPC,WAAW,EAAE,CAAC,EAAEJ,GAAG,CAACK,IAAI,CAAC,IAAI,EAAEC,GAAE,QAAA,CAACC,QAAQ,EAAE,CAAC,CAAC;YAC9CA,QAAQ,EAAED,GAAE,QAAA,CAACC,QAAQ,EAAE;YACvBC,QAAQ,EAAEP,OAAO;YACjBQ,MAAM,EAAE;gBACN,oFAAoF;gBACpFL,WAAW,EAAEJ,GAAG,CAACI,WAAW;gBAC5BC,IAAI,EAAEL,GAAG,CAACK,IAAI;gBACdK,IAAI,EAAEV,GAAG,CAACU,IAAI;gBACdC,YAAY,EAAEX,GAAG,CAACW,YAAY;aAC/B;YACDT,GAAG;YACHU,MAAM,EAAE,SAAS;SAClB;KACF,CAAC;CACH;AAGM,eAAed,6BAA6B,CAAC,EAClDe,SAAS,CAAA,EACTb,GAAG,CAAA,EACHC,OAAO,CAAA,EACPC,GAAG,CAAA,EAMJ,EAAE;IACD,MAAMY,YAAY,GAAG,IAAIC,IAAe,gBAAA,EAAE,AAAC;IAC3CF,SAAS,CAACG,OAAO,CAAC,CAACC,EAAE,GAAK;QACxBH,YAAY,CAACI,MAAM,CAAC,UAAU,EAAED,EAAE,CAAC,CAAC;KACrC,CAAC,CAAC;IAEH,MAAME,OAAO,GAAG,MAAMC,CAAAA,GAAAA,OAAU,AAM9B,CAAA,WAN8B,CAAC,mCAAmC,EAAE;QACpEN,YAAY;QACZO,MAAM,EAAE,MAAM;QACdC,IAAI,EAAEC,IAAI,CAACC,SAAS,CAAC;YACnBC,IAAI,EAAE5B,iBAAiB,CAAC;gBAAEG,GAAG;gBAAEC,OAAO;gBAAEC,GAAG;aAAE,CAAC;SAC/C,CAAC;KACH,CAAC,AAAC;IAEH,IAAI,CAACiB,OAAO,CAACO,EAAE,EAAE;QACf,MAAM,IAAIC,OAAY,aAAA,CACpB,KAAK,EACL,CAAC,2EAA2E,EAAER,OAAO,CAACS,UAAU,CAAC,CAAC,CAAC,CACpG,CAAC;KACH;CACF;AAGM,eAAe7B,4BAA4B,CAAC,EACjDc,SAAS,CAAA,EACTX,GAAG,CAAA,EAIJ,EAAE;IACD,MAAMY,YAAY,GAAG,IAAIC,IAAe,gBAAA,EAAE,AAAC;IAC3CF,SAAS,CAACG,OAAO,CAAC,CAACC,EAAE,GAAK;QACxBH,YAAY,CAACI,MAAM,CAAC,UAAU,EAAED,EAAE,CAAC,CAAC;KACrC,CAAC,CAAC;IAEH,MAAME,OAAO,GAAG,MAAMC,CAAAA,GAAAA,OAAU,AAM9B,CAAA,WAN8B,CAAC,mCAAmC,EAAE;QACpEN,YAAY;QACZO,MAAM,EAAE,MAAM;QACdC,IAAI,EAAEC,IAAI,CAACC,SAAS,CAAC;YACnBrB,OAAO,EAAE;gBAAED,GAAG;aAAE;SACjB,CAAC;KACH,CAAC,AAAC;IAEH,IAAI,CAACiB,OAAO,CAACO,EAAE,EAAE;QACf,MAAM,IAAIC,OAAY,aAAA,CACpB,KAAK,EACL,CAAC,0EAA0E,EAAER,OAAO,CAACS,UAAU,CAAC,CAAC,CAAC,CACnG,CAAC;KACH;CACF"}
|
|
@@ -6,14 +6,14 @@ exports.showLoginPromptAsync = showLoginPromptAsync;
|
|
|
6
6
|
exports.ensureLoggedInAsync = ensureLoggedInAsync;
|
|
7
7
|
var _assert = _interopRequireDefault(require("assert"));
|
|
8
8
|
var _chalk = _interopRequireDefault(require("chalk"));
|
|
9
|
+
var _otp = require("./otp");
|
|
10
|
+
var _user = require("./user");
|
|
9
11
|
var Log = _interopRequireWildcard(require("../../log"));
|
|
10
12
|
var _env = require("../../utils/env");
|
|
11
13
|
var _errors = require("../../utils/errors");
|
|
12
14
|
var _link = require("../../utils/link");
|
|
13
15
|
var _prompts = _interopRequireDefault(require("../../utils/prompts"));
|
|
14
16
|
var _client = require("../rest/client");
|
|
15
|
-
var _otp = require("./otp");
|
|
16
|
-
var _user = require("./user");
|
|
17
17
|
function _interopRequireDefault(obj) {
|
|
18
18
|
return obj && obj.__esModule ? obj : {
|
|
19
19
|
default: obj
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/api/user/actions.ts"],"sourcesContent":["import assert from 'assert';\nimport chalk from 'chalk';\n\nimport * as Log from '../../log';\nimport { env } from '../../utils/env';\nimport { CommandError } from '../../utils/errors';\nimport { learnMore } from '../../utils/link';\nimport promptAsync, { Question } from '../../utils/prompts';\nimport { ApiV2Error } from '../rest/client';\
|
|
1
|
+
{"version":3,"sources":["../../../../src/api/user/actions.ts"],"sourcesContent":["import assert from 'assert';\nimport chalk from 'chalk';\n\nimport { retryUsernamePasswordAuthWithOTPAsync } from './otp';\nimport { Actor, getUserAsync, loginAsync, ssoLoginAsync } from './user';\nimport * as Log from '../../log';\nimport { env } from '../../utils/env';\nimport { CommandError } from '../../utils/errors';\nimport { learnMore } from '../../utils/link';\nimport promptAsync, { Question } from '../../utils/prompts';\nimport { ApiV2Error } from '../rest/client';\n\n/** Show login prompt while prompting for missing credentials. */\nexport async function showLoginPromptAsync({\n printNewLine = false,\n otp,\n ...options\n}: {\n printNewLine?: boolean;\n username?: string;\n password?: string;\n otp?: string;\n sso?: boolean | undefined;\n} = {}): Promise<void> {\n if (env.EXPO_OFFLINE) {\n throw new CommandError('OFFLINE', 'Cannot authenticate in offline-mode');\n }\n const hasCredentials = options.username && options.password;\n const sso = options.sso;\n\n if (printNewLine) {\n Log.log();\n }\n\n if (sso) {\n await ssoLoginAsync();\n return;\n }\n\n Log.log(\n hasCredentials\n ? `Logging in to EAS with email or username (exit and run 'eas login' for other options)`\n : `Log in to EAS with email or username (exit and run 'eas login' for other options)`\n );\n\n let username = options.username;\n let password = options.password;\n\n if (!hasCredentials) {\n const resolved = await promptAsync(\n [\n !options.username && {\n type: 'text',\n name: 'username',\n message: 'Email or username',\n },\n !options.password && {\n type: 'password',\n name: 'password',\n message: 'Password',\n },\n ].filter(Boolean) as Question<string>[],\n {\n nonInteractiveHelp: `Use the EXPO_TOKEN environment variable to authenticate in CI (${learnMore(\n 'https://docs.expo.dev/accounts/programmatic-access/'\n )})`,\n }\n );\n username ??= resolved.username;\n password ??= resolved.password;\n }\n // This is just for the types.\n assert(username && password);\n\n try {\n await loginAsync({\n username,\n password,\n otp,\n });\n } catch (e) {\n if (e instanceof ApiV2Error && e.expoApiV2ErrorCode === 'ONE_TIME_PASSWORD_REQUIRED') {\n await retryUsernamePasswordAuthWithOTPAsync(\n username,\n password,\n e.expoApiV2ErrorMetadata as any\n );\n } else {\n throw e;\n }\n }\n}\n\n/** Ensure the user is logged in, if not, prompt to login. */\nexport async function ensureLoggedInAsync(): Promise<Actor> {\n let user = await getUserAsync().catch(() => null);\n\n if (!user) {\n Log.warn(chalk.yellow`An Expo user account is required to proceed.`);\n await showLoginPromptAsync({ printNewLine: true });\n user = await getUserAsync();\n }\n\n assert(user, 'User should be logged in');\n return user;\n}\n"],"names":["showLoginPromptAsync","ensureLoggedInAsync","Log","printNewLine","otp","options","env","EXPO_OFFLINE","CommandError","hasCredentials","username","password","sso","log","ssoLoginAsync","resolved","promptAsync","type","name","message","filter","Boolean","nonInteractiveHelp","learnMore","assert","loginAsync","e","ApiV2Error","expoApiV2ErrorCode","retryUsernamePasswordAuthWithOTPAsync","expoApiV2ErrorMetadata","user","getUserAsync","catch","warn","chalk","yellow"],"mappings":"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"}
|
|
@@ -6,12 +6,12 @@ exports.retryUsernamePasswordAuthWithOTPAsync = retryUsernamePasswordAuthWithOTP
|
|
|
6
6
|
exports.UserSecondFactorDeviceMethod = void 0;
|
|
7
7
|
var _assert = _interopRequireDefault(require("assert"));
|
|
8
8
|
var _chalk = _interopRequireDefault(require("chalk"));
|
|
9
|
+
var _user = require("./user");
|
|
9
10
|
var Log = _interopRequireWildcard(require("../../log"));
|
|
10
11
|
var _errors = require("../../utils/errors");
|
|
11
12
|
var _link = require("../../utils/link");
|
|
12
13
|
var _prompts = require("../../utils/prompts");
|
|
13
14
|
var _client = require("../rest/client");
|
|
14
|
-
var _user = require("./user");
|
|
15
15
|
function _interopRequireDefault(obj) {
|
|
16
16
|
return obj && obj.__esModule ? obj : {
|
|
17
17
|
default: obj
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/api/user/otp.ts"],"sourcesContent":["import assert from 'assert';\nimport chalk from 'chalk';\n\nimport * as Log from '../../log';\nimport { AbortCommandError, CommandError } from '../../utils/errors';\nimport { learnMore } from '../../utils/link';\nimport { promptAsync, selectAsync } from '../../utils/prompts';\nimport { fetchAsync } from '../rest/client';\nimport { loginAsync } from './user';\n\nexport enum UserSecondFactorDeviceMethod {\n AUTHENTICATOR = 'authenticator',\n SMS = 'sms',\n}\n\n/** Device properties for 2FA */\nexport type SecondFactorDevice = {\n id: string;\n method: UserSecondFactorDeviceMethod;\n sms_phone_number: string | null;\n is_primary: boolean;\n};\n\nconst nonInteractiveHelp = `Use the EXPO_TOKEN environment variable to authenticate in CI (${learnMore(\n 'https://docs.expo.dev/accounts/programmatic-access/'\n)})`;\n\n/**\n * Prompt for an OTP with the option to cancel the question by answering empty (pressing return key).\n */\nasync function promptForOTPAsync(cancelBehavior: 'cancel' | 'menu'): Promise<string | null> {\n const enterMessage =\n cancelBehavior === 'cancel'\n ? chalk`press {bold Enter} to cancel`\n : chalk`press {bold Enter} for more options`;\n const { otp } = await promptAsync(\n {\n type: 'text',\n name: 'otp',\n message: `One-time password or backup code (${enterMessage}):`,\n },\n { nonInteractiveHelp }\n );\n return otp || null;\n}\n\n/**\n * Prompt for user to choose a backup OTP method. If selected method is SMS, a request\n * for a new OTP will be sent to that method. Then, prompt for the OTP, and retry the user login.\n */\nasync function promptForBackupOTPAsync(\n username: string,\n password: string,\n secondFactorDevices: SecondFactorDevice[]\n): Promise<string | null> {\n const nonPrimarySecondFactorDevices = secondFactorDevices.filter((device) => !device.is_primary);\n\n if (nonPrimarySecondFactorDevices.length === 0) {\n throw new CommandError(\n 'No other second-factor devices set up. Ensure you have set up and certified a backup device.'\n );\n }\n\n const hasAuthenticatorSecondFactorDevice = nonPrimarySecondFactorDevices.find(\n (device) => device.method === UserSecondFactorDeviceMethod.AUTHENTICATOR\n );\n\n const smsNonPrimarySecondFactorDevices = nonPrimarySecondFactorDevices.filter(\n (device) => device.method === UserSecondFactorDeviceMethod.SMS\n );\n\n const authenticatorChoiceSentinel = -1;\n const cancelChoiceSentinel = -2;\n\n const deviceChoices = smsNonPrimarySecondFactorDevices.map((device, idx) => ({\n title: device.sms_phone_number!,\n value: idx,\n }));\n\n if (hasAuthenticatorSecondFactorDevice) {\n deviceChoices.push({\n title: 'Authenticator',\n value: authenticatorChoiceSentinel,\n });\n }\n\n deviceChoices.push({\n title: 'Cancel',\n value: cancelChoiceSentinel,\n });\n\n const selectedValue = await selectAsync('Select a second-factor device:', deviceChoices, {\n nonInteractiveHelp,\n });\n if (selectedValue === cancelChoiceSentinel) {\n return null;\n } else if (selectedValue === authenticatorChoiceSentinel) {\n return await promptForOTPAsync('cancel');\n }\n\n const device = smsNonPrimarySecondFactorDevices[selectedValue];\n\n await fetchAsync('auth/send-sms-otp', {\n method: 'POST',\n body: JSON.stringify({\n username,\n password,\n secondFactorDeviceID: device.id,\n }),\n });\n\n return await promptForOTPAsync('cancel');\n}\n\n/**\n * Handle the special case error indicating that a second-factor is required for\n * authentication.\n *\n * There are three cases we need to handle:\n * 1. User's primary second-factor device was SMS, OTP was automatically sent by the server to that\n * device already. In this case we should just prompt for the SMS OTP (or backup code), which the\n * user should be receiving shortly. We should give the user a way to cancel and the prompt and move\n * to case 3 below.\n * 2. User's primary second-factor device is authenticator. In this case we should prompt for authenticator\n * OTP (or backup code) and also give the user a way to cancel and move to case 3 below.\n * 3. User doesn't have a primary device or doesn't have access to their primary device. In this case\n * we should show a picker of the SMS devices that they can have an OTP code sent to, and when\n * the user picks one we show a prompt() for the sent OTP.\n */\nexport async function retryUsernamePasswordAuthWithOTPAsync(\n username: string,\n password: string,\n metadata: {\n secondFactorDevices?: SecondFactorDevice[];\n smsAutomaticallySent?: boolean;\n }\n): Promise<void> {\n const { secondFactorDevices, smsAutomaticallySent } = metadata;\n assert(\n secondFactorDevices !== undefined && smsAutomaticallySent !== undefined,\n `Malformed OTP error metadata: ${metadata}`\n );\n\n const primaryDevice = secondFactorDevices.find((device) => device.is_primary);\n let otp: string | null = null;\n\n if (smsAutomaticallySent) {\n assert(primaryDevice, 'OTP should only automatically be sent when there is a primary device');\n Log.log(\n `One-time password was sent to the phone number ending in ${primaryDevice.sms_phone_number}.`\n );\n otp = await promptForOTPAsync('menu');\n }\n\n if (primaryDevice?.method === UserSecondFactorDeviceMethod.AUTHENTICATOR) {\n Log.log('One-time password from authenticator required.');\n otp = await promptForOTPAsync('menu');\n }\n\n // user bailed on case 1 or 2, wants to move to case 3\n if (!otp) {\n otp = await promptForBackupOTPAsync(username, password, secondFactorDevices);\n }\n\n if (!otp) {\n throw new AbortCommandError();\n }\n\n await loginAsync({\n username,\n password,\n otp,\n });\n}\n"],"names":["retryUsernamePasswordAuthWithOTPAsync","Log","UserSecondFactorDeviceMethod","AUTHENTICATOR","SMS","nonInteractiveHelp","learnMore","promptForOTPAsync","cancelBehavior","enterMessage","chalk","otp","promptAsync","type","name","message","promptForBackupOTPAsync","username","password","secondFactorDevices","nonPrimarySecondFactorDevices","filter","device","is_primary","length","CommandError","hasAuthenticatorSecondFactorDevice","find","method","smsNonPrimarySecondFactorDevices","authenticatorChoiceSentinel","cancelChoiceSentinel","deviceChoices","map","idx","title","sms_phone_number","value","push","selectedValue","selectAsync","fetchAsync","body","JSON","stringify","secondFactorDeviceID","id","metadata","smsAutomaticallySent","assert","undefined","primaryDevice","log","AbortCommandError","loginAsync"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/api/user/otp.ts"],"sourcesContent":["import assert from 'assert';\nimport chalk from 'chalk';\n\nimport { loginAsync } from './user';\nimport * as Log from '../../log';\nimport { AbortCommandError, CommandError } from '../../utils/errors';\nimport { learnMore } from '../../utils/link';\nimport { promptAsync, selectAsync } from '../../utils/prompts';\nimport { fetchAsync } from '../rest/client';\n\nexport enum UserSecondFactorDeviceMethod {\n AUTHENTICATOR = 'authenticator',\n SMS = 'sms',\n}\n\n/** Device properties for 2FA */\nexport type SecondFactorDevice = {\n id: string;\n method: UserSecondFactorDeviceMethod;\n sms_phone_number: string | null;\n is_primary: boolean;\n};\n\nconst nonInteractiveHelp = `Use the EXPO_TOKEN environment variable to authenticate in CI (${learnMore(\n 'https://docs.expo.dev/accounts/programmatic-access/'\n)})`;\n\n/**\n * Prompt for an OTP with the option to cancel the question by answering empty (pressing return key).\n */\nasync function promptForOTPAsync(cancelBehavior: 'cancel' | 'menu'): Promise<string | null> {\n const enterMessage =\n cancelBehavior === 'cancel'\n ? chalk`press {bold Enter} to cancel`\n : chalk`press {bold Enter} for more options`;\n const { otp } = await promptAsync(\n {\n type: 'text',\n name: 'otp',\n message: `One-time password or backup code (${enterMessage}):`,\n },\n { nonInteractiveHelp }\n );\n return otp || null;\n}\n\n/**\n * Prompt for user to choose a backup OTP method. If selected method is SMS, a request\n * for a new OTP will be sent to that method. Then, prompt for the OTP, and retry the user login.\n */\nasync function promptForBackupOTPAsync(\n username: string,\n password: string,\n secondFactorDevices: SecondFactorDevice[]\n): Promise<string | null> {\n const nonPrimarySecondFactorDevices = secondFactorDevices.filter((device) => !device.is_primary);\n\n if (nonPrimarySecondFactorDevices.length === 0) {\n throw new CommandError(\n 'No other second-factor devices set up. Ensure you have set up and certified a backup device.'\n );\n }\n\n const hasAuthenticatorSecondFactorDevice = nonPrimarySecondFactorDevices.find(\n (device) => device.method === UserSecondFactorDeviceMethod.AUTHENTICATOR\n );\n\n const smsNonPrimarySecondFactorDevices = nonPrimarySecondFactorDevices.filter(\n (device) => device.method === UserSecondFactorDeviceMethod.SMS\n );\n\n const authenticatorChoiceSentinel = -1;\n const cancelChoiceSentinel = -2;\n\n const deviceChoices = smsNonPrimarySecondFactorDevices.map((device, idx) => ({\n title: device.sms_phone_number!,\n value: idx,\n }));\n\n if (hasAuthenticatorSecondFactorDevice) {\n deviceChoices.push({\n title: 'Authenticator',\n value: authenticatorChoiceSentinel,\n });\n }\n\n deviceChoices.push({\n title: 'Cancel',\n value: cancelChoiceSentinel,\n });\n\n const selectedValue = await selectAsync('Select a second-factor device:', deviceChoices, {\n nonInteractiveHelp,\n });\n if (selectedValue === cancelChoiceSentinel) {\n return null;\n } else if (selectedValue === authenticatorChoiceSentinel) {\n return await promptForOTPAsync('cancel');\n }\n\n const device = smsNonPrimarySecondFactorDevices[selectedValue];\n\n await fetchAsync('auth/send-sms-otp', {\n method: 'POST',\n body: JSON.stringify({\n username,\n password,\n secondFactorDeviceID: device.id,\n }),\n });\n\n return await promptForOTPAsync('cancel');\n}\n\n/**\n * Handle the special case error indicating that a second-factor is required for\n * authentication.\n *\n * There are three cases we need to handle:\n * 1. User's primary second-factor device was SMS, OTP was automatically sent by the server to that\n * device already. In this case we should just prompt for the SMS OTP (or backup code), which the\n * user should be receiving shortly. We should give the user a way to cancel and the prompt and move\n * to case 3 below.\n * 2. User's primary second-factor device is authenticator. In this case we should prompt for authenticator\n * OTP (or backup code) and also give the user a way to cancel and move to case 3 below.\n * 3. User doesn't have a primary device or doesn't have access to their primary device. In this case\n * we should show a picker of the SMS devices that they can have an OTP code sent to, and when\n * the user picks one we show a prompt() for the sent OTP.\n */\nexport async function retryUsernamePasswordAuthWithOTPAsync(\n username: string,\n password: string,\n metadata: {\n secondFactorDevices?: SecondFactorDevice[];\n smsAutomaticallySent?: boolean;\n }\n): Promise<void> {\n const { secondFactorDevices, smsAutomaticallySent } = metadata;\n assert(\n secondFactorDevices !== undefined && smsAutomaticallySent !== undefined,\n `Malformed OTP error metadata: ${metadata}`\n );\n\n const primaryDevice = secondFactorDevices.find((device) => device.is_primary);\n let otp: string | null = null;\n\n if (smsAutomaticallySent) {\n assert(primaryDevice, 'OTP should only automatically be sent when there is a primary device');\n Log.log(\n `One-time password was sent to the phone number ending in ${primaryDevice.sms_phone_number}.`\n );\n otp = await promptForOTPAsync('menu');\n }\n\n if (primaryDevice?.method === UserSecondFactorDeviceMethod.AUTHENTICATOR) {\n Log.log('One-time password from authenticator required.');\n otp = await promptForOTPAsync('menu');\n }\n\n // user bailed on case 1 or 2, wants to move to case 3\n if (!otp) {\n otp = await promptForBackupOTPAsync(username, password, secondFactorDevices);\n }\n\n if (!otp) {\n throw new AbortCommandError();\n }\n\n await loginAsync({\n username,\n password,\n otp,\n });\n}\n"],"names":["retryUsernamePasswordAuthWithOTPAsync","Log","UserSecondFactorDeviceMethod","AUTHENTICATOR","SMS","nonInteractiveHelp","learnMore","promptForOTPAsync","cancelBehavior","enterMessage","chalk","otp","promptAsync","type","name","message","promptForBackupOTPAsync","username","password","secondFactorDevices","nonPrimarySecondFactorDevices","filter","device","is_primary","length","CommandError","hasAuthenticatorSecondFactorDevice","find","method","smsNonPrimarySecondFactorDevices","authenticatorChoiceSentinel","cancelChoiceSentinel","deviceChoices","map","idx","title","sms_phone_number","value","push","selectedValue","selectAsync","fetchAsync","body","JSON","stringify","secondFactorDeviceID","id","metadata","smsAutomaticallySent","assert","undefined","primaryDevice","log","AbortCommandError","loginAsync"],"mappings":"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"}
|
|
@@ -10,6 +10,8 @@ exports.logoutAsync = logoutAsync;
|
|
|
10
10
|
exports.ANONYMOUS_USERNAME = void 0;
|
|
11
11
|
var _fs = require("fs");
|
|
12
12
|
var _graphqlTag = _interopRequireDefault(require("graphql-tag"));
|
|
13
|
+
var _userSettings = _interopRequireDefault(require("./UserSettings"));
|
|
14
|
+
var _expoSsoLauncher = require("./expoSsoLauncher");
|
|
13
15
|
var Log = _interopRequireWildcard(require("../../log"));
|
|
14
16
|
var Analytics = _interopRequireWildcard(require("../../utils/analytics/rudderstackClient"));
|
|
15
17
|
var _codesigning = require("../../utils/codesigning");
|
|
@@ -18,8 +20,6 @@ var _endpoint = require("../endpoint");
|
|
|
18
20
|
var _client = require("../graphql/client");
|
|
19
21
|
var _userQuery = require("../graphql/queries/UserQuery");
|
|
20
22
|
var _client1 = require("../rest/client");
|
|
21
|
-
var _userSettings = _interopRequireDefault(require("./UserSettings"));
|
|
22
|
-
var _expoSsoLauncher = require("./expoSsoLauncher");
|
|
23
23
|
function _interopRequireDefault(obj) {
|
|
24
24
|
return obj && obj.__esModule ? obj : {
|
|
25
25
|
default: obj
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/api/user/user.ts"],"sourcesContent":["import { promises as fs } from 'fs';\nimport gql from 'graphql-tag';\n\nimport { CurrentUserQuery } from '../../graphql/generated';\nimport * as Log from '../../log';\nimport * as Analytics from '../../utils/analytics/rudderstackClient';\nimport { getDevelopmentCodeSigningDirectory } from '../../utils/codesigning';\nimport { env } from '../../utils/env';\nimport { getExpoWebsiteBaseUrl } from '../endpoint';\nimport { graphqlClient } from '../graphql/client';\nimport { UserQuery } from '../graphql/queries/UserQuery';\nimport { fetchAsync } from '../rest/client';\
|
|
1
|
+
{"version":3,"sources":["../../../../src/api/user/user.ts"],"sourcesContent":["import { promises as fs } from 'fs';\nimport gql from 'graphql-tag';\n\nimport UserSettings from './UserSettings';\nimport { getSessionUsingBrowserAuthFlowAsync } from './expoSsoLauncher';\nimport { CurrentUserQuery } from '../../graphql/generated';\nimport * as Log from '../../log';\nimport * as Analytics from '../../utils/analytics/rudderstackClient';\nimport { getDevelopmentCodeSigningDirectory } from '../../utils/codesigning';\nimport { env } from '../../utils/env';\nimport { getExpoWebsiteBaseUrl } from '../endpoint';\nimport { graphqlClient } from '../graphql/client';\nimport { UserQuery } from '../graphql/queries/UserQuery';\nimport { fetchAsync } from '../rest/client';\n\nexport type Actor = NonNullable<CurrentUserQuery['meActor']>;\n\nlet currentUser: Actor | undefined;\n\nexport const ANONYMOUS_USERNAME = 'anonymous';\n\n/**\n * Resolve the name of the actor, either normal user or robot user.\n * This should be used whenever the \"current user\" needs to be displayed.\n * The display name CANNOT be used as project owner.\n */\nexport function getActorDisplayName(user?: Actor): string {\n switch (user?.__typename) {\n case 'User':\n return user.username;\n case 'SSOUser':\n return user.username;\n case 'Robot':\n return user.firstName ? `${user.firstName} (robot)` : 'robot';\n default:\n return ANONYMOUS_USERNAME;\n }\n}\n\nexport async function getUserAsync(): Promise<Actor | undefined> {\n const hasCredentials = UserSettings.getAccessToken() || UserSettings.getSession()?.sessionSecret;\n if (!env.EXPO_OFFLINE && !currentUser && hasCredentials) {\n const user = await UserQuery.currentUserAsync();\n currentUser = user ?? undefined;\n if (user) {\n await Analytics.setUserDataAsync(user.id, {\n username: getActorDisplayName(user),\n user_id: user.id,\n user_type: user.__typename,\n });\n }\n }\n return currentUser;\n}\n\nexport async function loginAsync(json: {\n username: string;\n password: string;\n otp?: string;\n}): Promise<void> {\n const res = await fetchAsync('auth/loginAsync', {\n method: 'POST',\n body: JSON.stringify(json),\n });\n const {\n data: { sessionSecret },\n } = await res.json();\n\n const userData = await fetchUserAsync({ sessionSecret });\n\n await UserSettings.setSessionAsync({\n sessionSecret,\n userId: userData.id,\n username: userData.username,\n currentConnection: 'Username-Password-Authentication',\n });\n}\n\nexport async function ssoLoginAsync(): Promise<void> {\n const sessionSecret = await getSessionUsingBrowserAuthFlowAsync({\n expoWebsiteUrl: getExpoWebsiteBaseUrl(),\n });\n const userData = await fetchUserAsync({ sessionSecret });\n\n await UserSettings.setSessionAsync({\n sessionSecret,\n userId: userData.id,\n username: userData.username,\n currentConnection: 'Browser-Flow-Authentication',\n });\n}\n\nexport async function logoutAsync(): Promise<void> {\n currentUser = undefined;\n await Promise.all([\n fs.rm(getDevelopmentCodeSigningDirectory(), { recursive: true, force: true }),\n UserSettings.setSessionAsync(undefined),\n ]);\n Log.log('Logged out');\n}\n\nasync function fetchUserAsync({\n sessionSecret,\n}: {\n sessionSecret: string;\n}): Promise<{ id: string; username: string }> {\n const result = await graphqlClient\n .query(\n gql`\n query UserQuery {\n meUserActor {\n id\n username\n }\n }\n `,\n {},\n {\n fetchOptions: {\n headers: {\n 'expo-session': sessionSecret,\n },\n },\n additionalTypenames: [] /* UserQuery has immutable fields */,\n }\n )\n .toPromise();\n const { data } = result;\n return {\n id: data.meUserActor.id,\n username: data.meUserActor.username,\n };\n}\n"],"names":["getActorDisplayName","getUserAsync","loginAsync","ssoLoginAsync","logoutAsync","Log","Analytics","currentUser","ANONYMOUS_USERNAME","user","__typename","username","firstName","UserSettings","hasCredentials","getAccessToken","getSession","sessionSecret","env","EXPO_OFFLINE","UserQuery","currentUserAsync","undefined","setUserDataAsync","id","user_id","user_type","json","res","fetchAsync","method","body","JSON","stringify","data","userData","fetchUserAsync","setSessionAsync","userId","currentConnection","getSessionUsingBrowserAuthFlowAsync","expoWebsiteUrl","getExpoWebsiteBaseUrl","Promise","all","fs","rm","getDevelopmentCodeSigningDirectory","recursive","force","log","result","graphqlClient","query","gql","fetchOptions","headers","additionalTypenames","toPromise","meUserActor"],"mappings":"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"}
|