equipped 5.3.0-alpha.0 → 5.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/dist/cjs/server/adapters/express/index.cjs +266 -4
- package/dist/cjs/server/adapters/express/index.cjs.map +1 -1
- package/dist/cjs/server/adapters/express/index.min.cjs +7 -7
- package/dist/cjs/server/adapters/express/index.min.cjs.map +1 -1
- package/dist/cjs/server/adapters/fastify/index.cjs +269 -4
- package/dist/cjs/server/adapters/fastify/index.cjs.map +1 -1
- package/dist/cjs/server/adapters/fastify/index.min.cjs +7 -7
- package/dist/cjs/server/adapters/fastify/index.min.cjs.map +1 -1
- package/dist/cjs/server/index.cjs +215 -4
- package/dist/cjs/server/index.cjs.map +1 -1
- package/dist/cjs/server/index.min.cjs +7 -7
- package/dist/cjs/server/index.min.cjs.map +1 -1
- package/dist/esm/cache/adapters/in-memory/index.min.mjs +1 -1
- package/dist/esm/cache/adapters/in-memory/index.mjs +2 -2
- package/dist/esm/cache/adapters/redis/index.min.mjs +1 -1
- package/dist/esm/cache/adapters/redis/index.mjs +3 -3
- package/dist/esm/cache/index.min.mjs +1 -1
- package/dist/esm/cache/index.mjs +2 -2
- package/dist/esm/{chunk-WHIWTP2Z.min.mjs → chunk-4JLDXF7T.min.mjs} +2 -2
- package/dist/esm/{chunk-I4BB436E.mjs → chunk-4MXYZS5R.mjs} +2 -2
- package/dist/esm/{chunk-YTM6ZURZ.min.mjs → chunk-5VW3JAFR.min.mjs} +2 -2
- package/dist/esm/{chunk-YTHRK2PO.mjs → chunk-AKQBDYUO.mjs} +3 -3
- package/dist/esm/{chunk-MYGAF2AC.min.mjs → chunk-B5QQ32YY.min.mjs} +2 -2
- package/dist/esm/chunk-FLAPYQUT.min.mjs +32 -0
- package/dist/esm/chunk-FLAPYQUT.min.mjs.map +1 -0
- package/dist/esm/{chunk-KW3PBDFD.mjs → chunk-JH6EBXY4.mjs} +2 -2
- package/dist/esm/{chunk-2TCFNKRZ.mjs → chunk-MDQKODYQ.mjs} +216 -5
- package/dist/esm/chunk-MDQKODYQ.mjs.map +1 -0
- package/dist/esm/{chunk-ECBJ3NT3.min.mjs → chunk-PCAUXBAG.min.mjs} +2 -2
- package/dist/esm/{chunk-RIRBNBTC.mjs → chunk-PNZNNUMN.mjs} +3 -3
- package/dist/esm/{chunk-TWKHVLLT.mjs → chunk-PQCBVQL6.mjs} +2 -2
- package/dist/esm/{chunk-AUKXL4EA.min.mjs → chunk-QHLKB47N.min.mjs} +2 -2
- package/dist/esm/{chunk-6DW4GW3R.min.mjs → chunk-SGZNOYC3.min.mjs} +2 -2
- package/dist/esm/{chunk-6SB5M4XH.mjs → chunk-TVTYDU2D.mjs} +3 -3
- package/dist/esm/{chunk-IEBC3OWN.mjs → chunk-Z2TZ3KR7.mjs} +2 -2
- package/dist/esm/{chunk-OXI6IKAM.min.mjs → chunk-ZGMFFK6Y.min.mjs} +2 -2
- package/dist/esm/dbs/adapters/mongodb/index.min.mjs +1 -1
- package/dist/esm/dbs/adapters/mongodb/index.mjs +3 -3
- package/dist/esm/dbs/index.min.mjs +1 -1
- package/dist/esm/dbs/index.mjs +3 -3
- package/dist/esm/errors/index.min.mjs +1 -1
- package/dist/esm/errors/index.mjs +1 -1
- package/dist/esm/events/adapters/kafka/index.min.mjs +1 -1
- package/dist/esm/events/adapters/kafka/index.mjs +2 -2
- package/dist/esm/events/adapters/rabbitmq/index.min.mjs +1 -1
- package/dist/esm/events/adapters/rabbitmq/index.mjs +1 -1
- package/dist/esm/index.min.mjs +1 -1
- package/dist/esm/index.mjs +1 -1
- package/dist/esm/instance/index.min.mjs +1 -1
- package/dist/esm/instance/index.mjs +1 -1
- package/dist/esm/{introspection-Y7EXSYPD.mjs → introspection-32BRYKYY.mjs} +3 -3
- package/dist/esm/introspection-A72WMWE3.min.mjs +2 -0
- package/dist/esm/jobs/adapters/redis/index.min.mjs +1 -1
- package/dist/esm/jobs/adapters/redis/index.mjs +3 -3
- package/dist/esm/orm/adapters/in-memory/index.min.mjs +1 -1
- package/dist/esm/orm/adapters/in-memory/index.mjs +3 -3
- package/dist/esm/orm/adapters/json/index.min.mjs +1 -1
- package/dist/esm/orm/adapters/json/index.mjs +3 -3
- package/dist/esm/orm/adapters/mongodb/index.min.mjs +1 -1
- package/dist/esm/orm/adapters/mongodb/index.mjs +2 -2
- package/dist/esm/orm/adapters/postgresql/index.min.mjs +2 -2
- package/dist/esm/orm/adapters/postgresql/index.mjs +3 -3
- package/dist/esm/orm/index.min.mjs +1 -1
- package/dist/esm/orm/index.mjs +3 -3
- package/dist/esm/server/adapters/express/index.min.mjs +1 -1
- package/dist/esm/server/adapters/express/index.min.mjs.map +1 -1
- package/dist/esm/server/adapters/express/index.mjs +52 -1
- package/dist/esm/server/adapters/express/index.mjs.map +1 -1
- package/dist/esm/server/adapters/fastify/index.min.mjs +1 -1
- package/dist/esm/server/adapters/fastify/index.min.mjs.map +1 -1
- package/dist/esm/server/adapters/fastify/index.mjs +55 -1
- package/dist/esm/server/adapters/fastify/index.mjs.map +1 -1
- package/dist/esm/server/index.min.mjs +1 -1
- package/dist/esm/server/index.mjs +1 -1
- package/dist/esm/utilities/index.min.mjs +1 -1
- package/dist/esm/utilities/index.mjs +1 -1
- package/dist/esm/validations/index.min.mjs +1 -1
- package/dist/esm/validations/index.mjs +1 -1
- package/dist/types/{base-3PpBAx1K.d.ts → base-DVr0fHil.d.ts} +20 -2
- package/dist/types/cache/adapters/in-memory/index.js +2 -2
- package/dist/types/cache/adapters/redis/index.js +3 -3
- package/dist/types/cache/index.js +2 -2
- package/dist/types/{chunk-JZ2JTENY.js → chunk-3M4PBZAQ.js} +2 -2
- package/dist/types/{chunk-LWUMIHL4.js → chunk-3TKJGSCZ.js} +1 -1
- package/dist/types/{chunk-4LRJJSGG.js → chunk-65EHKCDZ.js} +2 -2
- package/dist/types/{chunk-A2MRYMCA.js → chunk-JQ2FWX4W.js} +1 -1
- package/dist/types/{chunk-H6JBLKX5.js → chunk-NJ2FHI3U.js} +2 -2
- package/dist/types/{chunk-XOU2A2Y6.js → chunk-OHFTQGQG.js} +1 -1
- package/dist/types/{chunk-IAHTILKJ.js → chunk-XGGGAEET.js} +1 -1
- package/dist/types/{chunk-32DMHN3G.js → chunk-YTY3EFNB.js} +215 -4
- package/dist/types/dbs/adapters/mongodb/index.js +3 -3
- package/dist/types/dbs/index.js +3 -3
- package/dist/types/errors/index.js +1 -1
- package/dist/types/events/adapters/kafka/index.js +2 -2
- package/dist/types/events/adapters/rabbitmq/index.js +1 -1
- package/dist/types/index.js +1 -1
- package/dist/types/instance/index.js +1 -1
- package/dist/types/{introspection-ZQCAW254.js → introspection-VOIU3XE6.js} +2 -2
- package/dist/types/jobs/adapters/redis/index.js +3 -3
- package/dist/types/orm/adapters/in-memory/index.js +3 -3
- package/dist/types/orm/adapters/json/index.js +3 -3
- package/dist/types/orm/adapters/mongodb/index.js +2 -2
- package/dist/types/orm/adapters/postgresql/index.js +3 -3
- package/dist/types/orm/index.js +3 -3
- package/dist/types/server/adapters/express/index.d.ts +3 -1
- package/dist/types/server/adapters/express/index.js +52 -1
- package/dist/types/server/adapters/fastify/index.d.ts +3 -1
- package/dist/types/server/adapters/fastify/index.js +55 -1
- package/dist/types/server/index.d.ts +2 -2
- package/dist/types/server/index.js +1 -1
- package/dist/types/utilities/index.js +1 -1
- package/dist/types/validations/index.js +1 -1
- package/package.json +2 -4
- package/dist/esm/chunk-2TCFNKRZ.mjs.map +0 -1
- package/dist/esm/chunk-LTDVZJYJ.min.mjs +0 -32
- package/dist/esm/chunk-LTDVZJYJ.min.mjs.map +0 -1
- package/dist/esm/introspection-GP3G26B6.min.mjs +0 -2
- /package/dist/esm/{chunk-WHIWTP2Z.min.mjs.map → chunk-4JLDXF7T.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-I4BB436E.mjs.map → chunk-4MXYZS5R.mjs.map} +0 -0
- /package/dist/esm/{chunk-YTM6ZURZ.min.mjs.map → chunk-5VW3JAFR.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-YTHRK2PO.mjs.map → chunk-AKQBDYUO.mjs.map} +0 -0
- /package/dist/esm/{chunk-MYGAF2AC.min.mjs.map → chunk-B5QQ32YY.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-KW3PBDFD.mjs.map → chunk-JH6EBXY4.mjs.map} +0 -0
- /package/dist/esm/{chunk-ECBJ3NT3.min.mjs.map → chunk-PCAUXBAG.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-RIRBNBTC.mjs.map → chunk-PNZNNUMN.mjs.map} +0 -0
- /package/dist/esm/{chunk-TWKHVLLT.mjs.map → chunk-PQCBVQL6.mjs.map} +0 -0
- /package/dist/esm/{chunk-AUKXL4EA.min.mjs.map → chunk-QHLKB47N.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-6DW4GW3R.min.mjs.map → chunk-SGZNOYC3.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-6SB5M4XH.mjs.map → chunk-TVTYDU2D.mjs.map} +0 -0
- /package/dist/esm/{chunk-IEBC3OWN.mjs.map → chunk-Z2TZ3KR7.mjs.map} +0 -0
- /package/dist/esm/{chunk-OXI6IKAM.min.mjs.map → chunk-ZGMFFK6Y.min.mjs.map} +0 -0
- /package/dist/esm/{introspection-GP3G26B6.min.mjs.map → introspection-32BRYKYY.mjs.map} +0 -0
- /package/dist/esm/{introspection-Y7EXSYPD.mjs.map → introspection-A72WMWE3.min.mjs.map} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
|
4
4
|
|
|
5
|
+
## [5.3.0](https://github.com/kevinand11/equipped/compare/v5.3.0-alpha.0...v5.3.0) (2026-06-19)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### Features
|
|
9
|
+
|
|
10
|
+
* **server:** add custom not found fallback ([6173b4f](https://github.com/kevinand11/equipped/commit/6173b4ffb7f14dd7f965507c972f9fb1434dc5d1))
|
|
11
|
+
|
|
5
12
|
## [5.3.0-alpha.0](https://github.com/kevinand11/equipped/compare/v5.2.9...v5.3.0-alpha.0) (2026-06-16)
|
|
6
13
|
|
|
7
14
|
|
|
@@ -68,6 +68,7 @@ var RequestError = class extends EquippedError {
|
|
|
68
68
|
};
|
|
69
69
|
|
|
70
70
|
// src/server/adapters/base.ts
|
|
71
|
+
var import_node_http = require("http");
|
|
71
72
|
var import_cors = require("@fastify/cors");
|
|
72
73
|
var import_cors2 = require("cors");
|
|
73
74
|
var import_socket = require("socket.io");
|
|
@@ -839,6 +840,22 @@ var serverConfigPipe = () => import_valleyed6.v.object({
|
|
|
839
840
|
),
|
|
840
841
|
socketsAuthMethods: import_valleyed6.v.defaults(import_valleyed6.v.array(import_valleyed6.v.instanceOf(BaseRequestAuthMethod)), [])
|
|
841
842
|
});
|
|
843
|
+
var rawResponseHandledSymbol = /* @__PURE__ */ Symbol("rawResponseHandled");
|
|
844
|
+
var rawResponseHandled = Object.freeze({ [rawResponseHandledSymbol]: true });
|
|
845
|
+
var rawResponseNotStartedMessage = "Raw not-found handler did not start or complete a response";
|
|
846
|
+
function isRawResponseHandled(input) {
|
|
847
|
+
return Boolean(input && typeof input === "object" && rawResponseHandledSymbol in input);
|
|
848
|
+
}
|
|
849
|
+
function hasRawResponseStarted(response) {
|
|
850
|
+
return response.headersSent || response.writableEnded;
|
|
851
|
+
}
|
|
852
|
+
function writeRawHandlerError(response, error) {
|
|
853
|
+
if (hasRawResponseStarted(response)) return;
|
|
854
|
+
response.statusCode = StatusCodes.BadRequest;
|
|
855
|
+
response.setHeader("Content-Type", "application/json");
|
|
856
|
+
const message = error instanceof Error ? error.message : `${error}`;
|
|
857
|
+
response.end(JSON.stringify([{ message }]));
|
|
858
|
+
}
|
|
842
859
|
var errorsSchemas = Object.entries(StatusCodes).filter(([, value]) => value > 399).map(([key, value]) => ({
|
|
843
860
|
status: value,
|
|
844
861
|
contentType: "application/json",
|
|
@@ -855,6 +872,8 @@ var Server = class {
|
|
|
855
872
|
#serverConfig;
|
|
856
873
|
#queue = [];
|
|
857
874
|
#routesByKey = /* @__PURE__ */ new Set();
|
|
875
|
+
#started = false;
|
|
876
|
+
#notFoundHandler = null;
|
|
858
877
|
setup(httpServer, config) {
|
|
859
878
|
this.#httpServer = httpServer;
|
|
860
879
|
this.#serverConfig = config;
|
|
@@ -904,10 +923,16 @@ var Server = class {
|
|
|
904
923
|
});
|
|
905
924
|
});
|
|
906
925
|
}
|
|
926
|
+
setNotFoundHandler(handler) {
|
|
927
|
+
if (this.#started) throw new EquippedError("Cannot set not-found handler after server has started", {});
|
|
928
|
+
this.#notFoundHandler = handler;
|
|
929
|
+
return this;
|
|
930
|
+
}
|
|
907
931
|
test() {
|
|
908
932
|
return (0, import_supertest.default)(this.#httpServer);
|
|
909
933
|
}
|
|
910
934
|
async start() {
|
|
935
|
+
this.#started = true;
|
|
911
936
|
const config = this.#serverConfig;
|
|
912
937
|
const instance = Instance.get();
|
|
913
938
|
const { app } = instance.settings;
|
|
@@ -921,10 +946,7 @@ var Server = class {
|
|
|
921
946
|
})
|
|
922
947
|
});
|
|
923
948
|
await Promise.all(this.#queue.map((cb) => cb()));
|
|
924
|
-
this.registerNotFoundHandler(async (req) =>
|
|
925
|
-
const request = await this.parseRequest(req);
|
|
926
|
-
throw new NotFoundError(`Route ${request.path} not found`);
|
|
927
|
-
});
|
|
949
|
+
this.registerNotFoundHandler(async (req, res) => await this.#handleNotFound(req, res));
|
|
928
950
|
this.registerErrorHandler(async (error, _, res) => {
|
|
929
951
|
if (!(error instanceof EquippedError)) Instance.get().log.error({ error }, "Uncaught error in route handler");
|
|
930
952
|
const response = error instanceof RequestError ? new Response({
|
|
@@ -943,6 +965,31 @@ var Server = class {
|
|
|
943
965
|
if (started) Instance.get().log.info(`${instance.id}(${app.name}) service listening on port ${config.port}`);
|
|
944
966
|
return started;
|
|
945
967
|
}
|
|
968
|
+
createNodeRawResponder(input) {
|
|
969
|
+
return async (handler) => {
|
|
970
|
+
input.beforeHandle?.();
|
|
971
|
+
try {
|
|
972
|
+
await handler(input.request, input.response);
|
|
973
|
+
} catch (error) {
|
|
974
|
+
if (!hasRawResponseStarted(input.response)) {
|
|
975
|
+
writeRawHandlerError(input.response, error);
|
|
976
|
+
return rawResponseHandled;
|
|
977
|
+
}
|
|
978
|
+
throw error;
|
|
979
|
+
}
|
|
980
|
+
if (!hasRawResponseStarted(input.response))
|
|
981
|
+
writeRawHandlerError(input.response, new EquippedError(rawResponseNotStartedMessage, {}));
|
|
982
|
+
return rawResponseHandled;
|
|
983
|
+
};
|
|
984
|
+
}
|
|
985
|
+
async #handleNotFound(req, res) {
|
|
986
|
+
const request = await this.parseRequest(req);
|
|
987
|
+
if (!this.#notFoundHandler) throw new NotFoundError(`Route ${request.path} not found`);
|
|
988
|
+
const result = await this.#notFoundHandler({ request, respondWithRaw: this.createRawResponder(req, res) });
|
|
989
|
+
if (isRawResponseHandled(result)) return;
|
|
990
|
+
if (result instanceof Response) return await this.handleResponse(res, result);
|
|
991
|
+
throw new EquippedError("Not-found handler must return a Response or respondWithRaw(...)", {});
|
|
992
|
+
}
|
|
946
993
|
#resolveSchema(method, schema) {
|
|
947
994
|
const defaultStatusCode = schema?.defaultStatusCode ?? StatusCodes.Ok;
|
|
948
995
|
const defaultContentType = schema?.defaultContentType ?? "application/json";
|
|
@@ -1033,6 +1080,170 @@ var Server = class {
|
|
|
1033
1080
|
};
|
|
1034
1081
|
}
|
|
1035
1082
|
};
|
|
1083
|
+
if (void 0) {
|
|
1084
|
+
let ensureTestInstance = function() {
|
|
1085
|
+
const instance = Instance.maybeGet() ?? Instance.create({ app: { name: "equipped-test" }, log: { level: "silent" } });
|
|
1086
|
+
if (!testInstanceState.__equippedTestInstanceAliased) {
|
|
1087
|
+
instance.alias("equipped-test");
|
|
1088
|
+
testInstanceState.__equippedTestInstanceAliased = true;
|
|
1089
|
+
}
|
|
1090
|
+
}, createRawResponse = function() {
|
|
1091
|
+
const chunks = [];
|
|
1092
|
+
return {
|
|
1093
|
+
statusCode: 200,
|
|
1094
|
+
headersSent: false,
|
|
1095
|
+
writableEnded: false,
|
|
1096
|
+
headers: {},
|
|
1097
|
+
setHeader(key, value) {
|
|
1098
|
+
this.headers[key] = value;
|
|
1099
|
+
},
|
|
1100
|
+
end(chunk) {
|
|
1101
|
+
if (chunk !== void 0) chunks.push(Buffer.isBuffer(chunk) ? chunk.toString("utf8") : String(chunk));
|
|
1102
|
+
this.headersSent = true;
|
|
1103
|
+
this.writableEnded = true;
|
|
1104
|
+
},
|
|
1105
|
+
body() {
|
|
1106
|
+
return chunks.join("");
|
|
1107
|
+
}
|
|
1108
|
+
};
|
|
1109
|
+
};
|
|
1110
|
+
ensureTestInstance2 = ensureTestInstance, createRawResponse2 = createRawResponse;
|
|
1111
|
+
const { describe, expect, test } = void 0;
|
|
1112
|
+
const testInstanceState = globalThis;
|
|
1113
|
+
class TestServer extends Server {
|
|
1114
|
+
handledResponse = null;
|
|
1115
|
+
notFoundHandler = null;
|
|
1116
|
+
constructor() {
|
|
1117
|
+
super();
|
|
1118
|
+
this.setup(http.createServer(), {
|
|
1119
|
+
port: 0,
|
|
1120
|
+
cors: void 0,
|
|
1121
|
+
eventBus: void 0,
|
|
1122
|
+
publicPath: void 0,
|
|
1123
|
+
healthPath: void 0,
|
|
1124
|
+
openapi: { docsVersion: "1.0.0", docsBaseUrl: ["/"], docsPath: "/__docs" },
|
|
1125
|
+
requests: {
|
|
1126
|
+
log: false,
|
|
1127
|
+
rateLimit: { enabled: false, periodInMs: 1, limit: 1 },
|
|
1128
|
+
slowdown: { enabled: false, periodInMs: 1, delayAfter: 1, delayInMs: 1 }
|
|
1129
|
+
},
|
|
1130
|
+
socketsAuthMethods: []
|
|
1131
|
+
});
|
|
1132
|
+
}
|
|
1133
|
+
async parseRequest(req) {
|
|
1134
|
+
return new Request2({
|
|
1135
|
+
ip: "127.0.0.1",
|
|
1136
|
+
body: {},
|
|
1137
|
+
cookies: {},
|
|
1138
|
+
params: {},
|
|
1139
|
+
query: {},
|
|
1140
|
+
method: Methods.get,
|
|
1141
|
+
path: req.path,
|
|
1142
|
+
headers: {},
|
|
1143
|
+
files: {}
|
|
1144
|
+
});
|
|
1145
|
+
}
|
|
1146
|
+
async handleResponse(_, response) {
|
|
1147
|
+
this.handledResponse = response;
|
|
1148
|
+
}
|
|
1149
|
+
createRawResponder(req, res) {
|
|
1150
|
+
return this.createNodeRawResponder({ request: req.rawRequest, response: res.rawResponse });
|
|
1151
|
+
}
|
|
1152
|
+
registerRoute() {
|
|
1153
|
+
}
|
|
1154
|
+
registerErrorHandler() {
|
|
1155
|
+
}
|
|
1156
|
+
registerNotFoundHandler(cb) {
|
|
1157
|
+
this.notFoundHandler = cb;
|
|
1158
|
+
}
|
|
1159
|
+
async startServer() {
|
|
1160
|
+
return true;
|
|
1161
|
+
}
|
|
1162
|
+
async dispatchNotFound(path) {
|
|
1163
|
+
if (!this.notFoundHandler) throw new Error("not-found handler was not registered");
|
|
1164
|
+
this.handledResponse = null;
|
|
1165
|
+
const rawResponse = createRawResponse();
|
|
1166
|
+
await this.notFoundHandler({ path, rawRequest: {} }, { rawResponse });
|
|
1167
|
+
return { handledResponse: this.handledResponse, rawResponse };
|
|
1168
|
+
}
|
|
1169
|
+
}
|
|
1170
|
+
describe("Server not-found handler", () => {
|
|
1171
|
+
test("throws the default Equipped not-found error when no custom handler is set", async () => {
|
|
1172
|
+
ensureTestInstance();
|
|
1173
|
+
const server = new TestServer();
|
|
1174
|
+
await server.start();
|
|
1175
|
+
await expect(server.dispatchNotFound("/missing")).rejects.toBeInstanceOf(NotFoundError);
|
|
1176
|
+
});
|
|
1177
|
+
test("allows a custom not-found handler to return an Equipped response", async () => {
|
|
1178
|
+
ensureTestInstance();
|
|
1179
|
+
const server = new TestServer();
|
|
1180
|
+
server.setNotFoundHandler(
|
|
1181
|
+
({ request }) => new Response({
|
|
1182
|
+
body: [{ message: `No route for ${request.path}` }],
|
|
1183
|
+
status: StatusCodes.NotFound,
|
|
1184
|
+
headers: {},
|
|
1185
|
+
cookies: {},
|
|
1186
|
+
contentType: "application/json"
|
|
1187
|
+
})
|
|
1188
|
+
);
|
|
1189
|
+
await server.start();
|
|
1190
|
+
const result = await server.dispatchNotFound("/custom");
|
|
1191
|
+
expect(result.handledResponse?.status).toBe(StatusCodes.NotFound);
|
|
1192
|
+
expect(result.handledResponse?.body).toEqual([{ message: "No route for /custom" }]);
|
|
1193
|
+
});
|
|
1194
|
+
test("allows a custom not-found handler to complete the response through a raw Node listener", async () => {
|
|
1195
|
+
ensureTestInstance();
|
|
1196
|
+
const server = new TestServer();
|
|
1197
|
+
server.setNotFoundHandler(
|
|
1198
|
+
({ respondWithRaw }) => respondWithRaw((_, response) => {
|
|
1199
|
+
response.statusCode = 203;
|
|
1200
|
+
response.end("raw fallback");
|
|
1201
|
+
})
|
|
1202
|
+
);
|
|
1203
|
+
await server.start();
|
|
1204
|
+
const result = await server.dispatchNotFound("/page");
|
|
1205
|
+
expect(result.handledResponse).toBeNull();
|
|
1206
|
+
expect(result.rawResponse.statusCode).toBe(203);
|
|
1207
|
+
expect(result.rawResponse.body()).toBe("raw fallback");
|
|
1208
|
+
});
|
|
1209
|
+
test("writes a clear raw error when a raw not-found handler does not start a response", async () => {
|
|
1210
|
+
ensureTestInstance();
|
|
1211
|
+
const server = new TestServer();
|
|
1212
|
+
server.setNotFoundHandler(({ respondWithRaw }) => respondWithRaw(() => {
|
|
1213
|
+
}));
|
|
1214
|
+
await server.start();
|
|
1215
|
+
const result = await server.dispatchNotFound("/page");
|
|
1216
|
+
expect(result.handledResponse).toBeNull();
|
|
1217
|
+
expect(result.rawResponse.statusCode).toBe(StatusCodes.BadRequest);
|
|
1218
|
+
expect(result.rawResponse.body()).toContain(rawResponseNotStartedMessage);
|
|
1219
|
+
});
|
|
1220
|
+
test("rejects a custom not-found handler result that is neither an Equipped response nor raw completion", async () => {
|
|
1221
|
+
ensureTestInstance();
|
|
1222
|
+
const server = new TestServer();
|
|
1223
|
+
server.setNotFoundHandler((() => void 0));
|
|
1224
|
+
await server.start();
|
|
1225
|
+
await expect(server.dispatchNotFound("/bad")).rejects.toThrow("Not-found handler must return a Response or respondWithRaw(...)");
|
|
1226
|
+
});
|
|
1227
|
+
test("rejects setting the custom not-found handler after server startup", async () => {
|
|
1228
|
+
ensureTestInstance();
|
|
1229
|
+
const server = new TestServer();
|
|
1230
|
+
await server.start();
|
|
1231
|
+
expect(
|
|
1232
|
+
() => server.setNotFoundHandler(
|
|
1233
|
+
() => new Response({
|
|
1234
|
+
body: null,
|
|
1235
|
+
status: StatusCodes.NotFound,
|
|
1236
|
+
headers: {},
|
|
1237
|
+
cookies: {},
|
|
1238
|
+
contentType: "application/json"
|
|
1239
|
+
})
|
|
1240
|
+
)
|
|
1241
|
+
).toThrow("Cannot set not-found handler after server has started");
|
|
1242
|
+
});
|
|
1243
|
+
});
|
|
1244
|
+
}
|
|
1245
|
+
var ensureTestInstance2;
|
|
1246
|
+
var createRawResponse2;
|
|
1036
1247
|
|
|
1037
1248
|
// src/errors/types/badRequestError.ts
|
|
1038
1249
|
var BadRequestError = class extends RequestError {
|
|
@@ -1678,6 +1889,9 @@ var ExpressServer = class extends configurable(serverConfigPipe, Server) {
|
|
|
1678
1889
|
response.body.pipe(res);
|
|
1679
1890
|
}
|
|
1680
1891
|
}
|
|
1892
|
+
createRawResponder(req, res) {
|
|
1893
|
+
return this.createNodeRawResponder({ request: req, response: res });
|
|
1894
|
+
}
|
|
1681
1895
|
registerRoute(method, path, cb) {
|
|
1682
1896
|
this.#app[method]?.(path, async (req, res) => cb(req, res));
|
|
1683
1897
|
}
|
|
@@ -1698,6 +1912,54 @@ var ExpressServer = class extends configurable(serverConfigPipe, Server) {
|
|
|
1698
1912
|
});
|
|
1699
1913
|
}
|
|
1700
1914
|
};
|
|
1915
|
+
if (void 0) {
|
|
1916
|
+
let ensureTestInstance = function() {
|
|
1917
|
+
const instance = Instance.maybeGet() ?? Instance.create({ app: { name: "equipped-test" }, log: { level: "silent" } });
|
|
1918
|
+
if (!testInstanceState.__equippedTestInstanceAliased) {
|
|
1919
|
+
instance.alias("equipped-test");
|
|
1920
|
+
testInstanceState.__equippedTestInstanceAliased = true;
|
|
1921
|
+
}
|
|
1922
|
+
}, createExpressResponse = function() {
|
|
1923
|
+
return {
|
|
1924
|
+
statusCode: 200,
|
|
1925
|
+
headersSent: false,
|
|
1926
|
+
writableEnded: false,
|
|
1927
|
+
setHeader: vi.fn(),
|
|
1928
|
+
end(chunk) {
|
|
1929
|
+
void chunk;
|
|
1930
|
+
this.headersSent = true;
|
|
1931
|
+
this.writableEnded = true;
|
|
1932
|
+
}
|
|
1933
|
+
};
|
|
1934
|
+
};
|
|
1935
|
+
ensureTestInstance2 = ensureTestInstance, createExpressResponse2 = createExpressResponse;
|
|
1936
|
+
const { describe, expect, test, vi } = void 0;
|
|
1937
|
+
const testInstanceState = globalThis;
|
|
1938
|
+
class TestExpressServer extends ExpressServer {
|
|
1939
|
+
exposeRawResponder(req, res) {
|
|
1940
|
+
return this.createRawResponder(req, res);
|
|
1941
|
+
}
|
|
1942
|
+
}
|
|
1943
|
+
describe("ExpressServer raw responder", () => {
|
|
1944
|
+
test("passes the Express request and response to the raw Node handler", async () => {
|
|
1945
|
+
ensureTestInstance();
|
|
1946
|
+
const server = TestExpressServer.create({ port: 0, requests: { log: false } });
|
|
1947
|
+
const req = { marker: "request" };
|
|
1948
|
+
const res = createExpressResponse();
|
|
1949
|
+
let received = null;
|
|
1950
|
+
await server.exposeRawResponder(
|
|
1951
|
+
req,
|
|
1952
|
+
res
|
|
1953
|
+
)(async (request, response) => {
|
|
1954
|
+
received = { request, response };
|
|
1955
|
+
response.end("ok");
|
|
1956
|
+
});
|
|
1957
|
+
expect(received).toEqual({ request: req, response: res });
|
|
1958
|
+
});
|
|
1959
|
+
});
|
|
1960
|
+
}
|
|
1961
|
+
var ensureTestInstance2;
|
|
1962
|
+
var createExpressResponse2;
|
|
1701
1963
|
// Annotate the CommonJS export names for ESM import in node:
|
|
1702
1964
|
0 && (module.exports = {
|
|
1703
1965
|
ExpressServer
|