@expo/cli 55.0.3 → 55.0.5

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 (81) hide show
  1. package/build/bin/cli +1 -1
  2. package/build/src/api/graphql/client.js +133 -68
  3. package/build/src/api/graphql/client.js.map +1 -1
  4. package/build/src/api/graphql/queries/AppQuery.js +21 -25
  5. package/build/src/api/graphql/queries/AppQuery.js.map +1 -1
  6. package/build/src/api/graphql/queries/UserQuery.js +45 -38
  7. package/build/src/api/graphql/queries/UserQuery.js.map +1 -1
  8. package/build/src/api/rest/cache/FileSystemResponseCache.js.map +1 -1
  9. package/build/src/api/rest/cache/ResponseCache.js.map +1 -1
  10. package/build/src/api/rest/cache/wrapFetchWithCache.js +7 -7
  11. package/build/src/api/rest/cache/wrapFetchWithCache.js.map +1 -1
  12. package/build/src/api/rest/client.js +3 -7
  13. package/build/src/api/rest/client.js.map +1 -1
  14. package/build/src/api/rest/wrapFetchWithProgress.js +1 -8
  15. package/build/src/api/rest/wrapFetchWithProgress.js.map +1 -1
  16. package/build/src/api/user/user.js +6 -36
  17. package/build/src/api/user/user.js.map +1 -1
  18. package/build/src/prebuild/renameTemplateAppName.js +2 -6
  19. package/build/src/prebuild/renameTemplateAppName.js.map +1 -1
  20. package/build/src/prebuild/resolveLocalTemplate.js +2 -4
  21. package/build/src/prebuild/resolveLocalTemplate.js.map +1 -1
  22. package/build/src/prebuild/resolveTemplate.js +13 -17
  23. package/build/src/prebuild/resolveTemplate.js.map +1 -1
  24. package/build/src/prebuild/updateFromTemplate.js +4 -6
  25. package/build/src/prebuild/updateFromTemplate.js.map +1 -1
  26. package/build/src/start/doctor/ngrok/ExternalModule.js +2 -8
  27. package/build/src/start/doctor/ngrok/ExternalModule.js.map +1 -1
  28. package/build/src/start/server/metro/DevToolsPluginWebsocketEndpoint.js +1 -9
  29. package/build/src/start/server/metro/DevToolsPluginWebsocketEndpoint.js.map +1 -1
  30. package/build/src/start/server/metro/MetroBundlerDevServer.js +13 -8
  31. package/build/src/start/server/metro/MetroBundlerDevServer.js.map +1 -1
  32. package/build/src/start/server/metro/createServerComponentsMiddleware.js +4 -14
  33. package/build/src/start/server/metro/createServerComponentsMiddleware.js.map +1 -1
  34. package/build/src/start/server/metro/createServerRouteMiddleware.js +17 -0
  35. package/build/src/start/server/metro/createServerRouteMiddleware.js.map +1 -1
  36. package/build/src/start/server/metro/fetchRouterManifest.js +1 -13
  37. package/build/src/start/server/metro/fetchRouterManifest.js.map +1 -1
  38. package/build/src/start/server/metro/instantiateMetro.js +1 -3
  39. package/build/src/start/server/metro/instantiateMetro.js.map +1 -1
  40. package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js +47 -34
  41. package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js.map +1 -1
  42. package/build/src/start/server/middleware/ManifestMiddleware.js +27 -4
  43. package/build/src/start/server/middleware/ManifestMiddleware.js.map +1 -1
  44. package/build/src/start/server/type-generation/routes.js +2 -62
  45. package/build/src/start/server/type-generation/routes.js.map +1 -1
  46. package/build/src/utils/build-cache-providers/index.js +1 -1
  47. package/build/src/utils/build-cache-providers/index.js.map +1 -1
  48. package/build/src/utils/codesigning.js +3 -17
  49. package/build/src/utils/codesigning.js.map +1 -1
  50. package/build/src/utils/createFileTransform.js +3 -38
  51. package/build/src/utils/createFileTransform.js.map +1 -1
  52. package/build/src/utils/downloadAppAsync.js +1 -12
  53. package/build/src/utils/downloadAppAsync.js.map +1 -1
  54. package/build/src/utils/fetch.js +23 -4
  55. package/build/src/utils/fetch.js.map +1 -1
  56. package/build/src/utils/freeport.js +21 -5
  57. package/build/src/utils/freeport.js.map +1 -1
  58. package/build/src/utils/getOrPromptApplicationId.js +2 -15
  59. package/build/src/utils/getOrPromptApplicationId.js.map +1 -1
  60. package/build/src/utils/npm.js +60 -65
  61. package/build/src/utils/npm.js.map +1 -1
  62. package/build/src/utils/port.js +4 -4
  63. package/build/src/utils/port.js.map +1 -1
  64. package/build/src/utils/resolveGlobal.js +195 -0
  65. package/build/src/utils/resolveGlobal.js.map +1 -0
  66. package/build/src/utils/tar.js +138 -69
  67. package/build/src/utils/tar.js.map +1 -1
  68. package/build/src/utils/telemetry/clients/FetchClient.js +12 -24
  69. package/build/src/utils/telemetry/clients/FetchClient.js.map +1 -1
  70. package/build/src/utils/telemetry/utils/context.js +1 -1
  71. package/package.json +18 -28
  72. package/build/src/api/graphql/types/App.js +0 -29
  73. package/build/src/api/graphql/types/App.js.map +0 -1
  74. package/build/src/api/rest/wrapFetchWithProxy.js +0 -31
  75. package/build/src/api/rest/wrapFetchWithProxy.js.map +0 -1
  76. package/build/src/graphql/generated.js +0 -1196
  77. package/build/src/graphql/generated.js.map +0 -1
  78. package/build/src/start/server/middleware/createBuiltinAPIRequestHandler.js +0 -85
  79. package/build/src/start/server/middleware/createBuiltinAPIRequestHandler.js.map +0 -1
  80. package/build/src/utils/multipartMixed.js +0 -56
  81. package/build/src/utils/multipartMixed.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/getOrPromptApplicationId.ts"],"sourcesContent":["import { GraphQLError } from '@0no-co/graphql.web';\nimport { ExpoConfig, getConfig } from '@expo/config';\nimport { CombinedError } from '@urql/core';\nimport chalk from 'chalk';\n\nimport { memoize } from './fn';\nimport { learnMore } from './link';\nimport { attemptModification } from './modifyConfigAsync';\nimport prompt, { confirmAsync } from './prompts';\nimport {\n assertValidBundleId,\n assertValidPackage,\n getBundleIdWarningAsync,\n getPackageNameWarningAsync,\n getSanitizedBundleIdentifier,\n getSanitizedPackage,\n validateBundleId,\n validatePackage,\n validatePackageWithWarning,\n} from './validateApplicationId';\nimport { AppQuery } from '../api/graphql/queries/AppQuery';\nimport { getSettings } from '../api/user/UserSettings';\nimport * as Log from '../log';\n\nconst debug = require('debug')('expo:app-id') as typeof console.log;\n\nconst ANONYMOUS_USERNAME = 'anonymous';\n\nasync function getRecommendedReverseDomainNameSecondPartAsync(\n exp: ExpoConfig\n): Promise<string | null> {\n // Get the cached username.\n const cachedUsername = getSettings().read().auth?.username;\n if (cachedUsername) {\n return cachedUsername;\n }\n const easProjectId = exp.extra?.eas?.projectId;\n if (!easProjectId) {\n return null;\n }\n\n try {\n const app = await AppQuery.byIdAsync(easProjectId);\n return app.ownerAccount.name;\n } catch (e) {\n if (e instanceof GraphQLError || e instanceof CombinedError) {\n return null;\n }\n throw e;\n }\n}\n\nconst NO_BUNDLE_ID_MESSAGE = `Project must have a \\`ios.bundleIdentifier\\` set in the Expo config (app.json or app.config.js).`;\n\nconst NO_PACKAGE_MESSAGE = `Project must have a \\`android.package\\` set in the Expo config (app.json or app.config.js).`;\n\n/**\n * Get the bundle identifier from the Expo config or prompt the user to choose a new bundle identifier.\n * Prompted value will be validated against the App Store and a local regex.\n * If the project Expo config is a static JSON file, the bundle identifier will be updated in the config automatically.\n */\nexport async function getOrPromptForBundleIdentifierAsync(\n projectRoot: string,\n exp: ExpoConfig = getConfig(projectRoot).exp\n): Promise<string> {\n const current = exp.ios?.bundleIdentifier;\n if (current) {\n assertValidBundleId(current);\n return current;\n }\n\n return promptForBundleIdWithInitialAsync(\n projectRoot,\n exp,\n await getRecommendedBundleIdAsync(exp)\n );\n}\n\nconst memoLog = memoize(Log.log);\n\nasync function promptForBundleIdWithInitialAsync(\n projectRoot: string,\n exp: ExpoConfig,\n bundleIdentifier?: string\n): Promise<string> {\n if (!bundleIdentifier) {\n memoLog(\n chalk`\\n{bold 📝 iOS Bundle Identifier} {dim ${learnMore(\n 'https://expo.fyi/bundle-identifier'\n )}}\\n`\n );\n\n // Prompt the user for the bundle ID.\n // Even if the project is using a dynamic config we can still\n // prompt a better error message, recommend a default value, and help the user\n // validate their custom bundle ID upfront.\n const { input } = await prompt(\n {\n type: 'text',\n name: 'input',\n // The Apple helps people know this isn't an EAS feature.\n message: `What would you like your iOS bundle identifier to be?`,\n validate: validateBundleId,\n },\n {\n nonInteractiveHelp: NO_BUNDLE_ID_MESSAGE,\n }\n );\n bundleIdentifier = input as string;\n }\n\n // Warn the user if the bundle ID is already in use.\n const warning = await getBundleIdWarningAsync(bundleIdentifier);\n\n if (warning && !(await warnAndConfirmAsync(warning))) {\n // Cycle the Bundle ID prompt to try again.\n return await promptForBundleIdWithInitialAsync(projectRoot, exp);\n }\n\n // Apply the changes to the config.\n if (\n await attemptModification(\n projectRoot,\n {\n ios: { ...(exp.ios || {}), bundleIdentifier },\n },\n { ios: { bundleIdentifier } }\n )\n ) {\n Log.log(chalk.gray`\\u203A Apple bundle identifier: ${bundleIdentifier}`);\n }\n\n return bundleIdentifier;\n}\n\nasync function warnAndConfirmAsync(warning: string): Promise<boolean> {\n Log.log();\n Log.warn(warning);\n Log.log();\n if (\n !(await confirmAsync({\n message: `Continue?`,\n initial: true,\n }))\n ) {\n return false;\n }\n return true;\n}\n\n// Recommend a bundle identifier based on the account name of the owner of the project and project slug.\nasync function getRecommendedBundleIdAsync(exp: ExpoConfig): Promise<string | undefined> {\n const possibleIdFromAndroid = exp.android?.package\n ? getSanitizedBundleIdentifier(exp.android.package)\n : undefined;\n // Attempt to use the android package name first since it's convenient to have them aligned.\n if (possibleIdFromAndroid && validateBundleId(possibleIdFromAndroid)) {\n return possibleIdFromAndroid;\n } else {\n const recommendedReverseDomainNameSecondPart =\n (await getRecommendedReverseDomainNameSecondPartAsync(exp)) ?? ANONYMOUS_USERNAME;\n const possibleId = getSanitizedBundleIdentifier(\n `com.${recommendedReverseDomainNameSecondPart}.${exp.slug}`\n );\n if (validateBundleId(possibleId)) {\n return possibleId;\n }\n }\n\n return undefined;\n}\n\n// Recommend a package name based on the account name of the owner of the project and project slug.\nasync function getRecommendedPackageNameAsync(exp: ExpoConfig): Promise<string | undefined> {\n const possibleIdFromApple = exp.ios?.bundleIdentifier\n ? getSanitizedPackage(exp.ios.bundleIdentifier)\n : undefined;\n\n // Attempt to use the ios bundle id first since it's convenient to have them aligned.\n if (possibleIdFromApple && validatePackage(possibleIdFromApple)) {\n return possibleIdFromApple;\n } else {\n const recommendedReverseDomainNameSecondPart =\n (await getRecommendedReverseDomainNameSecondPartAsync(exp)) ?? ANONYMOUS_USERNAME;\n\n const possibleId = getSanitizedPackage(\n `com.${recommendedReverseDomainNameSecondPart}.${exp.slug}`\n );\n if (validatePackage(possibleId)) {\n return possibleId;\n } else {\n debug(\n `Recommended package name is invalid: \"${possibleId}\" (owner: ${recommendedReverseDomainNameSecondPart}, slug: ${exp.slug})`\n );\n }\n }\n return undefined;\n}\n\n/**\n * Get the package name from the Expo config or prompt the user to choose a new package name.\n * Prompted value will be validated against the Play Store and a local regex.\n * If the project Expo config is a static JSON file, the package name will be updated in the config automatically.\n */\nexport async function getOrPromptForPackageAsync(\n projectRoot: string,\n exp: ExpoConfig = getConfig(projectRoot).exp\n): Promise<string> {\n const current = exp.android?.package;\n if (current) {\n assertValidPackage(current);\n return current;\n }\n\n return await promptForPackageAsync(projectRoot, exp);\n}\n\nasync function promptForPackageAsync(projectRoot: string, exp: ExpoConfig): Promise<string> {\n return promptForPackageWithInitialAsync(\n projectRoot,\n exp,\n await getRecommendedPackageNameAsync(exp)\n );\n}\n\nasync function promptForPackageWithInitialAsync(\n projectRoot: string,\n exp: ExpoConfig,\n packageName?: string\n): Promise<string> {\n if (!packageName) {\n memoLog(\n chalk`\\n{bold 📝 Android package} {dim ${learnMore('https://expo.fyi/android-package')}}\\n`\n );\n\n // Prompt the user for the android package.\n // Even if the project is using a dynamic config we can still\n // prompt a better error message, recommend a default value, and help the user\n // validate their custom android package upfront.\n const { input } = await prompt(\n {\n type: 'text',\n name: 'input',\n message: `What would you like your Android package name to be?`,\n validate: validatePackageWithWarning,\n },\n {\n nonInteractiveHelp: NO_PACKAGE_MESSAGE,\n }\n );\n packageName = input as string;\n }\n\n // Warn the user if the package name is already in use.\n const warning = await getPackageNameWarningAsync(packageName);\n if (warning && !(await warnAndConfirmAsync(warning))) {\n // Cycle the Package name prompt to try again.\n return promptForPackageWithInitialAsync(projectRoot, exp);\n }\n\n // Apply the changes to the config.\n if (\n await attemptModification(\n projectRoot,\n {\n android: { ...(exp.android || {}), package: packageName },\n },\n {\n android: { package: packageName },\n }\n )\n ) {\n Log.log(chalk.gray`\\u203A Android package name: ${packageName}`);\n }\n\n return packageName;\n}\n"],"names":["getOrPromptForBundleIdentifierAsync","getOrPromptForPackageAsync","debug","require","ANONYMOUS_USERNAME","getRecommendedReverseDomainNameSecondPartAsync","exp","getSettings","cachedUsername","read","auth","username","easProjectId","extra","eas","projectId","app","AppQuery","byIdAsync","ownerAccount","name","e","GraphQLError","CombinedError","NO_BUNDLE_ID_MESSAGE","NO_PACKAGE_MESSAGE","projectRoot","getConfig","current","ios","bundleIdentifier","assertValidBundleId","promptForBundleIdWithInitialAsync","getRecommendedBundleIdAsync","memoLog","memoize","Log","log","chalk","learnMore","input","prompt","type","message","validate","validateBundleId","nonInteractiveHelp","warning","getBundleIdWarningAsync","warnAndConfirmAsync","attemptModification","gray","warn","confirmAsync","initial","possibleIdFromAndroid","android","package","getSanitizedBundleIdentifier","undefined","recommendedReverseDomainNameSecondPart","possibleId","slug","getRecommendedPackageNameAsync","possibleIdFromApple","getSanitizedPackage","validatePackage","assertValidPackage","promptForPackageAsync","promptForPackageWithInitialAsync","packageName","validatePackageWithWarning","getPackageNameWarningAsync"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/utils/getOrPromptApplicationId.ts"],"sourcesContent":["import { ExpoConfig, getConfig } from '@expo/config';\nimport chalk from 'chalk';\n\nimport { memoize } from './fn';\nimport { learnMore } from './link';\nimport { attemptModification } from './modifyConfigAsync';\nimport prompt, { confirmAsync } from './prompts';\nimport {\n assertValidBundleId,\n assertValidPackage,\n getBundleIdWarningAsync,\n getPackageNameWarningAsync,\n getSanitizedBundleIdentifier,\n getSanitizedPackage,\n validateBundleId,\n validatePackage,\n validatePackageWithWarning,\n} from './validateApplicationId';\nimport { UnexpectedServerError, UnexpectedServerData } from '../api/graphql/client';\nimport { AppQuery } from '../api/graphql/queries/AppQuery';\nimport { getSettings } from '../api/user/UserSettings';\nimport * as Log from '../log';\n\nconst debug = require('debug')('expo:app-id') as typeof console.log;\n\nconst ANONYMOUS_USERNAME = 'anonymous';\n\nasync function getRecommendedReverseDomainNameSecondPartAsync(\n exp: ExpoConfig\n): Promise<string | null> {\n // Get the cached username.\n const cachedUsername = getSettings().read().auth?.username;\n if (cachedUsername) {\n return cachedUsername;\n }\n const easProjectId = exp.extra?.eas?.projectId;\n if (!easProjectId) {\n return null;\n }\n\n try {\n const app = await AppQuery.byIdAsync(easProjectId);\n return app.ownerAccount.name;\n } catch (e) {\n if (e instanceof UnexpectedServerData || e instanceof UnexpectedServerError) {\n return null;\n }\n throw e;\n }\n}\n\nconst NO_BUNDLE_ID_MESSAGE = `Project must have a \\`ios.bundleIdentifier\\` set in the Expo config (app.json or app.config.js).`;\n\nconst NO_PACKAGE_MESSAGE = `Project must have a \\`android.package\\` set in the Expo config (app.json or app.config.js).`;\n\n/**\n * Get the bundle identifier from the Expo config or prompt the user to choose a new bundle identifier.\n * Prompted value will be validated against the App Store and a local regex.\n * If the project Expo config is a static JSON file, the bundle identifier will be updated in the config automatically.\n */\nexport async function getOrPromptForBundleIdentifierAsync(\n projectRoot: string,\n exp: ExpoConfig = getConfig(projectRoot).exp\n): Promise<string> {\n const current = exp.ios?.bundleIdentifier;\n if (current) {\n assertValidBundleId(current);\n return current;\n }\n\n return promptForBundleIdWithInitialAsync(\n projectRoot,\n exp,\n await getRecommendedBundleIdAsync(exp)\n );\n}\n\nconst memoLog = memoize(Log.log);\n\nasync function promptForBundleIdWithInitialAsync(\n projectRoot: string,\n exp: ExpoConfig,\n bundleIdentifier?: string\n): Promise<string> {\n if (!bundleIdentifier) {\n memoLog(\n chalk`\\n{bold 📝 iOS Bundle Identifier} {dim ${learnMore(\n 'https://expo.fyi/bundle-identifier'\n )}}\\n`\n );\n\n // Prompt the user for the bundle ID.\n // Even if the project is using a dynamic config we can still\n // prompt a better error message, recommend a default value, and help the user\n // validate their custom bundle ID upfront.\n const { input } = await prompt(\n {\n type: 'text',\n name: 'input',\n // The Apple helps people know this isn't an EAS feature.\n message: `What would you like your iOS bundle identifier to be?`,\n validate: validateBundleId,\n },\n {\n nonInteractiveHelp: NO_BUNDLE_ID_MESSAGE,\n }\n );\n bundleIdentifier = input as string;\n }\n\n // Warn the user if the bundle ID is already in use.\n const warning = await getBundleIdWarningAsync(bundleIdentifier);\n\n if (warning && !(await warnAndConfirmAsync(warning))) {\n // Cycle the Bundle ID prompt to try again.\n return await promptForBundleIdWithInitialAsync(projectRoot, exp);\n }\n\n // Apply the changes to the config.\n if (\n await attemptModification(\n projectRoot,\n {\n ios: { ...(exp.ios || {}), bundleIdentifier },\n },\n { ios: { bundleIdentifier } }\n )\n ) {\n Log.log(chalk.gray`\\u203A Apple bundle identifier: ${bundleIdentifier}`);\n }\n\n return bundleIdentifier;\n}\n\nasync function warnAndConfirmAsync(warning: string): Promise<boolean> {\n Log.log();\n Log.warn(warning);\n Log.log();\n if (\n !(await confirmAsync({\n message: `Continue?`,\n initial: true,\n }))\n ) {\n return false;\n }\n return true;\n}\n\n// Recommend a bundle identifier based on the account name of the owner of the project and project slug.\nasync function getRecommendedBundleIdAsync(exp: ExpoConfig): Promise<string | undefined> {\n const possibleIdFromAndroid = exp.android?.package\n ? getSanitizedBundleIdentifier(exp.android.package)\n : undefined;\n // Attempt to use the android package name first since it's convenient to have them aligned.\n if (possibleIdFromAndroid && validateBundleId(possibleIdFromAndroid)) {\n return possibleIdFromAndroid;\n } else {\n const recommendedReverseDomainNameSecondPart =\n (await getRecommendedReverseDomainNameSecondPartAsync(exp)) ?? ANONYMOUS_USERNAME;\n const possibleId = getSanitizedBundleIdentifier(\n `com.${recommendedReverseDomainNameSecondPart}.${exp.slug}`\n );\n if (validateBundleId(possibleId)) {\n return possibleId;\n }\n }\n\n return undefined;\n}\n\n// Recommend a package name based on the account name of the owner of the project and project slug.\nasync function getRecommendedPackageNameAsync(exp: ExpoConfig): Promise<string | undefined> {\n const possibleIdFromApple = exp.ios?.bundleIdentifier\n ? getSanitizedPackage(exp.ios.bundleIdentifier)\n : undefined;\n\n // Attempt to use the ios bundle id first since it's convenient to have them aligned.\n if (possibleIdFromApple && validatePackage(possibleIdFromApple)) {\n return possibleIdFromApple;\n } else {\n const recommendedReverseDomainNameSecondPart =\n (await getRecommendedReverseDomainNameSecondPartAsync(exp)) ?? ANONYMOUS_USERNAME;\n\n const possibleId = getSanitizedPackage(\n `com.${recommendedReverseDomainNameSecondPart}.${exp.slug}`\n );\n if (validatePackage(possibleId)) {\n return possibleId;\n } else {\n debug(\n `Recommended package name is invalid: \"${possibleId}\" (owner: ${recommendedReverseDomainNameSecondPart}, slug: ${exp.slug})`\n );\n }\n }\n return undefined;\n}\n\n/**\n * Get the package name from the Expo config or prompt the user to choose a new package name.\n * Prompted value will be validated against the Play Store and a local regex.\n * If the project Expo config is a static JSON file, the package name will be updated in the config automatically.\n */\nexport async function getOrPromptForPackageAsync(\n projectRoot: string,\n exp: ExpoConfig = getConfig(projectRoot).exp\n): Promise<string> {\n const current = exp.android?.package;\n if (current) {\n assertValidPackage(current);\n return current;\n }\n\n return await promptForPackageAsync(projectRoot, exp);\n}\n\nasync function promptForPackageAsync(projectRoot: string, exp: ExpoConfig): Promise<string> {\n return promptForPackageWithInitialAsync(\n projectRoot,\n exp,\n await getRecommendedPackageNameAsync(exp)\n );\n}\n\nasync function promptForPackageWithInitialAsync(\n projectRoot: string,\n exp: ExpoConfig,\n packageName?: string\n): Promise<string> {\n if (!packageName) {\n memoLog(\n chalk`\\n{bold 📝 Android package} {dim ${learnMore('https://expo.fyi/android-package')}}\\n`\n );\n\n // Prompt the user for the android package.\n // Even if the project is using a dynamic config we can still\n // prompt a better error message, recommend a default value, and help the user\n // validate their custom android package upfront.\n const { input } = await prompt(\n {\n type: 'text',\n name: 'input',\n message: `What would you like your Android package name to be?`,\n validate: validatePackageWithWarning,\n },\n {\n nonInteractiveHelp: NO_PACKAGE_MESSAGE,\n }\n );\n packageName = input as string;\n }\n\n // Warn the user if the package name is already in use.\n const warning = await getPackageNameWarningAsync(packageName);\n if (warning && !(await warnAndConfirmAsync(warning))) {\n // Cycle the Package name prompt to try again.\n return promptForPackageWithInitialAsync(projectRoot, exp);\n }\n\n // Apply the changes to the config.\n if (\n await attemptModification(\n projectRoot,\n {\n android: { ...(exp.android || {}), package: packageName },\n },\n {\n android: { package: packageName },\n }\n )\n ) {\n Log.log(chalk.gray`\\u203A Android package name: ${packageName}`);\n }\n\n return packageName;\n}\n"],"names":["getOrPromptForBundleIdentifierAsync","getOrPromptForPackageAsync","debug","require","ANONYMOUS_USERNAME","getRecommendedReverseDomainNameSecondPartAsync","exp","getSettings","cachedUsername","read","auth","username","easProjectId","extra","eas","projectId","app","AppQuery","byIdAsync","ownerAccount","name","e","UnexpectedServerData","UnexpectedServerError","NO_BUNDLE_ID_MESSAGE","NO_PACKAGE_MESSAGE","projectRoot","getConfig","current","ios","bundleIdentifier","assertValidBundleId","promptForBundleIdWithInitialAsync","getRecommendedBundleIdAsync","memoLog","memoize","Log","log","chalk","learnMore","input","prompt","type","message","validate","validateBundleId","nonInteractiveHelp","warning","getBundleIdWarningAsync","warnAndConfirmAsync","attemptModification","gray","warn","confirmAsync","initial","possibleIdFromAndroid","android","package","getSanitizedBundleIdentifier","undefined","recommendedReverseDomainNameSecondPart","possibleId","slug","getRecommendedPackageNameAsync","possibleIdFromApple","getSanitizedPackage","validatePackage","assertValidPackage","promptForPackageAsync","promptForPackageWithInitialAsync","packageName","validatePackageWithWarning","getPackageNameWarningAsync"],"mappings":"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"}
@@ -34,6 +34,13 @@ _export(exports, {
34
34
  return sanitizeNpmPackageName;
35
35
  }
36
36
  });
