vxrn 1.21.6 → 1.21.7

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 (47) hide show
  1. package/dist/config/getOptionsFilled.mjs +3 -5
  2. package/dist/config/getOptionsFilled.mjs.map +1 -1
  3. package/dist/config/getOptionsFilled.native.js +3 -5
  4. package/dist/config/getOptionsFilled.native.js.map +1 -1
  5. package/dist/exports/clean.mjs +84 -16
  6. package/dist/exports/clean.mjs.map +1 -1
  7. package/dist/exports/clean.native.js +89 -16
  8. package/dist/exports/clean.native.js.map +1 -1
  9. package/dist/exports/clean.test.mjs +81 -0
  10. package/dist/exports/clean.test.mjs.map +1 -0
  11. package/dist/exports/clean.test.native.js +88 -0
  12. package/dist/exports/clean.test.native.js.map +1 -0
  13. package/dist/exports/dev.mjs +8 -3
  14. package/dist/exports/dev.mjs.map +1 -1
  15. package/dist/exports/dev.native.js +8 -3
  16. package/dist/exports/dev.native.js.map +1 -1
  17. package/dist/serve/node.mjs +20 -24
  18. package/dist/serve/node.mjs.map +1 -1
  19. package/dist/serve/node.native.js +20 -22
  20. package/dist/serve/node.native.js.map +1 -1
  21. package/dist/serve/node.test.mjs +60 -0
  22. package/dist/serve/node.test.mjs.map +1 -0
  23. package/dist/serve/node.test.native.js +72 -0
  24. package/dist/serve/node.test.native.js.map +1 -0
  25. package/dist/utils/state.mjs +11 -1
  26. package/dist/utils/state.mjs.map +1 -1
  27. package/dist/utils/state.native.js +11 -1
  28. package/dist/utils/state.native.js.map +1 -1
  29. package/package.json +11 -11
  30. package/src/config/getOptionsFilled.ts +2 -4
  31. package/src/exports/clean.test.ts +82 -0
  32. package/src/exports/clean.ts +90 -26
  33. package/src/exports/dev.ts +8 -3
  34. package/src/serve/node.test.ts +63 -0
  35. package/src/serve/node.ts +22 -26
  36. package/src/utils/state.ts +9 -1
  37. package/types/config/getOptionsFilled.d.ts +2 -0
  38. package/types/config/getOptionsFilled.d.ts.map +1 -1
  39. package/types/exports/build.d.ts +1 -0
  40. package/types/exports/build.d.ts.map +1 -1
  41. package/types/exports/clean.d.ts +6 -9
  42. package/types/exports/clean.d.ts.map +1 -1
  43. package/types/exports/clean.test.d.ts.map +1 -0
  44. package/types/exports/dev.d.ts.map +1 -1
  45. package/types/serve/node.d.ts.map +1 -1
  46. package/types/serve/node.test.d.ts.map +1 -0
  47. package/types/utils/state.d.ts.map +1 -1
@@ -41,7 +41,7 @@ var dev = async function (optionsIn) {
41
41
  printServerUrls
42
42
  } = await import("../utils/printServerUrls.native.js");
43
43
  var {
44
- clean
44
+ prepareCacheForVersion
45
45
  } = await import("./clean.native.js");
