vxrn 2.8.1 → 2.9.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 (54) hide show
  1. package/dist/exports/clean.mjs +128 -19
  2. package/dist/exports/clean.mjs.map +1 -1
  3. package/dist/exports/clean.native.js +147 -21
  4. package/dist/exports/clean.native.js.map +1 -1
  5. package/dist/exports/prebuild.mjs +2 -1
  6. package/dist/exports/prebuild.mjs.map +1 -1
  7. package/dist/exports/prebuild.native.js +2 -1
  8. package/dist/exports/prebuild.native.js.map +1 -1
  9. package/dist/exports/prebuildWithoutExpo.mjs +196 -7
  10. package/dist/exports/prebuildWithoutExpo.mjs.map +1 -1
  11. package/dist/exports/prebuildWithoutExpo.native.js +280 -42
  12. package/dist/exports/prebuildWithoutExpo.native.js.map +1 -1
  13. package/dist/plugins/reactNativeDevServer.mjs +43 -8
  14. package/dist/plugins/reactNativeDevServer.mjs.map +1 -1
  15. package/dist/plugins/reactNativeDevServer.native.js +45 -8
  16. package/dist/plugins/reactNativeDevServer.native.js.map +1 -1
  17. package/dist/user-interface/index.mjs +31 -24
  18. package/dist/user-interface/index.mjs.map +1 -1
  19. package/dist/user-interface/index.native.js +32 -25
  20. package/dist/user-interface/index.native.js.map +1 -1
  21. package/dist/utils/createNativeDevEngine.mjs +111 -14
  22. package/dist/utils/createNativeDevEngine.mjs.map +1 -1
  23. package/dist/utils/createNativeDevEngine.native.js +143 -14
  24. package/dist/utils/createNativeDevEngine.native.js.map +1 -1
  25. package/dist/utils/scanDepsToOptimize.mjs +10 -6
  26. package/dist/utils/scanDepsToOptimize.mjs.map +1 -1
  27. package/dist/utils/scanDepsToOptimize.native.js +12 -6
  28. package/dist/utils/scanDepsToOptimize.native.js.map +1 -1
  29. package/expo-plugin.cjs +71 -8
  30. package/package.json +14 -14
  31. package/src/exports/clean.test.ts +502 -5
  32. package/src/exports/clean.ts +176 -19
  33. package/src/exports/expoPlugin.test.mjs +44 -1
  34. package/src/exports/prebuild.ts +6 -0
  35. package/src/exports/prebuildWithoutExpo.test.ts +134 -2
  36. package/src/exports/prebuildWithoutExpo.ts +235 -10
  37. package/src/plugins/reactNativeDevServer.test.ts +75 -1
  38. package/src/plugins/reactNativeDevServer.ts +45 -8
  39. package/src/user-interface/index.ts +50 -42
  40. package/src/utils/createNativeDevEngine.test.ts +480 -1
  41. package/src/utils/createNativeDevEngine.ts +220 -17
  42. package/src/utils/imageSizePatch.test.ts +3 -3
  43. package/src/utils/scanDepsToOptimize.test.ts +35 -2
  44. package/src/utils/scanDepsToOptimize.ts +25 -8
  45. package/types/exports/clean.d.ts.map +1 -1
  46. package/types/exports/prebuild.d.ts +2 -1
  47. package/types/exports/prebuild.d.ts.map +1 -1
  48. package/types/exports/prebuildWithoutExpo.d.ts.map +1 -1
  49. package/types/plugins/reactNativeDevServer.d.ts.map +1 -1
  50. package/types/user-interface/index.d.ts.map +1 -1
  51. package/types/utils/createNativeDevEngine.d.ts +1 -1
  52. package/types/utils/createNativeDevEngine.d.ts.map +1 -1
  53. package/types/utils/scanDepsToOptimize.d.ts +25 -0
  54. package/types/utils/scanDepsToOptimize.d.ts.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["user-interface/index.js"],"sourcesContent":["import { exec } from \"node:child_process\";\nimport { getBoundPort } from \"../utils/getBoundPort\";\nimport { nativeRun } from \"../utils/nativeRun\";\nconst COMMANDS = [\n {\n keys: \"ow\",\n label: \"open web\",\n terminalLabel: \"\\x1B[1mo\\x1B[0mpen \\x1B[1mw\\x1B[0meb\",\n action: (ctx) => {\n const url = ctx.server.resolvedUrls?.local[0];\n if (!url) {\n console.warn(\"Cannot get the local server URL.\");\n return;\n }\n nativeOpen(url);\n }\n },\n {\n keys: \"oi\",\n label: \"open app in iOS Simulator\",\n terminalLabel: \"\\x1B[1mo\\x1B[0mpen app in \\x1B[1mi\\x1B[0mOS Simulator\",\n action: (ctx) => {\n openIos(ctx);\n }\n },\n {\n keys: \"oa\",\n label: \"open app in Android Emulator\",\n terminalLabel: \"\\x1B[1mo\\x1B[0mpen app in \\x1B[1mA\\x1B[0mndroid Emulator\",\n action: (ctx) => {\n openAndroid(ctx);\n }\n },\n {\n keys: \"oe\",\n label: \"open editor\",\n terminalLabel: \"\\x1B[1mo\\x1B[0mpen \\x1B[1me\\x1B[0mditor\",\n action: async (ctx) => {\n const { defaultEditor } = await import(\"env-editor\");\n exec(`${defaultEditor().binary} .`);\n }\n },\n // TODO this would need to be per-platform\n {\n keys: \"dt\",\n label: \"open React Native DevTools\",\n terminalLabel: \"open React Native \\x1B[1mD\\x1B[0mev\\x1B[1mT\\x1B[0mools\",\n action: (ctx) => {\n const { host, port } = ctx.server.config.server;\n const serverUrl = `http://${typeof host === \"string\" && !!host ? host : \"localhost\"}:${port}`;\n const url = new URL(\"/open-debugger\", serverUrl);\n (async () => {\n const response = await fetch(url, {\n method: \"POST\",\n signal: AbortSignal.timeout(3e3)\n }).catch((error) => {\n if (error.name === \"TimeoutError\") {\n return null;\n }\n throw error;\n });\n if (!response) {\n } else if (response.ok === false) {\n const responseText = await response.text();\n if (responseText.includes(\"Unable to find debugger target\")) {\n return;\n }\n console.warn(\n `Failed to open React Native DevTools, ${url} returns ${response.status}: ${responseText}.`\n );\n }\n })();\n }\n },\n {\n keys: \"?\",\n label: \"open editor\",\n terminalLabel: \"show this menu\",\n action: async (ctx) => {\n }\n }\n];\nasync function startUserInterface(context) {\n if (!supportsKeyboardCommands()) {\n return;\n }\n printCommandsTable(context);\n startInterceptingKeyStrokes(context);\n}\nfunction printCommandsTable(context) {\n const longestKeyLength = COMMANDS.reduce(\n (max, command) => Math.max(max, command.keys.length),\n 0\n );\n const commandsInfo = COMMANDS.map(\n (cmd) => getCommandInfoInTerminal(cmd, { longestKeyLength })\n ).join(\"\\n\");\n console.info(`\n${commandsInfo}\n`);\n}\nfunction getCommandInfoInTerminal(command, { longestKeyLength = 0 } = {}) {\n return `\\x1B[90m\\u203A\\x1B[0m Press \\x1B[1m${longestKeyLength ? command.keys.padEnd(longestKeyLength, \" \") : command.keys}\\x1B[0m \\x1B[90m\\u2502\\x1B[0m ${command.terminalLabel}`;\n}\nfunction restoreTerminal() {\n const { stdin } = process;\n if (stdin.isTTY && stdin.setRawMode) {\n try {\n stdin.setRawMode(false);\n } catch {\n }\n }\n process.stdout.write(\"\\x1B[0m\");\n}\nfunction supportsKeyboardCommands() {\n const { stdin } = process;\n return Boolean(stdin.isTTY && stdin.setRawMode);\n}\nfunction startInterceptingKeyStrokes(context) {\n const { stdin } = process;\n if (!supportsKeyboardCommands()) {\n return;\n }\n stdin.setRawMode(true);\n stdin.resume();\n stdin.setEncoding(\"utf8\");\n stdin.on(\"data\", handleKeypress.bind(null, context));\n stdin.unref();\n process.on(\"exit\", restoreTerminal);\n process.on(\"SIGINT\", () => {\n restoreTerminal();\n process.exit(0);\n });\n process.on(\"SIGTERM\", () => {\n restoreTerminal();\n process.exit(0);\n });\n}\nlet pressedKeys = \"\";\nlet clearPressedKeysTimer = null;\nfunction clearPressedKeys() {\n pressedKeys = \"\";\n clearPrintedInfo();\n}\nfunction resetClearPressedKeysTimer() {\n if (clearPressedKeysTimer) {\n clearTimeout(clearPressedKeysTimer);\n }\n clearPressedKeysTimer = setTimeout(clearPressedKeys, 3e3);\n clearPressedKeysTimer.unref();\n}\nfunction handleKeypress(context, key) {\n if (key === \"\\x1B\") {\n clearPrintedInfo();\n pressedKeys = \"\";\n return;\n }\n if (key === \"?\" || key === \"/\") {\n clearPrintedInfo();\n console.info(\"> ?\\n\\u21D2 Available commands:\");\n printCommandsTable(context);\n return;\n }\n resetClearPressedKeysTimer();\n if (key === \"\\x7F\") {\n pressedKeys = pressedKeys.slice(0, -1);\n } else {\n key = key.toLowerCase();\n if (/^[a-z]$/.test(key)) {\n pressedKeys += key;\n }\n }\n if (pressedKeys.length === 0) {\n clearPrintedInfo();\n return;\n }\n const matchedCommand = COMMANDS.find((command) => command.keys === pressedKeys);\n if (matchedCommand) {\n clearPrintedInfo();\n console.info(`> ${matchedCommand.keys}\n\\u21D2 ${matchedCommand.label}...`);\n pressedKeys = \"\";\n setTimeout(() => matchedCommand.action?.(context), 500);\n return;\n }\n if (pressedKeys.length >= 3) {\n clearPrintedInfo();\n console.info(\n `> ${pressedKeys}\nNo matching command for \"${pressedKeys}\"! Press \"?\" for help.`\n );\n pressedKeys = \"\";\n return;\n }\n const possibleCommands = COMMANDS.filter(\n (command) => command.keys.startsWith(pressedKeys)\n );\n const commandsInfo = possibleCommands.map((command) => {\n const matchedPart = command.keys.slice(0, pressedKeys.length);\n const remainingPart = command.keys.slice(pressedKeys.length);\n return ` \\x1B[4m${matchedPart}\\x1B[0m\\x1B[1m${remainingPart}\\x1B[0m\\x1B[90m - \\x1B[0m${command.terminalLabel}`;\n }).join(\"\\n\");\n const infoToPrint = `\n${commandsInfo}\n> ${pressedKeys}`;\n printInfo(infoToPrint);\n}\nlet lastPrintedInfo = \"\";\nfunction printInfo(info) {\n clearPrintedInfo();\n lastPrintedInfo = info;\n process.stdout.write(info);\n}\nfunction clearPrintedInfo() {\n if (lastPrintedInfo) {\n process.stdout.write(\"\\x1B[2K\");\n process.stdout.write(\"\\x1B[1A\\x1B[2K\".repeat(lastPrintedInfo.split(\"\\n\").length - 1));\n process.stdout.write(\"\\x1B[2K\");\n process.stdout.write(\"\\x1B[G\");\n }\n lastPrintedInfo = \"\";\n}\nfunction nativeOpen(url) {\n const start = process.platform === \"darwin\" ? \"open\" : process.platform === \"win32\" ? \"start\" : \"xdg-open\";\n exec(`${start} ${url}`);\n}\nasync function openIos(ctx) {\n const projectRoot = ctx.server.config.root;\n const port = getBoundPort(ctx.server);\n try {\n await nativeRun({ root: projectRoot, platform: \"ios\", port });\n } catch (e) {\n const stack = e instanceof Error ? e.stack : null;\n console.error(`Failed to open app in iOS Simulator: ${e}${stack ? `\n${stack}` : \"\"}`);\n }\n}\nasync function openAndroid(ctx) {\n const projectRoot = ctx.server.config.root;\n const port = getBoundPort(ctx.server);\n try {\n await nativeRun({ root: projectRoot, platform: \"android\", port });\n } catch (e) {\n const stack = e instanceof Error ? e.stack : null;\n console.error(\n `Failed to open app in Android Emulator: ${e}${stack ? `\n${stack}` : \"\"}`\n );\n }\n}\nexport {\n startUserInterface\n};\n//# sourceMappingURL=index.js.map\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["user-interface/index.js"],"sourcesContent":["import { exec } from \"node:child_process\";\nimport { getBoundPort } from \"../utils/getBoundPort\";\nimport { nativeRun } from \"../utils/nativeRun\";\nconst COMMANDS = [\n {\n keys: \"ow\",\n label: \"open web\",\n terminalLabel: \"\\x1B[1mo\\x1B[0mpen \\x1B[1mw\\x1B[0meb\",\n action: (ctx) => {\n const url = ctx.server.resolvedUrls?.local[0];\n if (!url) {\n console.warn(\"Cannot get the local server URL.\");\n return;\n }\n nativeOpen(url);\n }\n },\n {\n keys: \"oi\",\n label: \"open app in iOS Simulator\",\n terminalLabel: \"\\x1B[1mo\\x1B[0mpen app in \\x1B[1mi\\x1B[0mOS Simulator\",\n action: (ctx) => {\n openIos(ctx);\n }\n },\n {\n keys: \"oa\",\n label: \"open app in Android Emulator\",\n terminalLabel: \"\\x1B[1mo\\x1B[0mpen app in \\x1B[1mA\\x1B[0mndroid Emulator\",\n action: (ctx) => {\n openAndroid(ctx);\n }\n },\n {\n keys: \"oe\",\n label: \"open editor\",\n terminalLabel: \"\\x1B[1mo\\x1B[0mpen \\x1B[1me\\x1B[0mditor\",\n action: async (ctx) => {\n const { defaultEditor } = await import(\"env-editor\");\n exec(`${defaultEditor().binary} .`);\n }\n },\n // TODO this would need to be per-platform\n {\n keys: \"dt\",\n label: \"open React Native DevTools\",\n terminalLabel: \"open React Native \\x1B[1mD\\x1B[0mev\\x1B[1mT\\x1B[0mools\",\n action: openReactNativeDevTools\n },\n {\n keys: \"j\",\n label: \"open React Native DevTools\",\n terminalLabel: \"open React Native DevTools\",\n action: openReactNativeDevTools\n },\n {\n keys: \"?\",\n label: \"show commands\",\n terminalLabel: \"show this menu\",\n action: async (ctx) => {\n }\n }\n];\nfunction openReactNativeDevTools(ctx) {\n const { host } = ctx.server.config.server;\n const serverUrl = `http://${typeof host === \"string\" && !!host ? host : \"localhost\"}:${getBoundPort(ctx.server)}`;\n const url = new URL(\"/open-debugger\", serverUrl);\n (async () => {\n const response = await fetch(url, {\n method: \"POST\",\n signal: AbortSignal.timeout(3e3)\n }).catch((error) => {\n if (error.name === \"TimeoutError\") {\n return null;\n }\n throw error;\n });\n if (!response) {\n } else if (response.ok === false) {\n const responseText = await response.text();\n if (responseText.includes(\"Unable to find debugger target\")) {\n return;\n }\n console.warn(\n `Failed to open React Native DevTools, ${url} returns ${response.status}: ${responseText}.`\n );\n }\n })();\n}\nasync function startUserInterface(context) {\n if (!supportsKeyboardCommands()) {\n return;\n }\n printCommandsTable(context);\n startInterceptingKeyStrokes(context);\n}\nfunction printCommandsTable(context) {\n const longestKeyLength = COMMANDS.reduce(\n (max, command) => Math.max(max, command.keys.length),\n 0\n );\n const commandsInfo = COMMANDS.map(\n (cmd) => getCommandInfoInTerminal(cmd, { longestKeyLength })\n ).join(\"\\n\");\n console.info(`\n${commandsInfo}\n`);\n}\nfunction getCommandInfoInTerminal(command, { longestKeyLength = 0 } = {}) {\n return `\\x1B[90m\\u203A\\x1B[0m Press \\x1B[1m${longestKeyLength ? command.keys.padEnd(longestKeyLength, \" \") : command.keys}\\x1B[0m \\x1B[90m\\u2502\\x1B[0m ${command.terminalLabel}`;\n}\nfunction restoreTerminal() {\n const { stdin } = process;\n if (stdin.isTTY && stdin.setRawMode) {\n try {\n stdin.setRawMode(false);\n } catch {\n }\n }\n process.stdout.write(\"\\x1B[0m\");\n}\nfunction supportsKeyboardCommands() {\n const { stdin } = process;\n return Boolean(stdin.isTTY && stdin.setRawMode);\n}\nfunction startInterceptingKeyStrokes(context) {\n const { stdin } = process;\n if (!supportsKeyboardCommands()) {\n return;\n }\n stdin.setRawMode(true);\n stdin.resume();\n stdin.setEncoding(\"utf8\");\n stdin.on(\"data\", handleKeypress.bind(null, context));\n stdin.unref();\n process.on(\"exit\", restoreTerminal);\n process.on(\"SIGINT\", () => {\n restoreTerminal();\n process.exit(0);\n });\n process.on(\"SIGTERM\", () => {\n restoreTerminal();\n process.exit(0);\n });\n}\nlet pressedKeys = \"\";\nlet clearPressedKeysTimer = null;\nfunction clearPressedKeys() {\n pressedKeys = \"\";\n clearPrintedInfo();\n}\nfunction resetClearPressedKeysTimer() {\n if (clearPressedKeysTimer) {\n clearTimeout(clearPressedKeysTimer);\n }\n clearPressedKeysTimer = setTimeout(clearPressedKeys, 3e3);\n clearPressedKeysTimer.unref();\n}\nfunction handleKeypress(context, key) {\n if (key === \"\\x1B\") {\n clearPrintedInfo();\n pressedKeys = \"\";\n return;\n }\n if (key === \"?\" || key === \"/\") {\n clearPrintedInfo();\n console.info(\"> ?\\n\\u21D2 Available commands:\");\n printCommandsTable(context);\n return;\n }\n resetClearPressedKeysTimer();\n if (key === \"\\x7F\") {\n pressedKeys = pressedKeys.slice(0, -1);\n } else {\n key = key.toLowerCase();\n if (/^[a-z]$/.test(key)) {\n pressedKeys += key;\n }\n }\n if (pressedKeys.length === 0) {\n clearPrintedInfo();\n return;\n }\n const matchedCommand = COMMANDS.find((command) => command.keys === pressedKeys);\n if (matchedCommand) {\n clearPrintedInfo();\n console.info(`> ${matchedCommand.keys}\n\\u21D2 ${matchedCommand.label}...`);\n pressedKeys = \"\";\n setTimeout(() => matchedCommand.action?.(context), 500);\n return;\n }\n if (pressedKeys.length >= 3) {\n clearPrintedInfo();\n console.info(\n `> ${pressedKeys}\nNo matching command for \"${pressedKeys}\"! Press \"?\" for help.`\n );\n pressedKeys = \"\";\n return;\n }\n const possibleCommands = COMMANDS.filter(\n (command) => command.keys.startsWith(pressedKeys)\n );\n const commandsInfo = possibleCommands.map((command) => {\n const matchedPart = command.keys.slice(0, pressedKeys.length);\n const remainingPart = command.keys.slice(pressedKeys.length);\n return ` \\x1B[4m${matchedPart}\\x1B[0m\\x1B[1m${remainingPart}\\x1B[0m\\x1B[90m - \\x1B[0m${command.terminalLabel}`;\n }).join(\"\\n\");\n const infoToPrint = `\n${commandsInfo}\n> ${pressedKeys}`;\n printInfo(infoToPrint);\n}\nlet lastPrintedInfo = \"\";\nfunction printInfo(info) {\n clearPrintedInfo();\n lastPrintedInfo = info;\n process.stdout.write(info);\n}\nfunction clearPrintedInfo() {\n if (lastPrintedInfo) {\n process.stdout.write(\"\\x1B[2K\");\n process.stdout.write(\"\\x1B[1A\\x1B[2K\".repeat(lastPrintedInfo.split(\"\\n\").length - 1));\n process.stdout.write(\"\\x1B[2K\");\n process.stdout.write(\"\\x1B[G\");\n }\n lastPrintedInfo = \"\";\n}\nfunction nativeOpen(url) {\n const start = process.platform === \"darwin\" ? \"open\" : process.platform === \"win32\" ? \"start\" : \"xdg-open\";\n exec(`${start} ${url}`);\n}\nasync function openIos(ctx) {\n const projectRoot = ctx.server.config.root;\n const port = getBoundPort(ctx.server);\n try {\n await nativeRun({ root: projectRoot, platform: \"ios\", port });\n } catch (e) {\n const stack = e instanceof Error ? e.stack : null;\n console.error(`Failed to open app in iOS Simulator: ${e}${stack ? `\n${stack}` : \"\"}`);\n }\n}\nasync function openAndroid(ctx) {\n const projectRoot = ctx.server.config.root;\n const port = getBoundPort(ctx.server);\n try {\n await nativeRun({ root: projectRoot, platform: \"android\", port });\n } catch (e) {\n const stack = e instanceof Error ? e.stack : null;\n console.error(\n `Failed to open app in Android Emulator: ${e}${stack ? `\n${stack}` : \"\"}`\n );\n }\n}\nexport {\n startUserInterface\n};\n//# sourceMappingURL=index.js.map\n"],"mappings":"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"}
