@expo/cli 0.16.8 → 0.17.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 +4 -3
- package/build/bin/cli.map +1 -1
- package/build/src/customize/customizeAsync.js +2 -1
- package/build/src/customize/customizeAsync.js.map +1 -1
- package/build/src/customize/typescript.js +1 -1
- package/build/src/customize/typescript.js.map +1 -1
- package/build/src/export/resolveOptions.js +7 -5
- package/build/src/export/resolveOptions.js.map +1 -1
- package/build/src/export/web/exportWebAsync.js +1 -1
- package/build/src/export/web/exportWebAsync.js.map +1 -1
- package/build/src/export/web/index.js +1 -1
- package/build/src/export/web/index.js.map +1 -1
- package/build/src/install/installAsync.js +1 -5
- package/build/src/install/installAsync.js.map +1 -1
- package/build/src/prebuild/configureProjectAsync.js +7 -1
- package/build/src/prebuild/configureProjectAsync.js.map +1 -1
- package/build/src/prebuild/prebuildAsync.js +3 -2
- package/build/src/prebuild/prebuildAsync.js.map +1 -1
- package/build/src/prebuild/resolveTemplate.js +41 -48
- package/build/src/prebuild/resolveTemplate.js.map +1 -1
- package/build/src/prebuild/updateFromTemplate.js +9 -8
- package/build/src/prebuild/updateFromTemplate.js.map +1 -1
- package/build/src/start/doctor/dependencies/ensureDependenciesAsync.js +4 -12
- package/build/src/start/doctor/dependencies/ensureDependenciesAsync.js.map +1 -1
- package/build/src/start/doctor/web/WebSupportProjectPrerequisite.js +6 -1
- package/build/src/start/doctor/web/WebSupportProjectPrerequisite.js.map +1 -1
- package/build/src/start/server/DevServerManager.js +2 -2
- package/build/src/start/server/DevServerManager.js.map +1 -1
- package/build/src/start/server/metro/createServerRouteMiddleware.js +12 -7
- package/build/src/start/server/metro/createServerRouteMiddleware.js.map +1 -1
- package/build/src/start/server/metro/instantiateMetro.js +5 -7
- package/build/src/start/server/metro/instantiateMetro.js.map +1 -1
- package/build/src/start/server/metro/withMetroMultiPlatform.js +7 -4
- package/build/src/start/server/metro/withMetroMultiPlatform.js.map +1 -1
- package/build/src/start/server/middleware/CorsMiddleware.js +55 -0
- package/build/src/start/server/middleware/CorsMiddleware.js.map +1 -0
- package/build/src/start/server/middleware/ManifestMiddleware.js +5 -5
- package/build/src/start/server/middleware/ManifestMiddleware.js.map +1 -1
- package/build/src/start/server/platformBundlers.js +18 -5
- package/build/src/start/server/platformBundlers.js.map +1 -1
- package/build/src/start/startAsync.js +1 -1
- package/build/src/start/startAsync.js.map +1 -1
- package/build/src/utils/analytics/rudderstackClient.js +2 -2
- package/build/src/utils/npm.js +12 -4
- package/build/src/utils/npm.js.map +1 -1
- package/build/src/utils/resolveArgs.js +8 -2
- package/build/src/utils/resolveArgs.js.map +1 -1
- package/package.json +3 -3
- package/build/src/start/server/middleware/remoteDevtoolsCorsMiddleware.js +0 -31
- package/build/src/start/server/middleware/remoteDevtoolsCorsMiddleware.js.map +0 -1
- package/build/src/start/server/middleware/remoteDevtoolsSecurityHeadersMiddleware.js +0 -17
- package/build/src/start/server/middleware/remoteDevtoolsSecurityHeadersMiddleware.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/start/server/middleware/ManifestMiddleware.ts"],"sourcesContent":["import {\n ExpoConfig,\n ExpoGoConfig,\n getConfig,\n PackageJSONConfig,\n ProjectConfig,\n} from '@expo/config';\nimport { resolveEntryPoint } from '@expo/config/paths';\nimport findWorkspaceRoot from 'find-yarn-workspace-root';\nimport path from 'path';\nimport { resolve } from 'url';\n\nimport { ExpoMiddleware } from './ExpoMiddleware';\nimport {\n shouldEnableAsyncImports,\n createBundleUrlPath,\n getBaseUrlFromExpoConfig,\n getAsyncRoutesFromExpoConfig,\n createBundleUrlPathFromExpoConfig,\n} from './metroOptions';\nimport { resolveGoogleServicesFile, resolveManifestAssets } from './resolveAssets';\nimport { parsePlatformHeader, RuntimePlatform } from './resolvePlatform';\nimport { ServerHeaders, ServerNext, ServerRequest, ServerResponse } from './server.types';\nimport { isEnableHermesManaged } from '../../../export/exportHermes';\nimport * as Log from '../../../log';\nimport { env } from '../../../utils/env';\nimport { CommandError } from '../../../utils/errors';\nimport { stripExtension } from '../../../utils/url';\nimport * as ProjectDevices from '../../project/devices';\nimport { UrlCreator } from '../UrlCreator';\nimport { getRouterDirectoryModuleIdWithManifest } from '../metro/router';\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\nconst supportedPlatforms = ['ios', 'android', 'web', 'none'];\n\nexport function getEntryWithServerRoot(\n projectRoot: string,\n props: { platform: string; pkg?: PackageJSONConfig }\n) {\n if (!supportedPlatforms.includes(props.platform)) {\n throw new CommandError(\n `Failed to resolve the project's entry file: The platform \"${props.platform}\" is not supported.`\n );\n }\n return path.relative(getMetroServerRoot(projectRoot), resolveEntryPoint(projectRoot, props));\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 props: { platform: string; pkg?: PackageJSONConfig }\n): string {\n const entryPoint = getEntryWithServerRoot(projectRoot, props);\n\n debug(`Resolved entry point: ${entryPoint} (project root: ${projectRoot})`);\n\n return stripExtension(entryPoint, 'js');\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({\n pkg: projectConfig.pkg,\n platform,\n });\n\n const isHermesEnabled = isEnableHermesManaged(projectConfig.exp, 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 engine: isHermesEnabled ? 'hermes' : undefined,\n baseUrl: getBaseUrlFromExpoConfig(projectConfig.exp),\n asyncRoutes: getAsyncRoutesFromExpoConfig(\n projectConfig.exp,\n this.options.mode ?? 'development',\n platform\n ),\n routerRoot: getRouterDirectoryModuleIdWithManifest(this.projectRoot, projectConfig.exp),\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(props: { pkg: PackageJSONConfig; platform: string }): string {\n let entryPoint = getEntryWithServerRoot(this.projectRoot, props);\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 engine,\n baseUrl,\n isExporting,\n asyncRoutes,\n routerRoot,\n }: {\n platform: string;\n hostname?: string | null;\n mainModuleName: string;\n engine?: 'hermes';\n baseUrl?: string;\n asyncRoutes: boolean;\n isExporting?: boolean;\n routerRoot: 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 engine,\n baseUrl,\n isExporting: !!isExporting,\n asyncRoutes,\n routerRoot,\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 /** 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({\n pkg: this.initialProjectConfig.pkg,\n platform,\n });\n\n return createBundleUrlPathFromExpoConfig(this.projectRoot, this.initialProjectConfig.exp, {\n platform,\n mainModuleName,\n minify: this.options.minify,\n lazy: shouldEnableAsyncImports(this.projectRoot),\n mode: this.options.mode ?? 'development',\n // Hermes doesn't support more modern JS features than most, if not all, modern browser.\n engine: 'hermes',\n isExporting: false,\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 (['static', 'server'].includes(this.initialProjectConfig.exp.web?.output ?? '')) {\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","Log","ProjectDevices","debug","require","projectRoot","findWorkspaceRoot","error","message","includes","supportedPlatforms","props","platform","CommandError","path","relative","resolveEntryPoint","env","EXPO_USE_METRO_WORKSPACE_ROOT","entryPoint","stripExtension","DEVELOPER_TOOL","ManifestMiddleware","ExpoMiddleware","constructor","options","initialProjectConfig","getConfig","_resolveProjectSettingsAsync","hostname","projectConfig","mainModuleName","pkg","isHermesEnabled","isEnableHermesManaged","exp","expoGoConfig","getExpoGoConfig","hostUri","constructUrl","scheme","bundleUrl","_getBundleUrl","engine","undefined","baseUrl","getBaseUrlFromExpoConfig","asyncRoutes","getAsyncRoutesFromExpoConfig","mode","routerRoot","getRouterDirectoryModuleIdWithManifest","mutateManifestWithAssetsAsync","isNativeWebpack","saveDevicesAsync","req","deviceIds","headers","catch","e","exception","isExporting","createBundleUrlPath","minify","lazy","shouldEnableAsyncImports","debuggerHost","developer","tool","packagerOpts","dev","__flipperHack","manifest","resolveManifestAssets","resolver","resolve","match","resolveGoogleServicesFile","getWebBundleUrl","createBundleUrlPathFromExpoConfig","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 {\n ExpoConfig,\n ExpoGoConfig,\n getConfig,\n PackageJSONConfig,\n ProjectConfig,\n} from '@expo/config';\nimport { resolveEntryPoint } from '@expo/config/paths';\nimport findWorkspaceRoot from 'find-yarn-workspace-root';\nimport path from 'path';\nimport { resolve } from 'url';\n\nimport { ExpoMiddleware } from './ExpoMiddleware';\nimport {\n shouldEnableAsyncImports,\n createBundleUrlPath,\n getBaseUrlFromExpoConfig,\n getAsyncRoutesFromExpoConfig,\n createBundleUrlPathFromExpoConfig,\n} from './metroOptions';\nimport { resolveGoogleServicesFile, resolveManifestAssets } from './resolveAssets';\nimport { parsePlatformHeader, RuntimePlatform } from './resolvePlatform';\nimport { ServerHeaders, ServerNext, ServerRequest, ServerResponse } from './server.types';\nimport { isEnableHermesManaged } from '../../../export/exportHermes';\nimport * as Log from '../../../log';\nimport { env } from '../../../utils/env';\nimport { CommandError } from '../../../utils/errors';\nimport { stripExtension } from '../../../utils/url';\nimport * as ProjectDevices from '../../project/devices';\nimport { UrlCreator } from '../UrlCreator';\nimport { getRouterDirectoryModuleIdWithManifest } from '../metro/router';\nimport { getPlatformBundlers, PlatformBundlers } 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\nconst supportedPlatforms = ['ios', 'android', 'web', 'none'];\n\nexport function getEntryWithServerRoot(\n projectRoot: string,\n props: { platform: string; pkg?: PackageJSONConfig }\n) {\n if (!supportedPlatforms.includes(props.platform)) {\n throw new CommandError(\n `Failed to resolve the project's entry file: The platform \"${props.platform}\" is not supported.`\n );\n }\n return path.relative(getMetroServerRoot(projectRoot), resolveEntryPoint(projectRoot, props));\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 props: { platform: string; pkg?: PackageJSONConfig }\n): string {\n const entryPoint = getEntryWithServerRoot(projectRoot, props);\n\n debug(`Resolved entry point: ${entryPoint} (project root: ${projectRoot})`);\n\n return stripExtension(entryPoint, 'js');\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 private platformBundlers: PlatformBundlers;\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 this.platformBundlers = getPlatformBundlers(projectRoot, this.initialProjectConfig.exp);\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({\n pkg: projectConfig.pkg,\n platform,\n });\n\n const isHermesEnabled = isEnableHermesManaged(projectConfig.exp, 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 engine: isHermesEnabled ? 'hermes' : undefined,\n baseUrl: getBaseUrlFromExpoConfig(projectConfig.exp),\n asyncRoutes: getAsyncRoutesFromExpoConfig(\n projectConfig.exp,\n this.options.mode ?? 'development',\n platform\n ),\n routerRoot: getRouterDirectoryModuleIdWithManifest(this.projectRoot, projectConfig.exp),\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(props: { pkg: PackageJSONConfig; platform: string }): string {\n let entryPoint = getEntryWithServerRoot(this.projectRoot, props);\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 engine,\n baseUrl,\n isExporting,\n asyncRoutes,\n routerRoot,\n }: {\n platform: string;\n hostname?: string | null;\n mainModuleName: string;\n engine?: 'hermes';\n baseUrl?: string;\n asyncRoutes: boolean;\n isExporting?: boolean;\n routerRoot: 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 engine,\n baseUrl,\n isExporting: !!isExporting,\n asyncRoutes,\n routerRoot,\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 /** 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({\n pkg: this.initialProjectConfig.pkg,\n platform,\n });\n\n return createBundleUrlPathFromExpoConfig(this.projectRoot, this.initialProjectConfig.exp, {\n platform,\n mainModuleName,\n minify: this.options.minify,\n lazy: shouldEnableAsyncImports(this.projectRoot),\n mode: this.options.mode ?? 'development',\n // Hermes doesn't support more modern JS features than most, if not all, modern browser.\n engine: 'hermes',\n isExporting: false,\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 if (\n this.platformBundlers.web === 'metro' &&\n this.initialProjectConfig.exp.platforms?.includes('web')\n ) {\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 (['static', 'server'].includes(this.initialProjectConfig.exp.web?.output ?? '')) {\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","Log","ProjectDevices","debug","require","projectRoot","findWorkspaceRoot","error","message","includes","supportedPlatforms","props","platform","CommandError","path","relative","resolveEntryPoint","env","EXPO_USE_METRO_WORKSPACE_ROOT","entryPoint","stripExtension","DEVELOPER_TOOL","ManifestMiddleware","ExpoMiddleware","constructor","options","initialProjectConfig","getConfig","platformBundlers","getPlatformBundlers","exp","_resolveProjectSettingsAsync","hostname","projectConfig","mainModuleName","pkg","isHermesEnabled","isEnableHermesManaged","expoGoConfig","getExpoGoConfig","hostUri","constructUrl","scheme","bundleUrl","_getBundleUrl","engine","undefined","baseUrl","getBaseUrlFromExpoConfig","asyncRoutes","getAsyncRoutesFromExpoConfig","mode","routerRoot","getRouterDirectoryModuleIdWithManifest","mutateManifestWithAssetsAsync","isNativeWebpack","saveDevicesAsync","req","deviceIds","headers","catch","e","exception","isExporting","createBundleUrlPath","minify","lazy","shouldEnableAsyncImports","debuggerHost","developer","tool","packagerOpts","dev","__flipperHack","manifest","resolveManifestAssets","resolver","resolve","match","resolveGoogleServicesFile","getWebBundleUrl","createBundleUrlPathFromExpoConfig","handleWebRequestAsync","res","setHeader","end","createTemplateHtmlFromExpoConfigAsync","scripts","checkBrowserRequestAsync","next","web","platforms","parsePlatformHeader","output","handleRequestAsync","getParsedHeaders","body","version","_getManifestResponseAsync","headerName","headerValue","trackManifest"],"mappings":"AAAA;;;;QAqCgBA,gBAAgB,GAAhBA,gBAAgB;QAahBC,sBAAsB,GAAtBA,sBAAsB;QAYtBC,kBAAkB,GAAlBA,kBAAkB;QASlBC,qBAAqB,GAArBA,qBAAqB;;AAjE9B,IAAA,OAAc,WAAd,cAAc,CAAA;AACa,IAAA,MAAoB,WAApB,oBAAoB,CAAA;AACxB,IAAA,sBAA0B,kCAA1B,0BAA0B,EAAA;AACvC,IAAA,KAAM,kCAAN,MAAM,EAAA;AACC,IAAA,IAAK,WAAL,KAAK,CAAA;AAEE,IAAA,eAAkB,WAAlB,kBAAkB,CAAA;AAO1C,IAAA,aAAgB,WAAhB,gBAAgB,CAAA;AAC0C,IAAA,cAAiB,WAAjB,iBAAiB,CAAA;AAC7B,IAAA,gBAAmB,WAAnB,mBAAmB,CAAA;AAElC,IAAA,aAA8B,WAA9B,8BAA8B,CAAA;AACxDC,IAAAA,GAAG,mCAAM,cAAc,EAApB;AACK,IAAA,IAAoB,WAApB,oBAAoB,CAAA;AACX,IAAA,OAAuB,WAAvB,uBAAuB,CAAA;AACrB,IAAA,KAAoB,WAApB,oBAAoB,CAAA;AACvCC,IAAAA,cAAc,mCAAM,uBAAuB,EAA7B;AAE6B,IAAA,OAAiB,WAAjB,iBAAiB,CAAA;AAClB,IAAA,iBAAqB,WAArB,qBAAqB,CAAA;AACrB,IAAA,YAAgB,WAAhB,gBAAgB,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEtE,MAAMC,KAAK,GAAGC,OAAO,CAAC,OAAO,CAAC,CAAC,uCAAuC,CAAC,AAAsB,AAAC;AAGvF,SAASP,gBAAgB,CAACQ,WAAmB,EAAiB;IACnE,IAAI;QACF,OAAOC,CAAAA,GAAAA,sBAAiB,AAAa,CAAA,QAAb,CAACD,WAAW,CAAC,CAAC;KACvC,CAAC,OAAOE,KAAK,EAAO;QACnB,IAAIA,KAAK,CAACC,OAAO,CAACC,QAAQ,CAAC,8BAA8B,CAAC,EAAE;YAC1D,OAAO,IAAI,CAAC;SACb;QACD,MAAMF,KAAK,CAAC;KACb;CACF;AAED,MAAMG,kBAAkB,GAAG;IAAC,KAAK;IAAE,SAAS;IAAE,KAAK;IAAE,MAAM;CAAC,AAAC;AAEtD,SAASZ,sBAAsB,CACpCO,WAAmB,EACnBM,KAAoD,EACpD;IACA,IAAI,CAACD,kBAAkB,CAACD,QAAQ,CAACE,KAAK,CAACC,QAAQ,CAAC,EAAE;QAChD,MAAM,IAAIC,OAAY,aAAA,CACpB,CAAC,0DAA0D,EAAEF,KAAK,CAACC,QAAQ,CAAC,mBAAmB,CAAC,CACjG,CAAC;KACH;IACD,OAAOE,KAAI,QAAA,CAACC,QAAQ,CAAChB,kBAAkB,CAACM,WAAW,CAAC,EAAEW,CAAAA,GAAAA,MAAiB,AAAoB,CAAA,kBAApB,CAACX,WAAW,EAAEM,KAAK,CAAC,CAAC,CAAC;CAC9F;AAEM,SAASZ,kBAAkB,CAACM,WAAmB,EAAE;IACtD,IAAIY,IAAG,IAAA,CAACC,6BAA6B,EAAE;YAC9BrB,GAA6B;QAApC,OAAOA,CAAAA,GAA6B,GAA7BA,gBAAgB,CAACQ,WAAW,CAAC,YAA7BR,GAA6B,GAAIQ,WAAW,CAAC;KACrD;IAED,OAAOA,WAAW,CAAC;CACpB;AAGM,SAASL,qBAAqB,CACnCK,WAAmB,EACnBM,KAAoD,EAC5C;IACR,MAAMQ,UAAU,GAAGrB,sBAAsB,CAACO,WAAW,EAAEM,KAAK,CAAC,AAAC;IAE9DR,KAAK,CAAC,CAAC,sBAAsB,EAAEgB,UAAU,CAAC,gBAAgB,EAAEd,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAE5E,OAAOe,CAAAA,GAAAA,KAAc,AAAkB,CAAA,eAAlB,CAACD,UAAU,EAAE,IAAI,CAAC,CAAC;CACzC;AA4BM,MAAME,cAAc,GAAG,UAAU,AAAC;QAA5BA,cAAc,GAAdA,cAAc;AAapB,MAAeC,kBAAkB,SAE9BC,eAAc,eAAA;IAItBC,YACYnB,WAAmB,EACnBoB,OAAkC,CAC5C;QACA,KAAK,CACHpB,WAAW,EACX;;SAEG,CACH;YAAC,GAAG;YAAE,WAAW;YAAE,YAAY;SAAC,CACjC,CAAC;aATQA,WAAmB,GAAnBA,WAAmB;aACnBoB,OAAkC,GAAlCA,OAAkC;QAS5C,IAAI,CAACC,oBAAoB,GAAGC,CAAAA,GAAAA,OAAS,AAAa,CAAA,UAAb,CAACtB,WAAW,CAAC,CAAC;QACnD,IAAI,CAACuB,gBAAgB,GAAGC,CAAAA,GAAAA,iBAAmB,AAA4C,CAAA,oBAA5C,CAACxB,WAAW,EAAE,IAAI,CAACqB,oBAAoB,CAACI,GAAG,CAAC,CAAC;KACzF;IAED,2BAA2B,CAC3B,MAAaC,4BAA4B,CAAC,EACxCnB,QAAQ,CAAA,EACRoB,QAAQ,CAAA,EAC4C,EAAoC;QACxF,kBAAkB;QAClB,MAAMC,aAAa,GAAGN,CAAAA,GAAAA,OAAS,AAAkB,CAAA,UAAlB,CAAC,IAAI,CAACtB,WAAW,CAAC,AAAC;QAElD,oBAAoB;QACpB,MAAM6B,cAAc,GAAG,IAAI,CAAClC,qBAAqB,CAAC;YAChDmC,GAAG,EAAEF,aAAa,CAACE,GAAG;YACtBvB,QAAQ;SACT,CAAC,AAAC;QAEH,MAAMwB,eAAe,GAAGC,CAAAA,GAAAA,aAAqB,AAA6B,CAAA,sBAA7B,CAACJ,aAAa,CAACH,GAAG,EAAElB,QAAQ,CAAC,AAAC;QAE3E,+CAA+C;QAC/C,MAAM0B,YAAY,GAAG,IAAI,CAACC,eAAe,CAAC;YACxCL,cAAc;YACdF,QAAQ;SACT,CAAC,AAAC;QAEH,MAAMQ,OAAO,GAAG,IAAI,CAACf,OAAO,CAACgB,YAAY,CAAC;YAAEC,MAAM,EAAE,EAAE;YAAEV,QAAQ;SAAE,CAAC,AAAC;YAUhE,KAAiB;QARrB,MAAMW,SAAS,GAAG,IAAI,CAACC,aAAa,CAAC;YACnChC,QAAQ;YACRsB,cAAc;YACdF,QAAQ;YACRa,MAAM,EAAET,eAAe,GAAG,QAAQ,GAAGU,SAAS;YAC9CC,OAAO,EAAEC,CAAAA,GAAAA,aAAwB,AAAmB,CAAA,yBAAnB,CAACf,aAAa,CAACH,GAAG,CAAC;YACpDmB,WAAW,EAAEC,CAAAA,GAAAA,aAA4B,AAIxC,CAAA,6BAJwC,CACvCjB,aAAa,CAACH,GAAG,EACjB,CAAA,KAAiB,GAAjB,IAAI,CAACL,OAAO,CAAC0B,IAAI,YAAjB,KAAiB,GAAI,aAAa,EAClCvC,QAAQ,CACT;YACDwC,UAAU,EAAEC,CAAAA,GAAAA,OAAsC,AAAqC,CAAA,uCAArC,CAAC,IAAI,CAAChD,WAAW,EAAE4B,aAAa,CAACH,GAAG,CAAC;SACxF,CAAC,AAAC;QAEH,0DAA0D;QAC1D,MAAM,IAAI,CAACwB,6BAA6B,CAACrB,aAAa,CAACH,GAAG,EAAEa,SAAS,CAAC,CAAC;QAEvE,OAAO;YACLL,YAAY;YACZE,OAAO;YACPG,SAAS;YACTb,GAAG,EAAEG,aAAa,CAACH,GAAG;SACvB,CAAC;KACH;IAED,wEAAwE,CACxE,AAAQ9B,qBAAqB,CAACW,KAAmD,EAAU;QACzF,IAAIQ,UAAU,GAAGrB,sBAAsB,CAAC,IAAI,CAACO,WAAW,EAAEM,KAAK,CAAC,AAAC;QAEjER,KAAK,CAAC,CAAC,sBAAsB,EAAEgB,UAAU,CAAC,gBAAgB,EAAE,IAAI,CAACd,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QAEjF,wEAAwE;QACxE,+EAA+E;QAC/E,2CAA2C;QAC3C,wCAAwC;QACxC,yEAAyE;QACzE,mGAAmG;QACnG,IAAI,IAAI,CAACoB,OAAO,CAAC8B,eAAe,EAAE;YAChCpC,UAAU,GAAG,UAAU,CAAC;SACzB;QAED,OAAOC,CAAAA,GAAAA,KAAc,AAAkB,CAAA,eAAlB,CAACD,UAAU,EAAE,IAAI,CAAC,CAAC;KACzC;IAKD,8DAA8D,CAC9D,MAAcqC,gBAAgB,CAACC,GAAkB,EAAE;YAC/BA,GAAW;QAA7B,MAAMC,SAAS,GAAGD,CAAAA,GAAW,GAAXA,GAAG,CAACE,OAAO,SAAwB,GAAnCF,KAAAA,CAAmC,GAAnCA,GAAW,AAAE,CAAC,oBAAoB,CAAC,AAAC;QACtD,IAAIC,SAAS,EAAE;YACb,MAAMxD,cAAc,CAACsD,gBAAgB,CAAC,IAAI,CAACnD,WAAW,EAAEqD,SAAS,CAAC,CAACE,KAAK,CAAC,CAACC,CAAC,GACzE5D,GAAG,CAAC6D,SAAS,CAACD,CAAC,CAAC;YAAA,CACjB,CAAC;SACH;KACF;IAED,uFAAuF,CACvF,AAAOjB,aAAa,CAAC,EACnBhC,QAAQ,CAAA,EACRsB,cAAc,CAAA,EACdF,QAAQ,CAAA,EACRa,MAAM,CAAA,EACNE,OAAO,CAAA,EACPgB,WAAW,CAAA,EACXd,WAAW,CAAA,EACXG,UAAU,CAAA,EAUX,EAAU;YAED,KAAiB;QADzB,MAAMtC,IAAI,GAAGkD,CAAAA,GAAAA,aAAmB,AAW9B,CAAA,oBAX8B,CAAC;YAC/Bb,IAAI,EAAE,CAAA,KAAiB,GAAjB,IAAI,CAAC1B,OAAO,CAAC0B,IAAI,YAAjB,KAAiB,GAAI,aAAa;YACxCc,MAAM,EAAE,IAAI,CAACxC,OAAO,CAACwC,MAAM;YAC3BrD,QAAQ;YACRsB,cAAc;YACdgC,IAAI,EAAEC,CAAAA,GAAAA,aAAwB,AAAkB,CAAA,yBAAlB,CAAC,IAAI,CAAC9D,WAAW,CAAC;YAChDwC,MAAM;YACNE,OAAO;YACPgB,WAAW,EAAE,CAAC,CAACA,WAAW;YAC1Bd,WAAW;YACXG,UAAU;SACX,CAAC,AAAC;QAEH,OACE,IAAI,CAAC3B,OAAO,CAACgB,YAAY,CAAC;YACxBC,MAAM,EAAE,MAAM;YACd,4CAA4C;YAC5CV,QAAQ;SACT,CAAC,GAAGlB,IAAI,CACT;KACH;IAYD,AAAQyB,eAAe,CAAC,EACtBL,cAAc,CAAA,EACdF,QAAQ,CAAA,EAIT,EAAgB;QACf,OAAO;YACL,iBAAiB;YACjBoC,YAAY,EAAE,IAAI,CAAC3C,OAAO,CAACgB,YAAY,CAAC;gBAAEC,MAAM,EAAE,EAAE;gBAAEV,QAAQ;aAAE,CAAC;YACjE,oCAAoC;YACpCqC,SAAS,EAAE;gBACTC,IAAI,EAAEjD,cAAc;gBACpBhB,WAAW,EAAE,IAAI,CAACA,WAAW;aAC9B;YACDkE,YAAY,EAAE;gBACZ,2BAA2B;gBAC3BC,GAAG,EAAE,IAAI,CAAC/C,OAAO,CAAC0B,IAAI,KAAK,YAAY;aACxC;YACD,yCAAyC;YACzCjB,cAAc;YACd,8EAA8E;YAC9E,4BAA4B;YAC5B,+CAA+C;YAC/C,iEAAiE;YACjEuC,aAAa,EAAE,kCAAkC;SAClD,CAAC;KACH;IAED,8DAA8D,CAC9D,MAAcnB,6BAA6B,CAACoB,QAAoB,EAAE/B,SAAiB,EAAE;QACnF,MAAMgC,CAAAA,GAAAA,cAAqB,AAUzB,CAAA,sBAVyB,CAAC,IAAI,CAACtE,WAAW,EAAE;YAC5CqE,QAAQ;YACRE,QAAQ,EAAE,OAAO9D,IAAI,GAAK;gBACxB,IAAI,IAAI,CAACW,OAAO,CAAC8B,eAAe,EAAE;oBAChC,4DAA4D;oBAC5D,0CAA0C;oBAC1C,OAAOsB,CAAAA,GAAAA,IAAO,AAAiD,CAAA,QAAjD,CAAClC,SAAS,CAAEmC,KAAK,qBAAqB,AAAC,CAAC,CAAC,CAAC,EAAEhE,IAAI,CAAC,CAAC;iBACjE;gBACD,OAAO6B,SAAS,CAAEmC,KAAK,qBAAqB,AAAC,CAAC,CAAC,CAAC,GAAG,SAAS,GAAGhE,IAAI,CAAC;aACrE;SACF,CAAC,CAAC;QACH,yEAAyE;QACzE,MAAMiE,CAAAA,GAAAA,cAAyB,AAA4B,CAAA,0BAA5B,CAAC,IAAI,CAAC1E,WAAW,EAAEqE,QAAQ,CAAC,CAAC;KAC7D;IAED,AAAOM,eAAe,GAAG;QACvB,MAAMpE,QAAQ,GAAG,KAAK,AAAC;QACvB,oBAAoB;QACpB,MAAMsB,cAAc,GAAG,IAAI,CAAClC,qBAAqB,CAAC;YAChDmC,GAAG,EAAE,IAAI,CAACT,oBAAoB,CAACS,GAAG;YAClCvB,QAAQ;SACT,CAAC,AAAC;YAOK,KAAiB;QALzB,OAAOqE,CAAAA,GAAAA,aAAiC,AAStC,CAAA,kCATsC,CAAC,IAAI,CAAC5E,WAAW,EAAE,IAAI,CAACqB,oBAAoB,CAACI,GAAG,EAAE;YACxFlB,QAAQ;YACRsB,cAAc;YACd+B,MAAM,EAAE,IAAI,CAACxC,OAAO,CAACwC,MAAM;YAC3BC,IAAI,EAAEC,CAAAA,GAAAA,aAAwB,AAAkB,CAAA,yBAAlB,CAAC,IAAI,CAAC9D,WAAW,CAAC;YAChD8C,IAAI,EAAE,CAAA,KAAiB,GAAjB,IAAI,CAAC1B,OAAO,CAAC0B,IAAI,YAAjB,KAAiB,GAAI,aAAa;YACxC,wFAAwF;YACxFN,MAAM,EAAE,QAAQ;YAChBkB,WAAW,EAAE,KAAK;SACnB,CAAC,CAAC;KACJ;IAED;;;;;KAKG,CACH,MAAcmB,qBAAqB,CAACzB,GAAkB,EAAE0B,GAAmB,EAAE;QAC3E,oBAAoB;QACpB,MAAMxC,SAAS,GAAG,IAAI,CAACqC,eAAe,EAAE,AAAC;QAEzCG,GAAG,CAACC,SAAS,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;QAE3CD,GAAG,CAACE,GAAG,CACL,MAAMC,CAAAA,GAAAA,YAAqC,AAGzC,CAAA,sCAHyC,CAAC,IAAI,CAACjF,WAAW,EAAE;YAC5DyB,GAAG,EAAE,IAAI,CAACJ,oBAAoB,CAACI,GAAG;YAClCyD,OAAO,EAAE;gBAAC5C,SAAS;aAAC;SACrB,CAAC,CACH,CAAC;KACH;IAED,2BAA2B,CAC3B,MAAM6C,wBAAwB,CAAC/B,GAAkB,EAAE0B,GAAmB,EAAEM,IAAgB,EAAE;YAGtF,GAAuC;QAFzC,IACE,IAAI,CAAC7D,gBAAgB,CAAC8D,GAAG,KAAK,OAAO,KACrC,CAAA,GAAuC,GAAvC,IAAI,CAAChE,oBAAoB,CAACI,GAAG,CAAC6D,SAAS,SAAU,GAAjD,KAAA,CAAiD,GAAjD,GAAuC,CAAElF,QAAQ,CAAC,KAAK,CAAC,CAAA,EACxD;YACA,iGAAiG;YACjG,oGAAoG;YACpG,4FAA4F;YAC5F,MAAMG,QAAQ,GAAGgF,CAAAA,GAAAA,gBAAmB,AAAK,CAAA,oBAAL,CAACnC,GAAG,CAAC,AAAC;YAC1C,kCAAkC;YAClC,IAAI,CAAC7C,QAAQ,IAAIA,QAAQ,KAAK,KAAK,EAAE;oBACD,IAAiC;oBAAjC,IAAyC;gBAA3E,IAAI;oBAAC,QAAQ;oBAAE,QAAQ;iBAAC,CAACH,QAAQ,CAAC,CAAA,IAAyC,GAAzC,CAAA,IAAiC,GAAjC,IAAI,CAACiB,oBAAoB,CAACI,GAAG,CAAC4D,GAAG,SAAQ,GAAzC,KAAA,CAAyC,GAAzC,IAAiC,CAAEG,MAAM,YAAzC,IAAyC,GAAI,EAAE,CAAC,EAAE;oBAClF,oEAAoE;oBACpEJ,IAAI,EAAE,CAAC;oBACP,OAAO,IAAI,CAAC;iBACb,MAAM;oBACL,MAAM,IAAI,CAACP,qBAAqB,CAACzB,GAAG,EAAE0B,GAAG,CAAC,CAAC;oBAC3C,OAAO,IAAI,CAAC;iBACb;aACF;SACF;QACD,OAAO,KAAK,CAAC;KACd;IAED,MAAMW,kBAAkB,CACtBrC,GAAkB,EAClB0B,GAAmB,EACnBM,IAAgB,EACD;QACf,kFAAkF;QAClF,IAAI,MAAM,IAAI,CAACD,wBAAwB,CAAC/B,GAAG,EAAE0B,GAAG,EAAEM,IAAI,CAAC,EAAE;YACvD,OAAO;SACR;QAED,kCAAkC;QAClC,MAAM,IAAI,CAACjC,gBAAgB,CAACC,GAAG,CAAC,CAAC;QAEjC,oBAAoB;QACpB,MAAMhC,OAAO,GAAG,IAAI,CAACsE,gBAAgB,CAACtC,GAAG,CAAC,AAAC;QAC3C,MAAM,EAAEuC,IAAI,CAAA,EAAEC,OAAO,CAAA,EAAEtC,OAAO,CAAA,EAAE,GAAG,MAAM,IAAI,CAACuC,yBAAyB,CAACzE,OAAO,CAAC,AAAC;QACjF,KAAK,MAAM,CAAC0E,UAAU,EAAEC,WAAW,CAAC,IAAIzC,OAAO,CAAE;YAC/CwB,GAAG,CAACC,SAAS,CAACe,UAAU,EAAEC,WAAW,CAAC,CAAC;SACxC;QACDjB,GAAG,CAACE,GAAG,CAACW,IAAI,CAAC,CAAC;QAEd,gBAAgB;QAChB,IAAI,CAACK,aAAa,CAACJ,OAAO,WAAPA,OAAO,GAAI,IAAI,CAAC,CAAC;KACrC;CACF;QAjSqB3E,kBAAkB,GAAlBA,kBAAkB"}
|
|
@@ -3,15 +3,28 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
3
3
|
value: true
|
|
4
4
|
});
|
|
5
5
|
exports.getPlatformBundlers = getPlatformBundlers;
|
|
6
|
-
|
|
6
|
+
var _resolveFrom = _interopRequireDefault(require("resolve-from"));
|
|
7
|
+
function _interopRequireDefault(obj) {
|
|
8
|
+
return obj && obj.__esModule ? obj : {
|
|
9
|
+
default: obj
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
function getPlatformBundlers(projectRoot, exp) {
|
|
7
13
|
var ref, ref1, ref2;
|
|
8
|
-
|
|
14
|
+
/**
|
|
15
|
+
* SDK 50+: The web bundler is dynamic based upon the presence of the `@expo/webpack-config` package.
|
|
16
|
+
*/ let web = (ref = exp.web) == null ? void 0 : ref.bundler;
|
|
17
|
+
if (!web) {
|
|
18
|
+
const resolved = _resolveFrom.default.silent(projectRoot, "@expo/webpack-config/package.json");
|
|
19
|
+
web = resolved ? "webpack" : "metro";
|
|
20
|
+
}
|
|
21
|
+
var ref3, ref4;
|
|
9
22
|
return {
|
|
10
23
|
// @ts-expect-error: not on type yet
|
|
11
|
-
ios: (ref3 = (
|
|
24
|
+
ios: (ref3 = (ref1 = exp.ios) == null ? void 0 : ref1.bundler) != null ? ref3 : "metro",
|
|
12
25
|
// @ts-expect-error: not on type yet
|
|
13
|
-
android: (ref4 = (
|
|
14
|
-
web
|
|
26
|
+
android: (ref4 = (ref2 = exp.android) == null ? void 0 : ref2.bundler) != null ? ref4 : "metro",
|
|
27
|
+
web
|
|
15
28
|
};
|
|
16
29
|
}
|
|
17
30
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/start/server/platformBundlers.ts"],"sourcesContent":["import { ExpoConfig, Platform } from '@expo/config';\n\n/** Which bundler each platform should use. */\nexport type PlatformBundlers = Record<Platform, 'metro' | 'webpack'>;\n\n/** Get the platform bundlers mapping. */\nexport function getPlatformBundlers(exp: Partial<ExpoConfig
|
|
1
|
+
{"version":3,"sources":["../../../../src/start/server/platformBundlers.ts"],"sourcesContent":["import { ExpoConfig, Platform } from '@expo/config';\nimport resolveFrom from 'resolve-from';\n\n/** Which bundler each platform should use. */\nexport type PlatformBundlers = Record<Platform, 'metro' | 'webpack'>;\n\n/** Get the platform bundlers mapping. */\nexport function getPlatformBundlers(\n projectRoot: string,\n exp: Partial<ExpoConfig>\n): PlatformBundlers {\n /**\n * SDK 50+: The web bundler is dynamic based upon the presence of the `@expo/webpack-config` package.\n */\n let web = exp.web?.bundler;\n if (!web) {\n const resolved = resolveFrom.silent(projectRoot, '@expo/webpack-config/package.json');\n web = resolved ? 'webpack' : 'metro';\n }\n\n return {\n // @ts-expect-error: not on type yet\n ios: exp.ios?.bundler ?? 'metro',\n // @ts-expect-error: not on type yet\n android: exp.android?.bundler ?? 'metro',\n web,\n };\n}\n"],"names":["getPlatformBundlers","projectRoot","exp","web","bundler","resolved","resolveFrom","silent","ios","android"],"mappings":"AAAA;;;;QAOgBA,mBAAmB,GAAnBA,mBAAmB;AANX,IAAA,YAAc,kCAAd,cAAc,EAAA;;;;;;AAM/B,SAASA,mBAAmB,CACjCC,WAAmB,EACnBC,GAAwB,EACN;QAIRA,GAAO,EAQVA,IAAO,EAEHA,IAAW;IAbtB;;KAEG,CACH,IAAIC,GAAG,GAAGD,CAAAA,GAAO,GAAPA,GAAG,CAACC,GAAG,SAAS,GAAhBD,KAAAA,CAAgB,GAAhBA,GAAO,CAAEE,OAAO,AAAC;IAC3B,IAAI,CAACD,GAAG,EAAE;QACR,MAAME,QAAQ,GAAGC,YAAW,QAAA,CAACC,MAAM,CAACN,WAAW,EAAE,mCAAmC,CAAC,AAAC;QACtFE,GAAG,GAAGE,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;KACtC;QAIMH,IAAgB,EAEZA,IAAoB;IAJ/B,OAAO;QACL,oCAAoC;QACpCM,GAAG,EAAEN,CAAAA,IAAgB,GAAhBA,CAAAA,IAAO,GAAPA,GAAG,CAACM,GAAG,SAAS,GAAhBN,KAAAA,CAAgB,GAAhBA,IAAO,CAAEE,OAAO,YAAhBF,IAAgB,GAAI,OAAO;QAChC,oCAAoC;QACpCO,OAAO,EAAEP,CAAAA,IAAoB,GAApBA,CAAAA,IAAW,GAAXA,GAAG,CAACO,OAAO,SAAS,GAApBP,KAAAA,CAAoB,GAApBA,IAAW,CAAEE,OAAO,YAApBF,IAAoB,GAAI,OAAO;QACxCC,GAAG;KACJ,CAAC;CACH"}
|
|
@@ -92,7 +92,7 @@ async function startAsync(projectRoot, options, settings) {
|
|
|
92
92
|
(0, _nodeEnv).setNodeEnv(options.dev ? "development" : "production");
|
|
93
93
|
require("@expo/env").load(projectRoot);
|
|
94
94
|
const { exp , pkg } = (0, _profile).profile(_config.getConfig)(projectRoot);
|
|
95
|
-
const platformBundlers = (0, _platformBundlers).getPlatformBundlers(exp);
|
|
95
|
+
const platformBundlers = (0, _platformBundlers).getPlatformBundlers(projectRoot, exp);
|
|
96
96
|
const [defaultOptions, startOptions] = await getMultiBundlerStartOptions(projectRoot, options, settings, platformBundlers);
|
|
97
97
|
const devServerManager = new _devServerManager.DevServerManager(projectRoot, defaultOptions);
|
|
98
98
|
// Validations
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/start/startAsync.ts"],"sourcesContent":["import { ExpoConfig, getConfig } from '@expo/config';\nimport chalk from 'chalk';\n\nimport { validateDependenciesVersionsAsync } from './doctor/dependencies/validateDependenciesVersions';\nimport { WebSupportProjectPrerequisite } from './doctor/web/WebSupportProjectPrerequisite';\nimport { startInterfaceAsync } from './interface/startInterface';\nimport { Options, resolvePortsAsync } from './resolveOptions';\nimport { BundlerStartOptions } from './server/BundlerDevServer';\nimport { DevServerManager, MultiBundlerStartOptions } from './server/DevServerManager';\nimport { openPlatformsAsync } from './server/openPlatforms';\nimport { getPlatformBundlers, PlatformBundlers } from './server/platformBundlers';\nimport * as Log from '../log';\nimport getDevClientProperties from '../utils/analytics/getDevClientProperties';\nimport { logEventAsync } from '../utils/analytics/rudderstackClient';\nimport { installExitHooks } from '../utils/exit';\nimport { isInteractive } from '../utils/interactive';\nimport { setNodeEnv } from '../utils/nodeEnv';\nimport { profile } from '../utils/profile';\n\nasync function getMultiBundlerStartOptions(\n projectRoot: string,\n options: Options,\n settings: { webOnly?: boolean },\n platformBundlers: PlatformBundlers\n): Promise<[BundlerStartOptions, MultiBundlerStartOptions]> {\n const commonOptions: BundlerStartOptions = {\n mode: options.dev ? 'development' : 'production',\n devClient: options.devClient,\n privateKeyPath: options.privateKeyPath ?? undefined,\n https: options.https,\n maxWorkers: options.maxWorkers,\n resetDevServer: options.clear,\n minify: options.minify,\n location: {\n hostType: options.host,\n scheme: options.scheme,\n },\n };\n const multiBundlerSettings = await resolvePortsAsync(projectRoot, options, settings);\n\n const optionalBundlers: Partial<PlatformBundlers> = { ...platformBundlers };\n // In the default case, we don't want to start multiple bundlers since this is\n // a bit slower. Our priority (for legacy) is native platforms.\n if (!options.web) {\n delete optionalBundlers['web'];\n }\n\n const bundlers = [...new Set(Object.values(optionalBundlers))];\n const multiBundlerStartOptions = bundlers.map((bundler) => {\n const port =\n bundler === 'webpack' ? multiBundlerSettings.webpackPort : multiBundlerSettings.metroPort;\n return {\n type: bundler,\n options: {\n ...commonOptions,\n port,\n },\n };\n });\n\n return [commonOptions, multiBundlerStartOptions];\n}\n\nexport async function startAsync(\n projectRoot: string,\n options: Options,\n settings: { webOnly?: boolean }\n) {\n Log.log(chalk.gray(`Starting project at ${projectRoot}`));\n\n setNodeEnv(options.dev ? 'development' : 'production');\n require('@expo/env').load(projectRoot);\n const { exp, pkg } = profile(getConfig)(projectRoot);\n\n const platformBundlers = getPlatformBundlers(exp);\n\n const [defaultOptions, startOptions] = await getMultiBundlerStartOptions(\n projectRoot,\n options,\n settings,\n platformBundlers\n );\n\n const devServerManager = new DevServerManager(projectRoot, defaultOptions);\n\n // Validations\n\n if (options.web || settings.webOnly) {\n await devServerManager.ensureProjectPrerequisiteAsync(WebSupportProjectPrerequisite);\n }\n\n // Start the server as soon as possible.\n await profile(devServerManager.startAsync.bind(devServerManager))(startOptions);\n\n if (!settings.webOnly) {\n await devServerManager.watchEnvironmentVariables();\n\n // After the server starts, we can start attempting to bootstrap TypeScript.\n await devServerManager.bootstrapTypeScriptAsync();\n }\n\n if (!settings.webOnly && !options.devClient) {\n await profile(validateDependenciesVersionsAsync)(projectRoot, exp, pkg);\n }\n\n // Some tracking thing\n\n if (options.devClient) {\n await trackAsync(projectRoot, exp);\n }\n\n // Open project on devices.\n await profile(openPlatformsAsync)(devServerManager, options);\n\n // Present the Terminal UI.\n if (isInteractive()) {\n await profile(startInterfaceAsync)(devServerManager, {\n platforms: exp.platforms ?? ['ios', 'android', 'web'],\n });\n } else {\n // Display the server location in CI...\n const url = devServerManager.getDefaultDevServer()?.getDevServerUrl();\n if (url) {\n Log.log(chalk`Waiting on {underline ${url}}`);\n }\n }\n\n // Final note about closing the server.\n const logLocation = settings.webOnly ? 'in the browser console' : 'below';\n Log.log(\n chalk`Logs for your project will appear ${logLocation}.${\n isInteractive() ? chalk.dim(` Press Ctrl+C to exit.`) : ''\n }`\n );\n}\n\nasync function trackAsync(projectRoot: string, exp: ExpoConfig): Promise<void> {\n await logEventAsync('dev client start command', {\n status: 'started',\n ...getDevClientProperties(projectRoot, exp),\n });\n installExitHooks(async () => {\n await logEventAsync('dev client start command', {\n status: 'finished',\n ...getDevClientProperties(projectRoot, exp),\n });\n // UnifiedAnalytics.flush();\n });\n}\n"],"names":["startAsync","Log","getMultiBundlerStartOptions","projectRoot","options","settings","platformBundlers","commonOptions","mode","dev","devClient","privateKeyPath","undefined","https","maxWorkers","resetDevServer","clear","minify","location","hostType","host","scheme","multiBundlerSettings","resolvePortsAsync","optionalBundlers","web","bundlers","Set","Object","values","multiBundlerStartOptions","map","bundler","port","webpackPort","metroPort","type","log","chalk","gray","setNodeEnv","require","load","exp","pkg","profile","getConfig","getPlatformBundlers","defaultOptions","startOptions","devServerManager","DevServerManager","webOnly","ensureProjectPrerequisiteAsync","WebSupportProjectPrerequisite","bind","watchEnvironmentVariables","bootstrapTypeScriptAsync","validateDependenciesVersionsAsync","trackAsync","openPlatformsAsync","isInteractive","startInterfaceAsync","platforms","url","getDefaultDevServer","getDevServerUrl","logLocation","dim","logEventAsync","status","getDevClientProperties","installExitHooks"],"mappings":"AAAA;;;;QA+DsBA,UAAU,GAAVA,UAAU;AA/DM,IAAA,OAAc,WAAd,cAAc,CAAA;AAClC,IAAA,MAAO,kCAAP,OAAO,EAAA;AAEyB,IAAA,6BAAoD,WAApD,oDAAoD,CAAA;AACxD,IAAA,8BAA4C,WAA5C,4CAA4C,CAAA;AACtD,IAAA,eAA4B,WAA5B,4BAA4B,CAAA;AACrB,IAAA,eAAkB,WAAlB,kBAAkB,CAAA;AAEF,IAAA,iBAA2B,WAA3B,2BAA2B,CAAA;AACnD,IAAA,cAAwB,WAAxB,wBAAwB,CAAA;AACL,IAAA,iBAA2B,WAA3B,2BAA2B,CAAA;AACrEC,IAAAA,GAAG,mCAAM,QAAQ,EAAd;AACoB,IAAA,uBAA2C,kCAA3C,2CAA2C,EAAA;AAChD,IAAA,kBAAsC,WAAtC,sCAAsC,CAAA;AACnC,IAAA,KAAe,WAAf,eAAe,CAAA;AAClB,IAAA,YAAsB,WAAtB,sBAAsB,CAAA;AACzB,IAAA,QAAkB,WAAlB,kBAAkB,CAAA;AACrB,IAAA,QAAkB,WAAlB,kBAAkB,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE1C,eAAeC,2BAA2B,CACxCC,WAAmB,EACnBC,OAAgB,EAChBC,QAA+B,EAC/BC,gBAAkC,EACwB;QAIxCF,eAAsB;IAHxC,MAAMG,aAAa,GAAwB;QACzCC,IAAI,EAAEJ,OAAO,CAACK,GAAG,GAAG,aAAa,GAAG,YAAY;QAChDC,SAAS,EAAEN,OAAO,CAACM,SAAS;QAC5BC,cAAc,EAAEP,CAAAA,eAAsB,GAAtBA,OAAO,CAACO,cAAc,YAAtBP,eAAsB,GAAIQ,SAAS;QACnDC,KAAK,EAAET,OAAO,CAACS,KAAK;QACpBC,UAAU,EAAEV,OAAO,CAACU,UAAU;QAC9BC,cAAc,EAAEX,OAAO,CAACY,KAAK;QAC7BC,MAAM,EAAEb,OAAO,CAACa,MAAM;QACtBC,QAAQ,EAAE;YACRC,QAAQ,EAAEf,OAAO,CAACgB,IAAI;YACtBC,MAAM,EAAEjB,OAAO,CAACiB,MAAM;SACvB;KACF,AAAC;IACF,MAAMC,oBAAoB,GAAG,MAAMC,CAAAA,GAAAA,eAAiB,AAAgC,CAAA,kBAAhC,CAACpB,WAAW,EAAEC,OAAO,EAAEC,QAAQ,CAAC,AAAC;IAErF,MAAMmB,gBAAgB,GAA8B;QAAE,GAAGlB,gBAAgB;KAAE,AAAC;IAC5E,8EAA8E;IAC9E,+DAA+D;IAC/D,IAAI,CAACF,OAAO,CAACqB,GAAG,EAAE;QAChB,OAAOD,gBAAgB,CAAC,KAAK,CAAC,CAAC;KAChC;IAED,MAAME,QAAQ,GAAG;WAAI,IAAIC,GAAG,CAACC,MAAM,CAACC,MAAM,CAACL,gBAAgB,CAAC,CAAC;KAAC,AAAC;IAC/D,MAAMM,wBAAwB,GAAGJ,QAAQ,CAACK,GAAG,CAAC,CAACC,OAAO,GAAK;QACzD,MAAMC,IAAI,GACRD,OAAO,KAAK,SAAS,GAAGV,oBAAoB,CAACY,WAAW,GAAGZ,oBAAoB,CAACa,SAAS,AAAC;QAC5F,OAAO;YACLC,IAAI,EAAEJ,OAAO;YACb5B,OAAO,EAAE;gBACP,GAAGG,aAAa;gBAChB0B,IAAI;aACL;SACF,CAAC;KACH,CAAC,AAAC;IAEH,OAAO;QAAC1B,aAAa;QAAEuB,wBAAwB;KAAC,CAAC;CAClD;AAEM,eAAe9B,UAAU,CAC9BG,WAAmB,EACnBC,OAAgB,EAChBC,QAA+B,EAC/B;IACAJ,GAAG,CAACoC,GAAG,CAACC,MAAK,QAAA,CAACC,IAAI,CAAC,CAAC,oBAAoB,EAAEpC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAE1DqC,CAAAA,GAAAA,QAAU,AAA4C,CAAA,WAA5C,CAACpC,OAAO,CAACK,GAAG,GAAG,aAAa,GAAG,YAAY,CAAC,CAAC;IACvDgC,OAAO,CAAC,WAAW,CAAC,CAACC,IAAI,CAACvC,WAAW,CAAC,CAAC;IACvC,MAAM,EAAEwC,GAAG,CAAA,EAAEC,GAAG,CAAA,EAAE,GAAGC,CAAAA,GAAAA,QAAO,AAAW,CAAA,QAAX,CAACC,OAAS,UAAA,CAAC,CAAC3C,WAAW,CAAC,AAAC;IAErD,MAAMG,gBAAgB,GAAGyC,CAAAA,GAAAA,iBAAmB,AAAK,CAAA,oBAAL,CAACJ,GAAG,CAAC,AAAC;IAElD,MAAM,CAACK,cAAc,EAAEC,YAAY,CAAC,GAAG,MAAM/C,2BAA2B,CACtEC,WAAW,EACXC,OAAO,EACPC,QAAQ,EACRC,gBAAgB,CACjB,AAAC;IAEF,MAAM4C,gBAAgB,GAAG,IAAIC,iBAAgB,iBAAA,CAAChD,WAAW,EAAE6C,cAAc,CAAC,AAAC;IAE3E,cAAc;IAEd,IAAI5C,OAAO,CAACqB,GAAG,IAAIpB,QAAQ,CAAC+C,OAAO,EAAE;QACnC,MAAMF,gBAAgB,CAACG,8BAA8B,CAACC,8BAA6B,8BAAA,CAAC,CAAC;KACtF;IAED,wCAAwC;IACxC,MAAMT,CAAAA,GAAAA,QAAO,AAAoD,CAAA,QAApD,CAACK,gBAAgB,CAAClD,UAAU,CAACuD,IAAI,CAACL,gBAAgB,CAAC,CAAC,CAACD,YAAY,CAAC,CAAC;IAEhF,IAAI,CAAC5C,QAAQ,CAAC+C,OAAO,EAAE;QACrB,MAAMF,gBAAgB,CAACM,yBAAyB,EAAE,CAAC;QAEnD,4EAA4E;QAC5E,MAAMN,gBAAgB,CAACO,wBAAwB,EAAE,CAAC;KACnD;IAED,IAAI,CAACpD,QAAQ,CAAC+C,OAAO,IAAI,CAAChD,OAAO,CAACM,SAAS,EAAE;QAC3C,MAAMmC,CAAAA,GAAAA,QAAO,AAAmC,CAAA,QAAnC,CAACa,6BAAiC,kCAAA,CAAC,CAACvD,WAAW,EAAEwC,GAAG,EAAEC,GAAG,CAAC,CAAC;KACzE;IAED,sBAAsB;IAEtB,IAAIxC,OAAO,CAACM,SAAS,EAAE;QACrB,MAAMiD,UAAU,CAACxD,WAAW,EAAEwC,GAAG,CAAC,CAAC;KACpC;IAED,2BAA2B;IAC3B,MAAME,CAAAA,GAAAA,QAAO,AAAoB,CAAA,QAApB,CAACe,cAAkB,mBAAA,CAAC,CAACV,gBAAgB,EAAE9C,OAAO,CAAC,CAAC;IAE7D,2BAA2B;IAC3B,IAAIyD,CAAAA,GAAAA,YAAa,AAAE,CAAA,cAAF,EAAE,EAAE;YAENlB,UAAa;QAD1B,MAAME,CAAAA,GAAAA,QAAO,AAAqB,CAAA,QAArB,CAACiB,eAAmB,oBAAA,CAAC,CAACZ,gBAAgB,EAAE;YACnDa,SAAS,EAAEpB,CAAAA,UAAa,GAAbA,GAAG,CAACoB,SAAS,YAAbpB,UAAa,GAAI;gBAAC,KAAK;gBAAE,SAAS;gBAAE,KAAK;aAAC;SACtD,CAAC,CAAC;KACJ,MAAM;YAEOO,GAAsC;QADlD,uCAAuC;QACvC,MAAMc,GAAG,GAAGd,CAAAA,GAAsC,GAAtCA,gBAAgB,CAACe,mBAAmB,EAAE,SAAiB,GAAvDf,KAAAA,CAAuD,GAAvDA,GAAsC,CAAEgB,eAAe,EAAE,AAAC;QACtE,IAAIF,GAAG,EAAE;YACP/D,GAAG,CAACoC,GAAG,CAACC,MAAK,QAAA,CAAC,sBAAsB,EAAE0B,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SAC/C;KACF;IAED,uCAAuC;IACvC,MAAMG,WAAW,GAAG9D,QAAQ,CAAC+C,OAAO,GAAG,wBAAwB,GAAG,OAAO,AAAC;IAC1EnD,GAAG,CAACoC,GAAG,CACLC,MAAK,QAAA,CAAC,kCAAkC,EAAE6B,WAAW,CAAC,CAAC,EACrDN,CAAAA,GAAAA,YAAa,AAAE,CAAA,cAAF,EAAE,GAAGvB,MAAK,QAAA,CAAC8B,GAAG,CAAC,CAAC,sBAAsB,CAAC,CAAC,GAAG,EAAE,CAC3D,CAAC,CACH,CAAC;CACH;AAED,eAAeT,UAAU,CAACxD,WAAmB,EAAEwC,GAAe,EAAiB;IAC7E,MAAM0B,CAAAA,GAAAA,kBAAa,AAGjB,CAAA,cAHiB,CAAC,0BAA0B,EAAE;QAC9CC,MAAM,EAAE,SAAS;QACjB,GAAGC,CAAAA,GAAAA,uBAAsB,AAAkB,CAAA,QAAlB,CAACpE,WAAW,EAAEwC,GAAG,CAAC;KAC5C,CAAC,CAAC;IACH6B,CAAAA,GAAAA,KAAgB,AAMd,CAAA,iBANc,CAAC,UAAY;QAC3B,MAAMH,CAAAA,GAAAA,kBAAa,AAGjB,CAAA,cAHiB,CAAC,0BAA0B,EAAE;YAC9CC,MAAM,EAAE,UAAU;YAClB,GAAGC,CAAAA,GAAAA,uBAAsB,AAAkB,CAAA,QAAlB,CAACpE,WAAW,EAAEwC,GAAG,CAAC;SAC5C,CAAC,CAAC;IACH,4BAA4B;KAC7B,CAAC,CAAC;CACJ"}
|
|
1
|
+
{"version":3,"sources":["../../../src/start/startAsync.ts"],"sourcesContent":["import { ExpoConfig, getConfig } from '@expo/config';\nimport chalk from 'chalk';\n\nimport { validateDependenciesVersionsAsync } from './doctor/dependencies/validateDependenciesVersions';\nimport { WebSupportProjectPrerequisite } from './doctor/web/WebSupportProjectPrerequisite';\nimport { startInterfaceAsync } from './interface/startInterface';\nimport { Options, resolvePortsAsync } from './resolveOptions';\nimport { BundlerStartOptions } from './server/BundlerDevServer';\nimport { DevServerManager, MultiBundlerStartOptions } from './server/DevServerManager';\nimport { openPlatformsAsync } from './server/openPlatforms';\nimport { getPlatformBundlers, PlatformBundlers } from './server/platformBundlers';\nimport * as Log from '../log';\nimport getDevClientProperties from '../utils/analytics/getDevClientProperties';\nimport { logEventAsync } from '../utils/analytics/rudderstackClient';\nimport { installExitHooks } from '../utils/exit';\nimport { isInteractive } from '../utils/interactive';\nimport { setNodeEnv } from '../utils/nodeEnv';\nimport { profile } from '../utils/profile';\n\nasync function getMultiBundlerStartOptions(\n projectRoot: string,\n options: Options,\n settings: { webOnly?: boolean },\n platformBundlers: PlatformBundlers\n): Promise<[BundlerStartOptions, MultiBundlerStartOptions]> {\n const commonOptions: BundlerStartOptions = {\n mode: options.dev ? 'development' : 'production',\n devClient: options.devClient,\n privateKeyPath: options.privateKeyPath ?? undefined,\n https: options.https,\n maxWorkers: options.maxWorkers,\n resetDevServer: options.clear,\n minify: options.minify,\n location: {\n hostType: options.host,\n scheme: options.scheme,\n },\n };\n const multiBundlerSettings = await resolvePortsAsync(projectRoot, options, settings);\n\n const optionalBundlers: Partial<PlatformBundlers> = { ...platformBundlers };\n // In the default case, we don't want to start multiple bundlers since this is\n // a bit slower. Our priority (for legacy) is native platforms.\n if (!options.web) {\n delete optionalBundlers['web'];\n }\n\n const bundlers = [...new Set(Object.values(optionalBundlers))];\n const multiBundlerStartOptions = bundlers.map((bundler) => {\n const port =\n bundler === 'webpack' ? multiBundlerSettings.webpackPort : multiBundlerSettings.metroPort;\n return {\n type: bundler,\n options: {\n ...commonOptions,\n port,\n },\n };\n });\n\n return [commonOptions, multiBundlerStartOptions];\n}\n\nexport async function startAsync(\n projectRoot: string,\n options: Options,\n settings: { webOnly?: boolean }\n) {\n Log.log(chalk.gray(`Starting project at ${projectRoot}`));\n\n setNodeEnv(options.dev ? 'development' : 'production');\n require('@expo/env').load(projectRoot);\n const { exp, pkg } = profile(getConfig)(projectRoot);\n\n const platformBundlers = getPlatformBundlers(projectRoot, exp);\n\n const [defaultOptions, startOptions] = await getMultiBundlerStartOptions(\n projectRoot,\n options,\n settings,\n platformBundlers\n );\n\n const devServerManager = new DevServerManager(projectRoot, defaultOptions);\n\n // Validations\n\n if (options.web || settings.webOnly) {\n await devServerManager.ensureProjectPrerequisiteAsync(WebSupportProjectPrerequisite);\n }\n\n // Start the server as soon as possible.\n await profile(devServerManager.startAsync.bind(devServerManager))(startOptions);\n\n if (!settings.webOnly) {\n await devServerManager.watchEnvironmentVariables();\n\n // After the server starts, we can start attempting to bootstrap TypeScript.\n await devServerManager.bootstrapTypeScriptAsync();\n }\n\n if (!settings.webOnly && !options.devClient) {\n await profile(validateDependenciesVersionsAsync)(projectRoot, exp, pkg);\n }\n\n // Some tracking thing\n\n if (options.devClient) {\n await trackAsync(projectRoot, exp);\n }\n\n // Open project on devices.\n await profile(openPlatformsAsync)(devServerManager, options);\n\n // Present the Terminal UI.\n if (isInteractive()) {\n await profile(startInterfaceAsync)(devServerManager, {\n platforms: exp.platforms ?? ['ios', 'android', 'web'],\n });\n } else {\n // Display the server location in CI...\n const url = devServerManager.getDefaultDevServer()?.getDevServerUrl();\n if (url) {\n Log.log(chalk`Waiting on {underline ${url}}`);\n }\n }\n\n // Final note about closing the server.\n const logLocation = settings.webOnly ? 'in the browser console' : 'below';\n Log.log(\n chalk`Logs for your project will appear ${logLocation}.${\n isInteractive() ? chalk.dim(` Press Ctrl+C to exit.`) : ''\n }`\n );\n}\n\nasync function trackAsync(projectRoot: string, exp: ExpoConfig): Promise<void> {\n await logEventAsync('dev client start command', {\n status: 'started',\n ...getDevClientProperties(projectRoot, exp),\n });\n installExitHooks(async () => {\n await logEventAsync('dev client start command', {\n status: 'finished',\n ...getDevClientProperties(projectRoot, exp),\n });\n // UnifiedAnalytics.flush();\n });\n}\n"],"names":["startAsync","Log","getMultiBundlerStartOptions","projectRoot","options","settings","platformBundlers","commonOptions","mode","dev","devClient","privateKeyPath","undefined","https","maxWorkers","resetDevServer","clear","minify","location","hostType","host","scheme","multiBundlerSettings","resolvePortsAsync","optionalBundlers","web","bundlers","Set","Object","values","multiBundlerStartOptions","map","bundler","port","webpackPort","metroPort","type","log","chalk","gray","setNodeEnv","require","load","exp","pkg","profile","getConfig","getPlatformBundlers","defaultOptions","startOptions","devServerManager","DevServerManager","webOnly","ensureProjectPrerequisiteAsync","WebSupportProjectPrerequisite","bind","watchEnvironmentVariables","bootstrapTypeScriptAsync","validateDependenciesVersionsAsync","trackAsync","openPlatformsAsync","isInteractive","startInterfaceAsync","platforms","url","getDefaultDevServer","getDevServerUrl","logLocation","dim","logEventAsync","status","getDevClientProperties","installExitHooks"],"mappings":"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"}
|
|
@@ -94,7 +94,7 @@ async function logEventAsync(event, properties = {}) {
|
|
|
94
94
|
}
|
|
95
95
|
const { userId , deviceId } = identifyData;
|
|
96
96
|
const commonEventProperties = {
|
|
97
|
-
source_version: "0.
|
|
97
|
+
source_version: "0.17.0",
|
|
98
98
|
source: "expo"
|
|
99
99
|
};
|
|
100
100
|
const identity = {
|
|
@@ -135,7 +135,7 @@ function getContext() {
|
|
|
135
135
|
},
|
|
136
136
|
app: {
|
|
137
137
|
name: "expo",
|
|
138
|
-
version: "0.
|
|
138
|
+
version: "0.17.0"
|
|
139
139
|
},
|
|
140
140
|
ci: ciInfo.isCI ? {
|
|
141
141
|
name: ciInfo.name,
|
package/build/src/utils/npm.js
CHANGED
|
@@ -11,6 +11,7 @@ exports.extractNpmTarballFromUrlAsync = extractNpmTarballFromUrlAsync;
|
|
|
11
11
|
exports.extractNpmTarballAsync = extractNpmTarballAsync;
|
|
12
12
|
var _spawnAsync = _interopRequireDefault(require("@expo/spawn-async"));
|
|
13
13
|
var _assert = _interopRequireDefault(require("assert"));
|
|
14
|
+
var _crypto = _interopRequireDefault(require("crypto"));
|
|
14
15
|
var _fs = _interopRequireDefault(require("fs"));
|
|
15
16
|
var _slugify = _interopRequireDefault(require("slugify"));
|
|
16
17
|
var _stream = require("stream");
|
|
@@ -86,11 +87,11 @@ const pipeline = (0, _util).promisify(_stream.Stream.pipeline);
|
|
|
86
87
|
async function downloadAndExtractNpmModuleAsync(npmName, props) {
|
|
87
88
|
const url = await getNpmUrlAsync(npmName);
|
|
88
89
|
debug("Fetch from URL:", url);
|
|
89
|
-
await extractNpmTarballFromUrlAsync(url, props);
|
|
90
|
+
return await extractNpmTarballFromUrlAsync(url, props);
|
|
90
91
|
}
|
|
91
92
|
async function extractLocalNpmTarballAsync(tarFilePath, props) {
|
|
92
93
|
const readStream = _fs.default.createReadStream(tarFilePath);
|
|
93
|
-
await extractNpmTarballAsync(readStream, props);
|
|
94
|
+
return await extractNpmTarballAsync(readStream, props);
|
|
94
95
|
}
|
|
95
96
|
async function createUrlStreamAsync(url) {
|
|
96
97
|
const response = await cachedFetch(url);
|
|
@@ -100,17 +101,24 @@ async function createUrlStreamAsync(url) {
|
|
|
100
101
|
return response.body;
|
|
101
102
|
}
|
|
102
103
|
async function extractNpmTarballFromUrlAsync(url, props) {
|
|
103
|
-
await extractNpmTarballAsync(await createUrlStreamAsync(url), props);
|
|
104
|
+
return await extractNpmTarballAsync(await createUrlStreamAsync(url), props);
|
|
104
105
|
}
|
|
105
106
|
async function extractNpmTarballAsync(stream, props) {
|
|
106
107
|
const { cwd , strip , name , fileList =[] } = props;
|
|
107
108
|
await (0, _dir).ensureDirectoryAsync(cwd);
|
|
108
|
-
|
|
109
|
+
var _checksumAlgorithm;
|
|
110
|
+
const hash = _crypto.default.createHash((_checksumAlgorithm = props.checksumAlgorithm) != null ? _checksumAlgorithm : "md5");
|
|
111
|
+
const transformStream = new _stream.PassThrough();
|
|
112
|
+
transformStream.on("data", (chunk)=>{
|
|
113
|
+
hash.update(chunk);
|
|
114
|
+
});
|
|
115
|
+
await pipeline(stream, transformStream, _tar.default.extract({
|
|
109
116
|
cwd,
|
|
110
117
|
transform: (0, _createFileTransform).createFileTransform(name),
|
|
111
118
|
onentry: (0, _createFileTransform).createEntryResolver(name),
|
|
112
119
|
strip: strip != null ? strip : 1
|
|
113
120
|
}, fileList));
|
|
121
|
+
return hash.digest("hex");
|
|
114
122
|
}
|
|
115
123
|
|
|
116
124
|
//# sourceMappingURL=npm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/utils/npm.ts"],"sourcesContent":["import { JSONValue } from '@expo/json-file';\nimport spawnAsync from '@expo/spawn-async';\nimport assert from 'assert';\nimport fs from 'fs';\nimport slugify from 'slugify';\nimport { Stream } from 'stream';\nimport tar from 'tar';\nimport { promisify } from 'util';\n\nimport { createEntryResolver, createFileTransform } from './createFileTransform';\nimport { ensureDirectoryAsync } from './dir';\nimport { CommandError } from './errors';\nimport { createCachedFetch } from '../api/rest/client';\n\nconst debug = require('debug')('expo:utils:npm') as typeof console.log;\n\nconst cachedFetch = createCachedFetch({\n cacheDirectory: 'template-cache',\n // Time to live. How long (in ms) responses remain cached before being automatically ejected. If undefined, responses are never automatically ejected from the cache.\n // ttl: 1000,\n});\n\nexport function sanitizeNpmPackageName(name: string): string {\n // https://github.com/npm/validate-npm-package-name/#naming-rules\n return (\n applyKnownNpmPackageNameRules(name) ||\n applyKnownNpmPackageNameRules(slugify(name)) ||\n // If nothing is left use 'app' like we do in Xcode projects.\n 'app'\n );\n}\n\nfunction applyKnownNpmPackageNameRules(name: string): string | null {\n // https://github.com/npm/validate-npm-package-name/#naming-rules\n\n // package name cannot start with '.' or '_'.\n while (/^(\\.|_)/.test(name)) {\n name = name.substring(1);\n }\n\n name = name.toLowerCase().replace(/[^a-zA-Z._\\-/@]/g, '');\n\n return (\n name\n // .replace(/![a-z0-9-._~]+/g, '')\n // Remove special characters\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '') || null\n );\n}\n\nexport async function npmViewAsync(...props: string[]): Promise<JSONValue> {\n const cmd = ['view', ...props, '--json'];\n const results = (await spawnAsync('npm', cmd)).stdout?.trim();\n const cmdString = `npm ${cmd.join(' ')}`;\n debug('Run:', cmdString);\n if (!results) {\n return null;\n }\n try {\n return JSON.parse(results);\n } catch (error: any) {\n throw new Error(\n `Could not parse JSON returned from \"${cmdString}\".\\n\\n${results}\\n\\nError: ${error.message}`\n );\n }\n}\n\n/** Given a package name like `expo` or `expo@beta`, return the registry URL if it exists. */\nexport async function getNpmUrlAsync(packageName: string): Promise<string> {\n const results = await npmViewAsync(packageName, 'dist.tarball');\n\n assert(results, `Could not get npm url for package \"${packageName}\"`);\n\n // Fully qualified url returns a string.\n // Example:\n // 𝝠 npm view expo-template-bare-minimum@sdk-33 dist.tarball --json\n if (typeof results === 'string') {\n return results;\n }\n\n // When the tag is arbitrary, the tarball url is an array, return the last value as it's the most recent.\n // Example:\n // 𝝠 npm view expo-template-bare-minimum@33 dist.tarball --json\n if (Array.isArray(results)) {\n return results[results.length - 1] as string;\n }\n\n throw new CommandError(\n 'Expected results of `npm view ...` to be an array or string. Instead found: ' + results\n );\n}\n\n// @ts-ignore\nconst pipeline = promisify(Stream.pipeline);\n\nexport async function downloadAndExtractNpmModuleAsync(\n npmName: string,\n props: ExtractProps\n): Promise<void> {\n const url = await getNpmUrlAsync(npmName);\n\n debug('Fetch from URL:', url);\n await extractNpmTarballFromUrlAsync(url, props);\n}\n\nexport async function extractLocalNpmTarballAsync(\n tarFilePath: string,\n props: ExtractProps\n): Promise<void> {\n const readStream = fs.createReadStream(tarFilePath);\n await extractNpmTarballAsync(readStream, props);\n}\n\ntype ExtractProps = {\n name: string;\n cwd: string;\n strip?: number;\n fileList?: string[];\n};\n\nasync function createUrlStreamAsync(url: string) {\n const response = await cachedFetch(url);\n if (!response.ok) {\n throw new Error(`Unexpected response: ${response.statusText}. From url: ${url}`);\n }\n\n return response.body;\n}\n\nexport async function extractNpmTarballFromUrlAsync(\n url: string,\n props: ExtractProps\n): Promise<void> {\n await extractNpmTarballAsync(await createUrlStreamAsync(url), props);\n}\n\nexport async function extractNpmTarballAsync(\n stream: NodeJS.ReadableStream,\n props: ExtractProps\n): Promise<void> {\n const { cwd, strip, name, fileList = [] } = props;\n\n await ensureDirectoryAsync(cwd);\n\n await pipeline(\n stream,\n tar.extract(\n {\n cwd,\n transform: createFileTransform(name),\n onentry: createEntryResolver(name),\n strip: strip ?? 1,\n },\n fileList\n )\n );\n}\n"],"names":["sanitizeNpmPackageName","npmViewAsync","getNpmUrlAsync","downloadAndExtractNpmModuleAsync","extractLocalNpmTarballAsync","extractNpmTarballFromUrlAsync","extractNpmTarballAsync","debug","require","cachedFetch","createCachedFetch","cacheDirectory","name","applyKnownNpmPackageNameRules","slugify","test","substring","toLowerCase","replace","normalize","props","cmd","results","spawnAsync","stdout","trim","cmdString","join","JSON","parse","error","Error","message","packageName","assert","Array","isArray","length","CommandError","pipeline","promisify","Stream","npmName","url","tarFilePath","readStream","fs","createReadStream","createUrlStreamAsync","response","ok","statusText","body","stream","cwd","strip","fileList","ensureDirectoryAsync","tar","extract","transform","createFileTransform","onentry","createEntryResolver"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/npm.ts"],"sourcesContent":["import { JSONValue } from '@expo/json-file';\nimport spawnAsync from '@expo/spawn-async';\nimport assert from 'assert';\nimport crypto from 'crypto';\nimport fs from 'fs';\nimport slugify from 'slugify';\nimport { PassThrough, Stream } from 'stream';\nimport tar from 'tar';\nimport { promisify } from 'util';\n\nimport { createEntryResolver, createFileTransform } from './createFileTransform';\nimport { ensureDirectoryAsync } from './dir';\nimport { CommandError } from './errors';\nimport { createCachedFetch } from '../api/rest/client';\n\nconst debug = require('debug')('expo:utils:npm') as typeof console.log;\n\nconst cachedFetch = createCachedFetch({\n cacheDirectory: 'template-cache',\n // Time to live. How long (in ms) responses remain cached before being automatically ejected. If undefined, responses are never automatically ejected from the cache.\n // ttl: 1000,\n});\n\nexport function sanitizeNpmPackageName(name: string): string {\n // https://github.com/npm/validate-npm-package-name/#naming-rules\n return (\n applyKnownNpmPackageNameRules(name) ||\n applyKnownNpmPackageNameRules(slugify(name)) ||\n // If nothing is left use 'app' like we do in Xcode projects.\n 'app'\n );\n}\n\nfunction applyKnownNpmPackageNameRules(name: string): string | null {\n // https://github.com/npm/validate-npm-package-name/#naming-rules\n\n // package name cannot start with '.' or '_'.\n while (/^(\\.|_)/.test(name)) {\n name = name.substring(1);\n }\n\n name = name.toLowerCase().replace(/[^a-zA-Z._\\-/@]/g, '');\n\n return (\n name\n // .replace(/![a-z0-9-._~]+/g, '')\n // Remove special characters\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '') || null\n );\n}\n\nexport async function npmViewAsync(...props: string[]): Promise<JSONValue> {\n const cmd = ['view', ...props, '--json'];\n const results = (await spawnAsync('npm', cmd)).stdout?.trim();\n const cmdString = `npm ${cmd.join(' ')}`;\n debug('Run:', cmdString);\n if (!results) {\n return null;\n }\n try {\n return JSON.parse(results);\n } catch (error: any) {\n throw new Error(\n `Could not parse JSON returned from \"${cmdString}\".\\n\\n${results}\\n\\nError: ${error.message}`\n );\n }\n}\n\n/** Given a package name like `expo` or `expo@beta`, return the registry URL if it exists. */\nexport async function getNpmUrlAsync(packageName: string): Promise<string> {\n const results = await npmViewAsync(packageName, 'dist.tarball');\n\n assert(results, `Could not get npm url for package \"${packageName}\"`);\n\n // Fully qualified url returns a string.\n // Example:\n // 𝝠 npm view expo-template-bare-minimum@sdk-33 dist.tarball --json\n if (typeof results === 'string') {\n return results;\n }\n\n // When the tag is arbitrary, the tarball url is an array, return the last value as it's the most recent.\n // Example:\n // 𝝠 npm view expo-template-bare-minimum@33 dist.tarball --json\n if (Array.isArray(results)) {\n return results[results.length - 1] as string;\n }\n\n throw new CommandError(\n 'Expected results of `npm view ...` to be an array or string. Instead found: ' + results\n );\n}\n\n// @ts-ignore\nconst pipeline = promisify(Stream.pipeline);\n\nexport async function downloadAndExtractNpmModuleAsync(\n npmName: string,\n props: ExtractProps\n): Promise<string> {\n const url = await getNpmUrlAsync(npmName);\n\n debug('Fetch from URL:', url);\n return await extractNpmTarballFromUrlAsync(url, props);\n}\n\nexport async function extractLocalNpmTarballAsync(\n tarFilePath: string,\n props: ExtractProps\n): Promise<string> {\n const readStream = fs.createReadStream(tarFilePath);\n return await extractNpmTarballAsync(readStream, props);\n}\n\ntype ExtractProps = {\n name: string;\n cwd: string;\n strip?: number;\n fileList?: string[];\n /** The checksum algorithm to use when verifying the tarball. */\n checksumAlgorithm?: string;\n};\n\nasync function createUrlStreamAsync(url: string) {\n const response = await cachedFetch(url);\n if (!response.ok) {\n throw new Error(`Unexpected response: ${response.statusText}. From url: ${url}`);\n }\n\n return response.body;\n}\n\nexport async function extractNpmTarballFromUrlAsync(\n url: string,\n props: ExtractProps\n): Promise<string> {\n return await extractNpmTarballAsync(await createUrlStreamAsync(url), props);\n}\n\n/**\n * Extracts a tarball stream to a directory and returns the checksum of the tarball.\n */\nexport async function extractNpmTarballAsync(\n stream: NodeJS.ReadableStream,\n props: ExtractProps\n): Promise<string> {\n const { cwd, strip, name, fileList = [] } = props;\n\n await ensureDirectoryAsync(cwd);\n\n const hash = crypto.createHash(props.checksumAlgorithm ?? 'md5');\n const transformStream = new PassThrough();\n transformStream.on('data', (chunk) => {\n hash.update(chunk);\n });\n\n await pipeline(\n stream,\n transformStream,\n tar.extract(\n {\n cwd,\n transform: createFileTransform(name),\n onentry: createEntryResolver(name),\n strip: strip ?? 1,\n },\n fileList\n )\n );\n\n return hash.digest('hex');\n}\n"],"names":["sanitizeNpmPackageName","npmViewAsync","getNpmUrlAsync","downloadAndExtractNpmModuleAsync","extractLocalNpmTarballAsync","extractNpmTarballFromUrlAsync","extractNpmTarballAsync","debug","require","cachedFetch","createCachedFetch","cacheDirectory","name","applyKnownNpmPackageNameRules","slugify","test","substring","toLowerCase","replace","normalize","props","cmd","results","spawnAsync","stdout","trim","cmdString","join","JSON","parse","error","Error","message","packageName","assert","Array","isArray","length","CommandError","pipeline","promisify","Stream","npmName","url","tarFilePath","readStream","fs","createReadStream","createUrlStreamAsync","response","ok","statusText","body","stream","cwd","strip","fileList","ensureDirectoryAsync","hash","crypto","createHash","checksumAlgorithm","transformStream","PassThrough","on","chunk","update","tar","extract","transform","createFileTransform","onentry","createEntryResolver","digest"],"mappings":"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"}
|
|
@@ -82,12 +82,18 @@ function _resolveStringOrBooleanArgs(arg, args) {
|
|
|
82
82
|
if (value.startsWith("--")) {
|
|
83
83
|
// If we ever find an argument then it must be a boolean because we are checking in reverse
|
|
84
84
|
// and removing arguments from the array if we find a string.
|
|
85
|
-
|
|
85
|
+
// We don't override arguments that are already set
|
|
86
|
+
if (!(value in settings)) {
|
|
87
|
+
settings[value] = true;
|
|
88
|
+
}
|
|
86
89
|
} else {
|
|
87
90
|
// Get the previous argument in the array.
|
|
88
91
|
const nextValue = i > 0 ? args[i - 1] : null;
|
|
89
92
|
if (nextValue && possibleArgs.includes(nextValue)) {
|
|
90
|
-
|
|
93
|
+
// We don't override arguments that are already set
|
|
94
|
+
if (!(nextValue in settings)) {
|
|
95
|
+
settings[nextValue] = value;
|
|
96
|
+
}
|
|
91
97
|
i--;
|
|
92
98
|
} else if (// If the last value is not a flag and it doesn't have a recognized flag before it (instead having a string value or nothing)
|
|
93
99
|
// then it must be the project root.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/utils/resolveArgs.ts"],"sourcesContent":["import arg, { Spec } from 'arg';\n\nimport { replaceValue } from './array';\nimport { CommandError } from './errors';\n\n/** Split up arguments that are formatted like `--foo=bar` or `-f=\"bar\"` to `['--foo', 'bar']` */\nfunction splitArgs(args: string[]): string[] {\n const result: string[] = [];\n\n for (const arg of args) {\n if (arg.startsWith('-')) {\n const [key, ...props] = arg.split('=');\n result.push(key);\n if (props.length) {\n result.push(props.join('='));\n }\n } else {\n result.push(arg);\n }\n }\n\n return result;\n}\n\n/**\n * Enables the resolution of arguments that can either be a string or a boolean.\n *\n * @param args arguments that were passed to the command.\n * @param rawMap raw map of arguments that are passed to the command.\n * @param extraArgs extra arguments and aliases that should be resolved as string or boolean.\n * @returns parsed arguments and project root.\n */\nexport async function resolveStringOrBooleanArgsAsync(\n args: string[],\n rawMap: arg.Spec,\n extraArgs: arg.Spec\n) {\n args = splitArgs(args);\n\n // Assert any missing arguments\n assertUnknownArgs(\n {\n ...rawMap,\n ...extraArgs,\n },\n args\n );\n\n // Collapse aliases into fully qualified arguments.\n args = collapseAliases(extraArgs, args);\n\n // Resolve all of the string or boolean arguments and the project root.\n return _resolveStringOrBooleanArgs({ ...rawMap, ...extraArgs }, args);\n}\n\n/**\n * Enables the resolution of boolean arguments that can be formatted like `--foo=true` or `--foo false`\n *\n * @param args arguments that were passed to the command.\n * @param rawMap raw map of arguments that are passed to the command.\n * @param extraArgs extra arguments and aliases that should be resolved as string or boolean.\n * @returns parsed arguments and project root.\n */\nexport async function resolveCustomBooleanArgsAsync(\n args: string[],\n rawMap: arg.Spec,\n extraArgs: arg.Spec\n) {\n const results = await resolveStringOrBooleanArgsAsync(args, rawMap, extraArgs);\n\n return {\n ...results,\n args: Object.fromEntries(\n Object.entries(results.args).map(([key, value]) => {\n if (extraArgs[key]) {\n if (typeof value === 'string') {\n if (!['true', 'false'].includes(value)) {\n throw new CommandError(\n 'BAD_ARGS',\n `Invalid boolean argument: ${key}=${value}. Expected one of: true, false`\n );\n }\n return [key, value === 'true'];\n }\n }\n return [key, value];\n })\n ),\n };\n}\n\nexport function _resolveStringOrBooleanArgs(arg: Spec, args: string[]) {\n // Default project root, if a custom one is defined then it will overwrite this.\n let projectRoot: string = '.';\n // The resolved arguments.\n const settings: Record<string, string | boolean | undefined> = {};\n\n // Create a list of possible arguments, this will filter out aliases.\n const possibleArgs = Object.entries(arg)\n .filter(([, value]) => typeof value !== 'string')\n .map(([key]) => key);\n\n // Loop over arguments in reverse order so we can resolve if a value belongs to a flag.\n for (let i = args.length - 1; i > -1; i--) {\n const value = args[i];\n // At this point we should have converted all aliases to fully qualified arguments.\n if (value.startsWith('--')) {\n // If we ever find an argument then it must be a boolean because we are checking in reverse\n // and removing arguments from the array if we find a string.\n settings[value] = true;\n } else {\n // Get the previous argument in the array.\n const nextValue = i > 0 ? args[i - 1] : null;\n if (nextValue && possibleArgs.includes(nextValue)) {\n settings[nextValue] = value;\n i--;\n } else if (\n // If the last value is not a flag and it doesn't have a recognized flag before it (instead having a string value or nothing)\n // then it must be the project root.\n i ===\n args.length - 1\n ) {\n projectRoot = value;\n } else {\n // This will asserts if two strings are passed in a row and not at the end of the line.\n throw new CommandError('BAD_ARGS', `Unknown argument: ${value}`);\n }\n }\n }\n\n return {\n args: settings,\n projectRoot,\n };\n}\n\n/** Convert all aliases to fully qualified flag names. */\nexport function collapseAliases(arg: Spec, args: string[]): string[] {\n const aliasMap = getAliasTuples(arg);\n\n for (const [arg, alias] of aliasMap) {\n args = replaceValue(args, arg, alias);\n }\n\n // Assert if there are duplicate flags after we collapse the aliases.\n assertDuplicateArgs(args, aliasMap);\n return args;\n}\n\n/** Assert that the spec has unknown arguments. */\nexport function assertUnknownArgs(arg: Spec, args: string[]) {\n const allowedArgs = Object.keys(arg);\n const unknownArgs = args.filter((arg) => !allowedArgs.includes(arg) && arg.startsWith('-'));\n if (unknownArgs.length > 0) {\n throw new CommandError(`Unknown arguments: ${unknownArgs.join(', ')}`);\n }\n}\n\nfunction getAliasTuples(arg: Spec): [string, string][] {\n return Object.entries(arg).filter(([, value]) => typeof value === 'string') as [string, string][];\n}\n\n/** Asserts that a duplicate flag has been used, this naively throws without knowing if an alias or flag were used as the duplicate. */\nexport function assertDuplicateArgs(args: string[], argNameAliasTuple: [string, string][]) {\n for (const [argName, argNameAlias] of argNameAliasTuple) {\n if (args.filter((a) => [argName, argNameAlias].includes(a)).length > 1) {\n throw new CommandError(\n 'BAD_ARGS',\n `Can only provide one instance of ${argName} or ${argNameAlias}`\n );\n }\n }\n}\n"],"names":["resolveStringOrBooleanArgsAsync","resolveCustomBooleanArgsAsync","_resolveStringOrBooleanArgs","collapseAliases","assertUnknownArgs","assertDuplicateArgs","splitArgs","args","result","arg","startsWith","key","props","split","push","length","join","rawMap","extraArgs","results","Object","fromEntries","entries","map","value","includes","CommandError","projectRoot","settings","possibleArgs","filter","i","nextValue","aliasMap","getAliasTuples","alias","replaceValue","allowedArgs","keys","unknownArgs","argNameAliasTuple","argName","argNameAlias","a"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/resolveArgs.ts"],"sourcesContent":["import arg, { Spec } from 'arg';\n\nimport { replaceValue } from './array';\nimport { CommandError } from './errors';\n\n/** Split up arguments that are formatted like `--foo=bar` or `-f=\"bar\"` to `['--foo', 'bar']` */\nfunction splitArgs(args: string[]): string[] {\n const result: string[] = [];\n\n for (const arg of args) {\n if (arg.startsWith('-')) {\n const [key, ...props] = arg.split('=');\n result.push(key);\n if (props.length) {\n result.push(props.join('='));\n }\n } else {\n result.push(arg);\n }\n }\n\n return result;\n}\n\n/**\n * Enables the resolution of arguments that can either be a string or a boolean.\n *\n * @param args arguments that were passed to the command.\n * @param rawMap raw map of arguments that are passed to the command.\n * @param extraArgs extra arguments and aliases that should be resolved as string or boolean.\n * @returns parsed arguments and project root.\n */\nexport async function resolveStringOrBooleanArgsAsync(\n args: string[],\n rawMap: arg.Spec,\n extraArgs: arg.Spec\n) {\n args = splitArgs(args);\n\n // Assert any missing arguments\n assertUnknownArgs(\n {\n ...rawMap,\n ...extraArgs,\n },\n args\n );\n\n // Collapse aliases into fully qualified arguments.\n args = collapseAliases(extraArgs, args);\n\n // Resolve all of the string or boolean arguments and the project root.\n return _resolveStringOrBooleanArgs({ ...rawMap, ...extraArgs }, args);\n}\n\n/**\n * Enables the resolution of boolean arguments that can be formatted like `--foo=true` or `--foo false`\n *\n * @param args arguments that were passed to the command.\n * @param rawMap raw map of arguments that are passed to the command.\n * @param extraArgs extra arguments and aliases that should be resolved as string or boolean.\n * @returns parsed arguments and project root.\n */\nexport async function resolveCustomBooleanArgsAsync(\n args: string[],\n rawMap: arg.Spec,\n extraArgs: arg.Spec\n) {\n const results = await resolveStringOrBooleanArgsAsync(args, rawMap, extraArgs);\n\n return {\n ...results,\n args: Object.fromEntries(\n Object.entries(results.args).map(([key, value]) => {\n if (extraArgs[key]) {\n if (typeof value === 'string') {\n if (!['true', 'false'].includes(value)) {\n throw new CommandError(\n 'BAD_ARGS',\n `Invalid boolean argument: ${key}=${value}. Expected one of: true, false`\n );\n }\n return [key, value === 'true'];\n }\n }\n return [key, value];\n })\n ),\n };\n}\n\nexport function _resolveStringOrBooleanArgs(arg: Spec, args: string[]) {\n // Default project root, if a custom one is defined then it will overwrite this.\n let projectRoot: string = '.';\n // The resolved arguments.\n const settings: Record<string, string | boolean | undefined> = {};\n\n // Create a list of possible arguments, this will filter out aliases.\n const possibleArgs = Object.entries(arg)\n .filter(([, value]) => typeof value !== 'string')\n .map(([key]) => key);\n\n // Loop over arguments in reverse order so we can resolve if a value belongs to a flag.\n for (let i = args.length - 1; i > -1; i--) {\n const value = args[i];\n // At this point we should have converted all aliases to fully qualified arguments.\n if (value.startsWith('--')) {\n // If we ever find an argument then it must be a boolean because we are checking in reverse\n // and removing arguments from the array if we find a string.\n // We don't override arguments that are already set\n if (!(value in settings)) {\n settings[value] = true;\n }\n } else {\n // Get the previous argument in the array.\n const nextValue = i > 0 ? args[i - 1] : null;\n if (nextValue && possibleArgs.includes(nextValue)) {\n // We don't override arguments that are already set\n if (!(nextValue in settings)) {\n settings[nextValue] = value;\n }\n i--;\n } else if (\n // If the last value is not a flag and it doesn't have a recognized flag before it (instead having a string value or nothing)\n // then it must be the project root.\n i ===\n args.length - 1\n ) {\n projectRoot = value;\n } else {\n // This will asserts if two strings are passed in a row and not at the end of the line.\n throw new CommandError('BAD_ARGS', `Unknown argument: ${value}`);\n }\n }\n }\n\n return {\n args: settings,\n projectRoot,\n };\n}\n\n/** Convert all aliases to fully qualified flag names. */\nexport function collapseAliases(arg: Spec, args: string[]): string[] {\n const aliasMap = getAliasTuples(arg);\n\n for (const [arg, alias] of aliasMap) {\n args = replaceValue(args, arg, alias);\n }\n\n // Assert if there are duplicate flags after we collapse the aliases.\n assertDuplicateArgs(args, aliasMap);\n return args;\n}\n\n/** Assert that the spec has unknown arguments. */\nexport function assertUnknownArgs(arg: Spec, args: string[]) {\n const allowedArgs = Object.keys(arg);\n const unknownArgs = args.filter((arg) => !allowedArgs.includes(arg) && arg.startsWith('-'));\n if (unknownArgs.length > 0) {\n throw new CommandError(`Unknown arguments: ${unknownArgs.join(', ')}`);\n }\n}\n\nfunction getAliasTuples(arg: Spec): [string, string][] {\n return Object.entries(arg).filter(([, value]) => typeof value === 'string') as [string, string][];\n}\n\n/** Asserts that a duplicate flag has been used, this naively throws without knowing if an alias or flag were used as the duplicate. */\nexport function assertDuplicateArgs(args: string[], argNameAliasTuple: [string, string][]) {\n for (const [argName, argNameAlias] of argNameAliasTuple) {\n if (args.filter((a) => [argName, argNameAlias].includes(a)).length > 1) {\n throw new CommandError(\n 'BAD_ARGS',\n `Can only provide one instance of ${argName} or ${argNameAlias}`\n );\n }\n }\n}\n"],"names":["resolveStringOrBooleanArgsAsync","resolveCustomBooleanArgsAsync","_resolveStringOrBooleanArgs","collapseAliases","assertUnknownArgs","assertDuplicateArgs","splitArgs","args","result","arg","startsWith","key","props","split","push","length","join","rawMap","extraArgs","results","Object","fromEntries","entries","map","value","includes","CommandError","projectRoot","settings","possibleArgs","filter","i","nextValue","aliasMap","getAliasTuples","alias","replaceValue","allowedArgs","keys","unknownArgs","argNameAliasTuple","argName","argNameAlias","a"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@expo/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.17.0",
|
|
4
4
|
"description": "The Expo CLI",
|
|
5
5
|
"main": "build/bin/cli",
|
|
6
6
|
"bin": {
|
|
@@ -51,7 +51,6 @@
|
|
|
51
51
|
"@expo/plist": "^0.1.0",
|
|
52
52
|
"@expo/prebuild-config": "6.7.3",
|
|
53
53
|
"@expo/rudder-sdk-node": "1.1.1",
|
|
54
|
-
"@expo/server": "^0.3.0",
|
|
55
54
|
"@expo/spawn-async": "1.5.0",
|
|
56
55
|
"@expo/xcpretty": "^4.3.0",
|
|
57
56
|
"@react-native/dev-middleware": "^0.73.6",
|
|
@@ -120,6 +119,7 @@
|
|
|
120
119
|
"devDependencies": {
|
|
121
120
|
"@expo/multipart-body-parser": "^1.0.0",
|
|
122
121
|
"@expo/ngrok": "4.1.3",
|
|
122
|
+
"@expo/server": "^0.3.0",
|
|
123
123
|
"@expo/webpack-config": "^0.17.4",
|
|
124
124
|
"@graphql-codegen/cli": "2.16.3",
|
|
125
125
|
"@graphql-codegen/typescript": "2.8.7",
|
|
@@ -164,5 +164,5 @@
|
|
|
164
164
|
"tree-kill": "^1.2.2",
|
|
165
165
|
"tsd": "^0.28.1"
|
|
166
166
|
},
|
|
167
|
-
"gitHead": "
|
|
167
|
+
"gitHead": "102899632731658eecba006c0d1c79b98ba8f5f7"
|
|
168
168
|
}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
exports.remoteDevtoolsCorsMiddleware = remoteDevtoolsCorsMiddleware;
|
|
6
|
-
var _url = require("url");
|
|
7
|
-
function remoteDevtoolsCorsMiddleware(req, res, next) {
|
|
8
|
-
if (req.url) {
|
|
9
|
-
var ref;
|
|
10
|
-
const url = (0, _url).parse(req.url);
|
|
11
|
-
const origin = req.headers.origin;
|
|
12
|
-
const isValidOrigin = origin && [
|
|
13
|
-
"devtools://devtools",
|
|
14
|
-
"https://chrome-devtools-frontend.appspot.com"
|
|
15
|
-
].includes(origin);
|
|
16
|
-
if (((ref = url.pathname) == null ? void 0 : ref.endsWith(".map")) && origin && isValidOrigin) {
|
|
17
|
-
res.setHeader("Access-Control-Allow-Origin", origin);
|
|
18
|
-
// Prevent metro overwrite Access-Control-Allow-Origin header
|
|
19
|
-
const setHeader = res.setHeader.bind(res);
|
|
20
|
-
res.setHeader = (key, ...args)=>{
|
|
21
|
-
if (key !== "Access-Control-Allow-Origin") {
|
|
22
|
-
setHeader(key, ...args);
|
|
23
|
-
}
|
|
24
|
-
return res;
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
next();
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
//# sourceMappingURL=remoteDevtoolsCorsMiddleware.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/start/server/middleware/remoteDevtoolsCorsMiddleware.ts"],"sourcesContent":["import type { IncomingMessage, ServerResponse } from 'http';\nimport { parse as parseUrl } from 'url';\n\n// Middleware that accepts multiple Access-Control-Allow-Origin for processing *.map.\n// This is a hook middleware before metro processing *.map,\n// which originally allow only devtools://devtools\nexport function remoteDevtoolsCorsMiddleware(\n req: IncomingMessage,\n res: ServerResponse,\n next: (err?: Error) => void\n) {\n if (req.url) {\n const url = parseUrl(req.url);\n const origin = req.headers.origin;\n const isValidOrigin =\n origin &&\n ['devtools://devtools', 'https://chrome-devtools-frontend.appspot.com'].includes(origin);\n if (url.pathname?.endsWith('.map') && origin && isValidOrigin) {\n res.setHeader('Access-Control-Allow-Origin', origin);\n\n // Prevent metro overwrite Access-Control-Allow-Origin header\n const setHeader = res.setHeader.bind(res);\n res.setHeader = (key, ...args) => {\n if (key !== 'Access-Control-Allow-Origin') {\n setHeader(key, ...args);\n }\n return res;\n };\n }\n }\n next();\n}\n"],"names":["remoteDevtoolsCorsMiddleware","req","res","next","url","parseUrl","origin","headers","isValidOrigin","includes","pathname","endsWith","setHeader","bind","key","args"],"mappings":"AAAA;;;;QAMgBA,4BAA4B,GAA5BA,4BAA4B;AALV,IAAA,IAAK,WAAL,KAAK,CAAA;AAKhC,SAASA,4BAA4B,CAC1CC,GAAoB,EACpBC,GAAmB,EACnBC,IAA2B,EAC3B;IACA,IAAIF,GAAG,CAACG,GAAG,EAAE;YAMPA,GAAY;QALhB,MAAMA,GAAG,GAAGC,CAAAA,GAAAA,IAAQ,AAAS,CAAA,MAAT,CAACJ,GAAG,CAACG,GAAG,CAAC,AAAC;QAC9B,MAAME,MAAM,GAAGL,GAAG,CAACM,OAAO,CAACD,MAAM,AAAC;QAClC,MAAME,aAAa,GACjBF,MAAM,IACN;YAAC,qBAAqB;YAAE,8CAA8C;SAAC,CAACG,QAAQ,CAACH,MAAM,CAAC,AAAC;QAC3F,IAAIF,CAAAA,CAAAA,GAAY,GAAZA,GAAG,CAACM,QAAQ,SAAU,GAAtBN,KAAAA,CAAsB,GAAtBA,GAAY,CAAEO,QAAQ,CAAC,MAAM,CAAC,KAAIL,MAAM,IAAIE,aAAa,EAAE;YAC7DN,GAAG,CAACU,SAAS,CAAC,6BAA6B,EAAEN,MAAM,CAAC,CAAC;YAErD,6DAA6D;YAC7D,MAAMM,SAAS,GAAGV,GAAG,CAACU,SAAS,CAACC,IAAI,CAACX,GAAG,CAAC,AAAC;YAC1CA,GAAG,CAACU,SAAS,GAAG,CAACE,GAAG,EAAKC,GAAAA,IAAI,GAAK;gBAChC,IAAID,GAAG,KAAK,6BAA6B,EAAE;oBACzCF,SAAS,CAACE,GAAG,KAAKC,IAAI,CAAC,CAAC;iBACzB;gBACD,OAAOb,GAAG,CAAC;aACZ,CAAC;SACH;KACF;IACDC,IAAI,EAAE,CAAC;CACR"}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
exports.remoteDevtoolsSecurityHeadersMiddleware = remoteDevtoolsSecurityHeadersMiddleware;
|
|
6
|
-
function remoteDevtoolsSecurityHeadersMiddleware(req, res, next) {
|
|
7
|
-
// Block any cross origin request.
|
|
8
|
-
if (typeof req.headers.origin === "string" && !req.headers.origin.match(/^https?:\/\/localhost:/) && !req.headers.origin.match(/^https:\/\/chrome-devtools-frontend\.appspot\.com/)) {
|
|
9
|
-
next(new Error(`Unauthorized request from ${req.headers.origin}. ` + "This may happen because of a conflicting browser extension to intercept HTTP requests. " + "Please try again without browser extensions or using incognito mode."));
|
|
10
|
-
return;
|
|
11
|
-
}
|
|
12
|
-
// Block MIME-type sniffing.
|
|
13
|
-
res.setHeader("X-Content-Type-Options", "nosniff");
|
|
14
|
-
next();
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
//# sourceMappingURL=remoteDevtoolsSecurityHeadersMiddleware.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/start/server/middleware/remoteDevtoolsSecurityHeadersMiddleware.ts"],"sourcesContent":["import type { IncomingMessage, ServerResponse } from 'http';\n\n// Like securityHeadersMiddleware but further allow cross-origin requests\n// from https://chrome-devtools-frontend.appspot.com/\nexport function remoteDevtoolsSecurityHeadersMiddleware(\n req: IncomingMessage,\n res: ServerResponse,\n next: (err?: Error) => void\n) {\n // Block any cross origin request.\n if (\n typeof req.headers.origin === 'string' &&\n !req.headers.origin.match(/^https?:\\/\\/localhost:/) &&\n !req.headers.origin.match(/^https:\\/\\/chrome-devtools-frontend\\.appspot\\.com/)\n ) {\n next(\n new Error(\n `Unauthorized request from ${req.headers.origin}. ` +\n 'This may happen because of a conflicting browser extension to intercept HTTP requests. ' +\n 'Please try again without browser extensions or using incognito mode.'\n )\n );\n return;\n }\n\n // Block MIME-type sniffing.\n res.setHeader('X-Content-Type-Options', 'nosniff');\n\n next();\n}\n"],"names":["remoteDevtoolsSecurityHeadersMiddleware","req","res","next","headers","origin","match","Error","setHeader"],"mappings":"AAAA;;;;QAIgBA,uCAAuC,GAAvCA,uCAAuC;AAAhD,SAASA,uCAAuC,CACrDC,GAAoB,EACpBC,GAAmB,EACnBC,IAA2B,EAC3B;IACA,kCAAkC;IAClC,IACE,OAAOF,GAAG,CAACG,OAAO,CAACC,MAAM,KAAK,QAAQ,IACtC,CAACJ,GAAG,CAACG,OAAO,CAACC,MAAM,CAACC,KAAK,0BAA0B,IACnD,CAACL,GAAG,CAACG,OAAO,CAACC,MAAM,CAACC,KAAK,qDAAqD,EAC9E;QACAH,IAAI,CACF,IAAII,KAAK,CACP,CAAC,0BAA0B,EAAEN,GAAG,CAACG,OAAO,CAACC,MAAM,CAAC,EAAE,CAAC,GACjD,yFAAyF,GACzF,sEAAsE,CACzE,CACF,CAAC;QACF,OAAO;KACR;IAED,4BAA4B;IAC5BH,GAAG,CAACM,SAAS,CAAC,wBAAwB,EAAE,SAAS,CAAC,CAAC;IAEnDL,IAAI,EAAE,CAAC;CACR"}
|