@vxrn/vite-plugin-metro 1.1.501-1751155612296

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/dist/cjs/index.cjs +28 -0
  2. package/dist/cjs/index.js +22 -0
  3. package/dist/cjs/index.js.map +6 -0
  4. package/dist/cjs/index.native.js +28 -0
  5. package/dist/cjs/index.native.js.map +6 -0
  6. package/dist/cjs/plugins/expoManifestRequestHandlerPlugin.cjs +56 -0
  7. package/dist/cjs/plugins/expoManifestRequestHandlerPlugin.js +49 -0
  8. package/dist/cjs/plugins/expoManifestRequestHandlerPlugin.js.map +6 -0
  9. package/dist/cjs/plugins/expoManifestRequestHandlerPlugin.native.js +48 -0
  10. package/dist/cjs/plugins/expoManifestRequestHandlerPlugin.native.js.map +6 -0
  11. package/dist/cjs/plugins/metroPlugin.cjs +214 -0
  12. package/dist/cjs/plugins/metroPlugin.js +186 -0
  13. package/dist/cjs/plugins/metroPlugin.js.map +6 -0
  14. package/dist/cjs/plugins/metroPlugin.native.js +179 -0
  15. package/dist/cjs/plugins/metroPlugin.native.js.map +6 -0
  16. package/dist/cjs/transformer/babel-core.cjs +27 -0
  17. package/dist/cjs/transformer/babel-core.js +22 -0
  18. package/dist/cjs/transformer/babel-core.js.map +6 -0
  19. package/dist/cjs/transformer/babel-core.native.js +28 -0
  20. package/dist/cjs/transformer/babel-core.native.js.map +6 -0
  21. package/dist/cjs/transformer/babel-transformer.cjs +148 -0
  22. package/dist/cjs/transformer/babel-transformer.js +129 -0
  23. package/dist/cjs/transformer/babel-transformer.js.map +6 -0
  24. package/dist/cjs/transformer/babel-transformer.native.js +135 -0
  25. package/dist/cjs/transformer/babel-transformer.native.js.map +6 -0
  26. package/dist/cjs/transformer/loadBabelConfig.cjs +53 -0
  27. package/dist/cjs/transformer/loadBabelConfig.js +46 -0
  28. package/dist/cjs/transformer/loadBabelConfig.js.map +6 -0
  29. package/dist/cjs/transformer/loadBabelConfig.native.js +55 -0
  30. package/dist/cjs/transformer/loadBabelConfig.native.js.map +6 -0
  31. package/dist/cjs/transformer/transformSync.cjs +64 -0
  32. package/dist/cjs/transformer/transformSync.js +53 -0
  33. package/dist/cjs/transformer/transformSync.js.map +6 -0
  34. package/dist/cjs/transformer/transformSync.native.js +58 -0
  35. package/dist/cjs/transformer/transformSync.native.js.map +6 -0
  36. package/dist/cjs/utils/getTerminalReporter.cjs +59 -0
  37. package/dist/cjs/utils/getTerminalReporter.js +48 -0
  38. package/dist/cjs/utils/getTerminalReporter.js.map +6 -0
  39. package/dist/cjs/utils/getTerminalReporter.native.js +53 -0
  40. package/dist/cjs/utils/getTerminalReporter.native.js.map +6 -0
  41. package/dist/cjs/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.cjs +35 -0
  42. package/dist/cjs/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.js +30 -0
  43. package/dist/cjs/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.js.map +6 -0
  44. package/dist/cjs/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.native.js +37 -0
  45. package/dist/cjs/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.native.js.map +6 -0
  46. package/dist/cjs/utils/projectImport.cjs +56 -0
  47. package/dist/cjs/utils/projectImport.js +43 -0
  48. package/dist/cjs/utils/projectImport.js.map +6 -0
  49. package/dist/cjs/utils/projectImport.native.js +54 -0
  50. package/dist/cjs/utils/projectImport.native.js.map +6 -0
  51. package/dist/esm/index.js +7 -0
  52. package/dist/esm/index.js.map +6 -0
  53. package/dist/esm/index.mjs +4 -0
  54. package/dist/esm/index.mjs.map +1 -0
  55. package/dist/esm/index.native.js +4 -0
  56. package/dist/esm/index.native.js.map +1 -0
  57. package/dist/esm/plugins/expoManifestRequestHandlerPlugin.js +35 -0
  58. package/dist/esm/plugins/expoManifestRequestHandlerPlugin.js.map +6 -0
  59. package/dist/esm/plugins/expoManifestRequestHandlerPlugin.mjs +33 -0
  60. package/dist/esm/plugins/expoManifestRequestHandlerPlugin.mjs.map +1 -0
  61. package/dist/esm/plugins/expoManifestRequestHandlerPlugin.native.js +34 -0
  62. package/dist/esm/plugins/expoManifestRequestHandlerPlugin.native.js.map +1 -0
  63. package/dist/esm/plugins/metroPlugin.js +168 -0
  64. package/dist/esm/plugins/metroPlugin.js.map +6 -0
  65. package/dist/esm/plugins/metroPlugin.mjs +180 -0
  66. package/dist/esm/plugins/metroPlugin.mjs.map +1 -0
  67. package/dist/esm/plugins/metroPlugin.native.js +189 -0
  68. package/dist/esm/plugins/metroPlugin.native.js.map +1 -0
  69. package/dist/esm/transformer/babel-core.js +9 -0
  70. package/dist/esm/transformer/babel-core.js.map +6 -0
  71. package/dist/esm/transformer/babel-core.mjs +3 -0
  72. package/dist/esm/transformer/babel-core.mjs.map +1 -0
  73. package/dist/esm/transformer/babel-core.native.js +3 -0
  74. package/dist/esm/transformer/babel-core.native.js.map +1 -0
  75. package/dist/esm/transformer/babel-transformer.js +110 -0
  76. package/dist/esm/transformer/babel-transformer.js.map +6 -0
  77. package/dist/esm/transformer/babel-transformer.mjs +122 -0
  78. package/dist/esm/transformer/babel-transformer.mjs.map +1 -0
  79. package/dist/esm/transformer/babel-transformer.native.js +136 -0
  80. package/dist/esm/transformer/babel-transformer.native.js.map +1 -0
  81. package/dist/esm/transformer/loadBabelConfig.js +23 -0
  82. package/dist/esm/transformer/loadBabelConfig.js.map +6 -0
  83. package/dist/esm/transformer/loadBabelConfig.mjs +19 -0
  84. package/dist/esm/transformer/loadBabelConfig.mjs.map +1 -0
  85. package/dist/esm/transformer/loadBabelConfig.native.js +23 -0
  86. package/dist/esm/transformer/loadBabelConfig.native.js.map +1 -0
  87. package/dist/esm/transformer/transformSync.js +29 -0
  88. package/dist/esm/transformer/transformSync.js.map +6 -0
  89. package/dist/esm/transformer/transformSync.mjs +30 -0
  90. package/dist/esm/transformer/transformSync.mjs.map +1 -0
  91. package/dist/esm/transformer/transformSync.native.js +31 -0
  92. package/dist/esm/transformer/transformSync.native.js.map +1 -0
  93. package/dist/esm/utils/getTerminalReporter.js +25 -0
  94. package/dist/esm/utils/getTerminalReporter.js.map +6 -0
  95. package/dist/esm/utils/getTerminalReporter.mjs +25 -0
  96. package/dist/esm/utils/getTerminalReporter.mjs.map +1 -0
  97. package/dist/esm/utils/getTerminalReporter.native.js +26 -0
  98. package/dist/esm/utils/getTerminalReporter.native.js.map +1 -0
  99. package/dist/esm/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.js +14 -0
  100. package/dist/esm/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.js.map +6 -0
  101. package/dist/esm/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.mjs +12 -0
  102. package/dist/esm/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.mjs.map +1 -0
  103. package/dist/esm/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.native.js +14 -0
  104. package/dist/esm/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.native.js.map +1 -0
  105. package/dist/esm/utils/projectImport.js +20 -0
  106. package/dist/esm/utils/projectImport.js.map +6 -0
  107. package/dist/esm/utils/projectImport.mjs +20 -0
  108. package/dist/esm/utils/projectImport.mjs.map +1 -0
  109. package/dist/esm/utils/projectImport.native.js +22 -0
  110. package/dist/esm/utils/projectImport.native.js.map +1 -0
  111. package/empty.js +0 -0
  112. package/package.json +68 -0
  113. package/src/index.ts +4 -0
  114. package/src/plugins/expoManifestRequestHandlerPlugin.ts +75 -0
  115. package/src/plugins/metroPlugin.ts +314 -0
  116. package/src/transformer/babel-core.ts +7 -0
  117. package/src/transformer/babel-transformer.ts +211 -0
  118. package/src/transformer/loadBabelConfig.ts +53 -0
  119. package/src/transformer/transformSync.ts +54 -0
  120. package/src/utils/getTerminalReporter.ts +42 -0
  121. package/src/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.ts +27 -0
  122. package/src/utils/projectImport.ts +32 -0
  123. package/types/index.d.ts +5 -0
  124. package/types/index.d.ts.map +1 -0
  125. package/types/plugins/expoManifestRequestHandlerPlugin.d.ts +14 -0
  126. package/types/plugins/expoManifestRequestHandlerPlugin.d.ts.map +1 -0
  127. package/types/plugins/metroPlugin.d.ts +22 -0
  128. package/types/plugins/metroPlugin.d.ts.map +1 -0
  129. package/types/transformer/babel-core.d.ts +2 -0
  130. package/types/transformer/babel-core.d.ts.map +1 -0
  131. package/types/transformer/babel-transformer.d.ts +18 -0
  132. package/types/transformer/babel-transformer.d.ts.map +1 -0
  133. package/types/transformer/loadBabelConfig.d.ts +10 -0
  134. package/types/transformer/loadBabelConfig.d.ts.map +1 -0
  135. package/types/transformer/transformSync.d.ts +11 -0
  136. package/types/transformer/transformSync.d.ts.map +1 -0
  137. package/types/utils/getTerminalReporter.d.ts +3 -0
  138. package/types/utils/getTerminalReporter.d.ts.map +1 -0
  139. package/types/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.d.ts +5 -0
  140. package/types/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.d.ts.map +1 -0
  141. package/types/utils/projectImport.d.ts +12 -0
  142. package/types/utils/projectImport.d.ts.map +1 -0
