@expo/cli 0.11.1 → 0.13.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 -31
- 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 +52 -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 +73 -46
- package/build/src/export/exportApp.js.map +1 -1
- package/build/src/export/exportAssets.js +4 -4
- 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/exportHermes.js +204 -0
- package/build/src/export/exportHermes.js.map +1 -0
- package/build/src/export/exportStaticAsync.js +48 -14
- package/build/src/export/exportStaticAsync.js.map +1 -1
- package/build/src/export/favicon.js +7 -7
- package/build/src/export/favicon.js.map +1 -1
- package/build/src/export/fork-bundleAsync.js +35 -12
- 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/persistMetroAssets.js +118 -0
- package/build/src/export/persistMetroAssets.js.map +1 -0
- package/build/src/export/printBundleSizes.js.map +1 -1
- package/build/src/export/saveAssets.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/index.js +1 -0
- package/build/src/install/index.js.map +1 -1
- package/build/src/install/installAsync.js +2 -1
- package/build/src/install/installAsync.js.map +1 -1
- package/build/src/install/resolveOptions.js +7 -4
- package/build/src/install/resolveOptions.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/index.js +2 -0
- package/build/src/prebuild/index.js.map +1 -1
- package/build/src/prebuild/prebuildAsync.js +7 -6
- package/build/src/prebuild/prebuildAsync.js.map +1 -1
- package/build/src/prebuild/resolveOptions.js +4 -2
- package/build/src/prebuild/resolveOptions.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 +7 -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 +8 -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 +4 -4
- 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 +3 -12
- package/build/src/start/server/getStaticRenderFunctions.js.map +1 -1
- package/build/src/start/server/metro/MetroBundlerDevServer.js +57 -36
- package/build/src/start/server/metro/MetroBundlerDevServer.js.map +1 -1
- package/build/src/start/server/metro/MetroTerminalReporter.js +15 -4
- 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 +74 -13
- package/build/src/start/server/metro/instantiateMetro.js.map +1 -1
- package/build/src/start/server/metro/metroErrorInterface.js.map +1 -1
- package/build/src/start/server/metro/resolveFromProject.js +13 -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 +43 -5
- package/build/src/start/server/metro/withMetroMultiPlatform.js.map +1 -1
- package/build/src/start/server/metro/withMetroResolvers.js +1 -1
- package/build/src/start/server/metro/withMetroResolvers.js.map +1 -1
- package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js +3 -3
- 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/InterstitialPageMiddleware.js +3 -3
- package/build/src/start/server/middleware/InterstitialPageMiddleware.js.map +1 -1
- package/build/src/start/server/middleware/ManifestMiddleware.js +8 -5
- 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/inspector/JsInspector.js +69 -0
- package/build/src/start/server/middleware/inspector/JsInspector.js.map +1 -0
- package/build/src/start/server/middleware/inspector/LaunchBrowser.js +57 -0
- package/build/src/start/server/middleware/inspector/LaunchBrowser.js.map +1 -0
- package/build/src/start/server/middleware/inspector/LaunchBrowser.types.js +13 -0
- package/build/src/start/server/middleware/inspector/LaunchBrowser.types.js.map +1 -0
- package/build/src/start/server/middleware/inspector/LaunchBrowserImplLinux.js +79 -0
- package/build/src/start/server/middleware/inspector/LaunchBrowserImplLinux.js.map +1 -0
- package/build/src/start/server/middleware/inspector/LaunchBrowserImplMacOS.js +78 -0
- package/build/src/start/server/middleware/inspector/LaunchBrowserImplMacOS.js.map +1 -0
- package/build/src/start/server/middleware/inspector/LaunchBrowserImplWindows.js +121 -0
- package/build/src/start/server/middleware/inspector/LaunchBrowserImplWindows.js.map +1 -0
- package/build/src/start/server/middleware/inspector/createJsInspectorMiddleware.js +64 -0
- package/build/src/start/server/middleware/inspector/createJsInspectorMiddleware.js.map +1 -0
- package/build/src/start/server/middleware/inspector/middlwareMutations.js +19 -0
- package/build/src/start/server/middleware/inspector/middlwareMutations.js.map +1 -0
- package/build/src/start/server/middleware/mutations.js +19 -0
- package/build/src/start/server/middleware/mutations.js.map +1 -0
- package/build/src/start/server/middleware/remoteDevtoolsCorsMiddleware.js +31 -0
- package/build/src/start/server/middleware/remoteDevtoolsCorsMiddleware.js.map +1 -0
- package/build/src/start/server/middleware/remoteDevtoolsSecurityHeadersMiddleware.js +17 -0
- package/build/src/start/server/middleware/remoteDevtoolsSecurityHeadersMiddleware.js.map +1 -0
- package/build/src/start/server/middleware/resolveAssets.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/middleware/suppressErrorMiddleware.js +16 -0
- package/build/src/start/server/middleware/suppressErrorMiddleware.js.map +1 -0
- 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 +19 -87
- 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 +46 -18
- 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 +19 -13
- 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/src/start/server/middleware/createDevServerMiddleware.js +0 -24
- package/build/src/start/server/middleware/createDevServerMiddleware.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/start/server/middleware/ExpoMiddleware.ts"],"sourcesContent":["import { parse } from 'url';\n\nimport
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/server/middleware/ExpoMiddleware.ts"],"sourcesContent":["import { parse } from 'url';\n\nimport { ServerNext, ServerRequest, ServerResponse } from './server.types';\nimport * as Log from '../../../log';\n\n/** Base middleware creator for Expo dev servers. */\nexport abstract class ExpoMiddleware {\n constructor(\n protected projectRoot: string,\n protected supportedPaths: string[]\n ) {}\n\n /**\n * Returns true when the middleware should handle the incoming server request.\n * Exposed for testing.\n */\n _shouldHandleRequest(req: ServerRequest): boolean {\n if (!req.url) {\n return false;\n }\n const parsed = parse(req.url);\n // Strip the query params\n if (!parsed.pathname) {\n return false;\n }\n\n return this.supportedPaths.includes(parsed.pathname);\n }\n\n abstract handleRequestAsync(\n req: ServerRequest,\n res: ServerResponse,\n next: ServerNext\n ): Promise<void>;\n\n /** Create a server middleware handler. */\n public getHandler() {\n const internalMiddleware = async (\n req: ServerRequest,\n res: ServerResponse,\n next: ServerNext\n ) => {\n try {\n return await this.handleRequestAsync(req, res, next);\n } catch (error: any) {\n Log.exception(error);\n // 5xx = Server Error HTTP code\n res.statusCode = 500;\n if (typeof error === 'object' && error !== null) {\n res.end(\n JSON.stringify({\n error: error.toString(),\n })\n );\n } else {\n res.end(`Unexpected error: ${error}`);\n }\n }\n };\n const middleware = async (req: ServerRequest, res: ServerResponse, next: ServerNext) => {\n if (!this._shouldHandleRequest(req)) {\n return next();\n }\n return internalMiddleware(req, res, next);\n };\n\n middleware.internal = internalMiddleware;\n\n return middleware;\n }\n}\n\nexport function disableResponseCache(res: ServerResponse): ServerResponse {\n res.setHeader('Cache-Control', 'private, no-cache, no-store, must-revalidate');\n res.setHeader('Expires', '-1');\n res.setHeader('Pragma', 'no-cache');\n return res;\n}\n"],"names":["disableResponseCache","Log","ExpoMiddleware","constructor","projectRoot","supportedPaths","_shouldHandleRequest","req","url","parsed","parse","pathname","includes","getHandler","internalMiddleware","res","next","handleRequestAsync","error","exception","statusCode","end","JSON","stringify","toString","middleware","internal","setHeader"],"mappings":"AAAA;;;;QAwEgBA,oBAAoB,GAApBA,oBAAoB;AAxEd,IAAA,IAAK,WAAL,KAAK,CAAA;AAGfC,IAAAA,GAAG,mCAAM,cAAc,EAApB;;;;;;;;;;;;;;;;;;;;;;AAGR,MAAeC,cAAc;IAClCC,YACYC,WAAmB,EACnBC,cAAwB,CAClC;aAFUD,WAAmB,GAAnBA,WAAmB;aACnBC,cAAwB,GAAxBA,cAAwB;KAChC;IAEJ;;;KAGG,CACHC,oBAAoB,CAACC,GAAkB,EAAW;QAChD,IAAI,CAACA,GAAG,CAACC,GAAG,EAAE;YACZ,OAAO,KAAK,CAAC;SACd;QACD,MAAMC,MAAM,GAAGC,CAAAA,GAAAA,IAAK,AAAS,CAAA,MAAT,CAACH,GAAG,CAACC,GAAG,CAAC,AAAC;QAC9B,yBAAyB;QACzB,IAAI,CAACC,MAAM,CAACE,QAAQ,EAAE;YACpB,OAAO,KAAK,CAAC;SACd;QAED,OAAO,IAAI,CAACN,cAAc,CAACO,QAAQ,CAACH,MAAM,CAACE,QAAQ,CAAC,CAAC;KACtD;IAQD,0CAA0C,CAC1C,AAAOE,UAAU,GAAG;QAClB,MAAMC,kBAAkB,GAAG,OACzBP,GAAkB,EAClBQ,GAAmB,EACnBC,IAAgB,GACb;YACH,IAAI;gBACF,OAAO,MAAM,IAAI,CAACC,kBAAkB,CAACV,GAAG,EAAEQ,GAAG,EAAEC,IAAI,CAAC,CAAC;aACtD,CAAC,OAAOE,KAAK,EAAO;gBACnBjB,GAAG,CAACkB,SAAS,CAACD,KAAK,CAAC,CAAC;gBACrB,+BAA+B;gBAC/BH,GAAG,CAACK,UAAU,GAAG,GAAG,CAAC;gBACrB,IAAI,OAAOF,KAAK,KAAK,QAAQ,IAAIA,KAAK,KAAK,IAAI,EAAE;oBAC/CH,GAAG,CAACM,GAAG,CACLC,IAAI,CAACC,SAAS,CAAC;wBACbL,KAAK,EAAEA,KAAK,CAACM,QAAQ,EAAE;qBACxB,CAAC,CACH,CAAC;iBACH,MAAM;oBACLT,GAAG,CAACM,GAAG,CAAC,CAAC,kBAAkB,EAAEH,KAAK,CAAC,CAAC,CAAC,CAAC;iBACvC;aACF;SACF,AAAC;QACF,MAAMO,UAAU,GAAG,OAAOlB,GAAkB,EAAEQ,GAAmB,EAAEC,IAAgB,GAAK;YACtF,IAAI,CAAC,IAAI,CAACV,oBAAoB,CAACC,GAAG,CAAC,EAAE;gBACnC,OAAOS,IAAI,EAAE,CAAC;aACf;YACD,OAAOF,kBAAkB,CAACP,GAAG,EAAEQ,GAAG,EAAEC,IAAI,CAAC,CAAC;SAC3C,AAAC;QAEFS,UAAU,CAACC,QAAQ,GAAGZ,kBAAkB,CAAC;QAEzC,OAAOW,UAAU,CAAC;KACnB;CACF;QAhEqBvB,cAAc,GAAdA,cAAc;AAkE7B,SAASF,oBAAoB,CAACe,GAAmB,EAAkB;IACxEA,GAAG,CAACY,SAAS,CAAC,eAAe,EAAE,8CAA8C,CAAC,CAAC;IAC/EZ,GAAG,CAACY,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC/BZ,GAAG,CAACY,SAAS,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACpC,OAAOZ,GAAG,CAAC;CACZ"}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", {
|
|
3
3
|
value: true
|
|
4
4
|
});
|
|
5
|
-
var _favicon = require("../../../export/favicon");
|
|
6
5
|
var _expoMiddleware = require("./ExpoMiddleware");
|
|
6
|
+
var _favicon = require("../../../export/favicon");
|
|
7
7
|
const debug = require("debug")("expo:start:server:middleware:favicon");
|
|
8
8
|
class FaviconMiddleware extends _expoMiddleware.ExpoMiddleware {
|
|
9
9
|
constructor(projectRoot){
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/start/server/middleware/FaviconMiddleware.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/server/middleware/FaviconMiddleware.ts"],"sourcesContent":["import { ExpoMiddleware } from './ExpoMiddleware';\nimport { ServerNext, ServerRequest, ServerResponse } from './server.types';\nimport { getFaviconFromExpoConfigAsync } from '../../../export/favicon';\n\nconst debug = require('debug')('expo:start:server:middleware:favicon') as typeof console.log;\n\n/**\n * Middleware for generating a favicon.ico file for the current project if one doesn't exist.\n *\n * Test by making a get request with:\n * curl -v http://localhost:8081/favicon.ico\n */\nexport class FaviconMiddleware extends ExpoMiddleware {\n constructor(protected projectRoot: string) {\n super(projectRoot, ['/favicon.ico']);\n }\n\n async handleRequestAsync(\n req: ServerRequest,\n res: ServerResponse,\n next: ServerNext\n ): Promise<void> {\n if (!['GET', 'HEAD'].includes(req.method || '')) {\n return next();\n }\n\n let faviconImageData: Buffer | null;\n try {\n const data = await getFaviconFromExpoConfigAsync(this.projectRoot);\n if (!data) {\n debug('No favicon defined in the Expo Config, skipping generation.');\n return next();\n }\n faviconImageData = data.source;\n debug('✅ Generated favicon successfully.');\n } catch (error: any) {\n debug('Failed to generate favicon from Expo config:', error);\n return next(error);\n }\n // Respond with the generated favicon file\n res.setHeader('Content-Type', 'image/x-icon');\n res.end(faviconImageData);\n }\n}\n"],"names":["debug","require","FaviconMiddleware","ExpoMiddleware","constructor","projectRoot","handleRequestAsync","req","res","next","includes","method","faviconImageData","data","getFaviconFromExpoConfigAsync","source","error","setHeader","end"],"mappings":"AAAA;;;;AAA+B,IAAA,eAAkB,WAAlB,kBAAkB,CAAA;AAEH,IAAA,QAAyB,WAAzB,yBAAyB,CAAA;AAEvE,MAAMA,KAAK,GAAGC,OAAO,CAAC,OAAO,CAAC,CAAC,sCAAsC,CAAC,AAAsB,AAAC;AAQtF,MAAMC,iBAAiB,SAASC,eAAc,eAAA;IACnDC,YAAsBC,WAAmB,CAAE;QACzC,KAAK,CAACA,WAAW,EAAE;YAAC,cAAc;SAAC,CAAC,CAAC;aADjBA,WAAmB,GAAnBA,WAAmB;KAExC;IAED,MAAMC,kBAAkB,CACtBC,GAAkB,EAClBC,GAAmB,EACnBC,IAAgB,EACD;QACf,IAAI,CAAC;YAAC,KAAK;YAAE,MAAM;SAAC,CAACC,QAAQ,CAACH,GAAG,CAACI,MAAM,IAAI,EAAE,CAAC,EAAE;YAC/C,OAAOF,IAAI,EAAE,CAAC;SACf;QAED,IAAIG,gBAAgB,AAAe,AAAC;QACpC,IAAI;YACF,MAAMC,IAAI,GAAG,MAAMC,CAAAA,GAAAA,QAA6B,AAAkB,CAAA,8BAAlB,CAAC,IAAI,CAACT,WAAW,CAAC,AAAC;YACnE,IAAI,CAACQ,IAAI,EAAE;gBACTb,KAAK,CAAC,6DAA6D,CAAC,CAAC;gBACrE,OAAOS,IAAI,EAAE,CAAC;aACf;YACDG,gBAAgB,GAAGC,IAAI,CAACE,MAAM,CAAC;YAC/Bf,KAAK,CAAC,wCAAmC,CAAC,CAAC;SAC5C,CAAC,OAAOgB,KAAK,EAAO;YACnBhB,KAAK,CAAC,8CAA8C,EAAEgB,KAAK,CAAC,CAAC;YAC7D,OAAOP,IAAI,CAACO,KAAK,CAAC,CAAC;SACpB;QACD,0CAA0C;QAC1CR,GAAG,CAACS,SAAS,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;QAC9CT,GAAG,CAACU,GAAG,CAACN,gBAAgB,CAAC,CAAC;KAC3B;CACF;QA/BYV,iBAAiB,GAAjBA,iBAAiB"}
|
|
@@ -42,11 +42,11 @@ class InterstitialPageMiddleware extends _expoMiddleware.ExpoMiddleware {
|
|
|
42
42
|
content = content.replace(/{{\s*ProjectVersion\s*}}/, (_version = projectVersion.version) != null ? _version : "Undetected");
|
|
43
43
|
return content;
|
|
44
44
|
}
|
|
45
|
-
/** Get settings for the page from the project config. */
|
|
45
|
+
/** Get settings for the page from the project config. */ async _getProjectOptionsAsync(platform) {
|
|
46
46
|
(0, _resolvePlatform).assertRuntimePlatform(platform);
|
|
47
47
|
const { exp } = (0, _config).getConfig(this.projectRoot);
|
|
48
48
|
const { appName } = (0, _config).getNameFromConfig(exp);
|
|
49
|
-
const runtimeVersion = (0, _updates).
|
|
49
|
+
const runtimeVersion = await (0, _updates).getRuntimeVersionNullableAsync(this.projectRoot, exp, platform);
|
|
50
50
|
var _sdkVersion;
|
|
51
51
|
const sdkVersion = (_sdkVersion = exp.sdkVersion) != null ? _sdkVersion : null;
|
|
52
52
|
return {
|
|
@@ -67,7 +67,7 @@ class InterstitialPageMiddleware extends _expoMiddleware.ExpoMiddleware {
|
|
|
67
67
|
const platform = (ref = (0, _resolvePlatform).parsePlatformHeader(req)) != null ? ref : (0, _resolvePlatform).resolvePlatformFromUserAgentHeader(req);
|
|
68
68
|
(0, _resolvePlatform).assertMissingRuntimePlatform(platform);
|
|
69
69
|
(0, _resolvePlatform).assertRuntimePlatform(platform);
|
|
70
|
-
const { appName , projectVersion } = this.
|
|
70
|
+
const { appName , projectVersion } = await this._getProjectOptionsAsync(platform);
|
|
71
71
|
debug(`Create loading page. (platform: ${platform}, appName: ${appName}, projectVersion: ${projectVersion.version}, type: ${projectVersion.type})`);
|
|
72
72
|
const content = await this._getPageAsync({
|
|
73
73
|
appName,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/start/server/middleware/InterstitialPageMiddleware.ts"],"sourcesContent":["import { getConfig, getNameFromConfig } from '@expo/config';\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/server/middleware/InterstitialPageMiddleware.ts"],"sourcesContent":["import { getConfig, getNameFromConfig } from '@expo/config';\nimport { getRuntimeVersionNullableAsync } from '@expo/config-plugins/build/utils/Updates';\nimport { readFile } from 'fs/promises';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\n\nimport { disableResponseCache, ExpoMiddleware } from './ExpoMiddleware';\nimport {\n assertMissingRuntimePlatform,\n assertRuntimePlatform,\n parsePlatformHeader,\n resolvePlatformFromUserAgentHeader,\n RuntimePlatform,\n} from './resolvePlatform';\nimport { ServerRequest, ServerResponse } from './server.types';\n\ntype ProjectVersion = {\n type: 'sdk' | 'runtime';\n version: string | null;\n};\n\nconst debug = require('debug')(\n 'expo:start:server:middleware:interstitialPage'\n) as typeof console.log;\n\nexport const LoadingEndpoint = '/_expo/loading';\n\nexport class InterstitialPageMiddleware extends ExpoMiddleware {\n constructor(\n projectRoot: string,\n protected options: { scheme: string | null } = { scheme: null }\n ) {\n super(projectRoot, [LoadingEndpoint]);\n }\n\n /** Get the template HTML page and inject values. */\n async _getPageAsync({\n appName,\n projectVersion,\n }: {\n appName: string;\n projectVersion: ProjectVersion;\n }): Promise<string> {\n const templatePath =\n // Production: This will resolve when installed in the project.\n resolveFrom.silent(this.projectRoot, 'expo/static/loading-page/index.html') ??\n // Development: This will resolve when testing locally.\n path.resolve(__dirname, '../../../../../static/loading-page/index.html');\n let content = (await readFile(templatePath)).toString('utf-8');\n\n content = content.replace(/{{\\s*AppName\\s*}}/, appName);\n content = content.replace(/{{\\s*Path\\s*}}/, this.projectRoot);\n content = content.replace(/{{\\s*Scheme\\s*}}/, this.options.scheme ?? 'Unknown');\n content = content.replace(\n /{{\\s*ProjectVersionType\\s*}}/,\n `${projectVersion.type === 'sdk' ? 'SDK' : 'Runtime'} version`\n );\n content = content.replace(/{{\\s*ProjectVersion\\s*}}/, projectVersion.version ?? 'Undetected');\n\n return content;\n }\n\n /** Get settings for the page from the project config. */\n async _getProjectOptionsAsync(platform: RuntimePlatform): Promise<{\n appName: string;\n projectVersion: ProjectVersion;\n }> {\n assertRuntimePlatform(platform);\n\n const { exp } = getConfig(this.projectRoot);\n const { appName } = getNameFromConfig(exp);\n const runtimeVersion = await getRuntimeVersionNullableAsync(this.projectRoot, exp, platform);\n const sdkVersion = exp.sdkVersion ?? null;\n\n return {\n appName: appName ?? 'App',\n projectVersion:\n sdkVersion && !runtimeVersion\n ? { type: 'sdk', version: sdkVersion }\n : { type: 'runtime', version: runtimeVersion },\n };\n }\n\n async handleRequestAsync(req: ServerRequest, res: ServerResponse): Promise<void> {\n res = disableResponseCache(res);\n res.setHeader('Content-Type', 'text/html');\n\n const platform = parsePlatformHeader(req) ?? resolvePlatformFromUserAgentHeader(req);\n assertMissingRuntimePlatform(platform);\n assertRuntimePlatform(platform);\n\n const { appName, projectVersion } = await this._getProjectOptionsAsync(platform);\n debug(\n `Create loading page. (platform: ${platform}, appName: ${appName}, projectVersion: ${projectVersion.version}, type: ${projectVersion.type})`\n );\n const content = await this._getPageAsync({ appName, projectVersion });\n res.end(content);\n }\n}\n"],"names":["debug","require","LoadingEndpoint","InterstitialPageMiddleware","ExpoMiddleware","constructor","projectRoot","options","scheme","_getPageAsync","appName","projectVersion","resolveFrom","templatePath","silent","path","resolve","__dirname","content","readFile","toString","replace","type","version","_getProjectOptionsAsync","platform","assertRuntimePlatform","exp","getConfig","getNameFromConfig","runtimeVersion","getRuntimeVersionNullableAsync","sdkVersion","handleRequestAsync","req","res","disableResponseCache","setHeader","parsePlatformHeader","resolvePlatformFromUserAgentHeader","assertMissingRuntimePlatform","end"],"mappings":"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"}
|
|
@@ -14,16 +14,16 @@ var _findYarnWorkspaceRoot = _interopRequireDefault(require("find-yarn-workspace
|
|
|
14
14
|
var _path = _interopRequireDefault(require("path"));
|
|
15
15
|
var _resolveFrom = _interopRequireDefault(require("resolve-from"));
|
|
16
16
|
var _url = require("url");
|
|
17
|
+
var _expoMiddleware = require("./ExpoMiddleware");
|
|
18
|
+
var _resolveAssets = require("./resolveAssets");
|
|
19
|
+
var _resolveEntryPoint = require("./resolveEntryPoint");
|
|
20
|
+
var _resolvePlatform = require("./resolvePlatform");
|
|
17
21
|
var Log = _interopRequireWildcard(require("../../../log"));
|
|
18
22
|
var _env = require("../../../utils/env");
|
|
19
23
|
var _url1 = require("../../../utils/url");
|
|
20
24
|
var ProjectDevices = _interopRequireWildcard(require("../../project/devices"));
|
|
21
25
|
var _platformBundlers = require("../platformBundlers");
|
|
22
26
|
var _webTemplate = require("../webTemplate");
|
|
23
|
-
var _expoMiddleware = require("./ExpoMiddleware");
|
|
24
|
-
var _resolveAssets = require("./resolveAssets");
|
|
25
|
-
var _resolveEntryPoint = require("./resolveEntryPoint");
|
|
26
|
-
var _resolvePlatform = require("./resolvePlatform");
|
|
27
27
|
function _interopRequireDefault(obj) {
|
|
28
28
|
return obj && obj.__esModule ? obj : {
|
|
29
29
|
default: obj
|
|
@@ -86,7 +86,7 @@ function shouldEnableAsyncImports(projectRoot) {
|
|
|
86
86
|
// Expo Router automatically pulls this in, so we can check for it.
|
|
87
87
|
return _resolveFrom.default.silent(projectRoot, "@expo/metro-runtime") != null;
|
|
88
88
|
}
|
|
89
|
-
function createBundleUrlPath({ platform , mainModuleName , mode , minify =mode === "production" , environment , serializerOutput , lazy }) {
|
|
89
|
+
function createBundleUrlPath({ platform , mainModuleName , mode , minify =mode === "production" , environment , serializerOutput , serializerIncludeMaps , lazy }) {
|
|
90
90
|
const queryParams = new URLSearchParams({
|
|
91
91
|
platform: encodeURIComponent(platform),
|
|
92
92
|
dev: String(mode !== "production"),
|
|
@@ -106,6 +106,9 @@ function createBundleUrlPath({ platform , mainModuleName , mode , minify =mode =
|
|
|
106
106
|
if (serializerOutput) {
|
|
107
107
|
queryParams.append("serializer.output", serializerOutput);
|
|
108
108
|
}
|
|
109
|
+
if (serializerIncludeMaps) {
|
|
110
|
+
queryParams.append("serializer.map", String(serializerIncludeMaps));
|
|
111
|
+
}
|
|
109
112
|
return `/${encodeURI(mainModuleName)}.bundle?${queryParams.toString()}`;
|
|
110
113
|
}
|
|
111
114
|
const DEVELOPER_TOOL = "expo-cli";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/start/server/middleware/ManifestMiddleware.ts"],"sourcesContent":["import { ExpoConfig, ExpoGoConfig, getConfig, ProjectConfig } from '@expo/config';\nimport findWorkspaceRoot from 'find-yarn-workspace-root';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\nimport { resolve } from 'url';\n\nimport * as Log from '../../../log';\nimport { env } from '../../../utils/env';\nimport { stripExtension } from '../../../utils/url';\nimport * as ProjectDevices from '../../project/devices';\nimport { UrlCreator } from '../UrlCreator';\nimport { getPlatformBundlers } from '../platformBundlers';\nimport { createTemplateHtmlFromExpoConfigAsync } from '../webTemplate';\nimport { ExpoMiddleware } from './ExpoMiddleware';\nimport { resolveGoogleServicesFile, resolveManifestAssets } from './resolveAssets';\nimport { resolveAbsoluteEntryPoint } from './resolveEntryPoint';\nimport { parsePlatformHeader, RuntimePlatform } from './resolvePlatform';\nimport { ServerHeaders, ServerNext, ServerRequest, ServerResponse } from './server.types';\n\nconst debug = require('debug')('expo:start:server:middleware:manifest') as typeof console.log;\n\n/** Wraps `findWorkspaceRoot` and guards against having an empty `package.json` file in an upper directory. */\nexport function getWorkspaceRoot(projectRoot: string): string | null {\n try {\n return findWorkspaceRoot(projectRoot);\n } catch (error: any) {\n if (error.message.includes('Unexpected end of JSON input')) {\n return null;\n }\n throw error;\n }\n}\n\nexport function getEntryWithServerRoot(\n projectRoot: string,\n projectConfig: ProjectConfig,\n platform: string\n) {\n return path.relative(\n getMetroServerRoot(projectRoot),\n resolveAbsoluteEntryPoint(projectRoot, platform, projectConfig)\n );\n}\n\nexport function getMetroServerRoot(projectRoot: string) {\n if (env.EXPO_USE_METRO_WORKSPACE_ROOT) {\n return getWorkspaceRoot(projectRoot) ?? projectRoot;\n }\n\n return projectRoot;\n}\n\n/** Get the main entry module ID (file) relative to the project root. */\nexport function resolveMainModuleName(\n projectRoot: string,\n projectConfig: ProjectConfig,\n platform: string\n): string {\n const entryPoint = getEntryWithServerRoot(projectRoot, projectConfig, platform);\n\n debug(`Resolved entry point: ${entryPoint} (project root: ${projectRoot})`);\n\n return stripExtension(entryPoint, 'js');\n}\n\nexport function shouldEnableAsyncImports(projectRoot: string): boolean {\n if (env.EXPO_NO_METRO_LAZY) {\n return false;\n }\n\n // `@expo/metro-runtime` includes support for the fetch + eval runtime code required\n // to support async imports. If it's not installed, we can't support async imports.\n // If it is installed, the user MUST import it somewhere in their project.\n // Expo Router automatically pulls this in, so we can check for it.\n return resolveFrom.silent(projectRoot, '@expo/metro-runtime') != null;\n}\n\nexport function createBundleUrlPath({\n platform,\n mainModuleName,\n mode,\n minify = mode === 'production',\n environment,\n serializerOutput,\n lazy,\n}: {\n platform: string;\n mainModuleName: string;\n mode: string;\n minify?: boolean;\n environment?: string;\n serializerOutput?: 'static';\n lazy?: boolean;\n}): string {\n const queryParams = new URLSearchParams({\n platform: encodeURIComponent(platform),\n dev: String(mode !== 'production'),\n // TODO: Is this still needed?\n hot: String(false),\n });\n\n if (lazy) {\n queryParams.append('lazy', String(lazy));\n }\n\n if (minify) {\n queryParams.append('minify', String(minify));\n }\n if (environment) {\n queryParams.append('resolver.environment', environment);\n queryParams.append('transform.environment', environment);\n }\n if (serializerOutput) {\n queryParams.append('serializer.output', serializerOutput);\n }\n\n return `/${encodeURI(mainModuleName)}.bundle?${queryParams.toString()}`;\n}\n\n/** Info about the computer hosting the dev server. */\nexport interface HostInfo {\n host: string;\n server: 'expo';\n serverVersion: string;\n serverDriver: string | null;\n serverOS: NodeJS.Platform;\n serverOSVersion: string;\n}\n\n/** Parsed values from the supported request headers. */\nexport interface ManifestRequestInfo {\n /** Platform to serve. */\n platform: RuntimePlatform;\n /** Requested host name. */\n hostname?: string | null;\n}\n\n/** Project related info. */\nexport type ResponseProjectSettings = {\n expoGoConfig: ExpoGoConfig;\n hostUri: string;\n bundleUrl: string;\n exp: ExpoConfig;\n};\n\nexport const DEVELOPER_TOOL = 'expo-cli';\n\nexport type ManifestMiddlewareOptions = {\n /** Should start the dev servers in development mode (minify). */\n mode?: 'development' | 'production';\n /** Should instruct the bundler to create minified bundles. */\n minify?: boolean;\n constructUrl: UrlCreator['constructUrl'];\n isNativeWebpack?: boolean;\n privateKeyPath?: string;\n};\n\n/** Base middleware creator for serving the Expo manifest (like the index.html but for native runtimes). */\nexport abstract class ManifestMiddleware<\n TManifestRequestInfo extends ManifestRequestInfo\n> extends ExpoMiddleware {\n private initialProjectConfig: ProjectConfig;\n\n constructor(protected projectRoot: string, protected options: ManifestMiddlewareOptions) {\n super(\n projectRoot,\n /**\n * Only support `/`, `/manifest`, `/index.exp` for the manifest middleware.\n */\n ['/', '/manifest', '/index.exp']\n );\n this.initialProjectConfig = getConfig(projectRoot);\n }\n\n /** Exposed for testing. */\n public async _resolveProjectSettingsAsync({\n platform,\n hostname,\n }: Pick<TManifestRequestInfo, 'hostname' | 'platform'>): Promise<ResponseProjectSettings> {\n // Read the config\n const projectConfig = getConfig(this.projectRoot);\n\n // Read from headers\n const mainModuleName = this.resolveMainModuleName(projectConfig, platform);\n\n // Create the manifest and set fields within it\n const expoGoConfig = this.getExpoGoConfig({\n mainModuleName,\n hostname,\n });\n\n const hostUri = this.options.constructUrl({ scheme: '', hostname });\n\n const bundleUrl = this._getBundleUrl({\n platform,\n mainModuleName,\n hostname,\n });\n\n // Resolve all assets and set them on the manifest as URLs\n await this.mutateManifestWithAssetsAsync(projectConfig.exp, bundleUrl);\n\n return {\n expoGoConfig,\n hostUri,\n bundleUrl,\n exp: projectConfig.exp,\n };\n }\n\n /** Get the main entry module ID (file) relative to the project root. */\n private resolveMainModuleName(projectConfig: ProjectConfig, platform: string): string {\n let entryPoint = getEntryWithServerRoot(this.projectRoot, projectConfig, platform);\n\n debug(`Resolved entry point: ${entryPoint} (project root: ${this.projectRoot})`);\n\n // NOTE(Bacon): Webpack is currently hardcoded to index.bundle on native\n // in the future (TODO) we should move this logic into a Webpack plugin and use\n // a generated file name like we do on web.\n // const server = getDefaultDevServer();\n // // TODO: Move this into BundlerDevServer and read this info from self.\n // const isNativeWebpack = server instanceof WebpackBundlerDevServer && server.isTargetingNative();\n if (this.options.isNativeWebpack) {\n entryPoint = 'index.js';\n }\n\n return stripExtension(entryPoint, 'js');\n }\n\n /** Parse request headers into options. */\n public abstract getParsedHeaders(req: ServerRequest): TManifestRequestInfo;\n\n /** Store device IDs that were sent in the request headers. */\n private async saveDevicesAsync(req: ServerRequest) {\n const deviceIds = req.headers?.['expo-dev-client-id'];\n if (deviceIds) {\n await ProjectDevices.saveDevicesAsync(this.projectRoot, deviceIds).catch((e) =>\n Log.exception(e)\n );\n }\n }\n\n /** Create the bundle URL (points to the single JS entry file). Exposed for testing. */\n public _getBundleUrl({\n platform,\n mainModuleName,\n hostname,\n }: {\n platform: string;\n hostname?: string | null;\n mainModuleName: string;\n }): string {\n const path = createBundleUrlPath({\n mode: this.options.mode ?? 'development',\n minify: this.options.minify,\n platform,\n mainModuleName,\n lazy: shouldEnableAsyncImports(this.projectRoot),\n });\n\n return (\n this.options.constructUrl({\n scheme: 'http',\n // hostType: this.options.location.hostType,\n hostname,\n }) + path\n );\n }\n\n public _getBundleUrlPath({\n platform,\n mainModuleName,\n }: {\n platform: string;\n mainModuleName: string;\n }): string {\n const queryParams = new URLSearchParams({\n platform: encodeURIComponent(platform),\n dev: String(this.options.mode !== 'production'),\n // TODO: Is this still needed?\n hot: String(false),\n });\n if (shouldEnableAsyncImports(this.projectRoot)) {\n queryParams.append('lazy', String(true));\n }\n\n if (this.options.minify) {\n queryParams.append('minify', String(this.options.minify));\n }\n\n return `/${encodeURI(mainModuleName)}.bundle?${queryParams.toString()}`;\n }\n\n /** Log telemetry. */\n protected abstract trackManifest(version?: string): void;\n\n /** Get the manifest response to return to the runtime. This file contains info regarding where the assets can be loaded from. Exposed for testing. */\n public abstract _getManifestResponseAsync(options: TManifestRequestInfo): Promise<{\n body: string;\n version: string;\n headers: ServerHeaders;\n }>;\n\n private getExpoGoConfig({\n mainModuleName,\n hostname,\n }: {\n mainModuleName: string;\n hostname?: string | null;\n }): ExpoGoConfig {\n return {\n // localhost:8081\n debuggerHost: this.options.constructUrl({ scheme: '', hostname }),\n // Required for Expo Go to function.\n developer: {\n tool: DEVELOPER_TOOL,\n projectRoot: this.projectRoot,\n },\n packagerOpts: {\n // Required for dev client.\n dev: this.options.mode !== 'production',\n },\n // Indicates the name of the main bundle.\n mainModuleName,\n // Add this string to make Flipper register React Native / Metro as \"running\".\n // Can be tested by running:\n // `METRO_SERVER_PORT=8081 open -a flipper.app`\n // Where 8081 is the port where the Expo project is being hosted.\n __flipperHack: 'React Native packager is running',\n };\n }\n\n /** Resolve all assets and set them on the manifest as URLs */\n private async mutateManifestWithAssetsAsync(manifest: ExpoConfig, bundleUrl: string) {\n await resolveManifestAssets(this.projectRoot, {\n manifest,\n resolver: async (path) => {\n if (this.options.isNativeWebpack) {\n // When using our custom dev server, just do assets normally\n // without the `assets/` subpath redirect.\n return resolve(bundleUrl!.match(/^https?:\\/\\/.*?\\//)![0], path);\n }\n return bundleUrl!.match(/^https?:\\/\\/.*?\\//)![0] + 'assets/' + path;\n },\n });\n // The server normally inserts this but if we're offline we'll do it here\n await resolveGoogleServicesFile(this.projectRoot, manifest);\n }\n\n public getWebBundleUrl() {\n const platform = 'web';\n // Read from headers\n const mainModuleName = this.resolveMainModuleName(this.initialProjectConfig, platform);\n return this._getBundleUrlPath({\n platform,\n mainModuleName,\n });\n }\n\n /**\n * Web platforms should create an index.html response using the same script resolution as native.\n *\n * Instead of adding a `bundleUrl` to a `manifest.json` (native) we'll add a `<script src=\"\">`\n * to an `index.html`, this enables the web platform to load JavaScript from the server.\n */\n private async handleWebRequestAsync(req: ServerRequest, res: ServerResponse) {\n // Read from headers\n const bundleUrl = this.getWebBundleUrl();\n\n res.setHeader('Content-Type', 'text/html');\n\n res.end(\n await createTemplateHtmlFromExpoConfigAsync(this.projectRoot, {\n exp: this.initialProjectConfig.exp,\n scripts: [bundleUrl],\n })\n );\n }\n\n /** Exposed for testing. */\n async checkBrowserRequestAsync(req: ServerRequest, res: ServerResponse, next: ServerNext) {\n // Read the config\n const bundlers = getPlatformBundlers(this.initialProjectConfig.exp);\n if (bundlers.web === 'metro') {\n // NOTE(EvanBacon): This effectively disables the safety check we do on custom runtimes to ensure\n // the `expo-platform` header is included. When `web.bundler=web`, if the user has non-standard Expo\n // code loading then they'll get a web bundle without a clear assertion of platform support.\n const platform = parsePlatformHeader(req);\n // On web, serve the public folder\n if (!platform || platform === 'web') {\n if (this.initialProjectConfig.exp.web?.output === 'static') {\n // Skip the spa-styled index.html when static generation is enabled.\n next();\n return true;\n } else {\n await this.handleWebRequestAsync(req, res);\n return true;\n }\n }\n }\n return false;\n }\n\n async handleRequestAsync(\n req: ServerRequest,\n res: ServerResponse,\n next: ServerNext\n ): Promise<void> {\n // First check for standard JavaScript runtimes (aka legacy browsers like Chrome).\n if (await this.checkBrowserRequestAsync(req, res, next)) {\n return;\n }\n\n // Save device IDs for dev client.\n await this.saveDevicesAsync(req);\n\n // Read from headers\n const options = this.getParsedHeaders(req);\n const { body, version, headers } = await this._getManifestResponseAsync(options);\n for (const [headerName, headerValue] of headers) {\n res.setHeader(headerName, headerValue);\n }\n res.end(body);\n\n // Log analytics\n this.trackManifest(version ?? null);\n }\n}\n"],"names":["getWorkspaceRoot","getEntryWithServerRoot","getMetroServerRoot","resolveMainModuleName","shouldEnableAsyncImports","createBundleUrlPath","Log","ProjectDevices","debug","require","projectRoot","findWorkspaceRoot","error","message","includes","projectConfig","platform","path","relative","resolveAbsoluteEntryPoint","env","EXPO_USE_METRO_WORKSPACE_ROOT","entryPoint","stripExtension","EXPO_NO_METRO_LAZY","resolveFrom","silent","mainModuleName","mode","minify","environment","serializerOutput","lazy","queryParams","URLSearchParams","encodeURIComponent","dev","String","hot","append","encodeURI","toString","DEVELOPER_TOOL","ManifestMiddleware","ExpoMiddleware","constructor","options","initialProjectConfig","getConfig","_resolveProjectSettingsAsync","hostname","expoGoConfig","getExpoGoConfig","hostUri","constructUrl","scheme","bundleUrl","_getBundleUrl","mutateManifestWithAssetsAsync","exp","isNativeWebpack","saveDevicesAsync","req","deviceIds","headers","catch","e","exception","_getBundleUrlPath","debuggerHost","developer","tool","packagerOpts","__flipperHack","manifest","resolveManifestAssets","resolver","resolve","match","resolveGoogleServicesFile","getWebBundleUrl","handleWebRequestAsync","res","setHeader","end","createTemplateHtmlFromExpoConfigAsync","scripts","checkBrowserRequestAsync","next","bundlers","getPlatformBundlers","web","parsePlatformHeader","output","handleRequestAsync","getParsedHeaders","body","version","_getManifestResponseAsync","headerName","headerValue","trackManifest"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/server/middleware/ManifestMiddleware.ts"],"sourcesContent":["import { ExpoConfig, ExpoGoConfig, getConfig, ProjectConfig } from '@expo/config';\nimport findWorkspaceRoot from 'find-yarn-workspace-root';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\nimport { resolve } from 'url';\n\nimport { ExpoMiddleware } from './ExpoMiddleware';\nimport { resolveGoogleServicesFile, resolveManifestAssets } from './resolveAssets';\nimport { resolveAbsoluteEntryPoint } from './resolveEntryPoint';\nimport { parsePlatformHeader, RuntimePlatform } from './resolvePlatform';\nimport { ServerHeaders, ServerNext, ServerRequest, ServerResponse } from './server.types';\nimport * as Log from '../../../log';\nimport { env } from '../../../utils/env';\nimport { stripExtension } from '../../../utils/url';\nimport * as ProjectDevices from '../../project/devices';\nimport { UrlCreator } from '../UrlCreator';\nimport { getPlatformBundlers } from '../platformBundlers';\nimport { createTemplateHtmlFromExpoConfigAsync } from '../webTemplate';\n\nconst debug = require('debug')('expo:start:server:middleware:manifest') as typeof console.log;\n\n/** Wraps `findWorkspaceRoot` and guards against having an empty `package.json` file in an upper directory. */\nexport function getWorkspaceRoot(projectRoot: string): string | null {\n try {\n return findWorkspaceRoot(projectRoot);\n } catch (error: any) {\n if (error.message.includes('Unexpected end of JSON input')) {\n return null;\n }\n throw error;\n }\n}\n\nexport function getEntryWithServerRoot(\n projectRoot: string,\n projectConfig: ProjectConfig,\n platform: string\n) {\n return path.relative(\n getMetroServerRoot(projectRoot),\n resolveAbsoluteEntryPoint(projectRoot, platform, projectConfig)\n );\n}\n\nexport function getMetroServerRoot(projectRoot: string) {\n if (env.EXPO_USE_METRO_WORKSPACE_ROOT) {\n return getWorkspaceRoot(projectRoot) ?? projectRoot;\n }\n\n return projectRoot;\n}\n\n/** Get the main entry module ID (file) relative to the project root. */\nexport function resolveMainModuleName(\n projectRoot: string,\n projectConfig: ProjectConfig,\n platform: string\n): string {\n const entryPoint = getEntryWithServerRoot(projectRoot, projectConfig, platform);\n\n debug(`Resolved entry point: ${entryPoint} (project root: ${projectRoot})`);\n\n return stripExtension(entryPoint, 'js');\n}\n\nexport function shouldEnableAsyncImports(projectRoot: string): boolean {\n if (env.EXPO_NO_METRO_LAZY) {\n return false;\n }\n\n // `@expo/metro-runtime` includes support for the fetch + eval runtime code required\n // to support async imports. If it's not installed, we can't support async imports.\n // If it is installed, the user MUST import it somewhere in their project.\n // Expo Router automatically pulls this in, so we can check for it.\n return resolveFrom.silent(projectRoot, '@expo/metro-runtime') != null;\n}\n\nexport function createBundleUrlPath({\n platform,\n mainModuleName,\n mode,\n minify = mode === 'production',\n environment,\n serializerOutput,\n serializerIncludeMaps,\n lazy,\n}: {\n platform: string;\n mainModuleName: string;\n mode: string;\n minify?: boolean;\n environment?: string;\n serializerOutput?: 'static';\n serializerIncludeMaps?: boolean;\n lazy?: boolean;\n}): string {\n const queryParams = new URLSearchParams({\n platform: encodeURIComponent(platform),\n dev: String(mode !== 'production'),\n // TODO: Is this still needed?\n hot: String(false),\n });\n\n if (lazy) {\n queryParams.append('lazy', String(lazy));\n }\n\n if (minify) {\n queryParams.append('minify', String(minify));\n }\n if (environment) {\n queryParams.append('resolver.environment', environment);\n queryParams.append('transform.environment', environment);\n }\n if (serializerOutput) {\n queryParams.append('serializer.output', serializerOutput);\n }\n if (serializerIncludeMaps) {\n queryParams.append('serializer.map', String(serializerIncludeMaps));\n }\n\n return `/${encodeURI(mainModuleName)}.bundle?${queryParams.toString()}`;\n}\n\n/** Info about the computer hosting the dev server. */\nexport interface HostInfo {\n host: string;\n server: 'expo';\n serverVersion: string;\n serverDriver: string | null;\n serverOS: NodeJS.Platform;\n serverOSVersion: string;\n}\n\n/** Parsed values from the supported request headers. */\nexport interface ManifestRequestInfo {\n /** Platform to serve. */\n platform: RuntimePlatform;\n /** Requested host name. */\n hostname?: string | null;\n}\n\n/** Project related info. */\nexport type ResponseProjectSettings = {\n expoGoConfig: ExpoGoConfig;\n hostUri: string;\n bundleUrl: string;\n exp: ExpoConfig;\n};\n\nexport const DEVELOPER_TOOL = 'expo-cli';\n\nexport type ManifestMiddlewareOptions = {\n /** Should start the dev servers in development mode (minify). */\n mode?: 'development' | 'production';\n /** Should instruct the bundler to create minified bundles. */\n minify?: boolean;\n constructUrl: UrlCreator['constructUrl'];\n isNativeWebpack?: boolean;\n privateKeyPath?: string;\n};\n\n/** Base middleware creator for serving the Expo manifest (like the index.html but for native runtimes). */\nexport abstract class ManifestMiddleware<\n TManifestRequestInfo extends ManifestRequestInfo,\n> extends ExpoMiddleware {\n private initialProjectConfig: ProjectConfig;\n\n constructor(\n protected projectRoot: string,\n protected options: ManifestMiddlewareOptions\n ) {\n super(\n projectRoot,\n /**\n * Only support `/`, `/manifest`, `/index.exp` for the manifest middleware.\n */\n ['/', '/manifest', '/index.exp']\n );\n this.initialProjectConfig = getConfig(projectRoot);\n }\n\n /** Exposed for testing. */\n public async _resolveProjectSettingsAsync({\n platform,\n hostname,\n }: Pick<TManifestRequestInfo, 'hostname' | 'platform'>): Promise<ResponseProjectSettings> {\n // Read the config\n const projectConfig = getConfig(this.projectRoot);\n\n // Read from headers\n const mainModuleName = this.resolveMainModuleName(projectConfig, platform);\n\n // Create the manifest and set fields within it\n const expoGoConfig = this.getExpoGoConfig({\n mainModuleName,\n hostname,\n });\n\n const hostUri = this.options.constructUrl({ scheme: '', hostname });\n\n const bundleUrl = this._getBundleUrl({\n platform,\n mainModuleName,\n hostname,\n });\n\n // Resolve all assets and set them on the manifest as URLs\n await this.mutateManifestWithAssetsAsync(projectConfig.exp, bundleUrl);\n\n return {\n expoGoConfig,\n hostUri,\n bundleUrl,\n exp: projectConfig.exp,\n };\n }\n\n /** Get the main entry module ID (file) relative to the project root. */\n private resolveMainModuleName(projectConfig: ProjectConfig, platform: string): string {\n let entryPoint = getEntryWithServerRoot(this.projectRoot, projectConfig, platform);\n\n debug(`Resolved entry point: ${entryPoint} (project root: ${this.projectRoot})`);\n\n // NOTE(Bacon): Webpack is currently hardcoded to index.bundle on native\n // in the future (TODO) we should move this logic into a Webpack plugin and use\n // a generated file name like we do on web.\n // const server = getDefaultDevServer();\n // // TODO: Move this into BundlerDevServer and read this info from self.\n // const isNativeWebpack = server instanceof WebpackBundlerDevServer && server.isTargetingNative();\n if (this.options.isNativeWebpack) {\n entryPoint = 'index.js';\n }\n\n return stripExtension(entryPoint, 'js');\n }\n\n /** Parse request headers into options. */\n public abstract getParsedHeaders(req: ServerRequest): TManifestRequestInfo;\n\n /** Store device IDs that were sent in the request headers. */\n private async saveDevicesAsync(req: ServerRequest) {\n const deviceIds = req.headers?.['expo-dev-client-id'];\n if (deviceIds) {\n await ProjectDevices.saveDevicesAsync(this.projectRoot, deviceIds).catch((e) =>\n Log.exception(e)\n );\n }\n }\n\n /** Create the bundle URL (points to the single JS entry file). Exposed for testing. */\n public _getBundleUrl({\n platform,\n mainModuleName,\n hostname,\n }: {\n platform: string;\n hostname?: string | null;\n mainModuleName: string;\n }): string {\n const path = createBundleUrlPath({\n mode: this.options.mode ?? 'development',\n minify: this.options.minify,\n platform,\n mainModuleName,\n lazy: shouldEnableAsyncImports(this.projectRoot),\n });\n\n return (\n this.options.constructUrl({\n scheme: 'http',\n // hostType: this.options.location.hostType,\n hostname,\n }) + path\n );\n }\n\n public _getBundleUrlPath({\n platform,\n mainModuleName,\n }: {\n platform: string;\n mainModuleName: string;\n }): string {\n const queryParams = new URLSearchParams({\n platform: encodeURIComponent(platform),\n dev: String(this.options.mode !== 'production'),\n // TODO: Is this still needed?\n hot: String(false),\n });\n if (shouldEnableAsyncImports(this.projectRoot)) {\n queryParams.append('lazy', String(true));\n }\n\n if (this.options.minify) {\n queryParams.append('minify', String(this.options.minify));\n }\n\n return `/${encodeURI(mainModuleName)}.bundle?${queryParams.toString()}`;\n }\n\n /** Log telemetry. */\n protected abstract trackManifest(version?: string): void;\n\n /** Get the manifest response to return to the runtime. This file contains info regarding where the assets can be loaded from. Exposed for testing. */\n public abstract _getManifestResponseAsync(options: TManifestRequestInfo): Promise<{\n body: string;\n version: string;\n headers: ServerHeaders;\n }>;\n\n private getExpoGoConfig({\n mainModuleName,\n hostname,\n }: {\n mainModuleName: string;\n hostname?: string | null;\n }): ExpoGoConfig {\n return {\n // localhost:8081\n debuggerHost: this.options.constructUrl({ scheme: '', hostname }),\n // Required for Expo Go to function.\n developer: {\n tool: DEVELOPER_TOOL,\n projectRoot: this.projectRoot,\n },\n packagerOpts: {\n // Required for dev client.\n dev: this.options.mode !== 'production',\n },\n // Indicates the name of the main bundle.\n mainModuleName,\n // Add this string to make Flipper register React Native / Metro as \"running\".\n // Can be tested by running:\n // `METRO_SERVER_PORT=8081 open -a flipper.app`\n // Where 8081 is the port where the Expo project is being hosted.\n __flipperHack: 'React Native packager is running',\n };\n }\n\n /** Resolve all assets and set them on the manifest as URLs */\n private async mutateManifestWithAssetsAsync(manifest: ExpoConfig, bundleUrl: string) {\n await resolveManifestAssets(this.projectRoot, {\n manifest,\n resolver: async (path) => {\n if (this.options.isNativeWebpack) {\n // When using our custom dev server, just do assets normally\n // without the `assets/` subpath redirect.\n return resolve(bundleUrl!.match(/^https?:\\/\\/.*?\\//)![0], path);\n }\n return bundleUrl!.match(/^https?:\\/\\/.*?\\//)![0] + 'assets/' + path;\n },\n });\n // The server normally inserts this but if we're offline we'll do it here\n await resolveGoogleServicesFile(this.projectRoot, manifest);\n }\n\n public getWebBundleUrl() {\n const platform = 'web';\n // Read from headers\n const mainModuleName = this.resolveMainModuleName(this.initialProjectConfig, platform);\n return this._getBundleUrlPath({\n platform,\n mainModuleName,\n });\n }\n\n /**\n * Web platforms should create an index.html response using the same script resolution as native.\n *\n * Instead of adding a `bundleUrl` to a `manifest.json` (native) we'll add a `<script src=\"\">`\n * to an `index.html`, this enables the web platform to load JavaScript from the server.\n */\n private async handleWebRequestAsync(req: ServerRequest, res: ServerResponse) {\n // Read from headers\n const bundleUrl = this.getWebBundleUrl();\n\n res.setHeader('Content-Type', 'text/html');\n\n res.end(\n await createTemplateHtmlFromExpoConfigAsync(this.projectRoot, {\n exp: this.initialProjectConfig.exp,\n scripts: [bundleUrl],\n })\n );\n }\n\n /** Exposed for testing. */\n async checkBrowserRequestAsync(req: ServerRequest, res: ServerResponse, next: ServerNext) {\n // Read the config\n const bundlers = getPlatformBundlers(this.initialProjectConfig.exp);\n if (bundlers.web === 'metro') {\n // NOTE(EvanBacon): This effectively disables the safety check we do on custom runtimes to ensure\n // the `expo-platform` header is included. When `web.bundler=web`, if the user has non-standard Expo\n // code loading then they'll get a web bundle without a clear assertion of platform support.\n const platform = parsePlatformHeader(req);\n // On web, serve the public folder\n if (!platform || platform === 'web') {\n if (this.initialProjectConfig.exp.web?.output === 'static') {\n // Skip the spa-styled index.html when static generation is enabled.\n next();\n return true;\n } else {\n await this.handleWebRequestAsync(req, res);\n return true;\n }\n }\n }\n return false;\n }\n\n async handleRequestAsync(\n req: ServerRequest,\n res: ServerResponse,\n next: ServerNext\n ): Promise<void> {\n // First check for standard JavaScript runtimes (aka legacy browsers like Chrome).\n if (await this.checkBrowserRequestAsync(req, res, next)) {\n return;\n }\n\n // Save device IDs for dev client.\n await this.saveDevicesAsync(req);\n\n // Read from headers\n const options = this.getParsedHeaders(req);\n const { body, version, headers } = await this._getManifestResponseAsync(options);\n for (const [headerName, headerValue] of headers) {\n res.setHeader(headerName, headerValue);\n }\n res.end(body);\n\n // Log analytics\n this.trackManifest(version ?? null);\n }\n}\n"],"names":["getWorkspaceRoot","getEntryWithServerRoot","getMetroServerRoot","resolveMainModuleName","shouldEnableAsyncImports","createBundleUrlPath","Log","ProjectDevices","debug","require","projectRoot","findWorkspaceRoot","error","message","includes","projectConfig","platform","path","relative","resolveAbsoluteEntryPoint","env","EXPO_USE_METRO_WORKSPACE_ROOT","entryPoint","stripExtension","EXPO_NO_METRO_LAZY","resolveFrom","silent","mainModuleName","mode","minify","environment","serializerOutput","serializerIncludeMaps","lazy","queryParams","URLSearchParams","encodeURIComponent","dev","String","hot","append","encodeURI","toString","DEVELOPER_TOOL","ManifestMiddleware","ExpoMiddleware","constructor","options","initialProjectConfig","getConfig","_resolveProjectSettingsAsync","hostname","expoGoConfig","getExpoGoConfig","hostUri","constructUrl","scheme","bundleUrl","_getBundleUrl","mutateManifestWithAssetsAsync","exp","isNativeWebpack","saveDevicesAsync","req","deviceIds","headers","catch","e","exception","_getBundleUrlPath","debuggerHost","developer","tool","packagerOpts","__flipperHack","manifest","resolveManifestAssets","resolver","resolve","match","resolveGoogleServicesFile","getWebBundleUrl","handleWebRequestAsync","res","setHeader","end","createTemplateHtmlFromExpoConfigAsync","scripts","checkBrowserRequestAsync","next","bundlers","getPlatformBundlers","web","parsePlatformHeader","output","handleRequestAsync","getParsedHeaders","body","version","_getManifestResponseAsync","headerName","headerValue","trackManifest"],"mappings":"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"}
|
|
@@ -3,9 +3,9 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
3
3
|
value: true
|
|
4
4
|
});
|
|
5
5
|
var _url = require("url");
|
|
6
|
-
var Log = _interopRequireWildcard(require("../../../log"));
|
|
7
6
|
var _expoMiddleware = require("./ExpoMiddleware");
|
|
8
7
|
var _resolvePlatform = require("./resolvePlatform");
|
|
8
|
+
var Log = _interopRequireWildcard(require("../../../log"));
|
|
9
9
|
function _interopRequireWildcard(obj) {
|
|
10
10
|
if (obj && obj.__esModule) {
|
|
11
11
|
return obj;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/start/server/middleware/RuntimeRedirectMiddleware.ts"],"sourcesContent":["import { parse } from 'url';\n\nimport
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/server/middleware/RuntimeRedirectMiddleware.ts"],"sourcesContent":["import { parse } from 'url';\n\nimport { disableResponseCache, ExpoMiddleware } from './ExpoMiddleware';\nimport {\n assertMissingRuntimePlatform,\n assertRuntimePlatform,\n parsePlatformHeader,\n resolvePlatformFromUserAgentHeader,\n RuntimePlatform,\n} from './resolvePlatform';\nimport { ServerRequest, ServerResponse } from './server.types';\nimport * as Log from '../../../log';\n\nconst debug = require('debug')(\n 'expo:start:server:middleware:runtimeRedirect'\n) as typeof console.log;\n\n/** Runtime to target: expo = Expo Go, custom = Dev Client. */\ntype RuntimeTarget = 'expo' | 'custom';\n\nexport type DeepLinkHandler = (props: {\n runtime: RuntimeTarget;\n platform: RuntimePlatform;\n}) => void | Promise<void>;\n\nexport class RuntimeRedirectMiddleware extends ExpoMiddleware {\n constructor(\n protected projectRoot: string,\n protected options: {\n onDeepLink: DeepLinkHandler;\n getLocation: (props: { runtime: RuntimeTarget }) => string | null | undefined;\n }\n ) {\n super(projectRoot, ['/_expo/link']);\n }\n\n async handleRequestAsync(req: ServerRequest, res: ServerResponse): Promise<void> {\n const { query } = parse(req.url!, true);\n const isDevClient = query['choice'] === 'expo-dev-client';\n const platform = parsePlatformHeader(req) ?? resolvePlatformFromUserAgentHeader(req);\n assertMissingRuntimePlatform(platform);\n assertRuntimePlatform(platform);\n const runtime = isDevClient ? 'custom' : 'expo';\n\n debug(`props:`, { platform, runtime });\n\n this.options.onDeepLink({ runtime, platform });\n\n const redirect = this.options.getLocation({ runtime });\n if (!redirect) {\n Log.warn(\n `[redirect middleware]: Unable to determine redirect location for runtime '${runtime}' and platform '${platform}'`\n );\n res.statusCode = 404;\n res.end();\n return;\n }\n debug('Redirect ->', redirect);\n res.setHeader('Location', redirect);\n\n // Disable caching\n disableResponseCache(res);\n\n // 'Temporary Redirect'\n res.statusCode = 307;\n res.end();\n }\n}\n"],"names":["Log","debug","require","RuntimeRedirectMiddleware","ExpoMiddleware","constructor","projectRoot","options","handleRequestAsync","req","res","query","parse","url","isDevClient","parsePlatformHeader","platform","resolvePlatformFromUserAgentHeader","assertMissingRuntimePlatform","assertRuntimePlatform","runtime","onDeepLink","redirect","getLocation","warn","statusCode","end","setHeader","disableResponseCache"],"mappings":"AAAA;;;;AAAsB,IAAA,IAAK,WAAL,KAAK,CAAA;AAE0B,IAAA,eAAkB,WAAlB,kBAAkB,CAAA;AAOhE,IAAA,gBAAmB,WAAnB,mBAAmB,CAAA;AAEdA,IAAAA,GAAG,mCAAM,cAAc,EAApB;;;;;;;;;;;;;;;;;;;;;;AAEf,MAAMC,KAAK,GAAGC,OAAO,CAAC,OAAO,CAAC,CAC5B,8CAA8C,CAC/C,AAAsB,AAAC;AAUjB,MAAMC,yBAAyB,SAASC,eAAc,eAAA;IAC3DC,YACYC,WAAmB,EACnBC,OAGT,CACD;QACA,KAAK,CAACD,WAAW,EAAE;YAAC,aAAa;SAAC,CAAC,CAAC;aAN1BA,WAAmB,GAAnBA,WAAmB;aACnBC,OAGT,GAHSA,OAGT;KAGF;IAED,MAAMC,kBAAkB,CAACC,GAAkB,EAAEC,GAAmB,EAAiB;QAC/E,MAAM,EAAEC,KAAK,CAAA,EAAE,GAAGC,CAAAA,GAAAA,IAAK,AAAgB,CAAA,MAAhB,CAACH,GAAG,CAACI,GAAG,EAAG,IAAI,CAAC,AAAC;QACxC,MAAMC,WAAW,GAAGH,KAAK,CAAC,QAAQ,CAAC,KAAK,iBAAiB,AAAC;YACzCI,GAAwB;QAAzC,MAAMC,QAAQ,GAAGD,CAAAA,GAAwB,GAAxBA,CAAAA,GAAAA,gBAAmB,AAAK,CAAA,oBAAL,CAACN,GAAG,CAAC,YAAxBM,GAAwB,GAAIE,CAAAA,GAAAA,gBAAkC,AAAK,CAAA,mCAAL,CAACR,GAAG,CAAC,AAAC;QACrFS,CAAAA,GAAAA,gBAA4B,AAAU,CAAA,6BAAV,CAACF,QAAQ,CAAC,CAAC;QACvCG,CAAAA,GAAAA,gBAAqB,AAAU,CAAA,sBAAV,CAACH,QAAQ,CAAC,CAAC;QAChC,MAAMI,OAAO,GAAGN,WAAW,GAAG,QAAQ,GAAG,MAAM,AAAC;QAEhDb,KAAK,CAAC,CAAC,MAAM,CAAC,EAAE;YAAEe,QAAQ;YAAEI,OAAO;SAAE,CAAC,CAAC;QAEvC,IAAI,CAACb,OAAO,CAACc,UAAU,CAAC;YAAED,OAAO;YAAEJ,QAAQ;SAAE,CAAC,CAAC;QAE/C,MAAMM,QAAQ,GAAG,IAAI,CAACf,OAAO,CAACgB,WAAW,CAAC;YAAEH,OAAO;SAAE,CAAC,AAAC;QACvD,IAAI,CAACE,QAAQ,EAAE;YACbtB,GAAG,CAACwB,IAAI,CACN,CAAC,0EAA0E,EAAEJ,OAAO,CAAC,gBAAgB,EAAEJ,QAAQ,CAAC,CAAC,CAAC,CACnH,CAAC;YACFN,GAAG,CAACe,UAAU,GAAG,GAAG,CAAC;YACrBf,GAAG,CAACgB,GAAG,EAAE,CAAC;YACV,OAAO;SACR;QACDzB,KAAK,CAAC,aAAa,EAAEqB,QAAQ,CAAC,CAAC;QAC/BZ,GAAG,CAACiB,SAAS,CAAC,UAAU,EAAEL,QAAQ,CAAC,CAAC;QAEpC,kBAAkB;QAClBM,CAAAA,GAAAA,eAAoB,AAAK,CAAA,qBAAL,CAAClB,GAAG,CAAC,CAAC;QAE1B,uBAAuB;QACvBA,GAAG,CAACe,UAAU,GAAG,GAAG,CAAC;QACrBf,GAAG,CAACgB,GAAG,EAAE,CAAC;KACX;CACF;QA1CYvB,yBAAyB,GAAzBA,yBAAyB"}
|
|
@@ -5,8 +5,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
var _path = _interopRequireDefault(require("path"));
|
|
6
6
|
var _send = _interopRequireDefault(require("send"));
|
|
7
7
|
var _url = require("url");
|
|
8
|
-
var _env = require("../../../utils/env");
|
|
9
8
|
var _resolvePlatform = require("./resolvePlatform");
|
|
9
|
+
var _env = require("../../../utils/env");
|
|
10
10
|
function _interopRequireDefault(obj) {
|
|
11
11
|
return obj && obj.__esModule ? obj : {
|
|
12
12
|
default: obj
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/start/server/middleware/ServeStaticMiddleware.ts"],"sourcesContent":["import path from 'path';\nimport send from 'send';\nimport { parse } from 'url';\n\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/server/middleware/ServeStaticMiddleware.ts"],"sourcesContent":["import path from 'path';\nimport send from 'send';\nimport { parse } from 'url';\n\nimport { parsePlatformHeader } from './resolvePlatform';\nimport { ServerRequest, ServerResponse } from './server.types';\nimport { env } from '../../../utils/env';\n\nconst debug = require('debug')('expo:start:server:middleware:serveStatic') as typeof console.log;\n\n/**\n * Adds support for serving the files in the static `public/` folder to web apps.\n */\nexport class ServeStaticMiddleware {\n constructor(private projectRoot: string) {}\n getHandler() {\n const publicPath = path.join(this.projectRoot, env.EXPO_PUBLIC_FOLDER);\n\n debug(`Serving static files from:`, publicPath);\n const opts = {\n root: publicPath,\n };\n return (req: ServerRequest, res: ServerResponse, next: any) => {\n if (!req?.url || (req.method !== 'GET' && req.method !== 'HEAD')) {\n return next();\n }\n\n const platform = parsePlatformHeader(req);\n // Currently this is web-only\n if (platform && platform !== 'web') {\n return next();\n }\n\n const pathname = parse(req.url).pathname;\n if (!pathname) {\n return next();\n }\n\n debug(`Maybe serve static:`, pathname);\n const stream = send(req, pathname, opts);\n\n // add file listener for fallthrough\n let forwardError = false;\n stream.on('file', function onFile() {\n // once file is determined, always forward error\n forwardError = true;\n });\n\n // forward errors\n stream.on('error', function error(err: any) {\n if (forwardError || !(err.statusCode < 500)) {\n next(err);\n return;\n }\n\n next();\n });\n\n // pipe\n stream.pipe(res);\n };\n }\n}\n"],"names":["debug","require","ServeStaticMiddleware","constructor","projectRoot","getHandler","publicPath","path","join","env","EXPO_PUBLIC_FOLDER","opts","root","req","res","next","url","method","platform","parsePlatformHeader","pathname","parse","stream","send","forwardError","on","onFile","error","err","statusCode","pipe"],"mappings":"AAAA;;;;AAAiB,IAAA,KAAM,kCAAN,MAAM,EAAA;AACN,IAAA,KAAM,kCAAN,MAAM,EAAA;AACD,IAAA,IAAK,WAAL,KAAK,CAAA;AAES,IAAA,gBAAmB,WAAnB,mBAAmB,CAAA;AAEnC,IAAA,IAAoB,WAApB,oBAAoB,CAAA;;;;;;AAExC,MAAMA,KAAK,GAAGC,OAAO,CAAC,OAAO,CAAC,CAAC,0CAA0C,CAAC,AAAsB,AAAC;AAK1F,MAAMC,qBAAqB;IAChCC,YAAoBC,WAAmB,CAAE;aAArBA,WAAmB,GAAnBA,WAAmB;KAAI;IAC3CC,UAAU,GAAG;QACX,MAAMC,UAAU,GAAGC,KAAI,QAAA,CAACC,IAAI,CAAC,IAAI,CAACJ,WAAW,EAAEK,IAAG,IAAA,CAACC,kBAAkB,CAAC,AAAC;QAEvEV,KAAK,CAAC,CAAC,0BAA0B,CAAC,EAAEM,UAAU,CAAC,CAAC;QAChD,MAAMK,IAAI,GAAG;YACXC,IAAI,EAAEN,UAAU;SACjB,AAAC;QACF,OAAO,CAACO,GAAkB,EAAEC,GAAmB,EAAEC,IAAS,GAAK;YAC7D,IAAI,CAACF,CAAAA,GAAG,QAAK,GAARA,KAAAA,CAAQ,GAARA,GAAG,CAAEG,GAAG,CAAA,IAAKH,GAAG,CAACI,MAAM,KAAK,KAAK,IAAIJ,GAAG,CAACI,MAAM,KAAK,MAAM,AAAC,EAAE;gBAChE,OAAOF,IAAI,EAAE,CAAC;aACf;YAED,MAAMG,QAAQ,GAAGC,CAAAA,GAAAA,gBAAmB,AAAK,CAAA,oBAAL,CAACN,GAAG,CAAC,AAAC;YAC1C,6BAA6B;YAC7B,IAAIK,QAAQ,IAAIA,QAAQ,KAAK,KAAK,EAAE;gBAClC,OAAOH,IAAI,EAAE,CAAC;aACf;YAED,MAAMK,QAAQ,GAAGC,CAAAA,GAAAA,IAAK,AAAS,CAAA,MAAT,CAACR,GAAG,CAACG,GAAG,CAAC,CAACI,QAAQ,AAAC;YACzC,IAAI,CAACA,QAAQ,EAAE;gBACb,OAAOL,IAAI,EAAE,CAAC;aACf;YAEDf,KAAK,CAAC,CAAC,mBAAmB,CAAC,EAAEoB,QAAQ,CAAC,CAAC;YACvC,MAAME,MAAM,GAAGC,CAAAA,GAAAA,KAAI,AAAqB,CAAA,QAArB,CAACV,GAAG,EAAEO,QAAQ,EAAET,IAAI,CAAC,AAAC;YAEzC,oCAAoC;YACpC,IAAIa,YAAY,GAAG,KAAK,AAAC;YACzBF,MAAM,CAACG,EAAE,CAAC,MAAM,EAAE,SAASC,MAAM,GAAG;gBAClC,gDAAgD;gBAChDF,YAAY,GAAG,IAAI,CAAC;aACrB,CAAC,CAAC;YAEH,iBAAiB;YACjBF,MAAM,CAACG,EAAE,CAAC,OAAO,EAAE,SAASE,KAAK,CAACC,GAAQ,EAAE;gBAC1C,IAAIJ,YAAY,IAAI,CAAC,CAACI,GAAG,CAACC,UAAU,GAAG,GAAG,CAAC,EAAE;oBAC3Cd,IAAI,CAACa,GAAG,CAAC,CAAC;oBACV,OAAO;iBACR;gBAEDb,IAAI,EAAE,CAAC;aACR,CAAC,CAAC;YAEH,OAAO;YACPO,MAAM,CAACQ,IAAI,CAAChB,GAAG,CAAC,CAAC;SAClB,CAAC;KACH;CACF;QAjDYZ,qBAAqB,GAArBA,qBAAqB"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
exports.openJsInspector = openJsInspector;
|
|
6
|
+
exports.closeJsInspector = closeJsInspector;
|
|
7
|
+
exports.queryInspectorAppAsync = queryInspectorAppAsync;
|
|
8
|
+
exports.queryAllInspectorAppsAsync = queryAllInspectorAppsAsync;
|
|
9
|
+
var _nodeFetch = _interopRequireDefault(require("node-fetch"));
|
|
10
|
+
var _launchBrowser = require("./LaunchBrowser");
|
|
11
|
+
function _interopRequireDefault(obj) {
|
|
12
|
+
return obj && obj.__esModule ? obj : {
|
|
13
|
+
default: obj
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
let openingBrowserInstance = null;
|
|
17
|
+
async function openJsInspector(app) {
|
|
18
|
+
// To update devtoolsFrontendRev, find the full commit hash in the url:
|
|
19
|
+
// https://chromium.googlesource.com/chromium/src.git/+log/refs/tags/{CHROME_VERSION}/chrome/VERSION
|
|
20
|
+
//
|
|
21
|
+
// 1. Replace {CHROME_VERSION} with the target chrome version
|
|
22
|
+
// 2. Click the first log item in the webpage
|
|
23
|
+
// 3. The full commit hash is the desired revision
|
|
24
|
+
const devtoolsFrontendRev = "d9568d04d7dd79269c5a655d7ada69650c5a8336"; // Chrome 100.0.4896.75
|
|
25
|
+
const urlBase = `https://chrome-devtools-frontend.appspot.com/serve_rev/@${devtoolsFrontendRev}/devtools_app.html`;
|
|
26
|
+
const ws = app.webSocketDebuggerUrl.replace(/^ws:\/\//, "");
|
|
27
|
+
const url = `${urlBase}?panel=console&ws=${encodeURIComponent(ws)}`;
|
|
28
|
+
await closeJsInspector();
|
|
29
|
+
openingBrowserInstance = await (0, _launchBrowser).launchBrowserAsync(url);
|
|
30
|
+
}
|
|
31
|
+
async function closeJsInspector() {
|
|
32
|
+
await (openingBrowserInstance == null ? void 0 : openingBrowserInstance.close());
|
|
33
|
+
openingBrowserInstance = null;
|
|
34
|
+
}
|
|
35
|
+
async function queryInspectorAppAsync(metroServerOrigin, appId) {
|
|
36
|
+
const apps = await queryAllInspectorAppsAsync(metroServerOrigin);
|
|
37
|
+
var ref;
|
|
38
|
+
return (ref = apps.find((app)=>app.description === appId
|
|
39
|
+
)) != null ? ref : null;
|
|
40
|
+
}
|
|
41
|
+
async function queryAllInspectorAppsAsync(metroServerOrigin) {
|
|
42
|
+
const resp = await (0, _nodeFetch).default(`${metroServerOrigin}/json/list`);
|
|
43
|
+
const apps = transformApps(await resp.json());
|
|
44
|
+
// Only use targets with better reloading support
|
|
45
|
+
return apps.filter((app)=>app.title === "React Native Experimental (Improved Chrome Reloads)"
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
// The description of `React Native Experimental (Improved Chrome Reloads)` target is `don't use` from metro.
|
|
49
|
+
// This function tries to transform the unmeaningful description to appId
|
|
50
|
+
function transformApps(apps) {
|
|
51
|
+
const deviceIdToAppId = {};
|
|
52
|
+
for (const app1 of apps){
|
|
53
|
+
if (app1.description !== "don't use") {
|
|
54
|
+
const deviceId = app1.id.split("-")[0];
|
|
55
|
+
const appId = app1.description;
|
|
56
|
+
deviceIdToAppId[deviceId] = appId;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return apps.map((app)=>{
|
|
60
|
+
if (app.description === "don't use") {
|
|
61
|
+
const deviceId = app.id.split("-")[0];
|
|
62
|
+
var _deviceId;
|
|
63
|
+
app.description = (_deviceId = deviceIdToAppId[deviceId]) != null ? _deviceId : app.description;
|
|
64
|
+
}
|
|
65
|
+
return app;
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
//# sourceMappingURL=JsInspector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/start/server/middleware/inspector/JsInspector.ts"],"sourcesContent":["import fetch from 'node-fetch';\n\nimport { launchBrowserAsync, type LaunchBrowserInstance } from './LaunchBrowser';\n\nexport interface MetroInspectorProxyApp {\n description: string;\n devtoolsFrontendUrl: string;\n faviconUrl: string;\n id: string;\n title: string;\n type: 'node';\n vm: 'Hermes' | \"don't use\";\n webSocketDebuggerUrl: string;\n}\n\nlet openingBrowserInstance: LaunchBrowserInstance | null = null;\n\nexport async function openJsInspector(app: MetroInspectorProxyApp) {\n // To update devtoolsFrontendRev, find the full commit hash in the url:\n // https://chromium.googlesource.com/chromium/src.git/+log/refs/tags/{CHROME_VERSION}/chrome/VERSION\n //\n // 1. Replace {CHROME_VERSION} with the target chrome version\n // 2. Click the first log item in the webpage\n // 3. The full commit hash is the desired revision\n const devtoolsFrontendRev = 'd9568d04d7dd79269c5a655d7ada69650c5a8336'; // Chrome 100.0.4896.75\n\n const urlBase = `https://chrome-devtools-frontend.appspot.com/serve_rev/@${devtoolsFrontendRev}/devtools_app.html`;\n const ws = app.webSocketDebuggerUrl.replace(/^ws:\\/\\//, '');\n const url = `${urlBase}?panel=console&ws=${encodeURIComponent(ws)}`;\n await closeJsInspector();\n openingBrowserInstance = await launchBrowserAsync(url);\n}\n\nexport async function closeJsInspector() {\n await openingBrowserInstance?.close();\n openingBrowserInstance = null;\n}\n\nexport async function queryInspectorAppAsync(\n metroServerOrigin: string,\n appId: string\n): Promise<MetroInspectorProxyApp | null> {\n const apps = await queryAllInspectorAppsAsync(metroServerOrigin);\n return apps.find((app) => app.description === appId) ?? null;\n}\n\nexport async function queryAllInspectorAppsAsync(\n metroServerOrigin: string\n): Promise<MetroInspectorProxyApp[]> {\n const resp = await fetch(`${metroServerOrigin}/json/list`);\n const apps: MetroInspectorProxyApp[] = transformApps(await resp.json());\n // Only use targets with better reloading support\n return apps.filter((app) => app.title === 'React Native Experimental (Improved Chrome Reloads)');\n}\n\n// The description of `React Native Experimental (Improved Chrome Reloads)` target is `don't use` from metro.\n// This function tries to transform the unmeaningful description to appId\nfunction transformApps(apps: MetroInspectorProxyApp[]): MetroInspectorProxyApp[] {\n const deviceIdToAppId: Record<string, string> = {};\n\n for (const app of apps) {\n if (app.description !== \"don't use\") {\n const deviceId = app.id.split('-')[0];\n const appId = app.description;\n deviceIdToAppId[deviceId] = appId;\n }\n }\n\n return apps.map((app) => {\n if (app.description === \"don't use\") {\n const deviceId = app.id.split('-')[0];\n app.description = deviceIdToAppId[deviceId] ?? app.description;\n }\n return app;\n });\n}\n"],"names":["openJsInspector","closeJsInspector","queryInspectorAppAsync","queryAllInspectorAppsAsync","openingBrowserInstance","app","devtoolsFrontendRev","urlBase","ws","webSocketDebuggerUrl","replace","url","encodeURIComponent","launchBrowserAsync","close","metroServerOrigin","appId","apps","find","description","resp","fetch","transformApps","json","filter","title","deviceIdToAppId","deviceId","id","split","map"],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
exports.launchBrowserAsync = launchBrowserAsync;
|
|
6
|
+
var _os = _interopRequireDefault(require("os"));
|
|
7
|
+
var _launchBrowserTypes = require("./LaunchBrowser.types");
|
|
8
|
+
var _launchBrowserImplLinux = _interopRequireDefault(require("./LaunchBrowserImplLinux"));
|
|
9
|
+
var _launchBrowserImplMacOS = _interopRequireDefault(require("./LaunchBrowserImplMacOS"));
|
|
10
|
+
var _launchBrowserImplWindows = _interopRequireDefault(require("./LaunchBrowserImplWindows"));
|
|
11
|
+
function _interopRequireDefault(obj) {
|
|
12
|
+
return obj && obj.__esModule ? obj : {
|
|
13
|
+
default: obj
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
const IS_WSL = require("is-wsl") && !require("is-docker")();
|
|
17
|
+
async function launchBrowserAsync(url) {
|
|
18
|
+
const browser = createBrowser();
|
|
19
|
+
const tempBrowserDir = await browser.createTempBrowserDir("expo-inspector");
|
|
20
|
+
// For dev-client connecting metro in LAN, the request to fetch sourcemaps may be blocked by Chromium
|
|
21
|
+
// with insecure-content (https page send xhr for http resource).
|
|
22
|
+
// Adding `--allow-running-insecure-content` to overcome this limitation
|
|
23
|
+
// without users manually allow insecure-content in site settings.
|
|
24
|
+
// However, if there is existing chromium browser process, the argument will not take effect.
|
|
25
|
+
// We also pass a `--user-data-dir=` as temporary profile and force chromium to create new browser process.
|
|
26
|
+
const launchArgs = [
|
|
27
|
+
`--app=${url}`,
|
|
28
|
+
"--allow-running-insecure-content",
|
|
29
|
+
`--user-data-dir=${tempBrowserDir}`,
|
|
30
|
+
"--no-first-run",
|
|
31
|
+
"--no-default-browser-check",
|
|
32
|
+
];
|
|
33
|
+
for (const browserType of [
|
|
34
|
+
_launchBrowserTypes.LaunchBrowserTypes.CHROME,
|
|
35
|
+
_launchBrowserTypes.LaunchBrowserTypes.EDGE
|
|
36
|
+
]){
|
|
37
|
+
const isSupported = await browser.isSupportedBrowser(browserType);
|
|
38
|
+
if (isSupported) {
|
|
39
|
+
return browser.launchAsync(browserType, launchArgs);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
throw new Error("[LaunchBrowser] Unable to find a browser on the host to open the inspector. Supported browsers: Google Chrome, Microsoft Edge");
|
|
43
|
+
}
|
|
44
|
+
function createBrowser() {
|
|
45
|
+
if (_os.default.platform() === "darwin") {
|
|
46
|
+
return new _launchBrowserImplMacOS.default();
|
|
47
|
+
}
|
|
48
|
+
if (_os.default.platform() === "win32" || IS_WSL) {
|
|
49
|
+
return new _launchBrowserImplWindows.default();
|
|
50
|
+
}
|
|
51
|
+
if (_os.default.platform() === "linux") {
|
|
52
|
+
return new _launchBrowserImplLinux.default();
|
|
53
|
+
}
|
|
54
|
+
throw new Error("[LaunchBrowser] Unsupported host platform");
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
//# sourceMappingURL=LaunchBrowser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/start/server/middleware/inspector/LaunchBrowser.ts"],"sourcesContent":["import os from 'os';\n\nimport { LaunchBrowserTypes, type LaunchBrowserInstance } from './LaunchBrowser.types';\nimport LaunchBrowserImplLinux from './LaunchBrowserImplLinux';\nimport LaunchBrowserImplMacOS from './LaunchBrowserImplMacOS';\nimport LaunchBrowserImplWindows from './LaunchBrowserImplWindows';\n\nexport type { LaunchBrowserInstance };\n\nconst IS_WSL = require('is-wsl') && !require('is-docker')();\n\n/**\n * Launch a browser for JavaScript inspector\n */\nexport async function launchBrowserAsync(url: string): Promise<LaunchBrowserInstance> {\n const browser = createBrowser();\n const tempBrowserDir = await browser.createTempBrowserDir('expo-inspector');\n\n // For dev-client connecting metro in LAN, the request to fetch sourcemaps may be blocked by Chromium\n // with insecure-content (https page send xhr for http resource).\n // Adding `--allow-running-insecure-content` to overcome this limitation\n // without users manually allow insecure-content in site settings.\n // However, if there is existing chromium browser process, the argument will not take effect.\n // We also pass a `--user-data-dir=` as temporary profile and force chromium to create new browser process.\n const launchArgs = [\n `--app=${url}`,\n '--allow-running-insecure-content',\n `--user-data-dir=${tempBrowserDir}`,\n '--no-first-run',\n '--no-default-browser-check',\n ];\n\n for (const browserType of [LaunchBrowserTypes.CHROME, LaunchBrowserTypes.EDGE]) {\n const isSupported = await browser.isSupportedBrowser(browserType);\n if (isSupported) {\n return browser.launchAsync(browserType, launchArgs);\n }\n }\n\n throw new Error(\n '[LaunchBrowser] Unable to find a browser on the host to open the inspector. Supported browsers: Google Chrome, Microsoft Edge'\n );\n}\n\nfunction createBrowser() {\n if (os.platform() === 'darwin') {\n return new LaunchBrowserImplMacOS();\n }\n if (os.platform() === 'win32' || IS_WSL) {\n return new LaunchBrowserImplWindows();\n }\n if (os.platform() === 'linux') {\n return new LaunchBrowserImplLinux();\n }\n throw new Error('[LaunchBrowser] Unsupported host platform');\n}\n"],"names":["launchBrowserAsync","IS_WSL","require","url","browser","createBrowser","tempBrowserDir","createTempBrowserDir","launchArgs","browserType","LaunchBrowserTypes","CHROME","EDGE","isSupported","isSupportedBrowser","launchAsync","Error","os","platform","LaunchBrowserImplMacOS","LaunchBrowserImplWindows","LaunchBrowserImplLinux"],"mappings":"AAAA;;;;QAcsBA,kBAAkB,GAAlBA,kBAAkB;AAdzB,IAAA,GAAI,kCAAJ,IAAI,EAAA;AAE4C,IAAA,mBAAuB,WAAvB,uBAAuB,CAAA;AACnD,IAAA,uBAA0B,kCAA1B,0BAA0B,EAAA;AAC1B,IAAA,uBAA0B,kCAA1B,0BAA0B,EAAA;AACxB,IAAA,yBAA4B,kCAA5B,4BAA4B,EAAA;;;;;;AAIjE,MAAMC,MAAM,GAAGC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAACA,OAAO,CAAC,WAAW,CAAC,EAAE,AAAC;AAKrD,eAAeF,kBAAkB,CAACG,GAAW,EAAkC;IACpF,MAAMC,OAAO,GAAGC,aAAa,EAAE,AAAC;IAChC,MAAMC,cAAc,GAAG,MAAMF,OAAO,CAACG,oBAAoB,CAAC,gBAAgB,CAAC,AAAC;IAE5E,qGAAqG;IACrG,iEAAiE;IACjE,wEAAwE;IACxE,kEAAkE;IAClE,6FAA6F;IAC7F,2GAA2G;IAC3G,MAAMC,UAAU,GAAG;QACjB,CAAC,MAAM,EAAEL,GAAG,CAAC,CAAC;QACd,kCAAkC;QAClC,CAAC,gBAAgB,EAAEG,cAAc,CAAC,CAAC;QACnC,gBAAgB;QAChB,4BAA4B;KAC7B,AAAC;IAEF,KAAK,MAAMG,WAAW,IAAI;QAACC,mBAAkB,mBAAA,CAACC,MAAM;QAAED,mBAAkB,mBAAA,CAACE,IAAI;KAAC,CAAE;QAC9E,MAAMC,WAAW,GAAG,MAAMT,OAAO,CAACU,kBAAkB,CAACL,WAAW,CAAC,AAAC;QAClE,IAAII,WAAW,EAAE;YACf,OAAOT,OAAO,CAACW,WAAW,CAACN,WAAW,EAAED,UAAU,CAAC,CAAC;SACrD;KACF;IAED,MAAM,IAAIQ,KAAK,CACb,+HAA+H,CAChI,CAAC;CACH;AAED,SAASX,aAAa,GAAG;IACvB,IAAIY,GAAE,QAAA,CAACC,QAAQ,EAAE,KAAK,QAAQ,EAAE;QAC9B,OAAO,IAAIC,uBAAsB,QAAA,EAAE,CAAC;KACrC;IACD,IAAIF,GAAE,QAAA,CAACC,QAAQ,EAAE,KAAK,OAAO,IAAIjB,MAAM,EAAE;QACvC,OAAO,IAAImB,yBAAwB,QAAA,EAAE,CAAC;KACvC;IACD,IAAIH,GAAE,QAAA,CAACC,QAAQ,EAAE,KAAK,OAAO,EAAE;QAC7B,OAAO,IAAIG,uBAAsB,QAAA,EAAE,CAAC;KACrC;IACD,MAAM,IAAIL,KAAK,CAAC,2CAA2C,CAAC,CAAC;CAC9D"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
exports.LaunchBrowserTypes = void 0;
|
|
6
|
+
var LaunchBrowserTypes;
|
|
7
|
+
exports.LaunchBrowserTypes = LaunchBrowserTypes;
|
|
8
|
+
(function(LaunchBrowserTypes) {
|
|
9
|
+
LaunchBrowserTypes[LaunchBrowserTypes["CHROME"] = 0] = "CHROME";
|
|
10
|
+
LaunchBrowserTypes[LaunchBrowserTypes["EDGE"] = 1] = "EDGE";
|
|
11
|
+
})(LaunchBrowserTypes || (exports.LaunchBrowserTypes = LaunchBrowserTypes = {}));
|
|
12
|
+
|
|
13
|
+
//# sourceMappingURL=LaunchBrowser.types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/start/server/middleware/inspector/LaunchBrowser.types.ts"],"sourcesContent":["export interface LaunchBrowserInstance {\n close: () => Promise<void>;\n}\n\n/**\n * Supported browser types\n */\nexport enum LaunchBrowserTypes {\n CHROME,\n EDGE,\n}\n\n/**\n * Internal browser implementation constraints\n */\nexport interface LaunchBrowserImpl {\n /**\n * Return whether the given `browserType` is supported\n */\n isSupportedBrowser: (browserType: LaunchBrowserTypes) => Promise<boolean>;\n\n /**\n * Create temp directory for browser profile\n *\n * @param baseDirName The base directory name for the created directory\n */\n createTempBrowserDir: (baseDirName: string) => Promise<string>;\n\n /**\n * Launch the browser\n */\n launchAsync: (browserType: LaunchBrowserTypes, args: string[]) => Promise<LaunchBrowserInstance>;\n\n /**\n * Close current browser instance\n */\n close: () => Promise<void>;\n}\n"],"names":["LaunchBrowserTypes","CHROME","EDGE"],"mappings":"AAAA;;;;;IAOO,kBAGN;;UAHWA,kBAAkB;IAAlBA,kBAAkB,CAAlBA,kBAAkB,CAC5BC,QAAM,IAANA,CAAM,IAANA,QAAM;IADID,kBAAkB,CAAlBA,kBAAkB,CAE5BE,MAAI,IAAJA,CAAI,IAAJA,MAAI;GAFMF,kBAAkB,kCAAlBA,kBAAkB"}
|