@expo/cli 0.3.2 → 0.4.1

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 (77) hide show
  1. package/README.md +48 -10
  2. package/build/bin/cli +2 -2
  3. package/build/src/api/graphql/client.js +3 -1
  4. package/build/src/api/graphql/client.js.map +1 -1
  5. package/build/src/api/rest/client.js +5 -2
  6. package/build/src/api/rest/client.js.map +1 -1
  7. package/build/src/api/rest/wrapFetchWithProxy.js +25 -0
  8. package/build/src/api/rest/wrapFetchWithProxy.js.map +1 -0
  9. package/build/src/export/createMetadataJson.js.map +1 -1
  10. package/build/src/export/exportApp.js +16 -1
  11. package/build/src/export/exportApp.js.map +1 -1
  12. package/build/src/export/exportAssets.js.map +1 -1
  13. package/build/src/export/fork-bundleAsync.js +2 -1
  14. package/build/src/export/fork-bundleAsync.js.map +1 -1
  15. package/build/src/export/printBundleSizes.js +1 -1
  16. package/build/src/export/printBundleSizes.js.map +1 -1
  17. package/build/src/export/writeContents.js +7 -2
  18. package/build/src/export/writeContents.js.map +1 -1
  19. package/build/src/install/resolveOptions.js +6 -2
  20. package/build/src/install/resolveOptions.js.map +1 -1
  21. package/build/src/prebuild/copyTemplateFiles.js +6 -33
  22. package/build/src/prebuild/copyTemplateFiles.js.map +1 -1
  23. package/build/src/prebuild/resolveTemplate.js +2 -2
  24. package/build/src/prebuild/resolveTemplate.js.map +1 -1
  25. package/build/src/prebuild/updateFromTemplate.js +1 -3
  26. package/build/src/prebuild/updateFromTemplate.js.map +1 -1
  27. package/build/src/prebuild/updatePackageJson.js +3 -46
  28. package/build/src/prebuild/updatePackageJson.js.map +1 -1
  29. package/build/src/run/ios/XcodeBuild.js +2 -1
  30. package/build/src/run/ios/XcodeBuild.js.map +1 -1
  31. package/build/src/run/ios/codeSigning/simulatorCodeSigning.js +45 -0
  32. package/build/src/run/ios/codeSigning/simulatorCodeSigning.js.map +1 -0
  33. package/build/src/start/doctor/ngrok/NgrokResolver.js +5 -0
  34. package/build/src/start/doctor/ngrok/NgrokResolver.js.map +1 -1
  35. package/build/src/start/platforms/PlatformManager.js +6 -1
  36. package/build/src/start/platforms/PlatformManager.js.map +1 -1
  37. package/build/src/start/platforms/android/adbReverse.js +10 -0
  38. package/build/src/start/platforms/android/adbReverse.js.map +1 -1
  39. package/build/src/start/resolveOptions.js +1 -1
  40. package/build/src/start/resolveOptions.js.map +1 -1
  41. package/build/src/start/server/AsyncNgrok.js +58 -14
  42. package/build/src/start/server/AsyncNgrok.js.map +1 -1
  43. package/build/src/start/server/BundlerDevServer.js +4 -1
  44. package/build/src/start/server/BundlerDevServer.js.map +1 -1
  45. package/build/src/start/server/metro/MetroBundlerDevServer.js +20 -5
  46. package/build/src/start/server/metro/MetroBundlerDevServer.js.map +1 -1
  47. package/build/src/start/server/metro/instantiateMetro.js +1 -6
  48. package/build/src/start/server/metro/instantiateMetro.js.map +1 -1
  49. package/build/src/start/server/metro/withMetroMultiPlatform.js +36 -5
  50. package/build/src/start/server/metro/withMetroMultiPlatform.js.map +1 -1
  51. package/build/src/start/server/middleware/ClassicManifestMiddleware.js +4 -2
  52. package/build/src/start/server/middleware/ClassicManifestMiddleware.js.map +1 -1
  53. package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js +7 -3
  54. package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js.map +1 -1
  55. package/build/src/start/server/middleware/RuntimeRedirectMiddleware.js.map +1 -1
  56. package/build/src/start/server/middleware/resolveEntryPoint.js +2 -1
  57. package/build/src/start/server/middleware/resolveEntryPoint.js.map +1 -1
  58. package/build/src/start/server/middleware/resolvePlatform.js +3 -2
  59. package/build/src/start/server/middleware/resolvePlatform.js.map +1 -1
  60. package/build/src/start/server/webpack/WebpackBundlerDevServer.js +2 -8
  61. package/build/src/start/server/webpack/WebpackBundlerDevServer.js.map +1 -1
  62. package/build/src/utils/analytics/rudderstackClient.js +2 -2
  63. package/build/src/utils/codesigning.js +3 -0
  64. package/build/src/utils/codesigning.js.map +1 -1
  65. package/build/src/utils/downloadAppAsync.js +1 -2
  66. package/build/src/utils/downloadAppAsync.js.map +1 -1
  67. package/build/src/utils/env.js +37 -1
  68. package/build/src/utils/env.js.map +1 -1
  69. package/build/src/utils/npm.js +4 -11
  70. package/build/src/utils/npm.js.map +1 -1
  71. package/build/src/utils/url.js +2 -2
  72. package/build/src/utils/url.js.map +1 -1
  73. package/build/src/utils/validateApplicationId.js +3 -3
  74. package/build/src/utils/validateApplicationId.js.map +1 -1
  75. package/build/src/utils/variadic.js +18 -0
  76. package/build/src/utils/variadic.js.map +1 -1
  77. package/package.json +5 -4
