@vxrn/vite-plugin-metro 2.0.0-beta.51.1 → 2.0.0-beta.56.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 (142) hide show
  1. package/dist/cjs/env/platformEnv.cjs +2 -0
  2. package/dist/cjs/env/platformEnv.native.cjs +2 -0
  3. package/dist/cjs/env/platformEnv.native.js +2 -0
  4. package/dist/cjs/env/platformEnv.native.js.map +1 -1
  5. package/dist/cjs/index.cjs +0 -2
  6. package/dist/cjs/index.native.cjs +0 -2
  7. package/dist/cjs/index.native.js +0 -2
  8. package/dist/cjs/index.native.js.map +1 -1
  9. package/dist/cjs/metro-config/getMetroBabelConfigFromViteConfig.cjs +10 -15
  10. package/dist/cjs/metro-config/getMetroBabelConfigFromViteConfig.native.cjs +27 -48
  11. package/dist/cjs/metro-config/getMetroBabelConfigFromViteConfig.native.js +27 -48
  12. package/dist/cjs/metro-config/getMetroBabelConfigFromViteConfig.native.js.map +1 -1
  13. package/dist/cjs/metro-config/getMetroConfigFromViteConfig.cjs +71 -38
  14. package/dist/cjs/metro-config/getMetroConfigFromViteConfig.native.cjs +86 -42
  15. package/dist/cjs/metro-config/getMetroConfigFromViteConfig.native.js +86 -42
  16. package/dist/cjs/metro-config/getMetroConfigFromViteConfig.native.js.map +1 -1
  17. package/dist/cjs/transformer/babel-transformer.cjs +53 -4
  18. package/dist/cjs/transformer/babel-transformer.native.cjs +65 -6
  19. package/dist/cjs/transformer/babel-transformer.native.js +65 -6
  20. package/dist/cjs/transformer/babel-transformer.native.js.map +1 -1
  21. package/dist/cjs/transformer/expoVirtualEnv.cjs +92 -0
  22. package/dist/cjs/transformer/expoVirtualEnv.native.cjs +113 -0
  23. package/dist/cjs/transformer/expoVirtualEnv.native.js +115 -0
  24. package/dist/cjs/transformer/expoVirtualEnv.native.js.map +1 -0
  25. package/dist/cjs/transformer/loadBabelConfig.cjs +1 -1
  26. package/dist/cjs/transformer/loadBabelConfig.native.cjs +1 -1
  27. package/dist/cjs/transformer/loadBabelConfig.native.js +1 -1
  28. package/dist/cjs/transformer/loadBabelConfig.native.js.map +1 -1
  29. package/dist/cjs/transformer/metroNativeWorker.cjs +20 -29
  30. package/dist/cjs/transformer/metroNativeWorker.native.cjs +24 -30
  31. package/dist/cjs/transformer/metroNativeWorker.native.js +24 -30
  32. package/dist/cjs/transformer/metroNativeWorker.native.js.map +1 -1
  33. package/dist/cjs/transformer/transformSync.cjs +3 -3
  34. package/dist/cjs/transformer/transformSync.native.cjs +3 -3
  35. package/dist/cjs/transformer/transformSync.native.js +3 -3
  36. package/dist/cjs/transformer/transformSync.native.js.map +1 -1
  37. package/dist/cjs/utils/exit.cjs +1 -1
  38. package/dist/cjs/utils/exit.native.cjs +1 -1
  39. package/dist/cjs/utils/exit.native.js +1 -1
  40. package/dist/cjs/utils/exit.native.js.map +1 -1
  41. package/dist/esm/env/platformEnv.mjs +2 -0
  42. package/dist/esm/env/platformEnv.mjs.map +1 -1
  43. package/dist/esm/env/platformEnv.native.js +2 -0
  44. package/dist/esm/env/platformEnv.native.js.map +1 -1
  45. package/dist/esm/index.js +1 -2
  46. package/dist/esm/index.mjs +1 -2
  47. package/dist/esm/index.native.js +1 -2
  48. package/dist/esm/metro-config/getMetroBabelConfigFromViteConfig.mjs +11 -15
  49. package/dist/esm/metro-config/getMetroBabelConfigFromViteConfig.mjs.map +1 -1
  50. package/dist/esm/metro-config/getMetroBabelConfigFromViteConfig.native.js +28 -48
  51. package/dist/esm/metro-config/getMetroBabelConfigFromViteConfig.native.js.map +1 -1
  52. package/dist/esm/metro-config/getMetroConfigFromViteConfig.mjs +71 -38
  53. package/dist/esm/metro-config/getMetroConfigFromViteConfig.mjs.map +1 -1
  54. package/dist/esm/metro-config/getMetroConfigFromViteConfig.native.js +86 -42
  55. package/dist/esm/metro-config/getMetroConfigFromViteConfig.native.js.map +1 -1
  56. package/dist/esm/transformer/babel-transformer.mjs +133 -96
  57. package/dist/esm/transformer/babel-transformer.mjs.map +1 -1
  58. package/dist/esm/transformer/babel-transformer.native.js +147 -103
  59. package/dist/esm/transformer/babel-transformer.native.js.map +1 -1
  60. package/dist/esm/transformer/expoVirtualEnv.mjs +67 -0
  61. package/dist/esm/transformer/expoVirtualEnv.mjs.map +1 -0
  62. package/dist/esm/transformer/expoVirtualEnv.native.js +86 -0
  63. package/dist/esm/transformer/expoVirtualEnv.native.js.map +1 -0
  64. package/dist/esm/transformer/loadBabelConfig.mjs +1 -1
  65. package/dist/esm/transformer/loadBabelConfig.mjs.map +1 -1
  66. package/dist/esm/transformer/loadBabelConfig.native.js +1 -1
  67. package/dist/esm/transformer/loadBabelConfig.native.js.map +1 -1
  68. package/dist/esm/transformer/metroNativeWorker.mjs +20 -29
  69. package/dist/esm/transformer/metroNativeWorker.mjs.map +1 -1
  70. package/dist/esm/transformer/metroNativeWorker.native.js +24 -30
  71. package/dist/esm/transformer/metroNativeWorker.native.js.map +1 -1
  72. package/dist/esm/transformer/transformSync.mjs +3 -3
  73. package/dist/esm/transformer/transformSync.mjs.map +1 -1
  74. package/dist/esm/transformer/transformSync.native.js +3 -3
  75. package/dist/esm/transformer/transformSync.native.js.map +1 -1
  76. package/dist/esm/utils/exit.mjs +1 -1
  77. package/dist/esm/utils/exit.mjs.map +1 -1
  78. package/dist/esm/utils/exit.native.js +1 -1
  79. package/dist/esm/utils/exit.native.js.map +1 -1
  80. package/package.json +7 -9
  81. package/src/babel-plugins/import-meta-env-plugin.ts +1 -1
  82. package/src/env/platformEnv.test.ts +12 -2
  83. package/src/env/platformEnv.ts +3 -0
  84. package/src/index.ts +0 -2
  85. package/src/metro-config/getMetroBabelConfigFromViteConfig.test.ts +19 -25
  86. package/src/metro-config/getMetroBabelConfigFromViteConfig.ts +8 -27
  87. package/src/metro-config/getMetroConfigFromViteConfig.test.ts +60 -0
  88. package/src/metro-config/getMetroConfigFromViteConfig.ts +119 -96
  89. package/src/plugins/metroPlugin.ts +3 -6
  90. package/src/transformer/babel-transformer.test.ts +118 -0
  91. package/src/transformer/babel-transformer.ts +82 -15
  92. package/src/transformer/expoVirtualEnv.integration.test.ts +106 -0
  93. package/src/transformer/expoVirtualEnv.test.ts +72 -0
  94. package/src/transformer/expoVirtualEnv.ts +115 -0
  95. package/src/transformer/loadBabelConfig.ts +1 -1
  96. package/src/transformer/metroNativeWorker.test.ts +134 -17
  97. package/src/transformer/metroNativeWorker.ts +43 -51
  98. package/src/transformer/transformSync.test.ts +22 -0
  99. package/src/transformer/transformSync.ts +4 -4
  100. package/src/utils/exit.ts +2 -2
  101. package/src/utils/getTerminalReporter.ts +1 -1
  102. package/src/utils/projectImport.ts +2 -2
  103. package/types/babel-plugins/import-meta-env-plugin.d.ts +1 -1
  104. package/types/env/platformEnv.d.ts +1 -0
  105. package/types/env/platformEnv.d.ts.map +1 -1
  106. package/types/index.d.ts +0 -2
  107. package/types/index.d.ts.map +1 -1
  108. package/types/metro-config/getMetroBabelConfigFromViteConfig.d.ts +1 -1
  109. package/types/metro-config/getMetroBabelConfigFromViteConfig.d.ts.map +1 -1
  110. package/types/metro-config/getMetroConfigFromViteConfig.d.ts +2 -2
  111. package/types/metro-config/getMetroConfigFromViteConfig.d.ts.map +1 -1
  112. package/types/plugins/metroPlugin.d.ts +2 -4
  113. package/types/plugins/metroPlugin.d.ts.map +1 -1
  114. package/types/transformer/babel-transformer.d.ts +10 -1
  115. package/types/transformer/babel-transformer.d.ts.map +1 -1
  116. package/types/transformer/expoVirtualEnv.d.ts +8 -0
  117. package/types/transformer/expoVirtualEnv.d.ts.map +1 -0
  118. package/types/transformer/metroNativeWorker.d.ts +3 -5
  119. package/types/transformer/metroNativeWorker.d.ts.map +1 -1
  120. package/types/utils/projectImport.d.ts +2 -2
  121. package/dist/cjs/plugins/expoManifestRequestHandlerPlugin.cjs +0 -59
  122. package/dist/cjs/plugins/expoManifestRequestHandlerPlugin.native.cjs +0 -62
  123. package/dist/cjs/plugins/expoManifestRequestHandlerPlugin.native.js +0 -64
  124. package/dist/cjs/plugins/expoManifestRequestHandlerPlugin.native.js.map +0 -1
  125. package/dist/cjs/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.cjs +0 -35
  126. package/dist/cjs/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.native.cjs +0 -37
  127. package/dist/cjs/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.native.js +0 -39
  128. package/dist/cjs/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.native.js.map +0 -1
  129. package/dist/esm/plugins/expoManifestRequestHandlerPlugin.mjs +0 -40
  130. package/dist/esm/plugins/expoManifestRequestHandlerPlugin.mjs.map +0 -1
  131. package/dist/esm/plugins/expoManifestRequestHandlerPlugin.native.js +0 -41
  132. package/dist/esm/plugins/expoManifestRequestHandlerPlugin.native.js.map +0 -1
  133. package/dist/esm/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.mjs +0 -15
  134. package/dist/esm/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.mjs.map +0 -1
  135. package/dist/esm/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.native.js +0 -15
  136. package/dist/esm/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.native.js.map +0 -1
  137. package/src/plugins/expoManifestRequestHandlerPlugin.ts +0 -88
  138. package/src/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.ts +0 -28
  139. package/types/plugins/expoManifestRequestHandlerPlugin.d.ts +0 -14
  140. package/types/plugins/expoManifestRequestHandlerPlugin.d.ts.map +0 -1
  141. package/types/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.d.ts +0 -5
  142. package/types/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.d.ts.map +0 -1
