clear-router 2.3.5 → 2.5.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/README.md CHANGED
@@ -49,6 +49,7 @@ yarn add clear-router express
49
49
  - Function handlers always receive context as first argument
50
50
  - Controller handlers receive hydrated `this.body`, `this.query`, `this.params`, and `this.clearRequest`
51
51
  - `clearRequest` is passed as second handler argument for controller handlers
52
+ - Route handlers can return response values directly across Express, Fastify, Hono, and H3
52
53
  - Auto-binds controller methods
53
54
  - Full CommonJS, ESM, and TypeScript support
54
55
  - Error handling delegated to Express | H3 | Fastify | Hono
@@ -1,4 +1,4 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_router = require('../router-C-c43ybe.cjs');
2
+ const require_router = require('../router-Cxi21bzi.cjs');
3
3
 
4
4
  exports.CoreRouter = require_router.CoreRouter;
@@ -1,2 +1,2 @@
1
- import { t as CoreRouter } from "../router-DhF8f80v.mjs";
1
+ import { t as CoreRouter } from "../router-CVeqd7Ro.mjs";
2
2
  export { CoreRouter };
@@ -1,3 +1,3 @@
1
- import { t as CoreRouter } from "../router-CHaZi7NS.mjs";
1
+ import { t as CoreRouter } from "../router-Dxc8FQOl.mjs";
2
2
 
3
3
  export { CoreRouter };
@@ -1,5 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_router = require('../router-C-c43ybe.cjs');
2
+ const require_router = require('../router-Cxi21bzi.cjs');
3
+ const require_responses = require('../responses-r-O3jS-S.cjs');
3
4
 
4
5
  //#region src/express/router.ts
