@vxrn/vite-plugin-metro 1.2.32 → 1.2.34
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 +48 -22
- package/dist/cjs/plugins/metroPlugin.js +41 -20
- package/dist/cjs/plugins/metroPlugin.js.map +1 -1
- package/dist/cjs/plugins/metroPlugin.native.js +81 -55
- package/dist/cjs/plugins/metroPlugin.native.js.map +1 -1
- package/dist/esm/plugins/metroPlugin.js +41 -19
- package/dist/esm/plugins/metroPlugin.js.map +1 -1
- package/dist/esm/plugins/metroPlugin.mjs +48 -22
- package/dist/esm/plugins/metroPlugin.mjs.map +1 -1
- package/dist/esm/plugins/metroPlugin.native.js +80 -54
- package/dist/esm/plugins/metroPlugin.native.js.map +1 -1
- package/package.json +3 -3
- package/src/plugins/metroPlugin.ts +99 -57
- package/types/plugins/metroPlugin.d.ts.map +1 -1
|
@@ -37,9 +37,13 @@ module.exports = __toCommonJS(metroPlugin_exports);
|
|
|
37
37
|
var import_node_fs = require("node:fs"),
|
|
38
38
|
import_promises = require("node:fs/promises"),
|
|
39
39
|
import_launch_editor = __toESM(require("launch-editor"), 1),
|
|
40
|
+
import_debug = require("@vxrn/debug"),
|
|
40
41
|
import_projectImport = require("../utils/projectImport.cjs"),
|
|
41
42
|
import_getMetroConfigFromViteConfig = require("../metro-config/getMetroConfigFromViteConfig.cjs"),
|
|
42
43
|
import_patchMetroServerWithViteConfigAndMetroPluginOptions = require("../metro-config/patchMetroServerWithViteConfigAndMetroPluginOptions.cjs");
|
|
44
|
+
const {
|
|
45
|
+
debug
|
|
46
|
+
} = (0, import_debug.createDebugger)("vite-plugin-metro");
|
|
43
47
|
function metroPlugin(options = {}) {
|
|
44
48
|
return globalThis.__viteMetroPluginOptions__ = options, {
|
|
45
49
|
name: "metro",
|
|
@@ -48,16 +52,24 @@ function metroPlugin(options = {}) {
|
|
|
48
52
|
// },
|
|
49
53
|
configureServer(server) {
|
|
50
54
|
const {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
metroStartTime = Date.now();
|
|
55
|
+
root: projectRoot
|
|
56
|
+
} = server.config;
|
|
54
57
|
let metroReady = !1,
|
|
55
58
|
middleware,
|
|
56
59
|
metroServer,
|
|
57
60
|
hmrServer,
|
|
58
61
|
websocketEndpoints,
|
|
59
|
-
rnDevtoolsMiddleware
|
|
60
|
-
|
|
62
|
+
rnDevtoolsMiddleware,
|
|
63
|
+
metroPromise,
|
|
64
|
+
metroPromiseResolvers;
|
|
65
|
+
metroPromise = new Promise((resolve, reject) => {
|
|
66
|
+
metroPromiseResolvers = {
|
|
67
|
+
resolve,
|
|
68
|
+
reject
|
|
69
|
+
};
|
|
70
|
+
});
|
|
71
|
+
const startMetro = async () => {
|
|
72
|
+
const metroStartTime = Date.now();
|
|
61
73
|
try {
|
|
62
74
|
const {
|
|
63
75
|
default: Metro
|
|
@@ -89,28 +101,42 @@ function metroPlugin(options = {}) {
|
|
|
89
101
|
websocketServer: hmrServer
|
|
90
102
|
}),
|
|
91
103
|
...devMiddleware.websocketEndpoints
|
|
92
|
-
},
|
|
104
|
+
}, server.httpServer?.on("upgrade", (request, socket, head) => {
|
|
105
|
+
const pathname = new URL(request.url, `http://${request.headers.host}`).pathname;
|
|
106
|
+
websocketEndpoints[pathname] && websocketEndpoints[pathname].handleUpgrade(request, socket, head, ws => {
|
|
107
|
+
websocketEndpoints[pathname].emit("connection", ws, request);
|
|
108
|
+
});
|
|
109
|
+
}), server.middlewares.use(rnDevtoolsMiddleware), metroReady = !0;
|
|
93
110
|
const metroElapsed = Date.now() - metroStartTime;
|
|
94
|
-
|
|
111
|
+
debug?.(`Metro bundler ready (${metroElapsed}ms)`), metroPromiseResolvers.resolve();
|
|
95
112
|
} catch (err) {
|
|
96
|
-
throw
|
|
113
|
+
throw debug?.(`Error during Metro initialization: ${err}`), metroPromiseResolvers.reject(err), err;
|
|
97
114
|
}
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
})
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
115
|
+
};
|
|
116
|
+
if (server.httpServer) server.httpServer.listening ? startMetro().catch(err => {
|
|
117
|
+
debug?.(`Failed to start Metro: ${err}`);
|
|
118
|
+
}) : server.httpServer.on("listening", () => {
|
|
119
|
+
startMetro().catch(err => {
|
|
120
|
+
debug?.(`Failed to start Metro: ${err}`);
|
|
121
|
+
});
|
|
122
|
+
});else {
|
|
123
|
+
const waitForServer = () => {
|
|
124
|
+
server.httpServer ? server.httpServer.listening ? startMetro().catch(err => {
|
|
125
|
+
debug?.(`Failed to start Metro: ${err}`);
|
|
126
|
+
}) : server.httpServer.on("listening", () => {
|
|
127
|
+
startMetro().catch(err => {
|
|
128
|
+
debug?.(`Failed to start Metro: ${err}`);
|
|
129
|
+
});
|
|
130
|
+
}) : setTimeout(waitForServer, 10);
|
|
131
|
+
};
|
|
132
|
+
waitForServer();
|
|
133
|
+
}
|
|
134
|
+
server.middlewares.use(async (req, res, next) => {
|
|
109
135
|
if (req.url?.includes(".bundle") && !metroReady && (await metroPromise), middleware) try {
|
|
110
136
|
if (req.url?.includes(".bundle")) {
|
|
111
137
|
const VITE_METRO_DEBUG_BUNDLE = process.env.VITE_METRO_DEBUG_BUNDLE;
|
|
112
138
|
if (VITE_METRO_DEBUG_BUNDLE && (0, import_node_fs.existsSync)(VITE_METRO_DEBUG_BUNDLE)) {
|
|
113
|
-
|
|
139
|
+
debug?.(`serving debug bundle from ${VITE_METRO_DEBUG_BUNDLE}`);
|
|
114
140
|
const content = await (0, import_promises.readFile)(VITE_METRO_DEBUG_BUNDLE, "utf-8");
|
|
115
141
|
res.setHeader("Content-Type", "application/javascript"), res.end(content);
|
|
116
142
|
return;
|
|
@@ -134,14 +160,14 @@ function metroPlugin(options = {}) {
|
|
|
134
160
|
const frame = JSON.parse(body);
|
|
135
161
|
(0, import_launch_editor.default)(frame.file), res.statusCode = 200, res.end("Stack frame opened in editor");
|
|
136
162
|
} catch (e) {
|
|
137
|
-
return
|
|
163
|
+
return debug?.(`Failed to parse stack frame: ${e}`), res.statusCode = 400, res.end("Invalid stack frame JSON");
|
|
138
164
|
}
|
|
139
165
|
});
|
|
140
166
|
return;
|
|
141
167
|
}
|
|
142
168
|
await middleware(req, res, next);
|
|
143
169
|
} catch (error) {
|
|
144
|
-
|
|
170
|
+
debug?.(`Metro middleware error: ${error}`), next();
|
|
145
171
|
} else next();
|
|
146
172
|
});
|
|
147
173
|
}
|
|
@@ -25,7 +25,8 @@ __export(metroPlugin_exports, {
|
|
|
25
25
|
metroPlugin: () => metroPlugin
|
|
26
26
|
});
|
|
27
27
|
module.exports = __toCommonJS(metroPlugin_exports);
|
|
28
|
-
var import_node_fs = require("node:fs"), import_promises = require("node:fs/promises"), import_launch_editor = __toESM(require("launch-editor"), 1), import_projectImport = require("../utils/projectImport"), import_getMetroConfigFromViteConfig = require("../metro-config/getMetroConfigFromViteConfig"), import_patchMetroServerWithViteConfigAndMetroPluginOptions = require("../metro-config/patchMetroServerWithViteConfigAndMetroPluginOptions");
|
|
28
|
+
var import_node_fs = require("node:fs"), import_promises = require("node:fs/promises"), import_launch_editor = __toESM(require("launch-editor"), 1), import_debug = require("@vxrn/debug"), import_projectImport = require("../utils/projectImport"), import_getMetroConfigFromViteConfig = require("../metro-config/getMetroConfigFromViteConfig"), import_patchMetroServerWithViteConfigAndMetroPluginOptions = require("../metro-config/patchMetroServerWithViteConfigAndMetroPluginOptions");
|
|
29
|
+
const { debug } = (0, import_debug.createDebugger)("vite-plugin-metro");
|
|
29
30
|
function metroPlugin(options = {}) {
|
|
30
31
|
return globalThis.__viteMetroPluginOptions__ = options, {
|
|
31
32
|
name: "metro",
|
|
@@ -33,9 +34,13 @@ function metroPlugin(options = {}) {
|
|
|
33
34
|
// projectRoot = config.root
|
|
34
35
|
// },
|
|
35
36
|
configureServer(server) {
|
|
36
|
-
const { root: projectRoot } = server.config
|
|
37
|
-
let metroReady = !1, middleware, metroServer, hmrServer, websocketEndpoints, rnDevtoolsMiddleware;
|
|
38
|
-
|
|
37
|
+
const { root: projectRoot } = server.config;
|
|
38
|
+
let metroReady = !1, middleware, metroServer, hmrServer, websocketEndpoints, rnDevtoolsMiddleware, metroPromise, metroPromiseResolvers;
|
|
39
|
+
metroPromise = new Promise((resolve, reject) => {
|
|
40
|
+
metroPromiseResolvers = { resolve, reject };
|
|
41
|
+
});
|
|
42
|
+
const startMetro = async () => {
|
|
43
|
+
const metroStartTime = Date.now();
|
|
39
44
|
try {
|
|
40
45
|
const { default: Metro } = await (0, import_projectImport.projectImport)(projectRoot, "metro"), { default: MetroHmrServer } = await (0, import_projectImport.projectImport)(projectRoot, "metro/private/HmrServer"), { default: createWebsocketServer } = await (0, import_projectImport.projectImport)(projectRoot, "metro/private/lib/createWebsocketServer"), { createDevMiddleware } = await (0, import_projectImport.projectImport)(projectRoot, "@react-native/dev-middleware"), config = await (0, import_getMetroConfigFromViteConfig.getMetroConfigFromViteConfig)(server.config, options), metroResult = await Metro.createConnectMiddleware(config, {
|
|
41
46
|
// Force enable file watching, even on CI.
|
|
@@ -57,29 +62,45 @@ function metroPlugin(options = {}) {
|
|
|
57
62
|
websocketServer: hmrServer
|
|
58
63
|
}),
|
|
59
64
|
...devMiddleware.websocketEndpoints
|
|
60
|
-
},
|
|
65
|
+
}, server.httpServer?.on("upgrade", (request, socket, head) => {
|
|
66
|
+
const pathname = new URL(request.url, `http://${request.headers.host}`).pathname;
|
|
67
|
+
websocketEndpoints[pathname] && websocketEndpoints[pathname].handleUpgrade(request, socket, head, (ws) => {
|
|
68
|
+
websocketEndpoints[pathname].emit("connection", ws, request);
|
|
69
|
+
});
|
|
70
|
+
}), server.middlewares.use(rnDevtoolsMiddleware), metroReady = !0;
|
|
61
71
|
const metroElapsed = Date.now() - metroStartTime;
|
|
62
|
-
|
|
72
|
+
debug?.(`Metro bundler ready (${metroElapsed}ms)`), metroPromiseResolvers.resolve();
|
|
63
73
|
} catch (err) {
|
|
64
|
-
throw
|
|
74
|
+
throw debug?.(`Error during Metro initialization: ${err}`), metroPromiseResolvers.reject(err), err;
|
|
65
75
|
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
server.httpServer
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
websocketEndpoints[pathname].emit("connection", ws, request);
|
|
76
|
+
};
|
|
77
|
+
if (server.httpServer)
|
|
78
|
+
server.httpServer.listening ? startMetro().catch((err) => {
|
|
79
|
+
debug?.(`Failed to start Metro: ${err}`);
|
|
80
|
+
}) : server.httpServer.on("listening", () => {
|
|
81
|
+
startMetro().catch((err) => {
|
|
82
|
+
debug?.(`Failed to start Metro: ${err}`);
|
|
74
83
|
});
|
|
75
|
-
})
|
|
76
|
-
|
|
84
|
+
});
|
|
85
|
+
else {
|
|
86
|
+
const waitForServer = () => {
|
|
87
|
+
server.httpServer ? server.httpServer.listening ? startMetro().catch((err) => {
|
|
88
|
+
debug?.(`Failed to start Metro: ${err}`);
|
|
89
|
+
}) : server.httpServer.on("listening", () => {
|
|
90
|
+
startMetro().catch((err) => {
|
|
91
|
+
debug?.(`Failed to start Metro: ${err}`);
|
|
92
|
+
});
|
|
93
|
+
}) : setTimeout(waitForServer, 10);
|
|
94
|
+
};
|
|
95
|
+
waitForServer();
|
|
96
|
+
}
|
|
97
|
+
server.middlewares.use(async (req, res, next) => {
|
|
77
98
|
if (req.url?.includes(".bundle") && !metroReady && await metroPromise, middleware)
|
|
78
99
|
try {
|
|
79
100
|
if (req.url?.includes(".bundle")) {
|
|
80
101
|
const VITE_METRO_DEBUG_BUNDLE = process.env.VITE_METRO_DEBUG_BUNDLE;
|
|
81
102
|
if (VITE_METRO_DEBUG_BUNDLE && (0, import_node_fs.existsSync)(VITE_METRO_DEBUG_BUNDLE)) {
|
|
82
|
-
|
|
103
|
+
debug?.(`serving debug bundle from ${VITE_METRO_DEBUG_BUNDLE}`);
|
|
83
104
|
const content = await (0, import_promises.readFile)(VITE_METRO_DEBUG_BUNDLE, "utf-8");
|
|
84
105
|
res.setHeader("Content-Type", "application/javascript"), res.end(content);
|
|
85
106
|
return;
|
|
@@ -106,14 +127,14 @@ function metroPlugin(options = {}) {
|
|
|
106
127
|
const frame = JSON.parse(body);
|
|
107
128
|
(0, import_launch_editor.default)(frame.file), res.statusCode = 200, res.end("Stack frame opened in editor");
|
|
108
129
|
} catch (e) {
|
|
109
|
-
return
|
|
130
|
+
return debug?.(`Failed to parse stack frame: ${e}`), res.statusCode = 400, res.end("Invalid stack frame JSON");
|
|
110
131
|
}
|
|
111
132
|
});
|
|
112
133
|
return;
|
|
113
134
|
}
|
|
114
135
|
await middleware(req, res, next);
|
|
115
136
|
} catch (error) {
|
|
116
|
-
|
|
137
|
+
debug?.(`Metro middleware error: ${error}`), next();
|
|
117
138
|
}
|
|
118
139
|
else
|
|
119
140
|
next();
|
|
@@ -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,
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": ["launchEditor"]
|
|
6
6
|
}
|
|
@@ -39,9 +39,13 @@ module.exports = __toCommonJS(metroPlugin_exports);
|
|
|
39
39
|
var import_fs = require("fs"),
|
|
40
40
|
import_promises = require("fs/promises"),
|
|
41
41
|
import_launch_editor = __toESM(require("launch-editor"), 1),
|
|
42
|
+
import_debug = require("@vxrn/debug"),
|
|
42
43
|
import_projectImport = require("../utils/projectImport.native.js"),
|
|
43
44
|
import_getMetroConfigFromViteConfig = require("../metro-config/getMetroConfigFromViteConfig.native.js"),
|
|
44
|
-
import_patchMetroServerWithViteConfigAndMetroPluginOptions = require("../metro-config/patchMetroServerWithViteConfigAndMetroPluginOptions.native.js")
|
|
45
|
+
import_patchMetroServerWithViteConfigAndMetroPluginOptions = require("../metro-config/patchMetroServerWithViteConfigAndMetroPluginOptions.native.js"),
|
|
46
|
+
{
|
|
47
|
+
debug
|
|
48
|
+
} = (0, import_debug.createDebugger)("vite-plugin-metro");
|
|
45
49
|
function metroPlugin() {
|
|
46
50
|
var options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
|
|
47
51
|
return globalThis.__viteMetroPluginOptions__ = options, {
|
|
@@ -53,70 +57,92 @@ function metroPlugin() {
|
|
|
53
57
|
var {
|
|
54
58
|
root: projectRoot
|
|
55
59
|
} = server.config,
|
|
56
|
-
metroStartTime = Date.now(),
|
|
57
60
|
metroReady = !1,
|
|
58
61
|
middleware,
|
|
59
62
|
metroServer,
|
|
60
63
|
hmrServer,
|
|
61
64
|
websocketEndpoints,
|
|
62
65
|
rnDevtoolsMiddleware,
|
|
63
|
-
metroPromise
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
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
|
-
|
|
66
|
+
metroPromise,
|
|
67
|
+
metroPromiseResolvers;
|
|
68
|
+
metroPromise = new Promise(function (resolve, reject) {
|
|
69
|
+
metroPromiseResolvers = {
|
|
70
|
+
resolve,
|
|
71
|
+
reject
|
|
72
|
+
};
|
|
73
|
+
});
|
|
74
|
+
var startMetro = async function () {
|
|
75
|
+
var metroStartTime = Date.now();
|
|
76
|
+
try {
|
|
77
|
+
var _server_httpServer,
|
|
78
|
+
{
|
|
79
|
+
default: Metro
|
|
80
|
+
} = await (0, import_projectImport.projectImport)(projectRoot, "metro"),
|
|
81
|
+
{
|
|
82
|
+
default: MetroHmrServer
|
|
83
|
+
} = await (0, import_projectImport.projectImport)(projectRoot, "metro/private/HmrServer"),
|
|
84
|
+
{
|
|
85
|
+
default: createWebsocketServer
|
|
86
|
+
} = await (0, import_projectImport.projectImport)(projectRoot, "metro/private/lib/createWebsocketServer"),
|
|
87
|
+
{
|
|
88
|
+
createDevMiddleware
|
|
89
|
+
} = await (0, import_projectImport.projectImport)(projectRoot, "@react-native/dev-middleware"),
|
|
90
|
+
config = await (0, import_getMetroConfigFromViteConfig.getMetroConfigFromViteConfig)(server.config, options),
|
|
91
|
+
metroResult = await Metro.createConnectMiddleware(config, {
|
|
92
|
+
// Force enable file watching, even on CI.
|
|
93
|
+
// This is needed for HMR tests to work on CI.
|
|
94
|
+
watch: !0
|
|
95
|
+
});
|
|
96
|
+
middleware = metroResult.middleware, metroServer = metroResult.metroServer, (0, import_patchMetroServerWithViteConfigAndMetroPluginOptions.patchMetroServerWithViteConfigAndMetroPluginOptions)(metroServer, server.config, options), hmrServer = new MetroHmrServer(metroServer.getBundler(), metroServer.getCreateModuleId(), config);
|
|
97
|
+
var reactNativeDevToolsUrl = `http://${typeof server.config.server.host == "boolean" ? "localhost" : server.config.server.host}:${server.config.server.port}`,
|
|
98
|
+
devMiddleware = createDevMiddleware({
|
|
99
|
+
projectRoot,
|
|
100
|
+
serverBaseUrl: reactNativeDevToolsUrl,
|
|
101
|
+
logger: console
|
|
102
|
+
});
|
|
103
|
+
rnDevtoolsMiddleware = devMiddleware.middleware, websocketEndpoints = {
|
|
104
|
+
"/hot": createWebsocketServer({
|
|
105
|
+
websocketServer: hmrServer
|
|
106
|
+
}),
|
|
107
|
+
...devMiddleware.websocketEndpoints
|
|
108
|
+
}, (_server_httpServer = server.httpServer) === null || _server_httpServer === void 0 || _server_httpServer.on("upgrade", function (request, socket, head) {
|
|
109
|
+
var pathname = new URL(request.url, `http://${request.headers.host}`).pathname;
|
|
110
|
+
websocketEndpoints[pathname] && websocketEndpoints[pathname].handleUpgrade(request, socket, head, function (ws) {
|
|
111
|
+
websocketEndpoints[pathname].emit("connection", ws, request);
|
|
112
|
+
});
|
|
113
|
+
}), server.middlewares.use(rnDevtoolsMiddleware), metroReady = !0;
|
|
114
|
+
var metroElapsed = Date.now() - metroStartTime;
|
|
115
|
+
debug?.(`Metro bundler ready (${metroElapsed}ms)`), metroPromiseResolvers.resolve();
|
|
116
|
+
} catch (err) {
|
|
117
|
+
throw debug?.(`Error during Metro initialization: ${err}`), metroPromiseResolvers.reject(err), err;
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
if (server.httpServer) server.httpServer.listening ? startMetro().catch(function (err) {
|
|
121
|
+
debug?.(`Failed to start Metro: ${err}`);
|
|
122
|
+
}) : server.httpServer.on("listening", function () {
|
|
123
|
+
startMetro().catch(function (err) {
|
|
124
|
+
debug?.(`Failed to start Metro: ${err}`);
|
|
125
|
+
});
|
|
126
|
+
});else {
|
|
127
|
+
var waitForServer = function () {
|
|
128
|
+
server.httpServer ? server.httpServer.listening ? startMetro().catch(function (err) {
|
|
129
|
+
debug?.(`Failed to start Metro: ${err}`);
|
|
130
|
+
}) : server.httpServer.on("listening", function () {
|
|
131
|
+
startMetro().catch(function (err) {
|
|
132
|
+
debug?.(`Failed to start Metro: ${err}`);
|
|
133
|
+
});
|
|
134
|
+
}) : setTimeout(waitForServer, 10);
|
|
135
|
+
};
|
|
136
|
+
waitForServer();
|
|
137
|
+
}
|
|
138
|
+
server.middlewares.use(async function (req, res, next) {
|
|
113
139
|
var _req_url;
|
|
114
140
|
if (!((_req_url = req.url) === null || _req_url === void 0) && _req_url.includes(".bundle") && !metroReady && (await metroPromise), middleware) try {
|
|
115
141
|
var _req_url1, _req_headers_useragent, _req_headers_useragent1;
|
|
116
142
|
if (!((_req_url1 = req.url) === null || _req_url1 === void 0) && _req_url1.includes(".bundle")) {
|
|
117
143
|
var VITE_METRO_DEBUG_BUNDLE = process.env.VITE_METRO_DEBUG_BUNDLE;
|
|
118
144
|
if (VITE_METRO_DEBUG_BUNDLE && (0, import_fs.existsSync)(VITE_METRO_DEBUG_BUNDLE)) {
|
|
119
|
-
|
|
145
|
+
debug?.(`serving debug bundle from ${VITE_METRO_DEBUG_BUNDLE}`);
|
|
120
146
|
var content = await (0, import_promises.readFile)(VITE_METRO_DEBUG_BUNDLE, "utf-8");
|
|
121
147
|
res.setHeader("Content-Type", "application/javascript"), res.end(content);
|
|
122
148
|
return;
|
|
@@ -135,14 +161,14 @@ function metroPlugin() {
|
|
|
135
161
|
var frame = JSON.parse(body);
|
|
136
162
|
(0, import_launch_editor.default)(frame.file), res.statusCode = 200, res.end("Stack frame opened in editor");
|
|
137
163
|
} catch (e) {
|
|
138
|
-
return
|
|
164
|
+
return debug?.(`Failed to parse stack frame: ${e}`), res.statusCode = 400, res.end("Invalid stack frame JSON");
|
|
139
165
|
}
|
|
140
166
|
});
|
|
141
167
|
return;
|
|
142
168
|
}
|
|
143
169
|
await middleware(req, res, next);
|
|
144
170
|
} catch (error) {
|
|
145
|
-
|
|
171
|
+
debug?.(`Metro middleware error: ${error}`), next();
|
|
146
172
|
} else next();
|
|
147
173
|
});
|
|
148
174
|
}
|
|
@@ -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_projectImport","import_getMetroConfigFromViteConfig","import_patchMetroServerWithViteConfigAndMetroPluginOptions","options","arguments","length","globalThis","__viteMetroPluginOptions__","name","configureServer","server","root","projectRoot","config","
|
|
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_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","default","Metro","projectImport","MetroHmrServer","createWebsocketServer","createDevMiddleware","getMetroConfigFromViteConfig","metroResult","createConnectMiddleware","watch","patchMetroServerWithViteConfigAndMetroPluginOptions","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","existsSync","content","readFile","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,11 @@
|
|
|
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";
|
|
5
6
|
import { getMetroConfigFromViteConfig } from "../metro-config/getMetroConfigFromViteConfig";
|
|
6
7
|
import { patchMetroServerWithViteConfigAndMetroPluginOptions } from "../metro-config/patchMetroServerWithViteConfigAndMetroPluginOptions";
|
|
8
|
+
const { debug } = createDebugger("vite-plugin-metro");
|
|
7
9
|
function metroPlugin(options = {}) {
|
|
8
10
|
return globalThis.__viteMetroPluginOptions__ = options, {
|
|
9
11
|
name: "metro",
|
|
@@ -11,9 +13,13 @@ function metroPlugin(options = {}) {
|
|
|
11
13
|
// projectRoot = config.root
|
|
12
14
|
// },
|
|
13
15
|
configureServer(server) {
|
|
14
|
-
const { root: projectRoot } = server.config
|
|
15
|
-
let metroReady = !1, middleware, metroServer, hmrServer, websocketEndpoints, rnDevtoolsMiddleware;
|
|
16
|
-
|
|
16
|
+
const { root: projectRoot } = server.config;
|
|
17
|
+
let metroReady = !1, middleware, metroServer, hmrServer, websocketEndpoints, rnDevtoolsMiddleware, metroPromise, metroPromiseResolvers;
|
|
18
|
+
metroPromise = new Promise((resolve, reject) => {
|
|
19
|
+
metroPromiseResolvers = { resolve, reject };
|
|
20
|
+
});
|
|
21
|
+
const startMetro = async () => {
|
|
22
|
+
const metroStartTime = Date.now();
|
|
17
23
|
try {
|
|
18
24
|
const { default: Metro } = await projectImport(projectRoot, "metro"), { default: MetroHmrServer } = await projectImport(projectRoot, "metro/private/HmrServer"), { default: createWebsocketServer } = await projectImport(projectRoot, "metro/private/lib/createWebsocketServer"), { createDevMiddleware } = await projectImport(projectRoot, "@react-native/dev-middleware"), config = await getMetroConfigFromViteConfig(server.config, options), metroResult = await Metro.createConnectMiddleware(config, {
|
|
19
25
|
// Force enable file watching, even on CI.
|
|
@@ -35,29 +41,45 @@ function metroPlugin(options = {}) {
|
|
|
35
41
|
websocketServer: hmrServer
|
|
36
42
|
}),
|
|
37
43
|
...devMiddleware.websocketEndpoints
|
|
38
|
-
},
|
|
44
|
+
}, server.httpServer?.on("upgrade", (request, socket, head) => {
|
|
45
|
+
const pathname = new URL(request.url, `http://${request.headers.host}`).pathname;
|
|
46
|
+
websocketEndpoints[pathname] && websocketEndpoints[pathname].handleUpgrade(request, socket, head, (ws) => {
|
|
47
|
+
websocketEndpoints[pathname].emit("connection", ws, request);
|
|
48
|
+
});
|
|
49
|
+
}), server.middlewares.use(rnDevtoolsMiddleware), metroReady = !0;
|
|
39
50
|
const metroElapsed = Date.now() - metroStartTime;
|
|
40
|
-
|
|
51
|
+
debug?.(`Metro bundler ready (${metroElapsed}ms)`), metroPromiseResolvers.resolve();
|
|
41
52
|
} catch (err) {
|
|
42
|
-
throw
|
|
53
|
+
throw debug?.(`Error during Metro initialization: ${err}`), metroPromiseResolvers.reject(err), err;
|
|
43
54
|
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
server.httpServer
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
websocketEndpoints[pathname].emit("connection", ws, request);
|
|
55
|
+
};
|
|
56
|
+
if (server.httpServer)
|
|
57
|
+
server.httpServer.listening ? startMetro().catch((err) => {
|
|
58
|
+
debug?.(`Failed to start Metro: ${err}`);
|
|
59
|
+
}) : server.httpServer.on("listening", () => {
|
|
60
|
+
startMetro().catch((err) => {
|
|
61
|
+
debug?.(`Failed to start Metro: ${err}`);
|
|
52
62
|
});
|
|
53
|
-
})
|
|
54
|
-
|
|
63
|
+
});
|
|
64
|
+
else {
|
|
65
|
+
const waitForServer = () => {
|
|
66
|
+
server.httpServer ? server.httpServer.listening ? startMetro().catch((err) => {
|
|
67
|
+
debug?.(`Failed to start Metro: ${err}`);
|
|
68
|
+
}) : server.httpServer.on("listening", () => {
|
|
69
|
+
startMetro().catch((err) => {
|
|
70
|
+
debug?.(`Failed to start Metro: ${err}`);
|
|
71
|
+
});
|
|
72
|
+
}) : setTimeout(waitForServer, 10);
|
|
73
|
+
};
|
|
74
|
+
waitForServer();
|
|
75
|
+
}
|
|
76
|
+
server.middlewares.use(async (req, res, next) => {
|
|
55
77
|
if (req.url?.includes(".bundle") && !metroReady && await metroPromise, middleware)
|
|
56
78
|
try {
|
|
57
79
|
if (req.url?.includes(".bundle")) {
|
|
58
80
|
const VITE_METRO_DEBUG_BUNDLE = process.env.VITE_METRO_DEBUG_BUNDLE;
|
|
59
81
|
if (VITE_METRO_DEBUG_BUNDLE && existsSync(VITE_METRO_DEBUG_BUNDLE)) {
|
|
60
|
-
|
|
82
|
+
debug?.(`serving debug bundle from ${VITE_METRO_DEBUG_BUNDLE}`);
|
|
61
83
|
const content = await readFile(VITE_METRO_DEBUG_BUNDLE, "utf-8");
|
|
62
84
|
res.setHeader("Content-Type", "application/javascript"), res.end(content);
|
|
63
85
|
return;
|
|
@@ -84,14 +106,14 @@ function metroPlugin(options = {}) {
|
|
|
84
106
|
const frame = JSON.parse(body);
|
|
85
107
|
launchEditor(frame.file), res.statusCode = 200, res.end("Stack frame opened in editor");
|
|
86
108
|
} catch (e) {
|
|
87
|
-
return
|
|
109
|
+
return debug?.(`Failed to parse stack frame: ${e}`), res.statusCode = 400, res.end("Invalid stack frame JSON");
|
|
88
110
|
}
|
|
89
111
|
});
|
|
90
112
|
return;
|
|
91
113
|
}
|
|
92
114
|
await middleware(req, res, next);
|
|
93
115
|
} catch (error) {
|
|
94
|
-
|
|
116
|
+
debug?.(`Metro middleware error: ${error}`), next();
|
|
95
117
|
}
|
|
96
118
|
else
|
|
97
119
|
next();
|
|
@@ -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;
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|