@vxrn/vite-plugin-metro 1.8.0 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/plugins/metroPlugin.cjs +57 -53
- package/dist/cjs/plugins/metroPlugin.js +17 -16
- package/dist/cjs/plugins/metroPlugin.js.map +1 -1
- package/dist/cjs/plugins/metroPlugin.native.js +68 -53
- package/dist/cjs/plugins/metroPlugin.native.js.map +1 -1
- package/dist/esm/plugins/metroPlugin.js +17 -16
- package/dist/esm/plugins/metroPlugin.js.map +1 -1
- package/dist/esm/plugins/metroPlugin.mjs +57 -53
- package/dist/esm/plugins/metroPlugin.mjs.map +1 -1
- package/dist/esm/plugins/metroPlugin.native.js +68 -53
- package/dist/esm/plugins/metroPlugin.native.js.map +1 -1
- package/package.json +3 -3
- package/src/plugins/metroPlugin.ts +80 -43
- package/types/plugins/metroPlugin.d.ts +8 -0
- package/types/plugins/metroPlugin.d.ts.map +1 -1
|
@@ -70,51 +70,59 @@ function metroPlugin(options = {}) {
|
|
|
70
70
|
};
|
|
71
71
|
});
|
|
72
72
|
const startMetro = async () => {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
73
|
+
const metroStartTime = Date.now();
|
|
74
|
+
try {
|
|
75
|
+
(0, import_metroCacheManager.checkAndClearMetroCacheFromVite)(server, server.config.logger);
|
|
76
|
+
const {
|
|
77
|
+
default: Metro
|
|
78
|
+
} = await (0, import_projectImport.projectImport)(projectRoot, "metro"),
|
|
79
|
+
{
|
|
80
|
+
default: MetroHmrServer
|
|
81
|
+
} = await (0, import_projectImport.projectImport)(projectRoot, "metro/private/HmrServer"),
|
|
82
|
+
{
|
|
83
|
+
default: createWebsocketServer
|
|
84
|
+
} = await (0, import_projectImport.projectImport)(projectRoot, "metro/private/lib/createWebsocketServer"),
|
|
85
|
+
{
|
|
86
|
+
createDevMiddleware
|
|
87
|
+
} = await (0, import_projectImport.projectImport)(projectRoot, "@react-native/dev-middleware"),
|
|
88
|
+
config = await (0, import_getMetroConfigFromViteConfig.getMetroConfigFromViteConfig)(server.config, options),
|
|
89
|
+
metroResult = await Metro.createConnectMiddleware(config, {
|
|
90
|
+
// Force enable file watching, even on CI.
|
|
91
|
+
// This is needed for HMR tests to work on CI.
|
|
92
|
+
watch: !0
|
|
93
|
+
});
|
|
94
|
+
middleware = metroResult.middleware, metroServer = metroResult.metroServer, (0, import_patchMetroServerWithViteConfigAndMetroPluginOptions.patchMetroServerWithViteConfigAndMetroPluginOptions)(metroServer, server.config, options), hmrServer = new MetroHmrServer(metroServer.getBundler(), metroServer.getCreateModuleId(), config);
|
|
95
|
+
const reactNativeDevToolsUrl = `http://${typeof server.config.server.host == "boolean" ? "localhost" : server.config.server.host}:${server.config.server.port}`,
|
|
96
|
+
devMiddleware = createDevMiddleware({
|
|
97
|
+
serverBaseUrl: reactNativeDevToolsUrl,
|
|
98
|
+
logger: console
|
|
99
|
+
});
|
|
100
|
+
rnDevtoolsMiddleware = devMiddleware.middleware, websocketEndpoints = {
|
|
101
|
+
"/hot": createWebsocketServer({
|
|
102
|
+
websocketServer: hmrServer
|
|
103
|
+
}),
|
|
104
|
+
...devMiddleware.websocketEndpoints
|
|
105
|
+
}, server.httpServer?.on("upgrade", (request, socket, head) => {
|
|
106
|
+
const pathname = new URL(request.url, `http://${request.headers.host}`).pathname,
|
|
107
|
+
endpoint = websocketEndpoints[pathname];
|
|
108
|
+
endpoint && endpoint.handleUpgrade(request, socket, head, ws => {
|
|
109
|
+
endpoint.emit("connection", ws, request);
|
|
110
|
+
});
|
|
111
|
+
}), server.middlewares.use(rnDevtoolsMiddleware), metroReady = !0;
|
|
112
|
+
const metroElapsed = Date.now() - metroStartTime;
|
|
113
|
+
debug?.(`Metro bundler ready (${metroElapsed}ms)`), metroPromiseResolvers.resolve();
|
|
114
|
+
} catch (err) {
|
|
115
|
+
throw debug?.(`Error during Metro initialization: ${err}`), metroPromiseResolvers.reject(err), err;
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
isLazyStartup = options.startup === "lazy";
|
|
119
|
+
let metroStarting = !1;
|
|
120
|
+
const ensureMetroStarted = () => {
|
|
121
|
+
metroStarting || metroReady || (metroStarting = !0, debug?.("Starting Metro on-demand (lazy startup)"), startMetro().catch(err => {
|
|
122
|
+
debug?.(`Failed to start Metro: ${err}`);
|
|
123
|
+
}));
|
|
116
124
|
};
|
|
117
|
-
if (server.httpServer) server.httpServer.listening ? startMetro().catch(err => {
|
|
125
|
+
if (isLazyStartup) debug?.("Metro lazy startup enabled - will start on first native request");else if (server.httpServer) server.httpServer.listening ? startMetro().catch(err => {
|
|
118
126
|
debug?.(`Failed to start Metro: ${err}`);
|
|
119
127
|
}) : server.httpServer.on("listening", () => {
|
|
120
128
|
startMetro().catch(err => {
|
|
@@ -133,6 +141,11 @@ function metroPlugin(options = {}) {
|
|
|
133
141
|
waitForServer();
|
|
134
142
|
}
|
|
135
143
|
server.middlewares.use(async (req, res, next) => {
|
|
144
|
+
const isNativeRequest = req.headers["user-agent"]?.includes("CFNetwork/") || req.headers["user-agent"]?.includes("okhttp/");
|
|
145
|
+
if (isLazyStartup && !metroReady && (req.url?.includes(".bundle") || req.url === "/status" && isNativeRequest) && ensureMetroStarted(), req.url === "/status" && isNativeRequest) {
|
|
146
|
+
res.statusCode = 200, res.end("packager-status:running");
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
136
149
|
if (req.url?.includes(".bundle") && !metroReady && (await metroPromise), middleware) try {
|
|
137
150
|
if (req.url?.includes(".bundle")) {
|
|
138
151
|
const VITE_METRO_DEBUG_BUNDLE = process.env.VITE_METRO_DEBUG_BUNDLE;
|
|
@@ -143,15 +156,6 @@ function metroPlugin(options = {}) {
|
|
|
143
156
|
return;
|
|
144
157
|
}
|
|
145
158
|
}
|
|
146
|
-
if (req.url === "/status" && (
|
|
147
|
-
// The path (`/status`) is too general and may conflict with the user's web app, so we also check the User-Agent header to ensure it's a request from a native app.
|
|
148
|
-
// Failing to handle this correctly will cause the native app to show a "Packager is not running at ..." error.
|
|
149
|
-
req.headers["user-agent"]?.includes("CFNetwork/"
|
|
150
|
-
/* iOS */) || req.headers["user-agent"]?.includes("okhttp/"
|
|
151
|
-
/* Android */))) {
|
|
152
|
-
res.statusCode = 200, res.end("packager-status:running");
|
|
153
|
-
return;
|
|
154
|
-
}
|
|
155
159
|
if (req.url === "/open-stack-frame" && req.method === "POST") {
|
|
156
160
|
let body = "";
|
|
157
161
|
req.on("data", chunk => {
|
|
@@ -67,9 +67,9 @@ function metroPlugin(options = {}) {
|
|
|
67
67
|
}),
|
|
68
68
|
...devMiddleware.websocketEndpoints
|
|
69
69
|
}, server.httpServer?.on("upgrade", (request, socket, head) => {
|
|
70
|
-
const pathname = new URL(request.url, `http://${request.headers.host}`).pathname;
|
|
71
|
-
|
|
72
|
-
|
|
70
|
+
const pathname = new URL(request.url, `http://${request.headers.host}`).pathname, endpoint = websocketEndpoints[pathname];
|
|
71
|
+
endpoint && endpoint.handleUpgrade(request, socket, head, (ws) => {
|
|
72
|
+
endpoint.emit("connection", ws, request);
|
|
73
73
|
});
|
|
74
74
|
}), server.middlewares.use(rnDevtoolsMiddleware), metroReady = !0;
|
|
75
75
|
const metroElapsed = Date.now() - metroStartTime;
|
|
@@ -77,8 +77,16 @@ function metroPlugin(options = {}) {
|
|
|
77
77
|
} catch (err) {
|
|
78
78
|
throw debug?.(`Error during Metro initialization: ${err}`), metroPromiseResolvers.reject(err), err;
|
|
79
79
|
}
|
|
80
|
+
}, isLazyStartup = options.startup === "lazy";
|
|
81
|
+
let metroStarting = !1;
|
|
82
|
+
const ensureMetroStarted = () => {
|
|
83
|
+
metroStarting || metroReady || (metroStarting = !0, debug?.("Starting Metro on-demand (lazy startup)"), startMetro().catch((err) => {
|
|
84
|
+
debug?.(`Failed to start Metro: ${err}`);
|
|
85
|
+
}));
|
|
80
86
|
};
|
|
81
|
-
if (
|
|
87
|
+
if (isLazyStartup)
|
|
88
|
+
debug?.("Metro lazy startup enabled - will start on first native request");
|
|
89
|
+
else if (server.httpServer)
|
|
82
90
|
server.httpServer.listening ? startMetro().catch((err) => {
|
|
83
91
|
debug?.(`Failed to start Metro: ${err}`);
|
|
84
92
|
}) : server.httpServer.on("listening", () => {
|
|
@@ -99,6 +107,11 @@ function metroPlugin(options = {}) {
|
|
|
99
107
|
waitForServer();
|
|
100
108
|
}
|
|
101
109
|
server.middlewares.use(async (req, res, next) => {
|
|
110
|
+
const isNativeRequest = req.headers["user-agent"]?.includes("CFNetwork/") || req.headers["user-agent"]?.includes("okhttp/");
|
|
111
|
+
if (isLazyStartup && !metroReady && (req.url?.includes(".bundle") || req.url === "/status" && isNativeRequest) && ensureMetroStarted(), req.url === "/status" && isNativeRequest) {
|
|
112
|
+
res.statusCode = 200, res.end("packager-status:running");
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
102
115
|
if (req.url?.includes(".bundle") && !metroReady && await metroPromise, middleware)
|
|
103
116
|
try {
|
|
104
117
|
if (req.url?.includes(".bundle")) {
|
|
@@ -110,18 +123,6 @@ function metroPlugin(options = {}) {
|
|
|
110
123
|
return;
|
|
111
124
|
}
|
|
112
125
|
}
|
|
113
|
-
if (req.url === "/status" && // The path (`/status`) is too general and may conflict with the user's web app, so we also check the User-Agent header to ensure it's a request from a native app.
|
|
114
|
-
// Failing to handle this correctly will cause the native app to show a "Packager is not running at ..." error.
|
|
115
|
-
(req.headers["user-agent"]?.includes(
|
|
116
|
-
"CFNetwork/"
|
|
117
|
-
/* iOS */
|
|
118
|
-
) || req.headers["user-agent"]?.includes(
|
|
119
|
-
"okhttp/"
|
|
120
|
-
/* Android */
|
|
121
|
-
))) {
|
|
122
|
-
res.statusCode = 200, res.end("packager-status:running");
|
|
123
|
-
return;
|
|
124
|
-
}
|
|
125
126
|
if (req.url === "/open-stack-frame" && req.method === "POST") {
|
|
126
127
|
let body = "";
|
|
127
128
|
req.on("data", (chunk) => {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/plugins/metroPlugin.ts"],
|
|
4
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAA2B,oBAC3B,kBAAyB,6BAEzB,uBAAyB,sCACzB,eAA+B,wBAC/B,2BAAgD,uCAahD,uBAA8B,mCAE9B,sCAA6C,yDAC7C,6DAAoE;AAdpE,MAAM,EAAE,MAAM,QAAI,6BAAe,mBAAmB;
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": ["launchEditor"]
|
|
6
6
|
}
|
|
@@ -73,52 +73,60 @@ function metroPlugin() {
|
|
|
73
73
|
};
|
|
74
74
|
});
|
|
75
75
|
var startMetro = async function () {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
76
|
+
var metroStartTime = Date.now();
|
|
77
|
+
try {
|
|
78
|
+
var _server_httpServer;
|
|
79
|
+
(0, import_metroCacheManager.checkAndClearMetroCacheFromVite)(server, server.config.logger);
|
|
80
|
+
var {
|
|
81
|
+
default: Metro
|
|
82
|
+
} = await (0, import_projectImport.projectImport)(projectRoot, "metro"),
|
|
83
|
+
{
|
|
84
|
+
default: MetroHmrServer
|
|
85
|
+
} = await (0, import_projectImport.projectImport)(projectRoot, "metro/private/HmrServer"),
|
|
86
|
+
{
|
|
87
|
+
default: createWebsocketServer
|
|
88
|
+
} = await (0, import_projectImport.projectImport)(projectRoot, "metro/private/lib/createWebsocketServer"),
|
|
89
|
+
{
|
|
90
|
+
createDevMiddleware
|
|
91
|
+
} = await (0, import_projectImport.projectImport)(projectRoot, "@react-native/dev-middleware"),
|
|
92
|
+
config = await (0, import_getMetroConfigFromViteConfig.getMetroConfigFromViteConfig)(server.config, options),
|
|
93
|
+
metroResult = await Metro.createConnectMiddleware(config, {
|
|
94
|
+
// Force enable file watching, even on CI.
|
|
95
|
+
// This is needed for HMR tests to work on CI.
|
|
96
|
+
watch: !0
|
|
97
|
+
});
|
|
98
|
+
middleware = metroResult.middleware, metroServer = metroResult.metroServer, (0, import_patchMetroServerWithViteConfigAndMetroPluginOptions.patchMetroServerWithViteConfigAndMetroPluginOptions)(metroServer, server.config, options), hmrServer = new MetroHmrServer(metroServer.getBundler(), metroServer.getCreateModuleId(), config);
|
|
99
|
+
var reactNativeDevToolsUrl = `http://${typeof server.config.server.host == "boolean" ? "localhost" : server.config.server.host}:${server.config.server.port}`,
|
|
100
|
+
devMiddleware = createDevMiddleware({
|
|
101
|
+
serverBaseUrl: reactNativeDevToolsUrl,
|
|
102
|
+
logger: console
|
|
103
|
+
});
|
|
104
|
+
rnDevtoolsMiddleware = devMiddleware.middleware, websocketEndpoints = {
|
|
105
|
+
"/hot": createWebsocketServer({
|
|
106
|
+
websocketServer: hmrServer
|
|
107
|
+
}),
|
|
108
|
+
...devMiddleware.websocketEndpoints
|
|
109
|
+
}, (_server_httpServer = server.httpServer) === null || _server_httpServer === void 0 || _server_httpServer.on("upgrade", function (request, socket, head) {
|
|
110
|
+
var pathname = new URL(request.url, `http://${request.headers.host}`).pathname,
|
|
111
|
+
endpoint = websocketEndpoints[pathname];
|
|
112
|
+
endpoint && endpoint.handleUpgrade(request, socket, head, function (ws) {
|
|
113
|
+
endpoint.emit("connection", ws, request);
|
|
114
|
+
});
|
|
115
|
+
}), server.middlewares.use(rnDevtoolsMiddleware), metroReady = !0;
|
|
116
|
+
var metroElapsed = Date.now() - metroStartTime;
|
|
117
|
+
debug?.(`Metro bundler ready (${metroElapsed}ms)`), metroPromiseResolvers.resolve();
|
|
118
|
+
} catch (err) {
|
|
119
|
+
throw debug?.(`Error during Metro initialization: ${err}`), metroPromiseResolvers.reject(err), err;
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
isLazyStartup = options.startup === "lazy",
|
|
123
|
+
metroStarting = !1,
|
|
124
|
+
ensureMetroStarted = function () {
|
|
125
|
+
metroStarting || metroReady || (metroStarting = !0, debug?.("Starting Metro on-demand (lazy startup)"), startMetro().catch(function (err) {
|
|
126
|
+
debug?.(`Failed to start Metro: ${err}`);
|
|
127
|
+
}));
|
|
128
|
+
};
|
|
129
|
+
if (isLazyStartup) debug?.("Metro lazy startup enabled - will start on first native request");else if (server.httpServer) server.httpServer.listening ? startMetro().catch(function (err) {
|
|
122
130
|
debug?.(`Failed to start Metro: ${err}`);
|
|
123
131
|
}) : server.httpServer.on("listening", function () {
|
|
124
132
|
startMetro().catch(function (err) {
|
|
@@ -137,10 +145,21 @@ function metroPlugin() {
|
|
|
137
145
|
waitForServer();
|
|
138
146
|
}
|
|
139
147
|
server.middlewares.use(async function (req, res, next) {
|
|
140
|
-
var
|
|
148
|
+
var _req_headers_useragent,
|
|
149
|
+
_req_headers_useragent1,
|
|
150
|
+
_req_url,
|
|
151
|
+
isNativeRequest = ((_req_headers_useragent = req.headers["user-agent"]) === null || _req_headers_useragent === void 0 ? void 0 : _req_headers_useragent.includes("CFNetwork/")) || ((_req_headers_useragent1 = req.headers["user-agent"]) === null || _req_headers_useragent1 === void 0 ? void 0 : _req_headers_useragent1.includes("okhttp/"));
|
|
152
|
+
if (isLazyStartup && !metroReady) {
|
|
153
|
+
var _req_url1;
|
|
154
|
+
(!((_req_url1 = req.url) === null || _req_url1 === void 0) && _req_url1.includes(".bundle") || req.url === "/status" && isNativeRequest) && ensureMetroStarted();
|
|
155
|
+
}
|
|
156
|
+
if (req.url === "/status" && isNativeRequest) {
|
|
157
|
+
res.statusCode = 200, res.end("packager-status:running");
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
141
160
|
if (!((_req_url = req.url) === null || _req_url === void 0) && _req_url.includes(".bundle") && !metroReady && (await metroPromise), middleware) try {
|
|
142
|
-
var
|
|
143
|
-
if (!((
|
|
161
|
+
var _req_url2;
|
|
162
|
+
if (!((_req_url2 = req.url) === null || _req_url2 === void 0) && _req_url2.includes(".bundle")) {
|
|
144
163
|
var VITE_METRO_DEBUG_BUNDLE = process.env.VITE_METRO_DEBUG_BUNDLE;
|
|
145
164
|
if (VITE_METRO_DEBUG_BUNDLE && (0, import_fs.existsSync)(VITE_METRO_DEBUG_BUNDLE)) {
|
|
146
165
|
debug?.(`serving debug bundle from ${VITE_METRO_DEBUG_BUNDLE}`);
|
|
@@ -149,10 +168,6 @@ function metroPlugin() {
|
|
|
149
168
|
return;
|
|
150
169
|
}
|
|
151
170
|
}
|
|
152
|
-
if (req.url === "/status" && (!((_req_headers_useragent = req.headers["user-agent"]) === null || _req_headers_useragent === void 0) && _req_headers_useragent.includes("CFNetwork/") || !((_req_headers_useragent1 = req.headers["user-agent"]) === null || _req_headers_useragent1 === void 0) && _req_headers_useragent1.includes("okhttp/"))) {
|
|
153
|
-
res.statusCode = 200, res.end("packager-status:running");
|
|
154
|
-
return;
|
|
155
|
-
}
|
|
156
171
|
if (req.url === "/open-stack-frame" && req.method === "POST") {
|
|
157
172
|
var body = "";
|
|
158
173
|
req.on("data", function (chunk) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["__toCommonJS","mod","__copyProps","__defProp","value","metroPlugin_exports","__export","metroPlugin","module","exports","import_fs","require","import_promises","import_launch_editor","__toESM","import_debug","import_metroCacheManager","import_projectImport","import_getMetroConfigFromViteConfig","import_patchMetroServerWithViteConfigAndMetroPluginOptions","debug","createDebugger","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","checkAndClearMetroCacheFromVite","logger","default","Metro","projectImport","MetroHmrServer","createWebsocketServer","createDevMiddleware","getMetroConfigFromViteConfig","metroResult","createConnectMiddleware","watch","patchMetroServerWithViteConfigAndMetroPluginOptions","getBundler","getCreateModuleId","reactNativeDevToolsUrl","host","port","devMiddleware","serverBaseUrl","console","websocketServer","httpServer","on","request","socket","head","pathname","URL","url","headers","handleUpgrade","ws","emit","middlewares","use","metroElapsed","err","
|
|
1
|
+
{"version":3,"names":["__toCommonJS","mod","__copyProps","__defProp","value","metroPlugin_exports","__export","metroPlugin","module","exports","import_fs","require","import_promises","import_launch_editor","__toESM","import_debug","import_metroCacheManager","import_projectImport","import_getMetroConfigFromViteConfig","import_patchMetroServerWithViteConfigAndMetroPluginOptions","debug","createDebugger","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","checkAndClearMetroCacheFromVite","logger","default","Metro","projectImport","MetroHmrServer","createWebsocketServer","createDevMiddleware","getMetroConfigFromViteConfig","metroResult","createConnectMiddleware","watch","patchMetroServerWithViteConfigAndMetroPluginOptions","getBundler","getCreateModuleId","reactNativeDevToolsUrl","host","port","devMiddleware","serverBaseUrl","console","websocketServer","httpServer","on","request","socket","head","pathname","URL","url","headers","endpoint","handleUpgrade","ws","emit","middlewares","use","metroElapsed","err","isLazyStartup","startup","metroStarting","ensureMetroStarted","catch","listening","waitForServer","setTimeout","req","res","next","_req_headers_useragent","_req_headers_useragent1","_req_url","isNativeRequest","includes","_req_url1","statusCode","end","_req_url2","VITE_METRO_DEBUG_BUNDLE","process","env","existsSync","content","readFile","setHeader","method","body","chunk","toString","frame","JSON","parse","file","e","error"],"sources":["../../../src/plugins/metroPlugin.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -47,9 +47,9 @@ function metroPlugin(options = {}) {
|
|
|
47
47
|
}),
|
|
48
48
|
...devMiddleware.websocketEndpoints
|
|
49
49
|
}, server.httpServer?.on("upgrade", (request, socket, head) => {
|
|
50
|
-
const pathname = new URL(request.url, `http://${request.headers.host}`).pathname;
|
|
51
|
-
|
|
52
|
-
|
|
50
|
+
const pathname = new URL(request.url, `http://${request.headers.host}`).pathname, endpoint = websocketEndpoints[pathname];
|
|
51
|
+
endpoint && endpoint.handleUpgrade(request, socket, head, (ws) => {
|
|
52
|
+
endpoint.emit("connection", ws, request);
|
|
53
53
|
});
|
|
54
54
|
}), server.middlewares.use(rnDevtoolsMiddleware), metroReady = !0;
|
|
55
55
|
const metroElapsed = Date.now() - metroStartTime;
|
|
@@ -57,8 +57,16 @@ function metroPlugin(options = {}) {
|
|
|
57
57
|
} catch (err) {
|
|
58
58
|
throw debug?.(`Error during Metro initialization: ${err}`), metroPromiseResolvers.reject(err), err;
|
|
59
59
|
}
|
|
60
|
+
}, isLazyStartup = options.startup === "lazy";
|
|
61
|
+
let metroStarting = !1;
|
|
62
|
+
const ensureMetroStarted = () => {
|
|
63
|
+
metroStarting || metroReady || (metroStarting = !0, debug?.("Starting Metro on-demand (lazy startup)"), startMetro().catch((err) => {
|
|
64
|
+
debug?.(`Failed to start Metro: ${err}`);
|
|
65
|
+
}));
|
|
60
66
|
};
|
|
61
|
-
if (
|
|
67
|
+
if (isLazyStartup)
|
|
68
|
+
debug?.("Metro lazy startup enabled - will start on first native request");
|
|
69
|
+
else if (server.httpServer)
|
|
62
70
|
server.httpServer.listening ? startMetro().catch((err) => {
|
|
63
71
|
debug?.(`Failed to start Metro: ${err}`);
|
|
64
72
|
}) : server.httpServer.on("listening", () => {
|
|
@@ -79,6 +87,11 @@ function metroPlugin(options = {}) {
|
|
|
79
87
|
waitForServer();
|
|
80
88
|
}
|
|
81
89
|
server.middlewares.use(async (req, res, next) => {
|
|
90
|
+
const isNativeRequest = req.headers["user-agent"]?.includes("CFNetwork/") || req.headers["user-agent"]?.includes("okhttp/");
|
|
91
|
+
if (isLazyStartup && !metroReady && (req.url?.includes(".bundle") || req.url === "/status" && isNativeRequest) && ensureMetroStarted(), req.url === "/status" && isNativeRequest) {
|
|
92
|
+
res.statusCode = 200, res.end("packager-status:running");
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
82
95
|
if (req.url?.includes(".bundle") && !metroReady && await metroPromise, middleware)
|
|
83
96
|
try {
|
|
84
97
|
if (req.url?.includes(".bundle")) {
|
|
@@ -90,18 +103,6 @@ function metroPlugin(options = {}) {
|
|
|
90
103
|
return;
|
|
91
104
|
}
|
|
92
105
|
}
|
|
93
|
-
if (req.url === "/status" && // The path (`/status`) is too general and may conflict with the user's web app, so we also check the User-Agent header to ensure it's a request from a native app.
|
|
94
|
-
// Failing to handle this correctly will cause the native app to show a "Packager is not running at ..." error.
|
|
95
|
-
(req.headers["user-agent"]?.includes(
|
|
96
|
-
"CFNetwork/"
|
|
97
|
-
/* iOS */
|
|
98
|
-
) || req.headers["user-agent"]?.includes(
|
|
99
|
-
"okhttp/"
|
|
100
|
-
/* Android */
|
|
101
|
-
))) {
|
|
102
|
-
res.statusCode = 200, res.end("packager-status:running");
|
|
103
|
-
return;
|
|
104
|
-
}
|
|
105
106
|
if (req.url === "/open-stack-frame" && req.method === "POST") {
|
|
106
107
|
let body = "";
|
|
107
108
|
req.on("data", (chunk) => {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/plugins/metroPlugin.ts"],
|
|
4
|
-
"mappings": "AAAA,SAAS,kBAAkB;AAC3B,SAAS,gBAAgB;AAEzB,OAAO,kBAAkB;AACzB,SAAS,sBAAsB;AAC/B,SAAS,uCAAuC;AAahD,SAAS,qBAAqB;AAE9B,SAAS,oCAAoC;AAC7C,SAAS,2DAA2D;AAdpE,MAAM,EAAE,MAAM,IAAI,eAAe,mBAAmB;
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -34,51 +34,59 @@ function metroPlugin(options = {}) {
|
|
|
34
34
|
};
|
|
35
35
|
});
|
|
36
36
|
const startMetro = async () => {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
37
|
+
const metroStartTime = Date.now();
|
|
38
|
+
try {
|
|
39
|
+
checkAndClearMetroCacheFromVite(server, server.config.logger);
|
|
40
|
+
const {
|
|
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
|
+
const reactNativeDevToolsUrl = `http://${typeof server.config.server.host == "boolean" ? "localhost" : server.config.server.host}:${server.config.server.port}`,
|
|
60
|
+
devMiddleware = createDevMiddleware({
|
|
61
|
+
serverBaseUrl: reactNativeDevToolsUrl,
|
|
62
|
+
logger: console
|
|
63
|
+
});
|
|
64
|
+
rnDevtoolsMiddleware = devMiddleware.middleware, websocketEndpoints = {
|
|
65
|
+
"/hot": createWebsocketServer({
|
|
66
|
+
websocketServer: hmrServer
|
|
67
|
+
}),
|
|
68
|
+
...devMiddleware.websocketEndpoints
|
|
69
|
+
}, server.httpServer?.on("upgrade", (request, socket, head) => {
|
|
70
|
+
const pathname = new URL(request.url, `http://${request.headers.host}`).pathname,
|
|
71
|
+
endpoint = websocketEndpoints[pathname];
|
|
72
|
+
endpoint && endpoint.handleUpgrade(request, socket, head, ws => {
|
|
73
|
+
endpoint.emit("connection", ws, request);
|
|
74
|
+
});
|
|
75
|
+
}), server.middlewares.use(rnDevtoolsMiddleware), metroReady = !0;
|
|
76
|
+
const 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
|
+
isLazyStartup = options.startup === "lazy";
|
|
83
|
+
let metroStarting = !1;
|
|
84
|
+
const ensureMetroStarted = () => {
|
|
85
|
+
metroStarting || metroReady || (metroStarting = !0, debug?.("Starting Metro on-demand (lazy startup)"), startMetro().catch(err => {
|
|
86
|
+
debug?.(`Failed to start Metro: ${err}`);
|
|
87
|
+
}));
|
|
80
88
|
};
|
|
81
|
-
if (server.httpServer) server.httpServer.listening ? startMetro().catch(err => {
|
|
89
|
+
if (isLazyStartup) debug?.("Metro lazy startup enabled - will start on first native request");else if (server.httpServer) server.httpServer.listening ? startMetro().catch(err => {
|
|
82
90
|
debug?.(`Failed to start Metro: ${err}`);
|
|
83
91
|
}) : server.httpServer.on("listening", () => {
|
|
84
92
|
startMetro().catch(err => {
|
|
@@ -97,6 +105,11 @@ function metroPlugin(options = {}) {
|
|
|
97
105
|
waitForServer();
|
|
98
106
|
}
|
|
99
107
|
server.middlewares.use(async (req, res, next) => {
|
|
108
|
+
const isNativeRequest = req.headers["user-agent"]?.includes("CFNetwork/") || req.headers["user-agent"]?.includes("okhttp/");
|
|
109
|
+
if (isLazyStartup && !metroReady && (req.url?.includes(".bundle") || req.url === "/status" && isNativeRequest) && ensureMetroStarted(), req.url === "/status" && isNativeRequest) {
|
|
110
|
+
res.statusCode = 200, res.end("packager-status:running");
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
100
113
|
if (req.url?.includes(".bundle") && !metroReady && (await metroPromise), middleware) try {
|
|
101
114
|
if (req.url?.includes(".bundle")) {
|
|
102
115
|
const VITE_METRO_DEBUG_BUNDLE = process.env.VITE_METRO_DEBUG_BUNDLE;
|
|
@@ -107,15 +120,6 @@ function metroPlugin(options = {}) {
|
|
|
107
120
|
return;
|
|
108
121
|
}
|
|
109
122
|
}
|
|
110
|
-
if (req.url === "/status" && (
|
|
111
|
-
// The path (`/status`) is too general and may conflict with the user's web app, so we also check the User-Agent header to ensure it's a request from a native app.
|
|
112
|
-
// Failing to handle this correctly will cause the native app to show a "Packager is not running at ..." error.
|
|
113
|
-
req.headers["user-agent"]?.includes("CFNetwork/"
|
|
114
|
-
/* iOS */) || req.headers["user-agent"]?.includes("okhttp/"
|
|
115
|
-
/* Android */))) {
|
|
116
|
-
res.statusCode = 200, res.end("packager-status:running");
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
123
|
if (req.url === "/open-stack-frame" && req.method === "POST") {
|
|
120
124
|
let body = "";
|
|
121
125
|
req.on("data", chunk => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["existsSync","readFile","launchEditor","createDebugger","checkAndClearMetroCacheFromVite","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","logger","default","Metro","MetroHmrServer","createWebsocketServer","createDevMiddleware","metroResult","createConnectMiddleware","watch","getBundler","getCreateModuleId","reactNativeDevToolsUrl","host","port","devMiddleware","serverBaseUrl","console","websocketServer","httpServer","on","request","socket","head","pathname","URL","url","headers","handleUpgrade","ws","emit","middlewares","use","metroElapsed","err","
|
|
1
|
+
{"version":3,"names":["existsSync","readFile","launchEditor","createDebugger","checkAndClearMetroCacheFromVite","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","logger","default","Metro","MetroHmrServer","createWebsocketServer","createDevMiddleware","metroResult","createConnectMiddleware","watch","getBundler","getCreateModuleId","reactNativeDevToolsUrl","host","port","devMiddleware","serverBaseUrl","console","websocketServer","httpServer","on","request","socket","head","pathname","URL","url","headers","endpoint","handleUpgrade","ws","emit","middlewares","use","metroElapsed","err","isLazyStartup","startup","metroStarting","ensureMetroStarted","catch","listening","waitForServer","setTimeout","req","res","next","isNativeRequest","includes","statusCode","end","VITE_METRO_DEBUG_BUNDLE","process","env","content","setHeader","method","body","chunk","toString","frame","JSON","parse","file","e","error"],"sources":["../../../src/plugins/metroPlugin.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -35,52 +35,60 @@ function metroPlugin() {
|
|
|
35
35
|
};
|
|
36
36
|
});
|
|
37
37
|
var startMetro = async function () {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
38
|
+
var metroStartTime = Date.now();
|
|
39
|
+
try {
|
|
40
|
+
var _server_httpServer;
|
|
41
|
+
checkAndClearMetroCacheFromVite(server, server.config.logger);
|
|
42
|
+
var {
|
|
43
|
+
default: Metro
|
|
44
|
+
} = await projectImport(projectRoot, "metro"),
|
|
45
|
+
{
|
|
46
|
+
default: MetroHmrServer
|
|
47
|
+
} = await projectImport(projectRoot, "metro/private/HmrServer"),
|
|
48
|
+
{
|
|
49
|
+
default: createWebsocketServer
|
|
50
|
+
} = await projectImport(projectRoot, "metro/private/lib/createWebsocketServer"),
|
|
51
|
+
{
|
|
52
|
+
createDevMiddleware
|
|
53
|
+
} = await projectImport(projectRoot, "@react-native/dev-middleware"),
|
|
54
|
+
config = await getMetroConfigFromViteConfig(server.config, options),
|
|
55
|
+
metroResult = await Metro.createConnectMiddleware(config, {
|
|
56
|
+
// Force enable file watching, even on CI.
|
|
57
|
+
// This is needed for HMR tests to work on CI.
|
|
58
|
+
watch: !0
|
|
59
|
+
});
|
|
60
|
+
middleware = metroResult.middleware, metroServer = metroResult.metroServer, patchMetroServerWithViteConfigAndMetroPluginOptions(metroServer, server.config, options), hmrServer = new MetroHmrServer(metroServer.getBundler(), metroServer.getCreateModuleId(), config);
|
|
61
|
+
var reactNativeDevToolsUrl = `http://${typeof server.config.server.host == "boolean" ? "localhost" : server.config.server.host}:${server.config.server.port}`,
|
|
62
|
+
devMiddleware = createDevMiddleware({
|
|
63
|
+
serverBaseUrl: reactNativeDevToolsUrl,
|
|
64
|
+
logger: console
|
|
65
|
+
});
|
|
66
|
+
rnDevtoolsMiddleware = devMiddleware.middleware, websocketEndpoints = {
|
|
67
|
+
"/hot": createWebsocketServer({
|
|
68
|
+
websocketServer: hmrServer
|
|
69
|
+
}),
|
|
70
|
+
...devMiddleware.websocketEndpoints
|
|
71
|
+
}, (_server_httpServer = server.httpServer) === null || _server_httpServer === void 0 || _server_httpServer.on("upgrade", function (request, socket, head) {
|
|
72
|
+
var pathname = new URL(request.url, `http://${request.headers.host}`).pathname,
|
|
73
|
+
endpoint = websocketEndpoints[pathname];
|
|
74
|
+
endpoint && endpoint.handleUpgrade(request, socket, head, function (ws) {
|
|
75
|
+
endpoint.emit("connection", ws, request);
|
|
76
|
+
});
|
|
77
|
+
}), server.middlewares.use(rnDevtoolsMiddleware), metroReady = !0;
|
|
78
|
+
var metroElapsed = Date.now() - metroStartTime;
|
|
79
|
+
debug?.(`Metro bundler ready (${metroElapsed}ms)`), metroPromiseResolvers.resolve();
|
|
80
|
+
} catch (err) {
|
|
81
|
+
throw debug?.(`Error during Metro initialization: ${err}`), metroPromiseResolvers.reject(err), err;
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
isLazyStartup = options.startup === "lazy",
|
|
85
|
+
metroStarting = !1,
|
|
86
|
+
ensureMetroStarted = function () {
|
|
87
|
+
metroStarting || metroReady || (metroStarting = !0, debug?.("Starting Metro on-demand (lazy startup)"), startMetro().catch(function (err) {
|
|
88
|
+
debug?.(`Failed to start Metro: ${err}`);
|
|
89
|
+
}));
|
|
90
|
+
};
|
|
91
|
+
if (isLazyStartup) debug?.("Metro lazy startup enabled - will start on first native request");else if (server.httpServer) server.httpServer.listening ? startMetro().catch(function (err) {
|
|
84
92
|
debug?.(`Failed to start Metro: ${err}`);
|
|
85
93
|
}) : server.httpServer.on("listening", function () {
|
|
86
94
|
startMetro().catch(function (err) {
|
|
@@ -99,10 +107,21 @@ function metroPlugin() {
|
|
|
99
107
|
waitForServer();
|
|
100
108
|
}
|
|
101
109
|
server.middlewares.use(async function (req, res, next) {
|
|
102
|
-
var
|
|
110
|
+
var _req_headers_useragent,
|
|
111
|
+
_req_headers_useragent1,
|
|
112
|
+
_req_url,
|
|
113
|
+
isNativeRequest = ((_req_headers_useragent = req.headers["user-agent"]) === null || _req_headers_useragent === void 0 ? void 0 : _req_headers_useragent.includes("CFNetwork/")) || ((_req_headers_useragent1 = req.headers["user-agent"]) === null || _req_headers_useragent1 === void 0 ? void 0 : _req_headers_useragent1.includes("okhttp/"));
|
|
114
|
+
if (isLazyStartup && !metroReady) {
|
|
115
|
+
var _req_url1;
|
|
116
|
+
(!((_req_url1 = req.url) === null || _req_url1 === void 0) && _req_url1.includes(".bundle") || req.url === "/status" && isNativeRequest) && ensureMetroStarted();
|
|
117
|
+
}
|
|
118
|
+
if (req.url === "/status" && isNativeRequest) {
|
|
119
|
+
res.statusCode = 200, res.end("packager-status:running");
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
103
122
|
if (!((_req_url = req.url) === null || _req_url === void 0) && _req_url.includes(".bundle") && !metroReady && (await metroPromise), middleware) try {
|
|
104
|
-
var
|
|
105
|
-
if (!((
|
|
123
|
+
var _req_url2;
|
|
124
|
+
if (!((_req_url2 = req.url) === null || _req_url2 === void 0) && _req_url2.includes(".bundle")) {
|
|
106
125
|
var VITE_METRO_DEBUG_BUNDLE = process.env.VITE_METRO_DEBUG_BUNDLE;
|
|
107
126
|
if (VITE_METRO_DEBUG_BUNDLE && existsSync(VITE_METRO_DEBUG_BUNDLE)) {
|
|
108
127
|
debug?.(`serving debug bundle from ${VITE_METRO_DEBUG_BUNDLE}`);
|
|
@@ -111,10 +130,6 @@ function metroPlugin() {
|
|
|
111
130
|
return;
|
|
112
131
|
}
|
|
113
132
|
}
|
|
114
|
-
if (req.url === "/status" && (!((_req_headers_useragent = req.headers["user-agent"]) === null || _req_headers_useragent === void 0) && _req_headers_useragent.includes("CFNetwork/") || !((_req_headers_useragent1 = req.headers["user-agent"]) === null || _req_headers_useragent1 === void 0) && _req_headers_useragent1.includes("okhttp/"))) {
|
|
115
|
-
res.statusCode = 200, res.end("packager-status:running");
|
|
116
|
-
return;
|
|
117
|
-
}
|
|
118
133
|
if (req.url === "/open-stack-frame" && req.method === "POST") {
|
|
119
134
|
var body = "";
|
|
120
135
|
req.on("data", function (chunk) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["existsSync","readFile","launchEditor","createDebugger","checkAndClearMetroCacheFromVite","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","logger","default","Metro","MetroHmrServer","createWebsocketServer","createDevMiddleware","metroResult","createConnectMiddleware","watch","getBundler","getCreateModuleId","reactNativeDevToolsUrl","host","port","devMiddleware","serverBaseUrl","console","websocketServer","httpServer","on","request","socket","head","pathname","URL","url","headers","handleUpgrade","ws","emit","middlewares","use","metroElapsed","err","
|
|
1
|
+
{"version":3,"names":["existsSync","readFile","launchEditor","createDebugger","checkAndClearMetroCacheFromVite","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","logger","default","Metro","MetroHmrServer","createWebsocketServer","createDevMiddleware","metroResult","createConnectMiddleware","watch","getBundler","getCreateModuleId","reactNativeDevToolsUrl","host","port","devMiddleware","serverBaseUrl","console","websocketServer","httpServer","on","request","socket","head","pathname","URL","url","headers","endpoint","handleUpgrade","ws","emit","middlewares","use","metroElapsed","err","isLazyStartup","startup","metroStarting","ensureMetroStarted","catch","listening","waitForServer","setTimeout","req","res","next","_req_headers_useragent","_req_headers_useragent1","_req_url","isNativeRequest","includes","_req_url1","statusCode","end","_req_url2","VITE_METRO_DEBUG_BUNDLE","process","env","content","setHeader","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.
|
|
3
|
+
"version": "1.9.0",
|
|
4
4
|
"sideEffects": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/cjs",
|
|
@@ -61,7 +61,7 @@
|
|
|
61
61
|
"@babel/core": "^7.28.5",
|
|
62
62
|
"@babel/helper-plugin-utils": "^7.27.1",
|
|
63
63
|
"@babel/types": "^7.28.5",
|
|
64
|
-
"@vxrn/debug": "1.
|
|
64
|
+
"@vxrn/debug": "1.9.0",
|
|
65
65
|
"babel-preset-expo": "*",
|
|
66
66
|
"launch-editor": "^2.10.0",
|
|
67
67
|
"micromatch": "^4.0.8",
|
|
@@ -71,7 +71,7 @@
|
|
|
71
71
|
"@biomejs/biome": "2.3.3",
|
|
72
72
|
"@expo/metro-config": "^54.0.7",
|
|
73
73
|
"@react-native/dev-middleware": "^0.83.0",
|
|
74
|
-
"@tamagui/build": "2.0.0-rc.
|
|
74
|
+
"@tamagui/build": "2.0.0-rc.14",
|
|
75
75
|
"@types/babel__helper-plugin-utils": "^7",
|
|
76
76
|
"@types/node": "^24.10.0",
|
|
77
77
|
"depcheck": "^1.4.7",
|
|
@@ -58,6 +58,14 @@ export type MetroPluginOptions = {
|
|
|
58
58
|
* the `main` field in `package.json`.
|
|
59
59
|
*/
|
|
60
60
|
mainModuleName?: string
|
|
61
|
+
/**
|
|
62
|
+
* Controls when Metro bundler starts:
|
|
63
|
+
* - 'eager' (default): Start Metro as soon as Vite server is listening
|
|
64
|
+
* - 'lazy': Defer Metro startup until a bundle request or simulator connection is detected
|
|
65
|
+
*
|
|
66
|
+
* Use 'lazy' to speed up dev server startup when you don't always need Metro.
|
|
67
|
+
*/
|
|
68
|
+
startup?: 'eager' | 'lazy'
|
|
61
69
|
}
|
|
62
70
|
|
|
63
71
|
export function metroPlugin(options: MetroPluginOptions = {}): PluginOption {
|
|
@@ -158,16 +166,19 @@ export function metroPlugin(options: MetroPluginOptions = {}): PluginOption {
|
|
|
158
166
|
...devMiddleware.websocketEndpoints,
|
|
159
167
|
}
|
|
160
168
|
|
|
161
|
-
// Setup websocket handling
|
|
169
|
+
// Setup websocket handling for Metro-specific endpoints only
|
|
170
|
+
// Other paths (like Vite's /__vxrnhmr) are handled by Vite's internal HMR
|
|
162
171
|
server.httpServer?.on('upgrade', (request, socket, head) => {
|
|
163
172
|
const pathname = new URL(request.url!, `http://${request.headers.host}`)
|
|
164
173
|
.pathname
|
|
165
174
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
175
|
+
const endpoint = websocketEndpoints[pathname]
|
|
176
|
+
if (endpoint) {
|
|
177
|
+
endpoint.handleUpgrade(request, socket, head, (ws) => {
|
|
178
|
+
endpoint.emit('connection', ws, request)
|
|
169
179
|
})
|
|
170
180
|
}
|
|
181
|
+
// if no endpoint matches, let other handlers (like Vite's HMR) handle it
|
|
171
182
|
})
|
|
172
183
|
|
|
173
184
|
// Insert devtools middleware
|
|
@@ -184,45 +195,86 @@ export function metroPlugin(options: MetroPluginOptions = {}): PluginOption {
|
|
|
184
195
|
}
|
|
185
196
|
}
|
|
186
197
|
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
198
|
+
const isLazyStartup = options.startup === 'lazy'
|
|
199
|
+
|
|
200
|
+
// for lazy startup, we start Metro on-demand when a request triggers it
|
|
201
|
+
let metroStarting = false
|
|
202
|
+
const ensureMetroStarted = () => {
|
|
203
|
+
if (metroStarting || metroReady) return
|
|
204
|
+
metroStarting = true
|
|
205
|
+
debug?.('Starting Metro on-demand (lazy startup)')
|
|
206
|
+
startMetro().catch((err) => {
|
|
207
|
+
debug?.(`Failed to start Metro: ${err}`)
|
|
208
|
+
})
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// Wait for Vite server to be listening before starting Metro (eager mode)
|
|
212
|
+
// For lazy mode, we defer startup until a request triggers it
|
|
213
|
+
if (!isLazyStartup) {
|
|
214
|
+
if (server.httpServer) {
|
|
215
|
+
if (server.httpServer.listening) {
|
|
216
|
+
// Server is already listening (unlikely but handle it)
|
|
197
217
|
startMetro().catch((err) => {
|
|
198
218
|
debug?.(`Failed to start Metro: ${err}`)
|
|
199
219
|
})
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
} else {
|
|
203
|
-
// No httpServer yet, wait for it via a small delay and retry
|
|
204
|
-
// This shouldn't normally happen but is a safety fallback
|
|
205
|
-
const waitForServer = () => {
|
|
206
|
-
if (server.httpServer) {
|
|
207
|
-
if (server.httpServer.listening) {
|
|
220
|
+
} else {
|
|
221
|
+
server.httpServer.on('listening', () => {
|
|
208
222
|
startMetro().catch((err) => {
|
|
209
223
|
debug?.(`Failed to start Metro: ${err}`)
|
|
210
224
|
})
|
|
211
|
-
}
|
|
212
|
-
|
|
225
|
+
})
|
|
226
|
+
}
|
|
227
|
+
} else {
|
|
228
|
+
// No httpServer yet, wait for it via a small delay and retry
|
|
229
|
+
// This shouldn't normally happen but is a safety fallback
|
|
230
|
+
const waitForServer = () => {
|
|
231
|
+
if (server.httpServer) {
|
|
232
|
+
if (server.httpServer.listening) {
|
|
213
233
|
startMetro().catch((err) => {
|
|
214
234
|
debug?.(`Failed to start Metro: ${err}`)
|
|
215
235
|
})
|
|
216
|
-
}
|
|
236
|
+
} else {
|
|
237
|
+
server.httpServer.on('listening', () => {
|
|
238
|
+
startMetro().catch((err) => {
|
|
239
|
+
debug?.(`Failed to start Metro: ${err}`)
|
|
240
|
+
})
|
|
241
|
+
})
|
|
242
|
+
}
|
|
243
|
+
} else {
|
|
244
|
+
setTimeout(waitForServer, 10)
|
|
217
245
|
}
|
|
218
|
-
} else {
|
|
219
|
-
setTimeout(waitForServer, 10)
|
|
220
246
|
}
|
|
247
|
+
waitForServer()
|
|
221
248
|
}
|
|
222
|
-
|
|
249
|
+
} else {
|
|
250
|
+
debug?.('Metro lazy startup enabled - will start on first native request')
|
|
223
251
|
}
|
|
224
252
|
|
|
225
253
|
server.middlewares.use(async (req, res, next) => {
|
|
254
|
+
const isNativeRequest =
|
|
255
|
+
req.headers['user-agent']?.includes('CFNetwork/') ||
|
|
256
|
+
req.headers['user-agent']?.includes('okhttp/')
|
|
257
|
+
|
|
258
|
+
// trigger lazy startup on bundle requests or native client connections
|
|
259
|
+
if (isLazyStartup && !metroReady) {
|
|
260
|
+
if (
|
|
261
|
+
req.url?.includes('.bundle') ||
|
|
262
|
+
(req.url === '/status' && isNativeRequest)
|
|
263
|
+
) {
|
|
264
|
+
ensureMetroStarted()
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// Handle `isPackagerRunning` request from native app.
|
|
269
|
+
// This must be handled before waiting for Metro, so simulators get an immediate response
|
|
270
|
+
// while Metro starts in the background (important for lazy startup mode)
|
|
271
|
+
// See: https://github.com/facebook/react-native/blob/v0.80.0-rc.4/packages/react-native/React/Base/RCTBundleURLProvider.mm#L87-L113
|
|
272
|
+
if (req.url === '/status' && isNativeRequest) {
|
|
273
|
+
res.statusCode = 200
|
|
274
|
+
res.end('packager-status:running')
|
|
275
|
+
return
|
|
276
|
+
}
|
|
277
|
+
|
|
226
278
|
// Wait for Metro if it's a bundle request and Metro isn't ready yet
|
|
227
279
|
if (req.url?.includes('.bundle') && !metroReady) {
|
|
228
280
|
await metroPromise
|
|
@@ -245,21 +297,6 @@ export function metroPlugin(options: MetroPluginOptions = {}): PluginOption {
|
|
|
245
297
|
}
|
|
246
298
|
}
|
|
247
299
|
|
|
248
|
-
// Handle `isPackagerRunning` request from native app.
|
|
249
|
-
// Without this, people may see a `No script URL provided. Make sure the packager is running or you have embedded a JS bundle in your application bundle.`, `unsanitizedScriptURLString = (null)` error in their native app running with the "Debug" configuration.
|
|
250
|
-
// See: https://github.com/facebook/react-native/blob/v0.80.0-rc.4/packages/react-native/React/Base/RCTBundleURLProvider.mm#L87-L113
|
|
251
|
-
if (
|
|
252
|
-
req.url === '/status' &&
|
|
253
|
-
// The path (`/status`) is too general and may conflict with the user's web app, so we also check the User-Agent header to ensure it's a request from a native app.
|
|
254
|
-
// Failing to handle this correctly will cause the native app to show a "Packager is not running at ..." error.
|
|
255
|
-
(req.headers['user-agent']?.includes('CFNetwork/' /* iOS */) ||
|
|
256
|
-
req.headers['user-agent']?.includes('okhttp/' /* Android */))
|
|
257
|
-
) {
|
|
258
|
-
res.statusCode = 200
|
|
259
|
-
res.end('packager-status:running')
|
|
260
|
-
return
|
|
261
|
-
}
|
|
262
|
-
|
|
263
300
|
if (req.url === '/open-stack-frame' && req.method === 'POST') {
|
|
264
301
|
let body = ''
|
|
265
302
|
|
|
@@ -35,6 +35,14 @@ export type MetroPluginOptions = {
|
|
|
35
35
|
* the `main` field in `package.json`.
|
|
36
36
|
*/
|
|
37
37
|
mainModuleName?: string;
|
|
38
|
+
/**
|
|
39
|
+
* Controls when Metro bundler starts:
|
|
40
|
+
* - 'eager' (default): Start Metro as soon as Vite server is listening
|
|
41
|
+
* - 'lazy': Defer Metro startup until a bundle request or simulator connection is detected
|
|
42
|
+
*
|
|
43
|
+
* Use 'lazy' to speed up dev server startup when you don't always need Metro.
|
|
44
|
+
*/
|
|
45
|
+
startup?: 'eager' | 'lazy';
|
|
38
46
|
};
|
|
39
47
|
export declare function metroPlugin(options?: MetroPluginOptions): PluginOption;
|
|
40
48
|
export {};
|
|
@@ -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;AAWxC,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;
|
|
1
|
+
{"version":3,"file":"metroPlugin.d.ts","sourceRoot":"","sources":["../../src/plugins/metroPlugin.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,MAAM,CAAA;AAWxC,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;IACvB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;CAC3B,CAAA;AAED,wBAAgB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,YAAY,CA2Q1E"}
|