@expo/metro-config 0.7.1 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/build/ExpoMetroConfig.d.ts +16 -8
  2. package/build/ExpoMetroConfig.js +167 -107
  3. package/build/ExpoMetroConfig.js.map +1 -1
  4. package/build/customizeFrame.d.ts +10 -0
  5. package/build/customizeFrame.js +85 -0
  6. package/build/customizeFrame.js.map +1 -0
  7. package/build/env.d.ts +16 -0
  8. package/build/env.js +47 -0
  9. package/build/env.js.map +1 -0
  10. package/build/getModulesPaths.d.ts +1 -0
  11. package/build/getModulesPaths.js +12 -0
  12. package/build/getModulesPaths.js.map +1 -1
  13. package/build/getWatchFolders.js.map +1 -1
  14. package/build/rewriteRequestUrl.d.ts +1 -0
  15. package/build/rewriteRequestUrl.js +88 -0
  16. package/build/rewriteRequestUrl.js.map +1 -0
  17. package/build/serializer/environmentVariableSerializerPlugin.d.ts +11 -0
  18. package/build/serializer/environmentVariableSerializerPlugin.js +125 -0
  19. package/build/serializer/environmentVariableSerializerPlugin.js.map +1 -0
  20. package/build/serializer/getCssDeps.d.ts +31 -0
  21. package/build/serializer/getCssDeps.js +107 -0
  22. package/build/serializer/getCssDeps.js.map +1 -0
  23. package/build/serializer/serializerAssets.d.ts +7 -0
  24. package/build/serializer/serializerAssets.js +2 -0
  25. package/build/serializer/serializerAssets.js.map +1 -0
  26. package/build/serializer/withExpoSerializers.d.ts +9 -0
  27. package/build/serializer/withExpoSerializers.js +135 -0
  28. package/build/serializer/withExpoSerializers.js.map +1 -0
  29. package/build/transform-worker/css-modules.d.ts +20 -0
  30. package/build/transform-worker/css-modules.js +93 -0
  31. package/build/transform-worker/css-modules.js.map +1 -0
  32. package/build/transform-worker/css.d.ts +7 -0
  33. package/build/transform-worker/css.js +49 -0
  34. package/build/transform-worker/css.js.map +1 -0
  35. package/build/transform-worker/postcss.d.ts +17 -0
  36. package/build/transform-worker/postcss.js +253 -0
  37. package/build/transform-worker/postcss.js.map +1 -0
  38. package/build/transform-worker/sass.d.ts +9 -0
  39. package/build/transform-worker/sass.js +49 -0
  40. package/build/transform-worker/sass.js.map +1 -0
  41. package/build/transform-worker/transform-worker.d.ts +3 -0
  42. package/build/transform-worker/transform-worker.js +180 -0
  43. package/build/transform-worker/transform-worker.js.map +1 -0
  44. package/build/transform-worker/utils/require.d.ts +2 -0
  45. package/build/transform-worker/utils/require.js +38 -0
  46. package/build/transform-worker/utils/require.js.map +1 -0
  47. package/build/transformer/createExoticTransformer.js.map +1 -1
  48. package/build/transformer/createMatcher.js +1 -1
  49. package/build/transformer/createMatcher.js.map +1 -1
  50. package/build/transformer/createMultiRuleTransformer.js +2 -2
  51. package/build/transformer/createMultiRuleTransformer.js.map +1 -1
  52. package/build/transformer/generateFunctionMap.d.ts +3 -1
  53. package/build/transformer/generateFunctionMap.js +6 -6
  54. package/build/transformer/generateFunctionMap.js.map +1 -1
  55. package/build/transformer/getBabelConfig.js.map +1 -1
  56. package/build/transformer/getCacheKey.js.map +1 -1
  57. package/build/transformer/index.js.map +1 -1
  58. package/build/transformer/metro-expo-babel-transformer.js.map +1 -1
  59. package/build/transformer/metro-expo-exotic-babel-transformer.js.map +1 -1
  60. package/build/traveling/metro-config.d.ts +3 -0
  61. package/build/traveling/metro-config.js +25 -0
  62. package/build/traveling/metro-config.js.map +1 -0
  63. package/build/utils/hash.d.ts +1 -0
  64. package/build/utils/hash.js +18 -0
  65. package/build/utils/hash.js.map +1 -0
  66. package/package.json +9 -7
  67. package/build/importMetroFromProject.d.ts +0 -4
  68. package/build/importMetroFromProject.js +0 -40
  69. package/build/importMetroFromProject.js.map +0 -1
