@asenajs/hono-adapter 1.4.0 → 1.5.1
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 +2 -2
- package/dist/lib/HonoAdapter.d.ts +49 -4
- package/dist/lib/HonoAdapter.js +209 -51
- package/dist/lib/HonoAdapter.js.map +1 -1
- package/dist/lib/HonoContextWrapper.d.ts +17 -3
- package/dist/lib/HonoContextWrapper.js +85 -2
- package/dist/lib/HonoContextWrapper.js.map +1 -1
- package/dist/lib/HonoWebsocketAdapter.d.ts +2 -16
- package/dist/lib/HonoWebsocketAdapter.js +26 -50
- package/dist/lib/HonoWebsocketAdapter.js.map +1 -1
- package/dist/lib/defaults/ValidationService.d.ts +4 -4
- package/dist/lib/middlewares/CorsMiddleware.d.ts +1 -1
- package/dist/lib/middlewares/CorsMiddleware.js +5 -6
- package/dist/lib/middlewares/CorsMiddleware.js.map +1 -1
- package/dist/lib/middlewares/RateLimiterMiddleware.d.ts +1 -1
- package/dist/lib/middlewares/RateLimiterMiddleware.js +9 -7
- package/dist/lib/middlewares/RateLimiterMiddleware.js.map +1 -1
- package/dist/lib/types/HonoAdapterOptions.d.ts +27 -0
- package/dist/lib/types/HonoAdapterOptions.js +2 -0
- package/dist/lib/types/HonoAdapterOptions.js.map +1 -0
- package/dist/lib/types/SendPingStrategy.d.ts +4 -0
- package/dist/lib/types/SendPingStrategy.js +2 -0
- package/dist/lib/types/SendPingStrategy.js.map +1 -0
- package/dist/lib/types/index.d.ts +2 -0
- package/dist/lib/types/index.js +2 -0
- package/dist/lib/types/index.js.map +1 -1
- package/dist/lib/utils/createHonoAdapter.d.ts +2 -1
- package/dist/lib/utils/createHonoAdapter.js +9 -1
- package/dist/lib/utils/createHonoAdapter.js.map +1 -1
- package/dist/lib/utils/middlewareParser.d.ts +5 -1
- package/dist/lib/utils/middlewareParser.js +16 -6
- package/dist/lib/utils/middlewareParser.js.map +1 -1
- package/dist/lib/utils/routePriority.d.ts +40 -0
- package/dist/lib/utils/routePriority.js +75 -0
- package/dist/lib/utils/routePriority.js.map +1 -0
- package/package.json +16 -13
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
*
|
|
13
13
|
* **Usage in Asena Application:**
|
|
14
14
|
* ```typescript
|
|
15
|
-
* import { Middleware } from '@asenajs/asena/
|
|
15
|
+
* import { Middleware } from '@asenajs/asena/decorators';
|
|
16
16
|
* import { RateLimiterMiddleware } from '@asenajs/hono-adapter';
|
|
17
17
|
*
|
|
18
18
|
* // Create custom rate limiter for your needs
|
|
@@ -230,11 +230,10 @@ export class RateLimiterMiddleware extends MiddlewareService {
|
|
|
230
230
|
}
|
|
231
231
|
// Consume tokens
|
|
232
232
|
bucket.tokens -= requestCost;
|
|
233
|
-
// Set rate limit headers
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
honoContext.header('X-RateLimit-Reset', String(Math.floor(bucket.lastRefill / 1000 + 60)));
|
|
233
|
+
// Set rate limit headers via AsenaContext abstraction
|
|
234
|
+
context.setResponseHeader('X-RateLimit-Limit', String(Math.floor(this.refillRate * 60)));
|
|
235
|
+
context.setResponseHeader('X-RateLimit-Remaining', String(Math.floor(bucket.tokens)));
|
|
236
|
+
context.setResponseHeader('X-RateLimit-Reset', String(Math.floor(bucket.lastRefill / 1000 + 60)));
|
|
238
237
|
// Continue to next middleware/handler
|
|
239
238
|
return await next();
|
|
240
239
|
}
|
|
@@ -270,7 +269,10 @@ export class RateLimiterMiddleware extends MiddlewareService {
|
|
|
270
269
|
* @returns Client identifier
|
|
271
270
|
*/
|
|
272
271
|
defaultKeyGenerator(context) {
|
|
273
|
-
|
|
272
|
+
const req = context.req;
|
|
273
|
+
const forwarded = typeof req.header === 'function' ? req.header('x-forwarded-for') : context.headers?.['x-forwarded-for'];
|
|
274
|
+
const cfIp = typeof req.header === 'function' ? req.header('cf-connecting-ip') : context.headers?.['cf-connecting-ip'];
|
|
275
|
+
return forwarded || cfIp || context.getRequestIp?.() || 'unknown';
|
|
274
276
|
}
|
|
275
277
|
/**
|
|
276
278
|
* Setup automatic cleanup of inactive buckets
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RateLimiterMiddleware.js","sourceRoot":"","sources":["../../../lib/middlewares/RateLimiterMiddleware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AAEH,OAAO,EAAgB,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAoI9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,MAAM,OAAO,qBAAsB,SAAQ,iBAAiB;IAC1D;;;;OAIG;IACc,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAErD;;OAEG;IACc,QAAQ,CAAS;IAElC;;OAEG;IACc,UAAU,CAAS;IAEpC;;OAEG;IACc,YAAY,CAA+B;IAE5D;;OAEG;IACc,OAAO,CAAS;IAEjC;;OAEG;IACc,UAAU,CAAS;IAEpC;;OAEG;IACc,IAAI,CAA0C;IAE/D;;OAEG;IACc,IAAI,CAAiC;IAEtD;;OAEG;IACK,YAAY,CAAS;IAE7B;;OAEG;IACc,SAAS,CAAS;IAEnC;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,YAAmB,UAA8B,EAAE;QACjD,KAAK,EAAE,CAAC;QAER,sCAAsC;QACtC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,GAAG,CAAC;QACxC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;QAC3C,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChF,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,8CAA8C,CAAC;QACjF,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,GAAG,CAAC;QAC5C,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC,CAAC,aAAa;QAE3D,0BAA0B;QAC1B,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,KAAK,CAAC,CAAC,WAAW;QAErE,IAAI,eAAe,GAAG,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACI,KAAK,CAAC,MAAM,CAAC,OAAgB,EAAE,IAAyB;QAC7D,uBAAuB;QACvB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,OAAO,MAAM,IAAI,EAAE,CAAC;QACtB,CAAC;QAED,sBAAsB;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAEvC,uBAAuB;QACvB,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEnC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,GAAG;gBACP,MAAM,EAAE,IAAI,CAAC,QAAQ;gBACrB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;aACvB,CAAC;YACF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAChC,CAAC;QAED,sCAAsC;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,cAAc,GAAG,CAAC,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;QACxD,MAAM,WAAW,GAAG,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC;QAErD,sBAAsB;QACtB,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrE,MAAM,CAAC,UAAU,GAAG,GAAG,CAAC;QAExB,kCAAkC;QAClC,MAAM,WAAW,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAErF,uCAAuC;QACvC,IAAI,MAAM,CAAC,MAAM,GAAG,WAAW,EAAE,CAAC;YAChC,sBAAsB;YACtB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;YAE9E,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE;gBAChC,MAAM,EAAE,IAAI,CAAC,UAAU;gBACvB,OAAO,EAAE;oBACP,aAAa,EAAE,MAAM,CAAC,UAAU,CAAC;oBACjC,mBAAmB,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC,EAAE,sBAAsB;oBACrF,uBAAuB,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;oBAC1D,mBAAmB,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,GAAG,UAAU,CAAC,CAAC;iBAC/E;aACF,CAAC,CAAC;QACL,CAAC;QAED,iBAAiB;QACjB,MAAM,CAAC,MAAM,IAAI,WAAW,CAAC;QAE7B,
|
|
1
|
+
{"version":3,"file":"RateLimiterMiddleware.js","sourceRoot":"","sources":["../../../lib/middlewares/RateLimiterMiddleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { Hono } from 'hono';
|
|
2
|
+
import type { ServerLogger } from '@asenajs/asena/logger';
|
|
3
|
+
import type { HonoWebsocketAdapter } from '../HonoWebsocketAdapter';
|
|
4
|
+
export interface HonoAdapterOptions {
|
|
5
|
+
/**
|
|
6
|
+
* Logger instance for the adapter
|
|
7
|
+
*/
|
|
8
|
+
logger: ServerLogger;
|
|
9
|
+
/**
|
|
10
|
+
* Optional pre-configured Hono app instance.
|
|
11
|
+
* Use this to add custom middleware or configure Hono before Asena takes over.
|
|
12
|
+
*/
|
|
13
|
+
app?: Hono<any, any, any>;
|
|
14
|
+
/**
|
|
15
|
+
* Optional custom WebSocket adapter.
|
|
16
|
+
* Defaults to HonoWebsocketAdapter if not provided.
|
|
17
|
+
*/
|
|
18
|
+
websocketAdapter?: HonoWebsocketAdapter;
|
|
19
|
+
/**
|
|
20
|
+
* Hono strict mode for route matching.
|
|
21
|
+
* When false, `/health` and `/health/` match the same route.
|
|
22
|
+
* Default: true (Hono default)
|
|
23
|
+
*
|
|
24
|
+
* @see https://hono.dev/docs/api/hono#strict-mode
|
|
25
|
+
*/
|
|
26
|
+
strict?: boolean;
|
|
27
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HonoAdapterOptions.js","sourceRoot":"","sources":["../../../lib/types/HonoAdapterOptions.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SendPingStrategy.js","sourceRoot":"","sources":["../../../lib/types/SendPingStrategy.ts"],"names":[],"mappings":""}
|
package/dist/lib/types/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
import { HonoAdapter } from '../../index';
|
|
2
2
|
import type { ServerLogger } from '@asenajs/asena/logger';
|
|
3
|
-
|
|
3
|
+
import type { HonoAdapterOptions } from '../types/HonoAdapterOptions';
|
|
4
|
+
export declare const createHonoAdapter: (loggerOrOptions?: ServerLogger | Partial<HonoAdapterOptions>) => [HonoAdapter, ServerLogger];
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import { HonoAdapter } from '../../index';
|
|
2
|
-
export const createHonoAdapter = (
|
|
2
|
+
export const createHonoAdapter = (loggerOrOptions) => {
|
|
3
|
+
if (loggerOrOptions && typeof loggerOrOptions === 'object' && 'logger' in loggerOrOptions) {
|
|
4
|
+
const logger = loggerOrOptions.logger;
|
|
5
|
+
return [
|
|
6
|
+
new HonoAdapter(loggerOrOptions),
|
|
7
|
+
logger,
|
|
8
|
+
];
|
|
9
|
+
}
|
|
10
|
+
const logger = loggerOrOptions;
|
|
3
11
|
return [new HonoAdapter(logger), logger];
|
|
4
12
|
};
|
|
5
13
|
//# sourceMappingURL=createHonoAdapter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createHonoAdapter.js","sourceRoot":"","sources":["../../../lib/utils/createHonoAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"createHonoAdapter.js","sourceRoot":"","sources":["../../../lib/utils/createHonoAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAI1C,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,eAA4D,EAC/B,EAAE;IAC/B,IAAI,eAAe,IAAI,OAAO,eAAe,KAAK,QAAQ,IAAI,QAAQ,IAAI,eAAe,EAAE,CAAC;QAC1F,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC;QAEtC,OAAO;YACL,IAAI,WAAW,CAAC,eAAqC,CAAC;YACtD,MAAM;SACP,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,eAA+B,CAAC;IAE/C,OAAO,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;AAC3C,CAAC,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { Server } from 'bun';
|
|
1
2
|
import type { MiddlewareHandler } from 'hono';
|
|
2
3
|
import type { Context as HonoAdapterContext } from '../defaults';
|
|
3
4
|
import type { BaseMiddleware } from '@asenajs/asena/adapter';
|
|
@@ -6,5 +7,8 @@ import type { BaseMiddleware } from '@asenajs/asena/adapter';
|
|
|
6
7
|
* - Reuses context wrappers when possible
|
|
7
8
|
* - Handles middleware return values (false stops pipeline)
|
|
8
9
|
* - Adds error handling
|
|
10
|
+
*
|
|
11
|
+
* @param middlewares - Asena middlewares to convert
|
|
12
|
+
* @param getServer - Lazy server getter (server available at request time, not registration time)
|
|
9
13
|
*/
|
|
10
|
-
export declare const middlewareParser: (middlewares: BaseMiddleware<HonoAdapterContext>[]) => MiddlewareHandler[];
|
|
14
|
+
export declare const middlewareParser: (middlewares: BaseMiddleware<HonoAdapterContext>[], getServer?: () => Server<never> | undefined) => MiddlewareHandler[];
|
|
@@ -5,8 +5,11 @@ import { createFactory } from 'hono/factory';
|
|
|
5
5
|
* - Reuses context wrappers when possible
|
|
6
6
|
* - Handles middleware return values (false stops pipeline)
|
|
7
7
|
* - Adds error handling
|
|
8
|
+
*
|
|
9
|
+
* @param middlewares - Asena middlewares to convert
|
|
10
|
+
* @param getServer - Lazy server getter (server available at request time, not registration time)
|
|
8
11
|
*/
|
|
9
|
-
export const middlewareParser = (middlewares) => {
|
|
12
|
+
export const middlewareParser = (middlewares, getServer) => {
|
|
10
13
|
const factory = createFactory();
|
|
11
14
|
return middlewares.map((middleware) => {
|
|
12
15
|
if (middleware.override) {
|
|
@@ -17,21 +20,28 @@ export const middlewareParser = (middlewares) => {
|
|
|
17
20
|
// Reuse wrapper if already exists in context (performance optimization)
|
|
18
21
|
let wrapper = context.get('_asenaContextWrapper');
|
|
19
22
|
if (!wrapper) {
|
|
20
|
-
wrapper = new HonoContextWrapper(context);
|
|
23
|
+
wrapper = new HonoContextWrapper(context, getServer?.());
|
|
21
24
|
context.set('_asenaContextWrapper', wrapper);
|
|
22
25
|
}
|
|
23
26
|
// eslint-disable-next-line no-useless-catch
|
|
24
27
|
try {
|
|
25
28
|
// Call middleware handler
|
|
26
29
|
const result = await middleware.handle(wrapper, next);
|
|
27
|
-
// If middleware returns false, stop the pipeline
|
|
30
|
+
// If middleware returns false, stop the pipeline and return 403
|
|
31
|
+
// (consistent with Ergenecore adapter behavior)
|
|
28
32
|
if (result === false) {
|
|
33
|
+
context.res = new Response('Forbidden', { status: 403 });
|
|
29
34
|
return;
|
|
30
35
|
}
|
|
31
|
-
// If middleware returns Response,
|
|
32
|
-
//
|
|
36
|
+
// If middleware returns Response, set it on the Hono context.
|
|
37
|
+
// Raw Response return may not propagate through factory.createMiddleware,
|
|
38
|
+
// so we set c.res directly to ensure Hono uses this response.
|
|
33
39
|
if (result instanceof Response) {
|
|
34
|
-
|
|
40
|
+
context.res = new Response(result.body, {
|
|
41
|
+
status: result.status,
|
|
42
|
+
headers: result.headers,
|
|
43
|
+
});
|
|
44
|
+
return;
|
|
35
45
|
}
|
|
36
46
|
// If middleware didn't call next(), we call it here
|
|
37
47
|
// Note: Hono middleware should handle next() calls properly
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middlewareParser.js","sourceRoot":"","sources":["../../../lib/utils/middlewareParser.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"middlewareParser.js","sourceRoot":"","sources":["../../../lib/utils/middlewareParser.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAI7C;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,WAAiD,EACjD,SAA2C,EACtB,EAAE;IACvB,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;IAEhC,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE;QACpC,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;YACxB,uEAAuE;YACvE,OAAO,CAAC,CAAU,EAAE,IAAc,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACpE,CAAC;QAED,OAAO,OAAO,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAgB,EAAE,IAAU,EAAE,EAAE;YACrE,wEAAwE;YACxE,IAAI,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAuB,CAAC;YAExE,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,GAAG,IAAI,kBAAkB,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;gBACzD,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,OAAO,CAAC,CAAC;YAC/C,CAAC;YAED,4CAA4C;YAC5C,IAAI,CAAC;gBACH,0BAA0B;gBAC1B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBAEtD,gEAAgE;gBAChE,gDAAgD;gBAChD,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;oBACrB,OAAO,CAAC,GAAG,GAAG,IAAI,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;oBAEzD,OAAO;gBACT,CAAC;gBAED,8DAA8D;gBAC9D,0EAA0E;gBAC1E,8DAA8D;gBAC9D,IAAI,MAAM,YAAY,QAAQ,EAAE,CAAC;oBAC/B,OAAO,CAAC,GAAG,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE;wBACtC,MAAM,EAAE,MAAM,CAAC,MAAM;wBACrB,OAAO,EAAE,MAAM,CAAC,OAAO;qBACxB,CAAC,CAAC;oBAEH,OAAO;gBACT,CAAC;gBAED,oDAAoD;gBACpD,4DAA4D;YAC9D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,oCAAoC;gBACpC,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Route priority sorting for Hono adapter.
|
|
3
|
+
*
|
|
4
|
+
* Hono matches routes in registration order — the first matching route wins.
|
|
5
|
+
* This utility sorts routes so that more specific (static) paths are registered
|
|
6
|
+
* before less specific (param, wildcard) paths, following the industry-standard
|
|
7
|
+
* priority hierarchy used by Fastify's find-my-way radix tree router.
|
|
8
|
+
*
|
|
9
|
+
* Priority hierarchy (highest to lowest):
|
|
10
|
+
* 1. Static segments (/count, /search)
|
|
11
|
+
* 2. Parametric segments (/:id, /:name)
|
|
12
|
+
* 3. Wildcard segments (/*, /**)
|
|
13
|
+
* 4. Longer (more specific) paths before shorter ones
|
|
14
|
+
*
|
|
15
|
+
* @see https://github.com/delvedor/find-my-way — Fastify's router priority algorithm
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Returns a priority score for a single path segment.
|
|
19
|
+
*
|
|
20
|
+
* @param segment - A single path segment (between slashes)
|
|
21
|
+
* @returns 0 for static, 1 for param, 2 for wildcard
|
|
22
|
+
*/
|
|
23
|
+
export declare function segmentScore(segment: string): number;
|
|
24
|
+
/**
|
|
25
|
+
* Compares two route paths for registration priority.
|
|
26
|
+
*
|
|
27
|
+
* Returns negative if `a` should be registered before `b` (higher priority),
|
|
28
|
+
* positive if `b` should be registered before `a`,
|
|
29
|
+
* 0 if they have equal priority.
|
|
30
|
+
*
|
|
31
|
+
* @param pathA - First route path
|
|
32
|
+
* @param pathB - Second route path
|
|
33
|
+
* @returns Comparison result for Array.sort()
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```typescript
|
|
37
|
+
* routes.sort((a, b) => compareRoutePriority(a.path, b.path));
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export declare function compareRoutePriority(pathA: string, pathB: string): number;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Route priority sorting for Hono adapter.
|
|
3
|
+
*
|
|
4
|
+
* Hono matches routes in registration order — the first matching route wins.
|
|
5
|
+
* This utility sorts routes so that more specific (static) paths are registered
|
|
6
|
+
* before less specific (param, wildcard) paths, following the industry-standard
|
|
7
|
+
* priority hierarchy used by Fastify's find-my-way radix tree router.
|
|
8
|
+
*
|
|
9
|
+
* Priority hierarchy (highest to lowest):
|
|
10
|
+
* 1. Static segments (/count, /search)
|
|
11
|
+
* 2. Parametric segments (/:id, /:name)
|
|
12
|
+
* 3. Wildcard segments (/*, /**)
|
|
13
|
+
* 4. Longer (more specific) paths before shorter ones
|
|
14
|
+
*
|
|
15
|
+
* @see https://github.com/delvedor/find-my-way — Fastify's router priority algorithm
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Returns a priority score for a single path segment.
|
|
19
|
+
*
|
|
20
|
+
* @param segment - A single path segment (between slashes)
|
|
21
|
+
* @returns 0 for static, 1 for param, 2 for wildcard
|
|
22
|
+
*/
|
|
23
|
+
export function segmentScore(segment) {
|
|
24
|
+
if (segment === '*' || segment.includes('*'))
|
|
25
|
+
return 2;
|
|
26
|
+
if (segment.startsWith(':'))
|
|
27
|
+
return 1;
|
|
28
|
+
return 0;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Compares two route paths for registration priority.
|
|
32
|
+
*
|
|
33
|
+
* Returns negative if `a` should be registered before `b` (higher priority),
|
|
34
|
+
* positive if `b` should be registered before `a`,
|
|
35
|
+
* 0 if they have equal priority.
|
|
36
|
+
*
|
|
37
|
+
* @param pathA - First route path
|
|
38
|
+
* @param pathB - Second route path
|
|
39
|
+
* @returns Comparison result for Array.sort()
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```typescript
|
|
43
|
+
* routes.sort((a, b) => compareRoutePriority(a.path, b.path));
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export function compareRoutePriority(pathA, pathB) {
|
|
47
|
+
const segA = pathA.split('/').filter(Boolean);
|
|
48
|
+
const segB = pathB.split('/').filter(Boolean);
|
|
49
|
+
// Wildcard paths always go last — a path containing * is less specific than any non-wildcard path
|
|
50
|
+
const aHasWildcard = segA.some((s) => s === '*' || s.includes('*'));
|
|
51
|
+
const bHasWildcard = segB.some((s) => s === '*' || s.includes('*'));
|
|
52
|
+
if (aHasWildcard && !bHasWildcard)
|
|
53
|
+
return 1;
|
|
54
|
+
if (!aHasWildcard && bHasWildcard)
|
|
55
|
+
return -1;
|
|
56
|
+
// Segment-by-segment comparison
|
|
57
|
+
const maxLen = Math.max(segA.length, segB.length);
|
|
58
|
+
for (let i = 0; i < maxLen; i++) {
|
|
59
|
+
const a = segA[i];
|
|
60
|
+
const b = segB[i];
|
|
61
|
+
// One path ran out of segments — longer path is more specific, goes first
|
|
62
|
+
if (!a && b)
|
|
63
|
+
return 1;
|
|
64
|
+
if (a && !b)
|
|
65
|
+
return -1;
|
|
66
|
+
const scoreA = segmentScore(a);
|
|
67
|
+
const scoreB = segmentScore(b);
|
|
68
|
+
// Different segment types at this position — lower score wins
|
|
69
|
+
if (scoreA !== scoreB)
|
|
70
|
+
return scoreA - scoreB;
|
|
71
|
+
}
|
|
72
|
+
// Identical priority — maintain original order (stable sort)
|
|
73
|
+
return 0;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=routePriority.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routePriority.js","sourceRoot":"","sources":["../../../lib/utils/routePriority.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,IAAI,OAAO,KAAK,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IAEvD,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IAEtC,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAa,EAAE,KAAa;IAC/D,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAE9C,kGAAkG;IAClG,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IACpE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IAEpE,IAAI,YAAY,IAAI,CAAC,YAAY;QAAE,OAAO,CAAC,CAAC;IAC5C,IAAI,CAAC,YAAY,IAAI,YAAY;QAAE,OAAO,CAAC,CAAC,CAAC;IAE7C,gCAAgC;IAChC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAElD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAElB,0EAA0E;QAC1E,IAAI,CAAC,CAAC,IAAI,CAAC;YAAE,OAAO,CAAC,CAAC;QACtB,IAAI,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC,CAAC;QAEvB,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QAE/B,8DAA8D;QAC9D,IAAI,MAAM,KAAK,MAAM;YAAE,OAAO,MAAM,GAAG,MAAM,CAAC;IAChD,CAAC;IAED,6DAA6D;IAC7D,OAAO,CAAC,CAAC;AACX,CAAC"}
|
package/package.json
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"README.md",
|
|
10
10
|
"LICENSE"
|
|
11
11
|
],
|
|
12
|
-
"version": "1.
|
|
12
|
+
"version": "1.5.1",
|
|
13
13
|
"author": "LibirSoft",
|
|
14
14
|
"repository": {
|
|
15
15
|
"type": "git",
|
|
@@ -31,26 +31,29 @@
|
|
|
31
31
|
"format": "prettier --write .",
|
|
32
32
|
"format:check": "prettier --check .",
|
|
33
33
|
"check": "bun run lint && bun run format:check",
|
|
34
|
-
"check:fix": "bun run lint:fix && bun run format"
|
|
34
|
+
"check:fix": "bun run lint:fix && bun run format",
|
|
35
|
+
"changeset": "changeset",
|
|
36
|
+
"version": "changeset version",
|
|
37
|
+
"release": "bun run build && changeset publish"
|
|
35
38
|
},
|
|
36
39
|
"devDependencies": {
|
|
37
|
-
"@asenajs/asena": "
|
|
38
|
-
"@changesets/cli": "^2.
|
|
40
|
+
"@asenajs/asena": "^0.7.0",
|
|
41
|
+
"@changesets/cli": "^2.30.0",
|
|
39
42
|
"@types/bun": "latest",
|
|
40
|
-
"@typescript-eslint/eslint-plugin": "^8.
|
|
41
|
-
"@typescript-eslint/parser": "^8.
|
|
42
|
-
"eslint": "^9.
|
|
43
|
+
"@typescript-eslint/eslint-plugin": "^8.58.0",
|
|
44
|
+
"@typescript-eslint/parser": "^8.58.0",
|
|
45
|
+
"eslint": "^9.39.4",
|
|
43
46
|
"eslint-config-prettier": "^9.1.2",
|
|
44
|
-
"prettier": "^3.
|
|
45
|
-
"typescript-eslint": "^8.
|
|
47
|
+
"prettier": "^3.8.1",
|
|
48
|
+
"typescript-eslint": "^8.58.0"
|
|
46
49
|
},
|
|
47
50
|
"peerDependencies": {
|
|
48
|
-
"@asenajs/asena": "^0.
|
|
51
|
+
"@asenajs/asena": "^0.7.0",
|
|
49
52
|
"typescript": "^5.8.2"
|
|
50
53
|
},
|
|
51
54
|
"dependencies": {
|
|
52
55
|
"@hono/zod-validator": "^0.4.3",
|
|
53
|
-
"hono": "^4.
|
|
54
|
-
"zod": "^3.
|
|
56
|
+
"hono": "^4.12.9",
|
|
57
|
+
"zod": "^4.3.6"
|
|
55
58
|
}
|
|
56
|
-
}
|
|
59
|
+
}
|