@expo/cli 0.4.11 → 0.5.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 (60) hide show
  1. package/build/bin/cli +2 -2
  2. package/build/src/api/user/UserSettings.js +2 -2
  3. package/build/src/api/user/UserSettings.js.map +1 -1
  4. package/build/src/export/fork-bundleAsync.js +7 -2
  5. package/build/src/export/fork-bundleAsync.js.map +1 -1
  6. package/build/src/prebuild/writeMetroConfig.js +1 -1
  7. package/build/src/prebuild/writeMetroConfig.js.map +1 -1
  8. package/build/src/run/ios/appleDevice/AppleDevice.js +12 -17
  9. package/build/src/run/ios/appleDevice/AppleDevice.js.map +1 -1
  10. package/build/src/run/ios/appleDevice/client/LockdowndClient.js.map +1 -1
  11. package/build/src/run/ios/appleDevice/client/UsbmuxdClient.js.map +1 -1
  12. package/build/src/run/ios/options/promptDevice.js +1 -1
  13. package/build/src/run/ios/options/promptDevice.js.map +1 -1
  14. package/build/src/start/doctor/apple/XcodePrerequisite.js +3 -3
  15. package/build/src/start/doctor/apple/XcodePrerequisite.js.map +1 -1
  16. package/build/src/start/doctor/typescript/TypeScriptProjectPrerequisite.js +0 -4
  17. package/build/src/start/doctor/typescript/TypeScriptProjectPrerequisite.js.map +1 -1
  18. package/build/src/start/interface/interactiveActions.js +7 -2
  19. package/build/src/start/interface/interactiveActions.js.map +1 -1
  20. package/build/src/start/platforms/ExpoGoInstaller.js +5 -0
  21. package/build/src/start/platforms/ExpoGoInstaller.js.map +1 -1
  22. package/build/src/start/platforms/android/adb.js +2 -1
  23. package/build/src/start/platforms/android/adb.js.map +1 -1
  24. package/build/src/start/server/AsyncNgrok.js +2 -1
  25. package/build/src/start/server/AsyncNgrok.js.map +1 -1
  26. package/build/src/start/server/UrlCreator.js +3 -9
  27. package/build/src/start/server/UrlCreator.js.map +1 -1
  28. package/build/src/start/server/metro/instantiateMetro.js +23 -1
  29. package/build/src/start/server/metro/instantiateMetro.js.map +1 -1
  30. package/build/src/start/server/metro/metroErrors.js +14 -0
  31. package/build/src/start/server/metro/metroErrors.js.map +1 -0
  32. package/build/src/start/server/metro/resolveFromProject.js +4 -0
  33. package/build/src/start/server/metro/resolveFromProject.js.map +1 -1
  34. package/build/src/start/server/metro/withMetroMultiPlatform.js +25 -26
  35. package/build/src/start/server/metro/withMetroMultiPlatform.js.map +1 -1
  36. package/build/src/start/server/metro/withMetroResolvers.js +47 -0
  37. package/build/src/start/server/metro/withMetroResolvers.js.map +1 -0
  38. package/build/src/start/server/middleware/ClassicManifestMiddleware.js +2 -2
  39. package/build/src/start/server/middleware/ClassicManifestMiddleware.js.map +1 -1
  40. package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js +2 -2
  41. package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js.map +1 -1
  42. package/build/src/start/server/middleware/HistoryFallbackMiddleware.js +29 -0
  43. package/build/src/start/server/middleware/HistoryFallbackMiddleware.js.map +1 -1
  44. package/build/src/utils/analytics/getMetroDebugProperties.js +16 -0
  45. package/build/src/utils/analytics/getMetroDebugProperties.js.map +1 -0
  46. package/build/src/utils/analytics/getMetroProperties.js +29 -0
  47. package/build/src/utils/analytics/getMetroProperties.js.map +1 -0
  48. package/build/src/utils/analytics/metroDebuggerMiddleware.js +50 -0
  49. package/build/src/utils/analytics/metroDebuggerMiddleware.js.map +1 -0
  50. package/build/src/utils/analytics/rudderstackClient.js +2 -2
  51. package/build/src/utils/analytics/rudderstackClient.js.map +1 -1
  52. package/build/src/utils/downloadExpoGoAsync.js +35 -10
  53. package/build/src/utils/downloadExpoGoAsync.js.map +1 -1
  54. package/build/src/utils/env.js +0 -10
  55. package/build/src/utils/env.js.map +1 -1
  56. package/build/src/utils/errors.js +3 -2
  57. package/build/src/utils/errors.js.map +1 -1
  58. package/build/src/utils/scheme.js +11 -2
  59. package/build/src/utils/scheme.js.map +1 -1
  60. package/package.json +14 -13
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ exports.isFailedToResolveNameError = isFailedToResolveNameError;
6
+ exports.isFailedToResolvePathError = isFailedToResolvePathError;
7
+ function isFailedToResolveNameError(error) {
8
+ return !!error && "extraPaths" in error && error.constructor.name === "FailedToResolveNameError";
9
+ }
10
+ function isFailedToResolvePathError(error) {
11
+ return !!error && "candidates" in error && error.constructor.name === "FailedToResolvePathError";
12
+ }
13
+
14
+ //# sourceMappingURL=metroErrors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/start/server/metro/metroErrors.ts"],"sourcesContent":["// Used to cast a type to metro errors without depending on specific versions of metro.\n\nexport type FileAndDirCandidates = {\n dir: FileCandidates;\n file: FileCandidates;\n};\n\n/**\n * This is a way to describe what files we tried to look for when resolving\n * a module name as file. This is mainly used for error reporting, so that\n * we can explain why we cannot resolve a module.\n */\nexport type FileCandidates =\n // We only tried to resolve a specific asset.\n | { type: 'asset'; name: string }\n // We attempted to resolve a name as being a source file (ex. JavaScript,\n // JSON...), in which case there can be several extensions we tried, for\n // example `/js/foo.ios.js`, `/js/foo.js`, etc. for a single prefix '/js/foo'.\n | {\n type: 'sourceFile';\n filePathPrefix: string;\n candidateExts: readonly string[];\n };\n\ntype FailedToResolveNameError = Error & {\n dirPaths: string[];\n extraPaths: string[];\n};\n\ntype FailedToResolvePathError = Error & {\n candidates: FileAndDirCandidates;\n};\n\nexport function isFailedToResolveNameError(error: any): error is FailedToResolveNameError {\n return !!error && 'extraPaths' in error && error.constructor.name === 'FailedToResolveNameError';\n}\n\nexport function isFailedToResolvePathError(error: any): error is FailedToResolvePathError {\n return !!error && 'candidates' in error && error.constructor.name === 'FailedToResolvePathError';\n}\n"],"names":["isFailedToResolveNameError","isFailedToResolvePathError","error","constructor","name"],"mappings":"AAEA;;;;QA+BgBA,0BAA0B,GAA1BA,0BAA0B;QAI1BC,0BAA0B,GAA1BA,0BAA0B;AAJnC,SAASD,0BAA0B,CAACE,KAAU,EAAqC;IACxF,OAAO,CAAC,CAACA,KAAK,IAAI,YAAY,IAAIA,KAAK,IAAIA,KAAK,CAACC,WAAW,CAACC,IAAI,KAAK,0BAA0B,CAAC;CAClG;AAEM,SAASH,0BAA0B,CAACC,KAAU,EAAqC;IACxF,OAAO,CAAC,CAACA,KAAK,IAAI,YAAY,IAAIA,KAAK,IAAIA,KAAK,CAACC,WAAW,CAACC,IAAI,KAAK,0BAA0B,CAAC;CAClG"}
@@ -6,6 +6,7 @@ exports.importMetroFromProject = importMetroFromProject;
6
6
  exports.importExpoMetroConfigFromProject = importExpoMetroConfigFromProject;
7
7
  exports.importMetroResolverFromProject = importMetroResolverFromProject;
8
8
  exports.importCliSaveAssetsFromProject = importCliSaveAssetsFromProject;
9
+ exports.resolveMetroVersionFromProject = resolveMetroVersionFromProject;
9
10
  var _resolveFrom = _interopRequireDefault(require("resolve-from"));