@@ -0,0 +1,33 @@
1
+ import { TLSSocket } from "node:tls";
2
+ import { projectImport } from "../utils/projectImport.mjs";
3
+ import { patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName } from "../utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.mjs";
4
+ function expoManifestRequestHandlerPlugin(options) {
5
+ return {
6
+ name: "expo-manifest-request-handler",
7
+ // configResolved(config) {
8
+ // projectRoot = config.root
9
+ // },
10
+ async configureServer(server) {
11
+ const {
12
+ root: projectRoot
13
+ } = server.config,
14
+ ExpoGoManifestHandlerMiddleware = (await projectImport(projectRoot, "@expo/cli/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js")).default.ExpoGoManifestHandlerMiddleware;
15
+ server.middlewares.use(async (req, res, next) => {
16
+ if (!req.headers["expo-platform"]) return next();
17
+ const protocol = req.socket instanceof TLSSocket && req.socket.encrypted ? "https" : "http",
18
+ manifestHandlerMiddleware = new ExpoGoManifestHandlerMiddleware(projectRoot, {
19
+ constructUrl: ({
20
+ scheme,
21
+ hostname
22
+ }) => {
23
+ const host = req.headers["x-forwarded-host"] || req.headers.host || hostname;
24
+ return scheme ? `${protocol || scheme}://${host}` : host;
25
+ }
26
+ });
27
+ options.mainModuleName && patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName(manifestHandlerMiddleware, options.mainModuleName), manifestHandlerMiddleware.handleRequestAsync(req, res, next);
28
+ });
29
+ }
30
+ };
31
+ }
32
+ export { expoManifestRequestHandlerPlugin };
33
+ //# sourceMappingURL=expoManifestRequestHandlerPlugin.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["TLSSocket","projectImport","patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName","expoManifestRequestHandlerPlugin","options","name","configureServer","server","root","projectRoot","config","ExpoGoManifestHandlerMiddleware","default","middlewares","use","req","res","next","headers","protocol","socket","encrypted","manifestHandlerMiddleware","constructUrl","scheme","hostname","host","mainModuleName","handleRequestAsync"],"sources":["../../../src/plugins/expoManifestRequestHandlerPlugin.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,SAAA,QAAiB;AAG1B,SAASC,aAAA,QAAqB;AAC9B,SAASC,4DAAA,QAAoE;AActE,SAASC,iCACdC,OAAA,EACc;EAGd,OAAO;IACLC,IAAA,EAAM;IAAA;IAAA;IAAA;IAIN,MAAMC,gBAAgBC,MAAA,EAAQ;MAC5B,MAAM;UAAEC,IAAA,EAAMC;QAAY,IAAIF,MAAA,CAAOG,MAAA;QAE/BC,+BAAA,IACJ,MAAMV,aAAA,CACJQ,WAAA,EACA,gFACF,GACAG,OAAA,CAAQD,+BAAA;MAEVJ,MAAA,CAAOM,WAAA,CAAYC,GAAA,CAAI,OAAOC,GAAA,EAAKC,GAAA,EAAKC,IAAA,KAAS;QAC/C,IAAI,CAACF,GAAA,CAAIG,OAAA,CAAQ,eAAe,GAE9B,OAAOD,IAAA,CAAK;QAGd,MAAME,QAAA,GAAWJ,GAAA,CAAIK,MAAA,YAAkBpB,SAAA,IAAae,GAAA,CAAIK,MAAA,CAAOC,SAAA,GAAY,UAAU;UAE/EC,yBAAA,GAA4B,IAAIX,+BAAA,CAAgCF,WAAA,EAAa;YACjFc,YAAA,EAAcA,CAAC;cAAEC,MAAA;cAAQC;YAAS,MAAM;cAEtC,MAAMC,IAAA,GAAOX,GAAA,CAAIG,OAAA,CAAQ,kBAAkB,KAAKH,GAAA,CAAIG,OAAA,CAAQQ,IAAA,IAAQD,QAAA;cAEpE,OAAKD,MAAA,GAOE,GAAGL,QAAA,IAAYK,MAAM,MAAME,IAAI,KAH7BA,IAAA;YAIX;UACF,CAAC;QAEGtB,OAAA,CAAQuB,cAAA,IACVzB,4DAAA,CACEoB,yBAAA,EACAlB,OAAA,CAAQuB,cACV,GAIFL,yBAAA,CAA0BM,kBAAA,CAAmBb,GAAA,EAAKC,GAAA,EAAKC,IAAI;MAC7D,CAAC;IACH;EACF;AACF","ignoreList":[]}
@@ -0,0 +1,34 @@
1
+ import { TLSSocket } from "node:tls";
2
+ import { projectImport } from "../utils/projectImport.native.js";
3
+ import { patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName } from "../utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.native.js";
4
+ function expoManifestRequestHandlerPlugin(options) {
5
+ return {
6
+ name: "expo-manifest-request-handler",
7
+ // configResolved(config) {
8
+ // projectRoot = config.root
9
+ // },
10
+ async configureServer(server) {
11
+ var {
12
+ root: projectRoot
13
+ } = server.config,
14
+ ExpoGoManifestHandlerMiddleware = (await projectImport(projectRoot, "@expo/cli/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js")).default.ExpoGoManifestHandlerMiddleware;
15
+ server.middlewares.use(async function (req, res, next) {
16
+ if (!req.headers["expo-platform"]) return next();
17
+ var protocol = req.socket instanceof TLSSocket && req.socket.encrypted ? "https" : "http",
18
+ manifestHandlerMiddleware = new ExpoGoManifestHandlerMiddleware(projectRoot, {
19
+ constructUrl: function (param) {
20
+ var {
21
+ scheme,
22
+ hostname
23
+ } = param,
24
+ host = req.headers["x-forwarded-host"] || req.headers.host || hostname;
25
+ return scheme ? `${protocol || scheme}://${host}` : host;
26
+ }
27
+ });
28
+ options.mainModuleName && patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName(manifestHandlerMiddleware, options.mainModuleName), manifestHandlerMiddleware.handleRequestAsync(req, res, next);
29
+ });
30
+ }
31
+ };
32
+ }
33
+ export { expoManifestRequestHandlerPlugin };
34
+ //# sourceMappingURL=expoManifestRequestHandlerPlugin.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["TLSSocket","projectImport","patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName","expoManifestRequestHandlerPlugin","options","name","configureServer","server","root","projectRoot","config","ExpoGoManifestHandlerMiddleware","default","middlewares","use","req","res","next","headers","protocol","socket","encrypted","manifestHandlerMiddleware","constructUrl","param","scheme","hostname","host","mainModuleName","handleRequestAsync"],"sources":["../../../src/plugins/expoManifestRequestHandlerPlugin.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,SAAA,QAAiB;AAG1B,SAASC,aAAA,QAAqB;AAC9B,SAASC,4DAAA,QAAoE;AActE,SAASC,iCACdC,OAAA,EACc;EAGd,OAAO;IACLC,IAAA,EAAM;IAAA;IAAA;IAAA;IAIN,MAAMC,gBAAgBC,MAAA,EAAQ;MAC5B;UAAMC,IAAE,EAAAC;QAAM,IAAYF,MAAI,CAAAG,MAAO;QAAAC,+BAE/B,UACJV,aAAM,CAAAQ,WAAA,qFAAAG,OAAA,CAAAD,+BAAA;MAAAJ,MACJ,CAAAM,WAAA,CAAAC,GAAA,iBAAAC,GAAA,EAAAC,GAAA,EAAAC,IAAA;QACA,KAAAF,GAAA,CAAAG,OAAA,mBAEF,OAAQD,IAAA;QAEV,IAAAE,QAAO,GAAAJ,GAAY,CAAAK,MAAI,YAAYpB,SAAK,IAASe,GAAA,CAAAK,MAAA,CAAAC,SAAA;UAAAC,yBAAA,OAAAX,+BAAA,CAAAF,WAAA;YAC/Cc,YAAS,WAAAA,CAAQC,KAAA,EAAe;cAE9B;kBAAOC,MAAK;kBAAAC;gBAAA,IAAAF,KAAA;gBAAAG,IAAA,GAAAZ,GAAA,CAAAG,OAAA,wBAAAH,GAAA,CAAAG,OAAA,CAAAS,IAAA,IAAAD,QAAA;cAGd,OAAMD,MAAW,MAAIN,QAAA,IAAAM,MAAkB,MAAAE,IAAA,EAAa,GAAIA,IAAA;YAGtD;UAEE;QAEAvB,OAAA,CAAAwB,cAOO,IAAG1B,4DAHD,CAAAoB,yBAAA,EAAAlB,OAAA,CAAAwB,cAAA,GAAAN,yBAAA,CAAAO,kBAAA,CAAAd,GAAA,EAAAC,GAAA,EAAAC,IAAA;MAAA;IAIX;EAGF;AACE;AACE,SACQd,gCAKZ","ignoreList":[]}
@@ -0,0 +1,168 @@
1
+ import { existsSync } from "node:fs";
2
+ import { readFile } from "node:fs/promises";
3
+ import { parse } from "node:url";
4
+ import launchEditor from "launch-editor";
5
+ import { projectImport, projectResolve } from "../utils/projectImport";
6
+ import { getTerminalReporter } from "../utils/getTerminalReporter";
7
+ import { patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName } from "../utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName";
8
+ function metroPlugin({
9
+ argv,
10
+ defaultConfigOverrides,
11
+ babelConfig,
12
+ mainModuleName
13
+ } = {}) {
14
+ return {
15
+ name: "metro",
16
+ // configResolved(config) {
17
+ // projectRoot = config.root
18
+ // },
19
+ async configureServer(server) {
20
+ const { logger, root: projectRoot } = server.config, { default: Metro, loadConfig } = await projectImport(projectRoot, "metro"), { default: MetroHmrServer } = await projectImport(projectRoot, "metro/src/HmrServer"), { default: createWebsocketServer } = await projectImport(projectRoot, "metro/src/lib/createWebsocketServer"), { getDefaultConfig } = await projectImport(projectRoot, "@expo/metro-config"), { createDevMiddleware } = await projectImport(projectRoot, "@react-native/dev-middleware"), _defaultConfig = getDefaultConfig(projectRoot);
21
+ if (mainModuleName) {
22
+ const origRewriteRequestUrl = _defaultConfig.server.rewriteRequestUrl, resolveMainModuleName = await (async () => {
23
+ const ExpoGoManifestHandlerMiddleware = (await projectImport(
24
+ projectRoot,
25
+ "@expo/cli/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js"
26
+ )).default.ExpoGoManifestHandlerMiddleware, manifestHandlerMiddleware = new ExpoGoManifestHandlerMiddleware(projectRoot, {});
27
+ return patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName(
28
+ manifestHandlerMiddleware,
29
+ mainModuleName
30
+ ), (p) => manifestHandlerMiddleware.resolveMainModuleName({
31
+ pkg: { main: mainModuleName },
32
+ platform: p.platform
33
+ });
34
+ })();
35
+ _defaultConfig.server.rewriteRequestUrl = (url) => {
36
+ if (url.includes("/.expo/.virtual-metro-entry.bundle?")) {
37
+ const resolvedMainModulePath = resolveMainModuleName({
38
+ platform: "ios"
39
+ // we probably need to handle android here, but currently in our use case this won't affect the result
40
+ });
41
+ return url.replace(".expo/.virtual-metro-entry", resolvedMainModulePath);
42
+ }
43
+ return origRewriteRequestUrl(url);
44
+ };
45
+ }
46
+ const defaultConfig = {
47
+ ..._defaultConfig,
48
+ resolver: {
49
+ ..._defaultConfig?.resolver,
50
+ sourceExts: ["js", "jsx", "json", "ts", "tsx", "mjs", "cjs"],
51
+ // `one` related packages are using `.mjs` extensions. This somehow fixes `.native` files not being resolved correctly when `.mjs` files are present.
52
+ resolveRequest: (context, moduleName, platform) => {
53
+ const origResolveRequestFn = _defaultConfig?.resolver?.resolveRequest || context.resolveRequest;
54
+ if (moduleName.startsWith("@babel/runtime")) {
55
+ const contextOverride = {
56
+ ...context,
57
+ unstable_conditionNames: context.unstable_conditionNames.filter(
58
+ (c) => c !== "import"
59
+ )
60
+ };
61
+ return origResolveRequestFn(contextOverride, moduleName, platform);
62
+ }
63
+ return origResolveRequestFn(context, moduleName, platform);
64
+ }
65
+ },
66
+ transformer: {
67
+ ..._defaultConfig?.transformer,
68
+ babelTransformerPath: projectResolve(
69
+ projectRoot,
70
+ "@vxrn/vite-plugin-metro/babel-transformer"
71
+ ),
72
+ // TODO: This is what Expo is doing, but do we really need this?
73
+ publicPath: "/assets/?unstable_path=."
74
+ },
75
+ reporter: await getTerminalReporter(projectRoot)
76
+ }, config = await loadConfig(
77
+ {
78
+ cwd: projectRoot,
79
+ projectRoot,
80
+ "reset-cache": !!process.env.METRO_RESET_CACHE,
81
+ ...argv
82
+ },
83
+ {
84
+ ...defaultConfig,
85
+ ...typeof defaultConfigOverrides == "function" ? defaultConfigOverrides(defaultConfig) : defaultConfigOverrides
86
+ }
87
+ ), { middleware, end, metroServer } = await Metro.createConnectMiddleware(config, {
88
+ // Force enable file watching, even on CI.
89
+ // This is needed for HMR tests to work on CI.
90
+ watch: !0
91
+ }), originalTransformFile = metroServer.getBundler().getBundler().transformFile.bind(metroServer.getBundler().getBundler());
92
+ metroServer.getBundler().getBundler().transformFile = async (filePath, transformOptions, fileBuffer) => originalTransformFile(
93
+ filePath,
94
+ {
95
+ ...transformOptions,
96
+ customTransformOptions: {
97
+ ...transformOptions.customTransformOptions,
98
+ vite: {
99
+ babelConfig
100
+ }
101
+ }
102
+ },
103
+ fileBuffer
104
+ );
105
+ const hmrServer = new MetroHmrServer(
106
+ metroServer.getBundler(),
107
+ metroServer.getCreateModuleId(),
108
+ config
109
+ ), reactNativeDevToolsUrl = `http://${typeof server.config.server.host == "boolean" ? "localhost" : server.config.server.host}:${server.config.server.port}`, { middleware: rnDevtoolsMiddleware, websocketEndpoints: rnDevtoolsWebsocketEndpoints } = createDevMiddleware({
110
+ projectRoot,
111
+ serverBaseUrl: reactNativeDevToolsUrl,
112
+ logger: console
113
+ });
114
+ server.middlewares.use(async (req, res, next) => {
115
+ try {
116
+ if (req.url?.includes(".bundle")) {
117
+ const VITE_METRO_DEBUG_BUNDLE = process.env.VITE_METRO_DEBUG_BUNDLE;
118
+ if (VITE_METRO_DEBUG_BUNDLE && existsSync(VITE_METRO_DEBUG_BUNDLE)) {
119
+ console.info(" !!! - serving debug bundle from", VITE_METRO_DEBUG_BUNDLE);
120
+ const content = await readFile(VITE_METRO_DEBUG_BUNDLE, "utf-8");
121
+ res.setHeader("Content-Type", "application/javascript"), res.end(content);
122
+ return;
123
+ }
124
+ }
125
+ if (req.url === "/status" && req.headers["user-agent"]?.includes(
126
+ "CFNetwork/"
127
+ )) {
128
+ res.statusCode = 200, res.end("packager-status:running");
129
+ return;
130
+ }
131
+ if (req.url === "/open-stack-frame" && req.method === "POST") {
132
+ let body = "";
133
+ req.on("data", (chunk) => {
134
+ body += chunk.toString();
135
+ }), req.on("end", () => {
136
+ try {
137
+ const frame = JSON.parse(body);
138
+ launchEditor(frame.file), res.statusCode = 200, res.end("Stack frame opened in editor");
139
+ } catch (e) {
140
+ return console.error("Failed to parse stack frame:", e), res.statusCode = 400, res.end("Invalid stack frame JSON");
141
+ }
142
+ });
143
+ return;
144
+ }
145
+ await middleware(req, res, next);
146
+ } catch (error) {
147
+ console.error("Metro middleware error:", error), next();
148
+ }
149
+ }), server.middlewares.use(rnDevtoolsMiddleware);
150
+ const websocketEndpoints = {
151
+ "/hot": createWebsocketServer({
152
+ websocketServer: hmrServer
153
+ }),
154
+ ...rnDevtoolsWebsocketEndpoints
155
+ };
156
+ server.httpServer?.on("upgrade", (request, socket, head) => {
157
+ const { pathname } = parse(request.url);
158
+ pathname != null && websocketEndpoints[pathname] && websocketEndpoints[pathname].handleUpgrade(request, socket, head, (ws) => {
159
+ websocketEndpoints[pathname].emit("connection", ws, request);
160
+ });
161
+ });
162
+ }
163
+ };
164
+ }
165
+ export {
166
+ metroPlugin
167
+ };
168
+ //# sourceMappingURL=metroPlugin.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/plugins/metroPlugin.ts"],
4
+ "mappings": "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",
5
+ "names": []
6
+ }
@@ -0,0 +1,180 @@
1
+ import { existsSync } from "node:fs";
2
+ import { readFile } from "node:fs/promises";
3
+ import { parse } from "node:url";
4
+ import launchEditor from "launch-editor";
5
+ import { projectImport, projectResolve } from "../utils/projectImport.mjs";
6
+ import { getTerminalReporter } from "../utils/getTerminalReporter.mjs";
7
+ import { patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName } from "../utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.mjs";
8
+ function metroPlugin({
9
+ argv,
10
+ defaultConfigOverrides,
11
+ babelConfig,
12
+ mainModuleName
13
+ } = {}) {
14
+ return {
15
+ name: "metro",
16
+ // configResolved(config) {
17
+ // projectRoot = config.root
18
+ // },
19
+ async configureServer(server) {
20
+ const {
21
+ logger,
22
+ root: projectRoot
23
+ } = server.config,
24
+ {
25
+ default: Metro,
26
+ loadConfig
27
+ } = await projectImport(projectRoot, "metro"),
28
+ {
29
+ default: MetroHmrServer
30
+ } = await projectImport(projectRoot, "metro/src/HmrServer"),
31
+ {
32
+ default: createWebsocketServer
33
+ } = await projectImport(projectRoot, "metro/src/lib/createWebsocketServer"),
34
+ {
35
+ getDefaultConfig
36
+ } = await projectImport(projectRoot, "@expo/metro-config"),
37
+ {
38
+ createDevMiddleware
39
+ } = await projectImport(projectRoot, "@react-native/dev-middleware"),
40
+ _defaultConfig = getDefaultConfig(projectRoot);
41
+ if (mainModuleName) {
42
+ const origRewriteRequestUrl = _defaultConfig.server.rewriteRequestUrl,
43
+ resolveMainModuleName = await (async () => {
44
+ const ExpoGoManifestHandlerMiddleware = (await projectImport(projectRoot, "@expo/cli/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js")).default.ExpoGoManifestHandlerMiddleware,
45
+ manifestHandlerMiddleware = new ExpoGoManifestHandlerMiddleware(projectRoot, {});
46
+ return patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName(manifestHandlerMiddleware, mainModuleName), p => manifestHandlerMiddleware.resolveMainModuleName({
47
+ pkg: {
48
+ main: mainModuleName
49
+ },
50
+ platform: p.platform
51
+ });
52
+ })();
53
+ _defaultConfig.server.rewriteRequestUrl = url => {
54
+ if (url.includes("/.expo/.virtual-metro-entry.bundle?")) {
55
+ const resolvedMainModulePath = resolveMainModuleName({
56
+ platform: "ios"
57
+ // we probably need to handle android here, but currently in our use case this won't affect the result
58
+ });
59
+ return url.replace(".expo/.virtual-metro-entry", resolvedMainModulePath);
60
+ }
61
+ return origRewriteRequestUrl(url);
62
+ };
63
+ }
64
+ const defaultConfig = {
65
+ ..._defaultConfig,
66
+ resolver: {
67
+ ..._defaultConfig?.resolver,
68
+ sourceExts: ["js", "jsx", "json", "ts", "tsx", "mjs", "cjs"],
69
+ // `one` related packages are using `.mjs` extensions. This somehow fixes `.native` files not being resolved correctly when `.mjs` files are present.
70
+ resolveRequest: (context, moduleName, platform) => {
71
+ const origResolveRequestFn = _defaultConfig?.resolver?.resolveRequest || context.resolveRequest;
72
+ if (moduleName.startsWith("@babel/runtime")) {
73
+ const contextOverride = {
74
+ ...context,
75
+ unstable_conditionNames: context.unstable_conditionNames.filter(c => c !== "import")
76
+ };
77
+ return origResolveRequestFn(contextOverride, moduleName, platform);
78
+ }
79
+ return origResolveRequestFn(context, moduleName, platform);
80
+ }
81
+ },
82
+ transformer: {
83
+ ..._defaultConfig?.transformer,
84
+ babelTransformerPath: projectResolve(projectRoot, "@vxrn/vite-plugin-metro/babel-transformer"),
85
+ // TODO: This is what Expo is doing, but do we really need this?
86
+ publicPath: "/assets/?unstable_path=."
87
+ },
88
+ reporter: await getTerminalReporter(projectRoot)
89
+ },
90
+ config = await loadConfig({
91
+ cwd: projectRoot,
92
+ projectRoot,
93
+ "reset-cache": !!process.env.METRO_RESET_CACHE,
94
+ ...argv
95
+ }, {
96
+ ...defaultConfig,
97
+ ...(typeof defaultConfigOverrides == "function" ? defaultConfigOverrides(defaultConfig) : defaultConfigOverrides)
98
+ }),
99
+ {
100
+ middleware,
101
+ end,
102
+ metroServer
103
+ } = await Metro.createConnectMiddleware(config, {
104
+ // Force enable file watching, even on CI.
105
+ // This is needed for HMR tests to work on CI.
106
+ watch: !0
107
+ }),
108
+ originalTransformFile = metroServer.getBundler().getBundler().transformFile.bind(metroServer.getBundler().getBundler());
109
+ metroServer.getBundler().getBundler().transformFile = async (filePath, transformOptions, fileBuffer) => originalTransformFile(filePath, {
110
+ ...transformOptions,
111
+ customTransformOptions: {
112
+ ...transformOptions.customTransformOptions,
113
+ vite: {
114
+ babelConfig
115
+ }
116
+ }
117
+ }, fileBuffer);
118
+ const hmrServer = new MetroHmrServer(metroServer.getBundler(), metroServer.getCreateModuleId(), config),
119
+ reactNativeDevToolsUrl = `http://${typeof server.config.server.host == "boolean" ? "localhost" : server.config.server.host}:${server.config.server.port}`,
120
+ {
121
+ middleware: rnDevtoolsMiddleware,
122
+ websocketEndpoints: rnDevtoolsWebsocketEndpoints
123
+ } = createDevMiddleware({
124
+ projectRoot,
125
+ serverBaseUrl: reactNativeDevToolsUrl,
126
+ logger: console
127
+ });
128
+ server.middlewares.use(async (req, res, next) => {
129
+ try {
130
+ if (req.url?.includes(".bundle")) {
131
+ const VITE_METRO_DEBUG_BUNDLE = process.env.VITE_METRO_DEBUG_BUNDLE;
132
+ if (VITE_METRO_DEBUG_BUNDLE && existsSync(VITE_METRO_DEBUG_BUNDLE)) {
133
+ console.info(" !!! - serving debug bundle from", VITE_METRO_DEBUG_BUNDLE);
134
+ const content = await readFile(VITE_METRO_DEBUG_BUNDLE, "utf-8");
135
+ res.setHeader("Content-Type", "application/javascript"), res.end(content);
136
+ return;
137
+ }
138
+ }
139
+ if (req.url === "/status" && req.headers["user-agent"]?.includes("CFNetwork/")) {
140
+ res.statusCode = 200, res.end("packager-status:running");
141
+ return;
142
+ }
143
+ if (req.url === "/open-stack-frame" && req.method === "POST") {
144
+ let body = "";
145
+ req.on("data", chunk => {
146
+ body += chunk.toString();
147
+ }), req.on("end", () => {
148
+ try {
149
+ const frame = JSON.parse(body);
150
+ launchEditor(frame.file), res.statusCode = 200, res.end("Stack frame opened in editor");
151
+ } catch (e) {
152
+ return console.error("Failed to parse stack frame:", e), res.statusCode = 400, res.end("Invalid stack frame JSON");
153
+ }
154
+ });
155
+ return;
156
+ }
157
+ await middleware(req, res, next);
158
+ } catch (error) {
159
+ console.error("Metro middleware error:", error), next();
160
+ }
161
+ }), server.middlewares.use(rnDevtoolsMiddleware);
162
+ const websocketEndpoints = {
163
+ "/hot": createWebsocketServer({
164
+ websocketServer: hmrServer
165
+ }),
166
+ ...rnDevtoolsWebsocketEndpoints
167
+ };
168
+ server.httpServer?.on("upgrade", (request, socket, head) => {
169
+ const {
170
+ pathname
171
+ } = parse(request.url);
172
+ pathname != null && websocketEndpoints[pathname] && websocketEndpoints[pathname].handleUpgrade(request, socket, head, ws => {
173
+ websocketEndpoints[pathname].emit("connection", ws, request);
174
+ });
175
+ });
176
+ }
177
+ };
178
+ }
179
+ export { metroPlugin };
180
+ //# sourceMappingURL=metroPlugin.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["existsSync","readFile","parse","launchEditor","projectImport","projectResolve","getTerminalReporter","patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName","metroPlugin","argv","defaultConfigOverrides","babelConfig","mainModuleName","name","configureServer","server","logger","root","projectRoot","config","default","Metro","loadConfig","MetroHmrServer","createWebsocketServer","getDefaultConfig","createDevMiddleware","_defaultConfig","origRewriteRequestUrl","rewriteRequestUrl","resolveMainModuleName","ExpoGoManifestHandlerMiddleware","manifestHandlerMiddleware","p","pkg","main","platform","url","includes","resolvedMainModulePath","replace","defaultConfig","resolver","sourceExts","resolveRequest","context","moduleName","origResolveRequestFn","startsWith","contextOverride","unstable_conditionNames","filter","c","transformer","babelTransformerPath","publicPath","reporter","cwd","process","env","METRO_RESET_CACHE","middleware","end","metroServer","createConnectMiddleware","watch","originalTransformFile","getBundler","transformFile","bind","filePath","transformOptions","fileBuffer","customTransformOptions","vite","hmrServer","getCreateModuleId","reactNativeDevToolsUrl","host","port","rnDevtoolsMiddleware","websocketEndpoints","rnDevtoolsWebsocketEndpoints","serverBaseUrl","console","middlewares","use","req","res","next","VITE_METRO_DEBUG_BUNDLE","info","content","setHeader","headers","statusCode","method","body","on","chunk","toString","frame","JSON","file","e","error","websocketServer","httpServer","request","socket","head","pathname","handleUpgrade","ws","emit"],"sources":["../../../src/plugins/metroPlugin.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,189 @@
1
+ import { existsSync } from "node:fs";
2
+ import { readFile } from "node:fs/promises";
3
+ import { parse } from "node:url";
4
+ import launchEditor from "launch-editor";
5
+ import { projectImport, projectResolve } from "../utils/projectImport.native.js";
6
+ import { getTerminalReporter } from "../utils/getTerminalReporter.native.js";
7
+ import { patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName } from "../utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.native.js";
8
+ function metroPlugin() {
9
+ var {
10
+ argv,
11
+ defaultConfigOverrides,
12
+ babelConfig,
13
+ mainModuleName
14
+ } = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
15
+ return {
16
+ name: "metro",
17
+ // configResolved(config) {
18
+ // projectRoot = config.root
19
+ // },
20
+ async configureServer(server) {
21
+ var _server_httpServer,
22
+ {
23
+ logger,
24
+ root: projectRoot
25
+ } = server.config,
26
+ {
27
+ default: Metro,
28
+ loadConfig
29
+ } = await projectImport(projectRoot, "metro"),
30
+ {
31
+ default: MetroHmrServer
32
+ } = await projectImport(projectRoot, "metro/src/HmrServer"),
33
+ {
34
+ default: createWebsocketServer
35
+ } = await projectImport(projectRoot, "metro/src/lib/createWebsocketServer"),
36
+ {
37
+ getDefaultConfig
38
+ } = await projectImport(projectRoot, "@expo/metro-config"),
39
+ {
40
+ createDevMiddleware
41
+ } = await projectImport(projectRoot, "@react-native/dev-middleware"),
42
+ _defaultConfig = getDefaultConfig(projectRoot);
43
+ if (mainModuleName) {
44
+ var origRewriteRequestUrl = _defaultConfig.server.rewriteRequestUrl,
45
+ resolveMainModuleName = await async function () {
46
+ var ExpoGoManifestHandlerMiddleware = (await projectImport(projectRoot, "@expo/cli/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js")).default.ExpoGoManifestHandlerMiddleware,
47
+ manifestHandlerMiddleware = new ExpoGoManifestHandlerMiddleware(projectRoot, {});
48
+ return patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName(manifestHandlerMiddleware, mainModuleName), function (p) {
49
+ return manifestHandlerMiddleware.resolveMainModuleName({
50
+ pkg: {
51
+ main: mainModuleName
52
+ },
53
+ platform: p.platform
54
+ });
55
+ };
56
+ }();
57
+ _defaultConfig.server.rewriteRequestUrl = function (url) {
58
+ if (url.includes("/.expo/.virtual-metro-entry.bundle?")) {
59
+ var resolvedMainModulePath = resolveMainModuleName({
60
+ platform: "ios"
61
+ });
62
+ return url.replace(".expo/.virtual-metro-entry", resolvedMainModulePath);
63
+ }
64
+ return origRewriteRequestUrl(url);
65
+ };
66
+ }
67
+ var defaultConfig = {
68
+ ..._defaultConfig,
69
+ resolver: {
70
+ ..._defaultConfig?.resolver,
71
+ sourceExts: ["js", "jsx", "json", "ts", "tsx", "mjs", "cjs"],
72
+ // `one` related packages are using `.mjs` extensions. This somehow fixes `.native` files not being resolved correctly when `.mjs` files are present.
73
+ resolveRequest: function (context, moduleName, platform) {
74
+ var _defaultConfig_resolver,
75
+ origResolveRequestFn = (_defaultConfig == null || (_defaultConfig_resolver = _defaultConfig.resolver) === null || _defaultConfig_resolver === void 0 ? void 0 : _defaultConfig_resolver.resolveRequest) || context.resolveRequest;
76
+ if (moduleName.startsWith("@babel/runtime")) {
77
+ var contextOverride = {
78
+ ...context,
79
+ unstable_conditionNames: context.unstable_conditionNames.filter(function (c) {
80
+ return c !== "import";
81
+ })
82
+ };
83
+ return origResolveRequestFn(contextOverride, moduleName, platform);
84
+ }
85
+ return origResolveRequestFn(context, moduleName, platform);
86
+ }
87
+ },
88
+ transformer: {
89
+ ..._defaultConfig?.transformer,
90
+ babelTransformerPath: projectResolve(projectRoot, "@vxrn/vite-plugin-metro/babel-transformer"),
91
+ // TODO: This is what Expo is doing, but do we really need this?
92
+ publicPath: "/assets/?unstable_path=."
93
+ },
94
+ reporter: await getTerminalReporter(projectRoot)
95
+ },
96
+ config = await loadConfig({
97
+ cwd: projectRoot,
98
+ projectRoot,
99
+ "reset-cache": !!process.env.METRO_RESET_CACHE,
100
+ ...argv
101
+ }, {
102
+ ...defaultConfig,
103
+ ...(typeof defaultConfigOverrides == "function" ? defaultConfigOverrides(defaultConfig) : defaultConfigOverrides)
104
+ }),
105
+ {
106
+ middleware,
107
+ end,
108
+ metroServer
109
+ } = await Metro.createConnectMiddleware(config, {
110
+ // Force enable file watching, even on CI.
111
+ // This is needed for HMR tests to work on CI.
112
+ watch: !0
113
+ }),
114
+ originalTransformFile = metroServer.getBundler().getBundler().transformFile.bind(metroServer.getBundler().getBundler());
115
+ metroServer.getBundler().getBundler().transformFile = async function (filePath, transformOptions, fileBuffer) {
116
+ return originalTransformFile(filePath, {
117
+ ...transformOptions,
118
+ customTransformOptions: {
119
+ ...transformOptions.customTransformOptions,
120
+ vite: {
121
+ babelConfig
122
+ }
123
+ }
124
+ }, fileBuffer);
125
+ };
126
+ var hmrServer = new MetroHmrServer(metroServer.getBundler(), metroServer.getCreateModuleId(), config),
127
+ reactNativeDevToolsUrl = `http://${typeof server.config.server.host == "boolean" ? "localhost" : server.config.server.host}:${server.config.server.port}`,
128
+ {
129
+ middleware: rnDevtoolsMiddleware,
130
+ websocketEndpoints: rnDevtoolsWebsocketEndpoints
131
+ } = createDevMiddleware({
132
+ projectRoot,
133
+ serverBaseUrl: reactNativeDevToolsUrl,
134
+ logger: console
135
+ });
136
+ server.middlewares.use(async function (req, res, next) {
137
+ try {
138
+ var _req_url, _req_headers_useragent;
139
+ if (!((_req_url = req.url) === null || _req_url === void 0) && _req_url.includes(".bundle")) {
140
+ var VITE_METRO_DEBUG_BUNDLE = process.env.VITE_METRO_DEBUG_BUNDLE;
141
+ if (VITE_METRO_DEBUG_BUNDLE && existsSync(VITE_METRO_DEBUG_BUNDLE)) {
142
+ console.info(" !!! - serving debug bundle from", VITE_METRO_DEBUG_BUNDLE);
143
+ var content = await readFile(VITE_METRO_DEBUG_BUNDLE, "utf-8");
144
+ res.setHeader("Content-Type", "application/javascript"), res.end(content);
145
+ return;
146
+ }
147
+ }
148
+ if (req.url === "/status" && !((_req_headers_useragent = req.headers["user-agent"]) === null || _req_headers_useragent === void 0) && _req_headers_useragent.includes("CFNetwork/")) {
149
+ res.statusCode = 200, res.end("packager-status:running");
150
+ return;
151
+ }
152
+ if (req.url === "/open-stack-frame" && req.method === "POST") {
153
+ var body = "";
154
+ req.on("data", function (chunk) {
155
+ body += chunk.toString();
156
+ }), req.on("end", function () {
157
+ try {
158
+ var frame = JSON.parse(body);
159
+ launchEditor(frame.file), res.statusCode = 200, res.end("Stack frame opened in editor");
160
+ } catch (e) {
161
+ return console.error("Failed to parse stack frame:", e), res.statusCode = 400, res.end("Invalid stack frame JSON");
162
+ }
163
+ });
164
+ return;
165
+ }
166
+ await middleware(req, res, next);
167
+ } catch (error) {
168
+ console.error("Metro middleware error:", error), next();
169
+ }
170
+ }), server.middlewares.use(rnDevtoolsMiddleware);
171
+ var websocketEndpoints = {
172
+ "/hot": createWebsocketServer({
173
+ websocketServer: hmrServer
174
+ }),
175
+ ...rnDevtoolsWebsocketEndpoints
176
+ };
177
+ (_server_httpServer = server.httpServer) === null || _server_httpServer === void 0 || _server_httpServer.on("upgrade", function (request, socket, head) {
178
+ var {
179
+ pathname
180
+ } = parse(request.url);
181
+ pathname != null && websocketEndpoints[pathname] && websocketEndpoints[pathname].handleUpgrade(request, socket, head, function (ws) {
182
+ websocketEndpoints[pathname].emit("connection", ws, request);
183
+ });
184
+ });
185
+ }
186
+ };
187
+ }
188
+ export { metroPlugin };
189
+ //# sourceMappingURL=metroPlugin.native.js.map