5
6
  /**
@@ -14,6 +15,31 @@ var Router = class Router extends require_router.CoreRouter {
14
15
  static ensureRequestBodyAccessor(req) {
15
16
  if (typeof req.getBody !== "function") req.getBody = () => req.body ?? {};
16
17
  }
18
+ static async sendReturnValue(req, res, value, method, path) {
19
+ if (require_responses.responseWasSent(res) || value === res || require_responses.responseWasSent(value)) return;
20
+ const meta = require_responses.resolveResponseMeta(value, {
21
+ headers: req.headers,
22
+ method,
23
+ path
24
+ });
25
+ if (!meta) return;
26
+ res.status(meta.status);
27
+ if (require_responses.isFetchResponse(meta.body)) {
28
+ meta.body.headers.forEach((headerValue, key) => {
29
+ res.setHeader(key, headerValue);
30
+ });
31
+ res.status(meta.body.status);
32
+ const body = Buffer.from(await meta.body.arrayBuffer());
33
+ res.send(body);
34
+ return;
35
+ }
36
+ if (meta.contentType && !res.getHeader("Content-Type")) res.setHeader("Content-Type", meta.contentType);
37
+ if (meta.isEmpty) {
38
+ res.sendStatus(meta.status);
39
+ return;
40
+ }
41
+ res.send(meta.body);
42
+ }
17
43
  /**
18
44
  * Adds a new route to the router with the specified HTTP methods, path, handler, and optional middlewares.
19
45
  *
@@ -178,7 +204,8 @@ var Router = class Router extends require_router.CoreRouter {
178
204
  params: ctx.req.params
179
205
  });
180
206
  const result = handlerFunction(ctx, inst.clearRequest);
181
- await Promise.resolve(result);
207
+ const resolved = await Promise.resolve(result);
208
+ await Router.sendReturnValue(req, res, resolved, method, route.path);
182
209
  } catch (error) {
183
210
  next(error);
184
211
  }
@@ -207,7 +234,8 @@ var Router = class Router extends require_router.CoreRouter {
207
234
  params: ctx.req.params
208
235
  });
209
236
  const result = handlerFunction(ctx, inst.clearRequest);
210
- await Promise.resolve(result);
237
+ const resolved = await Promise.resolve(result);
238
+ await Router.sendReturnValue(req, res, resolved, method, route.path);
211
239
  } catch (error) {
212
240
  next(error);
213
241
  }
@@ -12,6 +12,7 @@ import { Router as Router$1 } from "express";
12
12
  declare class Router extends CoreRouter {
13
13
  protected static routerStateNamespace: string;
14
14
  private static ensureRequestBodyAccessor;
15
+ private static sendReturnValue;
15
16
  /**
16
17
  * Adds a new route to the router with the specified HTTP methods, path, handler, and optional middlewares.
17
18
  *
@@ -1,4 +1,4 @@
1
- import { c as Handler, d as ApiResourceMiddleware, f as ControllerAction, l as HttpContext, m as HttpMethod, r as Route, t as CoreRouter, u as Middleware } from "../router-DhF8f80v.mjs";
1
+ import { c as Handler, d as ApiResourceMiddleware, f as ControllerAction, l as HttpContext, m as HttpMethod, r as Route, t as CoreRouter, u as Middleware } from "../router-CVeqd7Ro.mjs";
2
2
  import { Router as Router$1 } from "express";
3
3
 
4
4
  //#region src/express/router.d.ts
@@ -12,6 +12,7 @@ import { Router as Router$1 } from "express";
12
12
  declare class Router extends CoreRouter {
13
13
  protected static routerStateNamespace: string;
14
14
  private static ensureRequestBodyAccessor;
15
+ private static sendReturnValue;
15
16
  /**
16
17
  * Adds a new route to the router with the specified HTTP methods, path, handler, and optional middlewares.
17
18
  *
@@ -1,4 +1,5 @@
1
- import { t as CoreRouter } from "../router-CHaZi7NS.mjs";
1
+ import { t as CoreRouter } from "../router-Dxc8FQOl.mjs";
2
+ import { n as resolveResponseMeta, r as responseWasSent, t as isFetchResponse } from "../responses-HOePPAl8.mjs";
2
3
 
3
4
  //#region src/express/router.ts
4
5
  /**
@@ -13,6 +14,31 @@ var Router = class Router extends CoreRouter {
13
14
  static ensureRequestBodyAccessor(req) {
14
15
  if (typeof req.getBody !== "function") req.getBody = () => req.body ?? {};
15
16
  }
17
+ static async sendReturnValue(req, res, value, method, path) {
18
+ if (responseWasSent(res) || value === res || responseWasSent(value)) return;
19
+ const meta = resolveResponseMeta(value, {
20
+ headers: req.headers,
21
+ method,
22
+ path
23
+ });
24
+ if (!meta) return;
25
+ res.status(meta.status);
26
+ if (isFetchResponse(meta.body)) {
27
+ meta.body.headers.forEach((headerValue, key) => {
28
+ res.setHeader(key, headerValue);
29
+ });
30
+ res.status(meta.body.status);
31
+ const body = Buffer.from(await meta.body.arrayBuffer());
32
+ res.send(body);
33
+ return;
34
+ }
35
+ if (meta.contentType && !res.getHeader("Content-Type")) res.setHeader("Content-Type", meta.contentType);
36
+ if (meta.isEmpty) {
37
+ res.sendStatus(meta.status);
38
+ return;
39
+ }
40
+ res.send(meta.body);
41
+ }
16
42
  /**
17
43
  * Adds a new route to the router with the specified HTTP methods, path, handler, and optional middlewares.
18
44
  *
@@ -177,7 +203,8 @@ var Router = class Router extends CoreRouter {
177
203
  params: ctx.req.params
178
204
  });
179
205
  const result = handlerFunction(ctx, inst.clearRequest);
180
- await Promise.resolve(result);
206
+ const resolved = await Promise.resolve(result);
207
+ await Router.sendReturnValue(req, res, resolved, method, route.path);
181
208
  } catch (error) {
182
209
  next(error);
183
210
  }
@@ -206,7 +233,8 @@ var Router = class Router extends CoreRouter {
206
233
  params: ctx.req.params
207
234
  });
208
235
  const result = handlerFunction(ctx, inst.clearRequest);
209
- await Promise.resolve(result);
236
+ const resolved = await Promise.resolve(result);
237
+ await Router.sendReturnValue(req, res, resolved, method, route.path);
210
238
  } catch (error) {
211
239
  next(error);
212
240
  }
@@ -1,5 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_router = require('../router-C-c43ybe.cjs');
2
+ const require_router = require('../router-Cxi21bzi.cjs');
3
+ const require_responses = require('../responses-r-O3jS-S.cjs');
3
4
 
4
5
  //#region src/fastify/router.ts
5
6
  /**
@@ -13,6 +14,26 @@ var Router = class Router extends require_router.CoreRouter {
13
14
  static ensureRequestBodyAccessor(req) {
14
15
  if (typeof req.getBody !== "function") req.getBody = () => req.body ?? {};
15
16
  }
17
+ static async sendReturnValue(req, reply, value, method, path) {
18
+ if (require_responses.responseWasSent(reply) || value === reply || require_responses.responseWasSent(value)) return value;
19
+ const meta = require_responses.resolveResponseMeta(value, {
20
+ headers: req.headers,
21
+ method,
22
+ path
23
+ });
24
+ if (!meta) return void 0;
25
+ reply.code(meta.status);
26
+ if (require_responses.isFetchResponse(meta.body)) {
27
+ meta.body.headers.forEach((headerValue, key) => {
28
+ reply.header(key, headerValue);
29
+ });
30
+ reply.code(meta.body.status);
31
+ return reply.send(Buffer.from(await meta.body.arrayBuffer()));
32
+ }
33
+ if (meta.contentType) reply.type(meta.contentType);
34
+ if (meta.isEmpty) return reply.send();
35
+ return reply.send(meta.body);
36
+ }
16
37
  /**
17
38
  * Add a route to the router
18
39
  *
@@ -176,7 +197,8 @@ var Router = class Router extends require_router.CoreRouter {
176
197
  params: ctx.req.params ?? {}
177
198
  });
178
199
  const result = handlerFunction(ctx, inst.clearRequest);
179
- return await Promise.resolve(result);
200
+ const resolved = await Promise.resolve(result);
201
+ return Router.sendReturnValue(req, reply, resolved, method, route.path);
180
202
  }
181
203
  });
182
204
  if ([
@@ -201,7 +223,8 @@ var Router = class Router extends require_router.CoreRouter {
201
223
  params: ctx.req.params ?? {}
202
224
  });
203
225
  const result = handlerFunction(ctx, inst.clearRequest);
204
- return await Promise.resolve(result);
226
+ const resolved = await Promise.resolve(result);
227
+ return Router.sendReturnValue(req, reply, resolved, method, route.path);
205
228
  }
206
229
  });
207
230
  }
@@ -25,6 +25,7 @@ type FastifyApp = FastifyInstance;
25
25
  declare class Router extends CoreRouter {
26
26
  protected static routerStateNamespace: string;
27
27
  private static ensureRequestBodyAccessor;
28
+ private static sendReturnValue;
28
29
  /**
29
30
  * Add a route to the router
30
31
  *
@@ -1,4 +1,4 @@
1
- import { d as ApiResourceMiddleware, f as ControllerAction, m as HttpMethod, n as ClearRequest, p as ControllerHandler, r as Route, t as CoreRouter } from "../router-DhF8f80v.mjs";
1
+ import { d as ApiResourceMiddleware, f as ControllerAction, m as HttpMethod, n as ClearRequest, p as ControllerHandler, r as Route, t as CoreRouter } from "../router-CVeqd7Ro.mjs";
2
2
  import { FastifyInstance, FastifyReply, FastifyRequest } from "fastify";
3
3
 
4
4
  //#region types/fastify.d.ts
@@ -25,6 +25,7 @@ type FastifyApp = FastifyInstance;
25
25
  declare class Router extends CoreRouter {
26
26
  protected static routerStateNamespace: string;
27
27
  private static ensureRequestBodyAccessor;
28
+ private static sendReturnValue;
28
29
  /**
29
30
  * Add a route to the router
30
31
  *
@@ -1,4 +1,5 @@
1
- import { t as CoreRouter } from "../router-CHaZi7NS.mjs";
1
+ import { t as CoreRouter } from "../router-Dxc8FQOl.mjs";
2
+ import { n as resolveResponseMeta, r as responseWasSent, t as isFetchResponse } from "../responses-HOePPAl8.mjs";
2
3
 
3
4
  //#region src/fastify/router.ts
4
5
  /**
@@ -12,6 +13,26 @@ var Router = class Router extends CoreRouter {
12
13
  static ensureRequestBodyAccessor(req) {
13
14
  if (typeof req.getBody !== "function") req.getBody = () => req.body ?? {};
14
15
  }
16
+ static async sendReturnValue(req, reply, value, method, path) {
17
+ if (responseWasSent(reply) || value === reply || responseWasSent(value)) return value;
18
+ const meta = resolveResponseMeta(value, {
19
+ headers: req.headers,
20
+ method,
21
+ path
22
+ });
23
+ if (!meta) return void 0;
24
+ reply.code(meta.status);
25
+ if (isFetchResponse(meta.body)) {
26
+ meta.body.headers.forEach((headerValue, key) => {
27
+ reply.header(key, headerValue);
28
+ });
29
+ reply.code(meta.body.status);
30
+ return reply.send(Buffer.from(await meta.body.arrayBuffer()));
31
+ }
32
+ if (meta.contentType) reply.type(meta.contentType);
33
+ if (meta.isEmpty) return reply.send();
34
+ return reply.send(meta.body);
35
+ }
15
36
  /**
16
37
  * Add a route to the router
17
38
  *
@@ -175,7 +196,8 @@ var Router = class Router extends CoreRouter {
175
196
  params: ctx.req.params ?? {}
176
197
  });
177
198
  const result = handlerFunction(ctx, inst.clearRequest);
178
- return await Promise.resolve(result);
199
+ const resolved = await Promise.resolve(result);
200
+ return Router.sendReturnValue(req, reply, resolved, method, route.path);
179
201
  }
180
202
  });
181
203
  if ([
@@ -200,7 +222,8 @@ var Router = class Router extends CoreRouter {
200
222
  params: ctx.req.params ?? {}
201
223
  });
202
224
  const result = handlerFunction(ctx, inst.clearRequest);
203
- return await Promise.resolve(result);
225
+ const resolved = await Promise.resolve(result);
226
+ return Router.sendReturnValue(req, reply, resolved, method, route.path);
204
227
  }
205
228
  });
206
229
  }
package/dist/h3/index.cjs CHANGED
@@ -1,5 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_router = require('../router-C-c43ybe.cjs');
2
+ const require_router = require('../router-Cxi21bzi.cjs');
3
+ const require_responses = require('../responses-r-O3jS-S.cjs');
3
4
  let h3 = require("h3");
4
5
 
5
6
  //#region src/h3/router.ts
@@ -12,6 +13,21 @@ let h3 = require("h3");
12
13
  var Router = class Router extends require_router.CoreRouter {
13
14
  static routerStateNamespace = "clear-router:h3";
14
15
  static bodyCache = /* @__PURE__ */ new WeakMap();
