@devbro/neko-router 0.1.19 → 0.1.21
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/dist/cjs/index.d.ts +8 -1
- package/dist/cjs/index.js +42 -9
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/CompiledRoute.d.mts +1 -1
- package/dist/esm/Controller.d.mts +1 -1
- package/dist/esm/{Middleware-C8dxjlFD.d.mts → Middleware-CrHHdmO-.d.mts} +2 -1
- package/dist/esm/Middleware.d.mts +1 -1
- package/dist/esm/MiddlewareFactory.d.mts +1 -1
- package/dist/esm/Route.d.mts +4 -1
- package/dist/esm/Route.mjs +8 -0
- package/dist/esm/Route.mjs.map +1 -1
- package/dist/esm/Router.d.mts +4 -1
- package/dist/esm/Router.mjs +34 -9
- package/dist/esm/Router.mjs.map +1 -1
- package/dist/esm/helpers.d.mts +1 -1
- package/dist/esm/index.d.mts +1 -1
- package/dist/esm/types.d.mts +1 -1
- package/package.json +4 -4
package/dist/cjs/index.d.ts
CHANGED
|
@@ -26,12 +26,14 @@ type ControllerDecoratorOptions = {
|
|
|
26
26
|
};
|
|
27
27
|
type MiddlewareProvider = typeof Middleware | Middleware | ((request: Request, response: Response, next: () => Promise<void>) => Promise<void>);
|
|
28
28
|
type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS';
|
|
29
|
+
type RouteCheck = (req: Request, res: Response) => boolean;
|
|
29
30
|
|
|
30
31
|
declare class Route {
|
|
31
32
|
methods: HttpMethod[];
|
|
32
33
|
path: string;
|
|
33
34
|
handler: HandlerType;
|
|
34
35
|
private middlewares;
|
|
36
|
+
private checks;
|
|
35
37
|
private urlRegex;
|
|
36
38
|
constructor(methods: HttpMethod[], path: string, handler: HandlerType);
|
|
37
39
|
pathToRegex(path: string): RegExp;
|
|
@@ -61,6 +63,8 @@ declare class Route {
|
|
|
61
63
|
prependMiddleware(middlewares: MiddlewareProvider | MiddlewareProvider[]): this;
|
|
62
64
|
addMiddleware(middlewares: MiddlewareProvider | MiddlewareProvider[]): this;
|
|
63
65
|
getMiddlewares(): MiddlewareProvider[];
|
|
66
|
+
addCheck(checks: RouteCheck | RouteCheck[]): this;
|
|
67
|
+
getChecks(): RouteCheck[];
|
|
64
68
|
callHanlder(request: Request, response: Response): any;
|
|
65
69
|
}
|
|
66
70
|
|
|
@@ -121,9 +125,12 @@ declare function createParamDecorator(func: () => Promise<any> | (() => any)): P
|
|
|
121
125
|
|
|
122
126
|
declare class Router {
|
|
123
127
|
private middlewares;
|
|
128
|
+
private checks;
|
|
124
129
|
routes: Route[];
|
|
125
130
|
addRoute(methods: HttpMethod[], path: string, handler: HandlerType): Route;
|
|
126
131
|
getMiddlewares(): MiddlewareProvider[];
|
|
132
|
+
addCheck(checks: RouteCheck | RouteCheck[]): this;
|
|
133
|
+
getChecks(): RouteCheck[];
|
|
127
134
|
addController(controller: typeof BaseController): void;
|
|
128
135
|
addRouter(path: string, router: Router): void;
|
|
129
136
|
addGlobalMiddleware(middlewares: MiddlewareProvider | MiddlewareProvider[]): void;
|
|
@@ -138,4 +145,4 @@ declare class MiddlewareFactory {
|
|
|
138
145
|
|
|
139
146
|
declare function runNext(middlewares: Middleware[], req: Request, res: Response, final: (request: Request, response: Response) => Promise<void>): Promise<void>;
|
|
140
147
|
|
|
141
|
-
export { BaseController, CompiledRoute, Controller, type ControllerDecoratorOptions, Delete, Get, type HandlerType, type HttpMethod, type LexerToken, Middleware, MiddlewareFactory, type MiddlewareProvider, Options, Patch, Post, Put, type Request, type Response, Route, Router, createParamDecorator, runNext };
|
|
148
|
+
export { BaseController, CompiledRoute, Controller, type ControllerDecoratorOptions, Delete, Get, type HandlerType, type HttpMethod, type LexerToken, Middleware, MiddlewareFactory, type MiddlewareProvider, Options, Patch, Post, Put, type Request, type Response, Route, type RouteCheck, Router, createParamDecorator, runNext };
|
package/dist/cjs/index.js
CHANGED
|
@@ -302,6 +302,7 @@ var Route = class {
|
|
|
302
302
|
this.urlRegex = this.pathToRegex(path2);
|
|
303
303
|
}
|
|
304
304
|
middlewares = [];
|
|
305
|
+
checks = [];
|
|
305
306
|
urlRegex;
|
|
306
307
|
pathToRegex(path2) {
|
|
307
308
|
const lex = this.lexUrlPath(path2);
|
|
@@ -405,6 +406,13 @@ var Route = class {
|
|
|
405
406
|
getMiddlewares() {
|
|
406
407
|
return this.middlewares;
|
|
407
408
|
}
|
|
409
|
+
addCheck(checks) {
|
|
410
|
+
this.checks = this.checks.concat(checks);
|
|
411
|
+
return this;
|
|
412
|
+
}
|
|
413
|
+
getChecks() {
|
|
414
|
+
return [...this.checks];
|
|
415
|
+
}
|
|
408
416
|
callHanlder(request, response) {
|
|
409
417
|
return this.handler(request, response);
|
|
410
418
|
}
|
|
@@ -415,6 +423,7 @@ var import_path = __toESM(require("path"), 1);
|
|
|
415
423
|
var import_url_join = __toESM(require("url-join"), 1);
|
|
416
424
|
var Router = class {
|
|
417
425
|
middlewares = [];
|
|
426
|
+
checks = [];
|
|
418
427
|
routes = [];
|
|
419
428
|
addRoute(methods, path2, handler) {
|
|
420
429
|
const route = new Route(methods, path2, handler);
|
|
@@ -424,6 +433,13 @@ var Router = class {
|
|
|
424
433
|
getMiddlewares() {
|
|
425
434
|
return [...this.middlewares];
|
|
426
435
|
}
|
|
436
|
+
addCheck(checks) {
|
|
437
|
+
this.checks = this.checks.concat(checks);
|
|
438
|
+
return this;
|
|
439
|
+
}
|
|
440
|
+
getChecks() {
|
|
441
|
+
return [...this.checks];
|
|
442
|
+
}
|
|
427
443
|
addController(controller) {
|
|
428
444
|
const basePath = controller.basePath || "";
|
|
429
445
|
for (const route of controller.routes) {
|
|
@@ -437,7 +453,7 @@ var Router = class {
|
|
|
437
453
|
addRouter(path2, router) {
|
|
438
454
|
for (const route of router.routes) {
|
|
439
455
|
let path22 = (0, import_url_join.default)("/", path2, route.path);
|
|
440
|
-
this.addRoute(route.methods, path22, route.handler).addMiddleware(router.getMiddlewares()).addMiddleware(route.getMiddlewares());
|
|
456
|
+
this.addRoute(route.methods, path22, route.handler).addMiddleware(router.getMiddlewares()).addMiddleware(route.getMiddlewares()).addCheck(router.getChecks()).addCheck(route.getChecks());
|
|
441
457
|
}
|
|
442
458
|
}
|
|
443
459
|
addGlobalMiddleware(middlewares) {
|
|
@@ -462,16 +478,33 @@ var Router = class {
|
|
|
462
478
|
return rc;
|
|
463
479
|
}
|
|
464
480
|
getCompiledRoute(request, response) {
|
|
465
|
-
const
|
|
466
|
-
|
|
467
|
-
|
|
481
|
+
for (const check of this.checks) {
|
|
482
|
+
if (!check(request, response)) {
|
|
483
|
+
return void 0;
|
|
484
|
+
}
|
|
468
485
|
}
|
|
469
|
-
const
|
|
470
|
-
|
|
471
|
-
|
|
486
|
+
for (const route of this.routes) {
|
|
487
|
+
if (!route.test(request)) {
|
|
488
|
+
continue;
|
|
489
|
+
}
|
|
490
|
+
const match = route.match(request);
|
|
491
|
+
if (!match) {
|
|
492
|
+
continue;
|
|
493
|
+
}
|
|
494
|
+
let allChecksPass = true;
|
|
495
|
+
for (const check of route.getChecks()) {
|
|
496
|
+
if (!check(request, response)) {
|
|
497
|
+
allChecksPass = false;
|
|
498
|
+
break;
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
if (!allChecksPass) {
|
|
502
|
+
continue;
|
|
503
|
+
}
|
|
504
|
+
request.params = match.params;
|
|
505
|
+
return new CompiledRoute(route, request, response, this.middlewares);
|
|
472
506
|
}
|
|
473
|
-
|
|
474
|
-
return new CompiledRoute(route, request, response, this.middlewares);
|
|
507
|
+
return void 0;
|
|
475
508
|
}
|
|
476
509
|
};
|
|
477
510
|
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts","../../src/CompiledRoute.mts","../../src/Middleware.mts","../../src/MiddlewareFactory.mts","../../src/Controller.mts","../../src/Route.mts","../../src/Router.mts","../../src/helpers.mts"],"sourcesContent":["export * from './types.mjs';\nexport * from './CompiledRoute.mjs';\nexport * from './Controller.mjs';\nexport * from './Route.mjs';\nexport * from './Router.mjs';\nexport * from './Middleware.mjs';\nexport * from './MiddlewareFactory.mjs';\nexport * from './helpers.mjs';\n","import { Stream } from 'stream';\nimport { Middleware } from './Middleware.mjs';\nimport { MiddlewareFactory } from './MiddlewareFactory.mjs';\nimport { Route } from './Route.mjs';\nimport { HandlerType, MiddlewareProvider } from './types.mjs';\nimport { Request, Response } from './types.mjs';\nimport { isClass } from '@devbro/neko-helper';\n\nexport class CompiledRoute {\n constructor(\n public route: Route,\n public request: Request,\n public response: Response,\n public globalMiddlewares: MiddlewareProvider[] = []\n ) {\n this.prepareMiddlewares();\n }\n\n private middlewares: Middleware[] = [];\n\n getMiddlewares() {\n return this.middlewares;\n }\n\n private prepareMiddlewares() {\n this.middlewares = [];\n for (const middleware of [...this.globalMiddlewares, ...this.route.getMiddlewares()]) {\n if (middleware instanceof Middleware) {\n this.middlewares.push(middleware);\n } else if (isClass(middleware)) {\n this.middlewares.push((middleware as any).getInstance({}));\n } else if (typeof middleware === 'function') {\n this.middlewares.push(MiddlewareFactory.create(middleware as HandlerType));\n } else {\n throw new Error('Invalid middleware type');\n }\n }\n }\n\n async run() {\n return await this.runMiddlewares(this.middlewares, this.request, this.response);\n }\n\n prepareOutputJsonFormat<T>(obj: object | Array<any>): T {\n function traverse(value: any): any {\n if (value === undefined || value === null) {\n return null;\n }\n\n if (!value || typeof value !== 'object') {\n return value;\n }\n\n if (typeof value.toJson === 'function') {\n return traverse(value.toJson());\n }\n\n // to handle Date and other built-in types\n if (typeof value.toJSON === 'function') {\n return traverse(value.toJSON());\n }\n\n if (Array.isArray(value)) {\n return value.map(traverse);\n }\n\n const result: Record<string, any> = {};\n for (const key in value) {\n if (Object.prototype.hasOwnProperty.call(value, key)) {\n result[key] = traverse(value[key]);\n }\n }\n return result;\n }\n\n return traverse(obj);\n }\n\n convertToString(obj: any) {\n if (typeof obj === 'string') {\n return obj;\n } else if (obj instanceof Buffer) {\n return obj.toString();\n } else if (typeof obj === 'object') {\n return JSON.stringify(this.prepareOutputJsonFormat(obj));\n }\n return String(obj);\n }\n\n async processResponseBody(res: Response, controller_rc: any) {\n if (controller_rc && res.writableEnded) {\n throw new Error('cannot write to response, response has already ended');\n }\n\n if (res.writableEnded) {\n return;\n }\n\n if (controller_rc) {\n const header_content_type = res.getHeader('Content-Type');\n if (controller_rc instanceof Stream || Buffer.isBuffer(controller_rc)) {\n await this.writeAsync(res, controller_rc);\n } else if (!header_content_type && typeof controller_rc === 'object') {\n res.setHeader('Content-Type', 'application/json');\n res.write(this.convertToString(controller_rc));\n } else if (!header_content_type) {\n res.setHeader('Content-Type', 'text/plain');\n res.write(this.convertToString(controller_rc));\n } else {\n res.write(this.convertToString(controller_rc));\n }\n return;\n } else {\n res.statusCode = [200].includes(res.statusCode) ? 204 : res.statusCode;\n }\n }\n\n async writeAsync(res: any, chunk: any) {\n return new Promise((resolve, reject) => {\n const ok = res.write(chunk, (err: any) => {\n if (err) reject(err);\n });\n if (ok) {\n // write went through immediately\n resolve(0);\n } else {\n // wait for 'drain' when buffer is flushed\n res.once('drain', resolve);\n }\n });\n }\n\n async runMiddlewares(middlewares: Middleware[], req: Request, res: Response) {\n let index = 0;\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const me = this;\n\n async function next() {\n if (index >= middlewares.length) {\n const controller_rc = await me.route.callHanlder(req, res);\n await me.processResponseBody(res, controller_rc);\n return;\n }\n\n const middleware: Middleware | any = middlewares[index++];\n\n if (middleware instanceof Middleware) {\n await middleware.call(req, res, next);\n } else if (typeof middleware === 'function') {\n await middleware(req, res, next);\n } else {\n throw new Error('does not know how to run middleware');\n }\n }\n\n await next();\n }\n}\n","import { Request, Response } from './types.mjs';\n\nexport abstract class Middleware {\n protected constructor(params: any = {}) {}\n static getInstance(params: any): Middleware {\n throw new Error('Method not implemented. Please implement a static getInstance method.');\n }\n\n abstract call(req: Request, res: Response, next: () => Promise<void>): Promise<void>;\n}\n","import { Middleware } from './Middleware.mjs';\nimport { HandlerType, Request, Response } from './types.mjs';\n\nexport class MiddlewareFactory {\n public static create(func: HandlerType): Middleware {\n const cls = class extends Middleware {\n call(req: Request, res: Response, next: () => Promise<void>): Promise<void> {\n return func(req, res, next);\n }\n constructor(params: any = {}) {\n super(params);\n }\n };\n\n return new cls();\n }\n}\n","import { ControllerDecoratorOptions, HttpMethod, MiddlewareProvider } from './types.mjs';\n\nexport class BaseController {\n declare static routes: {\n methods: HttpMethod[];\n path: string;\n handler: string;\n middlewares: MiddlewareProvider[];\n }[];\n static basePath: string = '';\n static baseMiddlewares: MiddlewareProvider[];\n\n static getInstance() {\n return new this();\n }\n}\n\nexport function Controller(path: string, options: ControllerDecoratorOptions = {}): ClassDecorator {\n return function (target: any) {\n (target as any).routes = (target as any).routes || [];\n (target as any).basePath = path;\n (target as any).baseMiddlewares = options.middlewares || [];\n };\n}\n\nfunction createHttpDecorator(data: {\n methods: HttpMethod[];\n path: string;\n middlewares: MiddlewareProvider[];\n}): MethodDecorator {\n return function (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) {\n const ctor = target.constructor;\n if (!ctor.routes) ctor.routes = [];\n ctor.routes.push({\n methods: data.methods,\n path: data.path,\n handler: propertyKey,\n middlewares: data.middlewares || [],\n });\n\n const originalMethod = descriptor.value!;\n const paramKeys = Reflect.ownKeys(target.constructor);\n const methodName = propertyKey.toString();\n\n descriptor.value = async function (...args: any[]) {\n const paramCustomKeys = paramKeys.filter(\n (key) =>\n typeof key === 'string' && key.startsWith(`${methodName}:`) && key.endsWith(':custom')\n );\n for (const paramKey of paramCustomKeys) {\n const paramIndex = parseInt((paramKey as string).split(':')[1]);\n let method = Reflect.get(target.constructor, paramKey.toString());\n if (typeof paramIndex === 'number' && typeof method === 'function') {\n args[paramIndex] = await method();\n }\n }\n\n return originalMethod.apply(this, args);\n };\n };\n}\n\nexport function Get(\n data: { path?: string; middlewares?: MiddlewareProvider[] } = {}\n): MethodDecorator {\n return createHttpDecorator({\n methods: ['GET', 'HEAD'],\n path: data.path || '/',\n middlewares: data.middlewares || [],\n });\n}\n\nexport function Post(\n data: { path?: string; middlewares?: MiddlewareProvider[] } = {}\n): MethodDecorator {\n return createHttpDecorator({\n methods: ['POST'],\n path: data.path || '/',\n middlewares: data.middlewares || [],\n });\n}\n\nexport function Put(\n data: { path?: string; middlewares?: MiddlewareProvider[] } = {}\n): MethodDecorator {\n return createHttpDecorator({\n methods: ['PUT'],\n path: data.path || '/',\n middlewares: data.middlewares || [],\n });\n}\n\nexport function Patch(\n data: { path?: string; middlewares?: MiddlewareProvider[] } = {}\n): MethodDecorator {\n return createHttpDecorator({\n methods: ['PATCH'],\n path: data.path || '/',\n middlewares: data.middlewares || [],\n });\n}\n\nexport function Delete(\n data: { path?: string; middlewares?: MiddlewareProvider[] } = {}\n): MethodDecorator {\n return createHttpDecorator({\n methods: ['DELETE'],\n path: data.path || '/',\n middlewares: data.middlewares || [],\n });\n}\n\nexport function Options(\n data: { path?: string; middlewares?: MiddlewareProvider[] } = {}\n): MethodDecorator {\n return createHttpDecorator({\n methods: ['OPTIONS'],\n path: data.path || '/',\n middlewares: data.middlewares || [],\n });\n}\n\nexport function createParamDecorator(func: () => Promise<any> | (() => any)): ParameterDecorator {\n return function MyParamDecorator(\n target: Object,\n propertyKey: string | symbol | undefined,\n parameterIndex: number\n ) {\n Reflect.set(target.constructor, `${propertyKey?.toString()}:${parameterIndex}:custom`, func);\n };\n}\n","import { MiddlewareFactory } from './MiddlewareFactory.mjs';\nimport { HandlerType, HttpMethod, MiddlewareProvider } from './types.mjs';\nimport { LexerToken, Request, Response } from './types.mjs';\n\nexport class Route {\n private middlewares: MiddlewareProvider[] = [];\n private urlRegex: RegExp;\n constructor(\n public methods: HttpMethod[],\n public path: string,\n public handler: HandlerType\n ) {\n this.urlRegex = this.pathToRegex(path);\n }\n pathToRegex(path: string): RegExp {\n const lex = this.lexUrlPath(path);\n return this.tokensToRegex(lex);\n }\n\n lexUrlPath(path: string) {\n const tokens = [];\n let i = 0;\n\n while (i < path.length) {\n const char = path[i];\n\n if (char === '/') {\n tokens.push({ type: 'SLASH', value: '/' });\n i++;\n } else if (char === ':') {\n let start = i + 1;\n while (start < path.length && /[a-zA-Z0-9_]/.test(path[start])) {\n start++;\n }\n tokens.push({ type: 'PARAM', value: path.slice(i + 1, start) });\n i = start;\n } else if (char === '*') {\n let start = i + 1;\n while (start < path.length && /[a-zA-Z0-9_]/.test(path[start])) {\n start++;\n }\n tokens.push({ type: 'WILDCARD', value: path.slice(i + 1, start) });\n i = start;\n } else {\n let start = i;\n while (start < path.length && !['/', ':', '*'].includes(path[start])) {\n start++;\n }\n tokens.push({ type: 'TEXT', value: path.slice(i, start) });\n i = start;\n }\n }\n\n return tokens;\n }\n tokensToRegex(tokens: LexerToken[]) {\n const regexParts = [];\n\n for (const token of tokens) {\n if (token.type === 'SLASH') {\n regexParts.push('\\\\/');\n } else if (token.type === 'PARAM') {\n regexParts.push(`(?<${token.value}>[^\\\\/]+)`);\n } else if (token.type === 'WILDCARD') {\n regexParts.push('(.+)');\n } else if (token.type === 'TEXT') {\n regexParts.push(token.value.replace(/[-\\/\\\\^$.*+?()[\\]{}|]/g, '\\\\$&'));\n }\n }\n\n if (regexParts.length > 0 && regexParts[regexParts.length - 1] === '\\\\/') {\n regexParts[regexParts.length - 1] = '\\\\/?';\n } else {\n regexParts.push('\\\\/?');\n }\n\n return new RegExp(`^${regexParts.join('')}$`);\n }\n\n /**\n * to evaluadate if request is a match for this route\n * @param request http request\n * @returns return true if route is a match for this request\n */\n test(request: Request) {\n if (this.methods.indexOf(request.method as HttpMethod) === -1) {\n return false;\n }\n const url = new URL(request.url || '/', 'http://localhost');\n return this.testPath(url.pathname);\n }\n\n testPath(pathname: string) {\n return this.urlRegex.test(pathname);\n }\n\n /**\n * returns details of the match, otherwise it returns false\n * @param request the request to match\n * @returns object cotaining details of match including matched params\n */\n match(request: Request) {\n if (this.methods.indexOf(request.method as HttpMethod) === -1) {\n return false;\n }\n\n const url = new URL(request.url || '/', 'http://localhost');\n\n const r = this.urlRegex.exec(url.pathname);\n if (!r) {\n return false;\n }\n\n return {\n url,\n params: r.groups || {},\n };\n }\n\n prependMiddleware(middlewares: MiddlewareProvider | MiddlewareProvider[]) {\n this.middlewares = ([] as MiddlewareProvider[]).concat(middlewares, this.middlewares);\n return this;\n }\n\n addMiddleware(middlewares: MiddlewareProvider | MiddlewareProvider[]) {\n this.middlewares = this.middlewares.concat(middlewares);\n return this;\n }\n\n getMiddlewares() {\n return this.middlewares;\n }\n\n callHanlder(request: Request, response: Response) {\n return this.handler(request, response);\n }\n}\n","import { CompiledRoute } from './CompiledRoute.mjs';\nimport { BaseController } from './Controller.mjs';\nimport { MiddlewareFactory } from './MiddlewareFactory.mjs';\nimport { Route } from './Route.mjs';\nimport { HandlerType, HttpMethod, MiddlewareProvider } from './types.mjs';\nimport { Request, Response } from './types.mjs';\nimport path from 'path';\nimport urlJoin from 'url-join';\n\nexport class Router {\n private middlewares: MiddlewareProvider[] = [];\n routes: Route[] = [];\n addRoute(methods: HttpMethod[], path: string, handler: HandlerType) {\n const route: Route = new Route(methods, path, handler);\n this.routes.push(route);\n return route;\n }\n\n getMiddlewares() {\n return [...this.middlewares];\n }\n\n addController(controller: typeof BaseController) {\n const basePath = controller.basePath || '';\n for (const route of controller.routes) {\n const urlPath = path.join(basePath, route.path);\n this.addRoute(route.methods, urlPath, async (req: Request, res: Response) => {\n const controllerInstance = controller.getInstance();\n // @ts-ignore\n return await controllerInstance[route.handler]();\n }).addMiddleware([...controller.baseMiddlewares, ...route.middlewares]);\n }\n }\n\n addRouter(path: string, router: Router) {\n for (const route of router.routes) {\n let path2 = urlJoin('/', path, route.path);\n this.addRoute(route.methods, path2, route.handler)\n .addMiddleware(router.getMiddlewares())\n .addMiddleware(route.getMiddlewares());\n }\n }\n\n addGlobalMiddleware(middlewares: MiddlewareProvider | MiddlewareProvider[]) {\n this.middlewares = this.middlewares.concat(middlewares);\n }\n\n resolve(request: Request): Route | undefined {\n for (const route of this.routes) {\n if (route.test(request)) {\n return route;\n }\n }\n return undefined;\n }\n\n resolveMultiple(request: Request): Route[] {\n const rc: Route[] = [];\n const url = new URL(request.url || '/', 'http://localhost');\n for (const route of this.routes) {\n if (route.testPath(url.pathname)) {\n rc.push(route);\n }\n }\n return rc;\n }\n\n getCompiledRoute(request: Request, response: Response) {\n const route = this.resolve(request);\n if (!route) {\n return undefined;\n }\n const match = route.match(request);\n if (!match) {\n return undefined;\n }\n\n request.params = match.params;\n return new CompiledRoute(route, request, response, this.middlewares);\n }\n}\n","import { Middleware } from './Middleware.mjs';\nimport { Request, Response } from './types.mjs';\n\nexport async function runNext(\n middlewares: Middleware[],\n req: Request,\n res: Response,\n final: (request: Request, response: Response) => Promise<void>\n) {\n let index = 0;\n\n async function next() {\n if (index >= middlewares.length) {\n return await final(req, res);\n }\n\n const middleware: Middleware | any = middlewares[index++];\n\n if (middleware instanceof Middleware) {\n await middleware.call(req, res, next);\n } else if (typeof middleware === 'function') {\n await middleware(req, res, next);\n } else {\n throw new Error('does not know how to run middleware');\n }\n }\n\n await next();\n}\n"],"mappings":"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","names":["path","path","path","path2","urlJoin"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts","../../src/CompiledRoute.mts","../../src/Middleware.mts","../../src/MiddlewareFactory.mts","../../src/Controller.mts","../../src/Route.mts","../../src/Router.mts","../../src/helpers.mts"],"sourcesContent":["export * from './types.mjs';\nexport * from './CompiledRoute.mjs';\nexport * from './Controller.mjs';\nexport * from './Route.mjs';\nexport * from './Router.mjs';\nexport * from './Middleware.mjs';\nexport * from './MiddlewareFactory.mjs';\nexport * from './helpers.mjs';\n","import { Stream } from 'stream';\nimport { Middleware } from './Middleware.mjs';\nimport { MiddlewareFactory } from './MiddlewareFactory.mjs';\nimport { Route } from './Route.mjs';\nimport { HandlerType, MiddlewareProvider } from './types.mjs';\nimport { Request, Response } from './types.mjs';\nimport { isClass } from '@devbro/neko-helper';\n\nexport class CompiledRoute {\n constructor(\n public route: Route,\n public request: Request,\n public response: Response,\n public globalMiddlewares: MiddlewareProvider[] = []\n ) {\n this.prepareMiddlewares();\n }\n\n private middlewares: Middleware[] = [];\n\n getMiddlewares() {\n return this.middlewares;\n }\n\n private prepareMiddlewares() {\n this.middlewares = [];\n for (const middleware of [...this.globalMiddlewares, ...this.route.getMiddlewares()]) {\n if (middleware instanceof Middleware) {\n this.middlewares.push(middleware);\n } else if (isClass(middleware)) {\n this.middlewares.push((middleware as any).getInstance({}));\n } else if (typeof middleware === 'function') {\n this.middlewares.push(MiddlewareFactory.create(middleware as HandlerType));\n } else {\n throw new Error('Invalid middleware type');\n }\n }\n }\n\n async run() {\n return await this.runMiddlewares(this.middlewares, this.request, this.response);\n }\n\n prepareOutputJsonFormat<T>(obj: object | Array<any>): T {\n function traverse(value: any): any {\n if (value === undefined || value === null) {\n return null;\n }\n\n if (!value || typeof value !== 'object') {\n return value;\n }\n\n if (typeof value.toJson === 'function') {\n return traverse(value.toJson());\n }\n\n // to handle Date and other built-in types\n if (typeof value.toJSON === 'function') {\n return traverse(value.toJSON());\n }\n\n if (Array.isArray(value)) {\n return value.map(traverse);\n }\n\n const result: Record<string, any> = {};\n for (const key in value) {\n if (Object.prototype.hasOwnProperty.call(value, key)) {\n result[key] = traverse(value[key]);\n }\n }\n return result;\n }\n\n return traverse(obj);\n }\n\n convertToString(obj: any) {\n if (typeof obj === 'string') {\n return obj;\n } else if (obj instanceof Buffer) {\n return obj.toString();\n } else if (typeof obj === 'object') {\n return JSON.stringify(this.prepareOutputJsonFormat(obj));\n }\n return String(obj);\n }\n\n async processResponseBody(res: Response, controller_rc: any) {\n if (controller_rc && res.writableEnded) {\n throw new Error('cannot write to response, response has already ended');\n }\n\n if (res.writableEnded) {\n return;\n }\n\n if (controller_rc) {\n const header_content_type = res.getHeader('Content-Type');\n if (controller_rc instanceof Stream || Buffer.isBuffer(controller_rc)) {\n await this.writeAsync(res, controller_rc);\n } else if (!header_content_type && typeof controller_rc === 'object') {\n res.setHeader('Content-Type', 'application/json');\n res.write(this.convertToString(controller_rc));\n } else if (!header_content_type) {\n res.setHeader('Content-Type', 'text/plain');\n res.write(this.convertToString(controller_rc));\n } else {\n res.write(this.convertToString(controller_rc));\n }\n return;\n } else {\n res.statusCode = [200].includes(res.statusCode) ? 204 : res.statusCode;\n }\n }\n\n async writeAsync(res: any, chunk: any) {\n return new Promise((resolve, reject) => {\n const ok = res.write(chunk, (err: any) => {\n if (err) reject(err);\n });\n if (ok) {\n // write went through immediately\n resolve(0);\n } else {\n // wait for 'drain' when buffer is flushed\n res.once('drain', resolve);\n }\n });\n }\n\n async runMiddlewares(middlewares: Middleware[], req: Request, res: Response) {\n let index = 0;\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const me = this;\n\n async function next() {\n if (index >= middlewares.length) {\n const controller_rc = await me.route.callHanlder(req, res);\n await me.processResponseBody(res, controller_rc);\n return;\n }\n\n const middleware: Middleware | any = middlewares[index++];\n\n if (middleware instanceof Middleware) {\n await middleware.call(req, res, next);\n } else if (typeof middleware === 'function') {\n await middleware(req, res, next);\n } else {\n throw new Error('does not know how to run middleware');\n }\n }\n\n await next();\n }\n}\n","import { Request, Response } from './types.mjs';\n\nexport abstract class Middleware {\n protected constructor(params: any = {}) {}\n static getInstance(params: any): Middleware {\n throw new Error('Method not implemented. Please implement a static getInstance method.');\n }\n\n abstract call(req: Request, res: Response, next: () => Promise<void>): Promise<void>;\n}\n","import { Middleware } from './Middleware.mjs';\nimport { HandlerType, Request, Response } from './types.mjs';\n\nexport class MiddlewareFactory {\n public static create(func: HandlerType): Middleware {\n const cls = class extends Middleware {\n call(req: Request, res: Response, next: () => Promise<void>): Promise<void> {\n return func(req, res, next);\n }\n constructor(params: any = {}) {\n super(params);\n }\n };\n\n return new cls();\n }\n}\n","import { ControllerDecoratorOptions, HttpMethod, MiddlewareProvider } from './types.mjs';\n\nexport class BaseController {\n declare static routes: {\n methods: HttpMethod[];\n path: string;\n handler: string;\n middlewares: MiddlewareProvider[];\n }[];\n static basePath: string = '';\n static baseMiddlewares: MiddlewareProvider[];\n\n static getInstance() {\n return new this();\n }\n}\n\nexport function Controller(path: string, options: ControllerDecoratorOptions = {}): ClassDecorator {\n return function (target: any) {\n (target as any).routes = (target as any).routes || [];\n (target as any).basePath = path;\n (target as any).baseMiddlewares = options.middlewares || [];\n };\n}\n\nfunction createHttpDecorator(data: {\n methods: HttpMethod[];\n path: string;\n middlewares: MiddlewareProvider[];\n}): MethodDecorator {\n return function (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) {\n const ctor = target.constructor;\n if (!ctor.routes) ctor.routes = [];\n ctor.routes.push({\n methods: data.methods,\n path: data.path,\n handler: propertyKey,\n middlewares: data.middlewares || [],\n });\n\n const originalMethod = descriptor.value!;\n const paramKeys = Reflect.ownKeys(target.constructor);\n const methodName = propertyKey.toString();\n\n descriptor.value = async function (...args: any[]) {\n const paramCustomKeys = paramKeys.filter(\n (key) =>\n typeof key === 'string' && key.startsWith(`${methodName}:`) && key.endsWith(':custom')\n );\n for (const paramKey of paramCustomKeys) {\n const paramIndex = parseInt((paramKey as string).split(':')[1]);\n let method = Reflect.get(target.constructor, paramKey.toString());\n if (typeof paramIndex === 'number' && typeof method === 'function') {\n args[paramIndex] = await method();\n }\n }\n\n return originalMethod.apply(this, args);\n };\n };\n}\n\nexport function Get(\n data: { path?: string; middlewares?: MiddlewareProvider[] } = {}\n): MethodDecorator {\n return createHttpDecorator({\n methods: ['GET', 'HEAD'],\n path: data.path || '/',\n middlewares: data.middlewares || [],\n });\n}\n\nexport function Post(\n data: { path?: string; middlewares?: MiddlewareProvider[] } = {}\n): MethodDecorator {\n return createHttpDecorator({\n methods: ['POST'],\n path: data.path || '/',\n middlewares: data.middlewares || [],\n });\n}\n\nexport function Put(\n data: { path?: string; middlewares?: MiddlewareProvider[] } = {}\n): MethodDecorator {\n return createHttpDecorator({\n methods: ['PUT'],\n path: data.path || '/',\n middlewares: data.middlewares || [],\n });\n}\n\nexport function Patch(\n data: { path?: string; middlewares?: MiddlewareProvider[] } = {}\n): MethodDecorator {\n return createHttpDecorator({\n methods: ['PATCH'],\n path: data.path || '/',\n middlewares: data.middlewares || [],\n });\n}\n\nexport function Delete(\n data: { path?: string; middlewares?: MiddlewareProvider[] } = {}\n): MethodDecorator {\n return createHttpDecorator({\n methods: ['DELETE'],\n path: data.path || '/',\n middlewares: data.middlewares || [],\n });\n}\n\nexport function Options(\n data: { path?: string; middlewares?: MiddlewareProvider[] } = {}\n): MethodDecorator {\n return createHttpDecorator({\n methods: ['OPTIONS'],\n path: data.path || '/',\n middlewares: data.middlewares || [],\n });\n}\n\nexport function createParamDecorator(func: () => Promise<any> | (() => any)): ParameterDecorator {\n return function MyParamDecorator(\n target: Object,\n propertyKey: string | symbol | undefined,\n parameterIndex: number\n ) {\n Reflect.set(target.constructor, `${propertyKey?.toString()}:${parameterIndex}:custom`, func);\n };\n}\n","import { MiddlewareFactory } from './MiddlewareFactory.mjs';\nimport { HandlerType, HttpMethod, MiddlewareProvider, RouteCheck } from './types.mjs';\nimport { LexerToken, Request, Response } from './types.mjs';\n\nexport class Route {\n private middlewares: MiddlewareProvider[] = [];\n private checks: RouteCheck[] = [];\n private urlRegex: RegExp;\n constructor(\n public methods: HttpMethod[],\n public path: string,\n public handler: HandlerType\n ) {\n this.urlRegex = this.pathToRegex(path);\n }\n pathToRegex(path: string): RegExp {\n const lex = this.lexUrlPath(path);\n return this.tokensToRegex(lex);\n }\n\n lexUrlPath(path: string) {\n const tokens = [];\n let i = 0;\n\n while (i < path.length) {\n const char = path[i];\n\n if (char === '/') {\n tokens.push({ type: 'SLASH', value: '/' });\n i++;\n } else if (char === ':') {\n let start = i + 1;\n while (start < path.length && /[a-zA-Z0-9_]/.test(path[start])) {\n start++;\n }\n tokens.push({ type: 'PARAM', value: path.slice(i + 1, start) });\n i = start;\n } else if (char === '*') {\n let start = i + 1;\n while (start < path.length && /[a-zA-Z0-9_]/.test(path[start])) {\n start++;\n }\n tokens.push({ type: 'WILDCARD', value: path.slice(i + 1, start) });\n i = start;\n } else {\n let start = i;\n while (start < path.length && !['/', ':', '*'].includes(path[start])) {\n start++;\n }\n tokens.push({ type: 'TEXT', value: path.slice(i, start) });\n i = start;\n }\n }\n\n return tokens;\n }\n tokensToRegex(tokens: LexerToken[]) {\n const regexParts = [];\n\n for (const token of tokens) {\n if (token.type === 'SLASH') {\n regexParts.push('\\\\/');\n } else if (token.type === 'PARAM') {\n regexParts.push(`(?<${token.value}>[^\\\\/]+)`);\n } else if (token.type === 'WILDCARD') {\n regexParts.push('(.+)');\n } else if (token.type === 'TEXT') {\n regexParts.push(token.value.replace(/[-\\/\\\\^$.*+?()[\\]{}|]/g, '\\\\$&'));\n }\n }\n\n if (regexParts.length > 0 && regexParts[regexParts.length - 1] === '\\\\/') {\n regexParts[regexParts.length - 1] = '\\\\/?';\n } else {\n regexParts.push('\\\\/?');\n }\n\n return new RegExp(`^${regexParts.join('')}$`);\n }\n\n /**\n * to evaluadate if request is a match for this route\n * @param request http request\n * @returns return true if route is a match for this request\n */\n test(request: Request) {\n if (this.methods.indexOf(request.method as HttpMethod) === -1) {\n return false;\n }\n const url = new URL(request.url || '/', 'http://localhost');\n return this.testPath(url.pathname);\n }\n\n testPath(pathname: string) {\n return this.urlRegex.test(pathname);\n }\n\n /**\n * returns details of the match, otherwise it returns false\n * @param request the request to match\n * @returns object cotaining details of match including matched params\n */\n match(request: Request) {\n if (this.methods.indexOf(request.method as HttpMethod) === -1) {\n return false;\n }\n\n const url = new URL(request.url || '/', 'http://localhost');\n\n const r = this.urlRegex.exec(url.pathname);\n if (!r) {\n return false;\n }\n\n return {\n url,\n params: r.groups || {},\n };\n }\n\n prependMiddleware(middlewares: MiddlewareProvider | MiddlewareProvider[]) {\n this.middlewares = ([] as MiddlewareProvider[]).concat(middlewares, this.middlewares);\n return this;\n }\n\n addMiddleware(middlewares: MiddlewareProvider | MiddlewareProvider[]) {\n this.middlewares = this.middlewares.concat(middlewares);\n return this;\n }\n\n getMiddlewares() {\n return this.middlewares;\n }\n\n addCheck(checks: RouteCheck | RouteCheck[]) {\n this.checks = this.checks.concat(checks);\n return this;\n }\n\n getChecks() {\n return [...this.checks];\n }\n\n callHanlder(request: Request, response: Response) {\n return this.handler(request, response);\n }\n}\n","import { CompiledRoute } from './CompiledRoute.mjs';\nimport { BaseController } from './Controller.mjs';\nimport { MiddlewareFactory } from './MiddlewareFactory.mjs';\nimport { Route } from './Route.mjs';\nimport { HandlerType, HttpMethod, MiddlewareProvider, RouteCheck } from './types.mjs';\nimport { Request, Response } from './types.mjs';\nimport path from 'path';\nimport urlJoin from 'url-join';\n\nexport class Router {\n private middlewares: MiddlewareProvider[] = [];\n private checks: RouteCheck[] = [];\n routes: Route[] = [];\n addRoute(methods: HttpMethod[], path: string, handler: HandlerType) {\n const route: Route = new Route(methods, path, handler);\n this.routes.push(route);\n return route;\n }\n\n getMiddlewares() {\n return [...this.middlewares];\n }\n\n addCheck(checks: RouteCheck | RouteCheck[]) {\n this.checks = this.checks.concat(checks);\n return this;\n }\n\n getChecks() {\n return [...this.checks];\n }\n\n addController(controller: typeof BaseController) {\n const basePath = controller.basePath || '';\n for (const route of controller.routes) {\n const urlPath = path.join(basePath, route.path);\n this.addRoute(route.methods, urlPath, async (req: Request, res: Response) => {\n const controllerInstance = controller.getInstance();\n // @ts-ignore\n return await controllerInstance[route.handler]();\n }).addMiddleware([...controller.baseMiddlewares, ...route.middlewares]);\n }\n }\n\n addRouter(path: string, router: Router) {\n for (const route of router.routes) {\n let path2 = urlJoin('/', path, route.path);\n this.addRoute(route.methods, path2, route.handler)\n .addMiddleware(router.getMiddlewares())\n .addMiddleware(route.getMiddlewares())\n .addCheck(router.getChecks())\n .addCheck(route.getChecks());\n }\n }\n\n addGlobalMiddleware(middlewares: MiddlewareProvider | MiddlewareProvider[]) {\n this.middlewares = this.middlewares.concat(middlewares);\n }\n\n resolve(request: Request): Route | undefined {\n for (const route of this.routes) {\n if (route.test(request)) {\n return route;\n }\n }\n return undefined;\n }\n\n resolveMultiple(request: Request): Route[] {\n const rc: Route[] = [];\n const url = new URL(request.url || '/', 'http://localhost');\n for (const route of this.routes) {\n if (route.testPath(url.pathname)) {\n rc.push(route);\n }\n }\n return rc;\n }\n\n getCompiledRoute(request: Request, response: Response) {\n for (const check of this.checks) {\n if (!check(request, response)) {\n return undefined;\n }\n }\n\n for (const route of this.routes) {\n if (!route.test(request)) {\n continue;\n }\n const match = route.match(request);\n if (!match) {\n continue;\n }\n\n let allChecksPass = true;\n for (const check of route.getChecks()) {\n if (!check(request, response)) {\n allChecksPass = false;\n break;\n }\n }\n if (!allChecksPass) {\n continue;\n }\n\n request.params = match.params;\n return new CompiledRoute(route, request, response, this.middlewares);\n }\n\n return undefined;\n }\n}\n","import { Middleware } from './Middleware.mjs';\nimport { Request, Response } from './types.mjs';\n\nexport async function runNext(\n middlewares: Middleware[],\n req: Request,\n res: Response,\n final: (request: Request, response: Response) => Promise<void>\n) {\n let index = 0;\n\n async function next() {\n if (index >= middlewares.length) {\n return await final(req, res);\n }\n\n const middleware: Middleware | any = middlewares[index++];\n\n if (middleware instanceof Middleware) {\n await middleware.call(req, res, next);\n } else if (typeof middleware === 'function') {\n await middleware(req, res, next);\n } else {\n throw new Error('does not know how to run middleware');\n }\n }\n\n await next();\n}\n"],"mappings":"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","names":["path","path","path","path2","urlJoin"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { R as Request, a as Response, M as MiddlewareProvider,
|
|
1
|
+
import { R as Request, a as Response, M as MiddlewareProvider, d as Middleware } from './Middleware-CrHHdmO-.mjs';
|
|
2
2
|
import { Route } from './Route.mjs';
|
|
3
3
|
import 'http';
|
|
4
4
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { b as HttpMethod, M as MiddlewareProvider, C as ControllerDecoratorOptions } from './Middleware-
|
|
1
|
+
import { b as HttpMethod, M as MiddlewareProvider, C as ControllerDecoratorOptions } from './Middleware-CrHHdmO-.mjs';
|
|
2
2
|
import 'http';
|
|
3
3
|
|
|
4
4
|
declare class BaseController {
|
|
@@ -20,6 +20,7 @@ type ControllerDecoratorOptions = {
|
|
|
20
20
|
};
|
|
21
21
|
type MiddlewareProvider = typeof Middleware | Middleware | ((request: Request, response: Response, next: () => Promise<void>) => Promise<void>);
|
|
22
22
|
type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS';
|
|
23
|
+
type RouteCheck = (req: Request, res: Response) => boolean;
|
|
23
24
|
|
|
24
25
|
declare abstract class Middleware {
|
|
25
26
|
protected constructor(params?: any);
|
|
@@ -27,4 +28,4 @@ declare abstract class Middleware {
|
|
|
27
28
|
abstract call(req: Request, res: Response, next: () => Promise<void>): Promise<void>;
|
|
28
29
|
}
|
|
29
30
|
|
|
30
|
-
export { type ControllerDecoratorOptions as C, type HandlerType as H, type LexerToken as L, type MiddlewareProvider as M, type Request as R, type Response as a, type HttpMethod as b,
|
|
31
|
+
export { type ControllerDecoratorOptions as C, type HandlerType as H, type LexerToken as L, type MiddlewareProvider as M, type Request as R, type Response as a, type HttpMethod as b, type RouteCheck as c, Middleware as d };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { d as Middleware } from './Middleware-CrHHdmO-.mjs';
|
|
2
2
|
import 'http';
|
package/dist/esm/Route.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { b as HttpMethod, H as HandlerType, L as LexerToken, R as Request, M as MiddlewareProvider, a as Response } from './Middleware-
|
|
1
|
+
import { b as HttpMethod, H as HandlerType, L as LexerToken, R as Request, M as MiddlewareProvider, c as RouteCheck, a as Response } from './Middleware-CrHHdmO-.mjs';
|
|
2
2
|
import 'http';
|
|
3
3
|
|
|
4
4
|
declare class Route {
|
|
@@ -6,6 +6,7 @@ declare class Route {
|
|
|
6
6
|
path: string;
|
|
7
7
|
handler: HandlerType;
|
|
8
8
|
private middlewares;
|
|
9
|
+
private checks;
|
|
9
10
|
private urlRegex;
|
|
10
11
|
constructor(methods: HttpMethod[], path: string, handler: HandlerType);
|
|
11
12
|
pathToRegex(path: string): RegExp;
|
|
@@ -35,6 +36,8 @@ declare class Route {
|
|
|
35
36
|
prependMiddleware(middlewares: MiddlewareProvider | MiddlewareProvider[]): this;
|
|
36
37
|
addMiddleware(middlewares: MiddlewareProvider | MiddlewareProvider[]): this;
|
|
37
38
|
getMiddlewares(): MiddlewareProvider[];
|
|
39
|
+
addCheck(checks: RouteCheck | RouteCheck[]): this;
|
|
40
|
+
getChecks(): RouteCheck[];
|
|
38
41
|
callHanlder(request: Request, response: Response): any;
|
|
39
42
|
}
|
|
40
43
|
|
package/dist/esm/Route.mjs
CHANGED
|
@@ -6,6 +6,7 @@ class Route {
|
|
|
6
6
|
this.urlRegex = this.pathToRegex(path);
|
|
7
7
|
}
|
|
8
8
|
middlewares = [];
|
|
9
|
+
checks = [];
|
|
9
10
|
urlRegex;
|
|
10
11
|
pathToRegex(path) {
|
|
11
12
|
const lex = this.lexUrlPath(path);
|
|
@@ -109,6 +110,13 @@ class Route {
|
|
|
109
110
|
getMiddlewares() {
|
|
110
111
|
return this.middlewares;
|
|
111
112
|
}
|
|
113
|
+
addCheck(checks) {
|
|
114
|
+
this.checks = this.checks.concat(checks);
|
|
115
|
+
return this;
|
|
116
|
+
}
|
|
117
|
+
getChecks() {
|
|
118
|
+
return [...this.checks];
|
|
119
|
+
}
|
|
112
120
|
callHanlder(request, response) {
|
|
113
121
|
return this.handler(request, response);
|
|
114
122
|
}
|
package/dist/esm/Route.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/Route.mts"],"sourcesContent":["import { MiddlewareFactory } from './MiddlewareFactory.mjs';\nimport { HandlerType, HttpMethod, MiddlewareProvider } from './types.mjs';\nimport { LexerToken, Request, Response } from './types.mjs';\n\nexport class Route {\n private middlewares: MiddlewareProvider[] = [];\n private urlRegex: RegExp;\n constructor(\n public methods: HttpMethod[],\n public path: string,\n public handler: HandlerType\n ) {\n this.urlRegex = this.pathToRegex(path);\n }\n pathToRegex(path: string): RegExp {\n const lex = this.lexUrlPath(path);\n return this.tokensToRegex(lex);\n }\n\n lexUrlPath(path: string) {\n const tokens = [];\n let i = 0;\n\n while (i < path.length) {\n const char = path[i];\n\n if (char === '/') {\n tokens.push({ type: 'SLASH', value: '/' });\n i++;\n } else if (char === ':') {\n let start = i + 1;\n while (start < path.length && /[a-zA-Z0-9_]/.test(path[start])) {\n start++;\n }\n tokens.push({ type: 'PARAM', value: path.slice(i + 1, start) });\n i = start;\n } else if (char === '*') {\n let start = i + 1;\n while (start < path.length && /[a-zA-Z0-9_]/.test(path[start])) {\n start++;\n }\n tokens.push({ type: 'WILDCARD', value: path.slice(i + 1, start) });\n i = start;\n } else {\n let start = i;\n while (start < path.length && !['/', ':', '*'].includes(path[start])) {\n start++;\n }\n tokens.push({ type: 'TEXT', value: path.slice(i, start) });\n i = start;\n }\n }\n\n return tokens;\n }\n tokensToRegex(tokens: LexerToken[]) {\n const regexParts = [];\n\n for (const token of tokens) {\n if (token.type === 'SLASH') {\n regexParts.push('\\\\/');\n } else if (token.type === 'PARAM') {\n regexParts.push(`(?<${token.value}>[^\\\\/]+)`);\n } else if (token.type === 'WILDCARD') {\n regexParts.push('(.+)');\n } else if (token.type === 'TEXT') {\n regexParts.push(token.value.replace(/[-\\/\\\\^$.*+?()[\\]{}|]/g, '\\\\$&'));\n }\n }\n\n if (regexParts.length > 0 && regexParts[regexParts.length - 1] === '\\\\/') {\n regexParts[regexParts.length - 1] = '\\\\/?';\n } else {\n regexParts.push('\\\\/?');\n }\n\n return new RegExp(`^${regexParts.join('')}$`);\n }\n\n /**\n * to evaluadate if request is a match for this route\n * @param request http request\n * @returns return true if route is a match for this request\n */\n test(request: Request) {\n if (this.methods.indexOf(request.method as HttpMethod) === -1) {\n return false;\n }\n const url = new URL(request.url || '/', 'http://localhost');\n return this.testPath(url.pathname);\n }\n\n testPath(pathname: string) {\n return this.urlRegex.test(pathname);\n }\n\n /**\n * returns details of the match, otherwise it returns false\n * @param request the request to match\n * @returns object cotaining details of match including matched params\n */\n match(request: Request) {\n if (this.methods.indexOf(request.method as HttpMethod) === -1) {\n return false;\n }\n\n const url = new URL(request.url || '/', 'http://localhost');\n\n const r = this.urlRegex.exec(url.pathname);\n if (!r) {\n return false;\n }\n\n return {\n url,\n params: r.groups || {},\n };\n }\n\n prependMiddleware(middlewares: MiddlewareProvider | MiddlewareProvider[]) {\n this.middlewares = ([] as MiddlewareProvider[]).concat(middlewares, this.middlewares);\n return this;\n }\n\n addMiddleware(middlewares: MiddlewareProvider | MiddlewareProvider[]) {\n this.middlewares = this.middlewares.concat(middlewares);\n return this;\n }\n\n getMiddlewares() {\n return this.middlewares;\n }\n\n callHanlder(request: Request, response: Response) {\n return this.handler(request, response);\n }\n}\n"],"mappings":"AAIO,MAAM,MAAM;AAAA,
|
|
1
|
+
{"version":3,"sources":["../../src/Route.mts"],"sourcesContent":["import { MiddlewareFactory } from './MiddlewareFactory.mjs';\nimport { HandlerType, HttpMethod, MiddlewareProvider, RouteCheck } from './types.mjs';\nimport { LexerToken, Request, Response } from './types.mjs';\n\nexport class Route {\n private middlewares: MiddlewareProvider[] = [];\n private checks: RouteCheck[] = [];\n private urlRegex: RegExp;\n constructor(\n public methods: HttpMethod[],\n public path: string,\n public handler: HandlerType\n ) {\n this.urlRegex = this.pathToRegex(path);\n }\n pathToRegex(path: string): RegExp {\n const lex = this.lexUrlPath(path);\n return this.tokensToRegex(lex);\n }\n\n lexUrlPath(path: string) {\n const tokens = [];\n let i = 0;\n\n while (i < path.length) {\n const char = path[i];\n\n if (char === '/') {\n tokens.push({ type: 'SLASH', value: '/' });\n i++;\n } else if (char === ':') {\n let start = i + 1;\n while (start < path.length && /[a-zA-Z0-9_]/.test(path[start])) {\n start++;\n }\n tokens.push({ type: 'PARAM', value: path.slice(i + 1, start) });\n i = start;\n } else if (char === '*') {\n let start = i + 1;\n while (start < path.length && /[a-zA-Z0-9_]/.test(path[start])) {\n start++;\n }\n tokens.push({ type: 'WILDCARD', value: path.slice(i + 1, start) });\n i = start;\n } else {\n let start = i;\n while (start < path.length && !['/', ':', '*'].includes(path[start])) {\n start++;\n }\n tokens.push({ type: 'TEXT', value: path.slice(i, start) });\n i = start;\n }\n }\n\n return tokens;\n }\n tokensToRegex(tokens: LexerToken[]) {\n const regexParts = [];\n\n for (const token of tokens) {\n if (token.type === 'SLASH') {\n regexParts.push('\\\\/');\n } else if (token.type === 'PARAM') {\n regexParts.push(`(?<${token.value}>[^\\\\/]+)`);\n } else if (token.type === 'WILDCARD') {\n regexParts.push('(.+)');\n } else if (token.type === 'TEXT') {\n regexParts.push(token.value.replace(/[-\\/\\\\^$.*+?()[\\]{}|]/g, '\\\\$&'));\n }\n }\n\n if (regexParts.length > 0 && regexParts[regexParts.length - 1] === '\\\\/') {\n regexParts[regexParts.length - 1] = '\\\\/?';\n } else {\n regexParts.push('\\\\/?');\n }\n\n return new RegExp(`^${regexParts.join('')}$`);\n }\n\n /**\n * to evaluadate if request is a match for this route\n * @param request http request\n * @returns return true if route is a match for this request\n */\n test(request: Request) {\n if (this.methods.indexOf(request.method as HttpMethod) === -1) {\n return false;\n }\n const url = new URL(request.url || '/', 'http://localhost');\n return this.testPath(url.pathname);\n }\n\n testPath(pathname: string) {\n return this.urlRegex.test(pathname);\n }\n\n /**\n * returns details of the match, otherwise it returns false\n * @param request the request to match\n * @returns object cotaining details of match including matched params\n */\n match(request: Request) {\n if (this.methods.indexOf(request.method as HttpMethod) === -1) {\n return false;\n }\n\n const url = new URL(request.url || '/', 'http://localhost');\n\n const r = this.urlRegex.exec(url.pathname);\n if (!r) {\n return false;\n }\n\n return {\n url,\n params: r.groups || {},\n };\n }\n\n prependMiddleware(middlewares: MiddlewareProvider | MiddlewareProvider[]) {\n this.middlewares = ([] as MiddlewareProvider[]).concat(middlewares, this.middlewares);\n return this;\n }\n\n addMiddleware(middlewares: MiddlewareProvider | MiddlewareProvider[]) {\n this.middlewares = this.middlewares.concat(middlewares);\n return this;\n }\n\n getMiddlewares() {\n return this.middlewares;\n }\n\n addCheck(checks: RouteCheck | RouteCheck[]) {\n this.checks = this.checks.concat(checks);\n return this;\n }\n\n getChecks() {\n return [...this.checks];\n }\n\n callHanlder(request: Request, response: Response) {\n return this.handler(request, response);\n }\n}\n"],"mappings":"AAIO,MAAM,MAAM;AAAA,EAIjB,YACS,SACA,MACA,SACP;AAHO;AACA;AACA;AAEP,SAAK,WAAW,KAAK,YAAY,IAAI;AAAA,EACvC;AAAA,EATQ,cAAoC,CAAC;AAAA,EACrC,SAAuB,CAAC;AAAA,EACxB;AAAA,EAQR,YAAY,MAAsB;AAChC,UAAM,MAAM,KAAK,WAAW,IAAI;AAChC,WAAO,KAAK,cAAc,GAAG;AAAA,EAC/B;AAAA,EAEA,WAAW,MAAc;AACvB,UAAM,SAAS,CAAC;AAChB,QAAI,IAAI;AAER,WAAO,IAAI,KAAK,QAAQ;AACtB,YAAM,OAAO,KAAK,CAAC;AAEnB,UAAI,SAAS,KAAK;AAChB,eAAO,KAAK,EAAE,MAAM,SAAS,OAAO,IAAI,CAAC;AACzC;AAAA,MACF,WAAW,SAAS,KAAK;AACvB,YAAI,QAAQ,IAAI;AAChB,eAAO,QAAQ,KAAK,UAAU,eAAe,KAAK,KAAK,KAAK,CAAC,GAAG;AAC9D;AAAA,QACF;AACA,eAAO,KAAK,EAAE,MAAM,SAAS,OAAO,KAAK,MAAM,IAAI,GAAG,KAAK,EAAE,CAAC;AAC9D,YAAI;AAAA,MACN,WAAW,SAAS,KAAK;AACvB,YAAI,QAAQ,IAAI;AAChB,eAAO,QAAQ,KAAK,UAAU,eAAe,KAAK,KAAK,KAAK,CAAC,GAAG;AAC9D;AAAA,QACF;AACA,eAAO,KAAK,EAAE,MAAM,YAAY,OAAO,KAAK,MAAM,IAAI,GAAG,KAAK,EAAE,CAAC;AACjE,YAAI;AAAA,MACN,OAAO;AACL,YAAI,QAAQ;AACZ,eAAO,QAAQ,KAAK,UAAU,CAAC,CAAC,KAAK,KAAK,GAAG,EAAE,SAAS,KAAK,KAAK,CAAC,GAAG;AACpE;AAAA,QACF;AACA,eAAO,KAAK,EAAE,MAAM,QAAQ,OAAO,KAAK,MAAM,GAAG,KAAK,EAAE,CAAC;AACzD,YAAI;AAAA,MACN;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EACA,cAAc,QAAsB;AAClC,UAAM,aAAa,CAAC;AAEpB,eAAW,SAAS,QAAQ;AAC1B,UAAI,MAAM,SAAS,SAAS;AAC1B,mBAAW,KAAK,KAAK;AAAA,MACvB,WAAW,MAAM,SAAS,SAAS;AACjC,mBAAW,KAAK,MAAM,MAAM,KAAK,WAAW;AAAA,MAC9C,WAAW,MAAM,SAAS,YAAY;AACpC,mBAAW,KAAK,MAAM;AAAA,MACxB,WAAW,MAAM,SAAS,QAAQ;AAChC,mBAAW,KAAK,MAAM,MAAM,QAAQ,0BAA0B,MAAM,CAAC;AAAA,MACvE;AAAA,IACF;AAEA,QAAI,WAAW,SAAS,KAAK,WAAW,WAAW,SAAS,CAAC,MAAM,OAAO;AACxE,iBAAW,WAAW,SAAS,CAAC,IAAI;AAAA,IACtC,OAAO;AACL,iBAAW,KAAK,MAAM;AAAA,IACxB;AAEA,WAAO,IAAI,OAAO,IAAI,WAAW,KAAK,EAAE,CAAC,GAAG;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAK,SAAkB;AACrB,QAAI,KAAK,QAAQ,QAAQ,QAAQ,MAAoB,MAAM,IAAI;AAC7D,aAAO;AAAA,IACT;AACA,UAAM,MAAM,IAAI,IAAI,QAAQ,OAAO,KAAK,kBAAkB;AAC1D,WAAO,KAAK,SAAS,IAAI,QAAQ;AAAA,EACnC;AAAA,EAEA,SAAS,UAAkB;AACzB,WAAO,KAAK,SAAS,KAAK,QAAQ;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,SAAkB;AACtB,QAAI,KAAK,QAAQ,QAAQ,QAAQ,MAAoB,MAAM,IAAI;AAC7D,aAAO;AAAA,IACT;AAEA,UAAM,MAAM,IAAI,IAAI,QAAQ,OAAO,KAAK,kBAAkB;AAE1D,UAAM,IAAI,KAAK,SAAS,KAAK,IAAI,QAAQ;AACzC,QAAI,CAAC,GAAG;AACN,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL;AAAA,MACA,QAAQ,EAAE,UAAU,CAAC;AAAA,IACvB;AAAA,EACF;AAAA,EAEA,kBAAkB,aAAwD;AACxE,SAAK,cAAe,CAAC,EAA2B,OAAO,aAAa,KAAK,WAAW;AACpF,WAAO;AAAA,EACT;AAAA,EAEA,cAAc,aAAwD;AACpE,SAAK,cAAc,KAAK,YAAY,OAAO,WAAW;AACtD,WAAO;AAAA,EACT;AAAA,EAEA,iBAAiB;AACf,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,SAAS,QAAmC;AAC1C,SAAK,SAAS,KAAK,OAAO,OAAO,MAAM;AACvC,WAAO;AAAA,EACT;AAAA,EAEA,YAAY;AACV,WAAO,CAAC,GAAG,KAAK,MAAM;AAAA,EACxB;AAAA,EAEA,YAAY,SAAkB,UAAoB;AAChD,WAAO,KAAK,QAAQ,SAAS,QAAQ;AAAA,EACvC;AACF;","names":[]}
|
package/dist/esm/Router.d.mts
CHANGED
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
import { CompiledRoute } from './CompiledRoute.mjs';
|
|
2
2
|
import { BaseController } from './Controller.mjs';
|
|
3
3
|
import { Route } from './Route.mjs';
|
|
4
|
-
import { b as HttpMethod, H as HandlerType, M as MiddlewareProvider, R as Request, a as Response } from './Middleware-
|
|
4
|
+
import { b as HttpMethod, H as HandlerType, M as MiddlewareProvider, c as RouteCheck, R as Request, a as Response } from './Middleware-CrHHdmO-.mjs';
|
|
5
5
|
import 'http';
|
|
6
6
|
|
|
7
7
|
declare class Router {
|
|
8
8
|
private middlewares;
|
|
9
|
+
private checks;
|
|
9
10
|
routes: Route[];
|
|
10
11
|
addRoute(methods: HttpMethod[], path: string, handler: HandlerType): Route;
|
|
11
12
|
getMiddlewares(): MiddlewareProvider[];
|
|
13
|
+
addCheck(checks: RouteCheck | RouteCheck[]): this;
|
|
14
|
+
getChecks(): RouteCheck[];
|
|
12
15
|
addController(controller: typeof BaseController): void;
|
|
13
16
|
addRouter(path: string, router: Router): void;
|
|
14
17
|
addGlobalMiddleware(middlewares: MiddlewareProvider | MiddlewareProvider[]): void;
|
package/dist/esm/Router.mjs
CHANGED
|
@@ -4,6 +4,7 @@ import path from "path";
|
|
|
4
4
|
import urlJoin from "url-join";
|
|
5
5
|
class Router {
|
|
6
6
|
middlewares = [];
|
|
7
|
+
checks = [];
|
|
7
8
|
routes = [];
|
|
8
9
|
addRoute(methods, path2, handler) {
|
|
9
10
|
const route = new Route(methods, path2, handler);
|
|
@@ -13,6 +14,13 @@ class Router {
|
|
|
13
14
|
getMiddlewares() {
|
|
14
15
|
return [...this.middlewares];
|
|
15
16
|
}
|
|
17
|
+
addCheck(checks) {
|
|
18
|
+
this.checks = this.checks.concat(checks);
|
|
19
|
+
return this;
|
|
20
|
+
}
|
|
21
|
+
getChecks() {
|
|
22
|
+
return [...this.checks];
|
|
23
|
+
}
|
|
16
24
|
addController(controller) {
|
|
17
25
|
const basePath = controller.basePath || "";
|
|
18
26
|
for (const route of controller.routes) {
|
|
@@ -26,7 +34,7 @@ class Router {
|
|
|
26
34
|
addRouter(path2, router) {
|
|
27
35
|
for (const route of router.routes) {
|
|
28
36
|
let path22 = urlJoin("/", path2, route.path);
|
|
29
|
-
this.addRoute(route.methods, path22, route.handler).addMiddleware(router.getMiddlewares()).addMiddleware(route.getMiddlewares());
|
|
37
|
+
this.addRoute(route.methods, path22, route.handler).addMiddleware(router.getMiddlewares()).addMiddleware(route.getMiddlewares()).addCheck(router.getChecks()).addCheck(route.getChecks());
|
|
30
38
|
}
|
|
31
39
|
}
|
|
32
40
|
addGlobalMiddleware(middlewares) {
|
|
@@ -51,16 +59,33 @@ class Router {
|
|
|
51
59
|
return rc;
|
|
52
60
|
}
|
|
53
61
|
getCompiledRoute(request, response) {
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
|
|
62
|
+
for (const check of this.checks) {
|
|
63
|
+
if (!check(request, response)) {
|
|
64
|
+
return void 0;
|
|
65
|
+
}
|
|
57
66
|
}
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
|
|
67
|
+
for (const route of this.routes) {
|
|
68
|
+
if (!route.test(request)) {
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
const match = route.match(request);
|
|
72
|
+
if (!match) {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
let allChecksPass = true;
|
|
76
|
+
for (const check of route.getChecks()) {
|
|
77
|
+
if (!check(request, response)) {
|
|
78
|
+
allChecksPass = false;
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (!allChecksPass) {
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
request.params = match.params;
|
|
86
|
+
return new CompiledRoute(route, request, response, this.middlewares);
|
|
61
87
|
}
|
|
62
|
-
|
|
63
|
-
return new CompiledRoute(route, request, response, this.middlewares);
|
|
88
|
+
return void 0;
|
|
64
89
|
}
|
|
65
90
|
}
|
|
66
91
|
export {
|
package/dist/esm/Router.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/Router.mts"],"sourcesContent":["import { CompiledRoute } from './CompiledRoute.mjs';\nimport { BaseController } from './Controller.mjs';\nimport { MiddlewareFactory } from './MiddlewareFactory.mjs';\nimport { Route } from './Route.mjs';\nimport { HandlerType, HttpMethod, MiddlewareProvider } from './types.mjs';\nimport { Request, Response } from './types.mjs';\nimport path from 'path';\nimport urlJoin from 'url-join';\n\nexport class Router {\n private middlewares: MiddlewareProvider[] = [];\n routes: Route[] = [];\n addRoute(methods: HttpMethod[], path: string, handler: HandlerType) {\n const route: Route = new Route(methods, path, handler);\n this.routes.push(route);\n return route;\n }\n\n getMiddlewares() {\n return [...this.middlewares];\n }\n\n addController(controller: typeof BaseController) {\n const basePath = controller.basePath || '';\n for (const route of controller.routes) {\n const urlPath = path.join(basePath, route.path);\n this.addRoute(route.methods, urlPath, async (req: Request, res: Response) => {\n const controllerInstance = controller.getInstance();\n // @ts-ignore\n return await controllerInstance[route.handler]();\n }).addMiddleware([...controller.baseMiddlewares, ...route.middlewares]);\n }\n }\n\n addRouter(path: string, router: Router) {\n for (const route of router.routes) {\n let path2 = urlJoin('/', path, route.path);\n this.addRoute(route.methods, path2, route.handler)\n .addMiddleware(router.getMiddlewares())\n .addMiddleware(route.getMiddlewares());\n }\n }\n\n addGlobalMiddleware(middlewares: MiddlewareProvider | MiddlewareProvider[]) {\n this.middlewares = this.middlewares.concat(middlewares);\n }\n\n resolve(request: Request): Route | undefined {\n for (const route of this.routes) {\n if (route.test(request)) {\n return route;\n }\n }\n return undefined;\n }\n\n resolveMultiple(request: Request): Route[] {\n const rc: Route[] = [];\n const url = new URL(request.url || '/', 'http://localhost');\n for (const route of this.routes) {\n if (route.testPath(url.pathname)) {\n rc.push(route);\n }\n }\n return rc;\n }\n\n getCompiledRoute(request: Request, response: Response) {\n const
|
|
1
|
+
{"version":3,"sources":["../../src/Router.mts"],"sourcesContent":["import { CompiledRoute } from './CompiledRoute.mjs';\nimport { BaseController } from './Controller.mjs';\nimport { MiddlewareFactory } from './MiddlewareFactory.mjs';\nimport { Route } from './Route.mjs';\nimport { HandlerType, HttpMethod, MiddlewareProvider, RouteCheck } from './types.mjs';\nimport { Request, Response } from './types.mjs';\nimport path from 'path';\nimport urlJoin from 'url-join';\n\nexport class Router {\n private middlewares: MiddlewareProvider[] = [];\n private checks: RouteCheck[] = [];\n routes: Route[] = [];\n addRoute(methods: HttpMethod[], path: string, handler: HandlerType) {\n const route: Route = new Route(methods, path, handler);\n this.routes.push(route);\n return route;\n }\n\n getMiddlewares() {\n return [...this.middlewares];\n }\n\n addCheck(checks: RouteCheck | RouteCheck[]) {\n this.checks = this.checks.concat(checks);\n return this;\n }\n\n getChecks() {\n return [...this.checks];\n }\n\n addController(controller: typeof BaseController) {\n const basePath = controller.basePath || '';\n for (const route of controller.routes) {\n const urlPath = path.join(basePath, route.path);\n this.addRoute(route.methods, urlPath, async (req: Request, res: Response) => {\n const controllerInstance = controller.getInstance();\n // @ts-ignore\n return await controllerInstance[route.handler]();\n }).addMiddleware([...controller.baseMiddlewares, ...route.middlewares]);\n }\n }\n\n addRouter(path: string, router: Router) {\n for (const route of router.routes) {\n let path2 = urlJoin('/', path, route.path);\n this.addRoute(route.methods, path2, route.handler)\n .addMiddleware(router.getMiddlewares())\n .addMiddleware(route.getMiddlewares())\n .addCheck(router.getChecks())\n .addCheck(route.getChecks());\n }\n }\n\n addGlobalMiddleware(middlewares: MiddlewareProvider | MiddlewareProvider[]) {\n this.middlewares = this.middlewares.concat(middlewares);\n }\n\n resolve(request: Request): Route | undefined {\n for (const route of this.routes) {\n if (route.test(request)) {\n return route;\n }\n }\n return undefined;\n }\n\n resolveMultiple(request: Request): Route[] {\n const rc: Route[] = [];\n const url = new URL(request.url || '/', 'http://localhost');\n for (const route of this.routes) {\n if (route.testPath(url.pathname)) {\n rc.push(route);\n }\n }\n return rc;\n }\n\n getCompiledRoute(request: Request, response: Response) {\n for (const check of this.checks) {\n if (!check(request, response)) {\n return undefined;\n }\n }\n\n for (const route of this.routes) {\n if (!route.test(request)) {\n continue;\n }\n const match = route.match(request);\n if (!match) {\n continue;\n }\n\n let allChecksPass = true;\n for (const check of route.getChecks()) {\n if (!check(request, response)) {\n allChecksPass = false;\n break;\n }\n }\n if (!allChecksPass) {\n continue;\n }\n\n request.params = match.params;\n return new CompiledRoute(route, request, response, this.middlewares);\n }\n\n return undefined;\n }\n}\n"],"mappings":"AAAA,SAAS,qBAAqB;AAG9B,SAAS,aAAa;AAGtB,OAAO,UAAU;AACjB,OAAO,aAAa;AAEb,MAAM,OAAO;AAAA,EACV,cAAoC,CAAC;AAAA,EACrC,SAAuB,CAAC;AAAA,EAChC,SAAkB,CAAC;AAAA,EACnB,SAAS,SAAuBA,OAAc,SAAsB;AAClE,UAAM,QAAe,IAAI,MAAM,SAASA,OAAM,OAAO;AACrD,SAAK,OAAO,KAAK,KAAK;AACtB,WAAO;AAAA,EACT;AAAA,EAEA,iBAAiB;AACf,WAAO,CAAC,GAAG,KAAK,WAAW;AAAA,EAC7B;AAAA,EAEA,SAAS,QAAmC;AAC1C,SAAK,SAAS,KAAK,OAAO,OAAO,MAAM;AACvC,WAAO;AAAA,EACT;AAAA,EAEA,YAAY;AACV,WAAO,CAAC,GAAG,KAAK,MAAM;AAAA,EACxB;AAAA,EAEA,cAAc,YAAmC;AAC/C,UAAM,WAAW,WAAW,YAAY;AACxC,eAAW,SAAS,WAAW,QAAQ;AACrC,YAAM,UAAU,KAAK,KAAK,UAAU,MAAM,IAAI;AAC9C,WAAK,SAAS,MAAM,SAAS,SAAS,OAAO,KAAc,QAAkB;AAC3E,cAAM,qBAAqB,WAAW,YAAY;AAElD,eAAO,MAAM,mBAAmB,MAAM,OAAO,EAAE;AAAA,MACjD,CAAC,EAAE,cAAc,CAAC,GAAG,WAAW,iBAAiB,GAAG,MAAM,WAAW,CAAC;AAAA,IACxE;AAAA,EACF;AAAA,EAEA,UAAUA,OAAc,QAAgB;AACtC,eAAW,SAAS,OAAO,QAAQ;AACjC,UAAIC,SAAQ,QAAQ,KAAKD,OAAM,MAAM,IAAI;AACzC,WAAK,SAAS,MAAM,SAASC,QAAO,MAAM,OAAO,EAC9C,cAAc,OAAO,eAAe,CAAC,EACrC,cAAc,MAAM,eAAe,CAAC,EACpC,SAAS,OAAO,UAAU,CAAC,EAC3B,SAAS,MAAM,UAAU,CAAC;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,oBAAoB,aAAwD;AAC1E,SAAK,cAAc,KAAK,YAAY,OAAO,WAAW;AAAA,EACxD;AAAA,EAEA,QAAQ,SAAqC;AAC3C,eAAW,SAAS,KAAK,QAAQ;AAC/B,UAAI,MAAM,KAAK,OAAO,GAAG;AACvB,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,gBAAgB,SAA2B;AACzC,UAAM,KAAc,CAAC;AACrB,UAAM,MAAM,IAAI,IAAI,QAAQ,OAAO,KAAK,kBAAkB;AAC1D,eAAW,SAAS,KAAK,QAAQ;AAC/B,UAAI,MAAM,SAAS,IAAI,QAAQ,GAAG;AAChC,WAAG,KAAK,KAAK;AAAA,MACf;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,iBAAiB,SAAkB,UAAoB;AACrD,eAAW,SAAS,KAAK,QAAQ;AAC/B,UAAI,CAAC,MAAM,SAAS,QAAQ,GAAG;AAC7B,eAAO;AAAA,MACT;AAAA,IACF;AAEA,eAAW,SAAS,KAAK,QAAQ;AAC/B,UAAI,CAAC,MAAM,KAAK,OAAO,GAAG;AACxB;AAAA,MACF;AACA,YAAM,QAAQ,MAAM,MAAM,OAAO;AACjC,UAAI,CAAC,OAAO;AACV;AAAA,MACF;AAEA,UAAI,gBAAgB;AACpB,iBAAW,SAAS,MAAM,UAAU,GAAG;AACrC,YAAI,CAAC,MAAM,SAAS,QAAQ,GAAG;AAC7B,0BAAgB;AAChB;AAAA,QACF;AAAA,MACF;AACA,UAAI,CAAC,eAAe;AAClB;AAAA,MACF;AAEA,cAAQ,SAAS,MAAM;AACvB,aAAO,IAAI,cAAc,OAAO,SAAS,UAAU,KAAK,WAAW;AAAA,IACrE;AAEA,WAAO;AAAA,EACT;AACF;","names":["path","path2"]}
|
package/dist/esm/helpers.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { d as Middleware, R as Request, a as Response } from './Middleware-CrHHdmO-.mjs';
|
|
2
2
|
import 'http';
|
|
3
3
|
|
|
4
4
|
declare function runNext(middlewares: Middleware[], req: Request, res: Response, final: (request: Request, response: Response) => Promise<void>): Promise<void>;
|
package/dist/esm/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { C as ControllerDecoratorOptions, H as HandlerType, b as HttpMethod, L as LexerToken,
|
|
1
|
+
export { C as ControllerDecoratorOptions, H as HandlerType, b as HttpMethod, L as LexerToken, d as Middleware, M as MiddlewareProvider, R as Request, a as Response, c as RouteCheck } from './Middleware-CrHHdmO-.mjs';
|
|
2
2
|
export { CompiledRoute } from './CompiledRoute.mjs';
|
|
3
3
|
export { BaseController, Controller, Delete, Get, Options, Patch, Post, Put, createParamDecorator } from './Controller.mjs';
|
|
4
4
|
export { Route } from './Route.mjs';
|
package/dist/esm/types.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import 'http';
|
|
2
|
-
export { C as ControllerDecoratorOptions, H as HandlerType, b as HttpMethod, L as LexerToken, M as MiddlewareProvider, R as Request, a as Response } from './Middleware-
|
|
2
|
+
export { C as ControllerDecoratorOptions, H as HandlerType, b as HttpMethod, L as LexerToken, M as MiddlewareProvider, R as Request, a as Response, c as RouteCheck } from './Middleware-CrHHdmO-.mjs';
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@devbro/neko-router",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.1.21",
|
|
4
|
+
"description": "Fast, flexible URI-to-controller router that maps every request to exactly the right destination",
|
|
5
5
|
"main": "./dist/cjs/index.js",
|
|
6
6
|
"module": "./dist/esm/index.mjs",
|
|
7
7
|
"types": "./dist/cjs/index.d.ts",
|
|
@@ -29,14 +29,14 @@
|
|
|
29
29
|
"author": "Farzad Meow Khalafi",
|
|
30
30
|
"license": "MIT",
|
|
31
31
|
"devDependencies": {
|
|
32
|
-
"@types/node": "^
|
|
32
|
+
"@types/node": "^24.1.0",
|
|
33
33
|
"@typescript-eslint/eslint-plugin": "^7.1.1",
|
|
34
34
|
"@typescript-eslint/parser": "^7.1.1",
|
|
35
35
|
"eslint": "8.57.0",
|
|
36
36
|
"husky": "^9.1.7",
|
|
37
37
|
"prettier": "^3.5.3",
|
|
38
38
|
"tsup": "^8.0.2",
|
|
39
|
-
"typescript": "^5.
|
|
39
|
+
"typescript": "^5.9.3",
|
|
40
40
|
"vitest": "^3.2.4"
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|