@vxrn/vite-plugin-metro 1.2.33 → 1.2.35

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.
@@ -1,9 +1,13 @@
1
1
  import { existsSync } from "node:fs";
2
2
  import { readFile } from "node:fs/promises";
3
3
  import launchEditor from "launch-editor";
4
+ import { createDebugger } from "@vxrn/debug";
4
5
  import { projectImport } from "../utils/projectImport.mjs";
5
6
  import { getMetroConfigFromViteConfig } from "../metro-config/getMetroConfigFromViteConfig.mjs";
6
7
  import { patchMetroServerWithViteConfigAndMetroPluginOptions } from "../metro-config/patchMetroServerWithViteConfigAndMetroPluginOptions.mjs";
8
+ const {
9
+ debug
10
+ } = createDebugger("vite-plugin-metro");
7
11
  function metroPlugin(options = {}) {
8
12
  return globalThis.__viteMetroPluginOptions__ = options, {
9
13
  name: "metro",
@@ -12,16 +16,24 @@ function metroPlugin(options = {}) {
12
16
  // },
13
17
  configureServer(server) {
14
18
  const {
15
- root: projectRoot
16
- } = server.config,
17
- metroStartTime = Date.now();
19
+ root: projectRoot
20
+ } = server.config;
18
21
  let metroReady = !1,
19
22
  middleware,
20
23
  metroServer,
21
24
  hmrServer,
22
25
  websocketEndpoints,
23
- rnDevtoolsMiddleware;
24
- const metroPromise = (async () => {
26
+ rnDevtoolsMiddleware,
27
+ metroPromise,
28
+ metroPromiseResolvers;
29
+ metroPromise = new Promise((resolve, reject) => {
30
+ metroPromiseResolvers = {
31
+ resolve,
32
+ reject
33
+ };
34
+ });
35
+ const startMetro = async () => {
36
+ const metroStartTime = Date.now();
25
37
  try {
26
38
  const {
27
39
  default: Metro
@@ -53,28 +65,42 @@ function metroPlugin(options = {}) {
53
65
  websocketServer: hmrServer
54
66
  }),
55
67
  ...devMiddleware.websocketEndpoints
56
- }, metroReady = !0;
68
+ }, server.httpServer?.on("upgrade", (request, socket, head) => {
69
+ const pathname = new URL(request.url, `http://${request.headers.host}`).pathname;
70
+ websocketEndpoints[pathname] && websocketEndpoints[pathname].handleUpgrade(request, socket, head, ws => {
71
+ websocketEndpoints[pathname].emit("connection", ws, request);
72
+ });
73
+ }), server.middlewares.use(rnDevtoolsMiddleware), metroReady = !0;
57
74
  const metroElapsed = Date.now() - metroStartTime;
58
- console.info(`[metro] Metro bundler ready (${metroElapsed}ms)`);
75
+ debug?.(`Metro bundler ready (${metroElapsed}ms)`), metroPromiseResolvers.resolve();
59
76
  } catch (err) {
60
- throw console.error("[metro] Error during Metro initialization:", err), err;
77
+ throw debug?.(`Error during Metro initialization: ${err}`), metroPromiseResolvers.reject(err), err;
61
78
  }
62
- })();
63
- metroPromise.catch(err => {
64
- console.error("[metro] Failed to start Metro:", err);
65
- }), metroPromise.then(() => {
66
- server.httpServer?.on("upgrade", (request, socket, head) => {
67
- const pathname = new URL(request.url, `http://${request.headers.host}`).pathname;
68
- websocketEndpoints[pathname] && websocketEndpoints[pathname].handleUpgrade(request, socket, head, ws => {
69
- websocketEndpoints[pathname].emit("connection", ws, request);
70
- });
71
- }), server.middlewares.use(rnDevtoolsMiddleware);
72
- }), server.middlewares.use(async (req, res, next) => {
79
+ };
80
+ if (server.httpServer) server.httpServer.listening ? startMetro().catch(err => {
81
+ debug?.(`Failed to start Metro: ${err}`);
82
+ }) : server.httpServer.on("listening", () => {
83
+ startMetro().catch(err => {
84
+ debug?.(`Failed to start Metro: ${err}`);
85
+ });
86
+ });else {
87
+ const waitForServer = () => {
88
+ server.httpServer ? server.httpServer.listening ? startMetro().catch(err => {
89
+ debug?.(`Failed to start Metro: ${err}`);
90
+ }) : server.httpServer.on("listening", () => {
91
+ startMetro().catch(err => {
92
+ debug?.(`Failed to start Metro: ${err}`);
93
+ });
94
+ }) : setTimeout(waitForServer, 10);
95
+ };
96
+ waitForServer();
97
+ }
98
+ server.middlewares.use(async (req, res, next) => {
73
99
  if (req.url?.includes(".bundle") && !metroReady && (await metroPromise), middleware) try {
74
100
  if (req.url?.includes(".bundle")) {
75
101
  const VITE_METRO_DEBUG_BUNDLE = process.env.VITE_METRO_DEBUG_BUNDLE;
76
102
  if (VITE_METRO_DEBUG_BUNDLE && existsSync(VITE_METRO_DEBUG_BUNDLE)) {
77
- console.info(" !!! - serving debug bundle from", VITE_METRO_DEBUG_BUNDLE);
103
+ debug?.(`serving debug bundle from ${VITE_METRO_DEBUG_BUNDLE}`);
78
104
  const content = await readFile(VITE_METRO_DEBUG_BUNDLE, "utf-8");
79
105
  res.setHeader("Content-Type", "application/javascript"), res.end(content);
80
106
  return;
@@ -98,14 +124,14 @@ function metroPlugin(options = {}) {
98
124
  const frame = JSON.parse(body);
99
125
  launchEditor(frame.file), res.statusCode = 200, res.end("Stack frame opened in editor");
100
126
  } catch (e) {
101
- return console.error("Failed to parse stack frame:", e), res.statusCode = 400, res.end("Invalid stack frame JSON");
127
+ return debug?.(`Failed to parse stack frame: ${e}`), res.statusCode = 400, res.end("Invalid stack frame JSON");
102
128
  }
103
129
  });
104
130
  return;
105
131
  }
106
132
  await middleware(req, res, next);
107
133
  } catch (error) {
108
- console.error("Metro middleware error:", error), next();
134
+ debug?.(`Metro middleware error: ${error}`), next();
109
135
  } else next();
110
136
  });
111
137
  }
@@ -1 +1 @@
1
- {"version":3,"names":["existsSync","readFile","launchEditor","projectImport","getMetroConfigFromViteConfig","patchMetroServerWithViteConfigAndMetroPluginOptions","metroPlugin","options","globalThis","__viteMetroPluginOptions__","name","configureServer","server","root","projectRoot","config","metroStartTime","Date","now","metroReady","middleware","metroServer","hmrServer","websocketEndpoints","rnDevtoolsMiddleware","metroPromise","default","Metro","MetroHmrServer","createWebsocketServer","createDevMiddleware","metroResult","createConnectMiddleware","watch","getBundler","getCreateModuleId","reactNativeDevToolsUrl","host","port","devMiddleware","serverBaseUrl","logger","console","websocketServer","metroElapsed","info","err","error","catch","then","httpServer","on","request","socket","head","pathname","URL","url","headers","handleUpgrade","ws","emit","middlewares","use","req","res","next","includes","VITE_METRO_DEBUG_BUNDLE","process","env","content","setHeader","end","statusCode","method","body","chunk","toString","frame","JSON","parse","file","e"],"sources":["../../../src/plugins/metroPlugin.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["existsSync","readFile","launchEditor","createDebugger","projectImport","getMetroConfigFromViteConfig","patchMetroServerWithViteConfigAndMetroPluginOptions","debug","metroPlugin","options","globalThis","__viteMetroPluginOptions__","name","configureServer","server","root","projectRoot","config","metroReady","middleware","metroServer","hmrServer","websocketEndpoints","rnDevtoolsMiddleware","metroPromise","metroPromiseResolvers","Promise","resolve","reject","startMetro","metroStartTime","Date","now","default","Metro","MetroHmrServer","createWebsocketServer","createDevMiddleware","metroResult","createConnectMiddleware","watch","getBundler","getCreateModuleId","reactNativeDevToolsUrl","host","port","devMiddleware","serverBaseUrl","logger","console","websocketServer","httpServer","on","request","socket","head","pathname","URL","url","headers","handleUpgrade","ws","emit","middlewares","use","metroElapsed","err","listening","catch","waitForServer","setTimeout","req","res","next","includes","VITE_METRO_DEBUG_BUNDLE","process","env","content","setHeader","end","statusCode","method","body","chunk","toString","frame","JSON","parse","file","e","error"],"sources":["../../../src/plugins/metroPlugin.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -1,9 +1,13 @@
1
1
  import { existsSync } from "fs";
2
2
  import { readFile } from "fs/promises";
3
3
  import launchEditor from "launch-editor";
4
+ import { createDebugger } from "@vxrn/debug";
4
5
  import { projectImport } from "../utils/projectImport.native.js";
5
6
  import { getMetroConfigFromViteConfig } from "../metro-config/getMetroConfigFromViteConfig.native.js";
6
7
  import { patchMetroServerWithViteConfigAndMetroPluginOptions } from "../metro-config/patchMetroServerWithViteConfigAndMetroPluginOptions.native.js";
8
+ var {
9
+ debug
10
+ } = createDebugger("vite-plugin-metro");
7
11
  function metroPlugin() {
8
12
  var options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
9
13
  return globalThis.__viteMetroPluginOptions__ = options, {
@@ -15,70 +19,92 @@ function metroPlugin() {
15
19
  var {
16
20
  root: projectRoot
17
21
  } = server.config,
18
- metroStartTime = Date.now(),
19
22
  metroReady = !1,
20
23
  middleware,
21
24
  metroServer,
22
25
  hmrServer,
23
26
  websocketEndpoints,
24
27
  rnDevtoolsMiddleware,
25
- metroPromise = async function () {
26
- try {
27
- var {
28
- default: Metro
29
- } = await projectImport(projectRoot, "metro"),
30
- {
31
- default: MetroHmrServer
32
- } = await projectImport(projectRoot, "metro/private/HmrServer"),
33
- {
34
- default: createWebsocketServer
35
- } = await projectImport(projectRoot, "metro/private/lib/createWebsocketServer"),
36
- {
37
- createDevMiddleware
38
- } = await projectImport(projectRoot, "@react-native/dev-middleware"),
39
- config = await getMetroConfigFromViteConfig(server.config, options),
40
- metroResult = await Metro.createConnectMiddleware(config, {
41
- // Force enable file watching, even on CI.
42
- // This is needed for HMR tests to work on CI.
43
- watch: !0
44
- });
45
- middleware = metroResult.middleware, metroServer = metroResult.metroServer, patchMetroServerWithViteConfigAndMetroPluginOptions(metroServer, server.config, options), hmrServer = new MetroHmrServer(metroServer.getBundler(), metroServer.getCreateModuleId(), config);
46
- var reactNativeDevToolsUrl = `http://${typeof server.config.server.host == "boolean" ? "localhost" : server.config.server.host}:${server.config.server.port}`,
47
- devMiddleware = createDevMiddleware({
48
- projectRoot,
49
- serverBaseUrl: reactNativeDevToolsUrl,
50
- logger: console
51
- });
52
- rnDevtoolsMiddleware = devMiddleware.middleware, websocketEndpoints = {
53
- "/hot": createWebsocketServer({
54
- websocketServer: hmrServer
55
- }),
56
- ...devMiddleware.websocketEndpoints
57
- }, metroReady = !0;
58
- var metroElapsed = Date.now() - metroStartTime;
59
- console.info(`[metro] Metro bundler ready (${metroElapsed}ms)`);
60
- } catch (err) {
61
- throw console.error("[metro] Error during Metro initialization:", err), err;
62
- }
63
- }();
64
- metroPromise.catch(function (err) {
65
- console.error("[metro] Failed to start Metro:", err);
66
- }), metroPromise.then(function () {
67
- var _server_httpServer;
68
- (_server_httpServer = server.httpServer) === null || _server_httpServer === void 0 || _server_httpServer.on("upgrade", function (request, socket, head) {
69
- var pathname = new URL(request.url, `http://${request.headers.host}`).pathname;
70
- websocketEndpoints[pathname] && websocketEndpoints[pathname].handleUpgrade(request, socket, head, function (ws) {
71
- websocketEndpoints[pathname].emit("connection", ws, request);
72
- });
73
- }), server.middlewares.use(rnDevtoolsMiddleware);
74
- }), server.middlewares.use(async function (req, res, next) {
28
+ metroPromise,
29
+ metroPromiseResolvers;
30
+ metroPromise = new Promise(function (resolve, reject) {
31
+ metroPromiseResolvers = {
32
+ resolve,
33
+ reject
34
+ };
35
+ });
36
+ var startMetro = async function () {
37
+ var metroStartTime = Date.now();
38
+ try {
39
+ var _server_httpServer,
40
+ {
41
+ default: Metro
42
+ } = await projectImport(projectRoot, "metro"),
43
+ {
44
+ default: MetroHmrServer
45
+ } = await projectImport(projectRoot, "metro/private/HmrServer"),
46
+ {
47
+ default: createWebsocketServer
48
+ } = await projectImport(projectRoot, "metro/private/lib/createWebsocketServer"),
49
+ {
50
+ createDevMiddleware
51
+ } = await projectImport(projectRoot, "@react-native/dev-middleware"),
52
+ config = await getMetroConfigFromViteConfig(server.config, options),
53
+ metroResult = await Metro.createConnectMiddleware(config, {
54
+ // Force enable file watching, even on CI.
55
+ // This is needed for HMR tests to work on CI.
56
+ watch: !0
57
+ });
58
+ middleware = metroResult.middleware, metroServer = metroResult.metroServer, patchMetroServerWithViteConfigAndMetroPluginOptions(metroServer, server.config, options), hmrServer = new MetroHmrServer(metroServer.getBundler(), metroServer.getCreateModuleId(), config);
59
+ var reactNativeDevToolsUrl = `http://${typeof server.config.server.host == "boolean" ? "localhost" : server.config.server.host}:${server.config.server.port}`,
60
+ devMiddleware = createDevMiddleware({
61
+ projectRoot,
62
+ serverBaseUrl: reactNativeDevToolsUrl,
63
+ logger: console
64
+ });
65
+ rnDevtoolsMiddleware = devMiddleware.middleware, websocketEndpoints = {
66
+ "/hot": createWebsocketServer({
67
+ websocketServer: hmrServer
68
+ }),
69
+ ...devMiddleware.websocketEndpoints
70
+ }, (_server_httpServer = server.httpServer) === null || _server_httpServer === void 0 || _server_httpServer.on("upgrade", function (request, socket, head) {
71
+ var pathname = new URL(request.url, `http://${request.headers.host}`).pathname;
72
+ websocketEndpoints[pathname] && websocketEndpoints[pathname].handleUpgrade(request, socket, head, function (ws) {
73
+ websocketEndpoints[pathname].emit("connection", ws, request);
74
+ });
75
+ }), server.middlewares.use(rnDevtoolsMiddleware), metroReady = !0;
76
+ var metroElapsed = Date.now() - metroStartTime;
77
+ debug?.(`Metro bundler ready (${metroElapsed}ms)`), metroPromiseResolvers.resolve();
78
+ } catch (err) {
79
+ throw debug?.(`Error during Metro initialization: ${err}`), metroPromiseResolvers.reject(err), err;
80
+ }
81
+ };
82
+ if (server.httpServer) server.httpServer.listening ? startMetro().catch(function (err) {
83
+ debug?.(`Failed to start Metro: ${err}`);
84
+ }) : server.httpServer.on("listening", function () {
85
+ startMetro().catch(function (err) {
86
+ debug?.(`Failed to start Metro: ${err}`);
87
+ });
88
+ });else {
89
+ var waitForServer = function () {
90
+ server.httpServer ? server.httpServer.listening ? startMetro().catch(function (err) {
91
+ debug?.(`Failed to start Metro: ${err}`);
92
+ }) : server.httpServer.on("listening", function () {
93
+ startMetro().catch(function (err) {
94
+ debug?.(`Failed to start Metro: ${err}`);
95
+ });
96
+ }) : setTimeout(waitForServer, 10);
97
+ };
98
+ waitForServer();
99
+ }
100
+ server.middlewares.use(async function (req, res, next) {
75
101
  var _req_url;
76
102
  if (!((_req_url = req.url) === null || _req_url === void 0) && _req_url.includes(".bundle") && !metroReady && (await metroPromise), middleware) try {
77
103
  var _req_url1, _req_headers_useragent, _req_headers_useragent1;
78
104
  if (!((_req_url1 = req.url) === null || _req_url1 === void 0) && _req_url1.includes(".bundle")) {
79
105
  var VITE_METRO_DEBUG_BUNDLE = process.env.VITE_METRO_DEBUG_BUNDLE;
80
106
  if (VITE_METRO_DEBUG_BUNDLE && existsSync(VITE_METRO_DEBUG_BUNDLE)) {
81
- console.info(" !!! - serving debug bundle from", VITE_METRO_DEBUG_BUNDLE);
107
+ debug?.(`serving debug bundle from ${VITE_METRO_DEBUG_BUNDLE}`);
82
108
  var content = await readFile(VITE_METRO_DEBUG_BUNDLE, "utf-8");
83
109
  res.setHeader("Content-Type", "application/javascript"), res.end(content);
84
110
  return;
@@ -97,14 +123,14 @@ function metroPlugin() {
97
123
  var frame = JSON.parse(body);
98
124
  launchEditor(frame.file), res.statusCode = 200, res.end("Stack frame opened in editor");
99
125
  } catch (e) {
100
- return console.error("Failed to parse stack frame:", e), res.statusCode = 400, res.end("Invalid stack frame JSON");
126
+ return debug?.(`Failed to parse stack frame: ${e}`), res.statusCode = 400, res.end("Invalid stack frame JSON");
101
127
  }
102
128
  });
103
129
  return;
104
130
  }
105
131
  await middleware(req, res, next);
106
132
  } catch (error) {
107
- console.error("Metro middleware error:", error), next();
133
+ debug?.(`Metro middleware error: ${error}`), next();
108
134
  } else next();
109
135
  });
110
136
  }
@@ -1 +1 @@
1
- {"version":3,"names":["existsSync","readFile","launchEditor","projectImport","getMetroConfigFromViteConfig","patchMetroServerWithViteConfigAndMetroPluginOptions","metroPlugin","options","arguments","length","globalThis","__viteMetroPluginOptions__","name","configureServer","server","root","projectRoot","config","metroStartTime","Date","now","metroReady","middleware","metroServer","hmrServer","websocketEndpoints","rnDevtoolsMiddleware","metroPromise","default","Metro","MetroHmrServer","createWebsocketServer","createDevMiddleware","metroResult","createConnectMiddleware","watch","getBundler","getCreateModuleId","reactNativeDevToolsUrl","host","port","devMiddleware","serverBaseUrl","logger","console","websocketServer","metroElapsed","info","err","error","catch","then","_server_httpServer","httpServer","on","request","socket","head","pathname","URL","url","headers","handleUpgrade","ws","emit","middlewares","use","req","res","next","_req_url","includes","_req_url1","_req_headers_useragent","_req_headers_useragent1","VITE_METRO_DEBUG_BUNDLE","process","env","content","setHeader","end","statusCode","method","body","chunk","toString","frame","JSON","parse","file","e"],"sources":["../../../src/plugins/metroPlugin.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["existsSync","readFile","launchEditor","createDebugger","projectImport","getMetroConfigFromViteConfig","patchMetroServerWithViteConfigAndMetroPluginOptions","debug","metroPlugin","options","arguments","length","globalThis","__viteMetroPluginOptions__","name","configureServer","server","root","projectRoot","config","metroReady","middleware","metroServer","hmrServer","websocketEndpoints","rnDevtoolsMiddleware","metroPromise","metroPromiseResolvers","Promise","resolve","reject","startMetro","metroStartTime","Date","now","_server_httpServer","default","Metro","MetroHmrServer","createWebsocketServer","createDevMiddleware","metroResult","createConnectMiddleware","watch","getBundler","getCreateModuleId","reactNativeDevToolsUrl","host","port","devMiddleware","serverBaseUrl","logger","console","websocketServer","httpServer","on","request","socket","head","pathname","URL","url","headers","handleUpgrade","ws","emit","middlewares","use","metroElapsed","err","listening","catch","waitForServer","setTimeout","req","res","next","_req_url","includes","_req_url1","_req_headers_useragent","_req_headers_useragent1","VITE_METRO_DEBUG_BUNDLE","process","env","content","setHeader","end","statusCode","method","body","chunk","toString","frame","JSON","parse","file","e","error"],"sources":["../../../src/plugins/metroPlugin.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vxrn/vite-plugin-metro",
3
- "version": "1.2.33",
3
+ "version": "1.2.35",
4
4
  "sideEffects": false,
5
5
  "type": "module",
6
6
  "main": "dist/cjs",
@@ -60,7 +60,7 @@
60
60
  "@babel/core": "^7.28.5",
61
61
  "@babel/helper-plugin-utils": "^7.27.1",
62
62
  "@babel/types": "^7.28.5",
63
- "@vxrn/debug": "1.2.33",
63
+ "@vxrn/debug": "1.2.35",
64
64
  "babel-preset-expo": "*",
65
65
  "launch-editor": "^2.10.0",
66
66
  "micromatch": "^4.0.8",
@@ -2,6 +2,9 @@ import { existsSync } from 'node:fs'
2
2
  import { readFile } from 'node:fs/promises'
3
3
  import type { PluginOption } from 'vite'
4
4
  import launchEditor from 'launch-editor'
5
+ import { createDebugger } from '@vxrn/debug'
6
+
7
+ const { debug } = createDebugger('vite-plugin-metro')
5
8
 
6
9
  // For Metro and Expo, we only import types here.
7
10
  // We use `projectImport` to dynamically import the actual modules
@@ -74,21 +77,28 @@ export function metroPlugin(options: MetroPluginOptions = {}): PluginOption {
74
77
  configureServer(server) {
75
78
  const { root: projectRoot } = server.config
76
79
 
77
- // Track Metro startup separately from Vite
78
- const metroStartTime = Date.now()
79
80
  let metroReady = false
80
81
 
81
- // Start Metro in background WITHOUT blocking Vite server startup
82
- // All imports and config are done inside metroPromise to avoid blocking
82
+ // Metro state - initialized after Vite server is listening
83
83
  let middleware: Awaited<ReturnType<typeof MetroT.createConnectMiddleware>>['middleware']
84
84
  let metroServer: Awaited<ReturnType<typeof MetroT.createConnectMiddleware>>['metroServer']
85
85
  let hmrServer: MetroHmrServerT
86
86
  let websocketEndpoints: Record<string, ReturnType<typeof createWebsocketServerT>>
87
87
  let rnDevtoolsMiddleware: ReturnType<typeof createDevMiddlewareT>['middleware']
88
88
 
89
- const metroPromise = (async () => {
89
+ let metroPromise: Promise<void>
90
+ let metroPromiseResolvers: { resolve: () => void; reject: (err: Error) => void }
91
+
92
+ // Create a promise that will be resolved when Metro is ready
93
+ // This is used by the middleware to wait for Metro on bundle requests
94
+ metroPromise = new Promise((resolve, reject) => {
95
+ metroPromiseResolvers = { resolve, reject }
96
+ })
97
+
98
+ const startMetro = async () => {
99
+ const metroStartTime = Date.now()
90
100
  try {
91
- // Import Metro modules lazily to avoid blocking Vite startup
101
+ // Import Metro modules lazily - only after Vite server is listening
92
102
  const { default: Metro } = await projectImport<{
93
103
  default: typeof MetroT
94
104
  }>(projectRoot, 'metro')
@@ -111,61 +121,94 @@ export function metroPlugin(options: MetroPluginOptions = {}): PluginOption {
111
121
  watch: true,
112
122
  })
113
123
 
114
- middleware = metroResult.middleware
115
- metroServer = metroResult.metroServer
116
-
117
- patchMetroServerWithViteConfigAndMetroPluginOptions(metroServer, server.config, options)
118
-
119
- hmrServer = new MetroHmrServer(
120
- metroServer.getBundler(),
121
- metroServer.getCreateModuleId(),
122
- config
123
- )
124
-
125
- const reactNativeDevToolsUrl = `http://${typeof server.config.server.host === 'boolean' ? 'localhost' : server.config.server.host}:${server.config.server.port}`
126
- const devMiddleware = createDevMiddleware({
127
- projectRoot,
128
- serverBaseUrl: reactNativeDevToolsUrl,
129
- logger: console,
130
- })
131
-
132
- rnDevtoolsMiddleware = devMiddleware.middleware
133
- websocketEndpoints = {
134
- '/hot': createWebsocketServer({
135
- websocketServer: hmrServer,
136
- }),
137
- ...devMiddleware.websocketEndpoints,
138
- }
124
+ middleware = metroResult.middleware
125
+ metroServer = metroResult.metroServer
126
+
127
+ patchMetroServerWithViteConfigAndMetroPluginOptions(metroServer, server.config, options)
128
+
129
+ hmrServer = new MetroHmrServer(
130
+ metroServer.getBundler(),
131
+ metroServer.getCreateModuleId(),
132
+ config
133
+ )
134
+
135
+ const reactNativeDevToolsUrl = `http://${typeof server.config.server.host === 'boolean' ? 'localhost' : server.config.server.host}:${server.config.server.port}`
136
+ const devMiddleware = createDevMiddleware({
137
+ projectRoot,
138
+ serverBaseUrl: reactNativeDevToolsUrl,
139
+ logger: console,
140
+ })
141
+
142
+ rnDevtoolsMiddleware = devMiddleware.middleware
143
+ websocketEndpoints = {
144
+ '/hot': createWebsocketServer({
145
+ websocketServer: hmrServer,
146
+ }),
147
+ ...devMiddleware.websocketEndpoints,
148
+ }
149
+
150
+ // Setup websocket handling
151
+ server.httpServer?.on('upgrade', (request, socket, head) => {
152
+ const pathname = new URL(request.url!, `http://${request.headers.host}`).pathname
153
+
154
+ if (websocketEndpoints[pathname]) {
155
+ websocketEndpoints[pathname].handleUpgrade(request, socket, head, (ws) => {
156
+ websocketEndpoints[pathname].emit('connection', ws, request)
157
+ })
158
+ }
159
+ })
160
+
161
+ // Insert devtools middleware
162
+ server.middlewares.use(rnDevtoolsMiddleware)
139
163
 
140
164
  metroReady = true
141
165
  const metroElapsed = Date.now() - metroStartTime
142
- console.info(`[metro] Metro bundler ready (${metroElapsed}ms)`)
166
+ debug?.(`Metro bundler ready (${metroElapsed}ms)`)
167
+ metroPromiseResolvers.resolve()
143
168
  } catch (err) {
144
- console.error('[metro] Error during Metro initialization:', err)
169
+ debug?.(`Error during Metro initialization: ${err}`)
170
+ metroPromiseResolvers.reject(err as Error)
145
171
  throw err
146
172
  }
147
- })()
148
-
149
- // Don't await - let Metro initialize in parallel
150
- metroPromise.catch((err) => {
151
- console.error('[metro] Failed to start Metro:', err)
152
- })
153
-
154
- // Setup websocket handling after Metro is ready
155
- metroPromise.then(() => {
156
- server.httpServer?.on('upgrade', (request, socket, head) => {
157
- const pathname = new URL(request.url!, `http://${request.headers.host}`).pathname
158
-
159
- if (websocketEndpoints[pathname]) {
160
- websocketEndpoints[pathname].handleUpgrade(request, socket, head, (ws) => {
161
- websocketEndpoints[pathname].emit('connection', ws, request)
173
+ }
174
+
175
+ // Wait for Vite server to be listening before starting Metro
176
+ // This ensures Metro logs appear AFTER Vite's server URLs
177
+ if (server.httpServer) {
178
+ if (server.httpServer.listening) {
179
+ // Server is already listening (unlikely but handle it)
180
+ startMetro().catch((err) => {
181
+ debug?.(`Failed to start Metro: ${err}`)
182
+ })
183
+ } else {
184
+ server.httpServer.on('listening', () => {
185
+ startMetro().catch((err) => {
186
+ debug?.(`Failed to start Metro: ${err}`)
162
187
  })
188
+ })
189
+ }
190
+ } else {
191
+ // No httpServer yet, wait for it via a small delay and retry
192
+ // This shouldn't normally happen but is a safety fallback
193
+ const waitForServer = () => {
194
+ if (server.httpServer) {
195
+ if (server.httpServer.listening) {
196
+ startMetro().catch((err) => {
197
+ debug?.(`Failed to start Metro: ${err}`)
198
+ })
199
+ } else {
200
+ server.httpServer.on('listening', () => {
201
+ startMetro().catch((err) => {
202
+ debug?.(`Failed to start Metro: ${err}`)
203
+ })
204
+ })
205
+ }
206
+ } else {
207
+ setTimeout(waitForServer, 10)
163
208
  }
164
- })
165
-
166
- // Insert devtools middleware after Metro is ready
167
- server.middlewares.use(rnDevtoolsMiddleware)
168
- })
209
+ }
210
+ waitForServer()
211
+ }
169
212
 
170
213
  server.middlewares.use(async (req, res, next) => {
171
214
  // Wait for Metro if it's a bundle request and Metro isn't ready yet
@@ -181,7 +224,7 @@ export function metroPlugin(options: MetroPluginOptions = {}): PluginOption {
181
224
  const VITE_METRO_DEBUG_BUNDLE = process.env.VITE_METRO_DEBUG_BUNDLE
182
225
  if (VITE_METRO_DEBUG_BUNDLE) {
183
226
  if (existsSync(VITE_METRO_DEBUG_BUNDLE)) {
184
- console.info(` !!! - serving debug bundle from`, VITE_METRO_DEBUG_BUNDLE)
227
+ debug?.(`serving debug bundle from ${VITE_METRO_DEBUG_BUNDLE}`)
185
228
  const content = await readFile(VITE_METRO_DEBUG_BUNDLE, 'utf-8')
186
229
  res.setHeader('Content-Type', 'application/javascript')
187
230
  res.end(content)
@@ -221,7 +264,7 @@ export function metroPlugin(options: MetroPluginOptions = {}): PluginOption {
221
264
  res.statusCode = 200
222
265
  res.end('Stack frame opened in editor')
223
266
  } catch (e) {
224
- console.error('Failed to parse stack frame:', e)
267
+ debug?.(`Failed to parse stack frame: ${e}`)
225
268
  res.statusCode = 400
226
269
  return res.end('Invalid stack frame JSON')
227
270
  }
@@ -233,8 +276,7 @@ export function metroPlugin(options: MetroPluginOptions = {}): PluginOption {
233
276
  // this is the actual Metro middleware that handles bundle requests
234
277
  await (middleware as any)(req, res, next)
235
278
  } catch (error) {
236
- // TODO: handle errors from Metro middleware?
237
- console.error('Metro middleware error:', error)
279
+ debug?.(`Metro middleware error: ${error}`)
238
280
  next()
239
281
  }
240
282
  } else {
@@ -1 +1 @@
1
- {"version":3,"file":"metroPlugin.d.ts","sourceRoot":"","sources":["../../src/plugins/metroPlugin.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,MAAM,CAAA;AAOxC,OAAO,KAAK,EAAE,UAAU,IAAI,WAAW,EAAE,MAAM,OAAO,CAAA;AAMtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AAIjE,KAAK,kBAAkB,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;AAC3D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;AAEzD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,CAAC,EAAE,kBAAkB,CAAA;IACzB,sBAAsB,CAAC,EACnB,gBAAgB,GAChB,CAAC,CAAC,aAAa,EAAE,gBAAgB,KAAK,gBAAgB,CAAC,CAAA;IAC3D;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;;;;;;;;;OAUG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;IACzB,kDAAkD;IAClD,WAAW,CAAC,EAAE,gBAAgB,CAAA;IAC9B,oBAAoB,CAAC,EAAE,CAAC,aAAa,EAAE,gBAAgB,KAAK,gBAAgB,CAAA;IAC5E;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB,CAAA;AAED,wBAAgB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,YAAY,CA4L1E"}
1
+ {"version":3,"file":"metroPlugin.d.ts","sourceRoot":"","sources":["../../src/plugins/metroPlugin.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,MAAM,CAAA;AAUxC,OAAO,KAAK,EAAE,UAAU,IAAI,WAAW,EAAE,MAAM,OAAO,CAAA;AAMtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AAIjE,KAAK,kBAAkB,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;AAC3D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;AAEzD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,CAAC,EAAE,kBAAkB,CAAA;IACzB,sBAAsB,CAAC,EACnB,gBAAgB,GAChB,CAAC,CAAC,aAAa,EAAE,gBAAgB,KAAK,gBAAgB,CAAC,CAAA;IAC3D;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;;;;;;;;;OAUG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;IACzB,kDAAkD;IAClD,WAAW,CAAC,EAAE,gBAAgB,CAAA;IAC9B,oBAAoB,CAAC,EAAE,CAAC,aAAa,EAAE,gBAAgB,KAAK,gBAAgB,CAAA;IAC5E;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB,CAAA;AAED,wBAAgB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,YAAY,CAmO1E"}