16
+ static toResponse(ctx, value, method, path) {
17
+ const meta = require_responses.resolveResponseMeta(value, {
18
+ headers: ctx.req.headers,
19
+ method,
20
+ path,
21
+ status: typeof ctx.res.status === "number" && ctx.res.status !== 200 ? ctx.res.status : void 0
22
+ });
23
+ if (!meta) return void 0;
24
+ if (meta.isNativeResponse) return meta.body;
25
+ if (meta.contentType?.startsWith("application/json")) return Response.json(meta.body, { status: meta.status });
26
+ return new Response(meta.isEmpty ? null : meta.body, {
27
+ status: meta.status,
28
+ headers: meta.contentType ? { "Content-Type": meta.contentType } : void 0
29
+ });
30
+ }
15
31
  static async readBodyCached(ctx) {
16
32
  if (this.bodyCache.has(ctx)) {
17
33
  const cached = this.bodyCache.get(ctx);
@@ -191,7 +207,8 @@ var Router = class Router extends require_router.CoreRouter {
191
207
  params: (0, h3.getRouterParams)(ctx, { decode: true })
192
208
  });
193
209
  const result = handlerFunction(ctx, inst.clearRequest);
194
- return await Promise.resolve(result);
210
+ const resolved = await Promise.resolve(result);
211
+ return Router.toResponse(ctx, resolved, method, route.path);
195
212
  } catch (error) {
196
213
  return error;
197
214
  }