37
+ function _configplugins() {
38
+ const data = require("@expo/config-plugins");
39
+ _configplugins = function() {
40
+ return data;
41
+ };
42
+ return data;
43
+ }
37
44
  function _spawnasync() {
38
45
  const data = /*#__PURE__*/ _interop_require_default(require("@expo/spawn-async"));
39
46
  _spawnasync = function() {
@@ -41,30 +48,30 @@ function _spawnasync() {
41
48
  };
42
49
  return data;
43
50
  }
44
- function _assert() {
45
- const data = /*#__PURE__*/ _interop_require_default(require("assert"));
46
- _assert = function() {
51
+ function _multitars() {
52
+ const data = require("multitars");
53
+ _multitars = function() {
47
54
  return data;
48
55
  };
49
56
  return data;
50
57
  }
51
- function _crypto() {
52
- const data = /*#__PURE__*/ _interop_require_default(require("crypto"));
53
- _crypto = function() {
58
+ function _nodeassert() {
59
+ const data = /*#__PURE__*/ _interop_require_default(require("node:assert"));
60
+ _nodeassert = function() {
54
61
  return data;
55
62
  };
56
63
  return data;
57
64
  }
58
- function _fs() {
59
- const data = /*#__PURE__*/ _interop_require_default(require("fs"));
60
- _fs = function() {
65
+ function _nodefs() {
66
+ const data = /*#__PURE__*/ _interop_require_default(require("node:fs"));
67
+ _nodefs = function() {
61
68
  return data;
62
69
  };
63
70
  return data;
64
71
  }
65
- function _path() {
66
- const data = /*#__PURE__*/ _interop_require_default(require("path"));
67
- _path = function() {
72
+ function _nodepath() {
73
+ const data = /*#__PURE__*/ _interop_require_default(require("node:path"));
74
+ _nodepath = function() {
68
75
  return data;
69
76
  };
70
77
  return data;
@@ -83,33 +90,14 @@ function _stream() {
83
90
  };
84
91
  return data;
85
92
  }
86
- function _tar() {
87
- const data = require("tar");
88
- _tar = function() {
89
- return data;
90
- };
91
- return data;
92
- }
93
- function _util() {
94
- const data = require("util");
95
- _util = function() {
96
- return data;
97
- };
98
- return data;
99
- }
100
- const _createFileTransform = require("./createFileTransform");
101
- const _dir = require("./dir");
102
93
  const _errors = require("./errors");
103
- const _client = require("../api/rest/client");
94
+ const _tar = require("./tar");
104
95
  function _interop_require_default(obj) {
105
96
  return obj && obj.__esModule ? obj : {
106
97
  default: obj
107
98
  };
108
99
  }
109
100
  const debug = require('debug')('expo:utils:npm');
110
- const cachedFetch = (0, _client.createCachedFetch)({
111
- cacheDirectory: 'template-cache'
112
- });
113
101
  function sanitizeNpmPackageName(name) {
114
102
  // https://github.com/npm/validate-npm-package-name/#naming-rules
115
103
  return applyKnownNpmPackageNameRules(name) || applyKnownNpmPackageNameRules((0, _slugify().default)(name)) || // If nothing is left use 'app' like we do in Xcode projects.
@@ -147,7 +135,7 @@ async function npmViewAsync(...props) {
147
135
  }
148
136
  async function getNpmUrlAsync(packageName) {
149
137
  const results = await npmViewAsync(packageName, 'dist');
150
- (0, _assert().default)(results, `Could not get npm url for package "${packageName}"`);
138
+ (0, _nodeassert().default)(results, `Could not get npm url for package "${packageName}"`);
151
139
  // Fully qualified url returns an object.
152
140
  // Example:
153
141
  // 𝝠 npm view expo-template-bare-minimum@sdk-33 dist --json
@@ -165,42 +153,49 @@ async function getNpmUrlAsync(packageName) {
165
153
  }
166
154
  throw new _errors.CommandError('Expected results of `npm view ...` to be an array or string. Instead found: ' + results);
167
155
  }
168
- // @ts-ignore
169
- const pipeline = (0, _util().promisify)(_stream().Stream.pipeline);
170
- async function downloadAndExtractNpmModuleAsync(npmName, props) {
171
- const url = await getNpmUrlAsync(npmName);
172
- debug('Fetch from URL:', url);
173
- return await extractNpmTarballFromUrlAsync(url, props);
156
+ function renameNpmTarballEntries(expName) {
157
+ const renameConfigs = (input, typeflag)=>{
158
+ if (typeflag === _multitars().TarTypeFlag.FILE && _nodepath().default.basename(input) === 'gitignore') {
159
+ // Rename `gitignore` because npm ignores files named `.gitignore` when publishing.
160
+ // See: https://github.com/npm/npm/issues/1862
161
+ return input.replace(/gitignore$/, '.gitignore');
162
+ } else {
163
+ return input;
164
+ }
165
+ };
166
+ if (expName) {
167
+ const androidName = _configplugins().IOSConfig.XcodeUtils.sanitizedName(expName.toLowerCase());
168
+ const iosName = _configplugins().IOSConfig.XcodeUtils.sanitizedName(expName);
169
+ const lowerCaseName = iosName.toLowerCase();
170
+ return (input, typeflag)=>{
171
+ input = input.replace(/HelloWorld/g, input.includes('android') ? androidName : iosName).replace(/helloworld/g, lowerCaseName);
172
+ return renameConfigs(input, typeflag);
173
+ };
174
+ } else {
175
+ return renameConfigs;
176
+ }
174
177
  }
175
- async function extractLocalNpmTarballAsync(tarFilePath, props) {
176
- const readStream = _fs().default.createReadStream(tarFilePath);
177
- return await extractNpmTarballAsync(readStream, props);
178
+ async function extractNpmTarballAsync(stream, output, props) {
179
+ return await (0, _tar.extractStream)(stream, output, {
180
+ filter: props.filter,
181
+ rename: renameNpmTarballEntries(props.expName),
182
+ strip: props.strip ?? 1
183
+ });
178
184
  }
179
- async function createUrlStreamAsync(url) {
180
- const response = await cachedFetch(url);
185
+ async function extractNpmTarballFromUrlAsync(url, output, props) {
186
+ const response = await fetch(url);
181
187
  if (!response.ok || !response.body) {
182
188
  throw new Error(`Unexpected response: ${response.statusText}. From url: ${url}`);
183
189
  }
184
- return _stream().Readable.fromWeb(response.body);
185
- }
186
- async function extractNpmTarballFromUrlAsync(url, props) {
187
- return await extractNpmTarballAsync(await createUrlStreamAsync(url), props);
188
- }
189
- async function extractNpmTarballAsync(stream, props) {
190
- const { cwd, strip, name, fileList = [], filter } = props;
191
- await (0, _dir.ensureDirectoryAsync)(cwd);
192
- const hash = _crypto().default.createHash(props.checksumAlgorithm ?? 'md5');
193
- const transformStream = new (_stream()).PassThrough();
194
- transformStream.on('data', (chunk)=>{
195
- hash.update(chunk);
196
- });
197
- await pipeline(stream, transformStream, (0, _tar().extract)({
198
- cwd,
199
- filter,
200
- onentry: (0, _createFileTransform.createEntryResolver)(name),
201
- strip: strip ?? 1
202
- }, fileList));
203
- return hash.digest('hex');
190
+ return await extractNpmTarballAsync(response.body, output, props);
191
+ }
192
+ async function downloadAndExtractNpmModuleAsync(npmName, output, props) {
193
+ const url = await getNpmUrlAsync(npmName);
194
+ debug('Fetch from URL:', url);
195
+ return await extractNpmTarballFromUrlAsync(url, output, props);
196
+ }
197
+ async function extractLocalNpmTarballAsync(tarFilePath, output, props) {
198
+ return await extractNpmTarballAsync(_stream().Readable.toWeb(_nodefs().default.createReadStream(tarFilePath)), output, props);
204
199
  }
205
200
  async function packNpmTarballAsync(packageDir) {
206
201
  var _stdout;
@@ -217,7 +212,7 @@ async function packNpmTarballAsync(packageDir) {
217
212
  })).stdout) == null ? void 0 : _stdout.trim();
218
213
  try {
219
214
  const [json] = JSON.parse(results);
220
- return _path().default.resolve(packageDir, json.filename);
215
+ return _nodepath().default.resolve(packageDir, json.filename);
221
216
  } catch (error) {
222
217
  const cmdString = `npm ${cmdArgs.join(' ')}`;
223
218
  throw new Error(`Could not parse JSON returned from "${cmdString}".\n\n${results}\n\nError: ${error.message}`);
@@ -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 crypto from 'crypto';\nimport fs from 'fs';\nimport path from 'path';\nimport slugify from 'slugify';\nimport { PassThrough, Readable, Stream } from 'stream';\nimport { extract as tarExtract, TarOptionsWithAliases } from 'tar';\nimport { promisify } from 'util';\n\nimport { createEntryResolver } 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');\n\n assert(results, `Could not get npm url for package \"${packageName}\"`);\n\n // Fully qualified url returns an object.\n // Example:\n // 𝝠 npm view expo-template-bare-minimum@sdk-33 dist --json\n if (typeof results === 'object' && !Array.isArray(results)) {\n return results.tarball as string;\n }\n\n // When the tag is arbitrary, the tarball is an array, return the last value as it's the most recent.\n // Example:\n // 𝝠 npm view expo-template-bare-minimum@33 dist --json\n if (Array.isArray(results)) {\n const lastResult = results[results.length - 1];\n\n if (lastResult && typeof lastResult === 'object' && !Array.isArray(lastResult)) {\n return lastResult.tarball as string;\n }\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\nexport type 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 /** An optional filter to selectively extract specific paths */\n filter?: TarOptionsWithAliases['filter'];\n};\n\nasync function createUrlStreamAsync(url: string) {\n const response = await cachedFetch(url);\n if (!response.ok || !response.body) {\n throw new Error(`Unexpected response: ${response.statusText}. From url: ${url}`);\n }\n\n return Readable.fromWeb(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 = [], filter } = 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 tarExtract(\n {\n cwd,\n filter,\n onentry: createEntryResolver(name),\n strip: strip ?? 1,\n },\n fileList\n )\n );\n\n return hash.digest('hex');\n}\n\nexport async function packNpmTarballAsync(packageDir: string): Promise<string> {\n const cmdArgs = ['pack', '--json', '--foreground-scripts=false'];\n const results = (\n await spawnAsync('npm', cmdArgs, {\n env: { ...process.env },\n cwd: packageDir,\n })\n ).stdout?.trim();\n try {\n const [json] = JSON.parse(results) as { filename: string }[];\n return path.resolve(packageDir, json.filename);\n } catch (error: any) {\n const cmdString = `npm ${cmdArgs.join(' ')}`;\n throw new Error(\n `Could not parse JSON returned from \"${cmdString}\".\\n\\n${results}\\n\\nError: ${error.message}`\n );\n }\n}\n"],"names":["downloadAndExtractNpmModuleAsync","extractLocalNpmTarballAsync","extractNpmTarballAsync","extractNpmTarballFromUrlAsync","getNpmUrlAsync","npmViewAsync","packNpmTarballAsync","sanitizeNpmPackageName","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","tarball","lastResult","length","CommandError","pipeline","promisify","Stream","npmName","url","tarFilePath","readStream","fs","createReadStream","createUrlStreamAsync","response","ok","body","statusText","Readable","fromWeb","stream","cwd","strip","fileList","filter","ensureDirectoryAsync","hash","crypto","createHash","checksumAlgorithm","transformStream","PassThrough","on","chunk","update","tarExtract","onentry","createEntryResolver","digest","packageDir","cmdArgs","env","process","json","path","resolve","filename"],"mappings":";;;;;;;;;;;IAsGsBA,gCAAgC;eAAhCA;;IAUAC,2BAA2B;eAA3BA;;IAsCAC,sBAAsB;eAAtBA;;IAVAC,6BAA6B;eAA7BA;;IArEAC,cAAc;eAAdA;;IAlBAC,YAAY;eAAZA;;IAgIAC,mBAAmB;eAAnBA;;IA7JNC,sBAAsB;eAAtBA;;;;gEAvBO;;;;;;;gEACJ;;;;;;;gEACA;;;;;;;gEACJ;;;;;;;gEACE;;;;;;;gEACG;;;;;;;yBAC0B;;;;;;;yBACe;;;;;;;yBACnC;;;;;;qCAEU;qBACC;wBACR;wBACK;;;;;;AAElC,MAAMC,QAAQC,QAAQ,SAAS;AAE/B,MAAMC,cAAcC,IAAAA,yBAAiB,EAAC;IACpCC,gBAAgB;AAGlB;AAEO,SAASL,uBAAuBM,IAAY;IACjD,iEAAiE;IACjE,OACEC,8BAA8BD,SAC9BC,8BAA8BC,IAAAA,kBAAO,EAACF,UACtC,6DAA6D;IAC7D;AAEJ;AAEA,SAASC,8BAA8BD,IAAY;IACjD,iEAAiE;IAEjE,6CAA6C;IAC7C,MAAO,UAAUG,IAAI,CAACH,MAAO;QAC3BA,OAAOA,KAAKI,SAAS,CAAC;IACxB;IAEAJ,OAAOA,KAAKK,WAAW,GAAGC,OAAO,CAAC,oBAAoB;IAEtD,OACEN,IACE,kCAAkC;IAClC,4BAA4B;KAC3BO,SAAS,CAAC,OACVD,OAAO,CAAC,oBAAoB,OAAO;AAE1C;AAEO,eAAed,aAAa,GAAGgB,KAAe;QAEnC;IADhB,MAAMC,MAAM;QAAC;WAAWD;QAAO;KAAS;IACxC,MAAME,WAAU,UAAA,AAAC,CAAA,MAAMC,IAAAA,qBAAU,EAAC,OAAOF,IAAG,EAAGG,MAAM,qBAArC,QAAuCC,IAAI;IAC3D,MAAMC,YAAY,CAAC,IAAI,EAAEL,IAAIM,IAAI,CAAC,MAAM;IACxCpB,MAAM,QAAQmB;IACd,IAAI,CAACJ,SAAS;QACZ,OAAO;IACT;IACA,IAAI;QACF,OAAOM,KAAKC,KAAK,CAACP;IACpB,EAAE,OAAOQ,OAAY;QACnB,MAAM,IAAIC,MACR,CAAC,oCAAoC,EAAEL,UAAU,MAAM,EAAEJ,QAAQ,WAAW,EAAEQ,MAAME,OAAO,EAAE;IAEjG;AACF;AAGO,eAAe7B,eAAe8B,WAAmB;IACtD,MAAMX,UAAU,MAAMlB,aAAa6B,aAAa;IAEhDC,IAAAA,iBAAM,EAACZ,SAAS,CAAC,mCAAmC,EAAEW,YAAY,CAAC,CAAC;IAEpE,yCAAyC;IACzC,WAAW;IACX,4DAA4D;IAC5D,IAAI,OAAOX,YAAY,YAAY,CAACa,MAAMC,OAAO,CAACd,UAAU;QAC1D,OAAOA,QAAQe,OAAO;IACxB;IAEA,qGAAqG;IACrG,WAAW;IACX,wDAAwD;IACxD,IAAIF,MAAMC,OAAO,CAACd,UAAU;QAC1B,MAAMgB,aAAahB,OAAO,CAACA,QAAQiB,MAAM,GAAG,EAAE;QAE9C,IAAID,cAAc,OAAOA,eAAe,YAAY,CAACH,MAAMC,OAAO,CAACE,aAAa;YAC9E,OAAOA,WAAWD,OAAO;QAC3B;IACF;IAEA,MAAM,IAAIG,oBAAY,CACpB,iFAAiFlB;AAErF;AAEA,aAAa;AACb,MAAMmB,WAAWC,IAAAA,iBAAS,EAACC,gBAAM,CAACF,QAAQ;AAEnC,eAAe1C,iCACpB6C,OAAe,EACfxB,KAAmB;IAEnB,MAAMyB,MAAM,MAAM1C,eAAeyC;IAEjCrC,MAAM,mBAAmBsC;IACzB,OAAO,MAAM3C,8BAA8B2C,KAAKzB;AAClD;AAEO,eAAepB,4BACpB8C,WAAmB,EACnB1B,KAAmB;IAEnB,MAAM2B,aAAaC,aAAE,CAACC,gBAAgB,CAACH;IACvC,OAAO,MAAM7C,uBAAuB8C,YAAY3B;AAClD;AAaA,eAAe8B,qBAAqBL,GAAW;IAC7C,MAAMM,WAAW,MAAM1C,YAAYoC;IACnC,IAAI,CAACM,SAASC,EAAE,IAAI,CAACD,SAASE,IAAI,EAAE;QAClC,MAAM,IAAItB,MAAM,CAAC,qBAAqB,EAAEoB,SAASG,UAAU,CAAC,YAAY,EAAET,KAAK;IACjF;IAEA,OAAOU,kBAAQ,CAACC,OAAO,CAACL,SAASE,IAAI;AACvC;AAEO,eAAenD,8BACpB2C,GAAW,EACXzB,KAAmB;IAEnB,OAAO,MAAMnB,uBAAuB,MAAMiD,qBAAqBL,MAAMzB;AACvE;AAKO,eAAenB,uBACpBwD,MAA6B,EAC7BrC,KAAmB;IAEnB,MAAM,EAAEsC,GAAG,EAAEC,KAAK,EAAE/C,IAAI,EAAEgD,WAAW,EAAE,EAAEC,MAAM,EAAE,GAAGzC;IAEpD,MAAM0C,IAAAA,yBAAoB,EAACJ;IAE3B,MAAMK,OAAOC,iBAAM,CAACC,UAAU,CAAC7C,MAAM8C,iBAAiB,IAAI;IAC1D,MAAMC,kBAAkB,IAAIC,CAAAA,SAAU,aAAC;IACvCD,gBAAgBE,EAAE,CAAC,QAAQ,CAACC;QAC1BP,KAAKQ,MAAM,CAACD;IACd;IAEA,MAAM7B,SACJgB,QACAU,iBACAK,IAAAA,cAAU,EACR;QACEd;QACAG;QACAY,SAASC,IAAAA,wCAAmB,EAAC9D;QAC7B+C,OAAOA,SAAS;IAClB,GACAC;IAIJ,OAAOG,KAAKY,MAAM,CAAC;AACrB;AAEO,eAAetE,oBAAoBuE,UAAkB;QAE1C;IADhB,MAAMC,UAAU;QAAC;QAAQ;QAAU;KAA6B;IAChE,MAAMvD,WAAU,UAAA,AACd,CAAA,MAAMC,IAAAA,qBAAU,EAAC,OAAOsD,SAAS;QAC/BC,KAAK;YAAE,GAAGC,QAAQD,GAAG;QAAC;QACtBpB,KAAKkB;IACP,EAAC,EACDpD,MAAM,qBALQ,QAKNC,IAAI;IACd,IAAI;QACF,MAAM,CAACuD,KAAK,GAAGpD,KAAKC,KAAK,CAACP;QAC1B,OAAO2D,eAAI,CAACC,OAAO,CAACN,YAAYI,KAAKG,QAAQ;IAC/C,EAAE,OAAOrD,OAAY;QACnB,MAAMJ,YAAY,CAAC,IAAI,EAAEmD,QAAQlD,IAAI,CAAC,MAAM;QAC5C,MAAM,IAAII,MACR,CAAC,oCAAoC,EAAEL,UAAU,MAAM,EAAEJ,QAAQ,WAAW,EAAEQ,MAAME,OAAO,EAAE;IAEjG;AACF"}
1
+ {"version":3,"sources":["../../../src/utils/npm.ts"],"sourcesContent":["import { IOSConfig } from '@expo/config-plugins';\nimport { JSONValue } from '@expo/json-file';\nimport spawnAsync from '@expo/spawn-async';\nimport { TarTypeFlag } from 'multitars';\nimport assert from 'node:assert';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport slugify from 'slugify';\nimport { Readable } from 'stream';\n\nimport { CommandError } from './errors';\nimport { extractStream } from './tar';\n\nconst debug = require('debug')('expo:utils:npm') as typeof console.log;\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');\n\n assert(results, `Could not get npm url for package \"${packageName}\"`);\n\n // Fully qualified url returns an object.\n // Example:\n // 𝝠 npm view expo-template-bare-minimum@sdk-33 dist --json\n if (typeof results === 'object' && !Array.isArray(results)) {\n return results.tarball as string;\n }\n\n // When the tag is arbitrary, the tarball is an array, return the last value as it's the most recent.\n // Example:\n // 𝝠 npm view expo-template-bare-minimum@33 dist --json\n if (Array.isArray(results)) {\n const lastResult = results[results.length - 1];\n\n if (lastResult && typeof lastResult === 'object' && !Array.isArray(lastResult)) {\n return lastResult.tarball as string;\n }\n }\n\n throw new CommandError(\n 'Expected results of `npm view ...` to be an array or string. Instead found: ' + results\n );\n}\n\nexport interface ExtractProps {\n expName?: string;\n filter?(path: string): boolean | undefined | null;\n strip?: number;\n}\n\nfunction renameNpmTarballEntries(expName: string | undefined) {\n const renameConfigs = (input: string, typeflag: TarTypeFlag): string | null => {\n if (typeflag === TarTypeFlag.FILE && path.basename(input) === 'gitignore') {\n // Rename `gitignore` because npm ignores files named `.gitignore` when publishing.\n // See: https://github.com/npm/npm/issues/1862\n return input.replace(/gitignore$/, '.gitignore');\n } else {\n return input;\n }\n };\n if (expName) {\n const androidName = IOSConfig.XcodeUtils.sanitizedName(expName.toLowerCase());\n const iosName = IOSConfig.XcodeUtils.sanitizedName(expName);\n const lowerCaseName = iosName.toLowerCase();\n return (input: string, typeflag: TarTypeFlag) => {\n input = input\n .replace(/HelloWorld/g, input.includes('android') ? androidName : iosName)\n .replace(/helloworld/g, lowerCaseName);\n return renameConfigs(input, typeflag);\n };\n } else {\n return renameConfigs;\n }\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: ReadableStream,\n output: string,\n props: ExtractProps\n): Promise<string> {\n return await extractStream(stream, output, {\n filter: props.filter,\n rename: renameNpmTarballEntries(props.expName),\n strip: props.strip ?? 1,\n });\n}\n\nexport async function extractNpmTarballFromUrlAsync(\n url: string,\n output: string,\n props: ExtractProps\n): Promise<string> {\n const response = await fetch(url);\n if (!response.ok || !response.body) {\n throw new Error(`Unexpected response: ${response.statusText}. From url: ${url}`);\n }\n return await extractNpmTarballAsync(response.body, output, props);\n}\n\nexport async function downloadAndExtractNpmModuleAsync(\n npmName: string,\n output: string,\n props: ExtractProps\n): Promise<string> {\n const url = await getNpmUrlAsync(npmName);\n debug('Fetch from URL:', url);\n return await extractNpmTarballFromUrlAsync(url, output, props);\n}\n\nexport async function extractLocalNpmTarballAsync(\n tarFilePath: string,\n output: string,\n props: ExtractProps\n): Promise<string> {\n return await extractNpmTarballAsync(\n Readable.toWeb(fs.createReadStream(tarFilePath)) as ReadableStream,\n output,\n props\n );\n}\n\nexport async function packNpmTarballAsync(packageDir: string): Promise<string> {\n const cmdArgs = ['pack', '--json', '--foreground-scripts=false'];\n const results = (\n await spawnAsync('npm', cmdArgs, {\n env: { ...process.env },\n cwd: packageDir,\n })\n ).stdout?.trim();\n try {\n const [json] = JSON.parse(results) as { filename: string }[];\n return path.resolve(packageDir, json.filename);\n } catch (error: any) {\n const cmdString = `npm ${cmdArgs.join(' ')}`;\n throw new Error(\n `Could not parse JSON returned from \"${cmdString}\".\\n\\n${results}\\n\\nError: ${error.message}`\n );\n }\n}\n"],"names":["downloadAndExtractNpmModuleAsync","extractLocalNpmTarballAsync","extractNpmTarballAsync","extractNpmTarballFromUrlAsync","getNpmUrlAsync","npmViewAsync","packNpmTarballAsync","sanitizeNpmPackageName","debug","require","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","tarball","lastResult","length","CommandError","renameNpmTarballEntries","expName","renameConfigs","input","typeflag","TarTypeFlag","FILE","path","basename","androidName","IOSConfig","XcodeUtils","sanitizedName","iosName","lowerCaseName","includes","stream","output","extractStream","filter","rename","strip","url","response","fetch","ok","body","statusText","npmName","tarFilePath","Readable","toWeb","fs","createReadStream","packageDir","cmdArgs","env","process","cwd","json","resolve","filename"],"mappings":"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"}
@@ -80,7 +80,7 @@ function _interop_require_wildcard(obj, nodeInterop) {
80
80
  return newObj;
81
81
  }
82
82
  async function getFreePortAsync(rangeStart) {
83
- const port = await (0, _freeport.testPortAsync)(rangeStart, [
83
+ const port = await (0, _freeport.freePortAsync)(rangeStart, [
84
84
  null,
85
85
  'localhost'
86
86
  ]);
@@ -90,11 +90,11 @@ async function getFreePortAsync(rangeStart) {
90
90
  return port;
91
91
  }
92
92
  async function ensurePortAvailabilityAsync(projectRoot, { port }) {
93
- const freePort = await (0, _freeport.testPortAsync)(port, [
93
+ const isFreePort = await (0, _freeport.testPortAsync)(port, [
94
94
  null
95
95
  ]);
96
96
  // Check if port has become busy during the build.
97
- if (freePort === port) {
97
+ if (isFreePort) {
98
98
  return true;
99
99
  }
100
100
  const isBusy = await isBusyPortRunningSameProcessAsync(projectRoot, {
@@ -128,7 +128,7 @@ async function isBusyPortRunningSameProcessAsync(projectRoot, { port }) {
128
128
  }
129
129
  async function choosePortAsync(projectRoot, { defaultPort, host, reuseExistingPort }) {
130
130
  try {
131
- const port = await (0, _freeport.testPortAsync)(defaultPort, [
131
+ const port = await (0, _freeport.freePortAsync)(defaultPort, [
132
132
  host ?? null
133
133
  ]);
134
134
  if (port === defaultPort || defaultPort === 0) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/port.ts"],"sourcesContent":["import chalk from 'chalk';\n\nimport { env } from './env';\nimport { CommandError } from './errors';\nimport { testPortAsync } from './freeport';\nimport * as Log from '../log';\n\n/** Get a free port or assert a CLI command error. */\nexport async function getFreePortAsync(rangeStart: number): Promise<number> {\n const port = await testPortAsync(rangeStart, [null, 'localhost']);\n if (!port) {\n throw new CommandError('NO_PORT_FOUND', 'No available port found');\n }\n\n return port;\n}\n\n/** @return `true` if the port can still be used to start the dev server, `false` if the dev server should be skipped, and asserts if the port is now taken. */\nexport async function ensurePortAvailabilityAsync(\n projectRoot: string,\n { port }: { port: number }\n): Promise<boolean> {\n const freePort = await testPortAsync(port, [null]);\n // Check if port has become busy during the build.\n if (freePort === port) {\n return true;\n }\n\n const isBusy = await isBusyPortRunningSameProcessAsync(projectRoot, { port });\n if (!isBusy) {\n throw new CommandError(\n `Port \"${port}\" became busy running another process while the app was compiling. Re-run command to use a new port.`\n );\n }\n\n // Log that the dev server will not be started and that the logs will appear in another window.\n Log.log(\n '› The dev server for this app is already running in another window. Logs will appear there.'\n );\n return false;\n}\n\nfunction isRestrictedPort(port: number) {\n if (process.platform !== 'win32' && port < 1024) {\n const isRoot = process.getuid && process.getuid() === 0;\n return !isRoot;\n }\n return false;\n}\n\nasync function isBusyPortRunningSameProcessAsync(projectRoot: string, { port }: { port: number }) {\n const { getRunningProcess } =\n require('./getRunningProcess') as typeof import('./getRunningProcess');\n\n const runningProcess = isRestrictedPort(port) ? null : getRunningProcess(port);\n if (runningProcess) {\n if (runningProcess.directory === projectRoot) {\n return true;\n } else {\n return false;\n }\n }\n\n return null;\n}\n\n// TODO(Bacon): Revisit after all start and run code is merged.\nexport async function choosePortAsync(\n projectRoot: string,\n {\n defaultPort,\n host,\n reuseExistingPort,\n }: {\n defaultPort: number;\n host?: string;\n reuseExistingPort?: boolean;\n }\n): Promise<number | null> {\n try {\n const port = await testPortAsync(defaultPort, [host ?? null]);\n if (port === defaultPort || defaultPort === 0) {\n return port;\n }\n\n const isRestricted = port && isRestrictedPort(port);\n\n let message = isRestricted\n ? `Admin permissions are required to run a server on a port below 1024`\n : `Port ${chalk.bold(defaultPort)} is`;\n\n const { getRunningProcess } =\n require('./getRunningProcess') as typeof import('./getRunningProcess');\n const runningProcess = isRestricted ? null : getRunningProcess(defaultPort);\n\n if (runningProcess) {\n const pidTag = chalk.gray(`(pid ${runningProcess.pid})`);\n if (runningProcess.directory === projectRoot) {\n message += ` running this app in another window`;\n if (reuseExistingPort) {\n return null;\n }\n } else {\n message += ` running ${chalk.cyan(runningProcess.command)} in another window`;\n }\n message += '\\n' + chalk.gray(` ${runningProcess.directory} ${pidTag}`);\n } else {\n message += ' being used by another process';\n }\n\n Log.log(`\\u203A ${message}`);\n const { confirmAsync } = require('./prompts') as typeof import('./prompts');\n const change = await confirmAsync({\n message: `Use port ${port} instead?`,\n initial: true,\n });\n return change ? port : null;\n } catch (error: any) {\n if (error.code === 'ABORTED') {\n throw error;\n } else if (error.code === 'NON_INTERACTIVE') {\n Log.warn(chalk.yellow(error.message));\n return null;\n }\n throw error;\n }\n}\n\n// TODO(Bacon): Revisit after all start and run code is merged.\nexport async function resolvePortAsync(\n projectRoot: string,\n {\n /** Should opt to reuse a port that is running the same project in another window. */\n reuseExistingPort,\n /** Preferred port. */\n defaultPort,\n /** Backup port for when the default isn't available. */\n fallbackPort,\n }: {\n reuseExistingPort?: boolean;\n defaultPort?: string | number;\n fallbackPort?: number;\n } = {}\n): Promise<number | null> {\n let port: number;\n if (typeof defaultPort === 'string') {\n port = parseInt(defaultPort, 10);\n } else if (typeof defaultPort === 'number') {\n port = defaultPort;\n } else {\n port = env.RCT_METRO_PORT || fallbackPort || 8081;\n }\n\n // Only check the port when the bundler is running.\n const resolvedPort = await choosePortAsync(projectRoot, {\n defaultPort: port,\n reuseExistingPort,\n });\n if (resolvedPort == null) {\n Log.log('\\u203A Skipping dev server');\n // Skip bundling if the port is null\n } else {\n // Use the new or resolved port\n process.env.RCT_METRO_PORT = String(resolvedPort);\n }\n\n return resolvedPort;\n}\n"],"names":["choosePortAsync","ensurePortAvailabilityAsync","getFreePortAsync","resolvePortAsync","rangeStart","port","testPortAsync","CommandError","projectRoot","freePort","isBusy","isBusyPortRunningSameProcessAsync","Log","log","isRestrictedPort","process","platform","isRoot","getuid","getRunningProcess","require","runningProcess","directory","defaultPort","host","reuseExistingPort","isRestricted","message","chalk","bold","pidTag","gray","pid","cyan","command","confirmAsync","change","initial","error","code","warn","yellow","fallbackPort","parseInt","env","RCT_METRO_PORT","resolvedPort","String"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/utils/port.ts"],"sourcesContent":["import chalk from 'chalk';\n\nimport { env } from './env';\nimport { CommandError } from './errors';\nimport { testPortAsync, freePortAsync } from './freeport';\nimport * as Log from '../log';\n\n/** Get a free port or assert a CLI command error. */\nexport async function getFreePortAsync(rangeStart: number): Promise<number> {\n const port = await freePortAsync(rangeStart, [null, 'localhost']);\n if (!port) {\n throw new CommandError('NO_PORT_FOUND', 'No available port found');\n }\n\n return port;\n}\n\n/** @return `true` if the port can still be used to start the dev server, `false` if the dev server should be skipped, and asserts if the port is now taken. */\nexport async function ensurePortAvailabilityAsync(\n projectRoot: string,\n { port }: { port: number }\n): Promise<boolean> {\n const isFreePort = await testPortAsync(port, [null]);\n // Check if port has become busy during the build.\n if (isFreePort) {\n return true;\n }\n\n const isBusy = await isBusyPortRunningSameProcessAsync(projectRoot, { port });\n if (!isBusy) {\n throw new CommandError(\n `Port \"${port}\" became busy running another process while the app was compiling. Re-run command to use a new port.`\n );\n }\n\n // Log that the dev server will not be started and that the logs will appear in another window.\n Log.log(\n '› The dev server for this app is already running in another window. Logs will appear there.'\n );\n return false;\n}\n\nfunction isRestrictedPort(port: number) {\n if (process.platform !== 'win32' && port < 1024) {\n const isRoot = process.getuid && process.getuid() === 0;\n return !isRoot;\n }\n return false;\n}\n\nasync function isBusyPortRunningSameProcessAsync(projectRoot: string, { port }: { port: number }) {\n const { getRunningProcess } =\n require('./getRunningProcess') as typeof import('./getRunningProcess');\n\n const runningProcess = isRestrictedPort(port) ? null : getRunningProcess(port);\n if (runningProcess) {\n if (runningProcess.directory === projectRoot) {\n return true;\n } else {\n return false;\n }\n }\n\n return null;\n}\n\n// TODO(Bacon): Revisit after all start and run code is merged.\nexport async function choosePortAsync(\n projectRoot: string,\n {\n defaultPort,\n host,\n reuseExistingPort,\n }: {\n defaultPort: number;\n host?: string;\n reuseExistingPort?: boolean;\n }\n): Promise<number | null> {\n try {\n const port = await freePortAsync(defaultPort, [host ?? null]);\n if (port === defaultPort || defaultPort === 0) {\n return port;\n }\n\n const isRestricted = port && isRestrictedPort(port);\n\n let message = isRestricted\n ? `Admin permissions are required to run a server on a port below 1024`\n : `Port ${chalk.bold(defaultPort)} is`;\n\n const { getRunningProcess } =\n require('./getRunningProcess') as typeof import('./getRunningProcess');\n const runningProcess = isRestricted ? null : getRunningProcess(defaultPort);\n\n if (runningProcess) {\n const pidTag = chalk.gray(`(pid ${runningProcess.pid})`);\n if (runningProcess.directory === projectRoot) {\n message += ` running this app in another window`;\n if (reuseExistingPort) {\n return null;\n }\n } else {\n message += ` running ${chalk.cyan(runningProcess.command)} in another window`;\n }\n message += '\\n' + chalk.gray(` ${runningProcess.directory} ${pidTag}`);\n } else {\n message += ' being used by another process';\n }\n\n Log.log(`\\u203A ${message}`);\n const { confirmAsync } = require('./prompts') as typeof import('./prompts');\n const change = await confirmAsync({\n message: `Use port ${port} instead?`,\n initial: true,\n });\n return change ? port : null;\n } catch (error: any) {\n if (error.code === 'ABORTED') {\n throw error;\n } else if (error.code === 'NON_INTERACTIVE') {\n Log.warn(chalk.yellow(error.message));\n return null;\n }\n throw error;\n }\n}\n\n// TODO(Bacon): Revisit after all start and run code is merged.\nexport async function resolvePortAsync(\n projectRoot: string,\n {\n /** Should opt to reuse a port that is running the same project in another window. */\n reuseExistingPort,\n /** Preferred port. */\n defaultPort,\n /** Backup port for when the default isn't available. */\n fallbackPort,\n }: {\n reuseExistingPort?: boolean;\n defaultPort?: string | number;\n fallbackPort?: number;\n } = {}\n): Promise<number | null> {\n let port: number;\n if (typeof defaultPort === 'string') {\n port = parseInt(defaultPort, 10);\n } else if (typeof defaultPort === 'number') {\n port = defaultPort;\n } else {\n port = env.RCT_METRO_PORT || fallbackPort || 8081;\n }\n\n // Only check the port when the bundler is running.\n const resolvedPort = await choosePortAsync(projectRoot, {\n defaultPort: port,\n reuseExistingPort,\n });\n if (resolvedPort == null) {\n Log.log('\\u203A Skipping dev server');\n // Skip bundling if the port is null\n } else {\n // Use the new or resolved port\n process.env.RCT_METRO_PORT = String(resolvedPort);\n }\n\n return resolvedPort;\n}\n"],"names":["choosePortAsync","ensurePortAvailabilityAsync","getFreePortAsync","resolvePortAsync","rangeStart","port","freePortAsync","CommandError","projectRoot","isFreePort","testPortAsync","isBusy","isBusyPortRunningSameProcessAsync","Log","log","isRestrictedPort","process","platform","isRoot","getuid","getRunningProcess","require","runningProcess","directory","defaultPort","host","reuseExistingPort","isRestricted","message","chalk","bold","pidTag","gray","pid","cyan","command","confirmAsync","change","initial","error","code","warn","yellow","fallbackPort","parseInt","env","RCT_METRO_PORT","resolvedPort","String"],"mappings":"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"}
@@ -0,0 +1,195 @@
1
+ // NOTE: This file is replicated to multiple packages! Keep these files in-sync:
2
+ // - packages/@expo/cli/src/utils/resolveGlobal.ts
3
+ // - packages/@expo/image-utils/src/resolveGlobal.ts
4
+ "use strict";
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ Object.defineProperty(exports, "resolveGlobal", {
9
+ enumerable: true,
10
+ get: function() {
11
+ return resolveGlobal;
12
+ }
13
+ });
14
+ function _child_process() {
15
+ const data = require("child_process");
16
+ _child_process = function() {
17
+ return data;
18
+ };
19
+ return data;
20
+ }
21
+ function _fs() {
22
+ const data = /*#__PURE__*/ _interop_require_default(require("fs"));
23
+ _fs = function() {
24
+ return data;
25
+ };
26
+ return data;
27
+ }
28
+ function _module() {
29
+ const data = /*#__PURE__*/ _interop_require_default(require("module"));
30
+ _module = function() {
31
+ return data;
32
+ };
33
+ return data;
34
+ }
35
+ function _os() {
36
+ const data = /*#__PURE__*/ _interop_require_default(require("os"));
37
+ _os = function() {
38
+ return data;
39
+ };
40
+ return data;
41
+ }
42
+ function _path() {
43
+ const data = /*#__PURE__*/ _interop_require_default(require("path"));
44
+ _path = function() {
45
+ return data;
46
+ };
47
+ return data;
48
+ }
49
+ function _interop_require_default(obj) {
50
+ return obj && obj.__esModule ? obj : {
51
+ default: obj
52
+ };
53
+ }
54
+ const memoize = (fn)=>{
55
+ let result;
56
+ return (...args)=>{
57
+ if (result === undefined) {
58
+ result = {
59
+ value: fn(...args)
60
+ };
61
+ }
62
+ return result.value;
63
+ };
64
+ };
65
+ const isWindows = process.platform === 'win32';
66
+ const getDelimitedPaths = (delimited)=>delimited.split(_path().default.delimiter).map((target)=>{
67
+ try {
68
+ const normalized = _path().default.normalize(target.trim());
69
+ if (!normalized) {
70
+ return null;
71
+ } else if (!_path().default.isAbsolute(normalized)) {
72
+ return _path().default.resolve(process.cwd(), normalized);
73
+ } else {
74
+ return normalized;
75
+ }
76
+ } catch {
77
+ return null;
78
+ }
79
+ }).filter((target)=>!!target);
80
+ const execGetPaths = (cmd, args)=>{
81
+ const result = (0, _child_process().spawnSync)(cmd, args, {
82
+ encoding: 'utf8'
83
+ });
84
+ if (!result.error && result.status === 0 && result.stdout) {
85
+ const paths = getDelimitedPaths(result.stdout.replace(/[\r\n]+/g, _path().default.delimiter));
86
+ return paths.filter((target)=>_fs().default.existsSync(target));
87
+ }
88
+ return [];
89
+ };
90
+ const getNativeNodePaths = ()=>{
91
+ if (Array.isArray(_module().default.globalPaths)) {
92
+ return _module().default.globalPaths;
93
+ } else {
94
+ return [];
95
+ }
96
+ };
97
+ const getHomePath = memoize(()=>{
98
+ try {
99
+ return _os().default.homedir();
100
+ } catch {
101
+ return isWindows ? process.env.UserProfile ?? process.env.USERPROFILE : process.env.HOME;
102
+ }
103
+ });
104
+ const getNpmDefaultPaths = ()=>{
105
+ const prefix = [];
106
+ const localAppData = process.env.LocalAppData || process.env.LOCALAPPDATA;
107
+ if (isWindows && localAppData) {
108
+ prefix.push(_path().default.resolve(localAppData, 'npm'));
109
+ } else if (!isWindows) {
110
+ prefix.push('/usr/local/lib/node_modules');
111
+ }
112
+ return prefix.filter((target)=>_fs().default.existsSync(target));
113
+ };
114
+ const getNpmPrefixPaths = memoize(()=>{
115
+ const npmPrefix = execGetPaths(isWindows ? 'npm.cmd' : 'npm', [
116
+ 'config',
117
+ '-g',
118
+ 'get',
119
+ 'prefix'
120
+ ]);
121
+ return npmPrefix.map((prefix)=>_path().default.resolve(prefix, 'lib'));
122
+ });
123
+ const getYarnDefaultPaths = ()=>{
124
+ const prefix = [];
125
+ const homePath = getHomePath();
126
+ const localAppData = process.env.LocalAppData || process.env.LOCALAPPDATA;
127
+ const dataHomePath = process.env.XDG_DATA_HOME || homePath && _path().default.join(homePath, '.local', 'share');
128
+ if (isWindows && localAppData) {
129
+ prefix.push(_path().default.resolve(localAppData, 'Yarn', 'global'));
130
+ }
131
+ if (dataHomePath) {
132
+ prefix.push(_path().default.resolve(dataHomePath, 'yarn', 'global'));
133
+ }
134
+ if (homePath) {
135
+ prefix.push(_path().default.resolve(homePath, '.yarn', 'global'));
136
+ }
137
+ return prefix.filter((target)=>_fs().default.existsSync(target));
138
+ };
139
+ const getYarnPrefixPaths = memoize(()=>{
140
+ return execGetPaths(isWindows ? 'yarn.cmd' : 'yarn', [
141
+ 'global',
142
+ 'dir'
143
+ ]);
144
+ });
145
+ const getPnpmPrefixPaths = memoize(()=>{
146
+ return execGetPaths(isWindows ? 'pnpm.cmd' : 'pnpm', [
147
+ 'root',
148
+ '-g'
149
+ ]);
150
+ });
151
+ const getBunPrefixPaths = memoize(()=>{
152
+ const prefix = [];
153
+ const bunPath = execGetPaths(isWindows ? 'bun.cmd' : 'bun', [
154
+ 'pm',
155
+ 'bin',
156
+ '-g'
157
+ ])[0];
158
+ if (!bunPath) {
159
+ return [];
160
+ }
161
+ prefix.push(_path().default.resolve(bunPath, 'global'));
162
+ const moduleEntry = _fs().default.readdirSync(bunPath, {
163
+ withFileTypes: true
164
+ }).find((entry)=>{
165
+ return entry.isSymbolicLink() && entry.name !== 'global';
166
+ });
167
+ if (moduleEntry) {
168
+ try {
169
+ const moduleTarget = _fs().default.realpathSync(_path().default.resolve(bunPath, moduleEntry.name));
170
+ const splitIdx = moduleTarget.indexOf(_path().default.sep + 'node_modules' + _path().default.sep);
171
+ if (splitIdx > -1) {
172
+ const modulePath = moduleTarget.slice(0, splitIdx);
173
+ prefix.push(modulePath);
174
+ }
175
+ } catch {}
176
+ }
177
+ return prefix.filter((target)=>_fs().default.existsSync(target));
178
+ });
179
+ const getPaths = ()=>[
180
+ ...getNpmDefaultPaths(),
181
+ ...getNpmPrefixPaths(),
182
+ ...getYarnDefaultPaths(),
183
+ ...getYarnPrefixPaths(),
184
+ ...getPnpmPrefixPaths(),
185
+ ...getBunPrefixPaths(),
186
+ ...getNativeNodePaths(),
187
+ process.cwd()
188
+ ];
189
+ const resolveGlobal = (id)=>{
190
+ return require.resolve(id, {
191
+ paths: getPaths()
192
+ });
193
+ };
194
+
195
+ //# sourceMappingURL=resolveGlobal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/resolveGlobal.ts"],"sourcesContent":["// NOTE: This file is replicated to multiple packages! Keep these files in-sync:\n// - packages/@expo/cli/src/utils/resolveGlobal.ts\n// - packages/@expo/image-utils/src/resolveGlobal.ts\n\nimport { spawnSync } from 'child_process';\nimport fs from 'fs';\nimport Module from 'module';\nimport os from 'os';\nimport path from 'path';\n\ndeclare module 'module' {\n namespace Module {\n const globalPaths: readonly string[] | void;\n }\n}\n\nconst memoize = <Args extends any[], T>(fn: (...args: Args) => T): ((...args: Args) => T) => {\n let result: { value: T } | undefined;\n return (...args: Args): T => {\n if (result === undefined) {\n result = { value: fn(...args) };\n }\n return result.value;\n };\n};\n\nconst isWindows = process.platform === 'win32';\n\nconst getDelimitedPaths = (delimited: string): string[] =>\n delimited\n .split(path.delimiter)\n .map((target) => {\n try {\n const normalized = path.normalize(target.trim());\n if (!normalized) {\n return null;\n } else if (!path.isAbsolute(normalized)) {\n return path.resolve(process.cwd(), normalized);\n } else {\n return normalized;\n }\n } catch {\n return null;\n }\n })\n .filter((target): target is string => !!target);\n\nconst execGetPaths = (cmd: string, args: string[]): string[] => {\n const result = spawnSync(cmd, args, { encoding: 'utf8' });\n if (!result.error && result.status === 0 && result.stdout) {\n const paths = getDelimitedPaths(result.stdout.replace(/[\\r\\n]+/g, path.delimiter));\n return paths.filter((target) => fs.existsSync(target));\n }\n return [];\n};\n\nconst getNativeNodePaths = () => {\n if (Array.isArray(Module.globalPaths)) {\n return Module.globalPaths;\n } else {\n return [];\n }\n};\n\nconst getHomePath = memoize(() => {\n try {\n return os.homedir();\n } catch {\n return isWindows ? (process.env.UserProfile ?? process.env.USERPROFILE) : process.env.HOME;\n }\n});\n\nconst getNpmDefaultPaths = () => {\n const prefix = [];\n const localAppData = process.env.LocalAppData || process.env.LOCALAPPDATA;\n if (isWindows && localAppData) {\n prefix.push(path.resolve(localAppData, 'npm'));\n } else if (!isWindows) {\n prefix.push('/usr/local/lib/node_modules');\n }\n return prefix.filter((target) => fs.existsSync(target));\n};\n\nconst getNpmPrefixPaths = memoize(() => {\n const npmPrefix = execGetPaths(isWindows ? 'npm.cmd' : 'npm', ['config', '-g', 'get', 'prefix']);\n return npmPrefix.map((prefix) => path.resolve(prefix, 'lib'));\n});\n\nconst getYarnDefaultPaths = () => {\n const prefix = [];\n const homePath = getHomePath();\n const localAppData = process.env.LocalAppData || process.env.LOCALAPPDATA;\n const dataHomePath =\n process.env.XDG_DATA_HOME || (homePath && path.join(homePath, '.local', 'share'));\n if (isWindows && localAppData) {\n prefix.push(path.resolve(localAppData, 'Yarn', 'global'));\n }\n if (dataHomePath) {\n prefix.push(path.resolve(dataHomePath, 'yarn', 'global'));\n }\n if (homePath) {\n prefix.push(path.resolve(homePath, '.yarn', 'global'));\n }\n return prefix.filter((target) => fs.existsSync(target));\n};\n\nconst getYarnPrefixPaths = memoize(() => {\n return execGetPaths(isWindows ? 'yarn.cmd' : 'yarn', ['global', 'dir']);\n});\n\nconst getPnpmPrefixPaths = memoize(() => {\n return execGetPaths(isWindows ? 'pnpm.cmd' : 'pnpm', ['root', '-g']);\n});\n\nconst getBunPrefixPaths = memoize(() => {\n const prefix = [];\n const bunPath = execGetPaths(isWindows ? 'bun.cmd' : 'bun', ['pm', 'bin', '-g'])[0];\n if (!bunPath) {\n return [];\n }\n prefix.push(path.resolve(bunPath, 'global'));\n const moduleEntry = fs.readdirSync(bunPath, { withFileTypes: true }).find((entry) => {\n return entry.isSymbolicLink() && entry.name !== 'global';\n });\n if (moduleEntry) {\n try {\n const moduleTarget = fs.realpathSync(path.resolve(bunPath, moduleEntry.name));\n const splitIdx = moduleTarget.indexOf(path.sep + 'node_modules' + path.sep);\n if (splitIdx > -1) {\n const modulePath = moduleTarget.slice(0, splitIdx);\n prefix.push(modulePath);\n }\n } catch {}\n }\n return prefix.filter((target) => fs.existsSync(target));\n});\n\nconst getPaths = () => [\n ...getNpmDefaultPaths(),\n ...getNpmPrefixPaths(),\n ...getYarnDefaultPaths(),\n ...getYarnPrefixPaths(),\n ...getPnpmPrefixPaths(),\n ...getBunPrefixPaths(),\n ...getNativeNodePaths(),\n process.cwd(),\n];\n\n/** Resolve a globally installed module before a locally installed one */\nexport const resolveGlobal = (id: string): string => {\n return require.resolve(id, { paths: getPaths() });\n};\n"],"names":["resolveGlobal","memoize","fn","result","args","undefined","value","isWindows","process","platform","getDelimitedPaths","delimited","split","path","delimiter","map","target","normalized","normalize","trim","isAbsolute","resolve","cwd","filter","execGetPaths","cmd","spawnSync","encoding","error","status","stdout","paths","replace","fs","existsSync","getNativeNodePaths","Array","isArray","Module","globalPaths","getHomePath","os","homedir","env","UserProfile","USERPROFILE","HOME","getNpmDefaultPaths","prefix","localAppData","LocalAppData","LOCALAPPDATA","push","getNpmPrefixPaths","npmPrefix","getYarnDefaultPaths","homePath","dataHomePath","XDG_DATA_HOME","join","getYarnPrefixPaths","getPnpmPrefixPaths","getBunPrefixPaths","bunPath","moduleEntry","readdirSync","withFileTypes","find","entry","isSymbolicLink","name","moduleTarget","realpathSync","splitIdx","indexOf","sep","modulePath","slice","getPaths","id","require"],"mappings":"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"}