equipped 5.3.0 → 5.3.2

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 (191) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/cjs/cache/adapters/in-memory/index.cjs +155 -155
  3. package/dist/cjs/cache/adapters/in-memory/index.cjs.map +1 -1
  4. package/dist/cjs/cache/adapters/in-memory/index.min.cjs +3 -3
  5. package/dist/cjs/cache/adapters/in-memory/index.min.cjs.map +1 -1
  6. package/dist/cjs/dbs/adapters/mongodb/index.cjs.map +1 -1
  7. package/dist/cjs/dbs/adapters/mongodb/index.min.cjs +2 -2
  8. package/dist/cjs/dbs/adapters/mongodb/index.min.cjs.map +1 -1
  9. package/dist/cjs/dbs/index.cjs +181 -179
  10. package/dist/cjs/dbs/index.cjs.map +1 -1
  11. package/dist/cjs/dbs/index.min.cjs +3 -3
  12. package/dist/cjs/dbs/index.min.cjs.map +1 -1
  13. package/dist/cjs/events/adapters/kafka/index.cjs.map +1 -1
  14. package/dist/cjs/events/adapters/kafka/index.min.cjs +2 -2
  15. package/dist/cjs/events/adapters/kafka/index.min.cjs.map +1 -1
  16. package/dist/cjs/events/adapters/rabbitmq/index.cjs +179 -179
  17. package/dist/cjs/events/adapters/rabbitmq/index.cjs.map +1 -1
  18. package/dist/cjs/events/adapters/rabbitmq/index.min.cjs +3 -3
  19. package/dist/cjs/events/adapters/rabbitmq/index.min.cjs.map +1 -1
  20. package/dist/cjs/orm/adapters/mongodb/index.cjs +144 -144
  21. package/dist/cjs/orm/adapters/mongodb/index.cjs.map +1 -1
  22. package/dist/cjs/orm/adapters/mongodb/index.min.cjs +1 -1
  23. package/dist/cjs/orm/adapters/mongodb/index.min.cjs.map +1 -1
  24. package/dist/cjs/orm/adapters/postgresql/index.cjs +144 -215
  25. package/dist/cjs/orm/adapters/postgresql/index.cjs.map +1 -1
  26. package/dist/cjs/orm/adapters/postgresql/index.min.cjs +11 -11
  27. package/dist/cjs/orm/adapters/postgresql/index.min.cjs.map +1 -1
  28. package/dist/cjs/server/adapters/express/index.cjs +338 -226
  29. package/dist/cjs/server/adapters/express/index.cjs.map +1 -1
  30. package/dist/cjs/server/adapters/express/index.min.cjs +7 -7
  31. package/dist/cjs/server/adapters/express/index.min.cjs.map +1 -1
  32. package/dist/cjs/server/adapters/fastify/index.cjs +323 -211
  33. package/dist/cjs/server/adapters/fastify/index.cjs.map +1 -1
  34. package/dist/cjs/server/adapters/fastify/index.min.cjs +7 -7
  35. package/dist/cjs/server/adapters/fastify/index.min.cjs.map +1 -1
  36. package/dist/cjs/server/index.cjs +128 -16
  37. package/dist/cjs/server/index.cjs.map +1 -1
  38. package/dist/cjs/server/index.min.cjs +6 -6
  39. package/dist/cjs/server/index.min.cjs.map +1 -1
  40. package/dist/cjs/utilities/index.cjs +0 -5
  41. package/dist/cjs/utilities/index.cjs.map +1 -1
  42. package/dist/cjs/utilities/index.min.cjs +2 -2
  43. package/dist/cjs/utilities/index.min.cjs.map +1 -1
  44. package/dist/esm/cache/adapters/in-memory/index.min.mjs +1 -1
  45. package/dist/esm/cache/adapters/in-memory/index.min.mjs.map +1 -1
  46. package/dist/esm/cache/adapters/in-memory/index.mjs +6 -3
  47. package/dist/esm/cache/adapters/in-memory/index.mjs.map +1 -1
  48. package/dist/esm/cache/adapters/redis/index.min.mjs +1 -1
  49. package/dist/esm/cache/adapters/redis/index.mjs +5 -3
  50. package/dist/esm/cache/index.min.mjs +1 -1
  51. package/dist/esm/cache/index.mjs +2 -2
  52. package/dist/esm/{chunk-PNZNNUMN.mjs → chunk-26BOI6IL.mjs} +7 -5
  53. package/dist/esm/{chunk-PNZNNUMN.mjs.map → chunk-26BOI6IL.mjs.map} +1 -1
  54. package/dist/esm/{chunk-4JLDXF7T.min.mjs → chunk-AODOD22O.min.mjs} +2 -2
  55. package/dist/esm/chunk-APSDCRY5.min.mjs +32 -0
  56. package/dist/esm/chunk-APSDCRY5.min.mjs.map +1 -0
  57. package/dist/esm/{chunk-MDQKODYQ.mjs → chunk-CEYT5YBA.mjs} +204 -348
  58. package/dist/esm/chunk-CEYT5YBA.mjs.map +1 -0
  59. package/dist/esm/chunk-CU2HU5UE.min.mjs +2 -0
  60. package/dist/esm/chunk-CU2HU5UE.min.mjs.map +1 -0
  61. package/dist/esm/chunk-DAK7OKSH.min.mjs +2 -0
  62. package/dist/esm/{chunk-SGZNOYC3.min.mjs.map → chunk-DAK7OKSH.min.mjs.map} +1 -1
  63. package/dist/esm/{chunk-PCAUXBAG.min.mjs → chunk-DAUQA32Q.min.mjs} +2 -2
  64. package/dist/esm/{chunk-JH6EBXY4.mjs → chunk-FQYRVHQT.mjs} +2 -2
  65. package/dist/esm/chunk-NEF3UYFA.mjs +144 -0
  66. package/dist/esm/chunk-NEF3UYFA.mjs.map +1 -0
  67. package/dist/esm/chunk-NNFUYHQ7.mjs +135 -0
  68. package/dist/esm/chunk-NNFUYHQ7.mjs.map +1 -0
  69. package/dist/esm/{chunk-4MXYZS5R.mjs → chunk-PCEHFZ6G.mjs} +9 -5
  70. package/dist/esm/{chunk-4MXYZS5R.mjs.map → chunk-PCEHFZ6G.mjs.map} +1 -1
  71. package/dist/esm/{chunk-B5QQ32YY.min.mjs → chunk-QCCDJLBH.min.mjs} +2 -2
  72. package/dist/esm/{chunk-PQCBVQL6.mjs → chunk-RIXTQQUU.mjs} +2 -2
  73. package/dist/esm/{chunk-Z2TZ3KR7.mjs → chunk-RPPYCWXW.mjs} +2 -2
  74. package/dist/esm/{chunk-AKQBDYUO.mjs → chunk-T2O72JBW.mjs} +3 -3
  75. package/dist/esm/{chunk-TVTYDU2D.mjs → chunk-VQO4MSEC.mjs} +5 -5
  76. package/dist/esm/{chunk-ZGMFFK6Y.min.mjs → chunk-X7VNAGLR.min.mjs} +2 -2
  77. package/dist/esm/chunk-XTXAEBXY.min.mjs +2 -0
  78. package/dist/esm/{chunk-5VW3JAFR.min.mjs.map → chunk-XTXAEBXY.min.mjs.map} +1 -1
  79. package/dist/esm/{chunk-QHLKB47N.min.mjs → chunk-YDQW6ETS.min.mjs} +2 -2
  80. package/dist/esm/chunk-ZDBDR3IB.min.mjs +2 -0
  81. package/dist/esm/chunk-ZDBDR3IB.min.mjs.map +1 -0
  82. package/dist/esm/dbs/adapters/mongodb/index.min.mjs +1 -1
  83. package/dist/esm/dbs/adapters/mongodb/index.min.mjs.map +1 -1
  84. package/dist/esm/dbs/adapters/mongodb/index.mjs +8 -5
  85. package/dist/esm/dbs/adapters/mongodb/index.mjs.map +1 -1
  86. package/dist/esm/dbs/index.min.mjs +1 -1
  87. package/dist/esm/dbs/index.mjs +5 -3
  88. package/dist/esm/errors/index.min.mjs +1 -1
  89. package/dist/esm/errors/index.mjs +1 -1
  90. package/dist/esm/events/adapters/kafka/index.min.mjs +1 -1
  91. package/dist/esm/events/adapters/kafka/index.mjs +4 -2
  92. package/dist/esm/events/adapters/rabbitmq/index.min.mjs +1 -1
  93. package/dist/esm/events/adapters/rabbitmq/index.min.mjs.map +1 -1
  94. package/dist/esm/events/adapters/rabbitmq/index.mjs +7 -3
  95. package/dist/esm/events/adapters/rabbitmq/index.mjs.map +1 -1
  96. package/dist/esm/index.min.mjs +1 -1
  97. package/dist/esm/index.mjs +1 -1
  98. package/dist/esm/instance/index.min.mjs +1 -1
  99. package/dist/esm/instance/index.mjs +1 -1
  100. package/dist/esm/{introspection-32BRYKYY.mjs → introspection-FGDVYTPP.mjs} +3 -3
  101. package/dist/esm/introspection-UDWDS6DV.min.mjs +2 -0
  102. package/dist/esm/jobs/adapters/redis/index.min.mjs +1 -1
  103. package/dist/esm/jobs/adapters/redis/index.min.mjs.map +1 -1
  104. package/dist/esm/jobs/adapters/redis/index.mjs +10 -6
  105. package/dist/esm/jobs/adapters/redis/index.mjs.map +1 -1
  106. package/dist/esm/orm/adapters/in-memory/index.min.mjs +1 -1
  107. package/dist/esm/orm/adapters/in-memory/index.mjs +4 -3
  108. package/dist/esm/orm/adapters/json/index.min.mjs +1 -1
  109. package/dist/esm/orm/adapters/json/index.min.mjs.map +1 -1
  110. package/dist/esm/orm/adapters/json/index.mjs +6 -5
  111. package/dist/esm/orm/adapters/json/index.mjs.map +1 -1
  112. package/dist/esm/orm/adapters/mongodb/index.min.mjs +1 -1
  113. package/dist/esm/orm/adapters/mongodb/index.min.mjs.map +1 -1
  114. package/dist/esm/orm/adapters/mongodb/index.mjs +6 -4
  115. package/dist/esm/orm/adapters/mongodb/index.mjs.map +1 -1
  116. package/dist/esm/orm/adapters/postgresql/index.min.mjs +2 -2
  117. package/dist/esm/orm/adapters/postgresql/index.min.mjs.map +1 -1
  118. package/dist/esm/orm/adapters/postgresql/index.mjs +8 -5
  119. package/dist/esm/orm/adapters/postgresql/index.mjs.map +1 -1
  120. package/dist/esm/orm/index.min.mjs +1 -1
  121. package/dist/esm/orm/index.mjs +3 -3
  122. package/dist/esm/server/adapters/express/index.min.mjs +1 -1
  123. package/dist/esm/server/adapters/express/index.min.mjs.map +1 -1
  124. package/dist/esm/server/adapters/express/index.mjs +7 -3
  125. package/dist/esm/server/adapters/express/index.mjs.map +1 -1
  126. package/dist/esm/server/adapters/fastify/index.min.mjs +1 -1
  127. package/dist/esm/server/adapters/fastify/index.min.mjs.map +1 -1
  128. package/dist/esm/server/adapters/fastify/index.mjs +7 -3
  129. package/dist/esm/server/adapters/fastify/index.mjs.map +1 -1
  130. package/dist/esm/server/index.min.mjs +1 -1
  131. package/dist/esm/server/index.mjs +1 -1
  132. package/dist/esm/utilities/index.min.mjs +1 -1
  133. package/dist/esm/utilities/index.mjs +5 -4
  134. package/dist/esm/validations/index.min.mjs +1 -1
  135. package/dist/esm/validations/index.mjs +1 -1
  136. package/dist/types/{base-DVr0fHil.d.ts → base-qDndMBf8.d.ts} +9 -3
  137. package/dist/types/cache/adapters/in-memory/index.js +7 -4
  138. package/dist/types/cache/adapters/redis/index.js +5 -3
  139. package/dist/types/cache/index.js +2 -2
  140. package/dist/types/{chunk-NJ2FHI3U.js → chunk-35CDCTLR.js} +4 -4
  141. package/dist/types/{chunk-XGGGAEET.js → chunk-4YQA5GPT.js} +8 -4
  142. package/dist/types/{chunk-65EHKCDZ.js → chunk-AQIV47BY.js} +6 -4
  143. package/dist/types/{chunk-YTY3EFNB.js → chunk-BKDWUJRG.js} +203 -347
  144. package/dist/types/{chunk-JQ2FWX4W.js → chunk-DA2VYP7D.js} +1 -1
  145. package/dist/types/{chunk-3TKJGSCZ.js → chunk-GDMGPX4C.js} +1 -1
  146. package/dist/types/chunk-H5V6ADFD.js +134 -0
  147. package/dist/types/{chunk-3M4PBZAQ.js → chunk-OOKJEMQI.js} +2 -2
  148. package/dist/types/chunk-PPD4WDG6.js +143 -0
  149. package/dist/types/{chunk-OHFTQGQG.js → chunk-T7K7PO6G.js} +1 -1
  150. package/dist/types/dbs/adapters/mongodb/index.js +8 -5
  151. package/dist/types/dbs/index.js +5 -3
  152. package/dist/types/errors/index.js +1 -1
  153. package/dist/types/events/adapters/kafka/index.js +4 -2
  154. package/dist/types/events/adapters/rabbitmq/index.js +7 -3
  155. package/dist/types/index.js +1 -1
  156. package/dist/types/instance/index.js +1 -1
  157. package/dist/types/{introspection-VOIU3XE6.js → introspection-FSNS33CQ.js} +2 -2
  158. package/dist/types/jobs/adapters/redis/index.js +10 -6
  159. package/dist/types/orm/adapters/in-memory/index.js +4 -3
  160. package/dist/types/orm/adapters/json/index.js +6 -5
  161. package/dist/types/orm/adapters/mongodb/index.js +6 -4
  162. package/dist/types/orm/adapters/postgresql/index.js +8 -5
  163. package/dist/types/orm/index.js +3 -3
  164. package/dist/types/server/adapters/express/index.d.ts +1 -1
  165. package/dist/types/server/adapters/express/index.js +7 -3
  166. package/dist/types/server/adapters/fastify/index.d.ts +1 -1
  167. package/dist/types/server/adapters/fastify/index.js +7 -3
  168. package/dist/types/server/index.d.ts +2 -2
  169. package/dist/types/server/index.js +1 -1
  170. package/dist/types/utilities/index.d.ts +1 -2
  171. package/dist/types/utilities/index.js +5 -4
  172. package/dist/types/validations/index.js +1 -1
  173. package/package.json +1 -1
  174. package/dist/esm/chunk-5VW3JAFR.min.mjs +0 -2
  175. package/dist/esm/chunk-FLAPYQUT.min.mjs +0 -32
  176. package/dist/esm/chunk-FLAPYQUT.min.mjs.map +0 -1
  177. package/dist/esm/chunk-MDQKODYQ.mjs.map +0 -1
  178. package/dist/esm/chunk-SGZNOYC3.min.mjs +0 -2
  179. package/dist/esm/introspection-A72WMWE3.min.mjs +0 -2
  180. /package/dist/esm/{chunk-4JLDXF7T.min.mjs.map → chunk-AODOD22O.min.mjs.map} +0 -0
  181. /package/dist/esm/{chunk-PCAUXBAG.min.mjs.map → chunk-DAUQA32Q.min.mjs.map} +0 -0
  182. /package/dist/esm/{chunk-JH6EBXY4.mjs.map → chunk-FQYRVHQT.mjs.map} +0 -0
  183. /package/dist/esm/{chunk-B5QQ32YY.min.mjs.map → chunk-QCCDJLBH.min.mjs.map} +0 -0
  184. /package/dist/esm/{chunk-PQCBVQL6.mjs.map → chunk-RIXTQQUU.mjs.map} +0 -0
  185. /package/dist/esm/{chunk-Z2TZ3KR7.mjs.map → chunk-RPPYCWXW.mjs.map} +0 -0
  186. /package/dist/esm/{chunk-AKQBDYUO.mjs.map → chunk-T2O72JBW.mjs.map} +0 -0
  187. /package/dist/esm/{chunk-TVTYDU2D.mjs.map → chunk-VQO4MSEC.mjs.map} +0 -0
  188. /package/dist/esm/{chunk-ZGMFFK6Y.min.mjs.map → chunk-X7VNAGLR.min.mjs.map} +0 -0
  189. /package/dist/esm/{chunk-QHLKB47N.min.mjs.map → chunk-YDQW6ETS.min.mjs.map} +0 -0
  190. /package/dist/esm/{introspection-32BRYKYY.mjs.map → introspection-FGDVYTPP.mjs.map} +0 -0
  191. /package/dist/esm/{introspection-A72WMWE3.min.mjs.map → introspection-UDWDS6DV.min.mjs.map} +0 -0