@@ -212,7 +229,8 @@ var Router = class Router extends require_router.CoreRouter {
212
229
  params: (0, h3.getRouterParams)(ctx, { decode: true })
213
230
  });
214
231
  const result = handlerFunction(ctx, inst.clearRequest);
215
- return await Promise.resolve(result);
232
+ const resolved = await Promise.resolve(result);
233
+ return Router.toResponse(ctx, resolved, method, route.path);
216
234
  } catch (error) {
217
235
  return error;
218
236
  }
@@ -11,6 +11,7 @@ import { H3 } from "h3";
11
11
  declare class Router extends CoreRouter {
12
12
  protected static routerStateNamespace: string;
13
13
  private static readonly bodyCache;
14
+ private static toResponse;
14
15
  private static readBodyCached;
15
16
  /**
16
17
  * Adds a new route to the router with the specified HTTP methods, path, handler, and optional middlewares.
@@ -1,4 +1,4 @@
1
- import { a as Handler, d as ApiResourceMiddleware, f as ControllerAction, i as H3App, m as HttpMethod, o as HttpContext, r as Route, s as Middleware, t as CoreRouter } from "../router-DhF8f80v.mjs";
1
+ import { a as Handler, d as ApiResourceMiddleware, f as ControllerAction, i as H3App, m as HttpMethod, o as HttpContext, r as Route, s as Middleware, t as CoreRouter } from "../router-CVeqd7Ro.mjs";
2
2
  import { H3 } from "h3";
3
3
 
4
4
  //#region src/h3/router.d.ts
@@ -11,6 +11,7 @@ import { H3 } from "h3";
11
11
  declare class Router extends CoreRouter {
12
12
  protected static routerStateNamespace: string;
13
13
  private static readonly bodyCache;
14
+ private static toResponse;
14
15
  private static readBodyCached;
15
16
  /**
16
17
  * Adds a new route to the router with the specified HTTP methods, path, handler, and optional middlewares.
package/dist/h3/index.mjs CHANGED
@@ -1,4 +1,5 @@
1
- import { t as CoreRouter } from "../router-CHaZi7NS.mjs";
1
+ import { t as CoreRouter } from "../router-Dxc8FQOl.mjs";
2
+ import { n as resolveResponseMeta } from "../responses-HOePPAl8.mjs";
2
3
  import { getQuery, getRouterParams, readBody } from "h3";
3
4
 
4
5
  //#region src/h3/router.ts
@@ -11,6 +12,21 @@ import { getQuery, getRouterParams, readBody } from "h3";
11
12
  var Router = class Router extends CoreRouter {
12
13
  static routerStateNamespace = "clear-router:h3";
13
14
  static bodyCache = /* @__PURE__ */ new WeakMap();
15
+ static toResponse(ctx, value, method, path) {
16
+ const meta = resolveResponseMeta(value, {
17
+ headers: ctx.req.headers,
18
+ method,
19
+ path,
20
+ status: typeof ctx.res.status === "number" && ctx.res.status !== 200 ? ctx.res.status : void 0
21
+ });
22
+ if (!meta) return void 0;
23
+ if (meta.isNativeResponse) return meta.body;
24
+ if (meta.contentType?.startsWith("application/json")) return Response.json(meta.body, { status: meta.status });
25
+ return new Response(meta.isEmpty ? null : meta.body, {
26
+ status: meta.status,
27
+ headers: meta.contentType ? { "Content-Type": meta.contentType } : void 0
28
+ });
29
+ }
14
30
  static async readBodyCached(ctx) {
15
31
  if (this.bodyCache.has(ctx)) {
16
32
  const cached = this.bodyCache.get(ctx);
@@ -190,7 +206,8 @@ var Router = class Router extends CoreRouter {
190
206
  params: getRouterParams(ctx, { decode: true })
191
207
  });
192
208
  const result = handlerFunction(ctx, inst.clearRequest);
193
- return await Promise.resolve(result);
209
+ const resolved = await Promise.resolve(result);
210
+ return Router.toResponse(ctx, resolved, method, route.path);
194
211
  } catch (error) {
195
212
  return error;
196
213
  }
@@ -211,7 +228,8 @@ var Router = class Router extends CoreRouter {
211
228
  params: getRouterParams(ctx, { decode: true })
212
229
  });