@@ -0,0 +1,67 @@
1
+ import { createRequire } from "node:module";
2
+ import { readFileSync } from "node:fs";
3
+ import path from "node:path";
4
+
5
+ function loadExpoParseEnvFile(projectRoot) {
6
+ try {
7
+ const requireFromProject = createRequire(path.join(projectRoot, "package.json"));
8
+ const expoMetroConfigPkg = requireFromProject.resolve("@expo/metro-config/package.json");
9
+ const dotEnvDevelopment = requireFromProject(path.join(path.dirname(expoMetroConfigPkg), "build", "transform-worker", "dot-env-development"));
10
+ return dotEnvDevelopment?.parseEnvFile ?? null;
11
+ } catch {
12
+ return null;
13
+ }
14
+ }
15
+ const virtualEnvPattern = /[\\/]expo[\\/]virtual[\\/]env\.js$/;
16
+ const dotEnvPattern = /(^|[\\/])\.env(\.(local|(development|production)(\.local)?))?$/;
17
+ const developmentEnvFiles = [
18
+ ".env",
19
+ ".env.development",
20
+ ".env.local",
21
+ ".env.development.local"
22
+ ];
23
+ function substituteExpoVirtualEnvSource({ filename, src, projectRoot, dev, environment }) {
24
+ const isClientEnvironment = environment !== "node" && environment !== "react-server";
25
+ if (isClientEnvironment && virtualEnvPattern.test(filename)) {
26
+ if (dev) {
27
+ const fileEnv = {};
28
+ const parseEnvFile = loadExpoParseEnvFile(projectRoot);
29
+ if (parseEnvFile) {
30
+ for (const file of developmentEnvFiles) {
31
+ try {
32
+ Object.assign(fileEnv, parseEnvFile(readFileSync(path.join(projectRoot, file), "utf8"), true));
33
+ } catch (error) {
34
+ if (typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT") {
35
+ continue;
36
+ }
37
+ throw error;
38
+ }
39
+ }
40
+ }
41
+ const relativePath = path.relative(path.dirname(filename), projectRoot).split(path.sep).join("/");
42
+ return `const dotEnvModules = require.context(${JSON.stringify(relativePath)},false,/^\\.\\/\\.env/);
43
+
44
+ export const env = { ...process.env, ...${JSON.stringify(fileEnv)}, ...${JSON.stringify(developmentEnvFiles)}.reduce((acc, file) => {
45
+ const key = './' + file;
46
+ return { ...acc, ...(dotEnvModules.keys().includes(key) ? dotEnvModules(key)?.default : {}) };
47
+ }, {}) };`;
48
+ }
49
+ return `
50
+ export const env = new Proxy({}, {
51
+ get(target, key) {
52
+ throw new Error(\`Attempting to access internal environment variable "\${key}" is not supported in production bundles. Environment variables should be inlined in production by Babel.\`);
53
+ },
54
+ });`;
55
+ }
56
+ if (dotEnvPattern.test(filename)) {
57
+ const parseEnvFile = loadExpoParseEnvFile(projectRoot);
58
+ if (!parseEnvFile) {
59
+ return src;
60
+ }
61
+ return `export default ${JSON.stringify(parseEnvFile(src, isClientEnvironment))};`;
62
+ }
63
+ return src;
64
+ }
65
+
66
+ export { substituteExpoVirtualEnvSource };
67
+ //# sourceMappingURL=expoVirtualEnv.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expoVirtualEnv.js","names":[],"sources":["esm/transformer/expoVirtualEnv.js"],"sourcesContent":["import { createRequire } from \"node:module\";\nimport { readFileSync } from \"node:fs\";\nimport path from \"node:path\";\nfunction loadExpoParseEnvFile(projectRoot) {\n try {\n const requireFromProject = createRequire(path.join(projectRoot, \"package.json\"));\n const expoMetroConfigPkg = requireFromProject.resolve(\n \"@expo/metro-config/package.json\"\n );\n const dotEnvDevelopment = requireFromProject(\n path.join(\n path.dirname(expoMetroConfigPkg),\n \"build\",\n \"transform-worker\",\n \"dot-env-development\"\n )\n );\n return dotEnvDevelopment?.parseEnvFile ?? null;\n } catch {\n return null;\n }\n}\nconst virtualEnvPattern = /[\\\\/]expo[\\\\/]virtual[\\\\/]env\\.js$/;\nconst dotEnvPattern = /(^|[\\\\/])\\.env(\\.(local|(development|production)(\\.local)?))?$/;\nconst developmentEnvFiles = [\n \".env\",\n \".env.development\",\n \".env.local\",\n \".env.development.local\"\n];\nfunction substituteExpoVirtualEnvSource({\n filename,\n src,\n projectRoot,\n dev,\n environment\n}) {\n const isClientEnvironment = environment !== \"node\" && environment !== \"react-server\";\n if (isClientEnvironment && virtualEnvPattern.test(filename)) {\n if (dev) {\n const fileEnv = {};\n const parseEnvFile = loadExpoParseEnvFile(projectRoot);\n if (parseEnvFile) {\n for (const file of developmentEnvFiles) {\n try {\n Object.assign(\n fileEnv,\n parseEnvFile(readFileSync(path.join(projectRoot, file), \"utf8\"), true)\n );\n } catch (error) {\n if (typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\") {\n continue;\n }\n throw error;\n }\n }\n }\n const relativePath = path.relative(path.dirname(filename), projectRoot).split(path.sep).join(\"/\");\n return `const dotEnvModules = require.context(${JSON.stringify(relativePath)},false,/^\\\\.\\\\/\\\\.env/);\n\nexport const env = { ...process.env, ...${JSON.stringify(fileEnv)}, ...${JSON.stringify(developmentEnvFiles)}.reduce((acc, file) => {\n const key = './' + file;\n return { ...acc, ...(dotEnvModules.keys().includes(key) ? dotEnvModules(key)?.default : {}) };\n}, {}) };`;\n }\n return `\nexport const env = new Proxy({}, {\n get(target, key) {\n throw new Error(\\`Attempting to access internal environment variable \"\\${key}\" is not supported in production bundles. Environment variables should be inlined in production by Babel.\\`);\n },\n});`;\n }\n if (dotEnvPattern.test(filename)) {\n const parseEnvFile = loadExpoParseEnvFile(projectRoot);\n if (!parseEnvFile) {\n return src;\n }\n return `export default ${JSON.stringify(parseEnvFile(src, isClientEnvironment))};`;\n }\n return src;\n}\nexport {\n substituteExpoVirtualEnvSource\n};\n//# sourceMappingURL=expoVirtualEnv.js.map\n"],"mappings":";;;;;AAGA,SAAS,qBAAqB,aAAa;CACzC,IAAI;EACF,MAAM,qBAAqB,cAAc,KAAK,KAAK,aAAa,cAAc,CAAC;EAC/E,MAAM,qBAAqB,mBAAmB,QAC5C,iCACF;EACA,MAAM,oBAAoB,mBACxB,KAAK,KACH,KAAK,QAAQ,kBAAkB,GAC/B,SACA,oBACA,qBACF,CACF;EACA,OAAO,mBAAmB,gBAAgB;CAC5C,QAAQ;EACN,OAAO;CACT;AACF;AACA,MAAM,oBAAoB;AAC1B,MAAM,gBAAgB;AACtB,MAAM,sBAAsB;CAC1B;CACA;CACA;CACA;AACF;AACA,SAAS,+BAA+B,EACtC,UACA,KACA,aACA,KACA,eACC;CACD,MAAM,sBAAsB,gBAAgB,UAAU,gBAAgB;CACtE,IAAI,uBAAuB,kBAAkB,KAAK,QAAQ,GAAG;EAC3D,IAAI,KAAK;GACP,MAAM,UAAU,CAAC;GACjB,MAAM,eAAe,qBAAqB,WAAW;GACrD,IAAI,cAAc;IAChB,KAAK,MAAM,QAAQ,qBAAqB;KACtC,IAAI;MACF,OAAO,OACL,SACA,aAAa,aAAa,KAAK,KAAK,aAAa,IAAI,GAAG,MAAM,GAAG,IAAI,CACvE;KACF,SAAS,OAAO;MACd,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,UAAU,SAAS,MAAM,SAAS,UAAU;OAC7F;MACF;MACA,MAAM;KACR;IACF;GACF;GACA,MAAM,eAAe,KAAK,SAAS,KAAK,QAAQ,QAAQ,GAAG,WAAW,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG;GAChG,OAAO,yCAAyC,KAAK,UAAU,YAAY,EAAE;;0CAEzC,KAAK,UAAU,OAAO,EAAE,OAAO,KAAK,UAAU,mBAAmB,EAAE;;;;EAIzG;EACA,OAAO;;;;;;CAMT;CACA,IAAI,cAAc,KAAK,QAAQ,GAAG;EAChC,MAAM,eAAe,qBAAqB,WAAW;EACrD,IAAI,CAAC,cAAc;GACjB,OAAO;EACT;EACA,OAAO,kBAAkB,KAAK,UAAU,aAAa,KAAK,mBAAmB,CAAC,EAAE;CAClF;CACA,OAAO;AACT"}
@@ -0,0 +1,86 @@
1
+ import { createRequire } from "module";
2
+ import { readFileSync } from "fs";
3
+ import path from "path";
4
+
5
+ function loadExpoParseEnvFile(projectRoot) {
6
+ try {
7
+ var _ref;
8
+ var requireFromProject = createRequire(path.join(projectRoot, "package.json"));
9
+ var expoMetroConfigPkg = requireFromProject.resolve("@expo/metro-config/package.json");
10
+ var dotEnvDevelopment = requireFromProject(path.join(path.dirname(expoMetroConfigPkg), "build", "transform-worker", "dot-env-development"));
11
+ return (_ref = dotEnvDevelopment === null || dotEnvDevelopment === void 0 ? void 0 : dotEnvDevelopment.parseEnvFile) !== null && _ref !== void 0 ? _ref : null;
12
+ } catch (unused) {
13
+ return null;
14
+ }
15
+ }
16
+ var virtualEnvPattern = /[\\/]expo[\\/]virtual[\\/]env\.js$/;
17
+ var dotEnvPattern = /(^|[\\/])\.env(\.(local|(development|production)(\.local)?))?$/;
18
+ var developmentEnvFiles = [
19
+ ".env",
20
+ ".env.development",
21
+ ".env.local",
22
+ ".env.development.local"
23
+ ];
24
+ function substituteExpoVirtualEnvSource(param) {
25
+ var { filename, src, projectRoot, dev, environment } = param;
26
+ var isClientEnvironment = environment !== "node" && environment !== "react-server";
27
+ if (isClientEnvironment && virtualEnvPattern.test(filename)) {
28
+ if (dev) {
29
+ var fileEnv = {};
30
+ var parseEnvFile = loadExpoParseEnvFile(projectRoot);
31
+ if (parseEnvFile) {
32
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
33
+ try {
34
+ for (var _iterator = developmentEnvFiles[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
35
+ var file = _step.value;
36
+ try {
37
+ Object.assign(fileEnv, parseEnvFile(readFileSync(path.join(projectRoot, file), "utf8"), true));
38
+ } catch (error) {
39
+ if (typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT") {
40
+ continue;
41
+ }
42
+ throw error;
43
+ }
44
+ }
45
+ } catch (err) {
46
+ _didIteratorError = true;
47
+ _iteratorError = err;
48
+ } finally {
49
+ try {
50
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
51
+ _iterator.return();
52
+ }
53
+ } finally {
54
+ if (_didIteratorError) {
55
+ throw _iteratorError;
56
+ }
57
+ }
58
+ }
59
+ }
60
+ var relativePath = path.relative(path.dirname(filename), projectRoot).split(path.sep).join("/");
61
+ return `const dotEnvModules = require.context(${JSON.stringify(relativePath)},false,/^\\.\\/\\.env/);
62
+
63
+ export const env = { ...process.env, ...${JSON.stringify(fileEnv)}, ...${JSON.stringify(developmentEnvFiles)}.reduce((acc, file) => {
64
+ const key = './' + file;
65
+ return { ...acc, ...(dotEnvModules.keys().includes(key) ? dotEnvModules(key)?.default : {}) };
66
+ }, {}) };`;
67
+ }
68
+ return `
69
+ export const env = new Proxy({}, {
70
+ get(target, key) {
71
+ throw new Error(\`Attempting to access internal environment variable "\${key}" is not supported in production bundles. Environment variables should be inlined in production by Babel.\`);
72
+ },
73
+ });`;
74
+ }
75
+ if (dotEnvPattern.test(filename)) {
76
+ var parseEnvFile1 = loadExpoParseEnvFile(projectRoot);
77
+ if (!parseEnvFile1) {
78
+ return src;
79
+ }
80
+ return `export default ${JSON.stringify(parseEnvFile1(src, isClientEnvironment))};`;
81
+ }
82
+ return src;
83
+ }
84
+
85
+ export { substituteExpoVirtualEnvSource };
86
+ //# sourceMappingURL=expoVirtualEnv.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expoVirtualEnv.native.js","names":[],"sources":["esm/transformer/expoVirtualEnv.native.js"],"sourcesContent":["import { createRequire } from \"module\";\nimport { readFileSync } from \"fs\";\nimport path from \"path\";\nfunction loadExpoParseEnvFile(projectRoot) {\n try {\n var _ref;\n var requireFromProject = createRequire(path.join(projectRoot, \"package.json\"));\n var expoMetroConfigPkg = requireFromProject.resolve(\"@expo/metro-config/package.json\");\n var dotEnvDevelopment = requireFromProject(path.join(path.dirname(expoMetroConfigPkg), \"build\", \"transform-worker\", \"dot-env-development\"));\n return (_ref = dotEnvDevelopment === null || dotEnvDevelopment === void 0 ? void 0 : dotEnvDevelopment.parseEnvFile) !== null && _ref !== void 0 ? _ref : null;\n } catch (unused) {\n return null;\n }\n}\nvar virtualEnvPattern = /[\\\\/]expo[\\\\/]virtual[\\\\/]env\\.js$/;\nvar dotEnvPattern = /(^|[\\\\/])\\.env(\\.(local|(development|production)(\\.local)?))?$/;\nvar developmentEnvFiles = [\n \".env\",\n \".env.development\",\n \".env.local\",\n \".env.development.local\"\n];\nfunction substituteExpoVirtualEnvSource(param) {\n var { filename, src, projectRoot, dev, environment } = param;\n var isClientEnvironment = environment !== \"node\" && environment !== \"react-server\";\n if (isClientEnvironment && virtualEnvPattern.test(filename)) {\n if (dev) {\n var fileEnv = {};\n var parseEnvFile = loadExpoParseEnvFile(projectRoot);\n if (parseEnvFile) {\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;\n try {\n for (var _iterator = developmentEnvFiles[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var file = _step.value;\n try {\n Object.assign(fileEnv, parseEnvFile(readFileSync(path.join(projectRoot, file), \"utf8\"), true));\n } catch (error) {\n if (typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\") {\n continue;\n }\n throw error;\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n }\n var relativePath = path.relative(path.dirname(filename), projectRoot).split(path.sep).join(\"/\");\n return `const dotEnvModules = require.context(${JSON.stringify(relativePath)},false,/^\\\\.\\\\/\\\\.env/);\n\nexport const env = { ...process.env, ...${JSON.stringify(fileEnv)}, ...${JSON.stringify(developmentEnvFiles)}.reduce((acc, file) => {\n const key = './' + file;\n return { ...acc, ...(dotEnvModules.keys().includes(key) ? dotEnvModules(key)?.default : {}) };\n}, {}) };`;\n }\n return `\nexport const env = new Proxy({}, {\n get(target, key) {\n throw new Error(\\`Attempting to access internal environment variable \"\\${key}\" is not supported in production bundles. Environment variables should be inlined in production by Babel.\\`);\n },\n});`;\n }\n if (dotEnvPattern.test(filename)) {\n var parseEnvFile1 = loadExpoParseEnvFile(projectRoot);\n if (!parseEnvFile1) {\n return src;\n }\n return `export default ${JSON.stringify(parseEnvFile1(src, isClientEnvironment))};`;\n }\n return src;\n}\nexport {\n substituteExpoVirtualEnvSource\n};\n//# sourceMappingURL=expoVirtualEnv.js.map\n"],"mappings":";;;;;AAGA,SAAS,qBAAqB,aAAa;CACzC,IAAI;EACF,IAAI;EACJ,IAAI,qBAAqB,cAAc,KAAK,KAAK,aAAa,cAAc,CAAC;EAC7E,IAAI,qBAAqB,mBAAmB,QAAQ,iCAAiC;EACrF,IAAI,oBAAoB,mBAAmB,KAAK,KAAK,KAAK,QAAQ,kBAAkB,GAAG,SAAS,oBAAoB,qBAAqB,CAAC;EAC1I,QAAQ,OAAO,sBAAsB,QAAQ,sBAAsB,KAAK,IAAI,KAAK,IAAI,kBAAkB,kBAAkB,QAAQ,SAAS,KAAK,IAAI,OAAO;CAC5J,SAAS,QAAQ;EACf,OAAO;CACT;AACF;AACA,IAAI,oBAAoB;AACxB,IAAI,gBAAgB;AACpB,IAAI,sBAAsB;CACxB;CACA;CACA;CACA;AACF;AACA,SAAS,+BAA+B,OAAO;CAC7C,IAAI,EAAE,UAAU,KAAK,aAAa,KAAK,gBAAgB;CACvD,IAAI,sBAAsB,gBAAgB,UAAU,gBAAgB;CACpE,IAAI,uBAAuB,kBAAkB,KAAK,QAAQ,GAAG;EAC3D,IAAI,KAAK;GACP,IAAI,UAAU,CAAC;GACf,IAAI,eAAe,qBAAqB,WAAW;GACnD,IAAI,cAAc;IAChB,IAAI,4BAA4B,MAAM,oBAAoB,OAAO,iBAAiB,KAAK;IACvF,IAAI;KACF,KAAK,IAAI,YAAY,oBAAoB,OAAO,SAAS,CAAC,GAAG,OAAO,EAAE,6BAA6B,QAAQ,UAAU,KAAK,EAAC,CAAE,OAAO,4BAA4B,MAAM;MACpK,IAAI,OAAO,MAAM;MACjB,IAAI;OACF,OAAO,OAAO,SAAS,aAAa,aAAa,KAAK,KAAK,aAAa,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC;MAC/F,SAAS,OAAO;OACd,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,UAAU,SAAS,MAAM,SAAS,UAAU;QAC7F;OACF;OACA,MAAM;MACR;KACF;IACF,SAAS,KAAK;KACZ,oBAAoB;KACpB,iBAAiB;IACnB,UAAU;KACR,IAAI;MACF,IAAI,CAAC,6BAA6B,UAAU,UAAU,MAAM;OAC1D,UAAU,OAAO;MACnB;KACF,UAAU;MACR,IAAI,mBAAmB;OACrB,MAAM;MACR;KACF;IACF;GACF;GACA,IAAI,eAAe,KAAK,SAAS,KAAK,QAAQ,QAAQ,GAAG,WAAW,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG;GAC9F,OAAO,yCAAyC,KAAK,UAAU,YAAY,EAAE;;0CAEzC,KAAK,UAAU,OAAO,EAAE,OAAO,KAAK,UAAU,mBAAmB,EAAE;;;;EAIzG;EACA,OAAO;;;;;;CAMT;CACA,IAAI,cAAc,KAAK,QAAQ,GAAG;EAChC,IAAI,gBAAgB,qBAAqB,WAAW;EACpD,IAAI,CAAC,eAAe;GAClB,OAAO;EACT;EACA,OAAO,kBAAkB,KAAK,UAAU,cAAc,KAAK,mBAAmB,CAAC,EAAE;CACnF;CACA,OAAO;AACT"}
@@ -24,7 +24,7 @@ const loadBabelConfig = /* @__PURE__ */ (() => {
24
24
  }
25
25
  }