@@ -74,9 +74,45 @@ class Env {
74
74
  * Disable the enforced `:80` port when using custom dev server URLs.
75
75
  * This can break the incomplete Android WebSocket implementation but allows
76
76
  * `EXPO_PACKAGER_PROXY_URL` to work as expected.
77
- * */ get EXPO_NO_DEFAULT_PORT() {
77
+ */ get EXPO_NO_DEFAULT_PORT() {
78
78
  return (0, _getenv).boolish("EXPO_NO_DEFAULT_PORT", false);
79
79
  }
80
+ /**
81
+ * **Experimental** - Disable using `exp.direct` as the hostname for
82
+ * `--tunnel` connections. This enables **https://** forwarding which
83
+ * can be used to test universal links on iOS.
84
+ *
85
+ * This may cause issues with `expo-linking` and Expo Go.
86
+ *
87
+ * Select the exact subdomain by passing a string value that is not one of: `true`, `false`, `1`, `0`.
88
+ */ get EXPO_TUNNEL_SUBDOMAIN() {
89
+ const subdomain = (0, _getenv).string("EXPO_TUNNEL_SUBDOMAIN", "");
90
+ if ([
91
+ "0",
92
+ "false",
93
+ ""
94
+ ].includes(subdomain)) {
95
+ return false;
96
+ } else if ([
97
+ "1",
98
+ "true"
99
+ ].includes(subdomain)) {
100
+ return true;
101
+ }
102
+ return subdomain;
103
+ }
104
+ /**
105
+ * 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.
106
+ *
107
+ * By default, Expo CLI will use `['browser', 'module', 'main']` (default for Webpack) for web and the user-defined main fields for other platforms.
108
+ */ get EXPO_METRO_NO_MAIN_FIELD_OVERRIDE() {
109
+ return (0, _getenv).boolish("EXPO_METRO_NO_MAIN_FIELD_OVERRIDE", false);
110
+ }
111
+ /**
112
+ * HTTP/HTTPS proxy to connect to for network requests. Configures [https-proxy-agent](https://www.npmjs.com/package/https-proxy-agent).
113
+ */ get HTTP_PROXY() {
114
+ return process.env.HTTP_PROXY || process.env.http_proxy || "";
115
+ }
80
116
  }
81
117
  const env = new Env();
82
118
  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 /** 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 /**\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 * The URL will not be used verbatim unless `EXPO_NO_DEFAULT_PORT=true` is also set,\n * otherwise a `:80` port will be added for Android support.\n */\n get EXPO_PACKAGER_PROXY_URL(): string {\n return string('EXPO_PACKAGER_PROXY_URL', '');\n }\n\n /**\n * Disable the enforced `:80` port when using custom dev server URLs.\n * This can break the incomplete Android WebSocket implementation but allows\n * `EXPO_PACKAGER_PROXY_URL` to work as expected.\n * */\n get EXPO_NO_DEFAULT_PORT(): boolean {\n return boolish('EXPO_NO_DEFAULT_PORT', false);\n }\n}\n\nexport const env = new Env();\n"],"names":["Env","EXPO_PROFILE","boolish","EXPO_DEBUG","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_PACKAGER_PROXY_URL","EXPO_NO_DEFAULT_PORT","env"],"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,wGAAwG,CACxG,IAAIE,SAAS,GAAG;QACd,OAAOF,CAAAA,GAAAA,OAAO,AAAoB,CAAA,QAApB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;KACpC;IAED,qCAAqC,CACrC,IAAIG,YAAY,GAAG;QACjB,OAAOH,CAAAA,GAAAA,OAAO,AAAuB,CAAA,QAAvB,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;KACvC;IAED,mCAAmC,CACnC,IAAII,UAAU,GAAG;QACf,OAAOJ,CAAAA,GAAAA,OAAO,AAAqB,CAAA,QAArB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;KACrC;IAED,4CAA4C,CAC5C,IAAIK,EAAE,GAAG;QACP,OAAOL,CAAAA,GAAAA,OAAO,AAAa,CAAA,QAAb,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;KAC7B;IAED,oCAAoC,CACpC,IAAIM,iBAAiB,GAAG;QACtB,OAAON,CAAAA,GAAAA,OAAO,AAA4B,CAAA,QAA5B,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;KAC5C;IAED,+DAA+D,CAC/D,IAAIO,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,OAAOV,CAAAA,GAAAA,OAAO,AAA6B,CAAA,QAA7B,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;KAC7C;IACD,6BAA6B,CAC7B,IAAIW,iBAAiB,GAAG;QACtB,OAAOX,CAAAA,GAAAA,OAAO,AAA4B,CAAA,QAA5B,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;KAC5C;IACD,oCAAoC,CACpC,IAAIY,wBAAwB,GAAG;QAC7B,OAAOZ,CAAAA,GAAAA,OAAO,AAAmC,CAAA,QAAnC,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;KACnD;IACD,+DAA+D,CAC/D,IAAIa,aAAa,GAAG;QAClB,OAAOb,CAAAA,GAAAA,OAAO,AAAwB,CAAA,QAAxB,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;KACxC;IACD,4CAA4C,CAC5C,IAAIc,qBAAqB,GAAG;QAC1B,OAAOd,CAAAA,GAAAA,OAAO,AAAgC,CAAA,QAAhC,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;KAChD;IACD,6EAA6E,CAC7E,IAAIe,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,AAAuC,CAAA,OAAvC,CAAC,qCAAqC,CAAC,CAAC;KACxD;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;;;;;;KAMG,CACH,IAAIY,uBAAuB,GAAW;QACpC,OAAOZ,CAAAA,GAAAA,OAAM,AAA+B,CAAA,OAA/B,CAAC,yBAAyB,EAAE,EAAE,CAAC,CAAC;KAC9C;IAED;;;;OAIK,CACL,IAAIa,oBAAoB,GAAY;QAClC,OAAOrB,CAAAA,GAAAA,OAAO,AAA+B,CAAA,QAA/B,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;KAC/C;CACF;AAEM,MAAMsB,GAAG,GAAG,IAAIxB,GAAG,EAAE,AAAC;QAAhBwB,GAAG,GAAHA,GAAG"}
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 /** 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 /**\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 * The URL will not be used verbatim unless `EXPO_NO_DEFAULT_PORT=true` is also set,\n * otherwise a `:80` port will be added for Android support.\n */\n get EXPO_PACKAGER_PROXY_URL(): string {\n return string('EXPO_PACKAGER_PROXY_URL', '');\n }\n\n /**\n * Disable the enforced `:80` port when using custom dev server URLs.\n * This can break the incomplete Android WebSocket implementation but allows\n * `EXPO_PACKAGER_PROXY_URL` to work as expected.\n */\n get EXPO_NO_DEFAULT_PORT(): boolean {\n return boolish('EXPO_NO_DEFAULT_PORT', false);\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\nexport const env = new Env();\n"],"names":["Env","EXPO_PROFILE","boolish","EXPO_DEBUG","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_PACKAGER_PROXY_URL","EXPO_NO_DEFAULT_PORT","EXPO_TUNNEL_SUBDOMAIN","subdomain","includes","EXPO_METRO_NO_MAIN_FIELD_OVERRIDE","HTTP_PROXY","process","env","http_proxy"],"mappings":"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"}
@@ -9,18 +9,14 @@ exports.downloadAndExtractNpmModuleAsync = downloadAndExtractNpmModuleAsync;
9
9
  exports.extractLocalNpmTarballAsync = extractLocalNpmTarballAsync;
10
10
  exports.extractNpmTarballFromUrlAsync = extractNpmTarballFromUrlAsync;
11
11
  exports.extractNpmTarballAsync = extractNpmTarballAsync;
12
- var _getUserState = require("@expo/config/build/getUserState");
13
12
  var _spawnAsync = _interopRequireDefault(require("@expo/spawn-async"));
14
13
  var _assert = _interopRequireDefault(require("assert"));
15
14
  var _fs = _interopRequireDefault(require("fs"));
16
- var _nodeFetch = _interopRequireDefault(require("node-fetch"));
17
- var _path = _interopRequireDefault(require("path"));
18
15
  var _slugify = _interopRequireDefault(require("slugify"));
19
16
  var _stream = require("stream");
20
17
  var _tar = _interopRequireDefault(require("tar"));
21
18
  var _util = require("util");
22
- var _fileSystemCache = require("../api/rest/cache/FileSystemCache");
23
- var _wrapFetchWithCache = require("../api/rest/cache/wrapFetchWithCache");
19
+ var _client = require("../api/rest/client");
24
20
  var _createFileTransform = require("./createFileTransform");
25
21
  var _dir = require("./dir");
26
22
  var _errors = require("./errors");
@@ -30,9 +26,9 @@ function _interopRequireDefault(obj) {
30
26
  };
31
27
  }
32
28
  const debug = require("debug")("expo:utils:npm");