213
230
  const result = handlerFunction(ctx, inst.clearRequest);
214
- return await Promise.resolve(result);
231
+ const resolved = await Promise.resolve(result);
232
+ return Router.toResponse(ctx, resolved, method, route.path);
215
233
  } catch (error) {
216
234
  return error;
217
235
  }
@@ -1,5 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_router = require('../router-C-c43ybe.cjs');
2
+ const require_router = require('../router-Cxi21bzi.cjs');
3
+ const require_responses = require('../responses-r-O3jS-S.cjs');
3
4
 
4
5
  //#region src/hono/router.ts
5
6
  /**
@@ -11,13 +12,17 @@ const require_router = require('../router-C-c43ybe.cjs');
11
12
  var Router = class Router extends require_router.CoreRouter {
12
13
  static routerStateNamespace = "clear-router:hono";
13
14
  static bodyCache = /* @__PURE__ */ new WeakMap();
14
- static toResponse(ctx, value) {
15
- if (value instanceof Response) return value;
16
- if (typeof value === "undefined") return void 0;
17
- if (value === null) return ctx.body(null);
18
- if (typeof value === "string") return ctx.text(value);
19
- if (typeof value === "object") return ctx.json(value);
20
- return ctx.text(String(value));
15
+ static toResponse(ctx, value, method, path) {
16
+ const meta = require_responses.resolveResponseMeta(value, {
17
+ headers: ctx.req.header(),
18
+ method,
19
+ path
20
+ });
21
+ if (!meta) return void 0;
22
+ if (meta.isNativeResponse) return meta.body;
23
+ if (meta.isEmpty) return ctx.body(null, meta.status);
24
+ if (meta.contentType?.startsWith("application/json")) return ctx.json(meta.body, meta.status);
25
+ return ctx.body(meta.body, meta.status, meta.contentType ? { "Content-Type": meta.contentType } : void 0);
21
26
  }
22
27
  static getParams(ctx) {
23
28
  try {
@@ -198,7 +203,7 @@ var Router = class Router extends require_router.CoreRouter {
198
203
  });
199
204
  const result = handlerFunction(ctx, inst.clearRequest);
200
205
  const resolved = await Promise.resolve(result);
201
- return Router.toResponse(ctx, resolved);
206
+ return Router.toResponse(ctx, resolved, method, route.path);
202
207
  });