package/build/env.d.ts ADDED
@@ -0,0 +1,16 @@
1
+ declare class Env {
2
+ /** Enable debug logging */
3
+ get EXPO_DEBUG(): boolean;
4
+ /** Prevent disabling the `x_facebook_sources` non-standard sourcemap extension when `EXPO_USE_EXOTIC` is enabled. */
5
+ get EXPO_USE_FB_SOURCES(): boolean;
6
+ /** Enable the experimental "exotic" mode. [Learn more](https://blog.expo.dev/drastically-faster-bundling-in-react-native-a54f268e0ed1). */
7
+ get EXPO_USE_EXOTIC(): boolean;
8
+ /** The React Metro port that's baked into react-native scripts and tools. */
9
+ get RCT_METRO_PORT(): number;
10
+ /** Enable auto server root detection for Metro. This will change the server root to the workspace root. */
11
+ get EXPO_USE_METRO_WORKSPACE_ROOT(): boolean;
12
+ /** Disable Environment Variable injection in client bundles. */
13
+ get EXPO_NO_CLIENT_ENV_VARS(): boolean;
14
+ }
15
+ export declare const env: Env;
16
+ export {};
package/build/env.js ADDED
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.env = void 0;
7
+ function _getenv() {
8
+ const data = require("getenv");
9
+ _getenv = function () {
10
+ return data;
11
+ };
12
+ return data;
13
+ }
14
+ class Env {
15
+ /** Enable debug logging */
16
+ get EXPO_DEBUG() {
17
+ return (0, _getenv().boolish)('EXPO_DEBUG', false);
18
+ }
19
+
20
+ /** Prevent disabling the `x_facebook_sources` non-standard sourcemap extension when `EXPO_USE_EXOTIC` is enabled. */
21
+ get EXPO_USE_FB_SOURCES() {
22
+ return (0, _getenv().boolish)('EXPO_USE_FB_SOURCES', false);
23
+ }
24
+
25
+ /** Enable the experimental "exotic" mode. [Learn more](https://blog.expo.dev/drastically-faster-bundling-in-react-native-a54f268e0ed1). */
26
+ get EXPO_USE_EXOTIC() {
27
+ return (0, _getenv().boolish)('EXPO_USE_EXOTIC', false);
28
+ }
29
+
30
+ /** The React Metro port that's baked into react-native scripts and tools. */
31
+ get RCT_METRO_PORT() {
32
+ return (0, _getenv().int)('RCT_METRO_PORT', 8081);
33
+ }
34
+
35
+ /** Enable auto server root detection for Metro. This will change the server root to the workspace root. */
36
+ get EXPO_USE_METRO_WORKSPACE_ROOT() {
37
+ return (0, _getenv().boolish)('EXPO_USE_METRO_WORKSPACE_ROOT', false);
38
+ }
39
+
40
+ /** Disable Environment Variable injection in client bundles. */
41
+ get EXPO_NO_CLIENT_ENV_VARS() {
42
+ return (0, _getenv().boolish)('EXPO_NO_CLIENT_ENV_VARS', false);
43
+ }
44
+ }
45
+ const env = new Env();
46
+ exports.env = env;
47
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","names":["_getenv","data","require","Env","EXPO_DEBUG","boolish","EXPO_USE_FB_SOURCES","EXPO_USE_EXOTIC","RCT_METRO_PORT","int","EXPO_USE_METRO_WORKSPACE_ROOT","EXPO_NO_CLIENT_ENV_VARS","env","exports"],"sources":["../src/env.ts"],"sourcesContent":["import { boolish, int } from 'getenv';\n\nclass Env {\n /** Enable debug logging */\n get EXPO_DEBUG() {\n return boolish('EXPO_DEBUG', false);\n }\n\n /** Prevent disabling the `x_facebook_sources` non-standard sourcemap extension when `EXPO_USE_EXOTIC` is enabled. */\n get EXPO_USE_FB_SOURCES() {\n return boolish('EXPO_USE_FB_SOURCES', false);\n }\n\n /** Enable the experimental \"exotic\" mode. [Learn more](https://blog.expo.dev/drastically-faster-bundling-in-react-native-a54f268e0ed1). */\n get EXPO_USE_EXOTIC() {\n return boolish('EXPO_USE_EXOTIC', false);\n }\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', 8081);\n }\n\n /** Enable auto server root detection for Metro. This will change the server root to the workspace root. */\n get EXPO_USE_METRO_WORKSPACE_ROOT(): boolean {\n return boolish('EXPO_USE_METRO_WORKSPACE_ROOT', false);\n }\n\n /** Disable Environment Variable injection in client bundles. */\n get EXPO_NO_CLIENT_ENV_VARS(): boolean {\n return boolish('EXPO_NO_CLIENT_ENV_VARS', false);\n }\n}\n\nexport const env = new Env();\n"],"mappings":";;;;;;AAAA,SAAAA,QAAA;EAAA,MAAAC,IAAA,GAAAC,OAAA;EAAAF,OAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAEA,MAAME,GAAG,CAAC;EACR;EACA,IAAIC,UAAUA,CAAA,EAAG;IACf,OAAO,IAAAC,iBAAO,EAAC,YAAY,EAAE,KAAK,CAAC;EACrC;;EAEA;EACA,IAAIC,mBAAmBA,CAAA,EAAG;IACxB,OAAO,IAAAD,iBAAO,EAAC,qBAAqB,EAAE,KAAK,CAAC;EAC9C;;EAEA;EACA,IAAIE,eAAeA,CAAA,EAAG;IACpB,OAAO,IAAAF,iBAAO,EAAC,iBAAiB,EAAE,KAAK,CAAC;EAC1C;;EAEA;EACA,IAAIG,cAAcA,CAAA,EAAG;IACnB,OAAO,IAAAC,aAAG,EAAC,gBAAgB,EAAE,IAAI,CAAC;EACpC;;EAEA;EACA,IAAIC,6BAA6BA,CAAA,EAAY;IAC3C,OAAO,IAAAL,iBAAO,EAAC,+BAA+B,EAAE,KAAK,CAAC;EACxD;;EAEA;EACA,IAAIM,uBAAuBA,CAAA,EAAY;IACrC,OAAO,IAAAN,iBAAO,EAAC,yBAAyB,EAAE,KAAK,CAAC;EAClD;AACF;AAEO,MAAMO,GAAG,GAAG,IAAIT,GAAG,EAAE;AAACU,OAAA,CAAAD,GAAA,GAAAA,GAAA"}
@@ -1,3 +1,4 @@
1
1
  /** Wraps `findWorkspaceRoot` and guards against having an empty `package.json` file in an upper directory. */
2
2
  export declare function getWorkspaceRoot(projectRoot: string): string | null;
3
3
  export declare function getModulesPaths(projectRoot: string): string[];
4
+ export declare function getServerRoot(projectRoot: string): string;
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.getModulesPaths = getModulesPaths;
7
+ exports.getServerRoot = getServerRoot;
7
8
  exports.getWorkspaceRoot = getWorkspaceRoot;
8
9
  function _findYarnWorkspaceRoot() {
9
10
  const data = _interopRequireDefault(require("find-yarn-workspace-root"));
@@ -19,6 +20,13 @@ function _path() {
19
20
  };
20
21
  return data;
21
22
  }
23
+ function _env() {
24
+ const data = require("./env");
25
+ _env = function () {
26
+ return data;
27
+ };
28
+ return data;
29
+ }
22
30
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
31
  /** Wraps `findWorkspaceRoot` and guards against having an empty `package.json` file in an upper directory. */
24
32
  function getWorkspaceRoot(projectRoot) {
@@ -43,4 +51,8 @@ function getModulesPaths(projectRoot) {
43
51
  }
44
52
  return paths;
45
53
  }
54
+ function getServerRoot(projectRoot) {
55
+ var _getWorkspaceRoot;
56
+ return _env().env.EXPO_USE_METRO_WORKSPACE_ROOT ? (_getWorkspaceRoot = getWorkspaceRoot(projectRoot)) !== null && _getWorkspaceRoot !== void 0 ? _getWorkspaceRoot : projectRoot : projectRoot;
57
+ }
46
58
  //# sourceMappingURL=getModulesPaths.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"getModulesPaths.js","names":["getWorkspaceRoot","projectRoot","findWorkspaceRoot","error","message","includes","getModulesPaths","paths","workspaceRoot","path","resolve","push"],"sources":["../src/getModulesPaths.ts"],"sourcesContent":["import findWorkspaceRoot from 'find-yarn-workspace-root';\nimport path from 'path';\n\n/** Wraps `findWorkspaceRoot` and guards against having an empty `package.json` file in an upper directory. */\nexport function getWorkspaceRoot(projectRoot: string): string | null {\n try {\n return findWorkspaceRoot(projectRoot);\n } catch (error: any) {\n if (error.message.includes('Unexpected end of JSON input')) {\n return null;\n }\n throw error;\n }\n}\n\nexport function getModulesPaths(projectRoot: string): string[] {\n const paths: string[] = [];\n\n // Only add the project root if it's not the current working directory\n // this minimizes the chance of Metro resolver breaking on new Node.js versions.\n const workspaceRoot = getWorkspaceRoot(path.resolve(projectRoot)); // Absolute path or null\n if (workspaceRoot) {\n paths.push(path.resolve(projectRoot));\n paths.push(path.resolve(workspaceRoot, 'node_modules'));\n }\n\n return paths;\n}\n"],"mappings":";;;;;;;AAAA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AACA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AAAwB;AAExB;AACO,SAASA,gBAAgB,CAACC,WAAmB,EAAiB;EACnE,IAAI;IACF,OAAO,IAAAC,gCAAiB,EAACD,WAAW,CAAC;EACvC,CAAC,CAAC,OAAOE,KAAU,EAAE;IACnB,IAAIA,KAAK,CAACC,OAAO,CAACC,QAAQ,CAAC,8BAA8B,CAAC,EAAE;MAC1D,OAAO,IAAI;IACb;IACA,MAAMF,KAAK;EACb;AACF;AAEO,SAASG,eAAe,CAACL,WAAmB,EAAY;EAC7D,MAAMM,KAAe,GAAG,EAAE;;EAE1B;EACA;EACA,MAAMC,aAAa,GAAGR,gBAAgB,CAACS,eAAI,CAACC,OAAO,CAACT,WAAW,CAAC,CAAC,CAAC,CAAC;EACnE,IAAIO,aAAa,EAAE;IACjBD,KAAK,CAACI,IAAI,CAACF,eAAI,CAACC,OAAO,CAACT,WAAW,CAAC,CAAC;IACrCM,KAAK,CAACI,IAAI,CAACF,eAAI,CAACC,OAAO,CAACF,aAAa,EAAE,cAAc,CAAC,CAAC;EACzD;EAEA,OAAOD,KAAK;AACd"}
1
+ {"version":3,"file":"getModulesPaths.js","names":["_findYarnWorkspaceRoot","data","_interopRequireDefault","require","_path","_env","obj","__esModule","default","getWorkspaceRoot","projectRoot","findWorkspaceRoot","error","message","includes","getModulesPaths","paths","workspaceRoot","path","resolve","push","getServerRoot","_getWorkspaceRoot","env","EXPO_USE_METRO_WORKSPACE_ROOT"],"sources":["../src/getModulesPaths.ts"],"sourcesContent":["import findWorkspaceRoot from 'find-yarn-workspace-root';\nimport path from 'path';\n\nimport { env } from './env';\n\n/** Wraps `findWorkspaceRoot` and guards against having an empty `package.json` file in an upper directory. */\nexport function getWorkspaceRoot(projectRoot: string): string | null {\n try {\n return findWorkspaceRoot(projectRoot);\n } catch (error: any) {\n if (error.message.includes('Unexpected end of JSON input')) {\n return null;\n }\n throw error;\n }\n}\n\nexport function getModulesPaths(projectRoot: string): string[] {\n const paths: string[] = [];\n\n // Only add the project root if it's not the current working directory\n // this minimizes the chance of Metro resolver breaking on new Node.js versions.\n const workspaceRoot = getWorkspaceRoot(path.resolve(projectRoot)); // Absolute path or null\n if (workspaceRoot) {\n paths.push(path.resolve(projectRoot));\n paths.push(path.resolve(workspaceRoot, 'node_modules'));\n }\n\n return paths;\n}\n\nexport function getServerRoot(projectRoot: string) {\n return env.EXPO_USE_METRO_WORKSPACE_ROOT\n ? getWorkspaceRoot(projectRoot) ?? projectRoot\n : projectRoot;\n}\n"],"mappings":";;;;;;;;AAAA,SAAAA,uBAAA;EAAA,MAAAC,IAAA,GAAAC,sBAAA,CAAAC,OAAA;EAAAH,sBAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAG,MAAA;EAAA,MAAAH,IAAA,GAAAC,sBAAA,CAAAC,OAAA;EAAAC,KAAA,YAAAA,CAAA;IAAA,OAAAH,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAEA,SAAAI,KAAA;EAAA,MAAAJ,IAAA,GAAAE,OAAA;EAAAE,IAAA,YAAAA,CAAA;IAAA,OAAAJ,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAA4B,SAAAC,uBAAAI,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAE5B;AACO,SAASG,gBAAgBA,CAACC,WAAmB,EAAiB;EACnE,IAAI;IACF,OAAO,IAAAC,gCAAiB,EAACD,WAAW,CAAC;EACvC,CAAC,CAAC,OAAOE,KAAU,EAAE;IACnB,IAAIA,KAAK,CAACC,OAAO,CAACC,QAAQ,CAAC,8BAA8B,CAAC,EAAE;MAC1D,OAAO,IAAI;IACb;IACA,MAAMF,KAAK;EACb;AACF;AAEO,SAASG,eAAeA,CAACL,WAAmB,EAAY;EAC7D,MAAMM,KAAe,GAAG,EAAE;;EAE1B;EACA;EACA,MAAMC,aAAa,GAAGR,gBAAgB,CAACS,eAAI,CAACC,OAAO,CAACT,WAAW,CAAC,CAAC,CAAC,CAAC;EACnE,IAAIO,aAAa,EAAE;IACjBD,KAAK,CAACI,IAAI,CAACF,eAAI,CAACC,OAAO,CAACT,WAAW,CAAC,CAAC;IACrCM,KAAK,CAACI,IAAI,CAACF,eAAI,CAACC,OAAO,CAACF,aAAa,EAAE,cAAc,CAAC,CAAC;EACzD;EAEA,OAAOD,KAAK;AACd;AAEO,SAASK,aAAaA,CAACX,WAAmB,EAAE;EAAA,IAAAY,iBAAA;EACjD,OAAOC,UAAG,CAACC,6BAA6B,IAAAF,iBAAA,GACpCb,gBAAgB,CAACC,WAAW,CAAC,cAAAY,iBAAA,cAAAA,iBAAA,GAAIZ,WAAW,GAC5CA,WAAW;AACjB"}
@@ -1 +1 @@
1
- {"version":3,"file":"getWatchFolders.js","names":["readJsonFile","filePath","file","fs","readFileSync","JSON","parse","isValidJsonFile","globAllPackageJsonPaths","workspaceProjectRoot","linkedPackages","map","glob","globSync","path","join","replace","cwd","absolute","ignore","pkgPath","flat","filter","Boolean","p","getWorkspacePackagesArray","workspaces","Array","isArray","assert","packages","resolveAllWorkspacePackageJsonPaths","rootPackageJsonFilePath","rootPackageJson","getWatchFolders","projectRoot","workspaceRoot","getWorkspaceRoot","resolve","length","uniqueItems","pkg","dirname","items","Set"],"sources":["../src/getWatchFolders.ts"],"sourcesContent":["import assert from 'assert';\nimport fs from 'fs';\nimport { sync as globSync } from 'glob';\nimport path from 'path';\n\nimport { getWorkspaceRoot } from './getModulesPaths';\n\nfunction readJsonFile(filePath: string) {\n // Read with fs\n const file = fs.readFileSync(filePath, 'utf8');\n // Parse with JSON.parse\n return JSON.parse(file);\n}\n\nfunction isValidJsonFile(filePath: string): boolean {\n try {\n // Throws if invalid or unable to read.\n readJsonFile(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * @param workspaceProjectRoot Root file path for the yarn workspace\n * @param linkedPackages List of folders that contain linked node modules, ex: `['packages/*', 'apps/*']`\n * @returns List of valid package.json file paths, ex: `['/Users/me/app/apps/my-app/package.json', '/Users/me/app/packages/my-package/package.json']`\n */\nexport function globAllPackageJsonPaths(\n workspaceProjectRoot: string,\n linkedPackages: string[]\n): string[] {\n return linkedPackages\n .map((glob) => {\n return globSync(path.join(glob, 'package.json').replace(/\\\\/g, '/'), {\n cwd: workspaceProjectRoot,\n absolute: true,\n ignore: ['**/@(Carthage|Pods|node_modules)/**'],\n }).map((pkgPath) => {\n return isValidJsonFile(pkgPath) ? pkgPath : null;\n });\n })\n .flat()\n .filter(Boolean)\n .map((p) => path.join(p as string));\n}\n\nfunction getWorkspacePackagesArray({ workspaces }: any): string[] {\n if (Array.isArray(workspaces)) {\n return workspaces;\n }\n\n assert(workspaces?.packages, 'Could not find a `workspaces` object in the root package.json');\n\n return workspaces.packages;\n}\n\n/**\n * @param workspaceProjectRoot root file path for a yarn workspace.\n * @returns list of package.json file paths that are linked to the yarn workspace.\n */\nexport function resolveAllWorkspacePackageJsonPaths(workspaceProjectRoot: string) {\n try {\n const rootPackageJsonFilePath = path.join(workspaceProjectRoot, 'package.json');\n // Could throw if package.json is invalid.\n const rootPackageJson = readJsonFile(rootPackageJsonFilePath);\n\n // Extract the \"packages\" array or use \"workspaces\" as packages array (yarn workspaces spec).\n const packages = getWorkspacePackagesArray(rootPackageJson);\n\n // Glob all package.json files and return valid paths.\n return globAllPackageJsonPaths(workspaceProjectRoot, packages);\n } catch {\n return [];\n }\n}\n\n/**\n * @param projectRoot file path to app's project root\n * @returns list of node module paths to watch in Metro bundler, ex: `['/Users/me/app/node_modules/', '/Users/me/app/apps/my-app/', '/Users/me/app/packages/my-package/']`\n */\nexport function getWatchFolders(projectRoot: string): string[] {\n const workspaceRoot = getWorkspaceRoot(path.resolve(projectRoot));\n // Rely on default behavior in standard projects.\n if (!workspaceRoot) {\n return [];\n }\n\n const packages = resolveAllWorkspacePackageJsonPaths(workspaceRoot);\n if (!packages.length) {\n return [];\n }\n\n return uniqueItems([\n path.join(workspaceRoot, 'node_modules'),\n ...packages.map((pkg) => path.dirname(pkg)),\n ]);\n}\n\nfunction uniqueItems(items: string[]): string[] {\n return [...new Set(items)];\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"getWatchFolders.js","names":["_assert","data","_interopRequireDefault","require","_fs","_glob","_path","_getModulesPaths","obj","__esModule","default","readJsonFile","filePath","file","fs","readFileSync","JSON","parse","isValidJsonFile","globAllPackageJsonPaths","workspaceProjectRoot","linkedPackages","map","glob","globSync","path","join","replace","cwd","absolute","ignore","pkgPath","flat","filter","Boolean","p","getWorkspacePackagesArray","workspaces","Array","isArray","assert","packages","resolveAllWorkspacePackageJsonPaths","rootPackageJsonFilePath","rootPackageJson","getWatchFolders","projectRoot","workspaceRoot","getWorkspaceRoot","resolve","length","uniqueItems","pkg","dirname","items","Set"],"sources":["../src/getWatchFolders.ts"],"sourcesContent":["import assert from 'assert';\nimport fs from 'fs';\nimport { sync as globSync } from 'glob';\nimport path from 'path';\n\nimport { getWorkspaceRoot } from './getModulesPaths';\n\nfunction readJsonFile(filePath: string) {\n // Read with fs\n const file = fs.readFileSync(filePath, 'utf8');\n // Parse with JSON.parse\n return JSON.parse(file);\n}\n\nfunction isValidJsonFile(filePath: string): boolean {\n try {\n // Throws if invalid or unable to read.\n readJsonFile(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * @param workspaceProjectRoot Root file path for the yarn workspace\n * @param linkedPackages List of folders that contain linked node modules, ex: `['packages/*', 'apps/*']`\n * @returns List of valid package.json file paths, ex: `['/Users/me/app/apps/my-app/package.json', '/Users/me/app/packages/my-package/package.json']`\n */\nexport function globAllPackageJsonPaths(\n workspaceProjectRoot: string,\n linkedPackages: string[]\n): string[] {\n return linkedPackages\n .map((glob) => {\n return globSync(path.join(glob, 'package.json').replace(/\\\\/g, '/'), {\n cwd: workspaceProjectRoot,\n absolute: true,\n ignore: ['**/@(Carthage|Pods|node_modules)/**'],\n }).map((pkgPath) => {\n return isValidJsonFile(pkgPath) ? pkgPath : null;\n });\n })\n .flat()\n .filter(Boolean)\n .map((p) => path.join(p as string));\n}\n\nfunction getWorkspacePackagesArray({ workspaces }: any): string[] {\n if (Array.isArray(workspaces)) {\n return workspaces;\n }\n\n assert(workspaces?.packages, 'Could not find a `workspaces` object in the root package.json');\n\n return workspaces.packages;\n}\n\n/**\n * @param workspaceProjectRoot root file path for a yarn workspace.\n * @returns list of package.json file paths that are linked to the yarn workspace.\n */\nexport function resolveAllWorkspacePackageJsonPaths(workspaceProjectRoot: string) {\n try {\n const rootPackageJsonFilePath = path.join(workspaceProjectRoot, 'package.json');\n // Could throw if package.json is invalid.\n const rootPackageJson = readJsonFile(rootPackageJsonFilePath);\n\n // Extract the \"packages\" array or use \"workspaces\" as packages array (yarn workspaces spec).\n const packages = getWorkspacePackagesArray(rootPackageJson);\n\n // Glob all package.json files and return valid paths.\n return globAllPackageJsonPaths(workspaceProjectRoot, packages);\n } catch {\n return [];\n }\n}\n\n/**\n * @param projectRoot file path to app's project root\n * @returns list of node module paths to watch in Metro bundler, ex: `['/Users/me/app/node_modules/', '/Users/me/app/apps/my-app/', '/Users/me/app/packages/my-package/']`\n */\nexport function getWatchFolders(projectRoot: string): string[] {\n const workspaceRoot = getWorkspaceRoot(path.resolve(projectRoot));\n // Rely on default behavior in standard projects.\n if (!workspaceRoot) {\n return [];\n }\n\n const packages = resolveAllWorkspacePackageJsonPaths(workspaceRoot);\n if (!packages.length) {\n return [];\n }\n\n return uniqueItems([\n path.join(workspaceRoot, 'node_modules'),\n ...packages.map((pkg) => path.dirname(pkg)),\n ]);\n}\n\nfunction uniqueItems(items: string[]): string[] {\n return [...new Set(items)];\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function getRewriteRequestUrl(projectRoot: string): (url: string) => string;
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getRewriteRequestUrl = getRewriteRequestUrl;
7
+ function _config() {
8
+ const data = require("@expo/config");
9
+ _config = function () {
10
+ return data;
11
+ };
12
+ return data;
13
+ }
14
+ function _paths() {
15
+ const data = require("@expo/config/paths");
16
+ _paths = function () {
17
+ return data;
18
+ };
19
+ return data;
20
+ }
21
+ function _chalk() {
22
+ const data = _interopRequireDefault(require("chalk"));
23
+ _chalk = function () {
24
+ return data;
25
+ };
26
+ return data;
27
+ }
28
+ function _path() {
29
+ const data = _interopRequireDefault(require("path"));
30
+ _path = function () {
31
+ return data;
32
+ };
33
+ return data;
34
+ }
35
+ function _getModulesPaths() {
36
+ const data = require("./getModulesPaths");
37
+ _getModulesPaths = function () {
38
+ return data;
39
+ };
40
+ return data;
41
+ }
42
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
43
+ // Copyright 2023-present 650 Industries (Expo). All rights reserved.
44
+
45
+ const debug = require('debug')('expo:metro:config:rewriteRequestUrl');
46
+ function getRewriteRequestUrl(projectRoot) {
47
+ function rewriteExpoRequestUrl(url) {
48
+ // Like: `/.expo/.virtual-metro-entry.bundle?platform=ios&dev=true&minify=false&modulesOnly=false&runModule=true&app=com.bacon.test-custom-entry`
49
+ // Sometimes a fully qualified URL is passed in, e.g. `http://localhost:19001/.expo/.virtual-metro-entry.bundle?platform=ios&dev=true&minify=false&modulesOnly=false&runModule=true&app=com.bacon.test-custom-entry`
50
+ if (url.includes('/.expo/.virtual-metro-entry.bundle?')) {
51
+ var _searchParams$get;
52
+ const ensured = url.startsWith('/') ? new URL(url, 'https://acme.dev') : new URL(url);
53
+ // TODO: Maybe this function could be memoized in some capacity?
54
+ const {
55
+ search,
56
+ searchParams
57
+ } = ensured;
58
+ const platform = (_searchParams$get = searchParams.get('platform')) !== null && _searchParams$get !== void 0 ? _searchParams$get : 'web';
59
+ debug('Rewriting magic request url to entry point', {
60
+ url,
61
+ platform
62
+ });
63
+ const entry = (0, _paths().resolveEntryPoint)(projectRoot, {
64
+ platform,
65
+ // @ts-ignore
66
+ projectConfig: {
67
+ pkg: (0, _config().getPackageJson)(projectRoot)
68
+ }
69
+ });
70
+ if (!entry) {
71
+ throw new Error((0, _chalk().default)`The project entry file could not be resolved (platform: ${platform}, root: ${projectRoot}). Define it in the {bold package.json} "main" field.`);
72
+ }
73
+ const serverRoot = (0, _getModulesPaths().getServerRoot)(projectRoot);
74
+ const relativeEntry = _path().default.relative(serverRoot, entry).replace(/\.[tj]sx?$/, '');
75
+ debug('Resolved entry point', {
76
+ entry,
77
+ relativeEntry,
78
+ serverRoot
79
+ });
80
+
81
+ // Like: `/index.bundle?platform=ios&dev=true&minify=false&modulesOnly=false&runModule=true&app=com.bacon.test-custom-entry`
82
+ return '/' + relativeEntry + '.bundle' + search;
83
+ }
84
+ return url;
85
+ }
86
+ return rewriteExpoRequestUrl;
87
+ }
88
+ //# sourceMappingURL=rewriteRequestUrl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rewriteRequestUrl.js","names":["_config","data","require","_paths","_chalk","_interopRequireDefault","_path","_getModulesPaths","obj","__esModule","default","debug","getRewriteRequestUrl","projectRoot","rewriteExpoRequestUrl","url","includes","_searchParams$get","ensured","startsWith","URL","search","searchParams","platform","get","entry","resolveEntryPoint","projectConfig","pkg","getPackageJson","Error","chalk","serverRoot","getServerRoot","relativeEntry","path","relative","replace"],"sources":["../src/rewriteRequestUrl.ts"],"sourcesContent":["// Copyright 2023-present 650 Industries (Expo). All rights reserved.\nimport { getPackageJson } from '@expo/config';\nimport { resolveEntryPoint } from '@expo/config/paths';\nimport chalk from 'chalk';\nimport path from 'path';\n\nimport { getServerRoot } from './getModulesPaths';\n\nconst debug = require('debug')('expo:metro:config:rewriteRequestUrl');\n\nexport function getRewriteRequestUrl(projectRoot: string) {\n function rewriteExpoRequestUrl(url: string): string {\n // Like: `/.expo/.virtual-metro-entry.bundle?platform=ios&dev=true&minify=false&modulesOnly=false&runModule=true&app=com.bacon.test-custom-entry`\n // Sometimes a fully qualified URL is passed in, e.g. `http://localhost:19001/.expo/.virtual-metro-entry.bundle?platform=ios&dev=true&minify=false&modulesOnly=false&runModule=true&app=com.bacon.test-custom-entry`\n if (url.includes('/.expo/.virtual-metro-entry.bundle?')) {\n const ensured = url.startsWith('/') ? new URL(url, 'https://acme.dev') : new URL(url);\n // TODO: Maybe this function could be memoized in some capacity?\n const { search, searchParams } = ensured;\n\n const platform = searchParams.get('platform') ?? 'web';\n\n debug('Rewriting magic request url to entry point', { url, platform });\n\n const entry = resolveEntryPoint(projectRoot, {\n platform,\n // @ts-ignore\n projectConfig: {\n pkg: getPackageJson(projectRoot),\n },\n });\n\n if (!entry) {\n throw new Error(\n chalk`The project entry file could not be resolved (platform: ${platform}, root: ${projectRoot}). Define it in the {bold package.json} \"main\" field.`\n );\n }\n\n const serverRoot = getServerRoot(projectRoot);\n const relativeEntry = path.relative(serverRoot, entry).replace(/\\.[tj]sx?$/, '');\n debug('Resolved entry point', { entry, relativeEntry, serverRoot });\n\n // Like: `/index.bundle?platform=ios&dev=true&minify=false&modulesOnly=false&runModule=true&app=com.bacon.test-custom-entry`\n return '/' + relativeEntry + '.bundle' + search;\n }\n\n return url;\n }\n return rewriteExpoRequestUrl;\n}\n"],"mappings":";;;;;;AACA,SAAAA,QAAA;EAAA,MAAAC,IAAA,GAAAC,OAAA;EAAAF,OAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAE,OAAA;EAAA,MAAAF,IAAA,GAAAC,OAAA;EAAAC,MAAA,YAAAA,CAAA;IAAA,OAAAF,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAG,OAAA;EAAA,MAAAH,IAAA,GAAAI,sBAAA,CAAAH,OAAA;EAAAE,MAAA,YAAAA,CAAA;IAAA,OAAAH,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAK,MAAA;EAAA,MAAAL,IAAA,GAAAI,sBAAA,CAAAH,OAAA;EAAAI,KAAA,YAAAA,CAAA;IAAA,OAAAL,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAEA,SAAAM,iBAAA;EAAA,MAAAN,IAAA,GAAAC,OAAA;EAAAK,gBAAA,YAAAA,CAAA;IAAA,OAAAN,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAAkD,SAAAI,uBAAAG,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AANlD;;AAQA,MAAMG,KAAK,GAAGT,OAAO,CAAC,OAAO,CAAC,CAAC,qCAAqC,CAAC;AAE9D,SAASU,oBAAoBA,CAACC,WAAmB,EAAE;EACxD,SAASC,qBAAqBA,CAACC,GAAW,EAAU;IAClD;IACA;IACA,IAAIA,GAAG,CAACC,QAAQ,CAAC,qCAAqC,CAAC,EAAE;MAAA,IAAAC,iBAAA;MACvD,MAAMC,OAAO,GAAGH,GAAG,CAACI,UAAU,CAAC,GAAG,CAAC,GAAG,IAAIC,GAAG,CAACL,GAAG,EAAE,kBAAkB,CAAC,GAAG,IAAIK,GAAG,CAACL,GAAG,CAAC;MACrF;MACA,MAAM;QAAEM,MAAM;QAAEC;MAAa,CAAC,GAAGJ,OAAO;MAExC,MAAMK,QAAQ,IAAAN,iBAAA,GAAGK,YAAY,CAACE,GAAG,CAAC,UAAU,CAAC,cAAAP,iBAAA,cAAAA,iBAAA,GAAI,KAAK;MAEtDN,KAAK,CAAC,4CAA4C,EAAE;QAAEI,GAAG;QAAEQ;MAAS,CAAC,CAAC;MAEtE,MAAME,KAAK,GAAG,IAAAC,0BAAiB,EAACb,WAAW,EAAE;QAC3CU,QAAQ;QACR;QACAI,aAAa,EAAE;UACbC,GAAG,EAAE,IAAAC,wBAAc,EAAChB,WAAW;QACjC;MACF,CAAC,CAAC;MAEF,IAAI,CAACY,KAAK,EAAE;QACV,MAAM,IAAIK,KAAK,CACb,IAAAC,gBAAK,CAAC,2DAA0DR,QAAS,WAAUV,WAAY,uDAAsD,CACtJ;MACH;MAEA,MAAMmB,UAAU,GAAG,IAAAC,gCAAa,EAACpB,WAAW,CAAC;MAC7C,MAAMqB,aAAa,GAAGC,eAAI,CAACC,QAAQ,CAACJ,UAAU,EAAEP,KAAK,CAAC,CAACY,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC;MAChF1B,KAAK,CAAC,sBAAsB,EAAE;QAAEc,KAAK;QAAES,aAAa;QAAEF;MAAW,CAAC,CAAC;;MAEnE;MACA,OAAO,GAAG,GAAGE,aAAa,GAAG,SAAS,GAAGb,MAAM;IACjD;IAEA,OAAON,GAAG;EACZ;EACA,OAAOD,qBAAqB;AAC9B"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Copyright © 2022 650 Industries.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+ import { ReadOnlyGraph, MixedOutput, Module, SerializerOptions } from 'metro';
8
+ import { SerializerParameters } from './withExpoSerializers';
9
+ export declare function replaceEnvironmentVariables(code: string, env: Record<string, string | undefined>): string;
10
+ export declare function getTransformEnvironment(url: string): string | null;
11
+ export declare function environmentVariableSerializerPlugin(entryPoint: string, preModules: readonly Module<MixedOutput>[], graph: ReadOnlyGraph, options: SerializerOptions): SerializerParameters;
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.environmentVariableSerializerPlugin = environmentVariableSerializerPlugin;
7
+ exports.getTransformEnvironment = getTransformEnvironment;
8
+ exports.replaceEnvironmentVariables = replaceEnvironmentVariables;
9
+ function _CountingSet() {
10
+ const data = _interopRequireDefault(require("metro/src/lib/CountingSet"));
11
+ _CountingSet = function () {
12
+ return data;
13
+ };
14
+ return data;
15
+ }
16
+ function _countLines() {
17
+ const data = _interopRequireDefault(require("metro/src/lib/countLines"));
18
+ _countLines = function () {
19
+ return data;
20
+ };
21
+ return data;
22
+ }
23
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
24
+ /**
25
+ * Copyright © 2022 650 Industries.
26
+ *
27
+ * This source code is licensed under the MIT license found in the
28
+ * LICENSE file in the root directory of this source tree.
29
+ */
30
+
31
+ const debug = require('debug')('expo:metro-config:serializer:env-var');
32
+ function replaceEnvironmentVariables(code, env) {
33
+ // match and replace env variables that aren't NODE_ENV or JEST_WORKER_ID
34
+ // return code.match(/process\.env\.(EXPO_PUBLIC_[A-Z_]+)/g);
35
+ return code.replace(/process\.env\.([a-zA-Z0-9_]+)/gm, match => {
36
+ var _env$name;
37
+ const name = match.replace('process.env.', '');
38
+ if (
39
+ // Must start with EXPO_PUBLIC_ to be replaced
40
+ !/^EXPO_PUBLIC_/.test(name)) {
41
+ return match;
42
+ }
43
+ const value = JSON.stringify((_env$name = env[name]) !== null && _env$name !== void 0 ? _env$name : '');
44
+ debug(`Inlining environment variable "${match}" with ${value}`);
45
+ return value;
46
+ });
47
+ }
48
+ function getTransformEnvironment(url) {
49
+ const match = url.match(/[&?]transform\.environment=([^&]+)/);
50
+ return match ? match[1] : null;
51
+ }
52
+ function getAllExpoPublicEnvVars() {
53
+ // Create an object containing all environment variables that start with EXPO_PUBLIC_
54
+ const env = {};
55
+ for (const key in process.env) {
56
+ if (key.startsWith('EXPO_PUBLIC_')) {
57
+ // @ts-ignore
58
+ env[key] = process.env[key];
59
+ }
60
+ }
61
+ return env;
62
+ }
63
+ function environmentVariableSerializerPlugin(entryPoint, preModules, graph, options) {
64
+ // Skip replacement in Node.js environments.
65
+ if (options.sourceUrl && getTransformEnvironment(options.sourceUrl) === 'node') {
66
+ debug('Skipping environment variable inlining in Node.js environment.');
67
+ return [entryPoint, preModules, graph, options];
68
+ }
69
+
70
+ // Adds about 5ms on a blank Expo Router app.
71
+ // TODO: We can probably cache the results.
72
+
73
+ // In development, we need to add the process.env object to ensure it
74
+ // persists between Fast Refresh updates.
75
+ if (options.dev) {
76
+ // Set the process.env object to the current environment variables object
77
+ // ensuring they aren't iterable, settable, or enumerable.
78
+ const str = `process.env=Object.defineProperties(process.env, {${Object.keys(getAllExpoPublicEnvVars()).map(key => `${JSON.stringify(key)}: { value: ${JSON.stringify(process.env[key])} }`).join(',')}});`;
79
+ const [firstModule, ...restModules] = preModules;
80
+ // const envCode = `var process=this.process||{};${str}`;
81
+ // process.env
82
+ return [entryPoint, [
83
+ // First module defines the process.env object.
84
+ firstModule,
85
+ // Second module modifies the process.env object.
86
+ getEnvPrelude(str),
87
+ // Now we add the rest
88
+ ...restModules], graph, options];
89
+ }
90
+
91
+ // In production, inline all process.env variables to ensure they cannot be iterated and read arbitrarily.
92
+ for (const value of graph.dependencies.values()) {
93
+ // Skip node_modules, the feature is a bit too sensitive to allow in arbitrary code.
94
+ if (/node_modules/.test(value.path)) {
95
+ continue;
96
+ }
97
+ for (const index in value.output) {
98
+ // TODO: This probably breaks source maps.
99
+ const code = replaceEnvironmentVariables(value.output[index].data.code, process.env);
100
+ value.output[index].data.code = code;
101
+ }
102
+ }
103
+ return [entryPoint, preModules, graph, options];
104
+ }
105
+ function getEnvPrelude(contents) {
106
+ const code = '// HMR env vars from Expo CLI (dev-only)\n' + contents;
107
+ const name = '__env__';
108
+ const lineCount = (0, _countLines().default)(code);
109
+ return {
110
+ dependencies: new Map(),
111
+ getSource: () => Buffer.from(code),
112
+ inverseDependencies: new (_CountingSet().default)(),
113
+ path: name,
114
+ output: [{
115
+ type: 'js/script/virtual',
116
+ data: {
117
+ code,
118
+ // @ts-expect-error: typed incorrectly upstream
119
+ lineCount,
120
+ map: []
121
+ }
122
+ }]
123
+ };
124
+ }
125
+ //# sourceMappingURL=environmentVariableSerializerPlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environmentVariableSerializerPlugin.js","names":["_CountingSet","data","_interopRequireDefault","require","_countLines","obj","__esModule","default","debug","replaceEnvironmentVariables","code","env","replace","match","_env$name","name","test","value","JSON","stringify","getTransformEnvironment","url","getAllExpoPublicEnvVars","key","process","startsWith","environmentVariableSerializerPlugin","entryPoint","preModules","graph","options","sourceUrl","dev","str","Object","keys","map","join","firstModule","restModules","getEnvPrelude","dependencies","values","path","index","output","contents","lineCount","countLines","Map","getSource","Buffer","from","inverseDependencies","CountingSet","type"],"sources":["../../src/serializer/environmentVariableSerializerPlugin.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 { ReadOnlyGraph, MixedOutput, Module, SerializerOptions } from 'metro';\nimport CountingSet from 'metro/src/lib/CountingSet';\nimport countLines from 'metro/src/lib/countLines';\n\nimport { SerializerParameters } from './withExpoSerializers';\n\nconst debug = require('debug')('expo:metro-config:serializer:env-var') as typeof console.log;\n\nexport function replaceEnvironmentVariables(\n code: string,\n env: Record<string, string | undefined>\n): string {\n // match and replace env variables that aren't NODE_ENV or JEST_WORKER_ID\n // return code.match(/process\\.env\\.(EXPO_PUBLIC_[A-Z_]+)/g);\n return code.replace(/process\\.env\\.([a-zA-Z0-9_]+)/gm, (match) => {\n const name = match.replace('process.env.', '');\n if (\n // Must start with EXPO_PUBLIC_ to be replaced\n !/^EXPO_PUBLIC_/.test(name)\n ) {\n return match;\n }\n\n const value = JSON.stringify(env[name] ?? '');\n debug(`Inlining environment variable \"${match}\" with ${value}`);\n return value;\n });\n}\n\nexport function getTransformEnvironment(url: string): string | null {\n const match = url.match(/[&?]transform\\.environment=([^&]+)/);\n return match ? match[1] : null;\n}\n\nfunction getAllExpoPublicEnvVars() {\n // Create an object containing all environment variables that start with EXPO_PUBLIC_\n const env = {};\n for (const key in process.env) {\n if (key.startsWith('EXPO_PUBLIC_')) {\n // @ts-ignore\n env[key] = process.env[key];\n }\n }\n return env;\n}\n\nexport function environmentVariableSerializerPlugin(\n entryPoint: string,\n preModules: readonly Module<MixedOutput>[],\n graph: ReadOnlyGraph,\n options: SerializerOptions\n): SerializerParameters {\n // Skip replacement in Node.js environments.\n if (options.sourceUrl && getTransformEnvironment(options.sourceUrl) === 'node') {\n debug('Skipping environment variable inlining in Node.js environment.');\n return [entryPoint, preModules, graph, options];\n }\n\n // Adds about 5ms on a blank Expo Router app.\n // TODO: We can probably cache the results.\n\n // In development, we need to add the process.env object to ensure it\n // persists between Fast Refresh updates.\n if (options.dev) {\n // Set the process.env object to the current environment variables object\n // ensuring they aren't iterable, settable, or enumerable.\n const str = `process.env=Object.defineProperties(process.env, {${Object.keys(\n getAllExpoPublicEnvVars()\n )\n .map((key) => `${JSON.stringify(key)}: { value: ${JSON.stringify(process.env[key])} }`)\n .join(',')}});`;\n\n const [firstModule, ...restModules] = preModules;\n // const envCode = `var process=this.process||{};${str}`;\n // process.env\n return [\n entryPoint,\n [\n // First module defines the process.env object.\n firstModule,\n // Second module modifies the process.env object.\n getEnvPrelude(str),\n // Now we add the rest\n ...restModules,\n ],\n graph,\n options,\n ];\n }\n\n // In production, inline all process.env variables to ensure they cannot be iterated and read arbitrarily.\n for (const value of graph.dependencies.values()) {\n // Skip node_modules, the feature is a bit too sensitive to allow in arbitrary code.\n if (/node_modules/.test(value.path)) {\n continue;\n }\n\n for (const index in value.output) {\n // TODO: This probably breaks source maps.\n const code = replaceEnvironmentVariables(value.output[index].data.code, process.env);\n value.output[index].data.code = code;\n }\n }\n return [entryPoint, preModules, graph, options];\n}\n\nfunction getEnvPrelude(contents: string): Module<MixedOutput> {\n const code = '// HMR env vars from Expo CLI (dev-only)\\n' + contents;\n const name = '__env__';\n const lineCount = countLines(code);\n\n return {\n dependencies: new Map(),\n getSource: (): Buffer => Buffer.from(code),\n inverseDependencies: new CountingSet(),\n path: name,\n output: [\n {\n type: 'js/script/virtual',\n data: {\n code,\n // @ts-expect-error: typed incorrectly upstream\n lineCount,\n map: [],\n },\n },\n ],\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { Module } from 'metro';
2
+ import { SerialAsset } from './serializerAssets';
3
+ export type ReadOnlyDependencies<T = any> = ReadonlyMap<string, Module<T>>;
4
+ type Options = {
5
+ processModuleFilter: (modules: Module) => boolean;
6
+ assetPlugins: readonly string[];
7
+ platform?: string | null;
8
+ projectRoot: string;
9
+ publicPath: string;
10
+ };
11
+ export type JSModule = Module<{
12
+ data: {
13
+ code: string;
14
+ map: unknown;
15
+ lineCount: number;
16
+ css?: {
17
+ code: string;
18
+ map: unknown;
19
+ lineCount: number;
20
+ };
21
+ };
22
+ type: 'js/module';
23
+ }>;
24
+ export declare function filterJsModules(dependencies: ReadOnlyDependencies, { processModuleFilter, projectRoot }: Pick<Options, 'projectRoot' | 'processModuleFilter'>): JSModule[];
25
+ export declare function getCssSerialAssets<T extends any>(dependencies: ReadOnlyDependencies<T>, { processModuleFilter, projectRoot }: Pick<Options, 'projectRoot' | 'processModuleFilter'>): SerialAsset[];
26
+ export declare function fileNameFromContents({ filepath, src }: {
27
+ filepath: string;
28
+ src: string;
29
+ }): string;
30
+ export declare function getFileName(module: string): string;
31
+ export {};
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.fileNameFromContents = fileNameFromContents;
7
+ exports.filterJsModules = filterJsModules;
8
+ exports.getCssSerialAssets = getCssSerialAssets;
9
+ exports.getFileName = getFileName;
10
+ function _js() {
11
+ const data = require("metro/src/DeltaBundler/Serializers/helpers/js");
12
+ _js = function () {
13
+ return data;
14
+ };
15
+ return data;
16
+ }
17
+ function _path() {
18
+ const data = _interopRequireDefault(require("path"));
19
+ _path = function () {
20
+ return data;
21
+ };
22
+ return data;
23
+ }
24
+ function _css() {
25
+ const data = require("../transform-worker/css");
26
+ _css = function () {
27
+ return data;
28
+ };
29
+ return data;
30
+ }
31
+ function _hash() {
32
+ const data = require("../utils/hash");
33
+ _hash = function () {
34
+ return data;
35
+ };
36
+ return data;
37
+ }
38
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
39
+ // s = static
40
+ const STATIC_EXPORT_DIRECTORY = '_expo/static/css';
41
+ function filterJsModules(dependencies, {
42
+ processModuleFilter,
43
+ projectRoot
44
+ }) {
45
+ const assets = [];
46
+ for (const module of dependencies.values()) {
47
+ if ((0, _js().isJsModule)(module) && processModuleFilter(module) && (0, _js().getJsOutput)(module).type === 'js/module' && _path().default.relative(projectRoot, module.path) !== 'package.json') {
48
+ assets.push(module);
49
+ }
50
+ }
51
+ return assets;
52
+ }
53
+ function getCssSerialAssets(dependencies, {
54
+ processModuleFilter,
55
+ projectRoot
56
+ }) {
57
+ const assets = [];
58
+ for (const module of filterJsModules(dependencies, {
59
+ processModuleFilter,
60
+ projectRoot
61
+ })) {
62
+ const cssMetadata = getCssMetadata(module);
63
+ if (cssMetadata) {
64
+ const contents = cssMetadata.code;
65
+ const filename = _path().default.join(
66
+ // Consistent location
67
+ STATIC_EXPORT_DIRECTORY,
68
+ // Hashed file contents + name for caching
69
+ fileNameFromContents({
70
+ filepath: module.path,
71
+ src: contents
72
+ }) + '.css');
73
+ const originFilename = _path().default.relative(projectRoot, module.path);
74
+ assets.push({
75
+ type: 'css',
76
+ originFilename,
77
+ filename,
78
+ source: contents,
79
+ metadata: {
80
+ hmrId: (0, _css().pathToHtmlSafeName)(originFilename)
81
+ }
82
+ });
83
+ }
84
+ }
85
+ return assets;
86
+ }
87
+ function getCssMetadata(module) {
88
+ var _module$output$;
89
+ const data = (_module$output$ = module.output[0]) === null || _module$output$ === void 0 ? void 0 : _module$output$.data;
90
+ if (data && typeof data === 'object' && 'css' in data) {
91
+ if (typeof data.css !== 'object' || !('code' in data.css)) {
92
+ throw new Error(`Unexpected CSS metadata in Metro module (${module.path}): ${JSON.stringify(data.css)}`);
93
+ }
94
+ return data.css;
95
+ }
96
+ return null;
97
+ }
98
+ function fileNameFromContents({
99
+ filepath,
100
+ src
101
+ }) {
102
+ return getFileName(filepath) + '-' + (0, _hash().hashString)(filepath + src);
103
+ }
104
+ function getFileName(module) {
105
+ return _path().default.basename(module).replace(/\.[^.]+$/, '');
106
+ }
107
+ //# sourceMappingURL=getCssDeps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getCssDeps.js","names":["_js","data","require","_path","_interopRequireDefault","_css","_hash","obj","__esModule","default","STATIC_EXPORT_DIRECTORY","filterJsModules","dependencies","processModuleFilter","projectRoot","assets","module","values","isJsModule","getJsOutput","type","path","relative","push","getCssSerialAssets","cssMetadata","getCssMetadata","contents","code","filename","join","fileNameFromContents","filepath","src","originFilename","source","metadata","hmrId","pathToHtmlSafeName","_module$output$","output","css","Error","JSON","stringify","getFileName","hashString","basename","replace"],"sources":["../../src/serializer/getCssDeps.ts"],"sourcesContent":["import type { Module } from 'metro';\nimport { getJsOutput, isJsModule } from 'metro/src/DeltaBundler/Serializers/helpers/js';\nimport path from 'path';\n\nimport { pathToHtmlSafeName } from '../transform-worker/css';\nimport { hashString } from '../utils/hash';\nimport { SerialAsset } from './serializerAssets';\n\nexport type ReadOnlyDependencies<T = any> = ReadonlyMap<string, Module<T>>;\n\ntype Options = {\n processModuleFilter: (modules: Module) => boolean;\n assetPlugins: readonly string[];\n platform?: string | null;\n projectRoot: string;\n publicPath: string;\n};\n\ntype MetroModuleCSSMetadata = {\n code: string;\n lineCount: number;\n map: any[];\n};\n\n// s = static\nconst STATIC_EXPORT_DIRECTORY = '_expo/static/css';\n\nexport type JSModule = Module<{\n data: {\n code: string;\n map: unknown;\n lineCount: number;\n css?: {\n code: string;\n map: unknown;\n lineCount: number;\n };\n };\n type: 'js/module';\n}>;\n\nexport function filterJsModules(\n dependencies: ReadOnlyDependencies,\n { processModuleFilter, projectRoot }: Pick<Options, 'projectRoot' | 'processModuleFilter'>\n) {\n const assets: JSModule[] = [];\n\n for (const module of dependencies.values()) {\n if (\n isJsModule(module) &&\n processModuleFilter(module) &&\n getJsOutput(module).type === 'js/module' &&\n path.relative(projectRoot, module.path) !== 'package.json'\n ) {\n assets.push(module as JSModule);\n }\n }\n return assets;\n}\n\nexport function getCssSerialAssets<T extends any>(\n dependencies: ReadOnlyDependencies<T>,\n { processModuleFilter, projectRoot }: Pick<Options, 'projectRoot' | 'processModuleFilter'>\n): SerialAsset[] {\n const assets: SerialAsset[] = [];\n\n for (const module of filterJsModules(dependencies, { processModuleFilter, projectRoot })) {\n const cssMetadata = getCssMetadata(module);\n if (cssMetadata) {\n const contents = cssMetadata.code;\n const filename = path.join(\n // Consistent location\n STATIC_EXPORT_DIRECTORY,\n // Hashed file contents + name for caching\n fileNameFromContents({\n filepath: module.path,\n src: contents,\n }) + '.css'\n );\n const originFilename = path.relative(projectRoot, module.path);\n assets.push({\n type: 'css',\n originFilename,\n filename,\n source: contents,\n metadata: {\n hmrId: pathToHtmlSafeName(originFilename),\n },\n });\n }\n }\n\n return assets;\n}\n\nfunction getCssMetadata(module: JSModule): MetroModuleCSSMetadata | null {\n const data = module.output[0]?.data;\n if (data && typeof data === 'object' && 'css' in data) {\n if (typeof data.css !== 'object' || !('code' in (data as any).css)) {\n throw new Error(\n `Unexpected CSS metadata in Metro module (${module.path}): ${JSON.stringify(data.css)}`\n );\n }\n return data.css as MetroModuleCSSMetadata;\n }\n return null;\n}\n\nexport function fileNameFromContents({ filepath, src }: { filepath: string; src: string }): string {\n return getFileName(filepath) + '-' + hashString(filepath + src);\n}\n\nexport function getFileName(module: string) {\n return path.basename(module).replace(/\\.[^.]+$/, '');\n}\n"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export type SerialAsset = {
2
+ originFilename: string;
3
+ filename: string;
4
+ source: string;
5
+ type: 'css' | 'js';
6
+ metadata: Record<string, string>;
7
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=serializerAssets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serializerAssets.js","names":[],"sources":["../../src/serializer/serializerAssets.ts"],"sourcesContent":["export type SerialAsset = {\n // 'styles.css'\n originFilename: string;\n // '_expo/static/css/bc6aa0a69dcebf8e8cac1faa76705756.css'\n filename: string;\n // '\\ndiv {\\n background: cyan;\\n}\\n\\n'\n source: string;\n type: 'css' | 'js';\n\n metadata: Record<string, string>;\n};\n"],"mappings":""}
@@ -0,0 +1,9 @@
1
+ import { InputConfigT, SerializerConfigT } from 'metro-config';
2
+ import { SerialAsset } from './serializerAssets';
3
+ export type Serializer = NonNullable<SerializerConfigT['customSerializer']>;
4
+ export type SerializerParameters = Parameters<Serializer>;
5
+ export type SerializerPlugin = (...props: SerializerParameters) => SerializerParameters;
6
+ export declare function withExpoSerializers(config: InputConfigT): InputConfigT;
7
+ export declare function withSerializerPlugins(config: InputConfigT, processors: SerializerPlugin[]): InputConfigT;
8
+ export declare function createSerializerFromSerialProcessors(processors: (SerializerPlugin | undefined)[], originalSerializer?: Serializer | null): Serializer;
9
+ export { SerialAsset };