@expo/cli 0.16.7 → 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.
Files changed (67) hide show
  1. package/build/bin/cli +4 -3
  2. package/build/bin/cli.map +1 -1
  3. package/build/src/customize/customizeAsync.js +2 -1
  4. package/build/src/customize/customizeAsync.js.map +1 -1
  5. package/build/src/customize/typescript.js +1 -1
  6. package/build/src/customize/typescript.js.map +1 -1
  7. package/build/src/export/resolveOptions.js +7 -5
  8. package/build/src/export/resolveOptions.js.map +1 -1
  9. package/build/src/export/web/exportWebAsync.js +1 -1
  10. package/build/src/export/web/exportWebAsync.js.map +1 -1
  11. package/build/src/export/web/index.js +1 -1
  12. package/build/src/export/web/index.js.map +1 -1
  13. package/build/src/install/installAsync.js +1 -5
  14. package/build/src/install/installAsync.js.map +1 -1
  15. package/build/src/prebuild/configureProjectAsync.js +7 -1
  16. package/build/src/prebuild/configureProjectAsync.js.map +1 -1
  17. package/build/src/prebuild/prebuildAsync.js +3 -2
  18. package/build/src/prebuild/prebuildAsync.js.map +1 -1
  19. package/build/src/prebuild/resolveTemplate.js +41 -48
  20. package/build/src/prebuild/resolveTemplate.js.map +1 -1
  21. package/build/src/prebuild/updateFromTemplate.js +9 -8
  22. package/build/src/prebuild/updateFromTemplate.js.map +1 -1
  23. package/build/src/start/doctor/dependencies/ensureDependenciesAsync.js +4 -12
  24. package/build/src/start/doctor/dependencies/ensureDependenciesAsync.js.map +1 -1
  25. package/build/src/start/doctor/web/WebSupportProjectPrerequisite.js +6 -1
  26. package/build/src/start/doctor/web/WebSupportProjectPrerequisite.js.map +1 -1
  27. package/build/src/start/platforms/android/ADBServer.js +7 -0
  28. package/build/src/start/platforms/android/ADBServer.js.map +1 -1
  29. package/build/src/start/platforms/android/adb.js +4 -3
  30. package/build/src/start/platforms/android/adb.js.map +1 -1
  31. package/build/src/start/server/DevServerManager.js +2 -2
  32. package/build/src/start/server/DevServerManager.js.map +1 -1
  33. package/build/src/start/server/metro/MetroBundlerDevServer.js +30 -18
  34. package/build/src/start/server/metro/MetroBundlerDevServer.js.map +1 -1
  35. package/build/src/start/server/metro/createServerRouteMiddleware.js +18 -7
  36. package/build/src/start/server/metro/createServerRouteMiddleware.js.map +1 -1
  37. package/build/src/start/server/metro/instantiateMetro.js +5 -7
  38. package/build/src/start/server/metro/instantiateMetro.js.map +1 -1
  39. package/build/src/start/server/metro/router.js +17 -0
  40. package/build/src/start/server/metro/router.js.map +1 -1
  41. package/build/src/start/server/metro/waitForMetroToObserveTypeScriptFile.js +1 -1
  42. package/build/src/start/server/metro/waitForMetroToObserveTypeScriptFile.js.map +1 -1
  43. package/build/src/start/server/metro/withMetroMultiPlatform.js +7 -4
  44. package/build/src/start/server/metro/withMetroMultiPlatform.js.map +1 -1
  45. package/build/src/start/server/middleware/CorsMiddleware.js +55 -0
  46. package/build/src/start/server/middleware/CorsMiddleware.js.map +1 -0
  47. package/build/src/start/server/middleware/ManifestMiddleware.js +5 -5
  48. package/build/src/start/server/middleware/ManifestMiddleware.js.map +1 -1
  49. package/build/src/start/server/platformBundlers.js +18 -5
  50. package/build/src/start/server/platformBundlers.js.map +1 -1
  51. package/build/src/start/server/type-generation/__typetests__/fixtures/basic.js.map +1 -1
  52. package/build/src/start/server/type-generation/routes.js +1 -1
  53. package/build/src/start/server/type-generation/routes.js.map +1 -1
  54. package/build/src/start/startAsync.js +1 -1
  55. package/build/src/start/startAsync.js.map +1 -1
  56. package/build/src/utils/analytics/rudderstackClient.js +2 -2
  57. package/build/src/utils/env.js +3 -0
  58. package/build/src/utils/env.js.map +1 -1
  59. package/build/src/utils/npm.js +12 -4
  60. package/build/src/utils/npm.js.map +1 -1
  61. package/build/src/utils/resolveArgs.js +8 -2
  62. package/build/src/utils/resolveArgs.js.map +1 -1
  63. package/package.json +3 -3
  64. package/build/src/start/server/middleware/remoteDevtoolsCorsMiddleware.js +0 -31
  65. package/build/src/start/server/middleware/remoteDevtoolsCorsMiddleware.js.map +0 -1
  66. package/build/src/start/server/middleware/remoteDevtoolsSecurityHeadersMiddleware.js +0 -17
  67. package/build/src/start/server/middleware/remoteDevtoolsSecurityHeadersMiddleware.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/server/type-generation/routes.ts"],"sourcesContent":["import fs from 'fs/promises';\nimport debounce from 'lodash.debounce';\nimport { Server } from 'metro';\nimport path from 'path';\n\nimport { directoryExistsAsync } from '../../../utils/dir';\nimport { unsafeTemplate } from '../../../utils/template';\nimport { ServerLike } from '../BundlerDevServer';\nimport { metroWatchTypeScriptFiles } from '../metro/metroWatchTypeScriptFiles';\n\n// /test/[...param1]/[param2]/[param3] - captures [\"param1\", \"param2\", \"param3\"]\nexport const CAPTURE_DYNAMIC_PARAMS = /\\[(?:\\.{3})?(\\w*?)[\\]$]/g;\n// /[...param1]/ - Match [...param1]\nexport const CATCH_ALL = /\\[\\.\\.\\..+?\\]/g;\n// /[param1] - Match [param1]\nexport const SLUG = /\\[.+?\\]/g;\n// /(group1,group2,group3)/test - match (group1,group2,group3)\nexport const ARRAY_GROUP_REGEX = /\\(\\s*\\w[\\w\\s]*?,.*?\\)/g;\n// /(group1,group2,group3)/test - captures [\"group1\", \"group2\", \"group3\"]\nexport const CAPTURE_GROUP_REGEX = /[\\\\(,]\\s*(\\w[\\w\\s]*?)\\s*(?=[,\\\\)])/g;\n/**\n * Match:\n * - _layout files, +html, +not-found, string+api, etc\n * - Routes can still use `+`, but it cannot be in the last segment.\n */\nexport const TYPED_ROUTES_EXCLUSION_REGEX = /(_layout|[^/]*?\\+[^/]*?)\\.[tj]sx?$/;\n\nexport interface SetupTypedRoutesOptions {\n server?: ServerLike;\n metro?: Server | null;\n typesDirectory: string;\n projectRoot: string;\n /** Absolute expo router routes directory. */\n routerDirectory: string;\n}\n\nexport async function setupTypedRoutes({\n server,\n metro,\n typesDirectory,\n projectRoot,\n routerDirectory,\n}: SetupTypedRoutesOptions) {\n const { filePathToRoute, staticRoutes, dynamicRoutes, addFilePath, isRouteFile } =\n getTypedRoutesUtils(routerDirectory);\n\n if (metro && server) {\n // Setup out watcher first\n metroWatchTypeScriptFiles({\n projectRoot,\n server,\n metro,\n eventTypes: ['add', 'delete', 'change'],\n async callback({ filePath, type }) {\n if (!isRouteFile(filePath)) {\n return;\n }\n\n let shouldRegenerate = false;\n\n if (type === 'delete') {\n const route = filePathToRoute(filePath);\n staticRoutes.delete(route);\n dynamicRoutes.delete(route);\n shouldRegenerate = true;\n } else {\n shouldRegenerate = addFilePath(filePath);\n }\n\n if (shouldRegenerate) {\n regenerateRouterDotTS(\n typesDirectory,\n new Set([...staticRoutes.values()].flatMap((v) => Array.from(v))),\n new Set([...dynamicRoutes.values()].flatMap((v) => Array.from(v))),\n new Set(dynamicRoutes.keys())\n );\n }\n },\n });\n }\n\n if (await directoryExistsAsync(routerDirectory)) {\n // Do we need to walk the entire tree on startup?\n // Idea: Store the list of files in the last write, then simply check Git for what files have changed\n await walk(routerDirectory, addFilePath);\n }\n\n regenerateRouterDotTS(\n typesDirectory,\n new Set([...staticRoutes.values()].flatMap((v) => Array.from(v))),\n new Set([...dynamicRoutes.values()].flatMap((v) => Array.from(v))),\n new Set(dynamicRoutes.keys())\n );\n}\n\n/**\n * Generate a router.d.ts file that contains all of the routes in the project.\n * Should be debounced as its very common for developers to make changes to multiple files at once (eg Save All)\n */\nconst regenerateRouterDotTS = debounce(\n async (\n typesDir: string,\n staticRoutes: Set<string>,\n dynamicRoutes: Set<string>,\n dynamicRouteTemplates: Set<string>\n ) => {\n await fs.mkdir(typesDir, { recursive: true });\n await fs.writeFile(\n path.resolve(typesDir, './router.d.ts'),\n getTemplateString(staticRoutes, dynamicRoutes, dynamicRouteTemplates)\n );\n },\n 100\n);\n\n/*\n * This is exported for testing purposes\n */\nexport function getTemplateString(\n staticRoutes: Set<string>,\n dynamicRoutes: Set<string>,\n dynamicRouteTemplates: Set<string>\n) {\n return routerDotTSTemplate({\n staticRoutes: setToUnionType(staticRoutes),\n dynamicRoutes: setToUnionType(dynamicRoutes),\n dynamicRouteParams: setToUnionType(dynamicRouteTemplates),\n });\n}\n\n/**\n * Utility functions for typed routes\n *\n * These are extracted for easier testing\n */\nexport function getTypedRoutesUtils(appRoot: string, filePathSeperator = path.sep) {\n /*\n * staticRoutes are a map where the key if the route without groups and the value\n * is another set of all group versions of the route. e.g,\n * Map([\n * [\"/\", [\"/(app)/(notes)\", \"/(app)/(profile)\"]\n * ])\n */\n const staticRoutes = new Map<string, Set<string>>([['/', new Set('/')]]);\n /*\n * dynamicRoutes are the same as staticRoutes (key if the resolved route,\n * and the value is a set of possible routes). e.g:\n *\n * /[...fruits] -> /${CatchAllRoutePart<T>}\n * /color/[color] -> /color/${SingleRoutePart<T>}\n *\n * The keys of this map are also important, as they can be used as \"static\" types\n * <Link href={{ pathname: \"/[...fruits]\",params: { fruits: [\"apple\"] } }} />\n */\n const dynamicRoutes = new Map<string, Set<string>>();\n\n function normalizedFilePath(filePath: string) {\n return filePath.replaceAll(filePathSeperator, '/');\n }\n\n const normalizedAppRoot = normalizedFilePath(appRoot);\n\n const filePathToRoute = (filePath: string) => {\n return normalizedFilePath(filePath)\n .replace(normalizedAppRoot, '')\n .replace(/index\\.[jt]sx?/, '')\n .replace(/\\.[jt]sx?$/, '');\n };\n\n const isRouteFile = (filePath: string) => {\n if (filePath.match(TYPED_ROUTES_EXCLUSION_REGEX)) {\n return false;\n }\n\n // Route files must be nested with in the appRoot\n const relative = path.relative(appRoot, filePath);\n return relative && !relative.startsWith('..') && !path.isAbsolute(relative);\n };\n\n const addFilePath = (filePath: string): boolean => {\n if (!isRouteFile(filePath)) {\n return false;\n }\n\n const route = filePathToRoute(filePath);\n\n // We have already processed this file\n if (staticRoutes.has(route) || dynamicRoutes.has(route)) {\n return false;\n }\n\n const dynamicParams = new Set(\n [...route.matchAll(CAPTURE_DYNAMIC_PARAMS)].map((match) => match[1])\n );\n const isDynamic = dynamicParams.size > 0;\n\n const addRoute = (originalRoute: string, route: string) => {\n if (isDynamic) {\n let set = dynamicRoutes.get(originalRoute);\n\n if (!set) {\n set = new Set();\n dynamicRoutes.set(originalRoute, set);\n }\n\n set.add(\n route\n .replaceAll(CATCH_ALL, '${CatchAllRoutePart<T>}')\n .replaceAll(SLUG, '${SingleRoutePart<T>}')\n );\n } else {\n let set = staticRoutes.get(originalRoute);\n\n if (!set) {\n set = new Set();\n staticRoutes.set(originalRoute, set);\n }\n\n set.add(route);\n }\n };\n\n if (!route.match(ARRAY_GROUP_REGEX)) {\n addRoute(route, route);\n }\n\n // Does this route have a group? eg /(group)\n if (route.includes('/(')) {\n const routeWithoutGroups = route.replace(/\\/\\(.+?\\)/g, '');\n addRoute(route, routeWithoutGroups);\n\n // If there are multiple groups, we need to expand them\n // eg /(test1,test2)/page => /test1/page & /test2/page\n for (const routeWithSingleGroup of extrapolateGroupRoutes(route)) {\n addRoute(route, routeWithSingleGroup);\n }\n }\n\n return true;\n };\n\n return {\n staticRoutes,\n dynamicRoutes,\n filePathToRoute,\n addFilePath,\n isRouteFile,\n };\n}\n\nexport const setToUnionType = <T>(set: Set<T>) => {\n return set.size > 0 ? [...set].map((s) => `\\`${s}\\``).join(' | ') : 'never';\n};\n\n/**\n * Recursively walk a directory and call the callback with the file path.\n */\nasync function walk(directory: string, callback: (filePath: string) => void) {\n const files = await fs.readdir(directory);\n for (const file of files) {\n const p = path.join(directory, file);\n if ((await fs.stat(p)).isDirectory()) {\n await walk(p, callback);\n } else {\n // Normalise the paths so they are easier to convert to URLs\n const normalizedPath = p.replaceAll(path.sep, '/');\n callback(normalizedPath);\n }\n }\n}\n\n/**\n * Given a route, return all possible routes that could be generated from it.\n */\nexport function extrapolateGroupRoutes(\n route: string,\n routes: Set<string> = new Set()\n): Set<string> {\n // Create a version with no groups. We will then need to cleanup double and/or trailing slashes\n routes.add(route.replaceAll(ARRAY_GROUP_REGEX, '').replaceAll(/\\/+/g, '/').replace(/\\/$/, ''));\n\n const match = route.match(ARRAY_GROUP_REGEX);\n\n if (!match) {\n routes.add(route);\n return routes;\n }\n\n const groupsMatch = match[0];\n\n for (const group of groupsMatch.matchAll(CAPTURE_GROUP_REGEX)) {\n extrapolateGroupRoutes(route.replace(groupsMatch, `(${group[1].trim()})`), routes);\n }\n\n return routes;\n}\n\n/**\n * NOTE: This code refers to a specific version of `expo-router` and is therefore unsafe to\n * mix with arbitrary versions.\n * TODO: Version this code with `expo-router` or version expo-router with `@expo/cli`.\n */\nconst routerDotTSTemplate = unsafeTemplate`/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable import/export */\n/* eslint-disable @typescript-eslint/ban-types */\ndeclare module \"expo-router\" {\n import type { LinkProps as OriginalLinkProps } from 'expo-router/build/link/Link';\n import type { Router as OriginalRouter } from 'expo-router/build/types';\n export * from 'expo-router/build';\n\n // prettier-ignore\n type StaticRoutes = ${'staticRoutes'};\n // prettier-ignore\n type DynamicRoutes<T extends string> = ${'dynamicRoutes'};\n // prettier-ignore\n type DynamicRouteTemplate = ${'dynamicRouteParams'};\n\n type RelativePathString = \\`./\\${string}\\` | \\`../\\${string}\\` | '..';\n type AbsoluteRoute = DynamicRouteTemplate | StaticRoutes;\n type ExternalPathString = \\`\\${string}:\\${string}\\`;\n\n type ExpoRouterRoutes = DynamicRouteTemplate | StaticRoutes | RelativePathString;\n type AllRoutes = ExpoRouterRoutes | ExternalPathString;\n\n /****************\n * Route Utils *\n ****************/\n\n type SearchOrHash = \\`?\\${string}\\` | \\`#\\${string}\\`;\n type UnknownInputParams = Record<string, string | number | (string | number)[]>;\n type UnknownOutputParams = Record<string, string | string[]>;\n\n /**\n * Return only the RoutePart of a string. If the string has multiple parts return never\n *\n * string | type\n * ---------|------\n * 123 | 123\n * /123/abc | never\n * 123?abc | never\n * ./123 | never\n * /123 | never\n * 123/../ | never\n */\n type SingleRoutePart<S extends string> = S extends \\`\\${string}/\\${string}\\`\n ? never\n : S extends \\`\\${string}\\${SearchOrHash}\\`\n ? never\n : S extends ''\n ? never\n : S extends \\`(\\${string})\\`\n ? never\n : S extends \\`[\\${string}]\\`\n ? never\n : S;\n\n /**\n * Return only the CatchAll router part. If the string has search parameters or a hash return never\n */\n type CatchAllRoutePart<S extends string> = S extends \\`\\${string}\\${SearchOrHash}\\`\n ? never\n : S extends ''\n ? never\n : S extends \\`\\${string}(\\${string})\\${string}\\`\n ? never\n : S extends \\`\\${string}[\\${string}]\\${string}\\`\n ? never\n : S;\n\n // type OptionalCatchAllRoutePart<S extends string> = S extends \\`\\${string}\\${SearchOrHash}\\` ? never : S\n\n /**\n * Return the name of a route parameter\n * '[test]' -> 'test'\n * 'test' -> never\n * '[...test]' -> '...test'\n */\n type IsParameter<Part> = Part extends \\`[\\${infer ParamName}]\\` ? ParamName : never;\n\n /**\n * Return a union of all parameter names. If there are no names return never\n *\n * /[test] -> 'test'\n * /[abc]/[...def] -> 'abc'|'...def'\n */\n type ParameterNames<Path> = Path extends \\`\\${infer PartA}/\\${infer PartB}\\`\n ? IsParameter<PartA> | ParameterNames<PartB>\n : IsParameter<Path>;\n\n /**\n * Returns all segements of a route.\n *\n * /(group)/123/abc/[id]/[...rest] -> ['(group)', '123', 'abc', '[id]', '[...rest]'\n */\n type RouteSegments<Path> = Path extends \\`\\${infer PartA}/\\${infer PartB}\\`\n ? PartA extends '' | '.'\n ? [...RouteSegments<PartB>]\n : [PartA, ...RouteSegments<PartB>]\n : Path extends ''\n ? []\n : [Path];\n\n /**\n * Returns a Record of the routes parameters as strings and CatchAll parameters\n *\n * There are two versions, input and output, as you can input 'string | number' but\n * the output will always be 'string'\n *\n * /[id]/[...rest] -> { id: string, rest: string[] }\n * /no-params -> {}\n */\n type InputRouteParams<Path> = {\n [Key in ParameterNames<Path> as Key extends \\`...\\${infer Name}\\`\n ? Name\n : Key]: Key extends \\`...\\${string}\\` ? (string | number)[] : string | number;\n } & UnknownInputParams;\n\n type OutputRouteParams<Path> = {\n [Key in ParameterNames<Path> as Key extends \\`...\\${infer Name}\\`\n ? Name\n : Key]: Key extends \\`...\\${string}\\` ? string[] : string;\n } & UnknownOutputParams;\n\n /**\n * Returns the search parameters for a route.\n */\n export type SearchParams<T extends AllRoutes> = T extends DynamicRouteTemplate\n ? OutputRouteParams<T>\n : T extends StaticRoutes\n ? never\n : UnknownOutputParams;\n\n /**\n * Route is mostly used as part of Href to ensure that a valid route is provided\n *\n * Given a dynamic route, this will return never. This is helpful for conditional logic\n *\n * /test -> /test, /test2, etc\n * /test/[abc] -> never\n * /test/resolve -> /test, /test2, etc\n *\n * Note that if we provide a value for [abc] then the route is allowed\n *\n * This is named Route to prevent confusion, as users they will often see it in tooltips\n */\n export type Route<T> = T extends string\n ? T extends DynamicRouteTemplate\n ? never\n :\n | StaticRoutes\n | RelativePathString\n | ExternalPathString\n | (T extends \\`\\${infer P}\\${SearchOrHash}\\`\n ? P extends DynamicRoutes<infer _>\n ? T\n : never\n : T extends DynamicRoutes<infer _>\n ? T\n : never)\n : never;\n\n /*********\n * Href *\n *********/\n\n export type Href<T> = T extends Record<'pathname', string> ? HrefObject<T> : Route<T>;\n\n export type HrefObject<\n R extends Record<'pathname', string>,\n P = R['pathname'],\n > = P extends DynamicRouteTemplate\n ? { pathname: P; params: InputRouteParams<P> }\n : P extends Route<P>\n ? { pathname: Route<P> | DynamicRouteTemplate; params?: never | InputRouteParams<never> }\n : never;\n\n /***********************\n * Expo Router Exports *\n ***********************/\n\n export type Router = Omit<OriginalRouter, 'push' | 'replace' | 'setParams'> & {\n /** Navigate to the provided href. */\n push: <T>(href: Href<T>) => void;\n /** Navigate to route without appending to the history. */\n replace: <T>(href: Href<T>) => void;\n /** Update the current route query params. */\n setParams: <T = ''>(params?: T extends '' ? Record<string, string> : InputRouteParams<T>) => void;\n };\n\n /** The imperative router. */\n export const router: Router;\n\n /************\n * <Link /> *\n ************/\n export interface LinkProps<T> extends OriginalLinkProps {\n href: Href<T>;\n }\n\n export interface LinkComponent {\n <T>(props: React.PropsWithChildren<LinkProps<T>>): JSX.Element;\n /** Helper method to resolve an Href object into a string. */\n resolveHref: <T>(href: Href<T>) => string;\n }\n\n /**\n * Component to render link to another route using a path.\n * Uses an anchor tag on the web.\n *\n * @param props.href Absolute path to route (e.g. \\`/feeds/hot\\`).\n * @param props.replace Should replace the current route without adding to the history.\n * @param props.asChild Forward props to child component. Useful for custom buttons.\n * @param props.children Child elements to render the content.\n * @param props.className On web, this sets the HTML \\`class\\` directly. On native, this can be used with CSS interop tools like Nativewind.\n */\n export const Link: LinkComponent;\n\n /** Redirects to the href as soon as the component is mounted. */\n export const Redirect: <T>(\n props: React.PropsWithChildren<{ href: Href<T> }>\n ) => JSX.Element;\n\n /************\n * Hooks *\n ************/\n export function useRouter(): Router;\n\n export function useLocalSearchParams<\n T extends AllRoutes | UnknownOutputParams = UnknownOutputParams,\n >(): T extends AllRoutes ? SearchParams<T> : T;\n\n /** @deprecated renamed to \\`useGlobalSearchParams\\` */\n export function useSearchParams<\n T extends AllRoutes | UnknownOutputParams = UnknownOutputParams,\n >(): T extends AllRoutes ? SearchParams<T> : T;\n\n export function useGlobalSearchParams<\n T extends AllRoutes | UnknownOutputParams = UnknownOutputParams,\n >(): T extends AllRoutes ? SearchParams<T> : T;\n\n export function useSegments<\n T extends AbsoluteRoute | RouteSegments<AbsoluteRoute> | RelativePathString,\n >(): T extends AbsoluteRoute ? RouteSegments<T> : T extends string ? string[] : T;\n}\n`;\n"],"names":["setupTypedRoutes","getTemplateString","getTypedRoutesUtils","extrapolateGroupRoutes","CAPTURE_DYNAMIC_PARAMS","CATCH_ALL","SLUG","ARRAY_GROUP_REGEX","CAPTURE_GROUP_REGEX","TYPED_ROUTES_EXCLUSION_REGEX","server","metro","typesDirectory","projectRoot","routerDirectory","filePathToRoute","staticRoutes","dynamicRoutes","addFilePath","isRouteFile","metroWatchTypeScriptFiles","eventTypes","callback","filePath","type","shouldRegenerate","route","delete","regenerateRouterDotTS","Set","values","flatMap","v","Array","from","keys","directoryExistsAsync","walk","debounce","typesDir","dynamicRouteTemplates","fs","mkdir","recursive","writeFile","path","resolve","routerDotTSTemplate","setToUnionType","dynamicRouteParams","appRoot","filePathSeperator","sep","Map","normalizedFilePath","replaceAll","normalizedAppRoot","replace","match","relative","startsWith","isAbsolute","has","dynamicParams","matchAll","map","isDynamic","size","addRoute","originalRoute","set","get","add","includes","routeWithoutGroups","routeWithSingleGroup","s","join","directory","files","readdir","file","p","stat","isDirectory","normalizedPath","routes","groupsMatch","group","trim","unsafeTemplate"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../src/start/server/type-generation/routes.ts"],"sourcesContent":["import fs from 'fs/promises';\nimport debounce from 'lodash.debounce';\nimport { Server } from 'metro';\nimport path from 'path';\n\nimport { directoryExistsAsync } from '../../../utils/dir';\nimport { unsafeTemplate } from '../../../utils/template';\nimport { ServerLike } from '../BundlerDevServer';\nimport { metroWatchTypeScriptFiles } from '../metro/metroWatchTypeScriptFiles';\n\n// /test/[...param1]/[param2]/[param3] - captures [\"param1\", \"param2\", \"param3\"]\nexport const CAPTURE_DYNAMIC_PARAMS = /\\[(?:\\.{3})?(\\w*?)[\\]$]/g;\n// /[...param1]/ - Match [...param1]\nexport const CATCH_ALL = /\\[\\.\\.\\..+?\\]/g;\n// /[param1] - Match [param1]\nexport const SLUG = /\\[.+?\\]/g;\n// /(group1,group2,group3)/test - match (group1,group2,group3)\nexport const ARRAY_GROUP_REGEX = /\\(\\s*\\w[\\w\\s]*?,.*?\\)/g;\n// /(group1,group2,group3)/test - captures [\"group1\", \"group2\", \"group3\"]\nexport const CAPTURE_GROUP_REGEX = /[\\\\(,]\\s*(\\w[\\w\\s]*?)\\s*(?=[,\\\\)])/g;\n/**\n * Match:\n * - _layout files, +html, +not-found, string+api, etc\n * - Routes can still use `+`, but it cannot be in the last segment.\n */\nexport const TYPED_ROUTES_EXCLUSION_REGEX = /(_layout|[^/]*?\\+[^/]*?)\\.[tj]sx?$/;\n\nexport interface SetupTypedRoutesOptions {\n server?: ServerLike;\n metro?: Server | null;\n typesDirectory: string;\n projectRoot: string;\n /** Absolute expo router routes directory. */\n routerDirectory: string;\n}\n\nexport async function setupTypedRoutes({\n server,\n metro,\n typesDirectory,\n projectRoot,\n routerDirectory,\n}: SetupTypedRoutesOptions) {\n const { filePathToRoute, staticRoutes, dynamicRoutes, addFilePath, isRouteFile } =\n getTypedRoutesUtils(routerDirectory);\n\n if (metro && server) {\n // Setup out watcher first\n metroWatchTypeScriptFiles({\n projectRoot,\n server,\n metro,\n eventTypes: ['add', 'delete', 'change'],\n async callback({ filePath, type }) {\n if (!isRouteFile(filePath)) {\n return;\n }\n\n let shouldRegenerate = false;\n\n if (type === 'delete') {\n const route = filePathToRoute(filePath);\n staticRoutes.delete(route);\n dynamicRoutes.delete(route);\n shouldRegenerate = true;\n } else {\n shouldRegenerate = addFilePath(filePath);\n }\n\n if (shouldRegenerate) {\n regenerateRouterDotTS(\n typesDirectory,\n new Set([...staticRoutes.values()].flatMap((v) => Array.from(v))),\n new Set([...dynamicRoutes.values()].flatMap((v) => Array.from(v))),\n new Set(dynamicRoutes.keys())\n );\n }\n },\n });\n }\n\n if (await directoryExistsAsync(routerDirectory)) {\n // Do we need to walk the entire tree on startup?\n // Idea: Store the list of files in the last write, then simply check Git for what files have changed\n await walk(routerDirectory, addFilePath);\n }\n\n regenerateRouterDotTS(\n typesDirectory,\n new Set([...staticRoutes.values()].flatMap((v) => Array.from(v))),\n new Set([...dynamicRoutes.values()].flatMap((v) => Array.from(v))),\n new Set(dynamicRoutes.keys())\n );\n}\n\n/**\n * Generate a router.d.ts file that contains all of the routes in the project.\n * Should be debounced as its very common for developers to make changes to multiple files at once (eg Save All)\n */\nconst regenerateRouterDotTS = debounce(\n async (\n typesDir: string,\n staticRoutes: Set<string>,\n dynamicRoutes: Set<string>,\n dynamicRouteTemplates: Set<string>\n ) => {\n await fs.mkdir(typesDir, { recursive: true });\n await fs.writeFile(\n path.resolve(typesDir, './router.d.ts'),\n getTemplateString(staticRoutes, dynamicRoutes, dynamicRouteTemplates)\n );\n },\n 100\n);\n\n/*\n * This is exported for testing purposes\n */\nexport function getTemplateString(\n staticRoutes: Set<string>,\n dynamicRoutes: Set<string>,\n dynamicRouteTemplates: Set<string>\n) {\n return routerDotTSTemplate({\n staticRoutes: setToUnionType(staticRoutes),\n dynamicRoutes: setToUnionType(dynamicRoutes),\n dynamicRouteParams: setToUnionType(dynamicRouteTemplates),\n });\n}\n\n/**\n * Utility functions for typed routes\n *\n * These are extracted for easier testing\n */\nexport function getTypedRoutesUtils(appRoot: string, filePathSeperator = path.sep) {\n /*\n * staticRoutes are a map where the key if the route without groups and the value\n * is another set of all group versions of the route. e.g,\n * Map([\n * [\"/\", [\"/(app)/(notes)\", \"/(app)/(profile)\"]\n * ])\n */\n const staticRoutes = new Map<string, Set<string>>([['/', new Set('/')]]);\n /*\n * dynamicRoutes are the same as staticRoutes (key if the resolved route,\n * and the value is a set of possible routes). e.g:\n *\n * /[...fruits] -> /${CatchAllRoutePart<T>}\n * /color/[color] -> /color/${SingleRoutePart<T>}\n *\n * The keys of this map are also important, as they can be used as \"static\" types\n * <Link href={{ pathname: \"/[...fruits]\",params: { fruits: [\"apple\"] } }} />\n */\n const dynamicRoutes = new Map<string, Set<string>>();\n\n function normalizedFilePath(filePath: string) {\n return filePath.replaceAll(filePathSeperator, '/');\n }\n\n const normalizedAppRoot = normalizedFilePath(appRoot);\n\n const filePathToRoute = (filePath: string) => {\n return normalizedFilePath(filePath)\n .replace(normalizedAppRoot, '')\n .replace(/index\\.[jt]sx?/, '')\n .replace(/\\.[jt]sx?$/, '');\n };\n\n const isRouteFile = (filePath: string) => {\n if (filePath.match(TYPED_ROUTES_EXCLUSION_REGEX)) {\n return false;\n }\n\n // Route files must be nested with in the appRoot\n const relative = path.relative(appRoot, filePath);\n return relative && !relative.startsWith('..') && !path.isAbsolute(relative);\n };\n\n const addFilePath = (filePath: string): boolean => {\n if (!isRouteFile(filePath)) {\n return false;\n }\n\n const route = filePathToRoute(filePath);\n\n // We have already processed this file\n if (staticRoutes.has(route) || dynamicRoutes.has(route)) {\n return false;\n }\n\n const dynamicParams = new Set(\n [...route.matchAll(CAPTURE_DYNAMIC_PARAMS)].map((match) => match[1])\n );\n const isDynamic = dynamicParams.size > 0;\n\n const addRoute = (originalRoute: string, route: string) => {\n if (isDynamic) {\n let set = dynamicRoutes.get(originalRoute);\n\n if (!set) {\n set = new Set();\n dynamicRoutes.set(originalRoute, set);\n }\n\n set.add(\n route\n .replaceAll(CATCH_ALL, '${CatchAllRoutePart<T>}')\n .replaceAll(SLUG, '${SingleRoutePart<T>}')\n );\n } else {\n let set = staticRoutes.get(originalRoute);\n\n if (!set) {\n set = new Set();\n staticRoutes.set(originalRoute, set);\n }\n\n set.add(route);\n }\n };\n\n if (!route.match(ARRAY_GROUP_REGEX)) {\n addRoute(route, route);\n }\n\n // Does this route have a group? eg /(group)\n if (route.includes('/(')) {\n const routeWithoutGroups = route.replace(/\\/\\(.+?\\)/g, '');\n addRoute(route, routeWithoutGroups);\n\n // If there are multiple groups, we need to expand them\n // eg /(test1,test2)/page => /test1/page & /test2/page\n for (const routeWithSingleGroup of extrapolateGroupRoutes(route)) {\n addRoute(route, routeWithSingleGroup);\n }\n }\n\n return true;\n };\n\n return {\n staticRoutes,\n dynamicRoutes,\n filePathToRoute,\n addFilePath,\n isRouteFile,\n };\n}\n\nexport const setToUnionType = <T>(set: Set<T>) => {\n return set.size > 0 ? [...set].map((s) => `\\`${s}\\``).join(' | ') : 'never';\n};\n\n/**\n * Recursively walk a directory and call the callback with the file path.\n */\nasync function walk(directory: string, callback: (filePath: string) => void) {\n const files = await fs.readdir(directory);\n for (const file of files) {\n const p = path.join(directory, file);\n if ((await fs.stat(p)).isDirectory()) {\n await walk(p, callback);\n } else {\n // Normalise the paths so they are easier to convert to URLs\n const normalizedPath = p.replaceAll(path.sep, '/');\n callback(normalizedPath);\n }\n }\n}\n\n/**\n * Given a route, return all possible routes that could be generated from it.\n */\nexport function extrapolateGroupRoutes(\n route: string,\n routes: Set<string> = new Set()\n): Set<string> {\n // Create a version with no groups. We will then need to cleanup double and/or trailing slashes\n routes.add(route.replaceAll(ARRAY_GROUP_REGEX, '').replaceAll(/\\/+/g, '/').replace(/\\/$/, ''));\n\n const match = route.match(ARRAY_GROUP_REGEX);\n\n if (!match) {\n routes.add(route);\n return routes;\n }\n\n const groupsMatch = match[0];\n\n for (const group of groupsMatch.matchAll(CAPTURE_GROUP_REGEX)) {\n extrapolateGroupRoutes(route.replace(groupsMatch, `(${group[1].trim()})`), routes);\n }\n\n return routes;\n}\n\n/**\n * NOTE: This code refers to a specific version of `expo-router` and is therefore unsafe to\n * mix with arbitrary versions.\n * TODO: Version this code with `expo-router` or version expo-router with `@expo/cli`.\n */\nconst routerDotTSTemplate = unsafeTemplate`/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable import/export */\n/* eslint-disable @typescript-eslint/ban-types */\ndeclare module \"expo-router\" {\n import type { LinkProps as OriginalLinkProps } from 'expo-router/build/link/Link';\n import type { Router as OriginalRouter } from 'expo-router/build/types';\n export * from 'expo-router/build';\n\n // prettier-ignore\n type StaticRoutes = ${'staticRoutes'};\n // prettier-ignore\n type DynamicRoutes<T extends string> = ${'dynamicRoutes'};\n // prettier-ignore\n type DynamicRouteTemplate = ${'dynamicRouteParams'};\n\n type RelativePathString = \\`./\\${string}\\` | \\`../\\${string}\\` | '..';\n type AbsoluteRoute = DynamicRouteTemplate | StaticRoutes;\n type ExternalPathString = \\`\\${string}:\\${string}\\`;\n\n type ExpoRouterRoutes = DynamicRouteTemplate | StaticRoutes | RelativePathString;\n export type AllRoutes = ExpoRouterRoutes | ExternalPathString;\n\n /****************\n * Route Utils *\n ****************/\n\n type SearchOrHash = \\`?\\${string}\\` | \\`#\\${string}\\`;\n type UnknownInputParams = Record<string, string | number | (string | number)[]>;\n type UnknownOutputParams = Record<string, string | string[]>;\n\n /**\n * Return only the RoutePart of a string. If the string has multiple parts return never\n *\n * string | type\n * ---------|------\n * 123 | 123\n * /123/abc | never\n * 123?abc | never\n * ./123 | never\n * /123 | never\n * 123/../ | never\n */\n type SingleRoutePart<S extends string> = S extends \\`\\${string}/\\${string}\\`\n ? never\n : S extends \\`\\${string}\\${SearchOrHash}\\`\n ? never\n : S extends ''\n ? never\n : S extends \\`(\\${string})\\`\n ? never\n : S extends \\`[\\${string}]\\`\n ? never\n : S;\n\n /**\n * Return only the CatchAll router part. If the string has search parameters or a hash return never\n */\n type CatchAllRoutePart<S extends string> = S extends \\`\\${string}\\${SearchOrHash}\\`\n ? never\n : S extends ''\n ? never\n : S extends \\`\\${string}(\\${string})\\${string}\\`\n ? never\n : S extends \\`\\${string}[\\${string}]\\${string}\\`\n ? never\n : S;\n\n // type OptionalCatchAllRoutePart<S extends string> = S extends \\`\\${string}\\${SearchOrHash}\\` ? never : S\n\n /**\n * Return the name of a route parameter\n * '[test]' -> 'test'\n * 'test' -> never\n * '[...test]' -> '...test'\n */\n type IsParameter<Part> = Part extends \\`[\\${infer ParamName}]\\` ? ParamName : never;\n\n /**\n * Return a union of all parameter names. If there are no names return never\n *\n * /[test] -> 'test'\n * /[abc]/[...def] -> 'abc'|'...def'\n */\n type ParameterNames<Path> = Path extends \\`\\${infer PartA}/\\${infer PartB}\\`\n ? IsParameter<PartA> | ParameterNames<PartB>\n : IsParameter<Path>;\n\n /**\n * Returns all segements of a route.\n *\n * /(group)/123/abc/[id]/[...rest] -> ['(group)', '123', 'abc', '[id]', '[...rest]'\n */\n type RouteSegments<Path> = Path extends \\`\\${infer PartA}/\\${infer PartB}\\`\n ? PartA extends '' | '.'\n ? [...RouteSegments<PartB>]\n : [PartA, ...RouteSegments<PartB>]\n : Path extends ''\n ? []\n : [Path];\n\n /**\n * Returns a Record of the routes parameters as strings and CatchAll parameters\n *\n * There are two versions, input and output, as you can input 'string | number' but\n * the output will always be 'string'\n *\n * /[id]/[...rest] -> { id: string, rest: string[] }\n * /no-params -> {}\n */\n type InputRouteParams<Path> = {\n [Key in ParameterNames<Path> as Key extends \\`...\\${infer Name}\\`\n ? Name\n : Key]: Key extends \\`...\\${string}\\` ? (string | number)[] : string | number;\n } & UnknownInputParams;\n\n type OutputRouteParams<Path> = {\n [Key in ParameterNames<Path> as Key extends \\`...\\${infer Name}\\`\n ? Name\n : Key]: Key extends \\`...\\${string}\\` ? string[] : string;\n } & UnknownOutputParams;\n\n /**\n * Returns the search parameters for a route.\n */\n export type SearchParams<T extends AllRoutes> = T extends DynamicRouteTemplate\n ? OutputRouteParams<T>\n : T extends StaticRoutes\n ? never\n : UnknownOutputParams;\n\n /**\n * Route is mostly used as part of Href to ensure that a valid route is provided\n *\n * Given a dynamic route, this will return never. This is helpful for conditional logic\n *\n * /test -> /test, /test2, etc\n * /test/[abc] -> never\n * /test/resolve -> /test, /test2, etc\n *\n * Note that if we provide a value for [abc] then the route is allowed\n *\n * This is named Route to prevent confusion, as users they will often see it in tooltips\n */\n export type Route<T> = T extends string\n ? T extends DynamicRouteTemplate\n ? never\n :\n | StaticRoutes\n | RelativePathString\n | ExternalPathString\n | (T extends \\`\\${infer P}\\${SearchOrHash}\\`\n ? P extends DynamicRoutes<infer _>\n ? T\n : never\n : T extends DynamicRoutes<infer _>\n ? T\n : never)\n : never;\n\n /*********\n * Href *\n *********/\n\n export type Href<T> = T extends Record<'pathname', string> ? HrefObject<T> : Route<T>;\n\n export type HrefObject<\n R extends Record<'pathname', string>,\n P = R['pathname'],\n > = P extends DynamicRouteTemplate\n ? { pathname: P; params: InputRouteParams<P> }\n : P extends Route<P>\n ? { pathname: Route<P> | DynamicRouteTemplate; params?: never | InputRouteParams<never> }\n : never;\n\n /***********************\n * Expo Router Exports *\n ***********************/\n\n export type Router = Omit<OriginalRouter, 'push' | 'replace' | 'setParams'> & {\n /** Navigate to the provided href. */\n push: <T>(href: Href<T>) => void;\n /** Navigate to route without appending to the history. */\n replace: <T>(href: Href<T>) => void;\n /** Update the current route query params. */\n setParams: <T = ''>(params?: T extends '' ? Record<string, string> : InputRouteParams<T>) => void;\n };\n\n /** The imperative router. */\n export const router: Router;\n\n /************\n * <Link /> *\n ************/\n export interface LinkProps<T> extends OriginalLinkProps {\n href: Href<T>;\n }\n\n export interface LinkComponent {\n <T>(props: React.PropsWithChildren<LinkProps<T>>): JSX.Element;\n /** Helper method to resolve an Href object into a string. */\n resolveHref: <T>(href: Href<T>) => string;\n }\n\n /**\n * Component to render link to another route using a path.\n * Uses an anchor tag on the web.\n *\n * @param props.href Absolute path to route (e.g. \\`/feeds/hot\\`).\n * @param props.replace Should replace the current route without adding to the history.\n * @param props.asChild Forward props to child component. Useful for custom buttons.\n * @param props.children Child elements to render the content.\n * @param props.className On web, this sets the HTML \\`class\\` directly. On native, this can be used with CSS interop tools like Nativewind.\n */\n export const Link: LinkComponent;\n\n /** Redirects to the href as soon as the component is mounted. */\n export const Redirect: <T>(\n props: React.PropsWithChildren<{ href: Href<T> }>\n ) => JSX.Element;\n\n /************\n * Hooks *\n ************/\n export function useRouter(): Router;\n\n export function useLocalSearchParams<\n T extends AllRoutes | UnknownOutputParams = UnknownOutputParams,\n >(): T extends AllRoutes ? SearchParams<T> : T;\n\n /** @deprecated renamed to \\`useGlobalSearchParams\\` */\n export function useSearchParams<\n T extends AllRoutes | UnknownOutputParams = UnknownOutputParams,\n >(): T extends AllRoutes ? SearchParams<T> : T;\n\n export function useGlobalSearchParams<\n T extends AllRoutes | UnknownOutputParams = UnknownOutputParams,\n >(): T extends AllRoutes ? SearchParams<T> : T;\n\n export function useSegments<\n T extends AbsoluteRoute | RouteSegments<AbsoluteRoute> | RelativePathString,\n >(): T extends AbsoluteRoute ? RouteSegments<T> : T extends string ? string[] : T;\n}\n`;\n"],"names":["setupTypedRoutes","getTemplateString","getTypedRoutesUtils","extrapolateGroupRoutes","CAPTURE_DYNAMIC_PARAMS","CATCH_ALL","SLUG","ARRAY_GROUP_REGEX","CAPTURE_GROUP_REGEX","TYPED_ROUTES_EXCLUSION_REGEX","server","metro","typesDirectory","projectRoot","routerDirectory","filePathToRoute","staticRoutes","dynamicRoutes","addFilePath","isRouteFile","metroWatchTypeScriptFiles","eventTypes","callback","filePath","type","shouldRegenerate","route","delete","regenerateRouterDotTS","Set","values","flatMap","v","Array","from","keys","directoryExistsAsync","walk","debounce","typesDir","dynamicRouteTemplates","fs","mkdir","recursive","writeFile","path","resolve","routerDotTSTemplate","setToUnionType","dynamicRouteParams","appRoot","filePathSeperator","sep","Map","normalizedFilePath","replaceAll","normalizedAppRoot","replace","match","relative","startsWith","isAbsolute","has","dynamicParams","matchAll","map","isDynamic","size","addRoute","originalRoute","set","get","add","includes","routeWithoutGroups","routeWithSingleGroup","s","join","directory","files","readdir","file","p","stat","isDirectory","normalizedPath","routes","groupsMatch","group","trim","unsafeTemplate"],"mappings":"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"}