203
208
  if ([
204
209
  "put",
@@ -216,7 +221,7 @@ var Router = class Router extends require_router.CoreRouter {
216
221
  });
217
222
  const result = handlerFunction(ctx, inst.clearRequest);
218
223
  const resolved = await Promise.resolve(result);
219
- return Router.toResponse(ctx, resolved);
224
+ return Router.toResponse(ctx, resolved, method, route.path);
220
225
  });
221
226
  }
222
227
  }
@@ -1,4 +1,4 @@
1
- import { d as ApiResourceMiddleware, f as ControllerAction, m as HttpMethod, n as ClearRequest, p as ControllerHandler, r as Route, t as CoreRouter } from "../router-DhF8f80v.mjs";
1
+ import { d as ApiResourceMiddleware, f as ControllerAction, m as HttpMethod, n as ClearRequest, p as ControllerHandler, r as Route, t as CoreRouter } from "../router-CVeqd7Ro.mjs";
2
2
  import { Context, HonoRequest, MiddlewareHandler } from "hono";
3
3
 
4
4
  //#region types/hono.d.ts
@@ -1,4 +1,5 @@
1
- import { t as CoreRouter } from "../router-CHaZi7NS.mjs";
1
+ import { t as CoreRouter } from "../router-Dxc8FQOl.mjs";
2
+ import { n as resolveResponseMeta } from "../responses-HOePPAl8.mjs";
2
3
 