@@ -46,37 +46,44 @@ var COMMANDS = [
46
46
  keys: "dt",
47
47
  label: "open React Native DevTools",
48
48
  terminalLabel: "open React Native \x1B[1mD\x1B[0mev\x1B[1mT\x1B[0mools",
49
- action: function action5(ctx) {
50
- var { host, port } = ctx.server.config.server;
51
- var serverUrl = `http://${typeof host === "string" && !!host ? host : "localhost"}:${port}`;
52
- var url = new URL("/open-debugger", serverUrl);
53
- (async function() {
54
- var response = await fetch(url, {
55
- method: "POST",
56
- signal: AbortSignal.timeout(3e3)
57
- }).catch(function(error) {
58
- if (error.name === "TimeoutError") {
59
- return null;
60
- }
61
- throw error;
62
- });
63
- if (!response) {} else if (response.ok === false) {
64
- var responseText = await response.text();
65
- if (responseText.includes("Unable to find debugger target")) {
66
- return;
67
- }
68
- console.warn(`Failed to open React Native DevTools, ${url} returns ${response.status}: ${responseText}.`);
69
- }
70
- })();
71
- }
49
+ action: openReactNativeDevTools
50
+ },
51
+ {
52
+ keys: "j",
53
+ label: "open React Native DevTools",
54
+ terminalLabel: "open React Native DevTools",
55
+ action: openReactNativeDevTools
72
56
  },