46
46
  var {
47
47
  filterViteServerResolvedUrls
@@ -109,8 +109,13 @@ export default defineConfig({
109
109
  cacheDir
110
110
  } = options;
111
111
  bindKeypressInput();
112
- if (options.clean) {
113
- await clean(optionsIn, options.clean);
112
+ var cacheWasCleaned = await prepareCacheForVersion({
113
+ root: options.root,
114
+ cacheDir,
115
+ versionHash: options.versionHash,
116
+ forceClean: optionsIn.clean === true
117
+ });
118
+ if (options.clean || cacheWasCleaned) {
114
119
  process.env.METRO_RESET_CACHE = "1";
115
120
  }
116
121
  await ensureDir(cacheDir);
@@ -1 +1 @@
1
- {"version":3,"names":["FSExtra","colors","debounce","normalizePath","ensureDir","setupOrphanDetection","process","platform","initialPpid","ppid","interval","setInterval","exit","unref","dev","optionsIn","_ref","_config_plugins_find____get","_config_plugins_find_","_config_plugins_find","_config_plugins","devStartTime","Date","now","env","IS_VXRN_CLI","debug","_process_env","DEBUG","startUserInterface","bindKeypressInput","fillOptions","getViteServerConfig","printServerUrls","clean","filterViteServerResolvedUrls","removeUndefined","createServer","loadConfigFromFile","config","mode","command","console","error","extraConfig","resolve","extraConfigPath","extraResult","mergeConfig","info","cyan","warn","yellow","oneServerConfig","plugins","find","x","_x_","Array","isArray","server","options","cacheDir","METRO_RESET_CACHE","serverConfig","viteServer","isClosing","start","_viteServer_httpServer","connectedNativeClients","pendingTransforms","Map","watcher","addListener","path","normalizedPath","includes","normalizedCwd","cwd","id","replace","endsWith","has","set","transformRequest","err","get","httpServer","on","listen","totalStartupTime","bold","viteServerResolvedUrls","resolvedUrls","logger","closePromise","Promise","res","_viteServer_httpServer2","stop","removeAllListeners"],"sources":["../../src/exports/dev.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["FSExtra","colors","debounce","normalizePath","ensureDir","setupOrphanDetection","process","platform","initialPpid","ppid","interval","setInterval","exit","unref","dev","optionsIn","_ref","_config_plugins_find____get","_config_plugins_find_","_config_plugins_find","_config_plugins","devStartTime","Date","now","env","IS_VXRN_CLI","debug","_process_env","DEBUG","startUserInterface","bindKeypressInput","fillOptions","getViteServerConfig","printServerUrls","prepareCacheForVersion","filterViteServerResolvedUrls","removeUndefined","createServer","loadConfigFromFile","config","mode","command","console","error","extraConfig","resolve","extraConfigPath","extraResult","mergeConfig","info","cyan","warn","yellow","oneServerConfig","plugins","find","x","_x_","Array","isArray","server","options","cacheDir","cacheWasCleaned","root","versionHash","forceClean","clean","METRO_RESET_CACHE","serverConfig","viteServer","isClosing","start","_viteServer_httpServer","connectedNativeClients","pendingTransforms","Map","watcher","addListener","path","normalizedPath","includes","normalizedCwd","cwd","id","replace","endsWith","has","set","transformRequest","err","get","httpServer","on","listen","totalStartupTime","bold","viteServerResolvedUrls","resolvedUrls","logger","closePromise","Promise","res","_viteServer_httpServer2","stop","removeAllListeners"],"sources":["../../src/exports/dev.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -1,7 +1,6 @@
1
1
  import { createServer } from "node:http";
2
2
  import { networkInterfaces, platform } from "node:os";
3
3
  import { getRequestListener } from "@hono/node-server";
4
- import { serve as honoServe } from "@hono/node-server";
5
4
  import colors from "picocolors";
6
5
  function getNetworkAddress() {
7
6
  for (const addresses of Object.values(networkInterfaces())) {
@@ -20,22 +19,20 @@ const canReusePort = !["win32", "darwin"].includes(platform()) && (isBun || (()
20
19
  async function honoServeNode(app, options) {
21
20
  const port = options.port ?? 3e3;
22
21
  const host = options.host ?? "0.0.0.0";
23
- let server;
24
- if (canReusePort) {
25
- const listener = getRequestListener(app.fetch);
26
- server = createServer(listener);
27
- server.listen({
28
- port,
29
- host,
22
+ const listener = getRequestListener((request, env) => {
23
+ request.headers.delete("x-vxrn-peer-address");
24
+ const address = env.incoming.socket.remoteAddress;
25
+ if (address) request.headers.set("x-vxrn-peer-address", address);
26
+ return app.fetch(request, env);
27
+ });
28
+ const server = createServer(listener);
29
+ server.listen({
30
+ port,
31
+ host,
32
+ ...(canReusePort && process.env.ONE_CLUSTER_WORKER === "1" ? {
30
33
  reusePort: true
31
- });
32
- } else {
33
- server = honoServe({
34
- fetch: app.fetch,
35
- port,
36
- hostname: host
37
- });
38
- }
34
+ } : {})
35
+ });
39
36
  const colorUrl = url => colors.cyan(url.replace(/:(\d+)\//, (_, port2) => `:${colors.bold(port2)}/`));
40
37
  const displayHost = host === "0.0.0.0" ? "localhost" : host;
41
38
  const localUrl = `http://${displayHost}:${port}/`;
@@ -49,15 +46,14 @@ async function honoServeNode(app, options) {
49
46
  }
50
47
  }
51
48
  console.info();
52
- const shutdown = () => {
53
- server.close(() => {
54
- process.exit(0);
55
- });
56
- };
57
- process.on("SIGINT", shutdown);
58
- process.on("SIGTERM", shutdown);
59
- await new Promise(res => {
49
+ const shutdown = () => server.close();
50
+ process.once("SIGINT", shutdown);
51
+ process.once("SIGTERM", shutdown);
52
+ await new Promise((res, rej) => {
53
+ server.once("error", rej);
60
54
  server.on("close", () => {
55
+ process.off("SIGINT", shutdown);
56
+ process.off("SIGTERM", shutdown);
61
57
  res();
62
58
  });
63
59
  });
@@ -1 +1 @@
1
- {"version":3,"names":["createServer","networkInterfaces","platform","getRequestListener","serve","honoServe","colors","getNetworkAddress","addresses","Object","values","addr","family","internal","address","isBun","process","versions","bun","canReusePort","includes","major","minor","node","split","map","Number","honoServeNode","app","options","port","host","server","listener","fetch","listen","reusePort","hostname","colorUrl","url","cyan","replace","_","port2","bold","displayHost","localUrl","console","info","green","networkHost","networkUrl","shutdown","close","exit","on","Promise","res"],"sources":["../../src/serve/node.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["createServer","networkInterfaces","platform","getRequestListener","colors","getNetworkAddress","addresses","Object","values","addr","family","internal","address","isBun","process","versions","bun","canReusePort","includes","major","minor","node","split","map","Number","honoServeNode","app","options","port","host","listener","request","env","headers","delete","incoming","socket","remoteAddress","set","fetch","server","listen","ONE_CLUSTER_WORKER","reusePort","colorUrl","url","cyan","replace","_","port2","bold","displayHost","localUrl","console","info","green","networkHost","networkUrl","shutdown","close","once","Promise","res","rej","on","off"],"sources":["../../src/serve/node.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -1,7 +1,6 @@
1
1
  import { createServer } from "http";
2
2
  import { networkInterfaces, platform } from "os";
3
3
  import { getRequestListener } from "@hono/node-server";
4
- import { serve as honoServe } from "@hono/node-server";
5
4
  import colors from "picocolors";
6
5
  function getNetworkAddress() {
7
6
  var _iteratorNormalCompletion = true,
@@ -59,22 +58,20 @@ async function honoServeNode(app, options) {
59
58
  var _options_port, _options_host;
60
59
  var port = (_options_port = options.port) !== null && _options_port !== void 0 ? _options_port : 3e3;
61
60
  var host = (_options_host = options.host) !== null && _options_host !== void 0 ? _options_host : "0.0.0.0";
62
- var server;
63
- if (canReusePort) {
64
- var listener = getRequestListener(app.fetch);
65
- server = createServer(listener);
66
- server.listen({
67
- port,
68
- host,
61
+ var listener = getRequestListener(function (request, env) {
62
+ request.headers.delete("x-vxrn-peer-address");
63
+ var address = env.incoming.socket.remoteAddress;
64
+ if (address) request.headers.set("x-vxrn-peer-address", address);
65
+ return app.fetch(request, env);
66
+ });
67
+ var server = createServer(listener);
68
+ server.listen({
69
+ port,
70
+ host,
71
+ ...(canReusePort && process.env.ONE_CLUSTER_WORKER === "1" ? {
69
72
  reusePort: true
70
- });
71
- } else {
72
- server = honoServe({
73
- fetch: app.fetch,
74
- port,
75
- hostname: host
76
- });
77
- }
73
+ } : {})
74
+ });
78
75
  var colorUrl = function (url) {
79
76
  return colors.cyan(url.replace(/:(\d+)\//, function (_, port2) {
80
77
  return `:${colors.bold(port2)}/`;
@@ -93,14 +90,15 @@ async function honoServeNode(app, options) {
93
90
  }
94
91
  console.info();
95
92
  var shutdown = function () {
96
- server.close(function () {
97
- process.exit(0);
98
- });
93
+ return server.close();
99
94
  };
100
- process.on("SIGINT", shutdown);
101
- process.on("SIGTERM", shutdown);
102
- await new Promise(function (res) {
95
+ process.once("SIGINT", shutdown);
96
+ process.once("SIGTERM", shutdown);
97
+ await new Promise(function (res, rej) {
98
+ server.once("error", rej);
103
99
  server.on("close", function () {
100
+ process.off("SIGINT", shutdown);
101
+ process.off("SIGTERM", shutdown);
104
102
  res();
105
103
  });
106
104
  });
@@ -1 +1 @@
1
- {"version":3,"names":["createServer","networkInterfaces","platform","getRequestListener","serve","honoServe","colors","getNetworkAddress","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_iterator","Object","values","Symbol","iterator","_step","next","done","addresses","value","_iteratorNormalCompletion1","_didIteratorError1","_iteratorError1","_iterator1","_step1","addr","family","internal","address","err","return","isBun","process","versions","bun","canReusePort","includes","major","minor","node","split","map","Number","honoServeNode","app","options","_options_port","_options_host","port","host","server"],"sources":["../../src/serve/node.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,YAAA,QAAiC;AAC1C,SAASC,iBAAA,EAAmBC,QAAA,QAAgB;AAC5C,SAASC,kBAAA,QAA0B;AACnC,SAASC,KAAA,IAASC,SAAA,QAAiB;AAGnC,OAAOC,MAAA,MAAY;AAGnB,SAASC,kBAAA,EAAwC;EAC/C,IAAAC,yBAAwB,GAAO;IAAOC,iBAAA,GAAmB,KAAG;IAAAC,cAAA;EAC1D;IACE,SAAIC,SAAK,GAAAC,MAAW,CAAAC,MAAW,CAAAZ,iBAAe,IAAAa,MAAA,CAAAC,QAAA,KAAAC,KAAA,IAAAR,yBAAA,IAAAQ,KAAA,GAAAL,SAAA,CAAAM,IAAA,IAAAC,IAAA,GAAAV,yBAAA;MAC5C,IAAAW,SAAO,GAAKH,KAAA,CAAAI,KAAA;MACd,IAAAC,0BAAA;QAAAC,kBAAA;QAAAC,eAAA;MACF;QACF,SAAAC,UAAA,IAAAL,SAAA,QAAAL,MAAA,CAAAC,QAAA,KAAAU,MAAA,IAAAJ,0BAAA,IAAAI,MAAA,GAAAD,UAAA,CAAAP,IAAA,IAAAC,IAAA,GAAAG,0BAAA;UACF,IAAAK,IAAA,GAAAD,MAAA,CAAAL,KAAA;UAEM,IAAQM,IAAA,CAAAC,MAAO,KAAQ,UAAS,CAAAD,IAAA,CAAQE,QAAA;YAIxC,OAAAF,IACF,CAAAG,OAAA;UAGS;QACP;MACC,SAAAC,GAAA;QAIPR,kBAAsB,GAAc;QAC5BC,eAAe,GAAAO,GAAA;MACrB,UAAa;QAET;UAEA,KAAAT,0BAAc,IAAAG,UAAA,CAAAO,MAAA;YAGVP,UAAW,CAAAO,MAAA;UACjB;QACA,UAAc;UACT,IAAAT,kBAAA;YACL,MAASC,eAAU;UACjB;QACA;MACA;IACF;EACF,SAAAO,GAAA;IAEArB,iBAAkB,OAChB;IAEFC,cAAM,GAAAoB,GAAc;EACpB,UAAM;IAEN;MACA,IAAQ,CAAAtB,yBAAuB,IAAAG,SAAS,CAAAoB,MAAO,IAAK,MAAO;QAEvDpB,SAAS,CAAAoB,MAAA,EAAW;MACtB;IACA,UAAI;MACF,IAAAtB,iBAAmB;QACnB,MAAQC,cAAA;MAAA;IACoE;EAC5E;AACF;AAEF,IAAAsB,KAAA,GAAQ,OAAKC,OAAA,CAAAC,QAAA,CAAAC,GAAA;AAEb,IAAAC,YAAM,GAAW,EACf,SACE,SAAc,CAAAC,QACf,CAAAnC,QAAA,QAAA8B,KAAA;EACH,KAAAM,KAAA,EAAAC,KAAA,IAAAN,OAAA,CAAAC,QAAA,CAAAM,IAAA,CAAAC,KAAA,MAAAC,GAAA,CAAAC,MAAA;EAEA,OAAAL,KAAW,SAAUA,KAAA,KAAQ,MAAAC,KAAA,UAAAD,KAAA;AAC7B;AAEA,eAAUM,aAAeA,CAAQC,GAAA,EAAAC,OAAA;EAC/B,IAAAC,aAAU,EAAAC,aAAe;EACvB,IAAAC,IAAI,IAAAF,aAAA,GAAAD,OAAA,CAAAG,IAAA,cAAAF,aAAA,cAAAA,aAAA;EAAA,IACLG,IAAA,IAAAF,aAAA,GAAAF,OAAA,CAAAI,IAAA,cAAAF,aAAA,cAAAA,aAAA;EACH,IAACG,MAAA;EACH,IAAAf,YAAA","ignoreList":[]}
1
+ {"version":3,"names":["createServer","networkInterfaces","platform","getRequestListener","colors","getNetworkAddress","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_iterator","Object","values","Symbol","iterator","_step","next","done","addresses","value","_iteratorNormalCompletion1","_didIteratorError1","_iteratorError1","_iterator1","_step1","addr","family","internal","address","err","return","isBun","process","versions","bun","canReusePort","includes","major","minor","node","split","map","Number","honoServeNode","app","options","_options_port","_options_host","port","host","listener","request","env"],"sources":["../../src/serve/node.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,YAAA,QAAoB;AAC7B,SAASC,iBAAA,EAAmBC,QAAA,QAAgB;AAC5C,SAASC,kBAAA,QAA0B;AAEnC,OAAOC,MAAA,MAAY;AAGnB,SAASC,kBAAA,EAAwC;EAC/C,IAAAC,yBAAwB,GAAO;IAAOC,iBAAA,GAAmB,KAAG;IAAAC,cAAA;EAC1D;IACE,SAAIC,SAAK,GAAAC,MAAW,CAAAC,MAAW,CAAAV,iBAAe,IAAAW,MAAA,CAAAC,QAAA,KAAAC,KAAA,IAAAR,yBAAA,IAAAQ,KAAA,GAAAL,SAAA,CAAAM,IAAA,IAAAC,IAAA,GAAAV,yBAAA;MAC5C,IAAAW,SAAO,GAAKH,KAAA,CAAAI,KAAA;MACd,IAAAC,0BAAA;QAAAC,kBAAA;QAAAC,eAAA;MACF;QACF,SAAAC,UAAA,IAAAL,SAAA,QAAAL,MAAA,CAAAC,QAAA,KAAAU,MAAA,IAAAJ,0BAAA,IAAAI,MAAA,GAAAD,UAAA,CAAAP,IAAA,IAAAC,IAAA,GAAAG,0BAAA;UACF,IAAAK,IAAA,GAAAD,MAAA,CAAAL,KAAA;UAEM,IAAQM,IAAA,CAAAC,MAAO,KAAQ,UAAS,CAAAD,IAAA,CAAQE,QAAA;YAIxC,OAAAF,IACF,CAAAG,OAAA;UAGS;QACP;MACC,SAAAC,GAAA;QAIPR,kBAAsB,GAAc;QAC5BC,eAAe,GAAAO,GAAA;MACrB,UAAa;QAEP;UACJ,IAAQ,CAAAT,0BAAe,IAAAG,UAAqB,CAAAO,MAAA;YACtCP,UAAU,CAAAO,MAAI;UAChB;QACJ,UAAW;UACZ,IAAAT,kBAAA;YACK,MAASC,eAAa;UACrB;QACL;MACA;IACA;EAGF,CAAC,QAAAO,GAAA;IAEDrB,iBAAkB,OAChB;IAEFC,cAAM,GAAAoB,GAAc;EACpB,UAAM;IAEN;MACA,IAAQ,CAAAtB,yBAAuB,IAAAG,SAAS,CAAAoB,MAAO,IAAK,MAAO;QAEvDpB,SAAS,CAAAoB,MAAA,EAAW;MACtB;IACA,UAAI;MACF,IAAAtB,iBAAmB;QACnB,MAAQC,cAAA;MAAA;IACoE;EAC5E;AACF;AAEF,IAAAsB,KAAA,GAAQ,OAAKC,OAAA,CAAAC,QAAA,CAAAC,GAAA;AAEb,IAAAC,YAAM,GAAW,EAEjB,SACA,QAAQ,CAER,CAAAC,QAAM,CAAAjC,QAAI,CAAc,CAAC,MAAK4B,KAAA,IAAQ;EACpC,KAAAM,KAAO,EAAAC,KAAK,IAAAN,OAAY,CAAAC,QAAA,CAAAM,IAAA,CAAAC,KAAA,MAAAC,GAAA,CAAAC,MAAA;EACxB,OAAAL,KAAU,SAASA,KAAA,KAAM,MAAAC,KAAA,UAAAD,KAAA;AACvB;AACA,eAAQM,aAAIA,CAAWC,GAAA,EAAAC,OAAQ;EAC/B,IAAAC,aAAI,EAAAC,aAAA;EAAA,IACLC,IAAA,IAAAF,aAAA,GAAAD,OAAA,CAAAG,IAAA,cAAAF,aAAA,cAAAA,aAAA;EACH,IAACG,IAAA,IAAAF,aAAA,GAAAF,OAAA,CAAAI,IAAA,cAAAF,aAAA,cAAAA,aAAA;EACH,IAAAG,QAAA,GAAA9C,kBAAA,WAAA+C,OAAA,EAAAC,GAAA","ignoreList":[]}
@@ -0,0 +1,60 @@
1
+ import { createServer } from "node:http";
2
+ import { Hono } from "hono";
3
+ import { describe, expect, test } from "vitest";
4
+ import { honoServeNode } from "./node.mjs";
5
+ describe("honoServeNode", () => {
6
+ test("rejects when the listener cannot bind", async () => {
7
+ const occupied = createServer();
8
+ await new Promise((resolve, reject) => {
9
+ occupied.once("error", reject);
10
+ occupied.listen(0, "127.0.0.1", resolve);
11
+ });
12
+ const address = occupied.address();
13
+ if (!address || typeof address === "string") throw new Error("missing test port");
14
+ const app = new Hono().get("/health", context => context.text("ok"));
15
+ await expect(honoServeNode(app, {
16
+ host: "127.0.0.1",
17
+ port: address.port
18
+ })).rejects.toMatchObject({
19
+ code: "EADDRINUSE"
20
+ });
21
+ await new Promise((resolve, reject) => occupied.close(error => error ? reject(error) : resolve()));
22
+ });
23
+ test("overwrites the trusted peer address header from the socket", async () => {
24
+ const reservation = createServer();
25
+ await new Promise((resolve, reject) => {
26
+ reservation.once("error", reject);
27
+ reservation.listen(0, "127.0.0.1", resolve);
28
+ });
29
+ const address = reservation.address();
30
+ if (!address || typeof address === "string") throw new Error("missing test port");
31
+ await new Promise((resolve, reject) => reservation.close(error => error ? reject(error) : resolve()));
32
+ const app = new Hono().get("/peer", context => context.text(context.req.header("x-vxrn-peer-address") || ""));
33
+ const running = honoServeNode(app, {
34
+ host: "127.0.0.1",
35
+ port: address.port
36
+ });
37
+ await new Promise((resolve, reject) => {
38
+ const startedAt = Date.now();
39
+ const probe = async () => {
40
+ try {
41
+ const response = await fetch(`http://127.0.0.1:${address.port}/peer`, {
42
+ headers: {
43
+ "x-vxrn-peer-address": "203.0.113.9"
44
+ }
45
+ });
46
+ expect(await response.text()).toBe("127.0.0.1");
47
+ resolve();
48
+ } catch (error) {
49
+ if (Date.now() - startedAt > 2e3) reject(error);else setTimeout(probe, 20);
50
+ }
51
+ };
52
+ void probe();
53
+ });
54
+ const shutdown = process.listeners("SIGTERM").at(-1);
55
+ expect(shutdown).toBeTypeOf("function");
56
+ shutdown?.("SIGTERM");
57
+ await running;
58
+ });
59
+ });
60
+ //# sourceMappingURL=node.test.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createServer","Hono","describe","expect","test","honoServeNode","occupied","Promise","resolve","reject","once","listen","address","Error","app","get","context","text","host","port","rejects","toMatchObject","code","close","error","reservation","req","header","running","startedAt","Date","now","probe","response","fetch","headers","toBe","setTimeout","shutdown","process","listeners","at","toBeTypeOf"],"sources":["../../src/serve/node.test.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,72 @@
1
+ import { createServer } from "http";
2
+ import { Hono } from "hono";
3
+ import { describe, expect, test } from "vitest";
4
+ import { honoServeNode } from "./node.native.js";
5
+ describe("honoServeNode", function () {
6
+ test("rejects when the listener cannot bind", async function () {
7
+ var occupied = createServer();
8
+ await new Promise(function (resolve, reject) {
9
+ occupied.once("error", reject);
10
+ occupied.listen(0, "127.0.0.1", resolve);
11
+ });
12
+ var address = occupied.address();
13
+ if (!address || typeof address === "string") throw new Error("missing test port");
14
+ var app = new Hono().get("/health", function (context) {
15
+ return context.text("ok");
16
+ });
17
+ await expect(honoServeNode(app, {
18
+ host: "127.0.0.1",
19
+ port: address.port
20
+ })).rejects.toMatchObject({
21
+ code: "EADDRINUSE"
22
+ });
23
+ await new Promise(function (resolve, reject) {
24
+ return occupied.close(function (error) {
25
+ return error ? reject(error) : resolve();
26
+ });
27
+ });
28
+ });
29
+ test("overwrites the trusted peer address header from the socket", async function () {
30
+ var reservation = createServer();
31
+ await new Promise(function (resolve, reject) {
32
+ reservation.once("error", reject);
33
+ reservation.listen(0, "127.0.0.1", resolve);
34
+ });
35
+ var address = reservation.address();
36
+ if (!address || typeof address === "string") throw new Error("missing test port");
37
+ await new Promise(function (resolve, reject) {
38
+ return reservation.close(function (error) {
39
+ return error ? reject(error) : resolve();
40
+ });
41
+ });
42
+ var app = new Hono().get("/peer", function (context) {
43
+ return context.text(context.req.header("x-vxrn-peer-address") || "");
44
+ });
45
+ var running = honoServeNode(app, {
46
+ host: "127.0.0.1",
47
+ port: address.port
48
+ });
49
+ await new Promise(function (resolve, reject) {
50
+ var startedAt = Date.now();
51
+ var probe = async function () {
52
+ try {
53
+ var response = await fetch(`http://127.0.0.1:${address.port}/peer`, {
54
+ headers: {
55
+ "x-vxrn-peer-address": "203.0.113.9"
56
+ }
57
+ });
58
+ expect(await response.text()).toBe("127.0.0.1");
59
+ resolve();
60
+ } catch (error) {
61
+ if (Date.now() - startedAt > 2e3) reject(error);else setTimeout(probe, 20);
62
+ }
63
+ };
64
+ void probe();
65
+ });
66
+ var shutdown = process.listeners("SIGTERM").at(-1);
67
+ expect(shutdown).toBeTypeOf("function");
68
+ shutdown === null || shutdown === void 0 ? void 0 : shutdown("SIGTERM");
69
+ await running;
70
+ });
71
+ });
72
+ //# sourceMappingURL=node.test.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createServer","Hono","describe","expect","test","honoServeNode","occupied","Promise","resolve","reject","once","listen","address","Error","app","get","context","text","host","port","rejects","toMatchObject","code","close","error","reservation","req","header","running","startedAt","Date","now","probe","response","fetch","headers","toBe"],"sources":["../../src/serve/node.test.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,YAAA,QAAoB;AAC7B,SAASC,IAAA,QAAY;AACrB,SAASC,QAAA,EAAUC,MAAA,EAAQC,IAAA,QAAY;AACvC,SAASC,aAAA,QAAqB;AAE9BH,QAAA,CAAS,iBAAiB,YAAM;EAC9BE,IAAA,CAAK,yCAAyC,kBAAY;IACxD,IAAAE,QAAM,GAAAN,YAAW;IACjB,MAAM,IAAIO,OAAA,CAAc,UAACC,OAAS,EAAAC,MAAW;MAC3CH,QAAA,CAASI,IAAA,CAAK,SAASD,MAAM;MAC7BH,QAAA,CAASK,MAAA,CAAO,GAAG,aAAaH,OAAO;IACzC,CAAC;IACD,IAAAI,OAAM,GAAAN,QAAU,CAAAM,OAAS;IACzB,IAAI,CAACA,OAAA,IAAW,OAAOA,OAAA,KAAY,UAAU,MAAM,IAAIC,KAAA,CAAM,mBAAmB;IAEhF,IAAAC,GAAM,OAAMb,IAAI,GAAKc,GAAE,UAAI,YAAYC,OAAY;MACnD,OAAMA,OAAA,CAAAC,IAAA;IAAA,EACJ;IACF,MAAEd,MAAQ,CAAAE,aAAgB,CAAAS,GAAA,EAAM;MAEhCI,IAAM,aAAI;MAAcC,IAAC,EAAAP,OAAS,CAAAO;IAElC,IAAAC,OAAA,CAAAC,aAAA;MACDC,IAAA;IAED;IACE,MAAM,IAAAf,OAAA,WAAcC,OAAa,EAAAC,MAAA;MACjC,OAAMH,QAAI,CAAciB,KAAC,WAASC,KAAA,EAAW;QAC3C,OAAAA,KAAY,GAAKf,MAAA,CAAAe,KAAS,IAAMhB,OAAA;MAChC;IACF,CAAC;EACD;EACAJ,IAAA,6DAA6D,oBAAmB;IAChF,IAAAqB,WAAU,GAAAzB,YAAA;IAAA,MAAe,IAAAO,OAAS,WAChCC,OAAA,EAAYC,MAAO;MACrBgB,WAAA,CAAAf,IAAA,UAAAD,MAAA;MAEAgB,WAAY,CAAAd,MAAI,CAAK,GAAE,aAAAH,OAAA;IAAA,EAAI;IAAA,IAAUI,OAAA,GAAAa,WAC3B,CAAAb,OAAK;IACf,KAAAA,OAAA,WAAAA,OAAA,yBAAAC,KAAA;IACA,MAAM,IAAAN,OAAU,WAAAC,OAAc,EAAKC,MAAE,EAAM;MAC3C,OAAMgB,WAAmB,CAAAF,KAAA,WAASC,KAAW;QAC3C,OAAMA,KAAA,GAAAf,MAAiB,CAAAe,KAAI,IAAAhB,OAAA;MAC3B;IACE;IACE,IAAAM,GAAA,OAAMb,IAAA,GAAAc,GAAW,QAAM,YAAMC,OAAA;MAAyC,OACpEA,OAAA,CAASC,IAAE,CAAAD,OAAA,CAAAU,GAAA,CAAAC,MAAA,sBAAqC;IAAA;IAElD,IAAAC,OAAA,GAAOvB,aAAM,CAASS,GAAA,EAAK;MAC3BI,IAAA,aAAQ;MAAAC,IACV,EAAAP,OAAS,CAAAO;IACP;IAAgD,UAC3CZ,OAAA,WAAWC,OAAS,EAAAC,MAAA;MAAA,IAC3BoB,SAAA,GAAAC,IAAA,CAAAC,GAAA;MACF,IAAAC,KAAA,kBAAAA,CAAA;QACA,IAAK;UACN,IAAAC,QAAA,SAAAC,KAAA,qBAAAtB,OAAA,CAAAO,IAAA;YACKgB,OAAA,EAAW;cACV,qBAAqB;YAC5B;UACM;UACPhC,MAAA,OAAA8B,QAAA,CAAAhB,IAAA,IAAAmB,IAAA;UACF5B,OAAA","ignoreList":[]}
@@ -1,4 +1,6 @@
1
1
  import FSExtra from "fs-extra";
2
+ import { randomUUID } from "node:crypto";
3
+ import { rename, rm } from "node:fs/promises";
2
4
  import { join } from "node:path";
3
5
  async function readState(cacheDir) {
4
6
  const statePath = join(cacheDir, "state.json");
@@ -11,8 +13,16 @@ async function readState(cacheDir) {
11
13
  }
12
14
  async function writeState(cacheDir, state) {
13
15
  const statePath = join(cacheDir, "state.json");
16
+ const pendingStatePath = `${statePath}.${process.pid}.${randomUUID()}.tmp`;
14
17
  await FSExtra.ensureDir(cacheDir);
15
- await FSExtra.writeJSON(statePath, state);
18
+ try {
19
+ await FSExtra.writeJSON(pendingStatePath, state);
20
+ await rename(pendingStatePath, statePath);
21
+ } finally {
22
+ await rm(pendingStatePath, {
23
+ force: true
24
+ });
25
+ }
16
26
  }
17
27
  export { readState, writeState };
18
28
  //# sourceMappingURL=state.mjs.map
@@ -1 +1 @@
1
- {"version":3,"names":["FSExtra","join","readState","cacheDir","statePath","state","pathExists","readJSON","writeState","ensureDir","writeJSON"],"sources":["../../src/utils/state.ts"],"sourcesContent":[null],"mappings":"AAAA,OAAOA,OAAA,MAAa;AACpB,SAASC,IAAA,QAAY;AAMrB,eAAsBC,UAAUC,QAAA,EAAkB;EAChD,MAAMC,SAAA,GAAYH,IAAA,CAAKE,QAAA,EAAU,YAAY;EAC7C,IAAI;IACF,MAAME,KAAA,GAAgB,OAAML,OAAA,CAAQM,UAAA,CAAWF,SAAS,KACpD,MAAMJ,OAAA,CAAQO,QAAA,CAASH,SAAS,IAChC,CAAC;IACL,OAAOC,KAAA;EACT,QAAQ;IAEN,OAAO,CAAC;EACV;AACF;AAEA,eAAsBG,WAAWL,QAAA,EAAkBE,KAAA,EAAc;EAC/D,MAAMD,SAAA,GAAYH,IAAA,CAAKE,QAAA,EAAU,YAAY;EAC7C,MAAMH,OAAA,CAAQS,SAAA,CAAUN,QAAQ;EAChC,MAAMH,OAAA,CAAQU,SAAA,CAAUN,SAAA,EAAWC,KAAK;AAC1C","ignoreList":[]}
1
+ {"version":3,"names":["FSExtra","randomUUID","rename","rm","join","readState","cacheDir","statePath","state","pathExists","readJSON","writeState","pendingStatePath","process","pid","ensureDir","writeJSON","force"],"sources":["../../src/utils/state.ts"],"sourcesContent":[null],"mappings":"AAAA,OAAOA,OAAA,MAAa;AACpB,SAASC,UAAA,QAAkB;AAC3B,SAASC,MAAA,EAAQC,EAAA,QAAU;AAC3B,SAASC,IAAA,QAAY;AAMrB,eAAsBC,UAAUC,QAAA,EAAkB;EAChD,MAAMC,SAAA,GAAYH,IAAA,CAAKE,QAAA,EAAU,YAAY;EAC7C,IAAI;IACF,MAAME,KAAA,GAAgB,OAAMR,OAAA,CAAQS,UAAA,CAAWF,SAAS,KACpD,MAAMP,OAAA,CAAQU,QAAA,CAASH,SAAS,IAChC,CAAC;IACL,OAAOC,KAAA;EACT,QAAQ;IAEN,OAAO,CAAC;EACV;AACF;AAEA,eAAsBG,WAAWL,QAAA,EAAkBE,KAAA,EAAc;EAC/D,MAAMD,SAAA,GAAYH,IAAA,CAAKE,QAAA,EAAU,YAAY;EAC7C,MAAMM,gBAAA,GAAmB,GAAGL,SAAS,IAAIM,OAAA,CAAQC,GAAG,IAAIb,UAAA,CAAW,CAAC;EACpE,MAAMD,OAAA,CAAQe,SAAA,CAAUT,QAAQ;EAChC,IAAI;IACF,MAAMN,OAAA,CAAQgB,SAAA,CAAUJ,gBAAA,EAAkBJ,KAAK;IAC/C,MAAMN,MAAA,CAAOU,gBAAA,EAAkBL,SAAS;EAC1C,UAAE;IACA,MAAMJ,EAAA,CAAGS,gBAAA,EAAkB;MAAEK,KAAA,EAAO;IAAK,CAAC;EAC5C;AACF","ignoreList":[]}
@@ -1,4 +1,6 @@
1
1
  import FSExtra from "fs-extra";
2
+ import { randomUUID } from "crypto";
3
+ import { rename, rm } from "fs/promises";
2
4
  import { join } from "path";
3
5
  async function readState(cacheDir) {
4
6
  var statePath = join(cacheDir, "state.json");
@@ -11,8 +13,16 @@ async function readState(cacheDir) {
11
13
  }
12
14
  async function writeState(cacheDir, state) {
13
15
  var statePath = join(cacheDir, "state.json");
16
+ var pendingStatePath = `${statePath}.${process.pid}.${randomUUID()}.tmp`;
14
17
  await FSExtra.ensureDir(cacheDir);
15
- await FSExtra.writeJSON(statePath, state);
18
+ try {
19
+ await FSExtra.writeJSON(pendingStatePath, state);
20
+ await rename(pendingStatePath, statePath);
21
+ } finally {
22
+ await rm(pendingStatePath, {
23
+ force: true
24
+ });
25
+ }
16
26
  }
17
27
  export { readState, writeState };
18
28
  //# sourceMappingURL=state.native.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["FSExtra","join","readState","cacheDir","statePath","state","pathExists","readJSON","unused","writeState","ensureDir","writeJSON"],"sources":["../../src/utils/state.ts"],"sourcesContent":[null],"mappings":"AAAA,OAAOA,OAAA,MAAa;AACpB,SAASC,IAAA,QAAY;AAMrB,eAAsBC,UAAUC,QAAA,EAAkB;EAChD,IAAAC,SAAM,GAAAH,IAAY,CAAAE,QAAK,cAAU;EACjC,IAAI;IACF,IAAAE,KAAM,UAAgBL,OAAM,CAAAM,UAAQ,CAAAF,SAAW,KAAS,MACpDJ,OAAM,CAAAO,QAAQ,CAAAH,SAAS,IAAS,EAChC;IACJ,OAAOC,KAAA;EACT,SAAQG,MAAA;IAEN,OAAO,CAAC;EACV;AACF;AAEA,eAAsBC,WAAWN,QAAA,EAAkBE,KAAA,EAAc;EAC/D,IAAAD,SAAM,GAAAH,IAAY,CAAAE,QAAK,cAAU;EACjC,MAAMH,OAAA,CAAQU,SAAA,CAAUP,QAAQ;EAChC,MAAMH,OAAA,CAAQW,SAAA,CAAUP,SAAA,EAAWC,KAAK;AAC1C","ignoreList":[]}
1
+ {"version":3,"names":["FSExtra","randomUUID","rename","rm","join","readState","cacheDir","statePath","state","pathExists","readJSON","unused","writeState","pendingStatePath","process","pid","ensureDir","writeJSON","force"],"sources":["../../src/utils/state.ts"],"sourcesContent":[null],"mappings":"AAAA,OAAOA,OAAA,MAAa;AACpB,SAASC,UAAA,QAAkB;AAC3B,SAASC,MAAA,EAAQC,EAAA,QAAU;AAC3B,SAASC,IAAA,QAAY;AAMrB,eAAsBC,UAAUC,QAAA,EAAkB;EAChD,IAAAC,SAAM,GAAAH,IAAY,CAAAE,QAAK,cAAU;EACjC,IAAI;IACF,IAAAE,KAAM,UAAgBR,OAAM,CAAAS,UAAQ,CAAAF,SAAW,KAAS,MACpDP,OAAM,CAAAU,QAAQ,CAAAH,SAAS,IAAS,EAChC;IACJ,OAAOC,KAAA;EACT,SAAQG,MAAA;IAEN,OAAO,CAAC;EACV;AACF;AAEA,eAAsBC,WAAWN,QAAA,EAAkBE,KAAA,EAAc;EAC/D,IAAAD,SAAM,GAAAH,IAAY,CAAAE,QAAK,cAAU;EACjC,IAAAO,gBAAM,MAAmBN,SAAG,IAASO,OAAI,CAAAC,GAAQ,IAAGd,UAAI,QAAY;EACpE,MAAMD,OAAA,CAAQgB,SAAA,CAAUV,QAAQ;EAChC,IAAI;IACF,MAAMN,OAAA,CAAQiB,SAAA,CAAUJ,gBAAA,EAAkBL,KAAK;IAC/C,MAAMN,MAAA,CAAOW,gBAAA,EAAkBN,SAAS;EAC1C,UAAE;IACA,MAAMJ,EAAA,CAAGU,gBAAA,EAAkB;MAC7BK,KAAA;IACF","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vxrn",
3
- "version": "1.21.6",
3
+ "version": "1.21.7",
4
4
  "sideEffects": false,
5
5
  "type": "module",
6
6
  "exports": {
@@ -60,16 +60,16 @@
60
60
  "@expo/config-plugins": "~55.0.6",
61
61
  "@hono/node-server": "^1.19.14",
62
62
  "@react-native/dev-middleware": "^0.83.4",
63
- "@vxrn/compiler": "1.21.6",
64
- "@vxrn/debug": "1.21.6",
65
- "@vxrn/query-string": "1.21.6",
66
- "@vxrn/resolve": "1.21.6",
67
- "@vxrn/safe-area": "1.21.6",
68
- "@vxrn/url-parse": "1.21.6",
69
- "@vxrn/utils": "1.21.6",
70
- "@vxrn/vendor": "1.21.6",
71
- "@vxrn/vite-flow": "1.21.6",
72
- "@vxrn/vite-plugin-metro": "1.21.6",
63
+ "@vxrn/compiler": "1.21.7",
64
+ "@vxrn/debug": "1.21.7",
65
+ "@vxrn/query-string": "1.21.7",
66
+ "@vxrn/resolve": "1.21.7",
67
+ "@vxrn/safe-area": "1.21.7",
68
+ "@vxrn/url-parse": "1.21.7",
69
+ "@vxrn/utils": "1.21.7",
70
+ "@vxrn/vendor": "1.21.7",
71
+ "@vxrn/vite-flow": "1.21.7",
72
+ "@vxrn/vite-plugin-metro": "1.21.7",
73
73
  "citty": "^0.1.6",
74
74
  "dotenv": "^17.2.1",
75
75
  "dotenv-expand": "^12.0.2",
@@ -5,7 +5,7 @@ import { join } from 'node:path'
5
5
  import { readPackageJSON } from 'pkg-types'
6
6
  import type { Mode, VXRNOptions } from '../types'
7
7
  import { getServerOptionsFilled } from './getServerOptionsFilled'
8
- import { readState, writeState } from '../utils/state'
8
+ import { readState } from '../utils/state'
9
9
  import { getCacheDir } from '../utils/getCacheDir'
10
10
 
11
11
  const require = createRequire(import.meta.url)
@@ -71,9 +71,6 @@ export async function fillOptions(
71
71
  ? 'vite'
72
72
  : false
73
73
 
74
- // no need to wait to write state
75
- void writeState(cacheDir, { versionHash })
76
-
77
74
  if (typeof options.build?.server !== 'boolean' && !options.build?.server) {
78
75
  // default building server to off
79
76
  options.build ||= {}
@@ -106,6 +103,7 @@ export async function fillOptions(
106
103
  state,
107
104
  packageRootDir,
108
105
  cacheDir,
106
+ versionHash,
109
107
  } as const
110
108
 
111
109
  optionsFilled = final
@@ -0,0 +1,82 @@
1
+ import { execFile } from 'node:child_process'
2
+ import { mkdtemp, mkdir, readFile, rm, writeFile } from 'node:fs/promises'
3
+ import { tmpdir } from 'node:os'
4
+ import { dirname, join } from 'node:path'
5
+ import { pathToFileURL } from 'node:url'
6
+ import { promisify } from 'node:util'
7
+ import { afterEach, describe, expect, it } from 'vitest'
8
+
9
+ const execFileAsync = promisify(execFile)
10
+
11
+ describe('prepareCacheForVersion', () => {
12
+ let root: string | undefined
13
+
14
+ afterEach(async () => {
15
+ if (root) {
16
+ await rm(root, { recursive: true, force: true })
17
+ }
18
+ })
19
+
20
+ it('lets one process clean a stale same-root cache', async () => {
21
+ root = await mkdtemp(join(tmpdir(), 'vxrn-concurrent-clean-'))
22
+ const cacheDir = join(root, 'node_modules', '.vxrn')
23
+ const viteDir = join(root, 'node_modules', '.vite')
24
+ const participantsDir = join(root, 'participants')
25
+ const participantCount = 4
26
+
27
+ await Promise.all([
28
+ mkdir(cacheDir, { recursive: true }),
29
+ mkdir(viteDir, { recursive: true }),
30
+ mkdir(participantsDir, { recursive: true }),
31
+ ])
32
+ await Promise.all([
33
+ writeFile(join(cacheDir, 'state.json'), JSON.stringify({ versionHash: 'old' })),
34
+ writeFile(join(cacheDir, 'stale'), 'stale'),
35
+ writeFile(join(viteDir, 'stale'), 'stale'),
36
+ ])
37
+
38
+ const moduleUrl = pathToFileURL(join(dirname(import.meta.filename), 'clean.ts')).href
39
+ const workerScript = (participant: number) => `
40
+ import { readdir, writeFile } from 'node:fs/promises'
41
+ import { join } from 'node:path'
42
+ import { prepareCacheForVersion } from ${JSON.stringify(moduleUrl)}
43
+
44
+ const root = ${JSON.stringify(root)}
45
+ const participantsDir = ${JSON.stringify(participantsDir)}
46
+ await writeFile(join(participantsDir, ${JSON.stringify(String(participant))}), '')
47
+ while ((await readdir(participantsDir)).length < ${participantCount}) {
48
+ await Bun.sleep(5)
49
+ }
50
+ const cleaned = await prepareCacheForVersion({
51
+ root,
52
+ cacheDir: join(root, 'node_modules', '.vxrn'),
53
+ versionHash: 'new',
54
+ })
55
+ console.info(cleaned ? 'cleaned-by-worker' : 'cache-already-current')
56
+ `
57
+
58
+ const results = await Promise.all(
59
+ Array.from({ length: participantCount }, (_, participant) =>
60
+ execFileAsync('bun', ['-e', workerScript(participant)], {
61
+ env: { ...process.env, VXRN_DONT_CLEAN_SELF: '' },
62
+ })
63
+ )
64
+ )
65
+ const output = results.map(({ stdout }) => stdout).join('\n')
66
+
67
+ expect(output.match(/\[vxrn\] cleaning/g)).toHaveLength(1)
68
+ expect(output.match(/cleaned-by-worker/g)).toHaveLength(1)
69
+ expect(JSON.parse(await readFile(join(cacheDir, 'state.json'), 'utf8'))).toEqual({
70
+ versionHash: 'new',
71
+ })
72
+ await expect(readFile(join(cacheDir, 'stale'))).rejects.toMatchObject({
73
+ code: 'ENOENT',
74
+ })
75
+ await expect(readFile(join(viteDir, 'stale'))).rejects.toMatchObject({
76
+ code: 'ENOENT',
77
+ })
78
+ await expect(
79
+ readFile(join(root, 'node_modules', '.vxrn-clean.lock'))
80
+ ).rejects.toMatchObject({ code: 'ENOENT' })
81
+ }, 20_000)
82
+ })