@@ -1017,19 +1017,6 @@ var openapi = (config) => {
1017
1017
  };
1018
1018
  };
1019
1019
 
1020
- // src/utilities/json.ts
1021
- var parseJSONValue = (data) => {
1022
- try {
1023
- if (data?.constructor?.name !== "String") return data;
1024
- return JSON.parse(data);
1025
- } catch {
1026
- return data;
1027
- }
1028
- };
1029
- function parseJSONObject(data) {
1030
- return Object.fromEntries(Object.entries(data).map(([key, value]) => [key, parseJSONValue(value)]));
1031
- }
1032
-
1033
1020
  // src/server/requests.ts
1034
1021
  var Request = class {
1035
1022
  ip;
@@ -1058,8 +1045,10 @@ var Request = class {
1058
1045
  this.params = params;
1059
1046
  this.cookies = cookies;
1060
1047
  this.headers = headers;
1061
- this.query = parseJSONObject(query);
1062
- this.body = Object.assign(parseJSONObject(body), files);
1048
+ const hasFiles = Object.keys(files).length > 0;
1049
+ const bodyFields = body && typeof body === "object" && !Array.isArray(body) ? body : {};
1050
+ this.query = query;
1051
+ this.body = hasFiles ? Object.assign({}, bodyFields, files) : body;
1063
1052
  }
1064
1053
  pipe(stream, opts = {}) {
1065
1054
  return new Response({ ...opts, piped: true, body: stream });
@@ -1105,6 +1094,83 @@ var Response = class {
1105
1094
  });
1106
1095
  }