@@ -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":"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"}
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.16.7",
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.16.7"
138
+ version: "0.17.0"
139
139
  },
140
140
  ci: ciInfo.isCI ? {
141
141
  name: ciInfo.name,
@@ -130,6 +130,9 @@ class Env {
130
130
  /** Enable the React Native JS Inspector, instead of the "classic" Chrome DevTools (SDK <=49) */ get EXPO_USE_UNSTABLE_DEBUGGER() {
131
131
  return (0, _getenv).boolish("EXPO_USE_UNSTABLE_DEBUGGER", false);
132
132
  }
133
+ /** Set the default `user` that should be passed to `--user` with ADB commands. Used for installing APKs on Android devices with multiple profiles. Defaults to `0`. */ get EXPO_ADB_USER() {
134
+ return (0, _getenv).string("EXPO_ADB_USER", "0");
135
+ }
133
136
  }
134
137
  const env = new Env();
135
138
  exports.env = env;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/env.ts"],"sourcesContent":["import { boolish, int, string } from 'getenv';\n\n// @expo/webpack-config -> expo-pwa -> @expo/image-utils: EXPO_IMAGE_UTILS_NO_SHARP\n\n// TODO: EXPO_CLI_USERNAME, EXPO_CLI_PASSWORD\n\nclass Env {\n /** Enable profiling metrics */\n get EXPO_PROFILE() {\n return boolish('EXPO_PROFILE', false);\n }\n\n /** Enable debug logging */\n get EXPO_DEBUG() {\n return boolish('EXPO_DEBUG', false);\n }\n\n /** Disable all network requests */\n get EXPO_OFFLINE() {\n return boolish('EXPO_OFFLINE', false);\n }\n\n /** Enable the beta version of Expo (TODO: Should this just be in the beta version of expo releases?) */\n get EXPO_BETA() {\n return boolish('EXPO_BETA', false);\n }\n\n /** Enable staging API environment */\n get EXPO_STAGING() {\n return boolish('EXPO_STAGING', false);\n }\n\n /** Enable local API environment */\n get EXPO_LOCAL() {\n return boolish('EXPO_LOCAL', false);\n }\n\n /** Is running in non-interactive CI mode */\n get CI() {\n return boolish('CI', false);\n }\n\n /** Disable telemetry (analytics) */\n get EXPO_NO_TELEMETRY() {\n return boolish('EXPO_NO_TELEMETRY', false);\n }\n\n /** local directory to the universe repo for testing locally */\n get EXPO_UNIVERSE_DIR() {\n return string('EXPO_UNIVERSE_DIR', '');\n }\n\n /** @deprecated Default Webpack host string */\n get WEB_HOST() {\n return string('WEB_HOST', '0.0.0.0');\n }\n\n /** Skip warning users about a dirty git status */\n get EXPO_NO_GIT_STATUS() {\n return boolish('EXPO_NO_GIT_STATUS', false);\n }\n /** Disable auto web setup */\n get EXPO_NO_WEB_SETUP() {\n return boolish('EXPO_NO_WEB_SETUP', false);\n }\n /** Disable auto TypeScript setup */\n get EXPO_NO_TYPESCRIPT_SETUP() {\n return boolish('EXPO_NO_TYPESCRIPT_SETUP', false);\n }\n /** Disable all API caches. Does not disable bundler caches. */\n get EXPO_NO_CACHE() {\n return boolish('EXPO_NO_CACHE', false);\n }\n /** Disable the app select redirect page. */\n get EXPO_NO_REDIRECT_PAGE() {\n return boolish('EXPO_NO_REDIRECT_PAGE', false);\n }\n /** The React Metro port that's baked into react-native scripts and tools. */\n get RCT_METRO_PORT() {\n return int('RCT_METRO_PORT', 0);\n }\n /** Skip validating the manifest during `export`. */\n get EXPO_SKIP_MANIFEST_VALIDATION_TOKEN(): boolean {\n return !!string('EXPO_SKIP_MANIFEST_VALIDATION_TOKEN', '');\n }\n\n /** Public folder path relative to the project root. Default to `public` */\n get EXPO_PUBLIC_FOLDER(): string {\n return string('EXPO_PUBLIC_FOLDER', 'public');\n }\n\n /** Higher priority `$EDIOTR` variable for indicating which editor to use when pressing `o` in the Terminal UI. */\n get EXPO_EDITOR(): string {\n return string('EXPO_EDITOR', '');\n }\n\n /** Enable auto server root detection for Metro. This will change the server root to the workspace root. */\n get EXPO_USE_METRO_WORKSPACE_ROOT(): boolean {\n return boolish('EXPO_USE_METRO_WORKSPACE_ROOT', false);\n }\n\n /**\n * Overwrite the dev server URL, disregarding the `--port`, `--host`, `--tunnel`, `--lan`, `--localhost` arguments.\n * This is useful for browser editors that require custom proxy URLs.\n */\n get EXPO_PACKAGER_PROXY_URL(): string {\n return string('EXPO_PACKAGER_PROXY_URL', '');\n }\n\n /**\n * **Experimental** - Disable using `exp.direct` as the hostname for\n * `--tunnel` connections. This enables **https://** forwarding which\n * can be used to test universal links on iOS.\n *\n * This may cause issues with `expo-linking` and Expo Go.\n *\n * Select the exact subdomain by passing a string value that is not one of: `true`, `false`, `1`, `0`.\n */\n get EXPO_TUNNEL_SUBDOMAIN(): string | boolean {\n const subdomain = string('EXPO_TUNNEL_SUBDOMAIN', '');\n if (['0', 'false', ''].includes(subdomain)) {\n return false;\n } else if (['1', 'true'].includes(subdomain)) {\n return true;\n }\n return subdomain;\n }\n\n /**\n * Force Expo CLI to use the [`resolver.resolverMainFields`](https://facebook.github.io/metro/docs/configuration/#resolvermainfields) from the project `metro.config.js` for all platforms.\n *\n * By default, Expo CLI will use `['browser', 'module', 'main']` (default for Webpack) for web and the user-defined main fields for other platforms.\n */\n get EXPO_METRO_NO_MAIN_FIELD_OVERRIDE(): boolean {\n return boolish('EXPO_METRO_NO_MAIN_FIELD_OVERRIDE', false);\n }\n\n /**\n * HTTP/HTTPS proxy to connect to for network requests. Configures [https-proxy-agent](https://www.npmjs.com/package/https-proxy-agent).\n */\n get HTTP_PROXY(): string {\n return process.env.HTTP_PROXY || process.env.http_proxy || '';\n }\n\n /**\n * Use the network inspector by overriding the metro inspector proxy with a custom version.\n * @deprecated This has been replaced by `@react-native/dev-middleware` and is now unused.\n */\n get EXPO_NO_INSPECTOR_PROXY(): boolean {\n return boolish('EXPO_NO_INSPECTOR_PROXY', false);\n }\n\n /** Disable lazy bundling in Metro bundler. */\n get EXPO_NO_METRO_LAZY() {\n return boolish('EXPO_NO_METRO_LAZY', false);\n }\n\n /** Enable the unstable inverse dependency stack trace for Metro bundling errors. */\n get EXPO_METRO_UNSTABLE_ERRORS() {\n return boolish('EXPO_METRO_UNSTABLE_ERRORS', false);\n }\n\n /** Enable the unstable fast resolver for Metro. */\n get EXPO_USE_FAST_RESOLVER() {\n return boolish('EXPO_USE_FAST_RESOLVER', false);\n }\n\n /** Disable Environment Variable injection in client bundles. */\n get EXPO_NO_CLIENT_ENV_VARS(): boolean {\n return boolish('EXPO_NO_CLIENT_ENV_VARS', false);\n }\n\n /** Enable the React Native JS Inspector, instead of the \"classic\" Chrome DevTools (SDK <=49) */\n get EXPO_USE_UNSTABLE_DEBUGGER(): boolean {\n return boolish('EXPO_USE_UNSTABLE_DEBUGGER', false);\n }\n}\n\nexport const env = new Env();\n"],"names":["Env","EXPO_PROFILE","boolish","EXPO_DEBUG","EXPO_OFFLINE","EXPO_BETA","EXPO_STAGING","EXPO_LOCAL","CI","EXPO_NO_TELEMETRY","EXPO_UNIVERSE_DIR","string","WEB_HOST","EXPO_NO_GIT_STATUS","EXPO_NO_WEB_SETUP","EXPO_NO_TYPESCRIPT_SETUP","EXPO_NO_CACHE","EXPO_NO_REDIRECT_PAGE","RCT_METRO_PORT","int","EXPO_SKIP_MANIFEST_VALIDATION_TOKEN","EXPO_PUBLIC_FOLDER","EXPO_EDITOR","EXPO_USE_METRO_WORKSPACE_ROOT","EXPO_PACKAGER_PROXY_URL","EXPO_TUNNEL_SUBDOMAIN","subdomain","includes","EXPO_METRO_NO_MAIN_FIELD_OVERRIDE","HTTP_PROXY","process","env","http_proxy","EXPO_NO_INSPECTOR_PROXY","EXPO_NO_METRO_LAZY","EXPO_METRO_UNSTABLE_ERRORS","EXPO_USE_FAST_RESOLVER","EXPO_NO_CLIENT_ENV_VARS","EXPO_USE_UNSTABLE_DEBUGGER"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/utils/env.ts"],"sourcesContent":["import { boolish, int, string } from 'getenv';\n\n// @expo/webpack-config -> expo-pwa -> @expo/image-utils: EXPO_IMAGE_UTILS_NO_SHARP\n\n// TODO: EXPO_CLI_USERNAME, EXPO_CLI_PASSWORD\n\nclass Env {\n /** Enable profiling metrics */\n get EXPO_PROFILE() {\n return boolish('EXPO_PROFILE', false);\n }\n\n /** Enable debug logging */\n get EXPO_DEBUG() {\n return boolish('EXPO_DEBUG', false);\n }\n\n /** Disable all network requests */\n get EXPO_OFFLINE() {\n return boolish('EXPO_OFFLINE', false);\n }\n\n /** Enable the beta version of Expo (TODO: Should this just be in the beta version of expo releases?) */\n get EXPO_BETA() {\n return boolish('EXPO_BETA', false);\n }\n\n /** Enable staging API environment */\n get EXPO_STAGING() {\n return boolish('EXPO_STAGING', false);\n }\n\n /** Enable local API environment */\n get EXPO_LOCAL() {\n return boolish('EXPO_LOCAL', false);\n }\n\n /** Is running in non-interactive CI mode */\n get CI() {\n return boolish('CI', false);\n }\n\n /** Disable telemetry (analytics) */\n get EXPO_NO_TELEMETRY() {\n return boolish('EXPO_NO_TELEMETRY', false);\n }\n\n /** local directory to the universe repo for testing locally */\n get EXPO_UNIVERSE_DIR() {\n return string('EXPO_UNIVERSE_DIR', '');\n }\n\n /** @deprecated Default Webpack host string */\n get WEB_HOST() {\n return string('WEB_HOST', '0.0.0.0');\n }\n\n /** Skip warning users about a dirty git status */\n get EXPO_NO_GIT_STATUS() {\n return boolish('EXPO_NO_GIT_STATUS', false);\n }\n /** Disable auto web setup */\n get EXPO_NO_WEB_SETUP() {\n return boolish('EXPO_NO_WEB_SETUP', false);\n }\n /** Disable auto TypeScript setup */\n get EXPO_NO_TYPESCRIPT_SETUP() {\n return boolish('EXPO_NO_TYPESCRIPT_SETUP', false);\n }\n /** Disable all API caches. Does not disable bundler caches. */\n get EXPO_NO_CACHE() {\n return boolish('EXPO_NO_CACHE', false);\n }\n /** Disable the app select redirect page. */\n get EXPO_NO_REDIRECT_PAGE() {\n return boolish('EXPO_NO_REDIRECT_PAGE', false);\n }\n /** The React Metro port that's baked into react-native scripts and tools. */\n get RCT_METRO_PORT() {\n return int('RCT_METRO_PORT', 0);\n }\n /** Skip validating the manifest during `export`. */\n get EXPO_SKIP_MANIFEST_VALIDATION_TOKEN(): boolean {\n return !!string('EXPO_SKIP_MANIFEST_VALIDATION_TOKEN', '');\n }\n\n /** Public folder path relative to the project root. Default to `public` */\n get EXPO_PUBLIC_FOLDER(): string {\n return string('EXPO_PUBLIC_FOLDER', 'public');\n }\n\n /** Higher priority `$EDIOTR` variable for indicating which editor to use when pressing `o` in the Terminal UI. */\n get EXPO_EDITOR(): string {\n return string('EXPO_EDITOR', '');\n }\n\n /** Enable auto server root detection for Metro. This will change the server root to the workspace root. */\n get EXPO_USE_METRO_WORKSPACE_ROOT(): boolean {\n return boolish('EXPO_USE_METRO_WORKSPACE_ROOT', false);\n }\n\n /**\n * Overwrite the dev server URL, disregarding the `--port`, `--host`, `--tunnel`, `--lan`, `--localhost` arguments.\n * This is useful for browser editors that require custom proxy URLs.\n */\n get EXPO_PACKAGER_PROXY_URL(): string {\n return string('EXPO_PACKAGER_PROXY_URL', '');\n }\n\n /**\n * **Experimental** - Disable using `exp.direct` as the hostname for\n * `--tunnel` connections. This enables **https://** forwarding which\n * can be used to test universal links on iOS.\n *\n * This may cause issues with `expo-linking` and Expo Go.\n *\n * Select the exact subdomain by passing a string value that is not one of: `true`, `false`, `1`, `0`.\n */\n get EXPO_TUNNEL_SUBDOMAIN(): string | boolean {\n const subdomain = string('EXPO_TUNNEL_SUBDOMAIN', '');\n if (['0', 'false', ''].includes(subdomain)) {\n return false;\n } else if (['1', 'true'].includes(subdomain)) {\n return true;\n }\n return subdomain;\n }\n\n /**\n * Force Expo CLI to use the [`resolver.resolverMainFields`](https://facebook.github.io/metro/docs/configuration/#resolvermainfields) from the project `metro.config.js` for all platforms.\n *\n * By default, Expo CLI will use `['browser', 'module', 'main']` (default for Webpack) for web and the user-defined main fields for other platforms.\n */\n get EXPO_METRO_NO_MAIN_FIELD_OVERRIDE(): boolean {\n return boolish('EXPO_METRO_NO_MAIN_FIELD_OVERRIDE', false);\n }\n\n /**\n * HTTP/HTTPS proxy to connect to for network requests. Configures [https-proxy-agent](https://www.npmjs.com/package/https-proxy-agent).\n */\n get HTTP_PROXY(): string {\n return process.env.HTTP_PROXY || process.env.http_proxy || '';\n }\n\n /**\n * Use the network inspector by overriding the metro inspector proxy with a custom version.\n * @deprecated This has been replaced by `@react-native/dev-middleware` and is now unused.\n */\n get EXPO_NO_INSPECTOR_PROXY(): boolean {\n return boolish('EXPO_NO_INSPECTOR_PROXY', false);\n }\n\n /** Disable lazy bundling in Metro bundler. */\n get EXPO_NO_METRO_LAZY() {\n return boolish('EXPO_NO_METRO_LAZY', false);\n }\n\n /** Enable the unstable inverse dependency stack trace for Metro bundling errors. */\n get EXPO_METRO_UNSTABLE_ERRORS() {\n return boolish('EXPO_METRO_UNSTABLE_ERRORS', false);\n }\n\n /** Enable the unstable fast resolver for Metro. */\n get EXPO_USE_FAST_RESOLVER() {\n return boolish('EXPO_USE_FAST_RESOLVER', false);\n }\n\n /** Disable Environment Variable injection in client bundles. */\n get EXPO_NO_CLIENT_ENV_VARS(): boolean {\n return boolish('EXPO_NO_CLIENT_ENV_VARS', false);\n }\n\n /** Enable the React Native JS Inspector, instead of the \"classic\" Chrome DevTools (SDK <=49) */\n get EXPO_USE_UNSTABLE_DEBUGGER(): boolean {\n return boolish('EXPO_USE_UNSTABLE_DEBUGGER', false);\n }\n\n /** Set the default `user` that should be passed to `--user` with ADB commands. Used for installing APKs on Android devices with multiple profiles. Defaults to `0`. */\n get EXPO_ADB_USER(): string {\n return string('EXPO_ADB_USER', '0');\n }\n}\n\nexport const env = new Env();\n"],"names":["Env","EXPO_PROFILE","boolish","EXPO_DEBUG","EXPO_OFFLINE","EXPO_BETA","EXPO_STAGING","EXPO_LOCAL","CI","EXPO_NO_TELEMETRY","EXPO_UNIVERSE_DIR","string","WEB_HOST","EXPO_NO_GIT_STATUS","EXPO_NO_WEB_SETUP","EXPO_NO_TYPESCRIPT_SETUP","EXPO_NO_CACHE","EXPO_NO_REDIRECT_PAGE","RCT_METRO_PORT","int","EXPO_SKIP_MANIFEST_VALIDATION_TOKEN","EXPO_PUBLIC_FOLDER","EXPO_EDITOR","EXPO_USE_METRO_WORKSPACE_ROOT","EXPO_PACKAGER_PROXY_URL","EXPO_TUNNEL_SUBDOMAIN","subdomain","includes","EXPO_METRO_NO_MAIN_FIELD_OVERRIDE","HTTP_PROXY","process","env","http_proxy","EXPO_NO_INSPECTOR_PROXY","EXPO_NO_METRO_LAZY","EXPO_METRO_UNSTABLE_ERRORS","EXPO_USE_FAST_RESOLVER","EXPO_NO_CLIENT_ENV_VARS","EXPO_USE_UNSTABLE_DEBUGGER","EXPO_ADB_USER"],"mappings":"AAAA;;;;;AAAqC,IAAA,OAAQ,WAAR,QAAQ,CAAA;AAE7C,mFAAmF;AAEnF,6CAA6C;AAE7C,MAAMA,GAAG;IACP,+BAA+B,CAC/B,IAAIC,YAAY,GAAG;QACjB,OAAOC,CAAAA,GAAAA,OAAO,AAAuB,CAAA,QAAvB,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;KACvC;IAED,2BAA2B,CAC3B,IAAIC,UAAU,GAAG;QACf,OAAOD,CAAAA,GAAAA,OAAO,AAAqB,CAAA,QAArB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;KACrC;IAED,mCAAmC,CACnC,IAAIE,YAAY,GAAG;QACjB,OAAOF,CAAAA,GAAAA,OAAO,AAAuB,CAAA,QAAvB,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;KACvC;IAED,wGAAwG,CACxG,IAAIG,SAAS,GAAG;QACd,OAAOH,CAAAA,GAAAA,OAAO,AAAoB,CAAA,QAApB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;KACpC;IAED,qCAAqC,CACrC,IAAII,YAAY,GAAG;QACjB,OAAOJ,CAAAA,GAAAA,OAAO,AAAuB,CAAA,QAAvB,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;KACvC;IAED,mCAAmC,CACnC,IAAIK,UAAU,GAAG;QACf,OAAOL,CAAAA,GAAAA,OAAO,AAAqB,CAAA,QAArB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;KACrC;IAED,4CAA4C,CAC5C,IAAIM,EAAE,GAAG;QACP,OAAON,CAAAA,GAAAA,OAAO,AAAa,CAAA,QAAb,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;KAC7B;IAED,oCAAoC,CACpC,IAAIO,iBAAiB,GAAG;QACtB,OAAOP,CAAAA,GAAAA,OAAO,AAA4B,CAAA,QAA5B,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;KAC5C;IAED,+DAA+D,CAC/D,IAAIQ,iBAAiB,GAAG;QACtB,OAAOC,CAAAA,GAAAA,OAAM,AAAyB,CAAA,OAAzB,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;KACxC;IAED,8CAA8C,CAC9C,IAAIC,QAAQ,GAAG;QACb,OAAOD,CAAAA,GAAAA,OAAM,AAAuB,CAAA,OAAvB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;KACtC;IAED,kDAAkD,CAClD,IAAIE,kBAAkB,GAAG;QACvB,OAAOX,CAAAA,GAAAA,OAAO,AAA6B,CAAA,QAA7B,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;KAC7C;IACD,6BAA6B,CAC7B,IAAIY,iBAAiB,GAAG;QACtB,OAAOZ,CAAAA,GAAAA,OAAO,AAA4B,CAAA,QAA5B,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;KAC5C;IACD,oCAAoC,CACpC,IAAIa,wBAAwB,GAAG;QAC7B,OAAOb,CAAAA,GAAAA,OAAO,AAAmC,CAAA,QAAnC,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;KACnD;IACD,+DAA+D,CAC/D,IAAIc,aAAa,GAAG;QAClB,OAAOd,CAAAA,GAAAA,OAAO,AAAwB,CAAA,QAAxB,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;KACxC;IACD,4CAA4C,CAC5C,IAAIe,qBAAqB,GAAG;QAC1B,OAAOf,CAAAA,GAAAA,OAAO,AAAgC,CAAA,QAAhC,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;KAChD;IACD,6EAA6E,CAC7E,IAAIgB,cAAc,GAAG;QACnB,OAAOC,CAAAA,GAAAA,OAAG,AAAqB,CAAA,IAArB,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;KACjC;IACD,oDAAoD,CACpD,IAAIC,mCAAmC,GAAY;QACjD,OAAO,CAAC,CAACT,CAAAA,GAAAA,OAAM,AAA2C,CAAA,OAA3C,CAAC,qCAAqC,EAAE,EAAE,CAAC,CAAC;KAC5D;IAED,2EAA2E,CAC3E,IAAIU,kBAAkB,GAAW;QAC/B,OAAOV,CAAAA,GAAAA,OAAM,AAAgC,CAAA,OAAhC,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC;KAC/C;IAED,kHAAkH,CAClH,IAAIW,WAAW,GAAW;QACxB,OAAOX,CAAAA,GAAAA,OAAM,AAAmB,CAAA,OAAnB,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;KAClC;IAED,2GAA2G,CAC3G,IAAIY,6BAA6B,GAAY;QAC3C,OAAOrB,CAAAA,GAAAA,OAAO,AAAwC,CAAA,QAAxC,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;KACxD;IAED;;;KAGG,CACH,IAAIsB,uBAAuB,GAAW;QACpC,OAAOb,CAAAA,GAAAA,OAAM,AAA+B,CAAA,OAA/B,CAAC,yBAAyB,EAAE,EAAE,CAAC,CAAC;KAC9C;IAED;;;;;;;;KAQG,CACH,IAAIc,qBAAqB,GAAqB;QAC5C,MAAMC,SAAS,GAAGf,CAAAA,GAAAA,OAAM,AAA6B,CAAA,OAA7B,CAAC,uBAAuB,EAAE,EAAE,CAAC,AAAC;QACtD,IAAI;YAAC,GAAG;YAAE,OAAO;YAAE,EAAE;SAAC,CAACgB,QAAQ,CAACD,SAAS,CAAC,EAAE;YAC1C,OAAO,KAAK,CAAC;SACd,MAAM,IAAI;YAAC,GAAG;YAAE,MAAM;SAAC,CAACC,QAAQ,CAACD,SAAS,CAAC,EAAE;YAC5C,OAAO,IAAI,CAAC;SACb;QACD,OAAOA,SAAS,CAAC;KAClB;IAED;;;;KAIG,CACH,IAAIE,iCAAiC,GAAY;QAC/C,OAAO1B,CAAAA,GAAAA,OAAO,AAA4C,CAAA,QAA5C,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;KAC5D;IAED;;KAEG,CACH,IAAI2B,UAAU,GAAW;QACvB,OAAOC,OAAO,CAACC,GAAG,CAACF,UAAU,IAAIC,OAAO,CAACC,GAAG,CAACC,UAAU,IAAI,EAAE,CAAC;KAC/D;IAED;;;KAGG,CACH,IAAIC,uBAAuB,GAAY;QACrC,OAAO/B,CAAAA,GAAAA,OAAO,AAAkC,CAAA,QAAlC,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;KAClD;IAED,8CAA8C,CAC9C,IAAIgC,kBAAkB,GAAG;QACvB,OAAOhC,CAAAA,GAAAA,OAAO,AAA6B,CAAA,QAA7B,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;KAC7C;IAED,oFAAoF,CACpF,IAAIiC,0BAA0B,GAAG;QAC/B,OAAOjC,CAAAA,GAAAA,OAAO,AAAqC,CAAA,QAArC,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;KACrD;IAED,mDAAmD,CACnD,IAAIkC,sBAAsB,GAAG;QAC3B,OAAOlC,CAAAA,GAAAA,OAAO,AAAiC,CAAA,QAAjC,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;KACjD;IAED,gEAAgE,CAChE,IAAImC,uBAAuB,GAAY;QACrC,OAAOnC,CAAAA,GAAAA,OAAO,AAAkC,CAAA,QAAlC,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;KAClD;IAED,gGAAgG,CAChG,IAAIoC,0BAA0B,GAAY;QACxC,OAAOpC,CAAAA,GAAAA,OAAO,AAAqC,CAAA,QAArC,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;KACrD;IAED,uKAAuK,CACvK,IAAIqC,aAAa,GAAW;QAC1B,OAAO5B,CAAAA,GAAAA,OAAM,AAAsB,CAAA,OAAtB,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;KACrC;CACF;AAEM,MAAMoB,GAAG,GAAG,IAAI/B,GAAG,EAAE,AAAC;QAAhB+B,GAAG,GAAHA,GAAG"}
@@ -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
- await pipeline(stream, _tar.default.extract({
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
- settings[value] = true;
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
- settings[nextValue] = value;
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.16.7",
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": "ca014bf2516c7644ef303f4c21fdd68de4d99f76"
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"}