33
- const cachedFetch = (0, _wrapFetchWithCache).wrapFetchWithCache(_nodeFetch.default, new _fileSystemCache.FileSystemCache({
34
- cacheDirectory: getCacheFilePath()
35
- }));
29
+ const cachedFetch = (0, _client).createCachedFetch({
30
+ cacheDirectory: "template-cache"
31
+ });
36
32
  function sanitizeNpmPackageName(name) {
37
33
  // https://github.com/npm/validate-npm-package-name/#naming-rules
38
34
  return applyKnownNpmPackageNameRules(name) || applyKnownNpmPackageNameRules((0, _slugify).default(name)) || // If nothing is left use 'app' like we do in Xcode projects.
@@ -96,9 +92,6 @@ async function extractLocalNpmTarballAsync(tarFilePath, props) {
96
92
  const readStream = _fs.default.createReadStream(tarFilePath);
97
93
  await extractNpmTarballAsync(readStream, props);
98
94
  }
99
- function getCacheFilePath() {
100
- return _path.default.join((0, _getUserState).getExpoHomeDirectory(), "template-cache");
101
- }
102
95
  async function createUrlStreamAsync(url) {
103
96
  const response = await cachedFetch(url);
104
97
  if (!response.ok) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/npm.ts"],"sourcesContent":["import { getExpoHomeDirectory } from '@expo/config/build/getUserState';\nimport { JSONValue } from '@expo/json-file';\nimport spawnAsync from '@expo/spawn-async';\nimport assert from 'assert';\nimport fs from 'fs';\nimport fetch from 'node-fetch';\nimport path from 'path';\nimport slugify from 'slugify';\nimport { Stream } from 'stream';\nimport tar from 'tar';\nimport { promisify } from 'util';\n\nimport { FileSystemCache } from '../api/rest/cache/FileSystemCache';\nimport { wrapFetchWithCache } from '../api/rest/cache/wrapFetchWithCache';\nimport { createEntryResolver, createFileTransform } from './createFileTransform';\nimport { ensureDirectoryAsync } from './dir';\nimport { CommandError } from './errors';\n\nconst debug = require('debug')('expo:utils:npm') as typeof console.log;\n\nconst cachedFetch = wrapFetchWithCache(\n fetch,\n new FileSystemCache({\n cacheDirectory: getCacheFilePath(),\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);\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\nfunction getCacheFilePath() {\n return path.join(getExpoHomeDirectory(), 'template-cache');\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","wrapFetchWithCache","fetch","FileSystemCache","cacheDirectory","getCacheFilePath","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","path","getExpoHomeDirectory","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 fs from 'fs';\nimport slugify from 'slugify';\nimport { Stream } from 'stream';\nimport tar from 'tar';\nimport { promisify } from 'util';\n\nimport { createCachedFetch } from '../api/rest/client';\nimport { createEntryResolver, createFileTransform } from './createFileTransform';\nimport { ensureDirectoryAsync } from './dir';\nimport { CommandError } from './errors';\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":"AAAA;;;;QAsBgBA,sBAAsB,GAAtBA,sBAAsB;QA6BhBC,YAAY,GAAZA,YAAY;QAkBZC,cAAc,GAAdA,cAAc;QA2BdC,gCAAgC,GAAhCA,gCAAgC;QAUhCC,2BAA2B,GAA3BA,2BAA2B;QAwB3BC,6BAA6B,GAA7BA,6BAA6B;QAO7BC,sBAAsB,GAAtBA,sBAAsB;AAxIrB,IAAA,WAAmB,kCAAnB,mBAAmB,EAAA;AACvB,IAAA,OAAQ,kCAAR,QAAQ,EAAA;AACZ,IAAA,GAAI,kCAAJ,IAAI,EAAA;AACC,IAAA,QAAS,kCAAT,SAAS,EAAA;AACN,IAAA,OAAQ,WAAR,QAAQ,CAAA;AACf,IAAA,IAAK,kCAAL,KAAK,EAAA;AACK,IAAA,KAAM,WAAN,MAAM,CAAA;AAEE,IAAA,OAAoB,WAApB,oBAAoB,CAAA;AACG,IAAA,oBAAuB,WAAvB,uBAAuB,CAAA;AAC3C,IAAA,IAAO,WAAP,OAAO,CAAA;AACf,IAAA,OAAU,WAAV,UAAU,CAAA;;;;;;AAEvC,MAAMC,KAAK,GAAGC,OAAO,CAAC,OAAO,CAAC,CAAC,gBAAgB,CAAC,AAAsB,AAAC;AAEvE,MAAMC,WAAW,GAAGC,CAAAA,GAAAA,OAAiB,AAInC,CAAA,kBAJmC,CAAC;IACpCC,cAAc,EAAE,gBAAgB;CAGjC,CAAC,AAAC;AAEI,SAASX,sBAAsB,CAACY,IAAY,EAAU;IAC3D,iEAAiE;IACjE,OACEC,6BAA6B,CAACD,IAAI,CAAC,IACnCC,6BAA6B,CAACC,CAAAA,GAAAA,QAAO,AAAM,CAAA,QAAN,CAACF,IAAI,CAAC,CAAC,IAC5C,6DAA6D;IAC7D,KAAK,CACL;CACH;AAED,SAASC,6BAA6B,CAACD,IAAY,EAAiB;IAClE,iEAAiE;IAEjE,6CAA6C;IAC7C,MAAO,UAAUG,IAAI,CAACH,IAAI,CAAC,CAAE;QAC3BA,IAAI,GAAGA,IAAI,CAACI,SAAS,CAAC,CAAC,CAAC,CAAC;KAC1B;IAEDJ,IAAI,GAAGA,IAAI,CAACK,WAAW,EAAE,CAACC,OAAO,qBAAqB,EAAE,CAAC,CAAC;IAE1D,OACEN,IAAI,AACF,kCAAkC;IAClC,4BAA4B;KAC3BO,SAAS,CAAC,KAAK,CAAC,CAChBD,OAAO,qBAAqB,EAAE,CAAC,IAAI,IAAI,CAC1C;CACH;AAEM,eAAejB,YAAY,CAAC,GAAGmB,KAAK,AAAU,EAAsB;QAEzD,GAAqC;IADrD,MAAMC,GAAG,GAAG;QAAC,MAAM;WAAKD,KAAK;QAAE,QAAQ;KAAC,AAAC;IACzC,MAAME,OAAO,GAAG,CAAA,GAAqC,GAArC,CAAC,MAAMC,CAAAA,GAAAA,WAAU,AAAY,CAAA,QAAZ,CAAC,KAAK,EAAEF,GAAG,CAAC,CAAC,CAACG,MAAM,SAAM,GAA3C,KAAA,CAA2C,GAA3C,GAAqC,CAAEC,IAAI,EAAE,AAAC;IAC9D,MAAMC,SAAS,GAAG,CAAC,IAAI,EAAEL,GAAG,CAACM,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,AAAC;IACzCpB,KAAK,CAAC,MAAM,EAAEmB,SAAS,CAAC,CAAC;IACzB,IAAI,CAACJ,OAAO,EAAE;QACZ,OAAO,IAAI,CAAC;KACb;IACD,IAAI;QACF,OAAOM,IAAI,CAACC,KAAK,CAACP,OAAO,CAAC,CAAC;KAC5B,CAAC,OAAOQ,KAAK,EAAO;QACnB,MAAM,IAAIC,KAAK,CACb,CAAC,oCAAoC,EAAEL,SAAS,CAAC,MAAM,EAAEJ,OAAO,CAAC,WAAW,EAAEQ,KAAK,CAACE,OAAO,CAAC,CAAC,CAC9F,CAAC;KACH;CACF;AAGM,eAAe9B,cAAc,CAAC+B,WAAmB,EAAmB;IACzE,MAAMX,OAAO,GAAG,MAAMrB,YAAY,CAACgC,WAAW,EAAE,cAAc,CAAC,AAAC;IAEhEC,CAAAA,GAAAA,OAAM,AAA+D,CAAA,QAA/D,CAACZ,OAAO,EAAE,CAAC,mCAAmC,EAAEW,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAEtE,wCAAwC;IACxC,WAAW;IACX,sEAAmE;IAChE,IAAC,OAAOX,OAAO,KAAK,QAAQ,EAAE;QAC/B,OAAOA,OAAO,CAAC;KAChB;IAED,yGAAyG;IACzG,WAAW;IACX,kEAA+D;IAC/D,IAAIa,KAAK,CAACC,OAAO,CAACd,OAAO,CAAC,EAAE;QAC1B,OAAOA,OAAO,CAACA,OAAO,CAACe,MAAM,GAAG,CAAC,CAAC,CAAW;KAC9C;IAED,MAAM,IAAIC,OAAY,aAAA,CACpB,8EAA8E,GAAGhB,OAAO,CACzF,CAAC;CACH;AAED,aAAa;AACb,MAAMiB,QAAQ,GAAGC,CAAAA,GAAAA,KAAS,AAAiB,CAAA,UAAjB,CAACC,OAAM,OAAA,CAACF,QAAQ,CAAC,AAAC;AAErC,eAAepC,gCAAgC,CACpDuC,OAAe,EACftB,KAAmB,EACJ;IACf,MAAMuB,GAAG,GAAG,MAAMzC,cAAc,CAACwC,OAAO,CAAC,AAAC;IAE1CnC,KAAK,CAAC,iBAAiB,EAAEoC,GAAG,CAAC,CAAC;IAC9B,MAAMtC,6BAA6B,CAACsC,GAAG,EAAEvB,KAAK,CAAC,CAAC;CACjD;AAEM,eAAehB,2BAA2B,CAC/CwC,WAAmB,EACnBxB,KAAmB,EACJ;IACf,MAAMyB,UAAU,GAAGC,GAAE,QAAA,CAACC,gBAAgB,CAACH,WAAW,CAAC,AAAC;IACpD,MAAMtC,sBAAsB,CAACuC,UAAU,EAAEzB,KAAK,CAAC,CAAC;CACjD;AASD,eAAe4B,oBAAoB,CAACL,GAAW,EAAE;IAC/C,MAAMM,QAAQ,GAAG,MAAMxC,WAAW,CAACkC,GAAG,CAAC,AAAC;IACxC,IAAI,CAACM,QAAQ,CAACC,EAAE,EAAE;QAChB,MAAM,IAAInB,KAAK,CAAC,CAAC,qBAAqB,EAAEkB,QAAQ,CAACE,UAAU,CAAC,YAAY,EAAER,GAAG,CAAC,CAAC,CAAC,CAAC;KAClF;IAED,OAAOM,QAAQ,CAACG,IAAI,CAAC;CACtB;AAEM,eAAe/C,6BAA6B,CACjDsC,GAAW,EACXvB,KAAmB,EACJ;IACf,MAAMd,sBAAsB,CAAC,MAAM0C,oBAAoB,CAACL,GAAG,CAAC,EAAEvB,KAAK,CAAC,CAAC;CACtE;AAEM,eAAed,sBAAsB,CAC1C+C,MAA6B,EAC7BjC,KAAmB,EACJ;IACf,MAAM,EAAEkC,GAAG,CAAA,EAAEC,KAAK,CAAA,EAAE3C,IAAI,CAAA,EAAE4C,QAAQ,EAAG,EAAE,CAAA,EAAE,GAAGpC,KAAK,AAAC;IAElD,MAAMqC,CAAAA,GAAAA,IAAoB,AAAK,CAAA,qBAAL,CAACH,GAAG,CAAC,CAAC;IAEhC,MAAMf,QAAQ,CACZc,MAAM,EACNK,IAAG,QAAA,CAACC,OAAO,CACT;QACEL,GAAG;QACHM,SAAS,EAAEC,CAAAA,GAAAA,oBAAmB,AAAM,CAAA,oBAAN,CAACjD,IAAI,CAAC;QACpCkD,OAAO,EAAEC,CAAAA,GAAAA,oBAAmB,AAAM,CAAA,oBAAN,CAACnD,IAAI,CAAC;QAClC2C,KAAK,EAAEA,KAAK,WAALA,KAAK,GAAI,CAAC;KAClB,EACDC,QAAQ,CACT,CACF,CAAC;CACH"}
@@ -8,8 +8,8 @@ exports.validateUrl = validateUrl;
8
8
  exports.stripPort = stripPort;
9
9
  exports.stripExtension = stripExtension;
10
10
  var _dns = _interopRequireDefault(require("dns"));
11
- var _nodeFetch = _interopRequireDefault(require("node-fetch"));
12
11
  var _url = require("url");
12
+ var _client = require("../api/rest/client");
13
13
  function _interopRequireDefault(obj) {
14
14
  return obj && obj.__esModule ? obj : {
15
15
  default: obj
@@ -24,7 +24,7 @@ function isUrlAvailableAsync(url) {
24
24
  }
25
25
  async function isUrlOk(url) {
26
26
  try {
27
- const res = await (0, _nodeFetch).default(url);
27
+ const res = await (0, _client).fetchAsync(url);
28
28
  return res.ok;
29
29
  } catch {
30
30
  return false;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/url.ts"],"sourcesContent":["import dns from 'dns';\nimport fetch from 'node-fetch';\nimport { URL } from 'url';\n\n/** Check if a server is available based on the URL. */\nexport function isUrlAvailableAsync(url: string): Promise<boolean> {\n return new Promise<boolean>((resolve) => {\n dns.lookup(url, (err) => {\n resolve(!err);\n });\n });\n}\n\n/** Check if a request to the given URL is `ok` (status 200). */\nexport async function isUrlOk(url: string): Promise<boolean> {\n try {\n const res = await fetch(url);\n return res.ok;\n } catch {\n return false;\n }\n}\n\n/** Determine if a string is a valid URL, can optionally ensure certain protocols (like `https` or `exp`) are adhered to. */\nexport function validateUrl(\n urlString: string,\n {\n protocols,\n requireProtocol,\n }: {\n /** Set of allowed protocols for the string to adhere to. @example ['exp', 'https'] */\n protocols?: string[];\n /** Ensure the URL has a protocol component (prefix before `://`). */\n requireProtocol?: boolean;\n } = {}\n) {\n try {\n const results = new URL(urlString);\n if (!results.protocol && !requireProtocol) {\n return true;\n }\n return protocols\n ? results.protocol\n ? protocols.map((x) => `${x.toLowerCase()}:`).includes(results.protocol)\n : false\n : true;\n } catch {\n return false;\n }\n}\n\n/** Remove the port from a given `host` URL string. */\nexport function stripPort(host?: string): string | null {\n return coerceUrl(host)?.hostname ?? null;\n}\n\nfunction coerceUrl(urlString?: string): URL | null {\n if (!urlString) {\n return null;\n }\n try {\n return new URL('/', urlString);\n } catch (error: any) {\n if (error.code !== 'ERR_INVALID_URL') {\n throw error;\n }\n return new URL('/', `http://${urlString}`);\n }\n}\n\n/** Strip a given extension from a URL string. */\nexport function stripExtension(url: string, extension: string): string {\n return url.replace(new RegExp(`.${extension}$`), '');\n}\n"],"names":["isUrlAvailableAsync","isUrlOk","validateUrl","stripPort","stripExtension","url","Promise","resolve","dns","lookup","err","res","fetch","ok","urlString","protocols","requireProtocol","results","URL","protocol","map","x","toLowerCase","includes","host","coerceUrl","hostname","error","code","extension","replace","RegExp"],"mappings":"AAAA;;;;QAKgBA,mBAAmB,GAAnBA,mBAAmB;QASbC,OAAO,GAAPA,OAAO;QAUbC,WAAW,GAAXA,WAAW;QA4BXC,SAAS,GAATA,SAAS;QAmBTC,cAAc,GAAdA,cAAc;AAvEd,IAAA,IAAK,kCAAL,KAAK,EAAA;AACH,IAAA,UAAY,kCAAZ,YAAY,EAAA;AACV,IAAA,IAAK,WAAL,KAAK,CAAA;;;;;;AAGlB,SAASJ,mBAAmB,CAACK,GAAW,EAAoB;IACjE,OAAO,IAAIC,OAAO,CAAU,CAACC,OAAO,GAAK;QACvCC,IAAG,QAAA,CAACC,MAAM,CAACJ,GAAG,EAAE,CAACK,GAAG,GAAK;YACvBH,OAAO,CAAC,CAACG,GAAG,CAAC,CAAC;SACf,CAAC,CAAC;KACJ,CAAC,CAAC;CACJ;AAGM,eAAeT,OAAO,CAACI,GAAW,EAAoB;IAC3D,IAAI;QACF,MAAMM,GAAG,GAAG,MAAMC,CAAAA,GAAAA,UAAK,AAAK,CAAA,QAAL,CAACP,GAAG,CAAC,AAAC;QAC7B,OAAOM,GAAG,CAACE,EAAE,CAAC;KACf,CAAC,OAAM;QACN,OAAO,KAAK,CAAC;KACd;CACF;AAGM,SAASX,WAAW,CACzBY,SAAiB,EACjB,EACEC,SAAS,CAAA,EACTC,eAAe,CAAA,EAMhB,GAAG,EAAE,EACN;IACA,IAAI;QACF,MAAMC,OAAO,GAAG,IAAIC,IAAG,IAAA,CAACJ,SAAS,CAAC,AAAC;QACnC,IAAI,CAACG,OAAO,CAACE,QAAQ,IAAI,CAACH,eAAe,EAAE;YACzC,OAAO,IAAI,CAAC;SACb;QACD,OAAOD,SAAS,GACZE,OAAO,CAACE,QAAQ,GACdJ,SAAS,CAACK,GAAG,CAAC,CAACC,CAAC,GAAK,CAAC,EAAEA,CAAC,CAACC,WAAW,EAAE,CAAC,CAAC,CAAC;QAAA,CAAC,CAACC,QAAQ,CAACN,OAAO,CAACE,QAAQ,CAAC,GACtE,KAAK,GACP,IAAI,CAAC;KACV,CAAC,OAAM;QACN,OAAO,KAAK,CAAC;KACd;CACF;AAGM,SAAShB,SAAS,CAACqB,IAAa,EAAiB;QAC/CC,GAAe;QAAfA,IAAyB;IAAhC,OAAOA,CAAAA,IAAyB,GAAzBA,CAAAA,GAAe,GAAfA,SAAS,CAACD,IAAI,CAAC,SAAU,GAAzBC,KAAAA,CAAyB,GAAzBA,GAAe,CAAEC,QAAQ,YAAzBD,IAAyB,GAAI,IAAI,CAAC;CAC1C;AAED,SAASA,SAAS,CAACX,SAAkB,EAAc;IACjD,IAAI,CAACA,SAAS,EAAE;QACd,OAAO,IAAI,CAAC;KACb;IACD,IAAI;QACF,OAAO,IAAII,IAAG,IAAA,CAAC,GAAG,EAAEJ,SAAS,CAAC,CAAC;KAChC,CAAC,OAAOa,KAAK,EAAO;QACnB,IAAIA,KAAK,CAACC,IAAI,KAAK,iBAAiB,EAAE;YACpC,MAAMD,KAAK,CAAC;SACb;QACD,OAAO,IAAIT,IAAG,IAAA,CAAC,GAAG,EAAE,CAAC,OAAO,EAAEJ,SAAS,CAAC,CAAC,CAAC,CAAC;KAC5C;CACF;AAGM,SAASV,cAAc,CAACC,GAAW,EAAEwB,SAAiB,EAAU;IACrE,OAAOxB,GAAG,CAACyB,OAAO,CAAC,IAAIC,MAAM,CAAC,CAAC,CAAC,EAAEF,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;CACtD"}
1
+ {"version":3,"sources":["../../../src/utils/url.ts"],"sourcesContent":["import dns from 'dns';\nimport { URL } from 'url';\n\nimport { fetchAsync } from '../api/rest/client';\n\n/** Check if a server is available based on the URL. */\nexport function isUrlAvailableAsync(url: string): Promise<boolean> {\n return new Promise<boolean>((resolve) => {\n dns.lookup(url, (err) => {\n resolve(!err);\n });\n });\n}\n\n/** Check if a request to the given URL is `ok` (status 200). */\nexport async function isUrlOk(url: string): Promise<boolean> {\n try {\n const res = await fetchAsync(url);\n return res.ok;\n } catch {\n return false;\n }\n}\n\n/** Determine if a string is a valid URL, can optionally ensure certain protocols (like `https` or `exp`) are adhered to. */\nexport function validateUrl(\n urlString: string,\n {\n protocols,\n requireProtocol,\n }: {\n /** Set of allowed protocols for the string to adhere to. @example ['exp', 'https'] */\n protocols?: string[];\n /** Ensure the URL has a protocol component (prefix before `://`). */\n requireProtocol?: boolean;\n } = {}\n) {\n try {\n const results = new URL(urlString);\n if (!results.protocol && !requireProtocol) {\n return true;\n }\n return protocols\n ? results.protocol\n ? protocols.map((x) => `${x.toLowerCase()}:`).includes(results.protocol)\n : false\n : true;\n } catch {\n return false;\n }\n}\n\n/** Remove the port from a given `host` URL string. */\nexport function stripPort(host?: string): string | null {\n return coerceUrl(host)?.hostname ?? null;\n}\n\nfunction coerceUrl(urlString?: string): URL | null {\n if (!urlString) {\n return null;\n }\n try {\n return new URL('/', urlString);\n } catch (error: any) {\n if (error.code !== 'ERR_INVALID_URL') {\n throw error;\n }\n return new URL('/', `http://${urlString}`);\n }\n}\n\n/** Strip a given extension from a URL string. */\nexport function stripExtension(url: string, extension: string): string {\n return url.replace(new RegExp(`.${extension}$`), '');\n}\n"],"names":["isUrlAvailableAsync","isUrlOk","validateUrl","stripPort","stripExtension","url","Promise","resolve","dns","lookup","err","res","fetchAsync","ok","urlString","protocols","requireProtocol","results","URL","protocol","map","x","toLowerCase","includes","host","coerceUrl","hostname","error","code","extension","replace","RegExp"],"mappings":"AAAA;;;;QAMgBA,mBAAmB,GAAnBA,mBAAmB;QASbC,OAAO,GAAPA,OAAO;QAUbC,WAAW,GAAXA,WAAW;QA4BXC,SAAS,GAATA,SAAS;QAmBTC,cAAc,GAAdA,cAAc;AAxEd,IAAA,IAAK,kCAAL,KAAK,EAAA;AACD,IAAA,IAAK,WAAL,KAAK,CAAA;AAEE,IAAA,OAAoB,WAApB,oBAAoB,CAAA;;;;;;AAGxC,SAASJ,mBAAmB,CAACK,GAAW,EAAoB;IACjE,OAAO,IAAIC,OAAO,CAAU,CAACC,OAAO,GAAK;QACvCC,IAAG,QAAA,CAACC,MAAM,CAACJ,GAAG,EAAE,CAACK,GAAG,GAAK;YACvBH,OAAO,CAAC,CAACG,GAAG,CAAC,CAAC;SACf,CAAC,CAAC;KACJ,CAAC,CAAC;CACJ;AAGM,eAAeT,OAAO,CAACI,GAAW,EAAoB;IAC3D,IAAI;QACF,MAAMM,GAAG,GAAG,MAAMC,CAAAA,GAAAA,OAAU,AAAK,CAAA,WAAL,CAACP,GAAG,CAAC,AAAC;QAClC,OAAOM,GAAG,CAACE,EAAE,CAAC;KACf,CAAC,OAAM;QACN,OAAO,KAAK,CAAC;KACd;CACF;AAGM,SAASX,WAAW,CACzBY,SAAiB,EACjB,EACEC,SAAS,CAAA,EACTC,eAAe,CAAA,EAMhB,GAAG,EAAE,EACN;IACA,IAAI;QACF,MAAMC,OAAO,GAAG,IAAIC,IAAG,IAAA,CAACJ,SAAS,CAAC,AAAC;QACnC,IAAI,CAACG,OAAO,CAACE,QAAQ,IAAI,CAACH,eAAe,EAAE;YACzC,OAAO,IAAI,CAAC;SACb;QACD,OAAOD,SAAS,GACZE,OAAO,CAACE,QAAQ,GACdJ,SAAS,CAACK,GAAG,CAAC,CAACC,CAAC,GAAK,CAAC,EAAEA,CAAC,CAACC,WAAW,EAAE,CAAC,CAAC,CAAC;QAAA,CAAC,CAACC,QAAQ,CAACN,OAAO,CAACE,QAAQ,CAAC,GACtE,KAAK,GACP,IAAI,CAAC;KACV,CAAC,OAAM;QACN,OAAO,KAAK,CAAC;KACd;CACF;AAGM,SAAShB,SAAS,CAACqB,IAAa,EAAiB;QAC/CC,GAAe;QAAfA,IAAyB;IAAhC,OAAOA,CAAAA,IAAyB,GAAzBA,CAAAA,GAAe,GAAfA,SAAS,CAACD,IAAI,CAAC,SAAU,GAAzBC,KAAAA,CAAyB,GAAzBA,GAAe,CAAEC,QAAQ,YAAzBD,IAAyB,GAAI,IAAI,CAAC;CAC1C;AAED,SAASA,SAAS,CAACX,SAAkB,EAAc;IACjD,IAAI,CAACA,SAAS,EAAE;QACd,OAAO,IAAI,CAAC;KACb;IACD,IAAI;QACF,OAAO,IAAII,IAAG,IAAA,CAAC,GAAG,EAAEJ,SAAS,CAAC,CAAC;KAChC,CAAC,OAAOa,KAAK,EAAO;QACnB,IAAIA,KAAK,CAACC,IAAI,KAAK,iBAAiB,EAAE;YACpC,MAAMD,KAAK,CAAC;SACb;QACD,OAAO,IAAIT,IAAG,IAAA,CAAC,GAAG,EAAE,CAAC,OAAO,EAAEJ,SAAS,CAAC,CAAC,CAAC,CAAC;KAC5C;CACF;AAGM,SAASV,cAAc,CAACC,GAAW,EAAEwB,SAAiB,EAAU;IACrE,OAAOxB,GAAG,CAACyB,OAAO,CAAC,IAAIC,MAAM,CAAC,CAAC,CAAC,EAAEF,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;CACtD"}
@@ -10,7 +10,7 @@ exports.getBundleIdWarningAsync = getBundleIdWarningAsync;
10
10
  exports.getPackageNameWarningAsync = getPackageNameWarningAsync;
11
11
  var _assert = _interopRequireDefault(require("assert"));
12
12
  var _chalk = _interopRequireDefault(require("chalk"));
13
- var _nodeFetch = _interopRequireDefault(require("node-fetch"));
13
+ var _client = require("../api/rest/client");
14
14
  var _link = require("./link");
15
15
  var _url = require("./url");
16
16
  function _interopRequireDefault(obj) {
@@ -48,7 +48,7 @@ async function getBundleIdWarningAsync(bundleId) {
48
48
  const url = `http://itunes.apple.com/lookup?bundleId=${bundleId}`;
49
49
  try {
50
50
  debug(`Checking iOS bundle ID '${bundleId}' at: ${url}`);
51
- const response = await (0, _nodeFetch).default(url);
51
+ const response = await (0, _client).fetchAsync(url);
52
52
  const json = await response.json();
53
53
  if (json.resultCount > 0) {
54
54
  const firstApp = json.results[0];
@@ -75,7 +75,7 @@ async function getPackageNameWarningAsync(packageName) {
75
75
  const url = `https://play.google.com/store/apps/details?id=${packageName}`;
76
76
  try {
77
77
  debug(`Checking Android package name '${packageName}' at: ${url}`);
78
- const response = await (0, _nodeFetch).default(url);
78
+ const response = await (0, _client).fetchAsync(url);
79
79
  // If the page exists, then warn the user.
80
80
  if (response.status === 200) {
81
81
  // There is no JSON API for the Play Store so we can't concisely
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/validateApplicationId.ts"],"sourcesContent":["import assert from 'assert';\nimport chalk from 'chalk';\nimport fetch from 'node-fetch';\n\nimport { learnMore } from './link';\nimport { isUrlAvailableAsync } from './url';\n\nconst debug = require('debug')('expo:utils:validateApplicationId') as typeof console.log;\n\nconst IOS_BUNDLE_ID_REGEX = /^[a-zA-Z0-9-.]+$/;\nconst ANDROID_PACKAGE_REGEX = /^[a-zA-Z][a-zA-Z0-9_]*(\\.[a-zA-Z][a-zA-Z0-9_]*)+$/;\n\n/** Validate an iOS bundle identifier. */\nexport function validateBundleId(value: string): boolean {\n return IOS_BUNDLE_ID_REGEX.test(value);\n}\n\n/** Validate an Android package name. */\nexport function validatePackage(value: string): boolean {\n return ANDROID_PACKAGE_REGEX.test(value);\n}\n\nexport function assertValidBundleId(value: string) {\n assert.match(\n value,\n IOS_BUNDLE_ID_REGEX,\n `The ios.bundleIdentifier defined in your Expo config is not formatted properly. Only alphanumeric characters, '.', '-', and '_' are allowed, and each '.' must be followed by a letter.`\n );\n}\n\nexport function assertValidPackage(value: string) {\n assert.match(\n value,\n ANDROID_PACKAGE_REGEX,\n `Invalid format of Android package name. Only alphanumeric characters, '.' and '_' are allowed, and each '.' must be followed by a letter.`\n );\n}\n\nconst cachedBundleIdResults: Record<string, string> = {};\nconst cachedPackageNameResults: Record<string, string> = {};\n\n/** Returns a warning message if an iOS bundle identifier is potentially already in use. */\nexport async function getBundleIdWarningAsync(bundleId: string): Promise<string | null> {\n // Prevent fetching for the same ID multiple times.\n if (cachedBundleIdResults[bundleId]) {\n return cachedBundleIdResults[bundleId];\n }\n\n if (!(await isUrlAvailableAsync('itunes.apple.com'))) {\n debug(\n `Couldn't connect to iTunes Store to check bundle ID ${bundleId}. itunes.apple.com may be down.`\n );\n // If no network, simply skip the warnings since they'll just lead to more confusion.\n return null;\n }\n\n const url = `http://itunes.apple.com/lookup?bundleId=${bundleId}`;\n try {\n debug(`Checking iOS bundle ID '${bundleId}' at: ${url}`);\n const response = await fetch(url);\n const json = await response.json();\n if (json.resultCount > 0) {\n const firstApp = json.results[0];\n const message = formatInUseWarning(firstApp.trackName, firstApp.sellerName, bundleId);\n cachedBundleIdResults[bundleId] = message;\n return message;\n }\n } catch (error: any) {\n debug(`Error checking bundle ID ${bundleId}: ${error.message}`);\n // Error fetching itunes data.\n }\n return null;\n}\n\n/** Returns a warning message if an Android package name is potentially already in use. */\nexport async function getPackageNameWarningAsync(packageName: string): Promise<string | null> {\n // Prevent fetching for the same ID multiple times.\n if (cachedPackageNameResults[packageName]) {\n return cachedPackageNameResults[packageName];\n }\n\n if (!(await isUrlAvailableAsync('play.google.com'))) {\n debug(\n `Couldn't connect to Play Store to check package name ${packageName}. play.google.com may be down.`\n );\n // If no network, simply skip the warnings since they'll just lead to more confusion.\n return null;\n }\n\n const url = `https://play.google.com/store/apps/details?id=${packageName}`;\n try {\n debug(`Checking Android package name '${packageName}' at: ${url}`);\n const response = await fetch(url);\n // If the page exists, then warn the user.\n if (response.status === 200) {\n // There is no JSON API for the Play Store so we can't concisely\n // locate the app name and developer to match the iOS warning.\n const message = `⚠️ The package ${chalk.bold(packageName)} is already in use. ${chalk.dim(\n learnMore(url)\n )}`;\n cachedPackageNameResults[packageName] = message;\n return message;\n }\n } catch (error: any) {\n debug(`Error checking package name ${packageName}: ${error.message}`);\n // Error fetching play store data or the page doesn't exist.\n }\n return null;\n}\n\nfunction formatInUseWarning(appName: string, author: string, id: string): string {\n return `⚠️ The app ${chalk.bold(appName)} by ${chalk.italic(\n author\n )} is already using ${chalk.bold(id)}`;\n}\n"],"names":["validateBundleId","validatePackage","assertValidBundleId","assertValidPackage","getBundleIdWarningAsync","getPackageNameWarningAsync","debug","require","IOS_BUNDLE_ID_REGEX","ANDROID_PACKAGE_REGEX","value","test","assert","match","cachedBundleIdResults","cachedPackageNameResults","bundleId","isUrlAvailableAsync","url","response","fetch","json","resultCount","firstApp","results","message","formatInUseWarning","trackName","sellerName","error","packageName","status","chalk","bold","dim","learnMore","appName","author","id","italic"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/utils/validateApplicationId.ts"],"sourcesContent":["import assert from 'assert';\nimport chalk from 'chalk';\n\nimport { fetchAsync } from '../api/rest/client';\nimport { learnMore } from './link';\nimport { isUrlAvailableAsync } from './url';\n\nconst debug = require('debug')('expo:utils:validateApplicationId') as typeof console.log;\n\nconst IOS_BUNDLE_ID_REGEX = /^[a-zA-Z0-9-.]+$/;\nconst ANDROID_PACKAGE_REGEX = /^[a-zA-Z][a-zA-Z0-9_]*(\\.[a-zA-Z][a-zA-Z0-9_]*)+$/;\n\n/** Validate an iOS bundle identifier. */\nexport function validateBundleId(value: string): boolean {\n return IOS_BUNDLE_ID_REGEX.test(value);\n}\n\n/** Validate an Android package name. */\nexport function validatePackage(value: string): boolean {\n return ANDROID_PACKAGE_REGEX.test(value);\n}\n\nexport function assertValidBundleId(value: string) {\n assert.match(\n value,\n IOS_BUNDLE_ID_REGEX,\n `The ios.bundleIdentifier defined in your Expo config is not formatted properly. Only alphanumeric characters, '.', '-', and '_' are allowed, and each '.' must be followed by a letter.`\n );\n}\n\nexport function assertValidPackage(value: string) {\n assert.match(\n value,\n ANDROID_PACKAGE_REGEX,\n `Invalid format of Android package name. Only alphanumeric characters, '.' and '_' are allowed, and each '.' must be followed by a letter.`\n );\n}\n\nconst cachedBundleIdResults: Record<string, string> = {};\nconst cachedPackageNameResults: Record<string, string> = {};\n\n/** Returns a warning message if an iOS bundle identifier is potentially already in use. */\nexport async function getBundleIdWarningAsync(bundleId: string): Promise<string | null> {\n // Prevent fetching for the same ID multiple times.\n if (cachedBundleIdResults[bundleId]) {\n return cachedBundleIdResults[bundleId];\n }\n\n if (!(await isUrlAvailableAsync('itunes.apple.com'))) {\n debug(\n `Couldn't connect to iTunes Store to check bundle ID ${bundleId}. itunes.apple.com may be down.`\n );\n // If no network, simply skip the warnings since they'll just lead to more confusion.\n return null;\n }\n\n const url = `http://itunes.apple.com/lookup?bundleId=${bundleId}`;\n try {\n debug(`Checking iOS bundle ID '${bundleId}' at: ${url}`);\n const response = await fetchAsync(url);\n const json = await response.json();\n if (json.resultCount > 0) {\n const firstApp = json.results[0];\n const message = formatInUseWarning(firstApp.trackName, firstApp.sellerName, bundleId);\n cachedBundleIdResults[bundleId] = message;\n return message;\n }\n } catch (error: any) {\n debug(`Error checking bundle ID ${bundleId}: ${error.message}`);\n // Error fetching itunes data.\n }\n return null;\n}\n\n/** Returns a warning message if an Android package name is potentially already in use. */\nexport async function getPackageNameWarningAsync(packageName: string): Promise<string | null> {\n // Prevent fetching for the same ID multiple times.\n if (cachedPackageNameResults[packageName]) {\n return cachedPackageNameResults[packageName];\n }\n\n if (!(await isUrlAvailableAsync('play.google.com'))) {\n debug(\n `Couldn't connect to Play Store to check package name ${packageName}. play.google.com may be down.`\n );\n // If no network, simply skip the warnings since they'll just lead to more confusion.\n return null;\n }\n\n const url = `https://play.google.com/store/apps/details?id=${packageName}`;\n try {\n debug(`Checking Android package name '${packageName}' at: ${url}`);\n const response = await fetchAsync(url);\n // If the page exists, then warn the user.\n if (response.status === 200) {\n // There is no JSON API for the Play Store so we can't concisely\n // locate the app name and developer to match the iOS warning.\n const message = `⚠️ The package ${chalk.bold(packageName)} is already in use. ${chalk.dim(\n learnMore(url)\n )}`;\n cachedPackageNameResults[packageName] = message;\n return message;\n }\n } catch (error: any) {\n debug(`Error checking package name ${packageName}: ${error.message}`);\n // Error fetching play store data or the page doesn't exist.\n }\n return null;\n}\n\nfunction formatInUseWarning(appName: string, author: string, id: string): string {\n return `⚠️ The app ${chalk.bold(appName)} by ${chalk.italic(\n author\n )} is already using ${chalk.bold(id)}`;\n}\n"],"names":["validateBundleId","validatePackage","assertValidBundleId","assertValidPackage","getBundleIdWarningAsync","getPackageNameWarningAsync","debug","require","IOS_BUNDLE_ID_REGEX","ANDROID_PACKAGE_REGEX","value","test","assert","match","cachedBundleIdResults","cachedPackageNameResults","bundleId","isUrlAvailableAsync","url","response","fetchAsync","json","resultCount","firstApp","results","message","formatInUseWarning","trackName","sellerName","error","packageName","status","chalk","bold","dim","learnMore","appName","author","id","italic"],"mappings":"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"}
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  });
5
5
  exports.parseVariadicArguments = parseVariadicArguments;
6
6
  exports.assertUnexpectedObjectKeys = assertUnexpectedObjectKeys;
7
+ exports.assertUnexpectedVariadicFlags = assertUnexpectedVariadicFlags;
7
8
  var _errors = require("../utils/errors");
8
9
  const debug = require("debug")("expo:utils:variadic");
9
10
  function parseVariadicArguments(argv) {
@@ -43,5 +44,22 @@ function assertUnexpectedObjectKeys(keys, obj) {
43
44
  throw new _errors.CommandError("BAD_ARGS", `Unexpected: ${unexpectedKeys.join(", ")}`);
44
45
  }
45
46
  }
47
+ function assertUnexpectedVariadicFlags(expectedFlags, { extras , flags , variadic }, prefixCommand = "") {
48
+ const unexpectedFlags = Object.keys(flags).filter((key)=>!expectedFlags.includes(key)
49
+ );
50
+ if (unexpectedFlags.length > 0) {
51
+ const intendedFlags = Object.entries(flags).filter(([key])=>expectedFlags.includes(key)
52
+ ).map(([key])=>key
53
+ );
54
+ const cmd = [
55
+ prefixCommand,
56
+ ...variadic,
57
+ ...intendedFlags,
58
+ "--",
59
+ ...extras.concat(unexpectedFlags),
60
+ ].join(" ");
61
+ throw new _errors.CommandError("BAD_ARGS", `Unexpected: ${unexpectedFlags.join(", ")}\nDid you mean: ${cmd.trim()}`);
62
+ }
63
+ }
46
64
 
47
65
  //# sourceMappingURL=variadic.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/variadic.ts"],"sourcesContent":["import { CommandError } from '../utils/errors';\n\nconst debug = require('debug')('expo:utils:variadic') as typeof console.log;\n\n/** Given a list of CLI args, return a sorted set of args based on categories used in a complex command. */\nexport function parseVariadicArguments(argv: string[]): {\n variadic: string[];\n extras: string[];\n flags: Record<string, boolean>;\n} {\n const variadic: string[] = [];\n const flags: Record<string, boolean> = {};\n\n for (const arg of argv) {\n if (!arg.startsWith('-')) {\n variadic.push(arg);\n } else if (arg === '--') {\n break;\n } else {\n flags[arg] = true;\n }\n }\n\n // Everything after `--` that is not an option is passed to the underlying install command.\n const extras: string[] = [];\n\n const extraOperator = argv.indexOf('--');\n if (extraOperator > -1 && argv.length > extraOperator + 1) {\n const extraArgs = argv.slice(extraOperator + 1);\n if (extraArgs.includes('--')) {\n throw new CommandError('BAD_ARGS', 'Unexpected multiple --');\n }\n extras.push(...extraArgs);\n debug('Extra arguments: ' + extras.join(', '));\n }\n\n debug(`Parsed arguments (variadic: %O, flags: %O, extra: %O)`, variadic, flags, extras);\n\n return {\n variadic,\n flags,\n extras,\n };\n}\n\nexport function assertUnexpectedObjectKeys(keys: string[], obj: Record<string, any>): void {\n const unexpectedKeys = Object.keys(obj).filter((key) => !keys.includes(key));\n if (unexpectedKeys.length > 0) {\n throw new CommandError('BAD_ARGS', `Unexpected: ${unexpectedKeys.join(', ')}`);\n }\n}\n"],"names":["parseVariadicArguments","assertUnexpectedObjectKeys","debug","require","argv","variadic","flags","arg","startsWith","push","extras","extraOperator","indexOf","length","extraArgs","slice","includes","CommandError","join","keys","obj","unexpectedKeys","Object","filter","key"],"mappings":"AAAA;;;;QAKgBA,sBAAsB,GAAtBA,sBAAsB;QAwCtBC,0BAA0B,GAA1BA,0BAA0B;AA7Cb,IAAA,OAAiB,WAAjB,iBAAiB,CAAA;AAE9C,MAAMC,KAAK,GAAGC,OAAO,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,AAAsB,AAAC;AAGrE,SAASH,sBAAsB,CAACI,IAAc,EAInD;IACA,MAAMC,QAAQ,GAAa,EAAE,AAAC;IAC9B,MAAMC,KAAK,GAA4B,EAAE,AAAC;IAE1C,KAAK,MAAMC,GAAG,IAAIH,IAAI,CAAE;QACtB,IAAI,CAACG,GAAG,CAACC,UAAU,CAAC,GAAG,CAAC,EAAE;YACxBH,QAAQ,CAACI,IAAI,CAACF,GAAG,CAAC,CAAC;SACpB,MAAM,IAAIA,GAAG,KAAK,IAAI,EAAE;YACvB,MAAM;SACP,MAAM;YACLD,KAAK,CAACC,GAAG,CAAC,GAAG,IAAI,CAAC;SACnB;KACF;IAED,2FAA2F;IAC3F,MAAMG,MAAM,GAAa,EAAE,AAAC;IAE5B,MAAMC,aAAa,GAAGP,IAAI,CAACQ,OAAO,CAAC,IAAI,CAAC,AAAC;IACzC,IAAID,aAAa,GAAG,CAAC,CAAC,IAAIP,IAAI,CAACS,MAAM,GAAGF,aAAa,GAAG,CAAC,EAAE;QACzD,MAAMG,SAAS,GAAGV,IAAI,CAACW,KAAK,CAACJ,aAAa,GAAG,CAAC,CAAC,AAAC;QAChD,IAAIG,SAAS,CAACE,QAAQ,CAAC,IAAI,CAAC,EAAE;YAC5B,MAAM,IAAIC,OAAY,aAAA,CAAC,UAAU,EAAE,wBAAwB,CAAC,CAAC;SAC9D;QACDP,MAAM,CAACD,IAAI,IAAIK,SAAS,CAAC,CAAC;QAC1BZ,KAAK,CAAC,mBAAmB,GAAGQ,MAAM,CAACQ,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;KAChD;IAEDhB,KAAK,CAAC,CAAC,qDAAqD,CAAC,EAAEG,QAAQ,EAAEC,KAAK,EAAEI,MAAM,CAAC,CAAC;IAExF,OAAO;QACLL,QAAQ;QACRC,KAAK;QACLI,MAAM;KACP,CAAC;CACH;AAEM,SAAST,0BAA0B,CAACkB,IAAc,EAAEC,GAAwB,EAAQ;IACzF,MAAMC,cAAc,GAAGC,MAAM,CAACH,IAAI,CAACC,GAAG,CAAC,CAACG,MAAM,CAAC,CAACC,GAAG,GAAK,CAACL,IAAI,CAACH,QAAQ,CAACQ,GAAG,CAAC;IAAA,CAAC,AAAC;IAC7E,IAAIH,cAAc,CAACR,MAAM,GAAG,CAAC,EAAE;QAC7B,MAAM,IAAII,OAAY,aAAA,CAAC,UAAU,EAAE,CAAC,YAAY,EAAEI,cAAc,CAACH,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;KAChF;CACF"}
1
+ {"version":3,"sources":["../../../src/utils/variadic.ts"],"sourcesContent":["import { CommandError } from '../utils/errors';\n\nconst debug = require('debug')('expo:utils:variadic') as typeof console.log;\n\n/** Given a list of CLI args, return a sorted set of args based on categories used in a complex command. */\nexport function parseVariadicArguments(argv: string[]): {\n variadic: string[];\n extras: string[];\n flags: Record<string, boolean>;\n} {\n const variadic: string[] = [];\n const flags: Record<string, boolean> = {};\n\n for (const arg of argv) {\n if (!arg.startsWith('-')) {\n variadic.push(arg);\n } else if (arg === '--') {\n break;\n } else {\n flags[arg] = true;\n }\n }\n\n // Everything after `--` that is not an option is passed to the underlying install command.\n const extras: string[] = [];\n\n const extraOperator = argv.indexOf('--');\n if (extraOperator > -1 && argv.length > extraOperator + 1) {\n const extraArgs = argv.slice(extraOperator + 1);\n if (extraArgs.includes('--')) {\n throw new CommandError('BAD_ARGS', 'Unexpected multiple --');\n }\n extras.push(...extraArgs);\n debug('Extra arguments: ' + extras.join(', '));\n }\n\n debug(`Parsed arguments (variadic: %O, flags: %O, extra: %O)`, variadic, flags, extras);\n\n return {\n variadic,\n flags,\n extras,\n };\n}\n\nexport function assertUnexpectedObjectKeys(keys: string[], obj: Record<string, any>): void {\n const unexpectedKeys = Object.keys(obj).filter((key) => !keys.includes(key));\n if (unexpectedKeys.length > 0) {\n throw new CommandError('BAD_ARGS', `Unexpected: ${unexpectedKeys.join(', ')}`);\n }\n}\n\nexport function assertUnexpectedVariadicFlags(\n expectedFlags: string[],\n { extras, flags, variadic }: ReturnType<typeof parseVariadicArguments>,\n prefixCommand = ''\n) {\n const unexpectedFlags = Object.keys(flags).filter((key) => !expectedFlags.includes(key));\n\n if (unexpectedFlags.length > 0) {\n const intendedFlags = Object.entries(flags)\n .filter(([key]) => expectedFlags.includes(key))\n .map(([key]) => key);\n\n const cmd = [\n prefixCommand,\n ...variadic,\n ...intendedFlags,\n '--',\n ...extras.concat(unexpectedFlags),\n ].join(' ');\n\n throw new CommandError(\n 'BAD_ARGS',\n `Unexpected: ${unexpectedFlags.join(', ')}\\nDid you mean: ${cmd.trim()}`\n );\n }\n}\n"],"names":["parseVariadicArguments","assertUnexpectedObjectKeys","assertUnexpectedVariadicFlags","debug","require","argv","variadic","flags","arg","startsWith","push","extras","extraOperator","indexOf","length","extraArgs","slice","includes","CommandError","join","keys","obj","unexpectedKeys","Object","filter","key","expectedFlags","prefixCommand","unexpectedFlags","intendedFlags","entries","map","cmd","concat","trim"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@expo/cli",
3
- "version": "0.3.2",
3
+ "version": "0.4.1",
4
4
  "description": "The Expo CLI",
5
5
  "main": "build/bin/cli",
6
6
  "bin": {
@@ -43,7 +43,7 @@
43
43
  "@expo/dev-server": "~0.1.120",
44
44
  "@expo/devcert": "^1.0.0",
45
45
  "@expo/json-file": "^8.2.35",
46
- "@expo/metro-config": "~0.4.0",
46
+ "@expo/metro-config": "~0.5.0",
47
47
  "@expo/osascript": "^2.0.31",
48
48
  "@expo/package-manager": "~0.0.53",
49
49
  "@expo/plist": "^0.0.18",
@@ -68,6 +68,7 @@
68
68
  "getenv": "^1.0.0",
69
69
  "graphql": "15.8.0",
70
70
  "graphql-tag": "^2.10.1",
71
+ "https-proxy-agent": "^5.0.1",
71
72
  "internal-ip": "4.3.0",
72
73
  "is-root": "^2.1.0",
73
74
  "js-yaml": "^3.13.1",
@@ -130,12 +131,12 @@
130
131
  "@types/webpack": "~4.41.32",
131
132
  "@types/webpack-dev-server": "3.11.0",
132
133
  "@types/wrap-ansi": "^8.0.1",
133
- "expo-module-scripts": "^2.0.0",
134
+ "expo-module-scripts": "^3.0.0",
134
135
  "klaw-sync": "^6.0.0",
135
136
  "nock": "~13.2.2",
136
137
  "nullthrows": "^1.1.1",
137
138
  "structured-headers": "^0.4.1",
138
139
  "taskr": "1.1.0"
139
140
  },
140
- "gitHead": "da2b9d2bb73100781b31906967669fe521d55e8a"
141
+ "gitHead": "5ff3a7e56ae21f002da3d699cc95bc98d784cd77"
141
142
  }