26
26
  if (!babelRC.extends) {
27
- babelRC.presets = [require("babel-preset-expo")];
27
+ babelRC.presets = [require("@react-native/babel-preset")];
28
28
  }
29
29
  return babelRC;
30
30
  };
@@ -1 +1 @@
1
- {"version":3,"file":"loadBabelConfig.js","names":[],"sources":["esm/transformer/loadBabelConfig.js"],"sourcesContent":["import fs from \"node:fs\";\nimport path from \"node:path\";\nconst loadBabelConfig = /* @__PURE__ */ (() => {\n let babelRC = null;\n return function _getBabelRC({ projectRoot }) {\n if (babelRC !== null) {\n return babelRC;\n }\n babelRC = {};\n if (projectRoot) {\n const possibleBabelRCPaths = [\n \".babelrc\",\n \".babelrc.js\",\n \".babelrc.json\",\n \"babel.config.js\",\n \"babel.config.cjs\",\n \"babel.config.mjs\",\n \"babel.config.json\"\n ];\n const foundBabelRCPath = possibleBabelRCPaths.find(\n (configFileName) => fs.existsSync(path.resolve(projectRoot, configFileName))\n );\n if (foundBabelRCPath) {\n babelRC.extends = path.resolve(projectRoot, foundBabelRCPath);\n }\n }\n if (!babelRC.extends) {\n babelRC.presets = [\n // { plugins: [transformImportMetaGlobPlugin] }, // Added to support Vite's `import.meta.glob`\n require(\"babel-preset-expo\")\n ];\n }\n return babelRC;\n };\n})();\nexport {\n loadBabelConfig\n};\n//# sourceMappingURL=loadBabelConfig.js.map\n"],"mappings":";;;;;;;;;;;AAEA,MAAM,kBAAkC,uBAAO;CAC7C,IAAI,UAAU;CACd,OAAO,SAAS,YAAY,EAAE,eAAe;EAC3C,IAAI,YAAY,MAAM;GACpB,OAAO;EACT;EACA,UAAU,CAAC;EACX,IAAI,aAAa;GACf,MAAM,uBAAuB;IAC3B;IACA;IACA;IACA;IACA;IACA;IACA;GACF;GACA,MAAM,mBAAmB,qBAAqB,MAC3C,mBAAmB,GAAG,WAAW,KAAK,QAAQ,aAAa,cAAc,CAAC,CAC7E;GACA,IAAI,kBAAkB;IACpB,QAAQ,UAAU,KAAK,QAAQ,aAAa,gBAAgB;GAC9D;EACF;EACA,IAAI,CAAC,QAAQ,SAAS;GACpB,QAAQ,UAAU,WAER,mBAAmB,CAC7B;EACF;EACA,OAAO;CACT;AACF,EAAC,CAAE"}
1
+ {"version":3,"file":"loadBabelConfig.js","names":[],"sources":["esm/transformer/loadBabelConfig.js"],"sourcesContent":["import fs from \"node:fs\";\nimport path from \"node:path\";\nconst loadBabelConfig = /* @__PURE__ */ (() => {\n let babelRC = null;\n return function _getBabelRC({ projectRoot }) {\n if (babelRC !== null) {\n return babelRC;\n }\n babelRC = {};\n if (projectRoot) {\n const possibleBabelRCPaths = [\n \".babelrc\",\n \".babelrc.js\",\n \".babelrc.json\",\n \"babel.config.js\",\n \"babel.config.cjs\",\n \"babel.config.mjs\",\n \"babel.config.json\"\n ];\n const foundBabelRCPath = possibleBabelRCPaths.find(\n (configFileName) => fs.existsSync(path.resolve(projectRoot, configFileName))\n );\n if (foundBabelRCPath) {\n babelRC.extends = path.resolve(projectRoot, foundBabelRCPath);\n }\n }\n if (!babelRC.extends) {\n babelRC.presets = [\n // { plugins: [transformImportMetaGlobPlugin] }, // Added to support Vite's `import.meta.glob`\n require(\"@react-native/babel-preset\")\n ];\n }\n return babelRC;\n };\n})();\nexport {\n loadBabelConfig\n};\n//# sourceMappingURL=loadBabelConfig.js.map\n"],"mappings":";;;;;;;;;;;AAEA,MAAM,kBAAkC,uBAAO;CAC7C,IAAI,UAAU;CACd,OAAO,SAAS,YAAY,EAAE,eAAe;EAC3C,IAAI,YAAY,MAAM;GACpB,OAAO;EACT;EACA,UAAU,CAAC;EACX,IAAI,aAAa;GACf,MAAM,uBAAuB;IAC3B;IACA;IACA;IACA;IACA;IACA;IACA;GACF;GACA,MAAM,mBAAmB,qBAAqB,MAC3C,mBAAmB,GAAG,WAAW,KAAK,QAAQ,aAAa,cAAc,CAAC,CAC7E;GACA,IAAI,kBAAkB;IACpB,QAAQ,UAAU,KAAK,QAAQ,aAAa,gBAAgB;GAC9D;EACF;EACA,IAAI,CAAC,QAAQ,SAAS;GACpB,QAAQ,UAAU,WAER,4BAA4B,CACtC;EACF;EACA,OAAO;CACT;AACF,EAAC,CAAE"}
@@ -27,7 +27,7 @@ var loadBabelConfig = /* @__PURE__ */ (function() {
27
27
  }
28
28
  }