1107
1096
  };
1097
+ if (void 0) {
1098
+ const { describe, expect, test } = void 0;
1099
+ describe("Request", () => {
1100
+ test("preserves adapter-provided query and body values without JSON normalization", () => {
1101
+ const query = {
1102
+ count: "10",
1103
+ active: "true",
1104
+ filter: '{"name":"test"}',
1105
+ quoted: '"value"'
1106
+ };
1107
+ const body = {
1108
+ count: "10",
1109
+ active: "false",
1110
+ payload: '{"nested":true}',
1111
+ quoted: '"value"'
1112
+ };
1113
+ const request = new Request({
1114
+ ip: void 0,
1115
+ body,
1116
+ cookies: {},
1117
+ params: {},
1118
+ query,
1119
+ method: "post",
1120
+ path: "/items",
1121
+ headers: {},
1122
+ files: {}
1123
+ });
1124
+ expect(request.query).toEqual(query);
1125
+ expect(request.body).toEqual(body);
1126
+ });
1127
+ test("continues merging uploaded files into body fields without parsing string fields", () => {
1128
+ const file = {
1129
+ name: "avatar.png",
1130
+ type: "image/png",
1131
+ size: 4,
1132
+ isTruncated: false,
1133
+ data: Buffer.from("file"),
1134
+ duration: 0
1135
+ };
1136
+ const body = { metadata: '{"alt":"avatar"}' };
1137
+ const request = new Request({
1138
+ ip: void 0,
1139
+ body,
1140
+ cookies: {},
1141
+ params: {},
1142
+ query: {},
1143
+ method: "post",
1144
+ path: "/upload",
1145
+ headers: {},
1146
+ files: { avatar: [file] }
1147
+ });
1148
+ expect(request.body).toEqual({ metadata: '{"alt":"avatar"}', avatar: [file] });
1149
+ });
1150
+ test("does not spread non-object body values when uploaded files are present", () => {
1151
+ const file = {
1152
+ name: "avatar.png",
1153
+ type: "image/png",
1154
+ size: 4,
1155
+ isTruncated: false,
1156
+ data: Buffer.from("file"),
1157
+ duration: 0
1158
+ };
1159
+ const request = new Request({
1160
+ ip: void 0,
1161
+ body: "raw text body",
1162
+ cookies: {},
1163
+ params: {},
1164
+ query: {},
1165
+ method: "post",
1166
+ path: "/upload",
1167
+ headers: {},
1168
+ files: { avatar: [file] }
1169
+ });
1170
+ expect(request.body).toEqual({ avatar: [file] });
1171
+ });
1172
+ });
1173
+ }
1108
1174
 