3
4
  //#region src/hono/router.ts
4
5
  /**
@@ -10,13 +11,17 @@ import { t as CoreRouter } from "../router-CHaZi7NS.mjs";
10
11
  var Router = class Router extends CoreRouter {
11
12
  static routerStateNamespace = "clear-router:hono";
12
13
  static bodyCache = /* @__PURE__ */ new WeakMap();
13
- static toResponse(ctx, value) {
14
- if (value instanceof Response) return value;
15
- if (typeof value === "undefined") return void 0;
16
- if (value === null) return ctx.body(null);
17
- if (typeof value === "string") return ctx.text(value);
18
- if (typeof value === "object") return ctx.json(value);
19
- return ctx.text(String(value));
14
+ static toResponse(ctx, value, method, path) {
15
+ const meta = resolveResponseMeta(value, {
16
+ headers: ctx.req.header(),
17
+ method,
18
+ path
19
+ });
20
+ if (!meta) return void 0;
21
+ if (meta.isNativeResponse) return meta.body;
22
+ if (meta.isEmpty) return ctx.body(null, meta.status);
23
+ if (meta.contentType?.startsWith("application/json")) return ctx.json(meta.body, meta.status);
24
+ return ctx.body(meta.body, meta.status, meta.contentType ? { "Content-Type": meta.contentType } : void 0);
20
25
  }
21
26
  static getParams(ctx) {
22
27
  try {
@@ -197,7 +202,7 @@ var Router = class Router extends CoreRouter {
197
202
  });
198
203
  const result = handlerFunction(ctx, inst.clearRequest);
199
204
  const resolved = await Promise.resolve(result);
200
- return Router.toResponse(ctx, resolved);
205
+ return Router.toResponse(ctx, resolved, method, route.path);
201
206
  });
202
207
  if ([
203
208
  "put",
@@ -215,7 +220,7 @@ var Router = class Router extends CoreRouter {
215
220
  });
216
221
  const result = handlerFunction(ctx, inst.clearRequest);
217
222
  const resolved = await Promise.resolve(result);
218
- return Router.toResponse(ctx, resolved);
223
+ return Router.toResponse(ctx, resolved, method, route.path);
219
224
  });
220
225
  }
221
226
  }
package/dist/index.cjs CHANGED
@@ -155,6 +155,11 @@ var CoreRouter = class {
155
155
  ctx.reply.code(204).send();
156
156
  return;
157
157
  }
158
+ if (ctx?.set && "status" in ctx) {
159
+ ctx.set("Allow", allow);
160
+ ctx.status = 204;
161
+ ctx.body = null;
162
+ }
158
163
  };
159
164
  }
160
165
  static config = { methodOverride: {
package/dist/index.mjs CHANGED
@@ -154,6 +154,11 @@ var CoreRouter = class {
154
154
  ctx.reply.code(204).send();
155
155
  return;
156
156
  }
157
+ if (ctx?.set && "status" in ctx) {
158
+ ctx.set("Allow", allow);
159
+ ctx.status = 204;
160
+ ctx.body = null;
161
+ }
157
162
  };
158
163
  }
159
164
  static config = { methodOverride: {