29
29
  if (!babelRC.extends) {
30
- babelRC.presets = [require("babel-preset-expo")];
30
+ babelRC.presets = [require("@react-native/babel-preset")];
31
31
  }
32
32
  return babelRC;
33
33
  };
@@ -1 +1 @@
1
- {"version":3,"file":"loadBabelConfig.native.js","names":[],"sources":["esm/transformer/loadBabelConfig.native.js"],"sourcesContent":["import fs from \"fs\";\nimport path from \"path\";\nvar loadBabelConfig = /* @__PURE__ */ (function() {\n var babelRC = null;\n return function _getBabelRC(param) {\n var { projectRoot } = param;\n if (babelRC !== null) {\n return babelRC;\n }\n babelRC = {};\n if (projectRoot) {\n var possibleBabelRCPaths = [\n \".babelrc\",\n \".babelrc.js\",\n \".babelrc.json\",\n \"babel.config.js\",\n \"babel.config.cjs\",\n \"babel.config.mjs\",\n \"babel.config.json\"\n ];\n var foundBabelRCPath = possibleBabelRCPaths.find(function(configFileName) {\n return fs.existsSync(path.resolve(projectRoot, configFileName));\n });\n if (foundBabelRCPath) {\n babelRC.extends = path.resolve(projectRoot, foundBabelRCPath);\n }\n }\n if (!babelRC.extends) {\n babelRC.presets = [\n // { plugins: [transformImportMetaGlobPlugin] }, // Added to support Vite's `import.meta.glob`\n require(\"babel-preset-expo\")\n ];\n }\n return babelRC;\n };\n})();\nexport {\n loadBabelConfig\n};\n//# sourceMappingURL=loadBabelConfig.js.map\n"],"mappings":";;;;;;;;;;;AAEA,IAAI,kBAAkC,iBAAC,WAAW;CAChD,IAAI,UAAU;CACd,OAAO,SAAS,YAAY,OAAO;EACjC,IAAI,EAAE,gBAAgB;EACtB,IAAI,YAAY,MAAM;GACpB,OAAO;EACT;EACA,UAAU,CAAC;EACX,IAAI,aAAa;GACf,IAAI,uBAAuB;IACzB;IACA;IACA;IACA;IACA;IACA;IACA;GACF;GACA,IAAI,mBAAmB,qBAAqB,KAAK,SAAS,gBAAgB;IACxE,OAAO,GAAG,WAAW,KAAK,QAAQ,aAAa,cAAc,CAAC;GAChE,CAAC;GACD,IAAI,kBAAkB;IACpB,QAAQ,UAAU,KAAK,QAAQ,aAAa,gBAAgB;GAC9D;EACF;EACA,IAAI,CAAC,QAAQ,SAAS;GACpB,QAAQ,UAAU,WAER,mBAAmB,CAC7B;EACF;EACA,OAAO;CACT;AACF,EAAC,CAAE"}
1
+ {"version":3,"file":"loadBabelConfig.native.js","names":[],"sources":["esm/transformer/loadBabelConfig.native.js"],"sourcesContent":["import fs from \"fs\";\nimport path from \"path\";\nvar loadBabelConfig = /* @__PURE__ */ (function() {\n var babelRC = null;\n return function _getBabelRC(param) {\n var { projectRoot } = param;\n if (babelRC !== null) {\n return babelRC;\n }\n babelRC = {};\n if (projectRoot) {\n var possibleBabelRCPaths = [\n \".babelrc\",\n \".babelrc.js\",\n \".babelrc.json\",\n \"babel.config.js\",\n \"babel.config.cjs\",\n \"babel.config.mjs\",\n \"babel.config.json\"\n ];\n var foundBabelRCPath = possibleBabelRCPaths.find(function(configFileName) {\n return fs.existsSync(path.resolve(projectRoot, configFileName));\n });\n if (foundBabelRCPath) {\n babelRC.extends = path.resolve(projectRoot, foundBabelRCPath);\n }\n }\n if (!babelRC.extends) {\n babelRC.presets = [\n // { plugins: [transformImportMetaGlobPlugin] }, // Added to support Vite's `import.meta.glob`\n require(\"@react-native/babel-preset\")\n ];\n }\n return babelRC;\n };\n})();\nexport {\n loadBabelConfig\n};\n//# sourceMappingURL=loadBabelConfig.js.map\n"],"mappings":";;;;;;;;;;;AAEA,IAAI,kBAAkC,iBAAC,WAAW;CAChD,IAAI,UAAU;CACd,OAAO,SAAS,YAAY,OAAO;EACjC,IAAI,EAAE,gBAAgB;EACtB,IAAI,YAAY,MAAM;GACpB,OAAO;EACT;EACA,UAAU,CAAC;EACX,IAAI,aAAa;GACf,IAAI,uBAAuB;IACzB;IACA;IACA;IACA;IACA;IACA;IACA;GACF;GACA,IAAI,mBAAmB,qBAAqB,KAAK,SAAS,gBAAgB;IACxE,OAAO,GAAG,WAAW,KAAK,QAAQ,aAAa,cAAc,CAAC;GAChE,CAAC;GACD,IAAI,kBAAkB;IACpB,QAAQ,UAAU,KAAK,QAAQ,aAAa,gBAAgB;GAC9D;EACF;EACA,IAAI,CAAC,QAAQ,SAAS;GACpB,QAAQ,UAAU,WAER,4BAA4B,CACtC;EACF;EACA,OAAO;CACT;AACF,EAAC,CAAE"}
@@ -7,6 +7,8 @@ import MagicString from "magic-string";
7
7
  import remapping from "@jridgewell/remapping";