1109
1175
  // src/server/requests-auth-methods/base.ts
1110
1176
  var import_node_http2 = require("http2");
@@ -1402,6 +1468,7 @@ var Server = class {
1402
1468
  #queue = [];
1403
1469
  #routesByKey = /* @__PURE__ */ new Set();
1404
1470
  #started = false;
1471
+ #beforeListenHandlers = [];
1405
1472
  #notFoundHandler = null;
1406
1473
  setup(httpServer, config) {
1407
1474
  this.#httpServer = httpServer;
@@ -1457,6 +1524,11 @@ var Server = class {
1457
1524
  this.#notFoundHandler = handler;
1458
1525
  return this;
1459
1526
  }
1527
+ onBeforeListen(handler) {
1528
+ if (this.#started) throw new EquippedError("Cannot add before-listen handler after server has started", {});
1529
+ this.#beforeListenHandlers.push(handler);
1530
+ return this;
1531
+ }
1460
1532
  test() {
1461
1533
  return (0, import_supertest.default)(this.#httpServer);
1462
1534
  }
@@ -1490,6 +1562,7 @@ var Server = class {
1490
1562
  });
1491
1563
  return await this.handleResponse(res, response);
1492
1564
  });
1565
+ for (const handler of this.#beforeListenHandlers) await handler({ httpServer: this.#httpServer, port: config.port });
1493
1566
  const started = await this.startServer(config.port);
1494
1567
  if (started) Instance.get().log.info(`${instance.id}(${app.name}) service listening on port ${config.port}`);
1495
1568
  return started;
@@ -1641,6 +1714,7 @@ if (void 0) {
1641
1714
  const testInstanceState = globalThis;
1642
1715
  class TestServer extends Server {
1643
1716
  handledResponse = null;
1717
+ startedPorts = [];
1644
1718
  notFoundHandler = null;
1645
1719
  constructor() {
1646
1720
  super();
@@ -1685,7 +1759,8 @@ if (void 0) {
1685
1759
  registerNotFoundHandler(cb) {
1686
1760
  this.notFoundHandler = cb;
1687
1761
  }
1688
- async startServer() {
1762
+ async startServer(port) {
1763
+ this.startedPorts.push(port);
1689
1764
  return true;
1690
1765
  }
1691
1766
  async dispatchNotFound(path) {
@@ -1696,6 +1771,43 @@ if (void 0) {
1696
1771
  return { handledResponse: this.handledResponse, rawResponse };
1697
1772
  }
1698
1773
  }
1774
+ describe("Server before-listen handlers", () => {
1775
+ test("runs before-listen handlers before adapter listen in registration order", async () => {
1776
+ ensureTestInstance();
1777
+ const server = new TestServer();
1778
+ const calls = [];
1779
+ let receivedServer = null;
1780
+ server.onBeforeListen(({ httpServer, port }) => {
1781
+ calls.push(`first:${port}`);
1782
+ receivedServer = httpServer;
1783
+ expect(server.startedPorts).toEqual([]);
1784
+ }).onBeforeListen(({ httpServer, port }) => {
1785
+ calls.push(`second:${port}`);
1786
+ expect(httpServer).toBe(receivedServer);
1787
+ expect(server.startedPorts).toEqual([]);
1788
+ });
1789
+ await server.start();
1790
+ expect(calls).toEqual(["first:0", "second:0"]);
1791
+ expect(receivedServer).toBeInstanceOf(http.Server);
1792
+ expect(server.startedPorts).toEqual([0]);
1793
+ });
1794
+ test("rejects startup when a before-listen handler fails before adapter listen", async () => {
1795
+ ensureTestInstance();
1796
+ const server = new TestServer();
1797
+ server.onBeforeListen(async () => {
1798
+ throw new Error("before-listen failed");
1799
+ });
1800
+ await expect(server.start()).rejects.toThrow("before-listen failed");
1801
+ expect(server.startedPorts).toEqual([]);
1802
+ });
1803
+ test("rejects adding before-listen handlers after server startup", async () => {
1804
+ ensureTestInstance();
1805
+ const server = new TestServer();
1806
+ await server.start();
1807
+ expect(() => server.onBeforeListen(() => {
1808
+ })).toThrow("Cannot add before-listen handler after server has started");
1809
+ });
1810
+ });
1699
1811
  describe("Server not-found handler", () => {
1700
1812
  test("throws the default Equipped not-found error when no custom handler is set", async () => {
1701
1813
  ensureTestInstance();