73
57
  {
74
58
  keys: "?",
75
- label: "open editor",
59
+ label: "show commands",
76
60
  terminalLabel: "show this menu",
77
- action: async function action6(ctx) {}
61
+ action: async function action5(ctx) {}
78
62
  }
79
63
  ];
64
+ function openReactNativeDevTools(ctx) {
65
+ var { host } = ctx.server.config.server;
66
+ var serverUrl = `http://${typeof host === "string" && !!host ? host : "localhost"}:${getBoundPort(ctx.server)}`;
67
+ var url = new URL("/open-debugger", serverUrl);
68
+ (async function() {
69
+ var response = await fetch(url, {
70
+ method: "POST",
71
+ signal: AbortSignal.timeout(3e3)
72
+ }).catch(function(error) {
73
+ if (error.name === "TimeoutError") {
74
+ return null;
75
+ }
76
+ throw error;
77
+ });
78
+ if (!response) {} else if (response.ok === false) {
79
+ var responseText = await response.text();
80
+ if (responseText.includes("Unable to find debugger target")) {
81
+ return;
82
+ }
83
+ console.warn(`Failed to open React Native DevTools, ${url} returns ${response.status}: ${responseText}.`);
84
+ }
85
+ })();
86
+ }
80
87
  async function startUserInterface(context) {
81
88
  if (!supportsKeyboardCommands()) {
82
89
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"index.native.js","names":[],"sources":["user-interface/index.native.js"],"sourcesContent":["import { exec } from \"child_process\";\nimport { getBoundPort } from \"../utils/getBoundPort\";\nimport { nativeRun } from \"../utils/nativeRun\";\nvar COMMANDS = [\n {\n keys: \"ow\",\n label: \"open web\",\n terminalLabel: \"\\x1B[1mo\\x1B[0mpen \\x1B[1mw\\x1B[0meb\",\n action: function action(ctx) {\n var _ctx_server_resolvedUrls;\n var url = (_ctx_server_resolvedUrls = ctx.server.resolvedUrls) === null || _ctx_server_resolvedUrls === void 0 ? void 0 : _ctx_server_resolvedUrls.local[0];\n if (!url) {\n console.warn(\"Cannot get the local server URL.\");\n return;\n }\n nativeOpen(url);\n }\n },\n {\n keys: \"oi\",\n label: \"open app in iOS Simulator\",\n terminalLabel: \"\\x1B[1mo\\x1B[0mpen app in \\x1B[1mi\\x1B[0mOS Simulator\",\n action: function action2(ctx) {\n openIos(ctx);\n }\n },\n {\n keys: \"oa\",\n label: \"open app in Android Emulator\",\n terminalLabel: \"\\x1B[1mo\\x1B[0mpen app in \\x1B[1mA\\x1B[0mndroid Emulator\",\n action: function action3(ctx) {\n openAndroid(ctx);\n }\n },\n {\n keys: \"oe\",\n label: \"open editor\",\n terminalLabel: \"\\x1B[1mo\\x1B[0mpen \\x1B[1me\\x1B[0mditor\",\n action: async function action4(ctx) {\n var { defaultEditor } = await import(\"env-editor\");\n exec(`${defaultEditor().binary} .`);\n }\n },\n // TODO this would need to be per-platform\n {\n keys: \"dt\",\n label: \"open React Native DevTools\",\n terminalLabel: \"open React Native \\x1B[1mD\\x1B[0mev\\x1B[1mT\\x1B[0mools\",\n action: function action5(ctx) {\n var { host, port } = ctx.server.config.server;\n var serverUrl = `http://${typeof host === \"string\" && !!host ? host : \"localhost\"}:${port}`;\n var url = new URL(\"/open-debugger\", serverUrl);\n (async function() {\n var response = await fetch(url, {\n method: \"POST\",\n signal: AbortSignal.timeout(3e3)\n }).catch(function(error) {\n if (error.name === \"TimeoutError\") {\n return null;\n }\n throw error;\n });\n if (!response) {\n } else if (response.ok === false) {\n var responseText = await response.text();\n if (responseText.includes(\"Unable to find debugger target\")) {\n return;\n }\n console.warn(`Failed to open React Native DevTools, ${url} returns ${response.status}: ${responseText}.`);\n }\n })();\n }\n },\n {\n keys: \"?\",\n label: \"open editor\",\n terminalLabel: \"show this menu\",\n action: async function action6(ctx) {\n }\n }\n];\nasync function startUserInterface(context) {\n if (!supportsKeyboardCommands()) {\n return;\n }\n printCommandsTable(context);\n startInterceptingKeyStrokes(context);\n}\nfunction printCommandsTable(context) {\n var longestKeyLength = COMMANDS.reduce(function(max, command) {\n return Math.max(max, command.keys.length);\n }, 0);\n var commandsInfo = COMMANDS.map(function(cmd) {\n return getCommandInfoInTerminal(cmd, {\n longestKeyLength\n });\n }).join(\"\\n\");\n console.info(`\n${commandsInfo}\n`);\n}\nfunction getCommandInfoInTerminal(command) {\n var { longestKeyLength = 0 } = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};\n return `\\x1B[90m\\u203A\\x1B[0m Press \\x1B[1m${longestKeyLength ? command.keys.padEnd(longestKeyLength, \" \") : command.keys}\\x1B[0m \\x1B[90m\\u2502\\x1B[0m ${command.terminalLabel}`;\n}\nfunction restoreTerminal() {\n var { stdin } = process;\n if (stdin.isTTY && stdin.setRawMode) {\n try {\n stdin.setRawMode(false);\n } catch (unused) {\n }\n }\n process.stdout.write(\"\\x1B[0m\");\n}\nfunction supportsKeyboardCommands() {\n var { stdin } = process;\n return Boolean(stdin.isTTY && stdin.setRawMode);\n}\nfunction startInterceptingKeyStrokes(context) {\n var { stdin } = process;\n if (!supportsKeyboardCommands()) {\n return;\n }\n stdin.setRawMode(true);\n stdin.resume();\n stdin.setEncoding(\"utf8\");\n stdin.on(\"data\", handleKeypress.bind(null, context));\n stdin.unref();\n process.on(\"exit\", restoreTerminal);\n process.on(\"SIGINT\", function() {\n restoreTerminal();\n process.exit(0);\n });\n process.on(\"SIGTERM\", function() {\n restoreTerminal();\n process.exit(0);\n });\n}\nvar pressedKeys = \"\";\nvar clearPressedKeysTimer = null;\nfunction clearPressedKeys() {\n pressedKeys = \"\";\n clearPrintedInfo();\n}\nfunction resetClearPressedKeysTimer() {\n if (clearPressedKeysTimer) {\n clearTimeout(clearPressedKeysTimer);\n }\n clearPressedKeysTimer = setTimeout(clearPressedKeys, 3e3);\n clearPressedKeysTimer.unref();\n}\nfunction handleKeypress(context, key) {\n if (key === \"\\x1B\") {\n clearPrintedInfo();\n pressedKeys = \"\";\n return;\n }\n if (key === \"?\" || key === \"/\") {\n clearPrintedInfo();\n console.info(\"> ?\\n\\u21D2 Available commands:\");\n printCommandsTable(context);\n return;\n }\n resetClearPressedKeysTimer();\n if (key === \"\\x7F\") {\n pressedKeys = pressedKeys.slice(0, -1);\n } else {\n key = key.toLowerCase();\n if (/^[a-z]$/.test(key)) {\n pressedKeys += key;\n }\n }\n if (pressedKeys.length === 0) {\n clearPrintedInfo();\n return;\n }\n var matchedCommand = COMMANDS.find(function(command) {\n return command.keys === pressedKeys;\n });\n if (matchedCommand) {\n clearPrintedInfo();\n console.info(`> ${matchedCommand.keys}\n\\u21D2 ${matchedCommand.label}...`);\n pressedKeys = \"\";\n setTimeout(function() {\n var _matchedCommand_action;\n return (_matchedCommand_action = matchedCommand.action) === null || _matchedCommand_action === void 0 ? void 0 : _matchedCommand_action.call(matchedCommand, context);\n }, 500);\n return;\n }\n if (pressedKeys.length >= 3) {\n clearPrintedInfo();\n console.info(`> ${pressedKeys}\nNo matching command for \"${pressedKeys}\"! Press \"?\" for help.`);\n pressedKeys = \"\";\n return;\n }\n var possibleCommands = COMMANDS.filter(function(command) {\n return command.keys.startsWith(pressedKeys);\n });\n var commandsInfo = possibleCommands.map(function(command) {\n var matchedPart = command.keys.slice(0, pressedKeys.length);\n var remainingPart = command.keys.slice(pressedKeys.length);\n return ` \\x1B[4m${matchedPart}\\x1B[0m\\x1B[1m${remainingPart}\\x1B[0m\\x1B[90m - \\x1B[0m${command.terminalLabel}`;\n }).join(\"\\n\");\n var infoToPrint = `\n${commandsInfo}\n> ${pressedKeys}`;\n printInfo(infoToPrint);\n}\nvar lastPrintedInfo = \"\";\nfunction printInfo(info) {\n clearPrintedInfo();\n lastPrintedInfo = info;\n process.stdout.write(info);\n}\nfunction clearPrintedInfo() {\n if (lastPrintedInfo) {\n process.stdout.write(\"\\x1B[2K\");\n process.stdout.write(\"\\x1B[1A\\x1B[2K\".repeat(lastPrintedInfo.split(\"\\n\").length - 1));\n process.stdout.write(\"\\x1B[2K\");\n process.stdout.write(\"\\x1B[G\");\n }\n lastPrintedInfo = \"\";\n}\nfunction nativeOpen(url) {\n var start = process.platform === \"darwin\" ? \"open\" : process.platform === \"win32\" ? \"start\" : \"xdg-open\";\n exec(`${start} ${url}`);\n}\nasync function openIos(ctx) {\n var projectRoot = ctx.server.config.root;\n var port = getBoundPort(ctx.server);\n try {\n await nativeRun({\n root: projectRoot,\n platform: \"ios\",\n port\n });\n } catch (e) {\n var stack = e instanceof Error ? e.stack : null;\n console.error(`Failed to open app in iOS Simulator: ${e}${stack ? `\n${stack}` : \"\"}`);\n }\n}\nasync function openAndroid(ctx) {\n var projectRoot = ctx.server.config.root;\n var port = getBoundPort(ctx.server);\n try {\n await nativeRun({\n root: projectRoot,\n platform: \"android\",\n port\n });\n } catch (e) {\n var stack = e instanceof Error ? e.stack : null;\n console.error(`Failed to open app in Android Emulator: ${e}${stack ? `\n${stack}` : \"\"}`);\n }\n}\nexport {\n startUserInterface\n};\n//# sourceMappingURL=index.js.map\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.native.js","names":[],"sources":["user-interface/index.native.js"],"sourcesContent":["import { exec } from \"child_process\";\nimport { getBoundPort } from \"../utils/getBoundPort\";\nimport { nativeRun } from \"../utils/nativeRun\";\nvar COMMANDS = [\n {\n keys: \"ow\",\n label: \"open web\",\n terminalLabel: \"\\x1B[1mo\\x1B[0mpen \\x1B[1mw\\x1B[0meb\",\n action: function action(ctx) {\n var _ctx_server_resolvedUrls;\n var url = (_ctx_server_resolvedUrls = ctx.server.resolvedUrls) === null || _ctx_server_resolvedUrls === void 0 ? void 0 : _ctx_server_resolvedUrls.local[0];\n if (!url) {\n console.warn(\"Cannot get the local server URL.\");\n return;\n }\n nativeOpen(url);\n }\n },\n {\n keys: \"oi\",\n label: \"open app in iOS Simulator\",\n terminalLabel: \"\\x1B[1mo\\x1B[0mpen app in \\x1B[1mi\\x1B[0mOS Simulator\",\n action: function action2(ctx) {\n openIos(ctx);\n }\n },\n {\n keys: \"oa\",\n label: \"open app in Android Emulator\",\n terminalLabel: \"\\x1B[1mo\\x1B[0mpen app in \\x1B[1mA\\x1B[0mndroid Emulator\",\n action: function action3(ctx) {\n openAndroid(ctx);\n }\n },\n {\n keys: \"oe\",\n label: \"open editor\",\n terminalLabel: \"\\x1B[1mo\\x1B[0mpen \\x1B[1me\\x1B[0mditor\",\n action: async function action4(ctx) {\n var { defaultEditor } = await import(\"env-editor\");\n exec(`${defaultEditor().binary} .`);\n }\n },\n // TODO this would need to be per-platform\n {\n keys: \"dt\",\n label: \"open React Native DevTools\",\n terminalLabel: \"open React Native \\x1B[1mD\\x1B[0mev\\x1B[1mT\\x1B[0mools\",\n action: openReactNativeDevTools\n },\n {\n keys: \"j\",\n label: \"open React Native DevTools\",\n terminalLabel: \"open React Native DevTools\",\n action: openReactNativeDevTools\n },\n {\n keys: \"?\",\n label: \"show commands\",\n terminalLabel: \"show this menu\",\n action: async function action5(ctx) {\n }\n }\n];\nfunction openReactNativeDevTools(ctx) {\n var { host } = ctx.server.config.server;\n var serverUrl = `http://${typeof host === \"string\" && !!host ? host : \"localhost\"}:${getBoundPort(ctx.server)}`;\n var url = new URL(\"/open-debugger\", serverUrl);\n (async function() {\n var response = await fetch(url, {\n method: \"POST\",\n signal: AbortSignal.timeout(3e3)\n }).catch(function(error) {\n if (error.name === \"TimeoutError\") {\n return null;\n }\n throw error;\n });\n if (!response) {\n } else if (response.ok === false) {\n var responseText = await response.text();\n if (responseText.includes(\"Unable to find debugger target\")) {\n return;\n }\n console.warn(`Failed to open React Native DevTools, ${url} returns ${response.status}: ${responseText}.`);\n }\n })();\n}\nasync function startUserInterface(context) {\n if (!supportsKeyboardCommands()) {\n return;\n }\n printCommandsTable(context);\n startInterceptingKeyStrokes(context);\n}\nfunction printCommandsTable(context) {\n var longestKeyLength = COMMANDS.reduce(function(max, command) {\n return Math.max(max, command.keys.length);\n }, 0);\n var commandsInfo = COMMANDS.map(function(cmd) {\n return getCommandInfoInTerminal(cmd, {\n longestKeyLength\n });\n }).join(\"\\n\");\n console.info(`\n${commandsInfo}\n`);\n}\nfunction getCommandInfoInTerminal(command) {\n var { longestKeyLength = 0 } = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};\n return `\\x1B[90m\\u203A\\x1B[0m Press \\x1B[1m${longestKeyLength ? command.keys.padEnd(longestKeyLength, \" \") : command.keys}\\x1B[0m \\x1B[90m\\u2502\\x1B[0m ${command.terminalLabel}`;\n}\nfunction restoreTerminal() {\n var { stdin } = process;\n if (stdin.isTTY && stdin.setRawMode) {\n try {\n stdin.setRawMode(false);\n } catch (unused) {\n }\n }\n process.stdout.write(\"\\x1B[0m\");\n}\nfunction supportsKeyboardCommands() {\n var { stdin } = process;\n return Boolean(stdin.isTTY && stdin.setRawMode);\n}\nfunction startInterceptingKeyStrokes(context) {\n var { stdin } = process;\n if (!supportsKeyboardCommands()) {\n return;\n }\n stdin.setRawMode(true);\n stdin.resume();\n stdin.setEncoding(\"utf8\");\n stdin.on(\"data\", handleKeypress.bind(null, context));\n stdin.unref();\n process.on(\"exit\", restoreTerminal);\n process.on(\"SIGINT\", function() {\n restoreTerminal();\n process.exit(0);\n });\n process.on(\"SIGTERM\", function() {\n restoreTerminal();\n process.exit(0);\n });\n}\nvar pressedKeys = \"\";\nvar clearPressedKeysTimer = null;\nfunction clearPressedKeys() {\n pressedKeys = \"\";\n clearPrintedInfo();\n}\nfunction resetClearPressedKeysTimer() {\n if (clearPressedKeysTimer) {\n clearTimeout(clearPressedKeysTimer);\n }\n clearPressedKeysTimer = setTimeout(clearPressedKeys, 3e3);\n clearPressedKeysTimer.unref();\n}\nfunction handleKeypress(context, key) {\n if (key === \"\\x1B\") {\n clearPrintedInfo();\n pressedKeys = \"\";\n return;\n }\n if (key === \"?\" || key === \"/\") {\n clearPrintedInfo();\n console.info(\"> ?\\n\\u21D2 Available commands:\");\n printCommandsTable(context);\n return;\n }\n resetClearPressedKeysTimer();\n if (key === \"\\x7F\") {\n pressedKeys = pressedKeys.slice(0, -1);\n } else {\n key = key.toLowerCase();\n if (/^[a-z]$/.test(key)) {\n pressedKeys += key;\n }\n }\n if (pressedKeys.length === 0) {\n clearPrintedInfo();\n return;\n }\n var matchedCommand = COMMANDS.find(function(command) {\n return command.keys === pressedKeys;\n });\n if (matchedCommand) {\n clearPrintedInfo();\n console.info(`> ${matchedCommand.keys}\n\\u21D2 ${matchedCommand.label}...`);\n pressedKeys = \"\";\n setTimeout(function() {\n var _matchedCommand_action;\n return (_matchedCommand_action = matchedCommand.action) === null || _matchedCommand_action === void 0 ? void 0 : _matchedCommand_action.call(matchedCommand, context);\n }, 500);\n return;\n }\n if (pressedKeys.length >= 3) {\n clearPrintedInfo();\n console.info(`> ${pressedKeys}\nNo matching command for \"${pressedKeys}\"! Press \"?\" for help.`);\n pressedKeys = \"\";\n return;\n }\n var possibleCommands = COMMANDS.filter(function(command) {\n return command.keys.startsWith(pressedKeys);\n });\n var commandsInfo = possibleCommands.map(function(command) {\n var matchedPart = command.keys.slice(0, pressedKeys.length);\n var remainingPart = command.keys.slice(pressedKeys.length);\n return ` \\x1B[4m${matchedPart}\\x1B[0m\\x1B[1m${remainingPart}\\x1B[0m\\x1B[90m - \\x1B[0m${command.terminalLabel}`;\n }).join(\"\\n\");\n var infoToPrint = `\n${commandsInfo}\n> ${pressedKeys}`;\n printInfo(infoToPrint);\n}\nvar lastPrintedInfo = \"\";\nfunction printInfo(info) {\n clearPrintedInfo();\n lastPrintedInfo = info;\n process.stdout.write(info);\n}\nfunction clearPrintedInfo() {\n if (lastPrintedInfo) {\n process.stdout.write(\"\\x1B[2K\");\n process.stdout.write(\"\\x1B[1A\\x1B[2K\".repeat(lastPrintedInfo.split(\"\\n\").length - 1));\n process.stdout.write(\"\\x1B[2K\");\n process.stdout.write(\"\\x1B[G\");\n }\n lastPrintedInfo = \"\";\n}\nfunction nativeOpen(url) {\n var start = process.platform === \"darwin\" ? \"open\" : process.platform === \"win32\" ? \"start\" : \"xdg-open\";\n exec(`${start} ${url}`);\n}\nasync function openIos(ctx) {\n var projectRoot = ctx.server.config.root;\n var port = getBoundPort(ctx.server);\n try {\n await nativeRun({\n root: projectRoot,\n platform: \"ios\",\n port\n });\n } catch (e) {\n var stack = e instanceof Error ? e.stack : null;\n console.error(`Failed to open app in iOS Simulator: ${e}${stack ? `\n${stack}` : \"\"}`);\n }\n}\nasync function openAndroid(ctx) {\n var projectRoot = ctx.server.config.root;\n var port = getBoundPort(ctx.server);\n try {\n await nativeRun({\n root: projectRoot,\n platform: \"android\",\n port\n });\n } catch (e) {\n var stack = e instanceof Error ? e.stack : null;\n console.error(`Failed to open app in Android Emulator: ${e}${stack ? `\n${stack}` : \"\"}`);\n }\n}\nexport {\n startUserInterface\n};\n//# sourceMappingURL=index.js.map\n"],"mappings":"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"}
@@ -3,9 +3,11 @@ import { basename, dirname, extname, join, relative, resolve } from "node:path";
3
3
  import { copyFileSync, existsSync, mkdirSync, readFileSync, readdirSync, realpathSync, statSync, watch, writeFileSync } from "node:fs";
4
4
  import { pathToFileURL } from "node:url";
5
5
  import micromatch from "micromatch";
6
+ import { parseSync } from "oxc-parser";
6
7
  import { loadEnv, normalizePath } from "vite";
7
8
  import { shouldStripFlow, transformHermesAsync } from "@vxrn/compiler";
8
9
  import { resolvePath } from "@vxrn/resolve";
10
+ import { nativeAppDefines } from "@vxrn/utils/nativeAppManifest";
9
11
  import { withExpoPublicEnvAliases } from "@vxrn/utils/publicEnv";
10
12
  import { DEFAULT_ASSET_EXTS } from "../constants/defaults.mjs";
11
13
  import { getNativePrelude } from "../runtime/native-prelude.mjs";
@@ -124,6 +126,7 @@ function getNativeTransformConfig(platform, dev, root) {
124
126
  jsx: { runtime: "classic" },
125
127
  define: {
126
128
  ...userDefines,
129
+ ...nativeAppDefines(entryConfig.app),
127
130
  ...envDefines,
128
131
  "process.env.NODE_ENV": JSON.stringify(mode),
129
132
  "process.env.VXRN_REACT_19": "false",
@@ -150,7 +153,7 @@ function getNativeTransformConfig(platform, dev, root) {
150
153
  inject: { React: "react" }
151
154
  };
152
155
  }
153
- function getNativePlugins(root, platform, viteImportGlobPlugin, dev, assetsDest, onAsset, sourceMaps = false, userPlugins = []) {
156
+ function getNativePlugins(root, platform, viteImportGlobPlugin, dev, assetsDest, onAsset, sourceMaps = false, userPlugins = [], minify = false) {
154
157
  const context = {
155
158
  root,
156
159
  platform,
@@ -171,6 +174,7 @@ function getNativePlugins(root, platform, viteImportGlobPlugin, dev, assetsDest,
171
174
  rnCodegenPlugin({ projectRoot: root }),
172
175
  flowStripPlugin(),
173
176
  vxrnCompilerPlugin(platform, dev, root, sourceMaps),
177
+ mixedNativeModulePlugin(sourceMaps),
174
178
  nativeAnimatedGuardPlugin(),
175
179
  assetPlugin({
176
180
  root,
@@ -178,7 +182,7 @@ function getNativePlugins(root, platform, viteImportGlobPlugin, dev, assetsDest,
178
182
  assetsDest,
179
183
  onAsset
180
184
  }),
181
- hermesCompatSWCPlugin(dev, sourceMaps),
185
+ hermesCompatSWCPlugin(dev, sourceMaps, !minify),
182
186
  hermesLoopsPlugin(sourceMaps),
183
187
  ...userPlugins,
184
188
  nativeExportsPrecedencePlugin(root, platform),
@@ -193,11 +197,76 @@ function getNativeOutputOptions(prelude, sourcemap, minify) {
193
197
  intro: prelude,
194
198
  codeSplitting: false,
195
199
  strictExecutionOrder: true,
196
- minify: minify || "dce-only"
200
+ minify: minify || "dce-only",
201
+ keepNames: !minify
197
202
  };
198
203
  }
199
204
  function normalizeNativeCommonJSInterop(code) {
200
- return code.replace(/(\b__toESM(?:\$\d+)?\(\s*(?:require[\w$]*\(\)|[\w$]+|__rolldown_runtime__\.loadExports\("(?:\\.|[^"\\])*"\))\s*),\s*1(\s*\))/g, "$1$2");
205
+ if (!code.includes("__toESM")) return code;
206
+ const { program, errors } = parseSync("native-bundle.js", code, { lang: "js" });
207
+ if (errors.length) throw new Error(`[vxrn] cannot normalize native CommonJS interop: the bundle does not parse (${errors[0].message})`);
208
+ const deletions = [];
209
+ const stack = [program];
210
+ while (stack.length) {
211
+ const node = stack.pop();
212
+ if (Array.isArray(node)) {
213
+ for (let index = node.length - 1; index >= 0; index--) stack.push(node[index]);
214
+ continue;
215
+ }
216
+ if (!isInteropSyntaxNode(node)) continue;
217
+ if (node.type === "CallExpression") {
218
+ const span = interopNodeModeSpan(code, node);
219
+ if (span) deletions.push(span);
220
+ }
221
+ for (const key of Object.keys(node)) stack.push(node[key]);
222
+ }
223
+ deletions.sort((a, b) => b[0] - a[0]);
224
+ for (const [start, end] of deletions) code = code.slice(0, start) + code.slice(end);
225
+ return code;
226
+ }
227
+ function isInteropSyntaxNode(node) {
228
+ if (!node || typeof node !== "object") return false;
229
+ const candidate = node;
230
+ return typeof candidate.type === "string" && typeof candidate.start === "number" && typeof candidate.end === "number";
231
+ }
232
+ const NATIVE_INTEROP_HELPER = /^__toESM(?:\$\d+)?$/;
233
+ const NATIVE_INTEROP_REQUIRE = /^require[\w$]*$/;
234
+ function interopNodeModeSpan(code, node) {
235
+ const callee = node["callee"];
236
+ if (!isInteropSyntaxNode(callee) || !isInteropHelperCallee(callee) || node["optional"] === true) return;
237
+ const args = node["arguments"];
238
+ if (!Array.isArray(args) || args.length !== 2) return void 0;
239
+ const [first, second] = args;
240
+ if (!isInteropSyntaxNode(first) || !isInteropSyntaxNode(second)) return void 0;
241
+ if (!isInteropFirstArgument(first)) return void 0;
242
+ if (second.type !== "Literal" || second["raw"] !== "1") return void 0;
243
+ const between = code.slice(first.end, second.start);
244
+ if (!/^\s*,\s*$/.test(between)) return void 0;
245
+ if (!/^\s*\)/.test(code.slice(second.end))) return void 0;
246
+ return [first.end + between.indexOf(","), second.end];
247
+ }
248
+ function isInteropHelperCallee(callee) {
249
+ if (callee.type === "Identifier") return typeof callee["name"] === "string" && NATIVE_INTEROP_HELPER.test(callee["name"]);
250
+ if ((callee.type === "MemberExpression" || callee.type === "StaticMemberExpression") && callee["computed"] !== true) {
251
+ const property = callee["property"];
252
+ return isInteropSyntaxNode(property) && property.type === "Identifier" && typeof property["name"] === "string" && NATIVE_INTEROP_HELPER.test(property["name"]);
253
+ }
254
+ return false;
255
+ }
256
+ function isInteropFirstArgument(node) {
257
+ if (node.type === "Identifier") return true;
258
+ if (node.type !== "CallExpression" || node["optional"] === true) return false;
259
+ const callee = node["callee"];
260
+ if (!isInteropSyntaxNode(callee)) return false;
261
+ const args = node["arguments"];
262
+ if (!Array.isArray(args)) return false;
263
+ if (callee.type === "Identifier") return typeof callee["name"] === "string" && NATIVE_INTEROP_REQUIRE.test(callee["name"]) && args.length === 0;
264
+ if ((callee.type === "MemberExpression" || callee.type === "StaticMemberExpression") && callee["computed"] !== true && callee["optional"] !== true) {
265
+ const object = callee["object"];
266
+ const property = callee["property"];
267
+ return isInteropSyntaxNode(object) && object.type === "Identifier" && object["name"] === "__rolldown_runtime__" && isInteropSyntaxNode(property) && property.type === "Identifier" && property["name"] === "loadExports" && args.length === 1 && isInteropSyntaxNode(args[0]) && args[0].type === "Literal" && typeof args[0]["value"] === "string";
268
+ }
269
+ return false;
201
270
  }
202
271
  function blankPreservingLines(match) {
203
272
  return "\n".repeat(match.match(/\n/g)?.length ?? 0);
@@ -412,9 +481,26 @@ try {
412
481
  const chunk = result.output.find((o) => o.type === "chunk" && o.isEntry);
413
482
  if (chunk && "code" in chunk) {
414
483
  firstBuildError = null;
415
- let code = postProcessNativeBundle(chunk.code);
416
- code = await downlevelClassFieldsInBundle(code);
417
- assertBundleLinesPreserved(chunk.code, code, "dev");
484
+ let code;
485
+ try {
486
+ code = postProcessNativeBundle(chunk.code);
487
+ code = await downlevelClassFieldsInBundle(code);
488
+ assertBundleLinesPreserved(chunk.code, code, "dev");
489
+ } catch (error) {
490
+ const failure = error instanceof Error ? error : new Error(String(error));
491
+ console.error("[vxrn] native bundle post-processing failed:", failure.message);
492
+ if (!currentBundle) {
493
+ firstBuildError = failure;
494
+ if (bundleReject) {
495
+ const reject = bundleReject;
496
+ bundleResolve = null;
497
+ bundleReject = null;
498
+ bundlePromise = null;
499
+ reject(failure);
500
+ }
501
+ }
502
+ return;
503
+ }
418
504
  code = wrapNativeBundleModuleScope(code);
419
505
  if (!chunk.map) throw new Error("[vxrn] rolldown produced no source map for the dev bundle, so /symbolicate cannot resolve a frame");
420
506
  currentBundle = {
@@ -519,7 +605,7 @@ async function buildNativeBundle(options) {
519
605
  dev,
520
606
  platform
521
607
  }).plugin],
522
- ...getNativePlugins(root, platform, viteImportGlobPlugin, dev, assetsDest, void 0, sourcemap, userPlugins),
608
+ ...getNativePlugins(root, platform, viteImportGlobPlugin, dev, assetsDest, void 0, sourcemap, userPlugins, minify),
523
609
  nativeBundlePostProcessPlugin()
524
610
  ],
525
611
  output: {
@@ -1168,6 +1254,16 @@ if (import.meta.hot) {
1168
1254
  }
1169
1255
  };
1170
1256
  }
1257
+ function mixedNativeModulePlugin(sourceMaps) {
1258
+ return {
1259
+ name: "vxrn:mixed-native-module",
1260
+ async transform(code, id) {
1261
+ if (!/\.[cm]?[jt]sx?$/.test(id) || id.includes("\0")) return;
1262
+ const { transformMixedNativeModule } = await import("@vxrn/compiler");
1263
+ return transformMixedNativeModule(code, id, sourceMaps);
1264
+ }
1265
+ };
1266
+ }
1171
1267
  function flowStripPlugin() {
1172
1268
  return {
1173
1269
  name: "vxrn:flow-strip",
@@ -1285,7 +1381,7 @@ async function getNativeAssetData(id, root, platform) {
1285
1381
  };
1286
1382
  if (NATIVE_IMAGE_EXTS.has(requested.type)) try {
1287
1383
  const { imageSize } = await import("image-size");
1288
- const dims = imageSize(files[0]);
1384
+ const dims = imageSize(readFileSync(files[0]));
1289
1385
  assetData.width = dims.width === void 0 ? void 0 : dims.width / scales[0];
1290
1386
  assetData.height = dims.height === void 0 ? void 0 : dims.height / scales[0];
1291
1387
  } catch {}
@@ -1331,7 +1427,7 @@ function copyNativeAssetFiles(asset, assetsDest, platform) {
1331
1427
  copyFileSync(asset.files[index], destination);
1332
1428
  }
1333
1429
  }
1334
- function hermesCompatSWCPlugin(dev, sourceMaps = false) {
1430
+ function hermesCompatSWCPlugin(dev, sourceMaps = false, keepNames = false) {
1335
1431
  let oxc = null;
1336
1432
  return {
1337
1433
  name: "vxrn:hermes-compat",
@@ -1375,7 +1471,7 @@ ${err.codeframe}` : ""));
1375
1471
  output = classes;
1376
1472
  }
1377
1473
  }
1378
- const lowered = await transformHermesAsync(output?.code ?? code, id, sourceMaps);
1474
+ const lowered = await transformHermesAsync(output?.code ?? code, id, sourceMaps, void 0, keepNames);
1379
1475
  if (!lowered) return output;
1380
1476
  if (lowered.map && output?.map) {
1381
1477
  const remapping = (await import("@jridgewell/remapping")).default;
@@ -1546,6 +1642,10 @@ class ReactNativeDevRuntime extends BaseDevRuntime {
1546
1642
  if (!this.isExecuted(changedId)) continue;
1547
1643
  if (!this.findBoundaries(changedId, traversed, updateSet, boundaries)) return false;
1548
1644
  }
1645
+ // register the patch's factories even when no changed module has run yet,
1646
+ // so a later first import executes the edited code rather than a stale one
1647
+ if (globalThis.globalEvalWithSourceUrl) globalThis.globalEvalWithSourceUrl(code);
1648
+ else (0, eval)(code);
1549
1649
  if (boundaries.length === 0) return true;
1550
1650
 
1551
1651
  var callbacks = boundaries.map(function(item) {
@@ -1566,9 +1666,6 @@ class ReactNativeDevRuntime extends BaseDevRuntime {
1566
1666
  };
1567
1667
  }, this);
1568
1668
 
1569
- if (globalThis.globalEvalWithSourceUrl) globalThis.globalEvalWithSourceUrl(code);
1570
- else (0, eval)(code);
1571
-
1572
1669
  var modulesToReplace = Array.from(updateSet);
1573
1670
  for (var j = 0; j < modulesToReplace.length; j++) {
1574
1671
  if (!this.hasFactory(modulesToReplace[j])) return false;