8
8
  import { TraceMap, eachMapping } from "@jridgewell/trace-mapping";
9
9
  import { shouldStripFlow, stripFlowTypes, transformHermesAsync, transformHermesLoops, transformReactNativeCodegen } from "@vxrn/compiler";
10
+ import { withExpoPublicEnvAliases } from "@vxrn/utils/publicEnv";
11
+ import { substituteExpoVirtualEnvSource } from "./expoVirtualEnv.mjs";
10
12
  import { getPlatformEnv, metroPlatformToViteEnvironment } from "../env/platformEnv.mjs";
11
13
 
12
14
  function collectModuleLiteralBindings(program) {
@@ -240,6 +242,11 @@ function applyInlineEnvVars(code, filename, isProduction, env = {}) {
240
242
  throw new Error(`[vxrn/metro] Failed to parse ${filename} for env inlining: ${parsed.errors[0].message}`);
241
243
  }
242
244
  if (!parsed?.program) return code;
245
+ const processPublicEnv = Object.fromEntries(Object.entries(process.env).filter(([key]) => key.startsWith("ONE_PUBLIC_") || key.startsWith("EXPO_PUBLIC_")));
246
+ const effectiveEnv = withExpoPublicEnvAliases({
247
+ ...processPublicEnv,
248
+ ...env
249
+ });
243
250
  const ms = new MagicString(code);
244
251
  const edits = [];
245
252
  const known = /* @__PURE__ */ new Map();
@@ -272,27 +279,24 @@ function applyInlineEnvVars(code, filename, isProduction, env = {}) {
272
279
  replace(node, process.env.ONE_SERVER_URL || "");
273
280
  return;
274
281
  }
275
- if (isProcessEnv && !isAssignmentTarget && key?.startsWith("EXPO_PUBLIC_")) {
276
- throw new Error(`[vxrn/metro] ${key} uses the removed expo prefix. rename it to ONE_PUBLIC_*`);
277
- }
278
- if (isProcessEnv && !isAssignmentTarget && key?.startsWith("ONE_PUBLIC_")) {
279
- replace(node, env[key] ?? process.env[key] ?? void 0);
282
+ if (isProcessEnv && !isAssignmentTarget && (key?.startsWith("ONE_PUBLIC_") || key?.startsWith("EXPO_PUBLIC_"))) {
283
+ replace(node, effectiveEnv[key] ?? void 0);
280
284
  return;
281
285
  }
282
286
  if (!isAssignmentTarget && isMember && isImportMeta(obj.object) && keyOf(obj.property, obj.computed) === "env" && key !== void 0) {
283
- replace(node, env[key]);
287
+ replace(node, effectiveEnv[key]);
284
288
  return;
285
289
  }
286
290
  if (!isAssignmentTarget && isImportMeta(obj) && key === "env") {
287
291
  edits.push({
288
292
  start: node.start,
289
293
  end: node.end,
290
- text: JSON.stringify(env)
294
+ text: JSON.stringify(effectiveEnv)
291
295
  });
292
296
  return;
293
297
  }
294
- if (isProcessEnv && !isAssignmentTarget && key !== void 0 && key in env) {
295
- replace(node, env[key]);
298
+ if (isProcessEnv && !isAssignmentTarget && key !== void 0 && key in effectiveEnv) {
299
+ replace(node, effectiveEnv[key]);
296
300
  return;
297
301
  }
298
302
  }
@@ -1078,26 +1082,13 @@ async function configureWorkletsForWorker(projectRoot) {
1078
1082
  async function transform(config, projectRoot, filename, data, options) {
1079
1083
  assertNoUnportedBabelPlugins(options);
1080
1084
  let sourceCode = typeof data === "string" ? data : data.toString("utf8");
1081
- const environment = options.customTransformOptions?.environment;
1082
- const isClientEnvironment = environment !== "node" && environment !== "react-server";
1083
- if (isClientEnvironment && /[\\/]expo[\\/]virtual[\\/]env\.js$/.test(filename)) {
1084
- if (options.dev) {
1085
- const rel = path.relative(path.dirname(filename), projectRoot).split(path.sep).join("/");
1086
- sourceCode = `const dotEnvModules = require.context(${JSON.stringify(rel)},false,/^\\.\\/\\.env/);
1087
- export const env = !dotEnvModules.keys().length ? process.env : { ...process.env, ...['.env', '.env.development', '.env.local', '.env.development.local'].reduce((acc, file) => {
1088
- return { ...acc, ...(dotEnvModules(file)?.default ?? {}) };
1089
- }, {}) };`;
1090
- } else {
1091
- sourceCode = `export const env = new Proxy({}, {
1092
- get(target, key) {
1093
- throw new Error(\`Attempting to access internal environment variable "\${String(key)}" is not supported in production bundles.\`);
1094
- },
1095
- });`;
1096
- }
1097
- } else if (/(^|[\\/])\.env(\.(local|(development|production)(\.local)?))?$/.test(filename)) {
1098
- const { parseEnvFile } = await import("@expo/metro-config/build/transform-worker/dot-env-development");
1099
- sourceCode = `export default ${JSON.stringify(parseEnvFile(sourceCode, isClientEnvironment))};`;
1100
- }
1085
+ sourceCode = substituteExpoVirtualEnvSource({
1086
+ filename,
1087
+ src: sourceCode,
1088
+ projectRoot,
1089
+ dev: options.dev,
1090
+ environment: options.customTransformOptions?.environment
1091
+ });
1101
1092
  checkReservedStrings(sourceCode, config, options);
1102
1093
  if (filename.endsWith(".json")) {
1103
1094
  try {