10
11
  function _interopRequireDefault(obj) {
11
12
  return obj && obj.__esModule ? obj : {
@@ -42,5 +43,8 @@ function importMetroResolverFromProject(projectRoot) {
42
43
  function importCliSaveAssetsFromProject(projectRoot) {
43
44
  return importFromProject(projectRoot, "@react-native-community/cli-plugin-metro/build/commands/bundle/saveAssets").default;
44
45
  }
46
+ function resolveMetroVersionFromProject(projectRoot) {
47
+ return importFromProject(projectRoot, "metro/package.json").version;
48
+ }
45
49
 
46
50
  //# sourceMappingURL=resolveFromProject.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/server/metro/resolveFromProject.ts"],"sourcesContent":["import resolveFrom from 'resolve-from';\n\n// These resolvers enable us to test the CLI in older projects.\n// We may be able to get rid of this in the future.\n// TODO: Maybe combine with AsyncResolver?\nclass MetroImportError extends Error {\n constructor(projectRoot: string, moduleId: string) {\n super(\n `Missing package \"${moduleId}\" in the project at: ${projectRoot}\\n` +\n 'This usually means \"react-native\" is not installed. ' +\n 'Please verify that dependencies in package.json include \"react-native\" ' +\n 'and run `yarn` or `npm install`.'\n );\n }\n}\n\nfunction resolveFromProject(projectRoot: string, moduleId: string) {\n const resolvedPath = resolveFrom.silent(projectRoot, moduleId);\n if (!resolvedPath) {\n throw new MetroImportError(projectRoot, moduleId);\n }\n return resolvedPath;\n}\n\nfunction importFromProject(projectRoot: string, moduleId: string) {\n return require(resolveFromProject(projectRoot, moduleId));\n}\n\n/** Import `metro` from the project. */\nexport function importMetroFromProject(projectRoot: string): typeof import('metro') {\n return importFromProject(projectRoot, 'metro');\n}\n\n/** Import `@expo/metro-config` from the project. */\nexport function importExpoMetroConfigFromProject(\n projectRoot: string\n): typeof import('@expo/metro-config') {\n return importFromProject(projectRoot, '@expo/metro-config');\n}\n\n/** Import `metro-resolver` from the project. */\nexport function importMetroResolverFromProject(\n projectRoot: string\n): typeof import('metro-resolver') {\n return importFromProject(projectRoot, 'metro-resolver');\n}\n\n/**\n * Import the internal `saveAssets()` function from `react-native` for the purpose\n * of saving production assets as-is instead of converting them to a hash.\n */\nexport function importCliSaveAssetsFromProject(\n projectRoot: string\n): typeof import('@react-native-community/cli-plugin-metro/build/commands/bundle/saveAssets').default {\n return importFromProject(\n projectRoot,\n '@react-native-community/cli-plugin-metro/build/commands/bundle/saveAssets'\n ).default;\n}\n"],"names":["importMetroFromProject","importExpoMetroConfigFromProject","importMetroResolverFromProject","importCliSaveAssetsFromProject","MetroImportError","Error","constructor","projectRoot","moduleId","resolveFromProject","resolvedPath","resolveFrom","silent","importFromProject","require","default"],"mappings":"AAAA;;;;QA6BgBA,sBAAsB,GAAtBA,sBAAsB;QAKtBC,gCAAgC,GAAhCA,gCAAgC;QAOhCC,8BAA8B,GAA9BA,8BAA8B;QAU9BC,8BAA8B,GAA9BA,8BAA8B;AAnDtB,IAAA,YAAc,kCAAd,cAAc,EAAA;;;;;;AAEtC,+DAA+D;AAC/D,mDAAmD;AACnD,0CAA0C;AAC1C,MAAMC,gBAAgB,SAASC,KAAK;IAClCC,YAAYC,WAAmB,EAAEC,QAAgB,CAAE;QACjD,KAAK,CACH,CAAC,iBAAiB,EAAEA,QAAQ,CAAC,qBAAqB,EAAED,WAAW,CAAC,EAAE,CAAC,GACjE,sDAAsD,GACtD,yEAAyE,GACzE,kCAAkC,CACrC,CAAC;KACH;CACF;AAED,SAASE,kBAAkB,CAACF,WAAmB,EAAEC,QAAgB,EAAE;IACjE,MAAME,YAAY,GAAGC,YAAW,QAAA,CAACC,MAAM,CAACL,WAAW,EAAEC,QAAQ,CAAC,AAAC;IAC/D,IAAI,CAACE,YAAY,EAAE;QACjB,MAAM,IAAIN,gBAAgB,CAACG,WAAW,EAAEC,QAAQ,CAAC,CAAC;KACnD;IACD,OAAOE,YAAY,CAAC;CACrB;AAED,SAASG,iBAAiB,CAACN,WAAmB,EAAEC,QAAgB,EAAE;IAChE,OAAOM,OAAO,CAACL,kBAAkB,CAACF,WAAW,EAAEC,QAAQ,CAAC,CAAC,CAAC;CAC3D;AAGM,SAASR,sBAAsB,CAACO,WAAmB,EAA0B;IAClF,OAAOM,iBAAiB,CAACN,WAAW,EAAE,OAAO,CAAC,CAAC;CAChD;AAGM,SAASN,gCAAgC,CAC9CM,WAAmB,EACkB;IACrC,OAAOM,iBAAiB,CAACN,WAAW,EAAE,oBAAoB,CAAC,CAAC;CAC7D;AAGM,SAASL,8BAA8B,CAC5CK,WAAmB,EACc;IACjC,OAAOM,iBAAiB,CAACN,WAAW,EAAE,gBAAgB,CAAC,CAAC;CACzD;AAMM,SAASJ,8BAA8B,CAC5CI,WAAmB,EACiF;IACpG,OAAOM,iBAAiB,CACtBN,WAAW,EACX,2EAA2E,CAC5E,CAACQ,OAAO,CAAC;CACX"}
1
+ {"version":3,"sources":["../../../../../src/start/server/metro/resolveFromProject.ts"],"sourcesContent":["import resolveFrom from 'resolve-from';\n\n// These resolvers enable us to test the CLI in older projects.\n// We may be able to get rid of this in the future.\n// TODO: Maybe combine with AsyncResolver?\nclass MetroImportError extends Error {\n constructor(projectRoot: string, moduleId: string) {\n super(\n `Missing package \"${moduleId}\" in the project at: ${projectRoot}\\n` +\n 'This usually means \"react-native\" is not installed. ' +\n 'Please verify that dependencies in package.json include \"react-native\" ' +\n 'and run `yarn` or `npm install`.'\n );\n }\n}\n\nfunction resolveFromProject(projectRoot: string, moduleId: string) {\n const resolvedPath = resolveFrom.silent(projectRoot, moduleId);\n if (!resolvedPath) {\n throw new MetroImportError(projectRoot, moduleId);\n }\n return resolvedPath;\n}\n\nfunction importFromProject(projectRoot: string, moduleId: string) {\n return require(resolveFromProject(projectRoot, moduleId));\n}\n\n/** Import `metro` from the project. */\nexport function importMetroFromProject(projectRoot: string): typeof import('metro') {\n return importFromProject(projectRoot, 'metro');\n}\n\n/** Import `@expo/metro-config` from the project. */\nexport function importExpoMetroConfigFromProject(\n projectRoot: string\n): typeof import('@expo/metro-config') {\n return importFromProject(projectRoot, '@expo/metro-config');\n}\n\n/** Import `metro-resolver` from the project. */\nexport function importMetroResolverFromProject(\n projectRoot: string\n): typeof import('metro-resolver') {\n return importFromProject(projectRoot, 'metro-resolver');\n}\n\n/**\n * Import the internal `saveAssets()` function from `react-native` for the purpose\n * of saving production assets as-is instead of converting them to a hash.\n */\nexport function importCliSaveAssetsFromProject(\n projectRoot: string\n): typeof import('@react-native-community/cli-plugin-metro/build/commands/bundle/saveAssets').default {\n return importFromProject(\n projectRoot,\n '@react-native-community/cli-plugin-metro/build/commands/bundle/saveAssets'\n ).default;\n}\n\n/** Resolve the installed Metro version from project */\nexport function resolveMetroVersionFromProject(projectRoot: string): string {\n return importFromProject(projectRoot, 'metro/package.json').version;\n}\n"],"names":["importMetroFromProject","importExpoMetroConfigFromProject","importMetroResolverFromProject","importCliSaveAssetsFromProject","resolveMetroVersionFromProject","MetroImportError","Error","constructor","projectRoot","moduleId","resolveFromProject","resolvedPath","resolveFrom","silent","importFromProject","require","default","version"],"mappings":"AAAA;;;;QA6BgBA,sBAAsB,GAAtBA,sBAAsB;QAKtBC,gCAAgC,GAAhCA,gCAAgC;QAOhCC,8BAA8B,GAA9BA,8BAA8B;QAU9BC,8BAA8B,GAA9BA,8BAA8B;QAU9BC,8BAA8B,GAA9BA,8BAA8B;AA7DtB,IAAA,YAAc,kCAAd,cAAc,EAAA;;;;;;AAEtC,+DAA+D;AAC/D,mDAAmD;AACnD,0CAA0C;AAC1C,MAAMC,gBAAgB,SAASC,KAAK;IAClCC,YAAYC,WAAmB,EAAEC,QAAgB,CAAE;QACjD,KAAK,CACH,CAAC,iBAAiB,EAAEA,QAAQ,CAAC,qBAAqB,EAAED,WAAW,CAAC,EAAE,CAAC,GACjE,sDAAsD,GACtD,yEAAyE,GACzE,kCAAkC,CACrC,CAAC;KACH;CACF;AAED,SAASE,kBAAkB,CAACF,WAAmB,EAAEC,QAAgB,EAAE;IACjE,MAAME,YAAY,GAAGC,YAAW,QAAA,CAACC,MAAM,CAACL,WAAW,EAAEC,QAAQ,CAAC,AAAC;IAC/D,IAAI,CAACE,YAAY,EAAE;QACjB,MAAM,IAAIN,gBAAgB,CAACG,WAAW,EAAEC,QAAQ,CAAC,CAAC;KACnD;IACD,OAAOE,YAAY,CAAC;CACrB;AAED,SAASG,iBAAiB,CAACN,WAAmB,EAAEC,QAAgB,EAAE;IAChE,OAAOM,OAAO,CAACL,kBAAkB,CAACF,WAAW,EAAEC,QAAQ,CAAC,CAAC,CAAC;CAC3D;AAGM,SAAST,sBAAsB,CAACQ,WAAmB,EAA0B;IAClF,OAAOM,iBAAiB,CAACN,WAAW,EAAE,OAAO,CAAC,CAAC;CAChD;AAGM,SAASP,gCAAgC,CAC9CO,WAAmB,EACkB;IACrC,OAAOM,iBAAiB,CAACN,WAAW,EAAE,oBAAoB,CAAC,CAAC;CAC7D;AAGM,SAASN,8BAA8B,CAC5CM,WAAmB,EACc;IACjC,OAAOM,iBAAiB,CAACN,WAAW,EAAE,gBAAgB,CAAC,CAAC;CACzD;AAMM,SAASL,8BAA8B,CAC5CK,WAAmB,EACiF;IACpG,OAAOM,iBAAiB,CACtBN,WAAW,EACX,2EAA2E,CAC5E,CAACQ,OAAO,CAAC;CACX;AAGM,SAASZ,8BAA8B,CAACI,WAAmB,EAAU;IAC1E,OAAOM,iBAAiB,CAACN,WAAW,EAAE,oBAAoB,CAAC,CAACS,OAAO,CAAC;CACrE"}
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
5
5
  exports.withWebResolvers = withWebResolvers;
6
+ exports.shouldAliasAssetRegistryForWeb = shouldAliasAssetRegistryForWeb;
6
7
  exports.withMetroMultiPlatformAsync = withMetroMultiPlatformAsync;
7
8
  var _fs = _interopRequireDefault(require("fs"));
8
9
  var _path = _interopRequireDefault(require("path"));
@@ -11,6 +12,7 @@ var _env = require("../../../utils/env");
11
12
  var _webSupportProjectPrerequisite = require("../../doctor/web/WebSupportProjectPrerequisite");
12
13
  var _resolveFromProject = require("./resolveFromProject");
13
14
  var _router = require("./router");
15
+ var _withMetroResolvers = require("./withMetroResolvers");
14
16
  function _interopRequireDefault(obj) {
15
17
  return obj && obj.__esModule ? obj : {
16
18
  default: obj
@@ -34,29 +36,8 @@ function withWebPolyfills(config) {
34
36
  }
35
37
  };
36
38
  }
37
- function getDefaultResolveRequest(projectRoot) {
38
- const { resolve } = (0, _resolveFromProject).importMetroResolverFromProject(projectRoot);
39
- return (context, moduleName, platform)=>{
40
- return resolve(context, moduleName, platform);
41
- };
42
- }
43
- /** Extend the `resolver.resolveRequest` method with custom methods that can exit early by returning a `Resolution`. */ function withCustomResolvers(config, projectRoot, resolvers) {
44
- const originalResolveRequest = config.resolver.resolveRequest || getDefaultResolveRequest(projectRoot);
45
- return {
46
- ...config,
47
- resolver: {
48
- ...config.resolver,
49
- resolveRequest (...args) {
50
- for (const resolver of resolvers){
51
- const resolution = resolver(...args);
52
- if (resolution) {
53
- return resolution;
54
- }
55
- }
56
- return originalResolveRequest(...args);
57
- }
58
- }
59
- };
39
+ function normalizeSlashes(p) {
40
+ return p.replace(/\\/g, "/");
60
41
  }
61
42
  function withWebResolvers(config, projectRoot) {
62
43
  // Get the `transformer.assetRegistryPath`
@@ -72,6 +53,11 @@ function withWebResolvers(config, projectRoot) {
72
53
  "react-native": _path.default.resolve(require.resolve("react-native-web/package.json"), "..")
73
54
  }
74
55
  };
56
+ const aliases = {
57
+ web: {
58
+ "react-native": "react-native-web"
59
+ }
60
+ };
75
61
  const preferredMainFields = {
76
62
  // Defaults from Expo Webpack. Most packages using `react-native` don't support web
77
63
  // in the `react-native` field, so we should prefer the `browser` field.
@@ -82,15 +68,25 @@ function withWebResolvers(config, projectRoot) {
82
68
  "main"
83
69
  ]
84
70
  };
85
- return withCustomResolvers(config, projectRoot, [
71
+ return (0, _withMetroResolvers).withMetroResolvers(config, projectRoot, [
86
72
  // Add a resolver to alias the web asset resolver.
87
73
  (immutableContext, moduleName, platform)=>{
88
74
  const context = {
89
75
  ...immutableContext
90
76
  };
77
+ // Conditionally remap `react-native` to `react-native-web` on web in
78
+ // a way that doesn't require Babel to resolve the alias.
79
+ if (platform && platform in aliases && aliases[platform][moduleName]) {
80
+ moduleName = aliases[platform][moduleName];
81
+ }
82
+ // TODO: We may be able to remove this in the future, it's doing no harm
83
+ // by staying here.
91
84
  // Conditionally remap `react-native` to `react-native-web`
92
85
  if (platform && platform in extraNodeModules) {
93
- context.extraNodeModules = extraNodeModules[platform];
86
+ context.extraNodeModules = {
87
+ ...extraNodeModules[platform],
88
+ ...context.extraNodeModules
89
+ };
94
90
  }
95
91
  const mainFields = _env.env.EXPO_METRO_NO_MAIN_FIELD_OVERRIDE ? context.mainFields : platform && platform in preferredMainFields ? preferredMainFields[platform] : context.mainFields;
96
92
  const result = resolve({
@@ -108,7 +104,7 @@ function withWebResolvers(config, projectRoot) {
108
104
  }, moduleName, platform);
109
105
  // Replace the web resolver with the original one.
110
106
  // This is basically an alias for web-only.
111
- if (platform === "web" && (result == null ? void 0 : result.type) === "sourceFile" && typeof (result == null ? void 0 : result.filePath) === "string" && result.filePath.endsWith("react-native-web/dist/modules/AssetRegistry/index.js")) {
107
+ if (shouldAliasAssetRegistryForWeb(platform, result)) {
112
108
  // @ts-expect-error: `readonly` for some reason.
113
109
  result.filePath = assetRegistryPath;
114
110
  }
@@ -116,6 +112,9 @@ function withWebResolvers(config, projectRoot) {
116
112
  },
117
113
  ]);
118
114
  }
115
+ function shouldAliasAssetRegistryForWeb(platform, result) {
116
+ return platform === "web" && (result == null ? void 0 : result.type) === "sourceFile" && typeof (result == null ? void 0 : result.filePath) === "string" && normalizeSlashes(result.filePath).endsWith("react-native-web/dist/modules/AssetRegistry/index.js");
117
+ }
119
118
  async function withMetroMultiPlatformAsync(projectRoot, config, platformBundlers) {
120
119
  // Auto pick App entry: this is injected with Babel.
121
120
  process.env.EXPO_ROUTER_APP_ROOT = (0, _router).getAppRouterRelativeEntryPath(projectRoot);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/server/metro/withMetroMultiPlatform.ts"],"sourcesContent":["/**\n * Copyright © 2022 650 Industries.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport fs from 'fs';\nimport { ConfigT } from 'metro-config';\nimport { ResolutionContext } from 'metro-resolver';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\n\nimport { env } from '../../../utils/env';\nimport { WebSupportProjectPrerequisite } from '../../doctor/web/WebSupportProjectPrerequisite';\nimport { PlatformBundlers } from '../platformBundlers';\nimport { importMetroResolverFromProject } from './resolveFromProject';\nimport { getAppRouterRelativeEntryPath } from './router';\n\nfunction withWebPolyfills(config: ConfigT): ConfigT {\n const originalGetPolyfills = config.serializer.getPolyfills\n ? config.serializer.getPolyfills.bind(config.serializer)\n : () => [];\n\n const getPolyfills = (ctx: { platform: string | null | undefined }): readonly string[] => {\n if (ctx.platform === 'web') {\n return [\n // TODO: runtime polyfills, i.e. Fast Refresh, error overlay, React Dev Tools...\n ];\n }\n // Generally uses `rn-get-polyfills`\n return originalGetPolyfills(ctx);\n };\n\n return {\n ...config,\n serializer: {\n ...config.serializer,\n getPolyfills,\n },\n };\n}\n\nfunction getDefaultResolveRequest(projectRoot: string) {\n const { resolve } = importMetroResolverFromProject(projectRoot);\n return (context: ResolutionContext, moduleName: string, platform: string | null) => {\n return resolve(context, moduleName, platform);\n };\n}\n\nexport type ExpoCustomMetroResolver = (\n ...args: Parameters<import('metro-resolver').CustomResolver>\n) => import('metro-resolver').Resolution | null;\n\n/** Extend the `resolver.resolveRequest` method with custom methods that can exit early by returning a `Resolution`. */\nfunction withCustomResolvers(\n config: ConfigT,\n projectRoot: string,\n resolvers: ExpoCustomMetroResolver[]\n): ConfigT {\n const originalResolveRequest =\n config.resolver.resolveRequest || getDefaultResolveRequest(projectRoot);\n\n return {\n ...config,\n resolver: {\n ...config.resolver,\n resolveRequest(...args: Parameters<import('metro-resolver').CustomResolver>) {\n for (const resolver of resolvers) {\n const resolution = resolver(...args);\n if (resolution) {\n return resolution;\n }\n }\n return originalResolveRequest(...args);\n },\n },\n };\n}\n\n/**\n * Apply custom resolvers to do the following:\n * - Disable `.native.js` extensions on web.\n * - Alias `react-native` to `react-native-web` on web.\n * - Redirect `react-native-web/dist/modules/AssetRegistry/index.js` to `@react-native/assets/registry.js` on web.\n */\nexport function withWebResolvers(config: ConfigT, projectRoot: string) {\n // Get the `transformer.assetRegistryPath`\n // this needs to be unified since you can't dynamically\n // swap out the transformer based on platform.\n const assetRegistryPath = fs.realpathSync(\n // This is the native asset registry alias for native.\n path.resolve(resolveFrom(projectRoot, 'react-native/Libraries/Image/AssetRegistry'))\n // NOTE(EvanBacon): This is the newer import but it doesn't work in the expo/expo monorepo.\n // path.resolve(resolveFrom(projectRoot, '@react-native/assets/registry.js'))\n );\n\n // Create a resolver which dynamically disables support for\n // `*.native.*` extensions on web.\n\n const { resolve } = importMetroResolverFromProject(projectRoot);\n\n const extraNodeModules: { [key: string]: Record<string, string> } = {\n web: {\n 'react-native': path.resolve(require.resolve('react-native-web/package.json'), '..'),\n },\n };\n\n const preferredMainFields: { [key: string]: string[] } = {\n // Defaults from Expo Webpack. Most packages using `react-native` don't support web\n // in the `react-native` field, so we should prefer the `browser` field.\n // https://github.com/expo/router/issues/37\n web: ['browser', 'module', 'main'],\n };\n\n return withCustomResolvers(config, projectRoot, [\n // Add a resolver to alias the web asset resolver.\n (immutableContext: ResolutionContext, moduleName: string, platform: string | null) => {\n const context = { ...immutableContext } as ResolutionContext & { mainFields: string[] };\n\n // Conditionally remap `react-native` to `react-native-web`\n if (platform && platform in extraNodeModules) {\n context.extraNodeModules = extraNodeModules[platform];\n }\n\n const mainFields = env.EXPO_METRO_NO_MAIN_FIELD_OVERRIDE\n ? context.mainFields\n : platform && platform in preferredMainFields\n ? preferredMainFields[platform]\n : context.mainFields;\n\n const result = resolve(\n {\n ...context,\n preferNativePlatform: platform !== 'web',\n resolveRequest: undefined,\n\n // Passing `mainFields` directly won't be considered\n // we need to extend the `getPackageMainPath` directly to\n // use platform specific `mainFields`.\n getPackageMainPath(packageJsonPath) {\n // @ts-expect-error: mainFields is not on type\n const package_ = context.moduleCache.getPackage(packageJsonPath);\n return package_.getMain(mainFields);\n },\n },\n moduleName,\n platform\n );\n\n // Replace the web resolver with the original one.\n // This is basically an alias for web-only.\n if (\n platform === 'web' &&\n result?.type === 'sourceFile' &&\n typeof result?.filePath === 'string' &&\n result.filePath.endsWith('react-native-web/dist/modules/AssetRegistry/index.js')\n ) {\n // @ts-expect-error: `readonly` for some reason.\n result.filePath = assetRegistryPath;\n }\n\n return result;\n },\n ]);\n}\n\n/** Add support for `react-native-web` and the Web platform. */\nexport async function withMetroMultiPlatformAsync(\n projectRoot: string,\n config: ConfigT,\n platformBundlers: PlatformBundlers\n) {\n // Auto pick App entry: this is injected with Babel.\n process.env.EXPO_ROUTER_APP_ROOT = getAppRouterRelativeEntryPath(projectRoot);\n process.env.EXPO_PROJECT_ROOT = process.env.EXPO_PROJECT_ROOT ?? projectRoot;\n\n if (platformBundlers.web === 'metro') {\n await new WebSupportProjectPrerequisite(projectRoot).assertAsync();\n } else {\n // Bail out early for performance enhancements if web is not enabled.\n return config;\n }\n\n return withMetroMultiPlatform(projectRoot, config, platformBundlers);\n}\n\nfunction withMetroMultiPlatform(\n projectRoot: string,\n config: ConfigT,\n platformBundlers: PlatformBundlers\n) {\n let expoConfigPlatforms = Object.entries(platformBundlers)\n .filter(([, bundler]) => bundler === 'metro')\n .map(([platform]) => platform);\n\n if (Array.isArray(config.resolver.platforms)) {\n expoConfigPlatforms = [...new Set(expoConfigPlatforms.concat(config.resolver.platforms))];\n }\n\n // @ts-expect-error: typed as `readonly`.\n config.resolver.platforms = expoConfigPlatforms;\n\n config = withWebPolyfills(config);\n\n return withWebResolvers(config, projectRoot);\n}\n"],"names":["withWebResolvers","withMetroMultiPlatformAsync","withWebPolyfills","config","originalGetPolyfills","serializer","getPolyfills","bind","ctx","platform","getDefaultResolveRequest","projectRoot","resolve","importMetroResolverFromProject","context","moduleName","withCustomResolvers","resolvers","originalResolveRequest","resolver","resolveRequest","args","resolution","assetRegistryPath","fs","realpathSync","path","resolveFrom","extraNodeModules","web","require","preferredMainFields","immutableContext","mainFields","env","EXPO_METRO_NO_MAIN_FIELD_OVERRIDE","result","preferNativePlatform","undefined","getPackageMainPath","packageJsonPath","package_","moduleCache","getPackage","getMain","type","filePath","endsWith","platformBundlers","process","EXPO_ROUTER_APP_ROOT","getAppRouterRelativeEntryPath","EXPO_PROJECT_ROOT","WebSupportProjectPrerequisite","assertAsync","withMetroMultiPlatform","expoConfigPlatforms","Object","entries","filter","bundler","map","Array","isArray","platforms","Set","concat"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../src/start/server/metro/withMetroMultiPlatform.ts"],"sourcesContent":["/**\n * Copyright © 2022 650 Industries.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport fs from 'fs';\nimport { ConfigT } from 'metro-config';\nimport { Resolution, ResolutionContext } from 'metro-resolver';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\n\nimport { env } from '../../../utils/env';\nimport { WebSupportProjectPrerequisite } from '../../doctor/web/WebSupportProjectPrerequisite';\nimport { PlatformBundlers } from '../platformBundlers';\nimport { importMetroResolverFromProject } from './resolveFromProject';\nimport { getAppRouterRelativeEntryPath } from './router';\nimport { withMetroResolvers } from './withMetroResolvers';\n\nfunction withWebPolyfills(config: ConfigT): ConfigT {\n const originalGetPolyfills = config.serializer.getPolyfills\n ? config.serializer.getPolyfills.bind(config.serializer)\n : () => [];\n\n const getPolyfills = (ctx: { platform: string | null | undefined }): readonly string[] => {\n if (ctx.platform === 'web') {\n return [\n // TODO: runtime polyfills, i.e. Fast Refresh, error overlay, React Dev Tools...\n ];\n }\n // Generally uses `rn-get-polyfills`\n return originalGetPolyfills(ctx);\n };\n\n return {\n ...config,\n serializer: {\n ...config.serializer,\n getPolyfills,\n },\n };\n}\n\nfunction normalizeSlashes(p: string) {\n return p.replace(/\\\\/g, '/');\n}\n\n/**\n * Apply custom resolvers to do the following:\n * - Disable `.native.js` extensions on web.\n * - Alias `react-native` to `react-native-web` on web.\n * - Redirect `react-native-web/dist/modules/AssetRegistry/index.js` to `@react-native/assets/registry.js` on web.\n */\nexport function withWebResolvers(config: ConfigT, projectRoot: string) {\n // Get the `transformer.assetRegistryPath`\n // this needs to be unified since you can't dynamically\n // swap out the transformer based on platform.\n const assetRegistryPath = fs.realpathSync(\n // This is the native asset registry alias for native.\n path.resolve(resolveFrom(projectRoot, 'react-native/Libraries/Image/AssetRegistry'))\n // NOTE(EvanBacon): This is the newer import but it doesn't work in the expo/expo monorepo.\n // path.resolve(resolveFrom(projectRoot, '@react-native/assets/registry.js'))\n );\n\n // Create a resolver which dynamically disables support for\n // `*.native.*` extensions on web.\n\n const { resolve } = importMetroResolverFromProject(projectRoot);\n\n const extraNodeModules: { [key: string]: Record<string, string> } = {\n web: {\n 'react-native': path.resolve(require.resolve('react-native-web/package.json'), '..'),\n },\n };\n\n const aliases: { [key: string]: Record<string, string> } = {\n web: {\n 'react-native': 'react-native-web',\n },\n };\n\n const preferredMainFields: { [key: string]: string[] } = {\n // Defaults from Expo Webpack. Most packages using `react-native` don't support web\n // in the `react-native` field, so we should prefer the `browser` field.\n // https://github.com/expo/router/issues/37\n web: ['browser', 'module', 'main'],\n };\n\n return withMetroResolvers(config, projectRoot, [\n // Add a resolver to alias the web asset resolver.\n (immutableContext: ResolutionContext, moduleName: string, platform: string | null) => {\n const context = { ...immutableContext } as ResolutionContext & { mainFields: string[] };\n\n // Conditionally remap `react-native` to `react-native-web` on web in\n // a way that doesn't require Babel to resolve the alias.\n if (platform && platform in aliases && aliases[platform][moduleName]) {\n moduleName = aliases[platform][moduleName];\n }\n\n // TODO: We may be able to remove this in the future, it's doing no harm\n // by staying here.\n // Conditionally remap `react-native` to `react-native-web`\n if (platform && platform in extraNodeModules) {\n context.extraNodeModules = {\n ...extraNodeModules[platform],\n ...context.extraNodeModules,\n };\n }\n\n const mainFields = env.EXPO_METRO_NO_MAIN_FIELD_OVERRIDE\n ? context.mainFields\n : platform && platform in preferredMainFields\n ? preferredMainFields[platform]\n : context.mainFields;\n\n const result = resolve(\n {\n ...context,\n preferNativePlatform: platform !== 'web',\n resolveRequest: undefined,\n\n // Passing `mainFields` directly won't be considered\n // we need to extend the `getPackageMainPath` directly to\n // use platform specific `mainFields`.\n getPackageMainPath(packageJsonPath) {\n // @ts-expect-error: mainFields is not on type\n const package_ = context.moduleCache.getPackage(packageJsonPath);\n return package_.getMain(mainFields);\n },\n },\n moduleName,\n platform\n );\n\n // Replace the web resolver with the original one.\n // This is basically an alias for web-only.\n if (shouldAliasAssetRegistryForWeb(platform, result)) {\n // @ts-expect-error: `readonly` for some reason.\n result.filePath = assetRegistryPath;\n }\n\n return result;\n },\n ]);\n}\n\n/** @returns `true` if the incoming resolution should be swapped on web. */\nexport function shouldAliasAssetRegistryForWeb(\n platform: string | null,\n result: Resolution\n): boolean {\n return (\n platform === 'web' &&\n result?.type === 'sourceFile' &&\n typeof result?.filePath === 'string' &&\n normalizeSlashes(result.filePath).endsWith(\n 'react-native-web/dist/modules/AssetRegistry/index.js'\n )\n );\n}\n\n/** Add support for `react-native-web` and the Web platform. */\nexport async function withMetroMultiPlatformAsync(\n projectRoot: string,\n config: ConfigT,\n platformBundlers: PlatformBundlers\n) {\n // Auto pick App entry: this is injected with Babel.\n process.env.EXPO_ROUTER_APP_ROOT = getAppRouterRelativeEntryPath(projectRoot);\n process.env.EXPO_PROJECT_ROOT = process.env.EXPO_PROJECT_ROOT ?? projectRoot;\n\n if (platformBundlers.web === 'metro') {\n await new WebSupportProjectPrerequisite(projectRoot).assertAsync();\n } else {\n // Bail out early for performance enhancements if web is not enabled.\n return config;\n }\n\n return withMetroMultiPlatform(projectRoot, config, platformBundlers);\n}\n\nfunction withMetroMultiPlatform(\n projectRoot: string,\n config: ConfigT,\n platformBundlers: PlatformBundlers\n) {\n let expoConfigPlatforms = Object.entries(platformBundlers)\n .filter(([, bundler]) => bundler === 'metro')\n .map(([platform]) => platform);\n\n if (Array.isArray(config.resolver.platforms)) {\n expoConfigPlatforms = [...new Set(expoConfigPlatforms.concat(config.resolver.platforms))];\n }\n\n // @ts-expect-error: typed as `readonly`.\n config.resolver.platforms = expoConfigPlatforms;\n\n config = withWebPolyfills(config);\n\n return withWebResolvers(config, projectRoot);\n}\n"],"names":["withWebResolvers","shouldAliasAssetRegistryForWeb","withMetroMultiPlatformAsync","withWebPolyfills","config","originalGetPolyfills","serializer","getPolyfills","bind","ctx","platform","normalizeSlashes","p","replace","projectRoot","assetRegistryPath","fs","realpathSync","path","resolve","resolveFrom","importMetroResolverFromProject","extraNodeModules","web","require","aliases","preferredMainFields","withMetroResolvers","immutableContext","moduleName","context","mainFields","env","EXPO_METRO_NO_MAIN_FIELD_OVERRIDE","result","preferNativePlatform","resolveRequest","undefined","getPackageMainPath","packageJsonPath","package_","moduleCache","getPackage","getMain","filePath","type","endsWith","platformBundlers","process","EXPO_ROUTER_APP_ROOT","getAppRouterRelativeEntryPath","EXPO_PROJECT_ROOT","WebSupportProjectPrerequisite","assertAsync","withMetroMultiPlatform","expoConfigPlatforms","Object","entries","filter","bundler","map","Array","isArray","resolver","platforms","Set","concat"],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ exports.getDefaultMetroResolver = getDefaultMetroResolver;
6
+ exports.withMetroResolvers = withMetroResolvers;
7
+ var _metroErrors = require("./metroErrors");
8
+ var _resolveFromProject = require("./resolveFromProject");
9
+ const debug = require("debug")("expo:metro:withMetroResolvers");
10
+ function getDefaultMetroResolver(projectRoot) {
11
+ const { resolve } = (0, _resolveFromProject).importMetroResolverFromProject(projectRoot);
12
+ return (context, moduleName, platform)=>{
13
+ return resolve(context, moduleName, platform);
14
+ };
15
+ }
16
+ function withMetroResolvers(config, projectRoot, resolvers) {
17
+ debug(`Appending ${resolvers.length} custom resolvers to Metro config. (has custom resolver: ${!!config.resolver.resolveRequest})`);
18
+ const originalResolveRequest = config.resolver.resolveRequest || getDefaultMetroResolver(projectRoot);
19
+ return {
20
+ ...config,
21
+ resolver: {
22
+ ...config.resolver,
23
+ resolveRequest (...args) {
24
+ for (const resolver of resolvers){
25
+ try {
26
+ const resolution = resolver(...args);
27
+ if (resolution) {
28
+ return resolution;
29
+ }
30
+ } catch (error) {
31
+ // If the error is directly related to a resolver not being able to resolve a module, then
32
+ // we can ignore the error and try the next resolver. Otherwise, we should throw the error.
33
+ const isResolutionError = (0, _metroErrors).isFailedToResolveNameError(error) || (0, _metroErrors).isFailedToResolvePathError(error);
34
+ if (!isResolutionError) {
35
+ throw error;
36
+ }
37
+ debug(`Custom resolver threw: ${error.constructor.name}. (module: ${args[1]}, platform: ${args[2]})`);
38
+ }
39
+ }
40
+ // If we haven't returned by now, use the original resolver or upstream resolver.
41
+ return originalResolveRequest(...args);
42
+ }
43
+ }
44
+ };
45
+ }
46
+
47
+ //# sourceMappingURL=withMetroResolvers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/start/server/metro/withMetroResolvers.ts"],"sourcesContent":["/**\n * Copyright © 2022 650 Industries.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { ConfigT as MetroConfig } from 'metro-config';\nimport { ResolutionContext } from 'metro-resolver';\n\nimport { isFailedToResolveNameError, isFailedToResolvePathError } from './metroErrors';\nimport { importMetroResolverFromProject } from './resolveFromProject';\n\nconst debug = require('debug')('expo:metro:withMetroResolvers') as typeof console.log;\n\nexport type MetroResolver = NonNullable<MetroConfig['resolver']['resolveRequest']>;\n\n/** Expo Metro Resolvers can return `null` to skip without throwing an error. Metro Resolvers will throw either a `FailedToResolveNameError` or `FailedToResolvePathError`. */\nexport type ExpoCustomMetroResolver = (\n ...args: Parameters<MetroResolver>\n) => ReturnType<MetroResolver> | null;\n\n/** @returns `MetroResolver` utilizing the upstream `resolve` method. */\nexport function getDefaultMetroResolver(projectRoot: string): MetroResolver {\n const { resolve } = importMetroResolverFromProject(projectRoot);\n return (context: ResolutionContext, moduleName: string, platform: string | null) => {\n return resolve(context, moduleName, platform);\n };\n}\n\n/**\n * Extend the Metro config `resolver.resolveRequest` method with additional resolvers that can\n * exit early by returning a `Resolution` or skip to the next resolver by returning `null`.\n *\n * @param config Metro config.\n * @param projectRoot path to the project root used to resolve the default Metro resolver.\n * @param resolvers custom MetroResolver to chain.\n * @returns a new `MetroConfig` with the `resolver.resolveRequest` method chained.\n */\nexport function withMetroResolvers(\n config: MetroConfig,\n projectRoot: string,\n resolvers: ExpoCustomMetroResolver[]\n): MetroConfig {\n debug(\n `Appending ${\n resolvers.length\n } custom resolvers to Metro config. (has custom resolver: ${!!config.resolver.resolveRequest})`\n );\n const originalResolveRequest =\n config.resolver.resolveRequest || getDefaultMetroResolver(projectRoot);\n\n return {\n ...config,\n resolver: {\n ...config.resolver,\n resolveRequest(...args: Parameters<MetroResolver>) {\n for (const resolver of resolvers) {\n try {\n const resolution = resolver(...args);\n if (resolution) {\n return resolution;\n }\n } catch (error: any) {\n // If the error is directly related to a resolver not being able to resolve a module, then\n // we can ignore the error and try the next resolver. Otherwise, we should throw the error.\n const isResolutionError =\n isFailedToResolveNameError(error) || isFailedToResolvePathError(error);\n if (!isResolutionError) {\n throw error;\n }\n debug(\n `Custom resolver threw: ${error.constructor.name}. (module: ${args[1]}, platform: ${args[2]})`\n );\n }\n }\n // If we haven't returned by now, use the original resolver or upstream resolver.\n return originalResolveRequest(...args);\n },\n },\n };\n}\n"],"names":["getDefaultMetroResolver","withMetroResolvers","debug","require","projectRoot","resolve","importMetroResolverFromProject","context","moduleName","platform","config","resolvers","length","resolver","resolveRequest","originalResolveRequest","args","resolution","error","isResolutionError","isFailedToResolveNameError","isFailedToResolvePathError","constructor","name"],"mappings":"AAMA;;;;QAgBgBA,uBAAuB,GAAvBA,uBAAuB;QAgBvBC,kBAAkB,GAAlBA,kBAAkB;AA7BqC,IAAA,YAAe,WAAf,eAAe,CAAA;AACvC,IAAA,mBAAsB,WAAtB,sBAAsB,CAAA;AAErE,MAAMC,KAAK,GAAGC,OAAO,CAAC,OAAO,CAAC,CAAC,+BAA+B,CAAC,AAAsB,AAAC;AAU/E,SAASH,uBAAuB,CAACI,WAAmB,EAAiB;IAC1E,MAAM,EAAEC,OAAO,CAAA,EAAE,GAAGC,CAAAA,GAAAA,mBAA8B,AAAa,CAAA,+BAAb,CAACF,WAAW,CAAC,AAAC;IAChE,OAAO,CAACG,OAA0B,EAAEC,UAAkB,EAAEC,QAAuB,GAAK;QAClF,OAAOJ,OAAO,CAACE,OAAO,EAAEC,UAAU,EAAEC,QAAQ,CAAC,CAAC;KAC/C,CAAC;CACH;AAWM,SAASR,kBAAkB,CAChCS,MAAmB,EACnBN,WAAmB,EACnBO,SAAoC,EACvB;IACbT,KAAK,CACH,CAAC,UAAU,EACTS,SAAS,CAACC,MAAM,CACjB,yDAAyD,EAAE,CAAC,CAACF,MAAM,CAACG,QAAQ,CAACC,cAAc,CAAC,CAAC,CAAC,CAChG,CAAC;IACF,MAAMC,sBAAsB,GAC1BL,MAAM,CAACG,QAAQ,CAACC,cAAc,IAAId,uBAAuB,CAACI,WAAW,CAAC,AAAC;IAEzE,OAAO;QACL,GAAGM,MAAM;QACTG,QAAQ,EAAE;YACR,GAAGH,MAAM,CAACG,QAAQ;YAClBC,cAAc,EAAC,GAAGE,IAAI,AAA2B,EAAE;gBACjD,KAAK,MAAMH,QAAQ,IAAIF,SAAS,CAAE;oBAChC,IAAI;wBACF,MAAMM,UAAU,GAAGJ,QAAQ,IAAIG,IAAI,CAAC,AAAC;wBACrC,IAAIC,UAAU,EAAE;4BACd,OAAOA,UAAU,CAAC;yBACnB;qBACF,CAAC,OAAOC,KAAK,EAAO;wBACnB,0FAA0F;wBAC1F,2FAA2F;wBAC3F,MAAMC,iBAAiB,GACrBC,CAAAA,GAAAA,YAA0B,AAAO,CAAA,2BAAP,CAACF,KAAK,CAAC,IAAIG,CAAAA,GAAAA,YAA0B,AAAO,CAAA,2BAAP,CAACH,KAAK,CAAC,AAAC;wBACzE,IAAI,CAACC,iBAAiB,EAAE;4BACtB,MAAMD,KAAK,CAAC;yBACb;wBACDhB,KAAK,CACH,CAAC,uBAAuB,EAAEgB,KAAK,CAACI,WAAW,CAACC,IAAI,CAAC,WAAW,EAAEP,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,EAAEA,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAC/F,CAAC;qBACH;iBACF;gBACD,iFAAiF;gBACjF,OAAOD,sBAAsB,IAAIC,IAAI,CAAC,CAAC;aACxC;SACF;KACF,CAAC;CACH"}
@@ -63,7 +63,7 @@ class ClassicManifestMiddleware extends _manifestMiddleware.ManifestMiddleware {
63
63
  // Gather packager and host info
64
64
  const hostInfo = await createHostInfoAsync();
65
65
  const headers = new Map();
66
- headers.set("Exponent-Server", hostInfo);
66
+ headers.set("Exponent-Server", JSON.stringify(hostInfo));
67
67
  // Create the final string
68
68
  const body = await this._fetchComputedManifestStringAsync({
69
69
  manifest,
@@ -130,7 +130,7 @@ async function createHostInfoAsync() {
130
130
  host: await _userSettings.default.getAnonymousIdentifierAsync(),
131
131
  server: "expo",
132
132
  // Defined in the build step
133
- serverVersion: "0.4.11",
133
+ serverVersion: "0.5.1",
134
134
  serverDriver: _manifestMiddleware.DEVELOPER_TOOL,
135
135
  serverOS: _os.default.platform(),
136
136
  serverOSVersion: _os.default.release()
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/server/middleware/ClassicManifestMiddleware.ts"],"sourcesContent":["import { ExpoAppManifest, ExpoConfig } from '@expo/config';\nimport chalk from 'chalk';\nimport os from 'os';\n\nimport { APISettings } from '../../../api/settings';\nimport { signClassicExpoGoManifestAsync } from '../../../api/signManifest';\nimport UserSettings from '../../../api/user/UserSettings';\nimport { ANONYMOUS_USERNAME, getUserAsync } from '../../../api/user/user';\nimport * as Log from '../../../log';\nimport { logEventAsync } from '../../../utils/analytics/rudderstackClient';\nimport { memoize } from '../../../utils/fn';\nimport { learnMore } from '../../../utils/link';\nimport { stripPort } from '../../../utils/url';\nimport {\n DEVELOPER_TOOL,\n HostInfo,\n ManifestMiddleware,\n ManifestRequestInfo,\n} from './ManifestMiddleware';\nimport { assertRuntimePlatform, parsePlatformHeader } from './resolvePlatform';\nimport { ServerHeaders, ServerRequest } from './server.types';\n\ntype SignManifestProps = {\n manifest: ExpoAppManifest;\n hostId: string;\n acceptSignature: boolean;\n};\n\ninterface ClassicManifestRequestInfo extends ManifestRequestInfo {}\n\nconst debug = require('debug')(\n 'expo:start:server:middleware:ClassicManifestMiddleware'\n) as typeof console.log;\n\nexport class ClassicManifestMiddleware extends ManifestMiddleware<ClassicManifestRequestInfo> {\n public getParsedHeaders(req: ServerRequest): ClassicManifestRequestInfo {\n const platform = parsePlatformHeader(req) || 'ios';\n assertRuntimePlatform(platform);\n return {\n platform,\n acceptSignature: Boolean(req.headers['exponent-accept-signature']),\n hostname: stripPort(req.headers['host']),\n };\n }\n\n public async _getManifestResponseAsync({\n acceptSignature,\n ...requestOptions\n }: ClassicManifestRequestInfo): Promise<{\n body: string;\n version: string;\n headers: ServerHeaders;\n }> {\n const { exp, hostUri, expoGoConfig, bundleUrl } = await this._resolveProjectSettingsAsync(\n requestOptions\n );\n\n const manifest: ExpoAppManifest = {\n ...(exp as ExpoAppManifest),\n ...expoGoConfig,\n hostUri,\n bundleUrl,\n };\n\n // Gather packager and host info\n const hostInfo = await createHostInfoAsync();\n\n const headers = new Map<string, any>();\n headers.set('Exponent-Server', hostInfo);\n\n // Create the final string\n const body = await this._fetchComputedManifestStringAsync({\n manifest,\n hostId: hostInfo.host,\n acceptSignature,\n });\n\n return {\n body,\n version: manifest.sdkVersion,\n headers,\n };\n }\n\n protected trackManifest(version?: string) {\n // Log analytics\n logEventAsync('Serve Manifest', {\n sdkVersion: version ?? null,\n });\n }\n\n /** Exposed for testing. */\n async _getManifestStringAsync({\n manifest,\n hostId,\n acceptSignature,\n }: SignManifestProps): Promise<string> {\n const currentSession = await getUserAsync();\n if (!currentSession || APISettings.isOffline) {\n manifest.id = `@${ANONYMOUS_USERNAME}/${manifest.slug}-${hostId}`;\n }\n if (!acceptSignature) {\n return JSON.stringify(manifest);\n } else if (!currentSession || APISettings.isOffline) {\n return getUnsignedManifestString(manifest);\n } else {\n return this.getSignedManifestStringAsync(manifest);\n }\n }\n\n private getSignedManifestStringAsync = memoize(signClassicExpoGoManifestAsync);\n\n /** Exposed for testing. */\n async _fetchComputedManifestStringAsync(props: SignManifestProps): Promise<string> {\n try {\n return await this._getManifestStringAsync(props);\n } catch (error: any) {\n debug(`Error getting manifest:`, error);\n if (error.code === 'UNAUTHORIZED' && props.manifest.owner) {\n // Don't have permissions for siging, warn and enable offline mode.\n this.addSigningDisabledWarning(\n `This project belongs to ${chalk.bold(\n `@${props.manifest.owner}`\n )} and you have not been granted the appropriate permissions.\\n` +\n `Please request access from an admin of @${props.manifest.owner} or change the \"owner\" field to an account you belong to.\\n` +\n learnMore('https://docs.expo.dev/versions/latest/config/app/#owner')\n );\n APISettings.isOffline = true;\n return await this._getManifestStringAsync(props);\n } else if (error.code === 'ENOTFOUND') {\n // Got a DNS error, i.e. can't access exp.host, warn and enable offline mode.\n this.addSigningDisabledWarning(\n `Could not reach Expo servers, please check if you can access ${\n error.hostname || 'exp.host'\n }.`\n );\n APISettings.isOffline = true;\n return await this._getManifestStringAsync(props);\n } else {\n throw error;\n }\n }\n }\n\n private addSigningDisabledWarning = memoize((reason: string) => {\n Log.warn(`${reason}\\nFalling back to offline mode.`);\n // For the memo\n return reason;\n });\n}\n\n// Passed to Expo Go and registered as telemetry.\n// TODO: it's unclear why we don't just send it from the CLI.\nasync function createHostInfoAsync(): Promise<HostInfo> {\n return {\n host: await UserSettings.getAnonymousIdentifierAsync(),\n server: 'expo',\n // Defined in the build step\n serverVersion: process.env.__EXPO_VERSION!,\n serverDriver: DEVELOPER_TOOL,\n serverOS: os.platform(),\n serverOSVersion: os.release(),\n };\n}\n\nfunction getUnsignedManifestString(manifest: ExpoConfig) {\n const unsignedManifest = {\n manifestString: JSON.stringify(manifest),\n signature: 'UNSIGNED',\n };\n return JSON.stringify(unsignedManifest);\n}\n"],"names":["Log","debug","require","ClassicManifestMiddleware","ManifestMiddleware","getParsedHeaders","req","platform","parsePlatformHeader","assertRuntimePlatform","acceptSignature","Boolean","headers","hostname","stripPort","_getManifestResponseAsync","requestOptions","exp","hostUri","expoGoConfig","bundleUrl","_resolveProjectSettingsAsync","manifest","hostInfo","createHostInfoAsync","Map","set","body","_fetchComputedManifestStringAsync","hostId","host","version","sdkVersion","trackManifest","logEventAsync","_getManifestStringAsync","currentSession","getUserAsync","APISettings","isOffline","id","ANONYMOUS_USERNAME","slug","JSON","stringify","getUnsignedManifestString","getSignedManifestStringAsync","memoize","signClassicExpoGoManifestAsync","props","error","code","owner","addSigningDisabledWarning","chalk","bold","learnMore","reason","warn","UserSettings","getAnonymousIdentifierAsync","server","serverVersion","process","env","__EXPO_VERSION","serverDriver","DEVELOPER_TOOL","serverOS","os","serverOSVersion","release","unsignedManifest","manifestString","signature"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../src/start/server/middleware/ClassicManifestMiddleware.ts"],"sourcesContent":["import { ExpoAppManifest, ExpoConfig } from '@expo/config';\nimport chalk from 'chalk';\nimport os from 'os';\n\nimport { APISettings } from '../../../api/settings';\nimport { signClassicExpoGoManifestAsync } from '../../../api/signManifest';\nimport UserSettings from '../../../api/user/UserSettings';\nimport { ANONYMOUS_USERNAME, getUserAsync } from '../../../api/user/user';\nimport * as Log from '../../../log';\nimport { logEventAsync } from '../../../utils/analytics/rudderstackClient';\nimport { memoize } from '../../../utils/fn';\nimport { learnMore } from '../../../utils/link';\nimport { stripPort } from '../../../utils/url';\nimport {\n DEVELOPER_TOOL,\n HostInfo,\n ManifestMiddleware,\n ManifestRequestInfo,\n} from './ManifestMiddleware';\nimport { assertRuntimePlatform, parsePlatformHeader } from './resolvePlatform';\nimport { ServerHeaders, ServerRequest } from './server.types';\n\ntype SignManifestProps = {\n manifest: ExpoAppManifest;\n hostId: string;\n acceptSignature: boolean;\n};\n\ninterface ClassicManifestRequestInfo extends ManifestRequestInfo {}\n\nconst debug = require('debug')(\n 'expo:start:server:middleware:ClassicManifestMiddleware'\n) as typeof console.log;\n\nexport class ClassicManifestMiddleware extends ManifestMiddleware<ClassicManifestRequestInfo> {\n public getParsedHeaders(req: ServerRequest): ClassicManifestRequestInfo {\n const platform = parsePlatformHeader(req) || 'ios';\n assertRuntimePlatform(platform);\n return {\n platform,\n acceptSignature: Boolean(req.headers['exponent-accept-signature']),\n hostname: stripPort(req.headers['host']),\n };\n }\n\n public async _getManifestResponseAsync({\n acceptSignature,\n ...requestOptions\n }: ClassicManifestRequestInfo): Promise<{\n body: string;\n version: string;\n headers: ServerHeaders;\n }> {\n const { exp, hostUri, expoGoConfig, bundleUrl } = await this._resolveProjectSettingsAsync(\n requestOptions\n );\n\n const manifest: ExpoAppManifest = {\n ...(exp as ExpoAppManifest),\n ...expoGoConfig,\n hostUri,\n bundleUrl,\n };\n\n // Gather packager and host info\n const hostInfo = await createHostInfoAsync();\n\n const headers = new Map<string, any>();\n headers.set('Exponent-Server', JSON.stringify(hostInfo));\n\n // Create the final string\n const body = await this._fetchComputedManifestStringAsync({\n manifest,\n hostId: hostInfo.host,\n acceptSignature,\n });\n\n return {\n body,\n version: manifest.sdkVersion,\n headers,\n };\n }\n\n protected trackManifest(version?: string) {\n // Log analytics\n logEventAsync('Serve Manifest', {\n sdkVersion: version ?? null,\n });\n }\n\n /** Exposed for testing. */\n async _getManifestStringAsync({\n manifest,\n hostId,\n acceptSignature,\n }: SignManifestProps): Promise<string> {\n const currentSession = await getUserAsync();\n if (!currentSession || APISettings.isOffline) {\n manifest.id = `@${ANONYMOUS_USERNAME}/${manifest.slug}-${hostId}`;\n }\n if (!acceptSignature) {\n return JSON.stringify(manifest);\n } else if (!currentSession || APISettings.isOffline) {\n return getUnsignedManifestString(manifest);\n } else {\n return this.getSignedManifestStringAsync(manifest);\n }\n }\n\n private getSignedManifestStringAsync = memoize(signClassicExpoGoManifestAsync);\n\n /** Exposed for testing. */\n async _fetchComputedManifestStringAsync(props: SignManifestProps): Promise<string> {\n try {\n return await this._getManifestStringAsync(props);\n } catch (error: any) {\n debug(`Error getting manifest:`, error);\n if (error.code === 'UNAUTHORIZED' && props.manifest.owner) {\n // Don't have permissions for siging, warn and enable offline mode.\n this.addSigningDisabledWarning(\n `This project belongs to ${chalk.bold(\n `@${props.manifest.owner}`\n )} and you have not been granted the appropriate permissions.\\n` +\n `Please request access from an admin of @${props.manifest.owner} or change the \"owner\" field to an account you belong to.\\n` +\n learnMore('https://docs.expo.dev/versions/latest/config/app/#owner')\n );\n APISettings.isOffline = true;\n return await this._getManifestStringAsync(props);\n } else if (error.code === 'ENOTFOUND') {\n // Got a DNS error, i.e. can't access exp.host, warn and enable offline mode.\n this.addSigningDisabledWarning(\n `Could not reach Expo servers, please check if you can access ${\n error.hostname || 'exp.host'\n }.`\n );\n APISettings.isOffline = true;\n return await this._getManifestStringAsync(props);\n } else {\n throw error;\n }\n }\n }\n\n private addSigningDisabledWarning = memoize((reason: string) => {\n Log.warn(`${reason}\\nFalling back to offline mode.`);\n // For the memo\n return reason;\n });\n}\n\n// Passed to Expo Go and registered as telemetry.\n// TODO: it's unclear why we don't just send it from the CLI.\nasync function createHostInfoAsync(): Promise<HostInfo> {\n return {\n host: await UserSettings.getAnonymousIdentifierAsync(),\n server: 'expo',\n // Defined in the build step\n serverVersion: process.env.__EXPO_VERSION!,\n serverDriver: DEVELOPER_TOOL,\n serverOS: os.platform(),\n serverOSVersion: os.release(),\n };\n}\n\nfunction getUnsignedManifestString(manifest: ExpoConfig) {\n const unsignedManifest = {\n manifestString: JSON.stringify(manifest),\n signature: 'UNSIGNED',\n };\n return JSON.stringify(unsignedManifest);\n}\n"],"names":["Log","debug","require","ClassicManifestMiddleware","ManifestMiddleware","getParsedHeaders","req","platform","parsePlatformHeader","assertRuntimePlatform","acceptSignature","Boolean","headers","hostname","stripPort","_getManifestResponseAsync","requestOptions","exp","hostUri","expoGoConfig","bundleUrl","_resolveProjectSettingsAsync","manifest","hostInfo","createHostInfoAsync","Map","set","JSON","stringify","body","_fetchComputedManifestStringAsync","hostId","host","version","sdkVersion","trackManifest","logEventAsync","_getManifestStringAsync","currentSession","getUserAsync","APISettings","isOffline","id","ANONYMOUS_USERNAME","slug","getUnsignedManifestString","getSignedManifestStringAsync","memoize","signClassicExpoGoManifestAsync","props","error","code","owner","addSigningDisabledWarning","chalk","bold","learnMore","reason","warn","UserSettings","getAnonymousIdentifierAsync","server","serverVersion","process","env","__EXPO_VERSION","serverDriver","DEVELOPER_TOOL","serverOS","os","serverOSVersion","release","unsignedManifest","manifestString","signature"],"mappings":"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"}
@@ -5,9 +5,9 @@ Object.defineProperty(exports, "__esModule", {
5
5
  var _configPlugins = require("@expo/config-plugins");
6
6
  var _accepts = _interopRequireDefault(require("accepts"));
7
7
  var _assert = _interopRequireDefault(require("assert"));
8
+ var _crypto = _interopRequireDefault(require("crypto"));
8
9
  var _formData = _interopRequireDefault(require("form-data"));
9
10
  var _structuredHeaders = require("structured-headers");
10
- var _uuid = require("uuid");
11
11
  var _getProject = require("../../../api/getProject");
12
12
  var _settings = require("../../../api/settings");
13
13
  var _signManifest = require("../../../api/signManifest");
@@ -82,7 +82,7 @@ class ExpoGoManifestHandlerMiddleware extends _manifestMiddleware.ManifestMiddle
82
82
  }
83
83
  const scopeKey = shouldUseAnonymousManifest ? `@${_user.ANONYMOUS_USERNAME}/${exp.slug}-${userAnonymousIdentifier}` : await this.getScopeKeyForProjectIdAsync(easProjectId);
84
84
  const expoUpdatesManifest = {
85
- id: (0, _uuid).v4(),
85
+ id: _crypto.default.randomUUID(),
86
86
  createdAt: new Date().toISOString(),
87
87
  runtimeVersion,
88
88
  launchAsset: {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/server/middleware/ExpoGoManifestHandlerMiddleware.ts"],"sourcesContent":["import { ExpoUpdatesManifest } from '@expo/config';\nimport { Updates } from '@expo/config-plugins';\nimport accepts from 'accepts';\nimport assert from 'assert';\nimport FormData from 'form-data';\nimport { serializeDictionary, Dictionary } from 'structured-headers';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { getProjectAsync } from '../../../api/getProject';\nimport { APISettings } from '../../../api/settings';\nimport { signExpoGoManifestAsync } from '../../../api/signManifest';\nimport UserSettings from '../../../api/user/UserSettings';\nimport { ANONYMOUS_USERNAME, getUserAsync } from '../../../api/user/user';\nimport { logEventAsync } from '../../../utils/analytics/rudderstackClient';\nimport {\n CodeSigningInfo,\n getCodeSigningInfoAsync,\n signManifestString,\n} from '../../../utils/codesigning';\nimport { CommandError } from '../../../utils/errors';\nimport { memoize } from '../../../utils/fn';\nimport { stripPort } from '../../../utils/url';\nimport { ManifestMiddleware, ManifestRequestInfo } from './ManifestMiddleware';\nimport { assertRuntimePlatform, parsePlatformHeader } from './resolvePlatform';\nimport { ServerHeaders, ServerRequest } from './server.types';\n\nconst debug = require('debug')('expo:start:server:middleware:ExpoGoManifestHandlerMiddleware');\n\ninterface ExpoGoManifestRequestInfo extends ManifestRequestInfo {\n explicitlyPrefersMultipartMixed: boolean;\n expectSignature: string | null;\n}\n\nexport class ExpoGoManifestHandlerMiddleware extends ManifestMiddleware<ExpoGoManifestRequestInfo> {\n public getParsedHeaders(req: ServerRequest): ExpoGoManifestRequestInfo {\n let platform = parsePlatformHeader(req);\n\n if (!platform) {\n debug(\n `No \"expo-platform\" header or \"platform\" query parameter specified. Falling back to \"none\".`\n );\n platform = 'none';\n }\n\n assertRuntimePlatform(platform);\n\n // Expo Updates clients explicitly accept \"multipart/mixed\" responses while browsers implicitly\n // accept them with \"accept: */*\". To make it easier to debug manifest responses by visiting their\n // URLs in a browser, we denote the response as \"text/plain\" if the user agent appears not to be\n // an Expo Updates client.\n const accept = accepts(req);\n const explicitlyPrefersMultipartMixed =\n accept.types(['unknown/unknown', 'multipart/mixed']) === 'multipart/mixed';\n\n const expectSignature = req.headers['expo-expect-signature'];\n\n return {\n explicitlyPrefersMultipartMixed,\n platform,\n acceptSignature: !!req.headers['expo-accept-signature'],\n expectSignature: expectSignature ? String(expectSignature) : null,\n hostname: stripPort(req.headers['host']),\n };\n }\n\n private getDefaultResponseHeaders(): ServerHeaders {\n const headers = new Map<string, number | string | readonly string[]>();\n // set required headers for Expo Updates manifest specification\n headers.set('expo-protocol-version', 0);\n headers.set('expo-sfv-version', 0);\n headers.set('cache-control', 'private, max-age=0');\n return headers;\n }\n\n public async _getManifestResponseAsync(requestOptions: ExpoGoManifestRequestInfo): Promise<{\n body: string;\n version: string;\n headers: ServerHeaders;\n }> {\n const { exp, hostUri, expoGoConfig, bundleUrl } = await this._resolveProjectSettingsAsync(\n requestOptions\n );\n\n const runtimeVersion = Updates.getRuntimeVersion(\n { ...exp, runtimeVersion: exp.runtimeVersion ?? { policy: 'sdkVersion' } },\n requestOptions.platform\n );\n if (!runtimeVersion) {\n throw new CommandError(\n 'MANIFEST_MIDDLEWARE',\n `Unable to determine runtime version for platform '${requestOptions.platform}'`\n );\n }\n\n const codeSigningInfo = await getCodeSigningInfoAsync(\n exp,\n requestOptions.expectSignature,\n this.options.privateKeyPath\n );\n\n const easProjectId = exp.extra?.eas?.projectId;\n const shouldUseAnonymousManifest = await shouldUseAnonymousManifestAsync(\n easProjectId,\n codeSigningInfo\n );\n const userAnonymousIdentifier = await UserSettings.getAnonymousIdentifierAsync();\n if (!shouldUseAnonymousManifest) {\n assert(easProjectId);\n }\n const scopeKey = shouldUseAnonymousManifest\n ? `@${ANONYMOUS_USERNAME}/${exp.slug}-${userAnonymousIdentifier}`\n : await this.getScopeKeyForProjectIdAsync(easProjectId);\n\n const expoUpdatesManifest: ExpoUpdatesManifest = {\n id: uuidv4(),\n createdAt: new Date().toISOString(),\n runtimeVersion,\n launchAsset: {\n key: 'bundle',\n contentType: 'application/javascript',\n url: bundleUrl,\n },\n assets: [], // assets are not used in development\n metadata: {}, // required for the client to detect that this is an expo-updates manifest\n extra: {\n eas: {\n projectId: easProjectId ?? undefined,\n },\n expoClient: {\n ...exp,\n hostUri,\n },\n expoGo: expoGoConfig,\n scopeKey,\n },\n };\n\n const headers = this.getDefaultResponseHeaders();\n if (requestOptions.acceptSignature && !shouldUseAnonymousManifest) {\n const manifestSignature = await this.getSignedManifestStringAsync(expoUpdatesManifest);\n headers.set('expo-manifest-signature', manifestSignature);\n }\n\n const stringifiedManifest = JSON.stringify(expoUpdatesManifest);\n\n let manifestPartHeaders: { 'expo-signature': string } | null = null;\n let certificateChainBody: string | null = null;\n if (codeSigningInfo) {\n const signature = signManifestString(stringifiedManifest, codeSigningInfo);\n manifestPartHeaders = {\n 'expo-signature': serializeDictionary(\n convertToDictionaryItemsRepresentation({\n keyid: codeSigningInfo.keyId,\n sig: signature,\n alg: 'rsa-v1_5-sha256',\n })\n ),\n };\n certificateChainBody = codeSigningInfo.certificateChainForResponse.join('\\n');\n }\n\n const form = this.getFormData({\n stringifiedManifest,\n manifestPartHeaders,\n certificateChainBody,\n });\n\n headers.set(\n 'content-type',\n requestOptions.explicitlyPrefersMultipartMixed\n ? `multipart/mixed; boundary=${form.getBoundary()}`\n : 'text/plain'\n );\n\n return {\n body: form.getBuffer().toString(),\n version: runtimeVersion,\n headers,\n };\n }\n\n private getFormData({\n stringifiedManifest,\n manifestPartHeaders,\n certificateChainBody,\n }: {\n stringifiedManifest: string;\n manifestPartHeaders: { 'expo-signature': string } | null;\n certificateChainBody: string | null;\n }): FormData {\n const form = new FormData();\n form.append('manifest', stringifiedManifest, {\n contentType: 'application/json',\n header: {\n ...manifestPartHeaders,\n },\n });\n if (certificateChainBody && certificateChainBody.length > 0) {\n form.append('certificate_chain', certificateChainBody, {\n contentType: 'application/x-pem-file',\n });\n }\n return form;\n }\n\n protected trackManifest(version?: string) {\n logEventAsync('Serve Expo Updates Manifest', {\n runtimeVersion: version,\n });\n }\n\n private getSignedManifestStringAsync = memoize(signExpoGoManifestAsync);\n\n private getScopeKeyForProjectIdAsync = memoize(getScopeKeyForProjectIdAsync);\n}\n\n/**\n * 1. No EAS project ID in config, then use anonymous scope key\n * 2. When offline or not logged in\n * a. If code signing not accepted by client (only legacy manifest signing is supported), then use anonymous scope key\n * b. If code signing accepted by client and no development code signing certificate is cached, then use anonymous scope key\n */\nasync function shouldUseAnonymousManifestAsync(\n easProjectId: string | undefined | null,\n codeSigningInfo: CodeSigningInfo | null\n): Promise<boolean> {\n if (!easProjectId || (APISettings.isOffline && codeSigningInfo === null)) {\n return true;\n }\n\n return !(await getUserAsync());\n}\n\nasync function getScopeKeyForProjectIdAsync(projectId: string): Promise<string> {\n const project = await getProjectAsync(projectId);\n return project.scopeKey;\n}\n\nfunction convertToDictionaryItemsRepresentation(obj: { [key: string]: string }): Dictionary {\n return new Map(\n Object.entries(obj).map(([k, v]) => {\n return [k, [v, new Map()]];\n })\n );\n}\n"],"names":["debug","require","ExpoGoManifestHandlerMiddleware","ManifestMiddleware","getParsedHeaders","req","platform","parsePlatformHeader","assertRuntimePlatform","accept","accepts","explicitlyPrefersMultipartMixed","types","expectSignature","headers","acceptSignature","String","hostname","stripPort","getDefaultResponseHeaders","Map","set","_getManifestResponseAsync","requestOptions","exp","hostUri","expoGoConfig","bundleUrl","_resolveProjectSettingsAsync","runtimeVersion","Updates","getRuntimeVersion","policy","CommandError","codeSigningInfo","getCodeSigningInfoAsync","options","privateKeyPath","easProjectId","extra","eas","projectId","shouldUseAnonymousManifest","shouldUseAnonymousManifestAsync","userAnonymousIdentifier","UserSettings","getAnonymousIdentifierAsync","assert","scopeKey","ANONYMOUS_USERNAME","slug","getScopeKeyForProjectIdAsync","expoUpdatesManifest","id","uuidv4","createdAt","Date","toISOString","launchAsset","key","contentType","url","assets","metadata","undefined","expoClient","expoGo","manifestSignature","getSignedManifestStringAsync","stringifiedManifest","JSON","stringify","manifestPartHeaders","certificateChainBody","signature","signManifestString","serializeDictionary","convertToDictionaryItemsRepresentation","keyid","keyId","sig","alg","certificateChainForResponse","join","form","getFormData","getBoundary","body","getBuffer","toString","version","FormData","append","header","length","trackManifest","logEventAsync","memoize","signExpoGoManifestAsync","APISettings","isOffline","getUserAsync","project","getProjectAsync","obj","Object","entries","map","k","v"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../src/start/server/middleware/ExpoGoManifestHandlerMiddleware.ts"],"sourcesContent":["import { ExpoUpdatesManifest } from '@expo/config';\nimport { Updates } from '@expo/config-plugins';\nimport accepts from 'accepts';\nimport assert from 'assert';\nimport crypto from 'crypto';\nimport FormData from 'form-data';\nimport { serializeDictionary, Dictionary } from 'structured-headers';\n\nimport { getProjectAsync } from '../../../api/getProject';\nimport { APISettings } from '../../../api/settings';\nimport { signExpoGoManifestAsync } from '../../../api/signManifest';\nimport UserSettings from '../../../api/user/UserSettings';\nimport { ANONYMOUS_USERNAME, getUserAsync } from '../../../api/user/user';\nimport { logEventAsync } from '../../../utils/analytics/rudderstackClient';\nimport {\n CodeSigningInfo,\n getCodeSigningInfoAsync,\n signManifestString,\n} from '../../../utils/codesigning';\nimport { CommandError } from '../../../utils/errors';\nimport { memoize } from '../../../utils/fn';\nimport { stripPort } from '../../../utils/url';\nimport { ManifestMiddleware, ManifestRequestInfo } from './ManifestMiddleware';\nimport { assertRuntimePlatform, parsePlatformHeader } from './resolvePlatform';\nimport { ServerHeaders, ServerRequest } from './server.types';\n\nconst debug = require('debug')('expo:start:server:middleware:ExpoGoManifestHandlerMiddleware');\n\ninterface ExpoGoManifestRequestInfo extends ManifestRequestInfo {\n explicitlyPrefersMultipartMixed: boolean;\n expectSignature: string | null;\n}\n\nexport class ExpoGoManifestHandlerMiddleware extends ManifestMiddleware<ExpoGoManifestRequestInfo> {\n public getParsedHeaders(req: ServerRequest): ExpoGoManifestRequestInfo {\n let platform = parsePlatformHeader(req);\n\n if (!platform) {\n debug(\n `No \"expo-platform\" header or \"platform\" query parameter specified. Falling back to \"none\".`\n );\n platform = 'none';\n }\n\n assertRuntimePlatform(platform);\n\n // Expo Updates clients explicitly accept \"multipart/mixed\" responses while browsers implicitly\n // accept them with \"accept: */*\". To make it easier to debug manifest responses by visiting their\n // URLs in a browser, we denote the response as \"text/plain\" if the user agent appears not to be\n // an Expo Updates client.\n const accept = accepts(req);\n const explicitlyPrefersMultipartMixed =\n accept.types(['unknown/unknown', 'multipart/mixed']) === 'multipart/mixed';\n\n const expectSignature = req.headers['expo-expect-signature'];\n\n return {\n explicitlyPrefersMultipartMixed,\n platform,\n acceptSignature: !!req.headers['expo-accept-signature'],\n expectSignature: expectSignature ? String(expectSignature) : null,\n hostname: stripPort(req.headers['host']),\n };\n }\n\n private getDefaultResponseHeaders(): ServerHeaders {\n const headers = new Map<string, number | string | readonly string[]>();\n // set required headers for Expo Updates manifest specification\n headers.set('expo-protocol-version', 0);\n headers.set('expo-sfv-version', 0);\n headers.set('cache-control', 'private, max-age=0');\n return headers;\n }\n\n public async _getManifestResponseAsync(requestOptions: ExpoGoManifestRequestInfo): Promise<{\n body: string;\n version: string;\n headers: ServerHeaders;\n }> {\n const { exp, hostUri, expoGoConfig, bundleUrl } = await this._resolveProjectSettingsAsync(\n requestOptions\n );\n\n const runtimeVersion = Updates.getRuntimeVersion(\n { ...exp, runtimeVersion: exp.runtimeVersion ?? { policy: 'sdkVersion' } },\n requestOptions.platform\n );\n if (!runtimeVersion) {\n throw new CommandError(\n 'MANIFEST_MIDDLEWARE',\n `Unable to determine runtime version for platform '${requestOptions.platform}'`\n );\n }\n\n const codeSigningInfo = await getCodeSigningInfoAsync(\n exp,\n requestOptions.expectSignature,\n this.options.privateKeyPath\n );\n\n const easProjectId = exp.extra?.eas?.projectId;\n const shouldUseAnonymousManifest = await shouldUseAnonymousManifestAsync(\n easProjectId,\n codeSigningInfo\n );\n const userAnonymousIdentifier = await UserSettings.getAnonymousIdentifierAsync();\n if (!shouldUseAnonymousManifest) {\n assert(easProjectId);\n }\n const scopeKey = shouldUseAnonymousManifest\n ? `@${ANONYMOUS_USERNAME}/${exp.slug}-${userAnonymousIdentifier}`\n : await this.getScopeKeyForProjectIdAsync(easProjectId);\n\n const expoUpdatesManifest: ExpoUpdatesManifest = {\n id: crypto.randomUUID(),\n createdAt: new Date().toISOString(),\n runtimeVersion,\n launchAsset: {\n key: 'bundle',\n contentType: 'application/javascript',\n url: bundleUrl,\n },\n assets: [], // assets are not used in development\n metadata: {}, // required for the client to detect that this is an expo-updates manifest\n extra: {\n eas: {\n projectId: easProjectId ?? undefined,\n },\n expoClient: {\n ...exp,\n hostUri,\n },\n expoGo: expoGoConfig,\n scopeKey,\n },\n };\n\n const headers = this.getDefaultResponseHeaders();\n if (requestOptions.acceptSignature && !shouldUseAnonymousManifest) {\n const manifestSignature = await this.getSignedManifestStringAsync(expoUpdatesManifest);\n headers.set('expo-manifest-signature', manifestSignature);\n }\n\n const stringifiedManifest = JSON.stringify(expoUpdatesManifest);\n\n let manifestPartHeaders: { 'expo-signature': string } | null = null;\n let certificateChainBody: string | null = null;\n if (codeSigningInfo) {\n const signature = signManifestString(stringifiedManifest, codeSigningInfo);\n manifestPartHeaders = {\n 'expo-signature': serializeDictionary(\n convertToDictionaryItemsRepresentation({\n keyid: codeSigningInfo.keyId,\n sig: signature,\n alg: 'rsa-v1_5-sha256',\n })\n ),\n };\n certificateChainBody = codeSigningInfo.certificateChainForResponse.join('\\n');\n }\n\n const form = this.getFormData({\n stringifiedManifest,\n manifestPartHeaders,\n certificateChainBody,\n });\n\n headers.set(\n 'content-type',\n requestOptions.explicitlyPrefersMultipartMixed\n ? `multipart/mixed; boundary=${form.getBoundary()}`\n : 'text/plain'\n );\n\n return {\n body: form.getBuffer().toString(),\n version: runtimeVersion,\n headers,\n };\n }\n\n private getFormData({\n stringifiedManifest,\n manifestPartHeaders,\n certificateChainBody,\n }: {\n stringifiedManifest: string;\n manifestPartHeaders: { 'expo-signature': string } | null;\n certificateChainBody: string | null;\n }): FormData {\n const form = new FormData();\n form.append('manifest', stringifiedManifest, {\n contentType: 'application/json',\n header: {\n ...manifestPartHeaders,\n },\n });\n if (certificateChainBody && certificateChainBody.length > 0) {\n form.append('certificate_chain', certificateChainBody, {\n contentType: 'application/x-pem-file',\n });\n }\n return form;\n }\n\n protected trackManifest(version?: string) {\n logEventAsync('Serve Expo Updates Manifest', {\n runtimeVersion: version,\n });\n }\n\n private getSignedManifestStringAsync = memoize(signExpoGoManifestAsync);\n\n private getScopeKeyForProjectIdAsync = memoize(getScopeKeyForProjectIdAsync);\n}\n\n/**\n * 1. No EAS project ID in config, then use anonymous scope key\n * 2. When offline or not logged in\n * a. If code signing not accepted by client (only legacy manifest signing is supported), then use anonymous scope key\n * b. If code signing accepted by client and no development code signing certificate is cached, then use anonymous scope key\n */\nasync function shouldUseAnonymousManifestAsync(\n easProjectId: string | undefined | null,\n codeSigningInfo: CodeSigningInfo | null\n): Promise<boolean> {\n if (!easProjectId || (APISettings.isOffline && codeSigningInfo === null)) {\n return true;\n }\n\n return !(await getUserAsync());\n}\n\nasync function getScopeKeyForProjectIdAsync(projectId: string): Promise<string> {\n const project = await getProjectAsync(projectId);\n return project.scopeKey;\n}\n\nfunction convertToDictionaryItemsRepresentation(obj: { [key: string]: string }): Dictionary {\n return new Map(\n Object.entries(obj).map(([k, v]) => {\n return [k, [v, new Map()]];\n })\n );\n}\n"],"names":["debug","require","ExpoGoManifestHandlerMiddleware","ManifestMiddleware","getParsedHeaders","req","platform","parsePlatformHeader","assertRuntimePlatform","accept","accepts","explicitlyPrefersMultipartMixed","types","expectSignature","headers","acceptSignature","String","hostname","stripPort","getDefaultResponseHeaders","Map","set","_getManifestResponseAsync","requestOptions","exp","hostUri","expoGoConfig","bundleUrl","_resolveProjectSettingsAsync","runtimeVersion","Updates","getRuntimeVersion","policy","CommandError","codeSigningInfo","getCodeSigningInfoAsync","options","privateKeyPath","easProjectId","extra","eas","projectId","shouldUseAnonymousManifest","shouldUseAnonymousManifestAsync","userAnonymousIdentifier","UserSettings","getAnonymousIdentifierAsync","assert","scopeKey","ANONYMOUS_USERNAME","slug","getScopeKeyForProjectIdAsync","expoUpdatesManifest","id","crypto","randomUUID","createdAt","Date","toISOString","launchAsset","key","contentType","url","assets","metadata","undefined","expoClient","expoGo","manifestSignature","getSignedManifestStringAsync","stringifiedManifest","JSON","stringify","manifestPartHeaders","certificateChainBody","signature","signManifestString","serializeDictionary","convertToDictionaryItemsRepresentation","keyid","keyId","sig","alg","certificateChainForResponse","join","form","getFormData","getBoundary","body","getBuffer","toString","version","FormData","append","header","length","trackManifest","logEventAsync","memoize","signExpoGoManifestAsync","APISettings","isOffline","getUserAsync","project","getProjectAsync","obj","Object","entries","map","k","v"],"mappings":"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"}
@@ -2,7 +2,32 @@
2
2
  Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
5
+ exports.isInspectorProxyRequest = isInspectorProxyRequest;
5
6
  var _resolvePlatform = require("./resolvePlatform");
7
+ const debug = require("debug")("expo:start:server:metro:historyFallback");
8
+ const WS_DEVICE_URL = "/inspector/device";
9
+ const WS_DEBUGGER_URL = "/inspector/debug";
10
+ const PAGES_LIST_JSON_URL = "/json";
11
+ const PAGES_LIST_JSON_URL_2 = "/json/list";
12
+ const PAGES_LIST_JSON_VERSION_URL = "/json/version";
13
+ function isInspectorProxyRequest(req) {
14
+ const ua = req.headers["user-agent"];
15
+ const url = req.url;
16
+ // This check is very fragile but it enables websites to use any of the
17
+ // endpoints below without triggering the inspector proxy.
18
+ if (!url || ua && !ua.includes("node-fetch")) {
19
+ // This optimizes for the inspector working over the endpoint being available on web.
20
+ // Web is less fragile.
21
+ return false;
22
+ }
23
+ return [
24
+ WS_DEVICE_URL,
25
+ WS_DEBUGGER_URL,
26
+ PAGES_LIST_JSON_URL,
27
+ PAGES_LIST_JSON_URL_2,
28
+ PAGES_LIST_JSON_VERSION_URL,
29
+ ].includes(url);
30
+ }
6
31
  class HistoryFallbackMiddleware {
7
32
  constructor(indexMiddleware){
8
33
  this.indexMiddleware = indexMiddleware;
@@ -11,6 +36,10 @@ class HistoryFallbackMiddleware {
11
36
  return (req, res, next)=>{
12
37
  const platform = (0, _resolvePlatform).parsePlatformHeader(req);
13
38
  if (!platform || platform === "web") {
39
+ if (isInspectorProxyRequest(req)) {
40
+ debug("Inspector proxy request:", req.url, "UA:", req.headers["user-agent"]);
41
+ return next();
42
+ }
14
43
  // Redirect unknown to the manifest handler while preserving the path.
15
44
  // This implements the HTML5 history fallback API.
16
45
  return this.indexMiddleware(req, res, next);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/server/middleware/HistoryFallbackMiddleware.ts"],"sourcesContent":["import { parsePlatformHeader } from './resolvePlatform';\nimport { ServerNext, ServerRequest, ServerResponse } from './server.types';\n\n/**\n * Create a web-only middleware which redirects to the index middleware without losing the path component.\n * This is useful for things like React Navigation which need to render the index.html and then direct the user in-memory.\n */\nexport class HistoryFallbackMiddleware {\n constructor(\n private indexMiddleware: (\n req: ServerRequest,\n res: ServerResponse,\n next: ServerNext\n ) => Promise<void>\n ) {}\n getHandler() {\n return (req: ServerRequest, res: ServerResponse, next: any) => {\n const platform = parsePlatformHeader(req);\n\n if (!platform || platform === 'web') {\n // Redirect unknown to the manifest handler while preserving the path.\n // This implements the HTML5 history fallback API.\n return this.indexMiddleware(req, res, next);\n }\n\n return next();\n };\n }\n}\n"],"names":["HistoryFallbackMiddleware","constructor","indexMiddleware","getHandler","req","res","next","platform","parsePlatformHeader"],"mappings":"AAAA;;;;AAAoC,IAAA,gBAAmB,WAAnB,mBAAmB,CAAA;AAOhD,MAAMA,yBAAyB;IACpCC,YACUC,eAIU,CAClB;aALQA,eAIU,GAJVA,eAIU;KAChB;IACJC,UAAU,GAAG;QACX,OAAO,CAACC,GAAkB,EAAEC,GAAmB,EAAEC,IAAS,GAAK;YAC7D,MAAMC,QAAQ,GAAGC,CAAAA,GAAAA,gBAAmB,AAAK,CAAA,oBAAL,CAACJ,GAAG,CAAC,AAAC;YAE1C,IAAI,CAACG,QAAQ,IAAIA,QAAQ,KAAK,KAAK,EAAE;gBACnC,sEAAsE;gBACtE,kDAAkD;gBAClD,OAAO,IAAI,CAACL,eAAe,CAACE,GAAG,EAAEC,GAAG,EAAEC,IAAI,CAAC,CAAC;aAC7C;YAED,OAAOA,IAAI,EAAE,CAAC;SACf,CAAC;KACH;CACF;QArBYN,yBAAyB,GAAzBA,yBAAyB"}
1
+ {"version":3,"sources":["../../../../../src/start/server/middleware/HistoryFallbackMiddleware.ts"],"sourcesContent":["import { parsePlatformHeader } from './resolvePlatform';\nimport { ServerNext, ServerRequest, ServerResponse } from './server.types';\n\nconst debug = require('debug')('expo:start:server:metro:historyFallback') as typeof console.log;\n\nconst WS_DEVICE_URL = '/inspector/device';\nconst WS_DEBUGGER_URL = '/inspector/debug';\nconst PAGES_LIST_JSON_URL = '/json';\nconst PAGES_LIST_JSON_URL_2 = '/json/list';\nconst PAGES_LIST_JSON_VERSION_URL = '/json/version';\n\nexport function isInspectorProxyRequest(req: ServerRequest) {\n const ua = req.headers['user-agent'];\n const url = req.url;\n\n // This check is very fragile but it enables websites to use any of the\n // endpoints below without triggering the inspector proxy.\n if (!url || (ua && !ua.includes('node-fetch'))) {\n // This optimizes for the inspector working over the endpoint being available on web.\n // Web is less fragile.\n return false;\n }\n\n return [\n WS_DEVICE_URL,\n WS_DEBUGGER_URL,\n PAGES_LIST_JSON_URL,\n PAGES_LIST_JSON_URL_2,\n PAGES_LIST_JSON_VERSION_URL,\n ].includes(url);\n}\n\n/**\n * Create a web-only middleware which redirects to the index middleware without losing the path component.\n * This is useful for things like React Navigation which need to render the index.html and then direct the user in-memory.\n */\nexport class HistoryFallbackMiddleware {\n constructor(\n private indexMiddleware: (\n req: ServerRequest,\n res: ServerResponse,\n next: ServerNext\n ) => Promise<void>\n ) {}\n getHandler() {\n return (req: ServerRequest, res: ServerResponse, next: any) => {\n const platform = parsePlatformHeader(req);\n\n if (!platform || platform === 'web') {\n if (isInspectorProxyRequest(req)) {\n debug('Inspector proxy request:', req.url, 'UA:', req.headers['user-agent']);\n return next();\n }\n // Redirect unknown to the manifest handler while preserving the path.\n // This implements the HTML5 history fallback API.\n return this.indexMiddleware(req, res, next);\n }\n\n return next();\n };\n }\n}\n"],"names":["isInspectorProxyRequest","debug","require","WS_DEVICE_URL","WS_DEBUGGER_URL","PAGES_LIST_JSON_URL","PAGES_LIST_JSON_URL_2","PAGES_LIST_JSON_VERSION_URL","req","ua","headers","url","includes","HistoryFallbackMiddleware","constructor","indexMiddleware","getHandler","res","next","platform","parsePlatformHeader"],"mappings":"AAAA;;;;QAWgBA,uBAAuB,GAAvBA,uBAAuB;AAXH,IAAA,gBAAmB,WAAnB,mBAAmB,CAAA;AAGvD,MAAMC,KAAK,GAAGC,OAAO,CAAC,OAAO,CAAC,CAAC,yCAAyC,CAAC,AAAsB,AAAC;AAEhG,MAAMC,aAAa,GAAG,mBAAmB,AAAC;AAC1C,MAAMC,eAAe,GAAG,kBAAkB,AAAC;AAC3C,MAAMC,mBAAmB,GAAG,OAAO,AAAC;AACpC,MAAMC,qBAAqB,GAAG,YAAY,AAAC;AAC3C,MAAMC,2BAA2B,GAAG,eAAe,AAAC;AAE7C,SAASP,uBAAuB,CAACQ,GAAkB,EAAE;IAC1D,MAAMC,EAAE,GAAGD,GAAG,CAACE,OAAO,CAAC,YAAY,CAAC,AAAC;IACrC,MAAMC,GAAG,GAAGH,GAAG,CAACG,GAAG,AAAC;IAEpB,uEAAuE;IACvE,0DAA0D;IAC1D,IAAI,CAACA,GAAG,IAAKF,EAAE,IAAI,CAACA,EAAE,CAACG,QAAQ,CAAC,YAAY,CAAC,AAAC,EAAE;QAC9C,qFAAqF;QACrF,uBAAuB;QACvB,OAAO,KAAK,CAAC;KACd;IAED,OAAO;QACLT,aAAa;QACbC,eAAe;QACfC,mBAAmB;QACnBC,qBAAqB;QACrBC,2BAA2B;KAC5B,CAACK,QAAQ,CAACD,GAAG,CAAC,CAAC;CACjB;AAMM,MAAME,yBAAyB;IACpCC,YACUC,eAIU,CAClB;aALQA,eAIU,GAJVA,eAIU;KAChB;IACJC,UAAU,GAAG;QACX,OAAO,CAACR,GAAkB,EAAES,GAAmB,EAAEC,IAAS,GAAK;YAC7D,MAAMC,QAAQ,GAAGC,CAAAA,GAAAA,gBAAmB,AAAK,CAAA,oBAAL,CAACZ,GAAG,CAAC,AAAC;YAE1C,IAAI,CAACW,QAAQ,IAAIA,QAAQ,KAAK,KAAK,EAAE;gBACnC,IAAInB,uBAAuB,CAACQ,GAAG,CAAC,EAAE;oBAChCP,KAAK,CAAC,0BAA0B,EAAEO,GAAG,CAACG,GAAG,EAAE,KAAK,EAAEH,GAAG,CAACE,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;oBAC7E,OAAOQ,IAAI,EAAE,CAAC;iBACf;gBACD,sEAAsE;gBACtE,kDAAkD;gBAClD,OAAO,IAAI,CAACH,eAAe,CAACP,GAAG,EAAES,GAAG,EAAEC,IAAI,CAAC,CAAC;aAC7C;YAED,OAAOA,IAAI,EAAE,CAAC;SACf,CAAC;KACH;CACF;QAzBYL,yBAAyB,GAAzBA,yBAAyB"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ exports.getMetroDebugProperties = getMetroDebugProperties;
6
+ var _resolveFromProject = require("../../start/server/metro/resolveFromProject");
7
+ function getMetroDebugProperties(projectRoot, exp, debugTool) {
8
+ return {
9
+ sdkVersion: exp.sdkVersion,
10
+ metroVersion: (0, _resolveFromProject).resolveMetroVersionFromProject(projectRoot),
11
+ toolName: debugTool.name,
12
+ toolVersion: debugTool.version
13
+ };
14
+ }
15
+
16
+ //# sourceMappingURL=getMetroDebugProperties.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/utils/analytics/getMetroDebugProperties.ts"],"sourcesContent":["import { ExpoConfig } from '@expo/config';\n\nimport { resolveMetroVersionFromProject } from '../../start/server/metro/resolveFromProject';\n\nexport type DebugTool = {\n name: string;\n version?: string;\n};\n\nexport function getMetroDebugProperties(\n projectRoot: string,\n exp: ExpoConfig,\n debugTool: DebugTool\n) {\n return {\n sdkVersion: exp.sdkVersion,\n metroVersion: resolveMetroVersionFromProject(projectRoot),\n toolName: debugTool.name,\n toolVersion: debugTool.version,\n };\n}\n"],"names":["getMetroDebugProperties","projectRoot","exp","debugTool","sdkVersion","metroVersion","resolveMetroVersionFromProject","toolName","name","toolVersion","version"],"mappings":"AAAA;;;;QASgBA,uBAAuB,GAAvBA,uBAAuB;AAPQ,IAAA,mBAA6C,WAA7C,6CAA6C,CAAA;AAOrF,SAASA,uBAAuB,CACrCC,WAAmB,EACnBC,GAAe,EACfC,SAAoB,EACpB;IACA,OAAO;QACLC,UAAU,EAAEF,GAAG,CAACE,UAAU;QAC1BC,YAAY,EAAEC,CAAAA,GAAAA,mBAA8B,AAAa,CAAA,+BAAb,CAACL,WAAW,CAAC;QACzDM,QAAQ,EAAEJ,SAAS,CAACK,IAAI;QACxBC,WAAW,EAAEN,SAAS,CAACO,OAAO;KAC/B,CAAC;CACH"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ exports.getMetroProperties = getMetroProperties;
6
+ var _resolveFromProject = require("../../start/server/metro/resolveFromProject");
7
+ function getMetroProperties(projectRoot, exp, metroConfig = {}) {
8
+ var ref, ref1, ref2, ref3, ref4, ref5, ref6, ref7, ref8, ref9, ref10, ref11;
9
+ return {
10
+ sdkVersion: exp.sdkVersion,
11
+ metroVersion: (0, _resolveFromProject).resolveMetroVersionFromProject(projectRoot),
12
+ fileMapCacheManagerFactory: Boolean(metroConfig.unstable_fileMapCacheManagerFactory) || undefined,
13
+ perfLogger: Boolean(metroConfig.unstable_perfLogger) || undefined,
14
+ resolverEnableSymlinks: (ref = metroConfig.resolver) == null ? void 0 : ref.unstable_enableSymlinks,
15
+ resolverConditionNames: (ref1 = metroConfig.resolver) == null ? void 0 : ref1.unstable_conditionNames,
16
+ resolverConditionsByPlatform: (ref2 = metroConfig.resolver) == null ? void 0 : ref2.unstable_conditionsByPlatform,
17
+ resolverEnablePackageExports: (ref3 = metroConfig.resolver) == null ? void 0 : ref3.unstable_enablePackageExports,
18
+ serverImportBundleSupport: (ref4 = metroConfig.server) == null ? void 0 : ref4.experimentalImportBundleSupport,
19
+ serverServerRoot: (ref5 = metroConfig.server) == null ? void 0 : ref5.unstable_serverRoot,
20
+ transformerCollectDependenciesPath: (ref6 = metroConfig.transformer) == null ? void 0 : ref6.unstable_collectDependenciesPath,
21
+ transformerDependencyMapReservedName: (ref7 = metroConfig.transformer) == null ? void 0 : ref7.unstable_dependencyMapReservedName,
22
+ transformerDisableModuleWrapping: (ref8 = metroConfig.transformer) == null ? void 0 : ref8.unstable_disableModuleWrapping,
23
+ transformerDisableNormalizePseudoGlobals: (ref9 = metroConfig.transformer) == null ? void 0 : ref9.unstable_disableNormalizePseudoGlobals,
24
+ transformerCompactOutput: (ref10 = metroConfig.transformer) == null ? void 0 : ref10.unstable_compactOutput,
25
+ transformerAllowRequireContext: (ref11 = metroConfig.transformer) == null ? void 0 : ref11.unstable_allowRequireContext
26
+ };
27
+ }
28
+
29
+ //# sourceMappingURL=getMetroProperties.js.map