@h3ravel/router 1.10.1 → 1.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +22 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +8 -18
- package/dist/index.d.ts +8 -18
- package/dist/index.js +22 -12
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
package/dist/index.cjs
CHANGED
|
@@ -21,10 +21,10 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
21
21
|
}) : target, mod));
|
|
22
22
|
|
|
23
23
|
//#endregion
|
|
24
|
-
let __h3ravel_core = require("@h3ravel/core");
|
|
25
|
-
__h3ravel_core = __toESM(__h3ravel_core);
|
|
26
24
|
let __h3ravel_shared = require("@h3ravel/shared");
|
|
27
25
|
__h3ravel_shared = __toESM(__h3ravel_shared);
|
|
26
|
+
let __h3ravel_core = require("@h3ravel/core");
|
|
27
|
+
__h3ravel_core = __toESM(__h3ravel_core);
|
|
28
28
|
let node_fs_promises = require("node:fs/promises");
|
|
29
29
|
node_fs_promises = __toESM(node_fs_promises);
|
|
30
30
|
let __h3ravel_support = require("@h3ravel/support");
|
|
@@ -75,7 +75,7 @@ var RouteListCommand = class extends __h3ravel_core.ConsoleCommand {
|
|
|
75
75
|
/**
|
|
76
76
|
* Log the route list
|
|
77
77
|
*/
|
|
78
|
-
[...this.app.make("routes")].sort((a, b) => {
|
|
78
|
+
[...this.app.make("app.routes")].sort((a, b) => {
|
|
79
79
|
if (a.path === "/" && b.path !== "/") return -1;
|
|
80
80
|
if (b.path === "/" && a.path !== "/") return 1;
|
|
81
81
|
return a.path.localeCompare(b.path);
|
|
@@ -88,7 +88,7 @@ var RouteListCommand = class extends __h3ravel_core.ConsoleCommand {
|
|
|
88
88
|
route.signature.join("@")
|
|
89
89
|
].join(" ") : "";
|
|
90
90
|
const desc = __h3ravel_shared.Logger.describe(__h3ravel_shared.Logger.log(__h3ravel_shared.Logger.log(method + this.pair(method), this.color(method), false), "green", false), path$1, 15, false);
|
|
91
|
-
return __h3ravel_shared.Logger.
|
|
91
|
+
return __h3ravel_shared.Logger.twoColumnDetail(desc.join(""), name);
|
|
92
92
|
});
|
|
93
93
|
}
|
|
94
94
|
/**
|
|
@@ -201,10 +201,10 @@ var AssetsServiceProvider = class extends __h3ravel_core.ServiceProvider {
|
|
|
201
201
|
return (0, h3.serveStatic)(event, {
|
|
202
202
|
indexNames: ["/index.html"],
|
|
203
203
|
getContents: (id) => {
|
|
204
|
-
return (0, node_fs_promises.readFile)((0, node_path.join)(
|
|
204
|
+
return (0, node_fs_promises.readFile)((0, node_path.join)(__h3ravel_support.Str.before(publicPath, id), id));
|
|
205
205
|
},
|
|
206
206
|
getMeta: async (id) => {
|
|
207
|
-
const stats = await (0, node_fs_promises.stat)((0, node_path.join)(
|
|
207
|
+
const stats = await (0, node_fs_promises.stat)((0, node_path.join)(__h3ravel_support.Str.before(publicPath, id), id)).catch(() => {});
|
|
208
208
|
if (stats?.isFile()) return {
|
|
209
209
|
size: stats.size,
|
|
210
210
|
mtime: stats.mtimeMs
|
|
@@ -215,7 +215,7 @@ var AssetsServiceProvider = class extends __h3ravel_core.ServiceProvider {
|
|
|
215
215
|
this.app.singleton("asset", () => {
|
|
216
216
|
return (key, def) => {
|
|
217
217
|
if (def) try {
|
|
218
|
-
(0, node_fs.statSync)((0, node_path.join)(
|
|
218
|
+
(0, node_fs.statSync)((0, node_path.join)(__h3ravel_support.Str.before(publicPath, key), key));
|
|
219
219
|
} catch {
|
|
220
220
|
key = def;
|
|
221
221
|
}
|
|
@@ -280,7 +280,7 @@ var Router = class {
|
|
|
280
280
|
signature
|
|
281
281
|
});
|
|
282
282
|
this.h3App[method](fullPath, this.resolveHandler(handler, middleware));
|
|
283
|
-
this.app.singleton("routes", () => this.routes);
|
|
283
|
+
this.app.singleton("app.routes", () => this.routes);
|
|
284
284
|
}
|
|
285
285
|
/**
|
|
286
286
|
* Resolves a route handler definition into an executable EventHandler.
|
|
@@ -442,7 +442,7 @@ var Router = class {
|
|
|
442
442
|
path$1 = path$1.replace(/\//g, "/");
|
|
443
443
|
const basePath = `/${path$1}`.replace(/\/+$/, "").replace(/(\/)+/g, "$1");
|
|
444
444
|
const name = basePath.substring(basePath.lastIndexOf("/") + 1).replaceAll(/\/|:/g, "") || "";
|
|
445
|
-
const param =
|
|
445
|
+
const param = __h3ravel_support.Str.singular(name);
|
|
446
446
|
this.get(basePath, [Controller, "index"], `${name}.index`, middleware);
|
|
447
447
|
this.post(basePath, [Controller, "store"], `${name}.store`, middleware);
|
|
448
448
|
this.get(`${basePath}/:${param}`, [Controller, "show"], `${name}.show`, middleware);
|
|
@@ -524,8 +524,18 @@ var RouteServiceProvider = class extends __h3ravel_core.ServiceProvider {
|
|
|
524
524
|
static priority = 997;
|
|
525
525
|
register() {
|
|
526
526
|
this.app.singleton("router", () => {
|
|
527
|
-
|
|
528
|
-
|
|
527
|
+
try {
|
|
528
|
+
const h3App = this.app.make("http.app");
|
|
529
|
+
return new Router(h3App, this.app);
|
|
530
|
+
} catch (error) {
|
|
531
|
+
if (String(error.message).includes("http.app")) __h3ravel_shared.Logger.log([
|
|
532
|
+
["The", "white"],
|
|
533
|
+
["@h3ravel/http", ["italic", "gray"]],
|
|
534
|
+
["package is required to use the routing system.", "white"]
|
|
535
|
+
], " ");
|
|
536
|
+
else __h3ravel_shared.Logger.log(error, "white");
|
|
537
|
+
}
|
|
538
|
+
return {};
|
|
529
539
|
});
|
|
530
540
|
this.commands([RouteListCommand]);
|
|
531
541
|
}
|
|
@@ -546,7 +556,7 @@ var RouteServiceProvider = class extends __h3ravel_core.ServiceProvider {
|
|
|
546
556
|
}
|
|
547
557
|
}
|
|
548
558
|
} catch (e) {
|
|
549
|
-
|
|
559
|
+
__h3ravel_shared.Logger.log([["No auto discorvered routes.", "white"], [e.message, ["grey", "italic"]]], "\n");
|
|
550
560
|
}
|
|
551
561
|
}
|
|
552
562
|
};
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["ConsoleCommand","path","Logger","params: string[]","match: RegExpExecArray | null","path","ServiceProvider","h3App: H3","app: Application","Kernel","HttpContext","Request","Response","path","controller: IController","Container","paramTypes: []","Model","ServiceProvider","path"],"sources":["../src/Commands/RouteListCommand.ts","../src/Helpers.ts","../src/Providers/AssetsServiceProvider.ts","../src/Route.ts","../src/Providers/RouteServiceProvider.ts"],"sourcesContent":["import { RouteDefinition, RouteMethod } from '../Contracts/Router'\n\nimport { ConsoleCommand } from '@h3ravel/core'\nimport { Logger } from '@h3ravel/shared'\nimport { LoggerChalk } from '@/packages/shared/dist'\n\nexport class RouteListCommand extends ConsoleCommand {\n\n /**\n * The name and signature of the console command.\n *\n * @var string\n */\n protected signature: string = `#route:\n {list : List all registered routes. \n | {--json : Output the route list as JSON}\n | {--r|reverse : Reverse the ordering of the routes}\n }\n `\n\n /**\n * The console command description.\n *\n * @var string\n */\n protected description: string = 'List all registered routes.'\n\n /**\n * Execute the console command.\n */\n public async handle (this: any) {\n console.log('')\n const command = (this.dictionary.baseCommand ?? this.dictionary.name)\n\n await this[command]()\n }\n\n /**\n * List all registered routes.\n */\n protected async list () {\n /**\n * Sort the routes alphabetically\n */\n const list = [...(this.app.make<any>('routes') as RouteDefinition[])].sort((a, b) => {\n if (a.path === '/' && b.path !== '/') return -1\n if (b.path === '/' && a.path !== '/') return 1\n return a.path.localeCompare(b.path)\n }).filter(e => !['head', 'patch'].includes(e.method))\n\n\n /**\n * Log the route list\n */\n list.forEach(route => {\n const path = route.path === '/'\n ? route.path\n : Logger.log((route.path.slice(1)).split('/').map(e => [\n (e.includes(':') ? Logger.log('/', 'white', false) : '') + e,\n e.startsWith(':') ? 'yellow' : 'white'\n ] as [string, LoggerChalk]), '', false)\n\n const method = (route.method.startsWith('/') ? route.method.slice(1) : route.method).toUpperCase() as RouteMethod\n const name = route.signature[1] ? [route.name ?? '', route.name ? '›' : '', route.signature.join('@')].join(' ') : ''\n\n const desc = Logger.describe(\n Logger.log(Logger.log(method + this.pair(method), this.color(method), false), 'green', false), path, 15, false\n )\n return Logger.twoColumnLog(desc.join(''), name)\n })\n }\n\n /**\n * Get the color\n * \n * @param method \n * @returns \n */\n private color (method: RouteMethod): LoggerChalk {\n switch (method.toLowerCase()) {\n case 'get':\n return 'blue'\n case 'head':\n return 'gray'\n case 'delete':\n return 'red'\n default:\n return 'yellow'\n }\n }\n\n /**\n * Get the alternate method\n * \n * @param method \n * @returns \n */\n private pair (method: RouteMethod) {\n switch (method.toLowerCase()) {\n case 'get':\n return Logger.log('|', 'gray', false) + Logger.log('HEAD', this.color('head'), false)\n case 'put':\n return Logger.log('|', 'gray', false) + Logger.log('PATCH', this.color('patch'), false)\n default:\n return ''\n }\n }\n}\n","import { HttpContext } from '@h3ravel/shared'\nimport { Model } from '@h3ravel/database'\n\nexport class Helpers {\n /**\n * Extracts parameter names from a route path string.\n *\n * - Looks for segments prefixed with \":\" (e.g. \"/users/:id\")\n * - Captures only the param name (without the \":\")\n * - Returns all matches in order of appearance\n *\n * @param path - The route path string (e.g. \"/groups/:group/users/:user\")\n * @returns An array of parameter names (e.g. [\"group\", \"user\"])\n */\n static extractParams (path: string): string[] {\n const regex = /:([^/]+)/g\n const params: string[] = []\n let match: RegExpExecArray | null\n\n while ((match = regex.exec(path)) !== null) {\n params.push(match[1])\n }\n\n return params\n }\n\n /**\n * Resolves route model binding for a given path, HTTP context, and model.\n * \n * - Extracts all route parameters from the given path\n * - If a parameter matches the model name, it attempts to resolve the model binding\n * using the provided value and binding field (defaults to \"id\" unless specified).\n * - For non-matching parameters, it simply returns the key-value pair as is.\n * - If no parameters are found, returns an empty object.\n *\n * @param path - The route path (e.g. \"/groups/:group/users/:user\")\n * @param ctx - The HTTP context containing the request\n * @param model - The model instance to resolve bindings against\n * @returns A resolved model instance or an object containing param values\n */\n static async resolveRouteModelBinding (path: string, ctx: HttpContext, model: Model): Promise<any> {\n const name = model.constructor.name.toLowerCase()\n /**\n * Extract field (defaults to 'id' if not specified after '|')\n */\n const field = name.split('|').at(1) ?? 'id'\n\n /**\n * Iterate through extracted parameters from the path\n */\n for await (const e of Helpers.extractParams(path)) {\n const value = ctx.request.params[e] ?? null\n if (e === name) return await model.resolveRouteBinding(value, field)\n else return { [e]: ctx.request.params[e] ?? {} }\n }\n\n return {}\n }\n}\n","import { readFile, stat } from 'node:fs/promises'\n\nimport { ServiceProvider } from '@h3ravel/core'\nimport { before } from '@h3ravel/support'\nimport { join } from 'node:path'\nimport { serveStatic } from 'h3'\nimport { statSync } from 'node:fs'\n\n/**\n * Handles public assets loading\n * \n * Auto-Registered\n */\nexport class AssetsServiceProvider extends ServiceProvider {\n public static priority = 996\n\n register () {\n const app = this.app.make('router')\n const publicPath = this.app.getPath('public')\n\n /**\n * Use a middleware to check if this request for for a file\n */\n app.middleware((event) => {\n const { pathname } = new URL(event.req.url)\n\n /**\n * Only serve if it looks like a static asset (has an extension)\n * but skip dotfiles or sensitive files\n */\n if (!/\\.[a-zA-Z0-9]+$/.test(pathname)) return\n if (pathname.startsWith('/.') || pathname.includes('..')) return\n\n /**\n * Serve the asset\n */\n return serveStatic(event, {\n indexNames: ['/index.html'],\n getContents: (id) => {\n return <never>readFile(join(before(publicPath, id), id))\n },\n getMeta: async (id) => {\n const stats = await stat(join(before(publicPath, id), id)).catch(() => { })\n if (stats?.isFile()) {\n return {\n size: stats.size,\n mtime: stats.mtimeMs,\n }\n }\n },\n })\n })\n\n this.app.singleton('asset', () => {\n return (key: string, def?: string) => {\n if (def) {\n try {\n statSync(join(before(publicPath, key), key))\n } catch {\n key = def\n }\n }\n\n return key\n }\n })\n }\n}\n","import 'reflect-metadata'\nimport { H3Event, Middleware, MiddlewareOptions, type H3 } from 'h3'\nimport { Application, Container, Kernel } from '@h3ravel/core'\nimport { Request, Response } from '@h3ravel/http'\nimport { singularize } from '@h3ravel/support'\nimport { HttpContext, RouteEventHandler } from '@h3ravel/shared'\nimport type { EventHandler, IController, IMiddleware, IRouter, RouterEnd } from '@h3ravel/shared'\nimport { Helpers } from './Helpers'\nimport { Model } from '@h3ravel/database'\nimport { RouteDefinition, RouteMethod } from './Contracts/Router'\n\nexport class Router implements IRouter {\n private routes: RouteDefinition[] = []\n private nameMap: string[] = []\n private groupPrefix = ''\n private middlewareMap: IMiddleware[] = []\n private groupMiddleware: EventHandler[] = []\n\n constructor(protected h3App: H3, private app: Application) { }\n\n /**\n * Route Resolver\n * \n * @param handler \n * @param middleware \n * @returns \n */\n private resolveHandler (handler: EventHandler, middleware: IMiddleware[] = []) {\n return async (event: H3Event) => {\n const kernel = new Kernel(() => HttpContext.init({\n app: this.app,\n request: new Request(event, this.app),\n response: new Response(event, this.app)\n }), middleware)\n\n return kernel.handle(event, (ctx) => Promise.resolve(handler(ctx)))\n }\n }\n\n /**\n * Add a route to the stack\n * \n * @param method \n * @param path \n * @param handler \n * @param name \n * @param middleware \n */\n private addRoute (\n method: RouteMethod,\n path: string,\n handler: EventHandler,\n name?: string,\n middleware: IMiddleware[] = [],\n signature: RouteDefinition['signature'] = ['', '']\n ) {\n /**\n * Join all defined route names to make a single route name\n */\n if (this.nameMap.length > 0) {\n name = this.nameMap.join('.')\n }\n\n /**\n * Join all defined middlewares\n */\n if (this.middlewareMap.length > 0) {\n middleware = this.middlewareMap\n }\n\n const fullPath = `${this.groupPrefix}${path}`.replace(/\\/+/g, '/')\n this.routes.push({ method, path: fullPath, name, handler, signature })\n this.h3App[method as 'get'](fullPath, this.resolveHandler(handler, middleware))\n this.app.singleton<any>('routes', () => this.routes)\n }\n\n /**\n * Resolves a route handler definition into an executable EventHandler.\n *\n * A handler can be:\n * - A function matching the EventHandler signature\n * - A controller class (optionally decorated for IoC resolution)\n *\n * If it’s a controller class, this method will:\n * - Instantiate it (via IoC or manually)\n * - Call the specified method (defaults to `index`)\n *\n * @param handler Event handler function OR controller class\n * @param methodName Method to invoke on the controller (defaults to 'index')\n */\n private resolveControllerOrHandler (\n handler: EventHandler | (new (...args: any[]) => Record<string, any>),\n methodName?: string,\n path?: string,\n ): EventHandler {\n /**\n * Checks if the handler is a function (either a plain function or a class constructor)\n */\n if (typeof handler === 'function' && typeof (handler as any).prototype !== 'undefined') {\n return async (ctx) => {\n let controller: IController\n if (Container.hasAnyDecorator(handler as any)) {\n /**\n * If the controller is decorated use the IoC container\n */\n controller = this.app.make<any, IController>(handler as any)\n } else {\n /**\n * Otherwise instantiate manually so that we can at least\n * pass the app instance\n */\n controller = new (handler as new (...args: any[]) => IController)(this.app)\n }\n\n /**\n * The method to execute (defaults to 'index')\n */\n const action = (methodName || 'index') as keyof IController\n\n /**\n * Ensure the method exists on the controller\n */\n if (typeof controller[action] !== 'function') {\n throw new Error(`Method \"${String(action)}\" not found on controller ${handler.name}`)\n }\n\n /**\n * Get param types for the controller method\n */\n const paramTypes: [] = Reflect.getMetadata('design:paramtypes', controller, action) || []\n\n /**\n * Resolve the bound dependencies\n */\n let args = await Promise.all(\n paramTypes.map(async (paramType: any) => {\n switch (paramType?.name) {\n case 'Application':\n return this.app\n case 'Request':\n return ctx.request\n case 'Response':\n return ctx.response\n case 'HttpContext':\n return ctx\n default: {\n const inst = this.app.make(paramType)\n if (inst instanceof Model) {\n // Route model binding returns a Promise\n return await Helpers.resolveRouteModelBinding(path ?? '', ctx, inst)\n }\n return inst\n }\n }\n })\n )\n\n /**\n * Ensure that the HttpContext is always available\n */\n if (args.length < 1) {\n args = [ctx]\n }\n\n /**\n * Call the controller method, passing all resolved dependencies\n */\n return await controller[action](...args)\n }\n }\n\n return handler as EventHandler\n }\n\n /**\n * Registers a route that responds to HTTP GET requests.\n *\n * @param path The URL pattern to match (can include parameters, e.g., '/users/:id').\n * @param definition Either:\n * - An EventHandler function\n * - A tuple: [ControllerClass, methodName]\n * @param name Optional route name (for URL generation or referencing).\n * @param middleware Optional array of middleware functions to execute before the handler.\n */\n get (\n path: string,\n definition: RouteEventHandler | [(new (...args: any[]) => Record<string, any>), methodName: string],\n name?: string,\n middleware: IMiddleware[] = []\n ): Omit<this, RouterEnd> {\n const handler = Array.isArray(definition) ? definition[0] : definition\n const methodName = Array.isArray(definition) ? definition[1] : undefined\n\n this.addRoute('get', path, this.resolveControllerOrHandler(handler, methodName, path), name, middleware, [handler.name, methodName])\n return this\n }\n\n /**\n * Registers a route that responds to HTTP POST requests.\n *\n * @param path The URL pattern to match (can include parameters, e.g., '/users').\n * @param definition Either:\n * - An EventHandler function\n * - A tuple: [ControllerClass, methodName]\n * @param name Optional route name (for URL generation or referencing).\n * @param middleware Optional array of middleware functions to execute before the handler.\n */\n post (\n path: string,\n definition: RouteEventHandler | [(new (...args: any[]) => Record<string, any>), methodName: string],\n name?: string,\n middleware: IMiddleware[] = []\n ): Omit<this, RouterEnd> {\n const handler = Array.isArray(definition) ? definition[0] : definition\n const methodName = Array.isArray(definition) ? definition[1] : undefined\n\n this.addRoute('post', path, this.resolveControllerOrHandler(handler, methodName, path), name, middleware, [handler.name, methodName])\n return this\n }\n\n /**\n * Registers a route that responds to HTTP PUT requests.\n *\n * @param path The URL pattern to match (can include parameters, e.g., '/users/:id').\n * @param definition Either:\n * - An EventHandler function\n * - A tuple: [ControllerClass, methodName]\n * @param name Optional route name (for URL generation or referencing).\n * @param middleware Optional array of middleware functions to execute before the handler.\n */\n put (\n path: string,\n definition: RouteEventHandler | [(new (...args: any[]) => Record<string, any>), methodName: string],\n name?: string,\n middleware: IMiddleware[] = []\n ): Omit<this, RouterEnd> {\n const handler = Array.isArray(definition) ? definition[0] : definition\n const methodName = Array.isArray(definition) ? definition[1] : undefined\n this.addRoute('put', path, this.resolveControllerOrHandler(handler, methodName, path), name, middleware, [handler.name, methodName])\n return this\n }\n\n /**\n * Registers a route that responds to HTTP PATCH requests.\n *\n * @param path The URL pattern to match (can include parameters, e.g., '/users/:id').\n * @param definition Either:\n * - An EventHandler function\n * - A tuple: [ControllerClass, methodName]\n * @param name Optional route name (for URL generation or referencing).\n * @param middleware Optional array of middleware functions to execute before the handler.\n */\n patch (\n path: string,\n definition: RouteEventHandler | [(new (...args: any[]) => Record<string, any>), methodName: string],\n name?: string,\n middleware: IMiddleware[] = []\n ): Omit<this, RouterEnd> {\n const handler = Array.isArray(definition) ? definition[0] : definition\n const methodName = Array.isArray(definition) ? definition[1] : undefined\n this.addRoute('patch', path, this.resolveControllerOrHandler(handler, methodName, path), name, middleware, [handler.name, methodName])\n return this\n }\n\n /**\n * Registers a route that responds to HTTP DELETE requests.\n *\n * @param path The URL pattern to match (can include parameters, e.g., '/users/:id').\n * @param definition Either:\n * - An EventHandler function\n * - A tuple: [ControllerClass, methodName]\n * @param name Optional route name (for URL generation or referencing).\n * @param middleware Optional array of middleware functions to execute before the handler.\n */\n delete (\n path: string,\n definition: RouteEventHandler | [(new (...args: any[]) => Record<string, any>), methodName: string],\n name?: string,\n middleware: IMiddleware[] = []\n ): Omit<this, RouterEnd> {\n const handler = Array.isArray(definition) ? definition[0] : definition\n const methodName = Array.isArray(definition) ? definition[1] : undefined\n this.addRoute('delete', path, this.resolveControllerOrHandler(handler, methodName, path), name, middleware, [handler.name, methodName])\n return this\n }\n\n /**\n * API Resource support \n * \n * @param path \n * @param controller \n */\n apiResource (\n path: string,\n Controller: new (app: Application) => IController,\n middleware: IMiddleware[] = []\n ): Omit<this, RouterEnd | 'name'> {\n path = path.replace(/\\//g, '/')\n\n const basePath = `/${path}`.replace(/\\/+$/, '').replace(/(\\/)+/g, '$1')\n const name = basePath.substring(basePath.lastIndexOf('/') + 1).replaceAll(/\\/|:/g, '') || ''\n const param = singularize(name)\n\n this.get(basePath, [Controller, 'index'], `${name}.index`, middleware)\n this.post(basePath, [Controller, 'store'], `${name}.store`, middleware)\n this.get(`${basePath}/:${param}`, [Controller, 'show'], `${name}.show`, middleware)\n this.put(`${basePath}/:${param}`, [Controller, 'update'], `${name}.update`, middleware)\n this.patch(`${basePath}/:${param}`, [Controller, 'update'], `${name}.update`, middleware)\n this.delete(`${basePath}/:${param}`, [Controller, 'destroy'], `${name}.destroy`, middleware)\n\n return this\n }\n\n /**\n * Named route URL generator\n * \n * @param name \n * @param params \n * @returns \n */\n route (name: string, params: Record<string, string> = {}): string | undefined {\n const found = this.routes.find(r => r.name === name)\n if (!found) return undefined\n\n let url = found.path\n for (const [key, value] of Object.entries(params)) {\n url = url.replace(`:${key}`, value)\n }\n return url\n }\n\n /**\n * Grouping\n * \n * @param options \n * @param callback \n */\n group (options: { prefix?: string; middleware?: EventHandler[] }, callback: (_e: this) => void) {\n const prevPrefix = this.groupPrefix\n const prevMiddleware = [...this.groupMiddleware]\n\n this.groupPrefix += options.prefix || ''\n this.groupMiddleware.push(...(options.middleware || []))\n\n callback(this)\n\n /**\n * Restore state after group\n */\n this.groupPrefix = prevPrefix\n this.groupMiddleware = prevMiddleware\n return this\n }\n\n /**\n * Set the name of the current route\n * \n * @param name \n */\n name (name: string) {\n this.nameMap.push(name)\n return this\n }\n\n /**\n * Registers middleware for a specific path.\n * @param path - The path to apply the middleware.\n * @param handler - The middleware handler.\n * @param opts - Optional middleware options.\n */\n middleware (path: string | IMiddleware[] | Middleware, handler: Middleware | MiddlewareOptions, opts?: MiddlewareOptions) {\n opts = typeof handler === 'object' ? handler : (typeof opts === 'function' ? opts : {})\n handler = typeof path === 'function' ? path : (typeof handler === 'function' ? handler : () => { })\n\n if (Array.isArray(path)) {\n this.middlewareMap.concat(path)\n } else if (typeof path === 'function') {\n this.h3App.use('/', () => { }).use(path)\n } else {\n this.h3App.use(path, handler, opts)\n }\n\n return this\n }\n}\n","import { RouteListCommand } from '../Commands/RouteListCommand'\nimport { Router } from '../Route'\nimport { ServiceProvider } from '@h3ravel/core'\nimport path from 'node:path'\nimport { readdir } from 'node:fs/promises'\n\n/**\n * Handles routing registration\n * \n * Load route files (web.ts, api.ts).\n * Map controllers to routes.\n * Register route-related middleware.\n * \n * Auto-Registered\n */\nexport class RouteServiceProvider extends ServiceProvider {\n public static priority = 997\n\n register () {\n this.app.singleton('router', () => {\n const h3App = this.app.make('http.app')\n return new Router(h3App, this.app)\n })\n this.commands([RouteListCommand])\n }\n\n /**\n * Load routes from src/routes\n */\n async boot () {\n try {\n const routePath = this.app.getPath('routes')\n\n const files = (await readdir(routePath)).filter((e) => {\n return !e.includes('.d.ts') && !e.includes('.d.cts') && !e.includes('.map')\n })\n\n for (let i = 0; i < files.length; i++) {\n const routesModule = await import(path.join(routePath, files[i]))\n\n if (typeof routesModule.default === 'function') {\n const router = this.app.make('router')\n routesModule.default(router)\n }\n }\n } catch (e) {\n console.warn('No web routes found or failed to load:', e)\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["ConsoleCommand","path","Logger","params: string[]","match: RegExpExecArray | null","path","ServiceProvider","Str","h3App: H3","app: Application","Kernel","HttpContext","Request","Response","path","controller: IController","Container","paramTypes: []","Model","Str","ServiceProvider","error: any","path","e: any"],"sources":["../src/Commands/RouteListCommand.ts","../src/Helpers.ts","../src/Providers/AssetsServiceProvider.ts","../src/Route.ts","../src/Providers/RouteServiceProvider.ts"],"sourcesContent":["import { Logger, LoggerChalk, RouteDefinition, RouteMethod } from '@h3ravel/shared'\n\nimport { ConsoleCommand } from '@h3ravel/core'\n\nexport class RouteListCommand extends ConsoleCommand {\n\n /**\n * The name and signature of the console command.\n *\n * @var string\n */\n protected signature: string = `#route:\n {list : List all registered routes. \n | {--json : Output the route list as JSON}\n | {--r|reverse : Reverse the ordering of the routes}\n }\n `\n\n /**\n * The console command description.\n *\n * @var string\n */\n protected description: string = 'List all registered routes.'\n\n /**\n * Execute the console command.\n */\n public async handle (this: any) {\n console.log('')\n const command = (this.dictionary.baseCommand ?? this.dictionary.name)\n\n await this[command]()\n }\n\n /**\n * List all registered routes.\n */\n protected async list () {\n /**\n * Sort the routes alphabetically\n */\n const list = [...(this.app.make('app.routes') as RouteDefinition[])].sort((a, b) => {\n if (a.path === '/' && b.path !== '/') return -1\n if (b.path === '/' && a.path !== '/') return 1\n return a.path.localeCompare(b.path)\n }).filter(e => !['head', 'patch'].includes(e.method))\n\n\n /**\n * Log the route list\n */\n list.forEach(route => {\n const path = route.path === '/'\n ? route.path\n : Logger.log((route.path.slice(1)).split('/').map(e => [\n (e.includes(':') ? Logger.log('/', 'white', false) : '') + e,\n e.startsWith(':') ? 'yellow' : 'white'\n ] as [string, LoggerChalk]), '', false)\n\n const method = (route.method.startsWith('/') ? route.method.slice(1) : route.method).toUpperCase() as RouteMethod\n const name = route.signature[1] ? [route.name ?? '', route.name ? '›' : '', route.signature.join('@')].join(' ') : ''\n\n const desc = Logger.describe(\n Logger.log(Logger.log(method + this.pair(method), this.color(method), false), 'green', false), path, 15, false\n )\n return Logger.twoColumnDetail(desc.join(''), name)\n })\n }\n\n /**\n * Get the color\n * \n * @param method \n * @returns \n */\n private color (method: RouteMethod): LoggerChalk {\n switch (method.toLowerCase()) {\n case 'get':\n return 'blue'\n case 'head':\n return 'gray'\n case 'delete':\n return 'red'\n default:\n return 'yellow'\n }\n }\n\n /**\n * Get the alternate method\n * \n * @param method \n * @returns \n */\n private pair (method: RouteMethod) {\n switch (method.toLowerCase()) {\n case 'get':\n return Logger.log('|', 'gray', false) + Logger.log('HEAD', this.color('head'), false)\n case 'put':\n return Logger.log('|', 'gray', false) + Logger.log('PATCH', this.color('patch'), false)\n default:\n return ''\n }\n }\n}\n","import { HttpContext } from '@h3ravel/shared'\nimport { Model } from '@h3ravel/database'\n\nexport class Helpers {\n /**\n * Extracts parameter names from a route path string.\n *\n * - Looks for segments prefixed with \":\" (e.g. \"/users/:id\")\n * - Captures only the param name (without the \":\")\n * - Returns all matches in order of appearance\n *\n * @param path - The route path string (e.g. \"/groups/:group/users/:user\")\n * @returns An array of parameter names (e.g. [\"group\", \"user\"])\n */\n static extractParams (path: string): string[] {\n const regex = /:([^/]+)/g\n const params: string[] = []\n let match: RegExpExecArray | null\n\n while ((match = regex.exec(path)) !== null) {\n params.push(match[1])\n }\n\n return params\n }\n\n /**\n * Resolves route model binding for a given path, HTTP context, and model.\n * \n * - Extracts all route parameters from the given path\n * - If a parameter matches the model name, it attempts to resolve the model binding\n * using the provided value and binding field (defaults to \"id\" unless specified).\n * - For non-matching parameters, it simply returns the key-value pair as is.\n * - If no parameters are found, returns an empty object.\n *\n * @param path - The route path (e.g. \"/groups/:group/users/:user\")\n * @param ctx - The HTTP context containing the request\n * @param model - The model instance to resolve bindings against\n * @returns A resolved model instance or an object containing param values\n */\n static async resolveRouteModelBinding (path: string, ctx: HttpContext, model: Model): Promise<any> {\n const name = model.constructor.name.toLowerCase()\n /**\n * Extract field (defaults to 'id' if not specified after '|')\n */\n const field = name.split('|').at(1) ?? 'id'\n\n /**\n * Iterate through extracted parameters from the path\n */\n for await (const e of Helpers.extractParams(path)) {\n const value = ctx.request.params[e] ?? null\n if (e === name) return await model.resolveRouteBinding(value, field)\n else return { [e]: ctx.request.params[e] ?? {} }\n }\n\n return {}\n }\n}\n","import { readFile, stat } from 'node:fs/promises'\n\nimport { ServiceProvider } from '@h3ravel/core'\nimport { Str } from '@h3ravel/support'\nimport { join } from 'node:path'\nimport { serveStatic } from 'h3'\nimport { statSync } from 'node:fs'\n\n/**\n * Handles public assets loading\n * \n * Auto-Registered\n */\nexport class AssetsServiceProvider extends ServiceProvider {\n public static priority = 996\n\n register () {\n const app = this.app.make('router')\n const publicPath = this.app.getPath('public')\n\n /**\n * Use a middleware to check if this request for for a file\n */\n app.middleware((event) => {\n const { pathname } = new URL(event.req.url)\n\n /**\n * Only serve if it looks like a static asset (has an extension)\n * but skip dotfiles or sensitive files\n */\n if (!/\\.[a-zA-Z0-9]+$/.test(pathname)) return\n if (pathname.startsWith('/.') || pathname.includes('..')) return\n\n /**\n * Serve the asset\n */\n return serveStatic(event, {\n indexNames: ['/index.html'],\n getContents: (id) => {\n return <never>readFile(join(Str.before(publicPath, id), id))\n },\n getMeta: async (id) => {\n const stats = await stat(join(Str.before(publicPath, id), id)).catch(() => { })\n if (stats?.isFile()) {\n return {\n size: stats.size,\n mtime: stats.mtimeMs,\n }\n }\n },\n })\n })\n\n this.app.singleton('asset', () => {\n return (key: string, def?: string) => {\n if (def) {\n try {\n statSync(join(Str.before(publicPath, key), key))\n } catch {\n key = def\n }\n }\n\n return key\n }\n })\n }\n}\n","import 'reflect-metadata'\nimport { H3Event, Middleware, MiddlewareOptions, type H3 } from 'h3'\nimport { Application, Container, Kernel } from '@h3ravel/core'\nimport { Request, Response } from '@h3ravel/http'\nimport { Str } from '@h3ravel/support'\nimport { HttpContext, RouteEventHandler } from '@h3ravel/shared'\nimport type { EventHandler, ExtractControllerMethods, IController, IMiddleware, IRouter, RouterEnd } from '@h3ravel/shared'\nimport { Helpers } from './Helpers'\nimport { Model } from '@h3ravel/database'\nimport { RouteDefinition, RouteMethod } from '@h3ravel/shared'\n\nexport class Router implements IRouter {\n private routes: RouteDefinition[] = []\n private nameMap: string[] = []\n private groupPrefix = ''\n private middlewareMap: IMiddleware[] = []\n private groupMiddleware: EventHandler[] = []\n\n constructor(protected h3App: H3, private app: Application) { }\n\n /**\n * Route Resolver\n * \n * @param handler \n * @param middleware \n * @returns \n */\n private resolveHandler (handler: EventHandler, middleware: IMiddleware[] = []) {\n return async (event: H3Event) => {\n const kernel = new Kernel(() => HttpContext.init({\n app: this.app,\n request: new Request(event, this.app),\n response: new Response(event, this.app)\n }), middleware)\n\n return kernel.handle(event, (ctx) => Promise.resolve(handler(ctx)))\n }\n }\n\n /**\n * Add a route to the stack\n * \n * @param method \n * @param path \n * @param handler \n * @param name \n * @param middleware \n */\n private addRoute (\n method: RouteMethod,\n path: string,\n handler: EventHandler,\n name?: string,\n middleware: IMiddleware[] = [],\n signature: RouteDefinition['signature'] = ['', '']\n ) {\n /**\n * Join all defined route names to make a single route name\n */\n if (this.nameMap.length > 0) {\n name = this.nameMap.join('.')\n }\n\n /**\n * Join all defined middlewares\n */\n if (this.middlewareMap.length > 0) {\n middleware = this.middlewareMap\n }\n\n const fullPath = `${this.groupPrefix}${path}`.replace(/\\/+/g, '/')\n this.routes.push({ method, path: fullPath, name, handler, signature })\n this.h3App[method as 'get'](fullPath, this.resolveHandler(handler, middleware))\n this.app.singleton('app.routes', () => this.routes)\n }\n\n /**\n * Resolves a route handler definition into an executable EventHandler.\n *\n * A handler can be:\n * - A function matching the EventHandler signature\n * - A controller class (optionally decorated for IoC resolution)\n *\n * If it’s a controller class, this method will:\n * - Instantiate it (via IoC or manually)\n * - Call the specified method (defaults to `index`)\n *\n * @param handler Event handler function OR controller class\n * @param methodName Method to invoke on the controller (defaults to 'index')\n */\n private resolveControllerOrHandler<C extends new (...args: any) => any> (\n handler: EventHandler | C,\n methodName?: string,\n path?: string,\n ): EventHandler {\n /**\n * Checks if the handler is a function (either a plain function or a class constructor)\n */\n if (typeof handler === 'function' && typeof (handler as any).prototype !== 'undefined') {\n return async (ctx) => {\n let controller: IController\n if (Container.hasAnyDecorator(handler as any)) {\n /**\n * If the controller is decorated use the IoC container\n */\n controller = this.app.make(handler as C)\n } else {\n /**\n * Otherwise instantiate manually so that we can at least\n * pass the app instance\n */\n controller = new (handler as C)(this.app)\n }\n\n /**\n * The method to execute (defaults to 'index')\n */\n const action = (methodName || 'index') as keyof IController\n\n /**\n * Ensure the method exists on the controller\n */\n if (typeof controller[action] !== 'function') {\n throw new Error(`Method \"${String(action)}\" not found on controller ${handler.name}`)\n }\n\n /**\n * Get param types for the controller method\n */\n const paramTypes: [] = Reflect.getMetadata('design:paramtypes', controller, action) || []\n\n /**\n * Resolve the bound dependencies\n */\n let args = await Promise.all(\n paramTypes.map(async (paramType: any) => {\n switch (paramType?.name) {\n case 'Application':\n return this.app\n case 'Request':\n return ctx.request\n case 'Response':\n return ctx.response\n case 'HttpContext':\n return ctx\n default: {\n const inst = this.app.make(paramType)\n if (inst instanceof Model) {\n // Route model binding returns a Promise\n return await Helpers.resolveRouteModelBinding(path ?? '', ctx, inst)\n }\n return inst\n }\n }\n })\n )\n\n /**\n * Ensure that the HttpContext is always available\n */\n if (args.length < 1) {\n args = [ctx]\n }\n\n /**\n * Call the controller method, passing all resolved dependencies\n */\n return await controller[action](...args)\n }\n }\n\n return handler as EventHandler\n }\n\n /**\n * Registers a route that responds to HTTP GET requests.\n *\n * @param path The URL pattern to match (can include parameters, e.g., '/users/:id').\n * @param definition Either:\n * - An EventHandler function\n * - A tuple: [ControllerClass, methodName]\n * @param name Optional route name (for URL generation or referencing).\n * @param middleware Optional array of middleware functions to execute before the handler.\n */\n get<C extends new (...args: any) => any> (\n path: string,\n definition: RouteEventHandler | [C, methodName: ExtractControllerMethods<InstanceType<C>>],\n name?: string,\n middleware: IMiddleware[] = []\n ): Omit<this, RouterEnd> {\n\n const handler = Array.isArray(definition) ? definition[0] : definition\n const methodName = Array.isArray(definition) ? <string>definition[1] : undefined\n\n // Add the route to the route stack\n this.addRoute(\n 'get',\n path,\n this.resolveControllerOrHandler(handler, methodName, path),\n name,\n middleware,\n [handler.name, methodName]\n )\n\n return this\n }\n\n /**\n * Registers a route that responds to HTTP POST requests.\n *\n * @param path The URL pattern to match (can include parameters, e.g., '/users').\n * @param definition Either:\n * - An EventHandler function\n * - A tuple: [ControllerClass, methodName]\n * @param name Optional route name (for URL generation or referencing).\n * @param middleware Optional array of middleware functions to execute before the handler.\n */\n post<C extends new (...args: any) => any> (\n path: string,\n definition: RouteEventHandler | [C, methodName: ExtractControllerMethods<InstanceType<C>>],\n name?: string,\n middleware: IMiddleware[] = []\n ): Omit<this, RouterEnd> {\n\n const handler = Array.isArray(definition) ? definition[0] : definition\n const methodName = Array.isArray(definition) ? <string>definition[1] : undefined\n\n // Add the route to the route stack\n this.addRoute(\n 'post',\n path,\n this.resolveControllerOrHandler(handler, methodName, path),\n name,\n middleware,\n [handler.name, methodName]\n )\n\n return this\n }\n\n /**\n * Registers a route that responds to HTTP PUT requests.\n *\n * @param path The URL pattern to match (can include parameters, e.g., '/users/:id').\n * @param definition Either:\n * - An EventHandler function\n * - A tuple: [ControllerClass, methodName]\n * @param name Optional route name (for URL generation or referencing).\n * @param middleware Optional array of middleware functions to execute before the handler.\n */\n put<C extends new (...args: any) => any> (\n path: string,\n definition: RouteEventHandler | [C, methodName: ExtractControllerMethods<InstanceType<C>>],\n name?: string,\n middleware: IMiddleware[] = []\n ): Omit<this, RouterEnd> {\n\n const handler = Array.isArray(definition) ? definition[0] : definition\n const methodName = Array.isArray(definition) ? <string>definition[1] : undefined\n\n // Add the route to the route stack\n this.addRoute(\n 'put',\n path,\n this.resolveControllerOrHandler(handler, methodName, path),\n name,\n middleware,\n [handler.name, methodName]\n )\n return this\n }\n\n /**\n * Registers a route that responds to HTTP PATCH requests.\n *\n * @param path The URL pattern to match (can include parameters, e.g., '/users/:id').\n * @param definition Either:\n * - An EventHandler function\n * - A tuple: [ControllerClass, methodName]\n * @param name Optional route name (for URL generation or referencing).\n * @param middleware Optional array of middleware functions to execute before the handler.\n */\n patch<C extends new (...args: any) => any> (\n path: string,\n definition: RouteEventHandler | [C, methodName: ExtractControllerMethods<InstanceType<C>>],\n name?: string,\n middleware: IMiddleware[] = []\n ): Omit<this, RouterEnd> {\n\n const handler = Array.isArray(definition) ? definition[0] : definition\n const methodName = Array.isArray(definition) ? <string>definition[1] : undefined\n\n // Add the route to the route stack\n this.addRoute(\n 'patch',\n path,\n this.resolveControllerOrHandler(handler, methodName, path),\n name,\n middleware,\n [handler.name, methodName]\n )\n\n return this\n }\n\n /**\n * Registers a route that responds to HTTP DELETE requests.\n *\n * @param path The URL pattern to match (can include parameters, e.g., '/users/:id').\n * @param definition Either:\n * - An EventHandler function\n * - A tuple: [ControllerClass, methodName]\n * @param name Optional route name (for URL generation or referencing).\n * @param middleware Optional array of middleware functions to execute before the handler.\n */\n delete<C extends new (...args: any) => any> (\n path: string,\n definition: RouteEventHandler | [C, methodName: ExtractControllerMethods<InstanceType<C>>],\n name?: string,\n middleware: IMiddleware[] = []\n ): Omit<this, RouterEnd> {\n\n const handler = Array.isArray(definition) ? definition[0] : definition\n const methodName = Array.isArray(definition) ? <string>definition[1] : undefined\n\n // Add the route to the route stack\n this.addRoute(\n 'delete',\n path,\n this.resolveControllerOrHandler(handler, methodName, path),\n name,\n middleware,\n [handler.name, methodName]\n )\n\n return this\n }\n\n /**\n * API Resource support \n * \n * @param path \n * @param controller \n */\n apiResource<C extends new (...args: any) => any> (\n path: string,\n Controller: C,\n middleware: IMiddleware[] = []\n ): Omit<this, RouterEnd | 'name'> {\n path = path.replace(/\\//g, '/')\n\n const basePath = `/${path}`.replace(/\\/+$/, '').replace(/(\\/)+/g, '$1')\n const name = basePath.substring(basePath.lastIndexOf('/') + 1).replaceAll(/\\/|:/g, '') || ''\n const param = Str.singular(name)\n\n this.get(basePath, [Controller, <never>'index'], `${name}.index`, middleware)\n this.post(basePath, [Controller, <never>'store'], `${name}.store`, middleware)\n this.get(`${basePath}/:${param}`, [Controller, <never>'show'], `${name}.show`, middleware)\n this.put(`${basePath}/:${param}`, [Controller, <never>'update'], `${name}.update`, middleware)\n this.patch(`${basePath}/:${param}`, [Controller, <never>'update'], `${name}.update`, middleware)\n this.delete(`${basePath}/:${param}`, [Controller, <never>'destroy'], `${name}.destroy`, middleware)\n\n return this\n }\n\n /**\n * Named route URL generator\n * \n * @param name \n * @param params \n * @returns \n */\n route (name: string, params: Record<string, string> = {}): string | undefined {\n const found = this.routes.find(r => r.name === name)\n if (!found) return undefined\n\n let url = found.path\n for (const [key, value] of Object.entries(params)) {\n url = url.replace(`:${key}`, value)\n }\n return url\n }\n\n /**\n * Grouping\n * \n * @param options \n * @param callback \n */\n group (options: { prefix?: string; middleware?: EventHandler[] }, callback: (_e: this) => void) {\n const prevPrefix = this.groupPrefix\n const prevMiddleware = [...this.groupMiddleware]\n\n this.groupPrefix += options.prefix || ''\n this.groupMiddleware.push(...(options.middleware || []))\n\n callback(this)\n\n /**\n * Restore state after group\n */\n this.groupPrefix = prevPrefix\n this.groupMiddleware = prevMiddleware\n return this\n }\n\n /**\n * Set the name of the current route\n * \n * @param name \n */\n name (name: string) {\n this.nameMap.push(name)\n return this\n }\n\n /**\n * Registers middleware for a specific path.\n * @param path - The path to apply the middleware.\n * @param handler - The middleware handler.\n * @param opts - Optional middleware options.\n */\n middleware (path: string | IMiddleware[] | Middleware, handler: Middleware | MiddlewareOptions, opts?: MiddlewareOptions) {\n opts = typeof handler === 'object' ? handler : (typeof opts === 'function' ? opts : {})\n handler = typeof path === 'function' ? path : (typeof handler === 'function' ? handler : () => { })\n\n if (Array.isArray(path)) {\n this.middlewareMap.concat(path)\n } else if (typeof path === 'function') {\n this.h3App.use('/', () => { }).use(path)\n } else {\n this.h3App.use(path, handler, opts)\n }\n\n return this\n }\n}\n","import { Logger } from '@h3ravel/shared'\nimport { RouteListCommand } from '../Commands/RouteListCommand'\nimport { Router } from '../Route'\nimport { ServiceProvider } from '@h3ravel/core'\nimport path from 'node:path'\nimport { readdir } from 'node:fs/promises'\n\n/**\n * Handles routing registration\n * \n * Load route files (web.ts, api.ts).\n * Map controllers to routes.\n * Register route-related middleware.\n * \n * Auto-Registered\n */\nexport class RouteServiceProvider extends ServiceProvider {\n public static priority = 997\n\n register () {\n this.app.singleton('router', () => {\n try {\n const h3App = this.app.make('http.app')\n return new Router(h3App, this.app)\n } catch (error: any) {\n if (String(error.message).includes('http.app'))\n Logger.log([\n ['The', 'white'],\n ['@h3ravel/http', ['italic', 'gray']],\n ['package is required to use the routing system.', 'white']\n ], ' ')\n else Logger.log(error, 'white')\n }\n return {} as Router\n })\n\n this.commands([RouteListCommand])\n }\n\n /**\n * Load routes from src/routes\n */\n async boot () {\n try {\n const routePath = this.app.getPath('routes')\n\n const files = (await readdir(routePath)).filter((e) => {\n return !e.includes('.d.ts') && !e.includes('.d.cts') && !e.includes('.map')\n })\n\n for (let i = 0; i < files.length; i++) {\n const routesModule = await import(path.join(routePath, files[i]))\n\n if (typeof routesModule.default === 'function') {\n const router = this.app.make('router')\n routesModule.default(router)\n }\n }\n } catch (e: any) {\n Logger.log([['No auto discorvered routes.', 'white'], [e.message, ['grey', 'italic']]], '\\n')\n }\n }\n}\n"],"mappings":"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"}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference path="./app.globals.d.ts" />
|
|
2
2
|
import { Application, ConsoleCommand, ServiceProvider } from "@h3ravel/core";
|
|
3
|
-
import { EventHandler,
|
|
3
|
+
import { EventHandler, ExtractControllerMethods, HttpContext, IMiddleware, IRouter, RouteEventHandler, RouterEnd } from "@h3ravel/shared";
|
|
4
4
|
import { Model } from "@h3ravel/database";
|
|
5
5
|
import { H3, Middleware, MiddlewareOptions } from "h3";
|
|
6
6
|
|
|
@@ -42,16 +42,6 @@ declare class RouteListCommand extends ConsoleCommand {
|
|
|
42
42
|
private pair;
|
|
43
43
|
}
|
|
44
44
|
//#endregion
|
|
45
|
-
//#region src/Contracts/Router.d.ts
|
|
46
|
-
type RouteMethod = 'get' | 'head' | 'put' | 'patch' | 'post' | 'delete';
|
|
47
|
-
interface RouteDefinition {
|
|
48
|
-
method: RouteMethod;
|
|
49
|
-
path: string;
|
|
50
|
-
name?: string | undefined;
|
|
51
|
-
handler: EventHandler;
|
|
52
|
-
signature: [string, string | undefined];
|
|
53
|
-
}
|
|
54
|
-
//#endregion
|
|
55
45
|
//#region src/Helpers.d.ts
|
|
56
46
|
declare class Helpers {
|
|
57
47
|
/**
|
|
@@ -165,7 +155,7 @@ declare class Router implements IRouter {
|
|
|
165
155
|
* @param name Optional route name (for URL generation or referencing).
|
|
166
156
|
* @param middleware Optional array of middleware functions to execute before the handler.
|
|
167
157
|
*/
|
|
168
|
-
get
|
|
158
|
+
get<C extends new (...args: any) => any>(path: string, definition: RouteEventHandler | [C, methodName: ExtractControllerMethods<InstanceType<C>>], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
|
|
169
159
|
/**
|
|
170
160
|
* Registers a route that responds to HTTP POST requests.
|
|
171
161
|
*
|
|
@@ -176,7 +166,7 @@ declare class Router implements IRouter {
|
|
|
176
166
|
* @param name Optional route name (for URL generation or referencing).
|
|
177
167
|
* @param middleware Optional array of middleware functions to execute before the handler.
|
|
178
168
|
*/
|
|
179
|
-
post
|
|
169
|
+
post<C extends new (...args: any) => any>(path: string, definition: RouteEventHandler | [C, methodName: ExtractControllerMethods<InstanceType<C>>], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
|
|
180
170
|
/**
|
|
181
171
|
* Registers a route that responds to HTTP PUT requests.
|
|
182
172
|
*
|
|
@@ -187,7 +177,7 @@ declare class Router implements IRouter {
|
|
|
187
177
|
* @param name Optional route name (for URL generation or referencing).
|
|
188
178
|
* @param middleware Optional array of middleware functions to execute before the handler.
|
|
189
179
|
*/
|
|
190
|
-
put
|
|
180
|
+
put<C extends new (...args: any) => any>(path: string, definition: RouteEventHandler | [C, methodName: ExtractControllerMethods<InstanceType<C>>], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
|
|
191
181
|
/**
|
|
192
182
|
* Registers a route that responds to HTTP PATCH requests.
|
|
193
183
|
*
|
|
@@ -198,7 +188,7 @@ declare class Router implements IRouter {
|
|
|
198
188
|
* @param name Optional route name (for URL generation or referencing).
|
|
199
189
|
* @param middleware Optional array of middleware functions to execute before the handler.
|
|
200
190
|
*/
|
|
201
|
-
patch
|
|
191
|
+
patch<C extends new (...args: any) => any>(path: string, definition: RouteEventHandler | [C, methodName: ExtractControllerMethods<InstanceType<C>>], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
|
|
202
192
|
/**
|
|
203
193
|
* Registers a route that responds to HTTP DELETE requests.
|
|
204
194
|
*
|
|
@@ -209,14 +199,14 @@ declare class Router implements IRouter {
|
|
|
209
199
|
* @param name Optional route name (for URL generation or referencing).
|
|
210
200
|
* @param middleware Optional array of middleware functions to execute before the handler.
|
|
211
201
|
*/
|
|
212
|
-
delete
|
|
202
|
+
delete<C extends new (...args: any) => any>(path: string, definition: RouteEventHandler | [C, methodName: ExtractControllerMethods<InstanceType<C>>], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
|
|
213
203
|
/**
|
|
214
204
|
* API Resource support
|
|
215
205
|
*
|
|
216
206
|
* @param path
|
|
217
207
|
* @param controller
|
|
218
208
|
*/
|
|
219
|
-
apiResource
|
|
209
|
+
apiResource<C extends new (...args: any) => any>(path: string, Controller: C, middleware?: IMiddleware[]): Omit<this, RouterEnd | 'name'>;
|
|
220
210
|
/**
|
|
221
211
|
* Named route URL generator
|
|
222
212
|
*
|
|
@@ -250,5 +240,5 @@ declare class Router implements IRouter {
|
|
|
250
240
|
middleware(path: string | IMiddleware[] | Middleware, handler: Middleware | MiddlewareOptions, opts?: MiddlewareOptions): this;
|
|
251
241
|
}
|
|
252
242
|
//#endregion
|
|
253
|
-
export { AssetsServiceProvider, Helpers,
|
|
243
|
+
export { AssetsServiceProvider, Helpers, RouteListCommand, RouteServiceProvider, Router };
|
|
254
244
|
//# sourceMappingURL=index.d.cts.map
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference path="./app.globals.d.ts" />
|
|
2
|
+
import { EventHandler, ExtractControllerMethods, HttpContext, IMiddleware, IRouter, RouteEventHandler, RouterEnd } from "@h3ravel/shared";
|
|
2
3
|
import { Application, ConsoleCommand, ServiceProvider } from "@h3ravel/core";
|
|
3
|
-
import { EventHandler, HttpContext, IController, IMiddleware, IRouter, RouteEventHandler, RouterEnd } from "@h3ravel/shared";
|
|
4
4
|
import { H3, Middleware, MiddlewareOptions } from "h3";
|
|
5
5
|
import "reflect-metadata";
|
|
6
6
|
import { Model } from "@h3ravel/database";
|
|
@@ -43,16 +43,6 @@ declare class RouteListCommand extends ConsoleCommand {
|
|
|
43
43
|
private pair;
|
|
44
44
|
}
|
|
45
45
|
//#endregion
|
|
46
|
-
//#region src/Contracts/Router.d.ts
|
|
47
|
-
type RouteMethod = 'get' | 'head' | 'put' | 'patch' | 'post' | 'delete';
|
|
48
|
-
interface RouteDefinition {
|
|
49
|
-
method: RouteMethod;
|
|
50
|
-
path: string;
|
|
51
|
-
name?: string | undefined;
|
|
52
|
-
handler: EventHandler;
|
|
53
|
-
signature: [string, string | undefined];
|
|
54
|
-
}
|
|
55
|
-
//#endregion
|
|
56
46
|
//#region src/Helpers.d.ts
|
|
57
47
|
declare class Helpers {
|
|
58
48
|
/**
|
|
@@ -166,7 +156,7 @@ declare class Router implements IRouter {
|
|
|
166
156
|
* @param name Optional route name (for URL generation or referencing).
|
|
167
157
|
* @param middleware Optional array of middleware functions to execute before the handler.
|
|
168
158
|
*/
|
|
169
|
-
get
|
|
159
|
+
get<C extends new (...args: any) => any>(path: string, definition: RouteEventHandler | [C, methodName: ExtractControllerMethods<InstanceType<C>>], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
|
|
170
160
|
/**
|
|
171
161
|
* Registers a route that responds to HTTP POST requests.
|
|
172
162
|
*
|
|
@@ -177,7 +167,7 @@ declare class Router implements IRouter {
|
|
|
177
167
|
* @param name Optional route name (for URL generation or referencing).
|
|
178
168
|
* @param middleware Optional array of middleware functions to execute before the handler.
|
|
179
169
|
*/
|
|
180
|
-
post
|
|
170
|
+
post<C extends new (...args: any) => any>(path: string, definition: RouteEventHandler | [C, methodName: ExtractControllerMethods<InstanceType<C>>], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
|
|
181
171
|
/**
|
|
182
172
|
* Registers a route that responds to HTTP PUT requests.
|
|
183
173
|
*
|
|
@@ -188,7 +178,7 @@ declare class Router implements IRouter {
|
|
|
188
178
|
* @param name Optional route name (for URL generation or referencing).
|
|
189
179
|
* @param middleware Optional array of middleware functions to execute before the handler.
|
|
190
180
|
*/
|
|
191
|
-
put
|
|
181
|
+
put<C extends new (...args: any) => any>(path: string, definition: RouteEventHandler | [C, methodName: ExtractControllerMethods<InstanceType<C>>], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
|
|
192
182
|
/**
|
|
193
183
|
* Registers a route that responds to HTTP PATCH requests.
|
|
194
184
|
*
|
|
@@ -199,7 +189,7 @@ declare class Router implements IRouter {
|
|
|
199
189
|
* @param name Optional route name (for URL generation or referencing).
|
|
200
190
|
* @param middleware Optional array of middleware functions to execute before the handler.
|
|
201
191
|
*/
|
|
202
|
-
patch
|
|
192
|
+
patch<C extends new (...args: any) => any>(path: string, definition: RouteEventHandler | [C, methodName: ExtractControllerMethods<InstanceType<C>>], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
|
|
203
193
|
/**
|
|
204
194
|
* Registers a route that responds to HTTP DELETE requests.
|
|
205
195
|
*
|
|
@@ -210,14 +200,14 @@ declare class Router implements IRouter {
|
|
|
210
200
|
* @param name Optional route name (for URL generation or referencing).
|
|
211
201
|
* @param middleware Optional array of middleware functions to execute before the handler.
|
|
212
202
|
*/
|
|
213
|
-
delete
|
|
203
|
+
delete<C extends new (...args: any) => any>(path: string, definition: RouteEventHandler | [C, methodName: ExtractControllerMethods<InstanceType<C>>], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
|
|
214
204
|
/**
|
|
215
205
|
* API Resource support
|
|
216
206
|
*
|
|
217
207
|
* @param path
|
|
218
208
|
* @param controller
|
|
219
209
|
*/
|
|
220
|
-
apiResource
|
|
210
|
+
apiResource<C extends new (...args: any) => any>(path: string, Controller: C, middleware?: IMiddleware[]): Omit<this, RouterEnd | 'name'>;
|
|
221
211
|
/**
|
|
222
212
|
* Named route URL generator
|
|
223
213
|
*
|
|
@@ -251,5 +241,5 @@ declare class Router implements IRouter {
|
|
|
251
241
|
middleware(path: string | IMiddleware[] | Middleware, handler: Middleware | MiddlewareOptions, opts?: MiddlewareOptions): this;
|
|
252
242
|
}
|
|
253
243
|
//#endregion
|
|
254
|
-
export { AssetsServiceProvider, Helpers,
|
|
244
|
+
export { AssetsServiceProvider, Helpers, RouteListCommand, RouteServiceProvider, Router };
|
|
255
245
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { ConsoleCommand, Container, Kernel, ServiceProvider } from "@h3ravel/core";
|
|
2
1
|
import { HttpContext, Logger } from "@h3ravel/shared";
|
|
2
|
+
import { ConsoleCommand, Container, Kernel, ServiceProvider } from "@h3ravel/core";
|
|
3
3
|
import { readFile, readdir, stat } from "node:fs/promises";
|
|
4
|
-
import {
|
|
4
|
+
import { Str } from "@h3ravel/support";
|
|
5
5
|
import path, { join } from "node:path";
|
|
6
6
|
import { serveStatic } from "h3";
|
|
7
7
|
import { statSync } from "node:fs";
|
|
@@ -43,7 +43,7 @@ var RouteListCommand = class extends ConsoleCommand {
|
|
|
43
43
|
/**
|
|
44
44
|
* Log the route list
|
|
45
45
|
*/
|
|
46
|
-
[...this.app.make("routes")].sort((a, b) => {
|
|
46
|
+
[...this.app.make("app.routes")].sort((a, b) => {
|
|
47
47
|
if (a.path === "/" && b.path !== "/") return -1;
|
|
48
48
|
if (b.path === "/" && a.path !== "/") return 1;
|
|
49
49
|
return a.path.localeCompare(b.path);
|
|
@@ -56,7 +56,7 @@ var RouteListCommand = class extends ConsoleCommand {
|
|
|
56
56
|
route.signature.join("@")
|
|
57
57
|
].join(" ") : "";
|
|
58
58
|
const desc = Logger.describe(Logger.log(Logger.log(method + this.pair(method), this.color(method), false), "green", false), path$1, 15, false);
|
|
59
|
-
return Logger.
|
|
59
|
+
return Logger.twoColumnDetail(desc.join(""), name);
|
|
60
60
|
});
|
|
61
61
|
}
|
|
62
62
|
/**
|
|
@@ -169,10 +169,10 @@ var AssetsServiceProvider = class extends ServiceProvider {
|
|
|
169
169
|
return serveStatic(event, {
|
|
170
170
|
indexNames: ["/index.html"],
|
|
171
171
|
getContents: (id) => {
|
|
172
|
-
return readFile(join(before(publicPath, id), id));
|
|
172
|
+
return readFile(join(Str.before(publicPath, id), id));
|
|
173
173
|
},
|
|
174
174
|
getMeta: async (id) => {
|
|
175
|
-
const stats = await stat(join(before(publicPath, id), id)).catch(() => {});
|
|
175
|
+
const stats = await stat(join(Str.before(publicPath, id), id)).catch(() => {});
|
|
176
176
|
if (stats?.isFile()) return {
|
|
177
177
|
size: stats.size,
|
|
178
178
|
mtime: stats.mtimeMs
|
|
@@ -183,7 +183,7 @@ var AssetsServiceProvider = class extends ServiceProvider {
|
|
|
183
183
|
this.app.singleton("asset", () => {
|
|
184
184
|
return (key, def) => {
|
|
185
185
|
if (def) try {
|
|
186
|
-
statSync(join(before(publicPath, key), key));
|
|
186
|
+
statSync(join(Str.before(publicPath, key), key));
|
|
187
187
|
} catch {
|
|
188
188
|
key = def;
|
|
189
189
|
}
|
|
@@ -248,7 +248,7 @@ var Router = class {
|
|
|
248
248
|
signature
|
|
249
249
|
});
|
|
250
250
|
this.h3App[method](fullPath, this.resolveHandler(handler, middleware));
|
|
251
|
-
this.app.singleton("routes", () => this.routes);
|
|
251
|
+
this.app.singleton("app.routes", () => this.routes);
|
|
252
252
|
}
|
|
253
253
|
/**
|
|
254
254
|
* Resolves a route handler definition into an executable EventHandler.
|
|
@@ -410,7 +410,7 @@ var Router = class {
|
|
|
410
410
|
path$1 = path$1.replace(/\//g, "/");
|
|
411
411
|
const basePath = `/${path$1}`.replace(/\/+$/, "").replace(/(\/)+/g, "$1");
|
|
412
412
|
const name = basePath.substring(basePath.lastIndexOf("/") + 1).replaceAll(/\/|:/g, "") || "";
|
|
413
|
-
const param =
|
|
413
|
+
const param = Str.singular(name);
|
|
414
414
|
this.get(basePath, [Controller, "index"], `${name}.index`, middleware);
|
|
415
415
|
this.post(basePath, [Controller, "store"], `${name}.store`, middleware);
|
|
416
416
|
this.get(`${basePath}/:${param}`, [Controller, "show"], `${name}.show`, middleware);
|
|
@@ -492,8 +492,18 @@ var RouteServiceProvider = class extends ServiceProvider {
|
|
|
492
492
|
static priority = 997;
|
|
493
493
|
register() {
|
|
494
494
|
this.app.singleton("router", () => {
|
|
495
|
-
|
|
496
|
-
|
|
495
|
+
try {
|
|
496
|
+
const h3App = this.app.make("http.app");
|
|
497
|
+
return new Router(h3App, this.app);
|
|
498
|
+
} catch (error) {
|
|
499
|
+
if (String(error.message).includes("http.app")) Logger.log([
|
|
500
|
+
["The", "white"],
|
|
501
|
+
["@h3ravel/http", ["italic", "gray"]],
|
|
502
|
+
["package is required to use the routing system.", "white"]
|
|
503
|
+
], " ");
|
|
504
|
+
else Logger.log(error, "white");
|
|
505
|
+
}
|
|
506
|
+
return {};
|
|
497
507
|
});
|
|
498
508
|
this.commands([RouteListCommand]);
|
|
499
509
|
}
|
|
@@ -514,7 +524,7 @@ var RouteServiceProvider = class extends ServiceProvider {
|
|
|
514
524
|
}
|
|
515
525
|
}
|
|
516
526
|
} catch (e) {
|
|
517
|
-
|
|
527
|
+
Logger.log([["No auto discorvered routes.", "white"], [e.message, ["grey", "italic"]]], "\n");
|
|
518
528
|
}
|
|
519
529
|
}
|
|
520
530
|
};
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["path","params: string[]","match: RegExpExecArray | null","path","h3App: H3","app: Application","path","controller: IController","paramTypes: []"],"sources":["../src/Commands/RouteListCommand.ts","../src/Helpers.ts","../src/Providers/AssetsServiceProvider.ts","../src/Route.ts","../src/Providers/RouteServiceProvider.ts"],"sourcesContent":["import { RouteDefinition, RouteMethod } from '../Contracts/Router'\n\nimport { ConsoleCommand } from '@h3ravel/core'\nimport { Logger } from '@h3ravel/shared'\nimport { LoggerChalk } from '@/packages/shared/dist'\n\nexport class RouteListCommand extends ConsoleCommand {\n\n /**\n * The name and signature of the console command.\n *\n * @var string\n */\n protected signature: string = `#route:\n {list : List all registered routes. \n | {--json : Output the route list as JSON}\n | {--r|reverse : Reverse the ordering of the routes}\n }\n `\n\n /**\n * The console command description.\n *\n * @var string\n */\n protected description: string = 'List all registered routes.'\n\n /**\n * Execute the console command.\n */\n public async handle (this: any) {\n console.log('')\n const command = (this.dictionary.baseCommand ?? this.dictionary.name)\n\n await this[command]()\n }\n\n /**\n * List all registered routes.\n */\n protected async list () {\n /**\n * Sort the routes alphabetically\n */\n const list = [...(this.app.make<any>('routes') as RouteDefinition[])].sort((a, b) => {\n if (a.path === '/' && b.path !== '/') return -1\n if (b.path === '/' && a.path !== '/') return 1\n return a.path.localeCompare(b.path)\n }).filter(e => !['head', 'patch'].includes(e.method))\n\n\n /**\n * Log the route list\n */\n list.forEach(route => {\n const path = route.path === '/'\n ? route.path\n : Logger.log((route.path.slice(1)).split('/').map(e => [\n (e.includes(':') ? Logger.log('/', 'white', false) : '') + e,\n e.startsWith(':') ? 'yellow' : 'white'\n ] as [string, LoggerChalk]), '', false)\n\n const method = (route.method.startsWith('/') ? route.method.slice(1) : route.method).toUpperCase() as RouteMethod\n const name = route.signature[1] ? [route.name ?? '', route.name ? '›' : '', route.signature.join('@')].join(' ') : ''\n\n const desc = Logger.describe(\n Logger.log(Logger.log(method + this.pair(method), this.color(method), false), 'green', false), path, 15, false\n )\n return Logger.twoColumnLog(desc.join(''), name)\n })\n }\n\n /**\n * Get the color\n * \n * @param method \n * @returns \n */\n private color (method: RouteMethod): LoggerChalk {\n switch (method.toLowerCase()) {\n case 'get':\n return 'blue'\n case 'head':\n return 'gray'\n case 'delete':\n return 'red'\n default:\n return 'yellow'\n }\n }\n\n /**\n * Get the alternate method\n * \n * @param method \n * @returns \n */\n private pair (method: RouteMethod) {\n switch (method.toLowerCase()) {\n case 'get':\n return Logger.log('|', 'gray', false) + Logger.log('HEAD', this.color('head'), false)\n case 'put':\n return Logger.log('|', 'gray', false) + Logger.log('PATCH', this.color('patch'), false)\n default:\n return ''\n }\n }\n}\n","import { HttpContext } from '@h3ravel/shared'\nimport { Model } from '@h3ravel/database'\n\nexport class Helpers {\n /**\n * Extracts parameter names from a route path string.\n *\n * - Looks for segments prefixed with \":\" (e.g. \"/users/:id\")\n * - Captures only the param name (without the \":\")\n * - Returns all matches in order of appearance\n *\n * @param path - The route path string (e.g. \"/groups/:group/users/:user\")\n * @returns An array of parameter names (e.g. [\"group\", \"user\"])\n */\n static extractParams (path: string): string[] {\n const regex = /:([^/]+)/g\n const params: string[] = []\n let match: RegExpExecArray | null\n\n while ((match = regex.exec(path)) !== null) {\n params.push(match[1])\n }\n\n return params\n }\n\n /**\n * Resolves route model binding for a given path, HTTP context, and model.\n * \n * - Extracts all route parameters from the given path\n * - If a parameter matches the model name, it attempts to resolve the model binding\n * using the provided value and binding field (defaults to \"id\" unless specified).\n * - For non-matching parameters, it simply returns the key-value pair as is.\n * - If no parameters are found, returns an empty object.\n *\n * @param path - The route path (e.g. \"/groups/:group/users/:user\")\n * @param ctx - The HTTP context containing the request\n * @param model - The model instance to resolve bindings against\n * @returns A resolved model instance or an object containing param values\n */\n static async resolveRouteModelBinding (path: string, ctx: HttpContext, model: Model): Promise<any> {\n const name = model.constructor.name.toLowerCase()\n /**\n * Extract field (defaults to 'id' if not specified after '|')\n */\n const field = name.split('|').at(1) ?? 'id'\n\n /**\n * Iterate through extracted parameters from the path\n */\n for await (const e of Helpers.extractParams(path)) {\n const value = ctx.request.params[e] ?? null\n if (e === name) return await model.resolveRouteBinding(value, field)\n else return { [e]: ctx.request.params[e] ?? {} }\n }\n\n return {}\n }\n}\n","import { readFile, stat } from 'node:fs/promises'\n\nimport { ServiceProvider } from '@h3ravel/core'\nimport { before } from '@h3ravel/support'\nimport { join } from 'node:path'\nimport { serveStatic } from 'h3'\nimport { statSync } from 'node:fs'\n\n/**\n * Handles public assets loading\n * \n * Auto-Registered\n */\nexport class AssetsServiceProvider extends ServiceProvider {\n public static priority = 996\n\n register () {\n const app = this.app.make('router')\n const publicPath = this.app.getPath('public')\n\n /**\n * Use a middleware to check if this request for for a file\n */\n app.middleware((event) => {\n const { pathname } = new URL(event.req.url)\n\n /**\n * Only serve if it looks like a static asset (has an extension)\n * but skip dotfiles or sensitive files\n */\n if (!/\\.[a-zA-Z0-9]+$/.test(pathname)) return\n if (pathname.startsWith('/.') || pathname.includes('..')) return\n\n /**\n * Serve the asset\n */\n return serveStatic(event, {\n indexNames: ['/index.html'],\n getContents: (id) => {\n return <never>readFile(join(before(publicPath, id), id))\n },\n getMeta: async (id) => {\n const stats = await stat(join(before(publicPath, id), id)).catch(() => { })\n if (stats?.isFile()) {\n return {\n size: stats.size,\n mtime: stats.mtimeMs,\n }\n }\n },\n })\n })\n\n this.app.singleton('asset', () => {\n return (key: string, def?: string) => {\n if (def) {\n try {\n statSync(join(before(publicPath, key), key))\n } catch {\n key = def\n }\n }\n\n return key\n }\n })\n }\n}\n","import 'reflect-metadata'\nimport { H3Event, Middleware, MiddlewareOptions, type H3 } from 'h3'\nimport { Application, Container, Kernel } from '@h3ravel/core'\nimport { Request, Response } from '@h3ravel/http'\nimport { singularize } from '@h3ravel/support'\nimport { HttpContext, RouteEventHandler } from '@h3ravel/shared'\nimport type { EventHandler, IController, IMiddleware, IRouter, RouterEnd } from '@h3ravel/shared'\nimport { Helpers } from './Helpers'\nimport { Model } from '@h3ravel/database'\nimport { RouteDefinition, RouteMethod } from './Contracts/Router'\n\nexport class Router implements IRouter {\n private routes: RouteDefinition[] = []\n private nameMap: string[] = []\n private groupPrefix = ''\n private middlewareMap: IMiddleware[] = []\n private groupMiddleware: EventHandler[] = []\n\n constructor(protected h3App: H3, private app: Application) { }\n\n /**\n * Route Resolver\n * \n * @param handler \n * @param middleware \n * @returns \n */\n private resolveHandler (handler: EventHandler, middleware: IMiddleware[] = []) {\n return async (event: H3Event) => {\n const kernel = new Kernel(() => HttpContext.init({\n app: this.app,\n request: new Request(event, this.app),\n response: new Response(event, this.app)\n }), middleware)\n\n return kernel.handle(event, (ctx) => Promise.resolve(handler(ctx)))\n }\n }\n\n /**\n * Add a route to the stack\n * \n * @param method \n * @param path \n * @param handler \n * @param name \n * @param middleware \n */\n private addRoute (\n method: RouteMethod,\n path: string,\n handler: EventHandler,\n name?: string,\n middleware: IMiddleware[] = [],\n signature: RouteDefinition['signature'] = ['', '']\n ) {\n /**\n * Join all defined route names to make a single route name\n */\n if (this.nameMap.length > 0) {\n name = this.nameMap.join('.')\n }\n\n /**\n * Join all defined middlewares\n */\n if (this.middlewareMap.length > 0) {\n middleware = this.middlewareMap\n }\n\n const fullPath = `${this.groupPrefix}${path}`.replace(/\\/+/g, '/')\n this.routes.push({ method, path: fullPath, name, handler, signature })\n this.h3App[method as 'get'](fullPath, this.resolveHandler(handler, middleware))\n this.app.singleton<any>('routes', () => this.routes)\n }\n\n /**\n * Resolves a route handler definition into an executable EventHandler.\n *\n * A handler can be:\n * - A function matching the EventHandler signature\n * - A controller class (optionally decorated for IoC resolution)\n *\n * If it’s a controller class, this method will:\n * - Instantiate it (via IoC or manually)\n * - Call the specified method (defaults to `index`)\n *\n * @param handler Event handler function OR controller class\n * @param methodName Method to invoke on the controller (defaults to 'index')\n */\n private resolveControllerOrHandler (\n handler: EventHandler | (new (...args: any[]) => Record<string, any>),\n methodName?: string,\n path?: string,\n ): EventHandler {\n /**\n * Checks if the handler is a function (either a plain function or a class constructor)\n */\n if (typeof handler === 'function' && typeof (handler as any).prototype !== 'undefined') {\n return async (ctx) => {\n let controller: IController\n if (Container.hasAnyDecorator(handler as any)) {\n /**\n * If the controller is decorated use the IoC container\n */\n controller = this.app.make<any, IController>(handler as any)\n } else {\n /**\n * Otherwise instantiate manually so that we can at least\n * pass the app instance\n */\n controller = new (handler as new (...args: any[]) => IController)(this.app)\n }\n\n /**\n * The method to execute (defaults to 'index')\n */\n const action = (methodName || 'index') as keyof IController\n\n /**\n * Ensure the method exists on the controller\n */\n if (typeof controller[action] !== 'function') {\n throw new Error(`Method \"${String(action)}\" not found on controller ${handler.name}`)\n }\n\n /**\n * Get param types for the controller method\n */\n const paramTypes: [] = Reflect.getMetadata('design:paramtypes', controller, action) || []\n\n /**\n * Resolve the bound dependencies\n */\n let args = await Promise.all(\n paramTypes.map(async (paramType: any) => {\n switch (paramType?.name) {\n case 'Application':\n return this.app\n case 'Request':\n return ctx.request\n case 'Response':\n return ctx.response\n case 'HttpContext':\n return ctx\n default: {\n const inst = this.app.make(paramType)\n if (inst instanceof Model) {\n // Route model binding returns a Promise\n return await Helpers.resolveRouteModelBinding(path ?? '', ctx, inst)\n }\n return inst\n }\n }\n })\n )\n\n /**\n * Ensure that the HttpContext is always available\n */\n if (args.length < 1) {\n args = [ctx]\n }\n\n /**\n * Call the controller method, passing all resolved dependencies\n */\n return await controller[action](...args)\n }\n }\n\n return handler as EventHandler\n }\n\n /**\n * Registers a route that responds to HTTP GET requests.\n *\n * @param path The URL pattern to match (can include parameters, e.g., '/users/:id').\n * @param definition Either:\n * - An EventHandler function\n * - A tuple: [ControllerClass, methodName]\n * @param name Optional route name (for URL generation or referencing).\n * @param middleware Optional array of middleware functions to execute before the handler.\n */\n get (\n path: string,\n definition: RouteEventHandler | [(new (...args: any[]) => Record<string, any>), methodName: string],\n name?: string,\n middleware: IMiddleware[] = []\n ): Omit<this, RouterEnd> {\n const handler = Array.isArray(definition) ? definition[0] : definition\n const methodName = Array.isArray(definition) ? definition[1] : undefined\n\n this.addRoute('get', path, this.resolveControllerOrHandler(handler, methodName, path), name, middleware, [handler.name, methodName])\n return this\n }\n\n /**\n * Registers a route that responds to HTTP POST requests.\n *\n * @param path The URL pattern to match (can include parameters, e.g., '/users').\n * @param definition Either:\n * - An EventHandler function\n * - A tuple: [ControllerClass, methodName]\n * @param name Optional route name (for URL generation or referencing).\n * @param middleware Optional array of middleware functions to execute before the handler.\n */\n post (\n path: string,\n definition: RouteEventHandler | [(new (...args: any[]) => Record<string, any>), methodName: string],\n name?: string,\n middleware: IMiddleware[] = []\n ): Omit<this, RouterEnd> {\n const handler = Array.isArray(definition) ? definition[0] : definition\n const methodName = Array.isArray(definition) ? definition[1] : undefined\n\n this.addRoute('post', path, this.resolveControllerOrHandler(handler, methodName, path), name, middleware, [handler.name, methodName])\n return this\n }\n\n /**\n * Registers a route that responds to HTTP PUT requests.\n *\n * @param path The URL pattern to match (can include parameters, e.g., '/users/:id').\n * @param definition Either:\n * - An EventHandler function\n * - A tuple: [ControllerClass, methodName]\n * @param name Optional route name (for URL generation or referencing).\n * @param middleware Optional array of middleware functions to execute before the handler.\n */\n put (\n path: string,\n definition: RouteEventHandler | [(new (...args: any[]) => Record<string, any>), methodName: string],\n name?: string,\n middleware: IMiddleware[] = []\n ): Omit<this, RouterEnd> {\n const handler = Array.isArray(definition) ? definition[0] : definition\n const methodName = Array.isArray(definition) ? definition[1] : undefined\n this.addRoute('put', path, this.resolveControllerOrHandler(handler, methodName, path), name, middleware, [handler.name, methodName])\n return this\n }\n\n /**\n * Registers a route that responds to HTTP PATCH requests.\n *\n * @param path The URL pattern to match (can include parameters, e.g., '/users/:id').\n * @param definition Either:\n * - An EventHandler function\n * - A tuple: [ControllerClass, methodName]\n * @param name Optional route name (for URL generation or referencing).\n * @param middleware Optional array of middleware functions to execute before the handler.\n */\n patch (\n path: string,\n definition: RouteEventHandler | [(new (...args: any[]) => Record<string, any>), methodName: string],\n name?: string,\n middleware: IMiddleware[] = []\n ): Omit<this, RouterEnd> {\n const handler = Array.isArray(definition) ? definition[0] : definition\n const methodName = Array.isArray(definition) ? definition[1] : undefined\n this.addRoute('patch', path, this.resolveControllerOrHandler(handler, methodName, path), name, middleware, [handler.name, methodName])\n return this\n }\n\n /**\n * Registers a route that responds to HTTP DELETE requests.\n *\n * @param path The URL pattern to match (can include parameters, e.g., '/users/:id').\n * @param definition Either:\n * - An EventHandler function\n * - A tuple: [ControllerClass, methodName]\n * @param name Optional route name (for URL generation or referencing).\n * @param middleware Optional array of middleware functions to execute before the handler.\n */\n delete (\n path: string,\n definition: RouteEventHandler | [(new (...args: any[]) => Record<string, any>), methodName: string],\n name?: string,\n middleware: IMiddleware[] = []\n ): Omit<this, RouterEnd> {\n const handler = Array.isArray(definition) ? definition[0] : definition\n const methodName = Array.isArray(definition) ? definition[1] : undefined\n this.addRoute('delete', path, this.resolveControllerOrHandler(handler, methodName, path), name, middleware, [handler.name, methodName])\n return this\n }\n\n /**\n * API Resource support \n * \n * @param path \n * @param controller \n */\n apiResource (\n path: string,\n Controller: new (app: Application) => IController,\n middleware: IMiddleware[] = []\n ): Omit<this, RouterEnd | 'name'> {\n path = path.replace(/\\//g, '/')\n\n const basePath = `/${path}`.replace(/\\/+$/, '').replace(/(\\/)+/g, '$1')\n const name = basePath.substring(basePath.lastIndexOf('/') + 1).replaceAll(/\\/|:/g, '') || ''\n const param = singularize(name)\n\n this.get(basePath, [Controller, 'index'], `${name}.index`, middleware)\n this.post(basePath, [Controller, 'store'], `${name}.store`, middleware)\n this.get(`${basePath}/:${param}`, [Controller, 'show'], `${name}.show`, middleware)\n this.put(`${basePath}/:${param}`, [Controller, 'update'], `${name}.update`, middleware)\n this.patch(`${basePath}/:${param}`, [Controller, 'update'], `${name}.update`, middleware)\n this.delete(`${basePath}/:${param}`, [Controller, 'destroy'], `${name}.destroy`, middleware)\n\n return this\n }\n\n /**\n * Named route URL generator\n * \n * @param name \n * @param params \n * @returns \n */\n route (name: string, params: Record<string, string> = {}): string | undefined {\n const found = this.routes.find(r => r.name === name)\n if (!found) return undefined\n\n let url = found.path\n for (const [key, value] of Object.entries(params)) {\n url = url.replace(`:${key}`, value)\n }\n return url\n }\n\n /**\n * Grouping\n * \n * @param options \n * @param callback \n */\n group (options: { prefix?: string; middleware?: EventHandler[] }, callback: (_e: this) => void) {\n const prevPrefix = this.groupPrefix\n const prevMiddleware = [...this.groupMiddleware]\n\n this.groupPrefix += options.prefix || ''\n this.groupMiddleware.push(...(options.middleware || []))\n\n callback(this)\n\n /**\n * Restore state after group\n */\n this.groupPrefix = prevPrefix\n this.groupMiddleware = prevMiddleware\n return this\n }\n\n /**\n * Set the name of the current route\n * \n * @param name \n */\n name (name: string) {\n this.nameMap.push(name)\n return this\n }\n\n /**\n * Registers middleware for a specific path.\n * @param path - The path to apply the middleware.\n * @param handler - The middleware handler.\n * @param opts - Optional middleware options.\n */\n middleware (path: string | IMiddleware[] | Middleware, handler: Middleware | MiddlewareOptions, opts?: MiddlewareOptions) {\n opts = typeof handler === 'object' ? handler : (typeof opts === 'function' ? opts : {})\n handler = typeof path === 'function' ? path : (typeof handler === 'function' ? handler : () => { })\n\n if (Array.isArray(path)) {\n this.middlewareMap.concat(path)\n } else if (typeof path === 'function') {\n this.h3App.use('/', () => { }).use(path)\n } else {\n this.h3App.use(path, handler, opts)\n }\n\n return this\n }\n}\n","import { RouteListCommand } from '../Commands/RouteListCommand'\nimport { Router } from '../Route'\nimport { ServiceProvider } from '@h3ravel/core'\nimport path from 'node:path'\nimport { readdir } from 'node:fs/promises'\n\n/**\n * Handles routing registration\n * \n * Load route files (web.ts, api.ts).\n * Map controllers to routes.\n * Register route-related middleware.\n * \n * Auto-Registered\n */\nexport class RouteServiceProvider extends ServiceProvider {\n public static priority = 997\n\n register () {\n this.app.singleton('router', () => {\n const h3App = this.app.make('http.app')\n return new Router(h3App, this.app)\n })\n this.commands([RouteListCommand])\n }\n\n /**\n * Load routes from src/routes\n */\n async boot () {\n try {\n const routePath = this.app.getPath('routes')\n\n const files = (await readdir(routePath)).filter((e) => {\n return !e.includes('.d.ts') && !e.includes('.d.cts') && !e.includes('.map')\n })\n\n for (let i = 0; i < files.length; i++) {\n const routesModule = await import(path.join(routePath, files[i]))\n\n if (typeof routesModule.default === 'function') {\n const router = this.app.make('router')\n routesModule.default(router)\n }\n }\n } catch (e) {\n console.warn('No web routes found or failed to load:', e)\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["path","params: string[]","match: RegExpExecArray | null","path","h3App: H3","app: Application","path","controller: IController","paramTypes: []","error: any","e: any"],"sources":["../src/Commands/RouteListCommand.ts","../src/Helpers.ts","../src/Providers/AssetsServiceProvider.ts","../src/Route.ts","../src/Providers/RouteServiceProvider.ts"],"sourcesContent":["import { Logger, LoggerChalk, RouteDefinition, RouteMethod } from '@h3ravel/shared'\n\nimport { ConsoleCommand } from '@h3ravel/core'\n\nexport class RouteListCommand extends ConsoleCommand {\n\n /**\n * The name and signature of the console command.\n *\n * @var string\n */\n protected signature: string = `#route:\n {list : List all registered routes. \n | {--json : Output the route list as JSON}\n | {--r|reverse : Reverse the ordering of the routes}\n }\n `\n\n /**\n * The console command description.\n *\n * @var string\n */\n protected description: string = 'List all registered routes.'\n\n /**\n * Execute the console command.\n */\n public async handle (this: any) {\n console.log('')\n const command = (this.dictionary.baseCommand ?? this.dictionary.name)\n\n await this[command]()\n }\n\n /**\n * List all registered routes.\n */\n protected async list () {\n /**\n * Sort the routes alphabetically\n */\n const list = [...(this.app.make('app.routes') as RouteDefinition[])].sort((a, b) => {\n if (a.path === '/' && b.path !== '/') return -1\n if (b.path === '/' && a.path !== '/') return 1\n return a.path.localeCompare(b.path)\n }).filter(e => !['head', 'patch'].includes(e.method))\n\n\n /**\n * Log the route list\n */\n list.forEach(route => {\n const path = route.path === '/'\n ? route.path\n : Logger.log((route.path.slice(1)).split('/').map(e => [\n (e.includes(':') ? Logger.log('/', 'white', false) : '') + e,\n e.startsWith(':') ? 'yellow' : 'white'\n ] as [string, LoggerChalk]), '', false)\n\n const method = (route.method.startsWith('/') ? route.method.slice(1) : route.method).toUpperCase() as RouteMethod\n const name = route.signature[1] ? [route.name ?? '', route.name ? '›' : '', route.signature.join('@')].join(' ') : ''\n\n const desc = Logger.describe(\n Logger.log(Logger.log(method + this.pair(method), this.color(method), false), 'green', false), path, 15, false\n )\n return Logger.twoColumnDetail(desc.join(''), name)\n })\n }\n\n /**\n * Get the color\n * \n * @param method \n * @returns \n */\n private color (method: RouteMethod): LoggerChalk {\n switch (method.toLowerCase()) {\n case 'get':\n return 'blue'\n case 'head':\n return 'gray'\n case 'delete':\n return 'red'\n default:\n return 'yellow'\n }\n }\n\n /**\n * Get the alternate method\n * \n * @param method \n * @returns \n */\n private pair (method: RouteMethod) {\n switch (method.toLowerCase()) {\n case 'get':\n return Logger.log('|', 'gray', false) + Logger.log('HEAD', this.color('head'), false)\n case 'put':\n return Logger.log('|', 'gray', false) + Logger.log('PATCH', this.color('patch'), false)\n default:\n return ''\n }\n }\n}\n","import { HttpContext } from '@h3ravel/shared'\nimport { Model } from '@h3ravel/database'\n\nexport class Helpers {\n /**\n * Extracts parameter names from a route path string.\n *\n * - Looks for segments prefixed with \":\" (e.g. \"/users/:id\")\n * - Captures only the param name (without the \":\")\n * - Returns all matches in order of appearance\n *\n * @param path - The route path string (e.g. \"/groups/:group/users/:user\")\n * @returns An array of parameter names (e.g. [\"group\", \"user\"])\n */\n static extractParams (path: string): string[] {\n const regex = /:([^/]+)/g\n const params: string[] = []\n let match: RegExpExecArray | null\n\n while ((match = regex.exec(path)) !== null) {\n params.push(match[1])\n }\n\n return params\n }\n\n /**\n * Resolves route model binding for a given path, HTTP context, and model.\n * \n * - Extracts all route parameters from the given path\n * - If a parameter matches the model name, it attempts to resolve the model binding\n * using the provided value and binding field (defaults to \"id\" unless specified).\n * - For non-matching parameters, it simply returns the key-value pair as is.\n * - If no parameters are found, returns an empty object.\n *\n * @param path - The route path (e.g. \"/groups/:group/users/:user\")\n * @param ctx - The HTTP context containing the request\n * @param model - The model instance to resolve bindings against\n * @returns A resolved model instance or an object containing param values\n */\n static async resolveRouteModelBinding (path: string, ctx: HttpContext, model: Model): Promise<any> {\n const name = model.constructor.name.toLowerCase()\n /**\n * Extract field (defaults to 'id' if not specified after '|')\n */\n const field = name.split('|').at(1) ?? 'id'\n\n /**\n * Iterate through extracted parameters from the path\n */\n for await (const e of Helpers.extractParams(path)) {\n const value = ctx.request.params[e] ?? null\n if (e === name) return await model.resolveRouteBinding(value, field)\n else return { [e]: ctx.request.params[e] ?? {} }\n }\n\n return {}\n }\n}\n","import { readFile, stat } from 'node:fs/promises'\n\nimport { ServiceProvider } from '@h3ravel/core'\nimport { Str } from '@h3ravel/support'\nimport { join } from 'node:path'\nimport { serveStatic } from 'h3'\nimport { statSync } from 'node:fs'\n\n/**\n * Handles public assets loading\n * \n * Auto-Registered\n */\nexport class AssetsServiceProvider extends ServiceProvider {\n public static priority = 996\n\n register () {\n const app = this.app.make('router')\n const publicPath = this.app.getPath('public')\n\n /**\n * Use a middleware to check if this request for for a file\n */\n app.middleware((event) => {\n const { pathname } = new URL(event.req.url)\n\n /**\n * Only serve if it looks like a static asset (has an extension)\n * but skip dotfiles or sensitive files\n */\n if (!/\\.[a-zA-Z0-9]+$/.test(pathname)) return\n if (pathname.startsWith('/.') || pathname.includes('..')) return\n\n /**\n * Serve the asset\n */\n return serveStatic(event, {\n indexNames: ['/index.html'],\n getContents: (id) => {\n return <never>readFile(join(Str.before(publicPath, id), id))\n },\n getMeta: async (id) => {\n const stats = await stat(join(Str.before(publicPath, id), id)).catch(() => { })\n if (stats?.isFile()) {\n return {\n size: stats.size,\n mtime: stats.mtimeMs,\n }\n }\n },\n })\n })\n\n this.app.singleton('asset', () => {\n return (key: string, def?: string) => {\n if (def) {\n try {\n statSync(join(Str.before(publicPath, key), key))\n } catch {\n key = def\n }\n }\n\n return key\n }\n })\n }\n}\n","import 'reflect-metadata'\nimport { H3Event, Middleware, MiddlewareOptions, type H3 } from 'h3'\nimport { Application, Container, Kernel } from '@h3ravel/core'\nimport { Request, Response } from '@h3ravel/http'\nimport { Str } from '@h3ravel/support'\nimport { HttpContext, RouteEventHandler } from '@h3ravel/shared'\nimport type { EventHandler, ExtractControllerMethods, IController, IMiddleware, IRouter, RouterEnd } from '@h3ravel/shared'\nimport { Helpers } from './Helpers'\nimport { Model } from '@h3ravel/database'\nimport { RouteDefinition, RouteMethod } from '@h3ravel/shared'\n\nexport class Router implements IRouter {\n private routes: RouteDefinition[] = []\n private nameMap: string[] = []\n private groupPrefix = ''\n private middlewareMap: IMiddleware[] = []\n private groupMiddleware: EventHandler[] = []\n\n constructor(protected h3App: H3, private app: Application) { }\n\n /**\n * Route Resolver\n * \n * @param handler \n * @param middleware \n * @returns \n */\n private resolveHandler (handler: EventHandler, middleware: IMiddleware[] = []) {\n return async (event: H3Event) => {\n const kernel = new Kernel(() => HttpContext.init({\n app: this.app,\n request: new Request(event, this.app),\n response: new Response(event, this.app)\n }), middleware)\n\n return kernel.handle(event, (ctx) => Promise.resolve(handler(ctx)))\n }\n }\n\n /**\n * Add a route to the stack\n * \n * @param method \n * @param path \n * @param handler \n * @param name \n * @param middleware \n */\n private addRoute (\n method: RouteMethod,\n path: string,\n handler: EventHandler,\n name?: string,\n middleware: IMiddleware[] = [],\n signature: RouteDefinition['signature'] = ['', '']\n ) {\n /**\n * Join all defined route names to make a single route name\n */\n if (this.nameMap.length > 0) {\n name = this.nameMap.join('.')\n }\n\n /**\n * Join all defined middlewares\n */\n if (this.middlewareMap.length > 0) {\n middleware = this.middlewareMap\n }\n\n const fullPath = `${this.groupPrefix}${path}`.replace(/\\/+/g, '/')\n this.routes.push({ method, path: fullPath, name, handler, signature })\n this.h3App[method as 'get'](fullPath, this.resolveHandler(handler, middleware))\n this.app.singleton('app.routes', () => this.routes)\n }\n\n /**\n * Resolves a route handler definition into an executable EventHandler.\n *\n * A handler can be:\n * - A function matching the EventHandler signature\n * - A controller class (optionally decorated for IoC resolution)\n *\n * If it’s a controller class, this method will:\n * - Instantiate it (via IoC or manually)\n * - Call the specified method (defaults to `index`)\n *\n * @param handler Event handler function OR controller class\n * @param methodName Method to invoke on the controller (defaults to 'index')\n */\n private resolveControllerOrHandler<C extends new (...args: any) => any> (\n handler: EventHandler | C,\n methodName?: string,\n path?: string,\n ): EventHandler {\n /**\n * Checks if the handler is a function (either a plain function or a class constructor)\n */\n if (typeof handler === 'function' && typeof (handler as any).prototype !== 'undefined') {\n return async (ctx) => {\n let controller: IController\n if (Container.hasAnyDecorator(handler as any)) {\n /**\n * If the controller is decorated use the IoC container\n */\n controller = this.app.make(handler as C)\n } else {\n /**\n * Otherwise instantiate manually so that we can at least\n * pass the app instance\n */\n controller = new (handler as C)(this.app)\n }\n\n /**\n * The method to execute (defaults to 'index')\n */\n const action = (methodName || 'index') as keyof IController\n\n /**\n * Ensure the method exists on the controller\n */\n if (typeof controller[action] !== 'function') {\n throw new Error(`Method \"${String(action)}\" not found on controller ${handler.name}`)\n }\n\n /**\n * Get param types for the controller method\n */\n const paramTypes: [] = Reflect.getMetadata('design:paramtypes', controller, action) || []\n\n /**\n * Resolve the bound dependencies\n */\n let args = await Promise.all(\n paramTypes.map(async (paramType: any) => {\n switch (paramType?.name) {\n case 'Application':\n return this.app\n case 'Request':\n return ctx.request\n case 'Response':\n return ctx.response\n case 'HttpContext':\n return ctx\n default: {\n const inst = this.app.make(paramType)\n if (inst instanceof Model) {\n // Route model binding returns a Promise\n return await Helpers.resolveRouteModelBinding(path ?? '', ctx, inst)\n }\n return inst\n }\n }\n })\n )\n\n /**\n * Ensure that the HttpContext is always available\n */\n if (args.length < 1) {\n args = [ctx]\n }\n\n /**\n * Call the controller method, passing all resolved dependencies\n */\n return await controller[action](...args)\n }\n }\n\n return handler as EventHandler\n }\n\n /**\n * Registers a route that responds to HTTP GET requests.\n *\n * @param path The URL pattern to match (can include parameters, e.g., '/users/:id').\n * @param definition Either:\n * - An EventHandler function\n * - A tuple: [ControllerClass, methodName]\n * @param name Optional route name (for URL generation or referencing).\n * @param middleware Optional array of middleware functions to execute before the handler.\n */\n get<C extends new (...args: any) => any> (\n path: string,\n definition: RouteEventHandler | [C, methodName: ExtractControllerMethods<InstanceType<C>>],\n name?: string,\n middleware: IMiddleware[] = []\n ): Omit<this, RouterEnd> {\n\n const handler = Array.isArray(definition) ? definition[0] : definition\n const methodName = Array.isArray(definition) ? <string>definition[1] : undefined\n\n // Add the route to the route stack\n this.addRoute(\n 'get',\n path,\n this.resolveControllerOrHandler(handler, methodName, path),\n name,\n middleware,\n [handler.name, methodName]\n )\n\n return this\n }\n\n /**\n * Registers a route that responds to HTTP POST requests.\n *\n * @param path The URL pattern to match (can include parameters, e.g., '/users').\n * @param definition Either:\n * - An EventHandler function\n * - A tuple: [ControllerClass, methodName]\n * @param name Optional route name (for URL generation or referencing).\n * @param middleware Optional array of middleware functions to execute before the handler.\n */\n post<C extends new (...args: any) => any> (\n path: string,\n definition: RouteEventHandler | [C, methodName: ExtractControllerMethods<InstanceType<C>>],\n name?: string,\n middleware: IMiddleware[] = []\n ): Omit<this, RouterEnd> {\n\n const handler = Array.isArray(definition) ? definition[0] : definition\n const methodName = Array.isArray(definition) ? <string>definition[1] : undefined\n\n // Add the route to the route stack\n this.addRoute(\n 'post',\n path,\n this.resolveControllerOrHandler(handler, methodName, path),\n name,\n middleware,\n [handler.name, methodName]\n )\n\n return this\n }\n\n /**\n * Registers a route that responds to HTTP PUT requests.\n *\n * @param path The URL pattern to match (can include parameters, e.g., '/users/:id').\n * @param definition Either:\n * - An EventHandler function\n * - A tuple: [ControllerClass, methodName]\n * @param name Optional route name (for URL generation or referencing).\n * @param middleware Optional array of middleware functions to execute before the handler.\n */\n put<C extends new (...args: any) => any> (\n path: string,\n definition: RouteEventHandler | [C, methodName: ExtractControllerMethods<InstanceType<C>>],\n name?: string,\n middleware: IMiddleware[] = []\n ): Omit<this, RouterEnd> {\n\n const handler = Array.isArray(definition) ? definition[0] : definition\n const methodName = Array.isArray(definition) ? <string>definition[1] : undefined\n\n // Add the route to the route stack\n this.addRoute(\n 'put',\n path,\n this.resolveControllerOrHandler(handler, methodName, path),\n name,\n middleware,\n [handler.name, methodName]\n )\n return this\n }\n\n /**\n * Registers a route that responds to HTTP PATCH requests.\n *\n * @param path The URL pattern to match (can include parameters, e.g., '/users/:id').\n * @param definition Either:\n * - An EventHandler function\n * - A tuple: [ControllerClass, methodName]\n * @param name Optional route name (for URL generation or referencing).\n * @param middleware Optional array of middleware functions to execute before the handler.\n */\n patch<C extends new (...args: any) => any> (\n path: string,\n definition: RouteEventHandler | [C, methodName: ExtractControllerMethods<InstanceType<C>>],\n name?: string,\n middleware: IMiddleware[] = []\n ): Omit<this, RouterEnd> {\n\n const handler = Array.isArray(definition) ? definition[0] : definition\n const methodName = Array.isArray(definition) ? <string>definition[1] : undefined\n\n // Add the route to the route stack\n this.addRoute(\n 'patch',\n path,\n this.resolveControllerOrHandler(handler, methodName, path),\n name,\n middleware,\n [handler.name, methodName]\n )\n\n return this\n }\n\n /**\n * Registers a route that responds to HTTP DELETE requests.\n *\n * @param path The URL pattern to match (can include parameters, e.g., '/users/:id').\n * @param definition Either:\n * - An EventHandler function\n * - A tuple: [ControllerClass, methodName]\n * @param name Optional route name (for URL generation or referencing).\n * @param middleware Optional array of middleware functions to execute before the handler.\n */\n delete<C extends new (...args: any) => any> (\n path: string,\n definition: RouteEventHandler | [C, methodName: ExtractControllerMethods<InstanceType<C>>],\n name?: string,\n middleware: IMiddleware[] = []\n ): Omit<this, RouterEnd> {\n\n const handler = Array.isArray(definition) ? definition[0] : definition\n const methodName = Array.isArray(definition) ? <string>definition[1] : undefined\n\n // Add the route to the route stack\n this.addRoute(\n 'delete',\n path,\n this.resolveControllerOrHandler(handler, methodName, path),\n name,\n middleware,\n [handler.name, methodName]\n )\n\n return this\n }\n\n /**\n * API Resource support \n * \n * @param path \n * @param controller \n */\n apiResource<C extends new (...args: any) => any> (\n path: string,\n Controller: C,\n middleware: IMiddleware[] = []\n ): Omit<this, RouterEnd | 'name'> {\n path = path.replace(/\\//g, '/')\n\n const basePath = `/${path}`.replace(/\\/+$/, '').replace(/(\\/)+/g, '$1')\n const name = basePath.substring(basePath.lastIndexOf('/') + 1).replaceAll(/\\/|:/g, '') || ''\n const param = Str.singular(name)\n\n this.get(basePath, [Controller, <never>'index'], `${name}.index`, middleware)\n this.post(basePath, [Controller, <never>'store'], `${name}.store`, middleware)\n this.get(`${basePath}/:${param}`, [Controller, <never>'show'], `${name}.show`, middleware)\n this.put(`${basePath}/:${param}`, [Controller, <never>'update'], `${name}.update`, middleware)\n this.patch(`${basePath}/:${param}`, [Controller, <never>'update'], `${name}.update`, middleware)\n this.delete(`${basePath}/:${param}`, [Controller, <never>'destroy'], `${name}.destroy`, middleware)\n\n return this\n }\n\n /**\n * Named route URL generator\n * \n * @param name \n * @param params \n * @returns \n */\n route (name: string, params: Record<string, string> = {}): string | undefined {\n const found = this.routes.find(r => r.name === name)\n if (!found) return undefined\n\n let url = found.path\n for (const [key, value] of Object.entries(params)) {\n url = url.replace(`:${key}`, value)\n }\n return url\n }\n\n /**\n * Grouping\n * \n * @param options \n * @param callback \n */\n group (options: { prefix?: string; middleware?: EventHandler[] }, callback: (_e: this) => void) {\n const prevPrefix = this.groupPrefix\n const prevMiddleware = [...this.groupMiddleware]\n\n this.groupPrefix += options.prefix || ''\n this.groupMiddleware.push(...(options.middleware || []))\n\n callback(this)\n\n /**\n * Restore state after group\n */\n this.groupPrefix = prevPrefix\n this.groupMiddleware = prevMiddleware\n return this\n }\n\n /**\n * Set the name of the current route\n * \n * @param name \n */\n name (name: string) {\n this.nameMap.push(name)\n return this\n }\n\n /**\n * Registers middleware for a specific path.\n * @param path - The path to apply the middleware.\n * @param handler - The middleware handler.\n * @param opts - Optional middleware options.\n */\n middleware (path: string | IMiddleware[] | Middleware, handler: Middleware | MiddlewareOptions, opts?: MiddlewareOptions) {\n opts = typeof handler === 'object' ? handler : (typeof opts === 'function' ? opts : {})\n handler = typeof path === 'function' ? path : (typeof handler === 'function' ? handler : () => { })\n\n if (Array.isArray(path)) {\n this.middlewareMap.concat(path)\n } else if (typeof path === 'function') {\n this.h3App.use('/', () => { }).use(path)\n } else {\n this.h3App.use(path, handler, opts)\n }\n\n return this\n }\n}\n","import { Logger } from '@h3ravel/shared'\nimport { RouteListCommand } from '../Commands/RouteListCommand'\nimport { Router } from '../Route'\nimport { ServiceProvider } from '@h3ravel/core'\nimport path from 'node:path'\nimport { readdir } from 'node:fs/promises'\n\n/**\n * Handles routing registration\n * \n * Load route files (web.ts, api.ts).\n * Map controllers to routes.\n * Register route-related middleware.\n * \n * Auto-Registered\n */\nexport class RouteServiceProvider extends ServiceProvider {\n public static priority = 997\n\n register () {\n this.app.singleton('router', () => {\n try {\n const h3App = this.app.make('http.app')\n return new Router(h3App, this.app)\n } catch (error: any) {\n if (String(error.message).includes('http.app'))\n Logger.log([\n ['The', 'white'],\n ['@h3ravel/http', ['italic', 'gray']],\n ['package is required to use the routing system.', 'white']\n ], ' ')\n else Logger.log(error, 'white')\n }\n return {} as Router\n })\n\n this.commands([RouteListCommand])\n }\n\n /**\n * Load routes from src/routes\n */\n async boot () {\n try {\n const routePath = this.app.getPath('routes')\n\n const files = (await readdir(routePath)).filter((e) => {\n return !e.includes('.d.ts') && !e.includes('.d.cts') && !e.includes('.map')\n })\n\n for (let i = 0; i < files.length; i++) {\n const routesModule = await import(path.join(routePath, files[i]))\n\n if (typeof routesModule.default === 'function') {\n const router = this.app.make('router')\n routesModule.default(router)\n }\n }\n } catch (e: any) {\n Logger.log([['No auto discorvered routes.', 'white'], [e.message, ['grey', 'italic']]], '\\n')\n }\n }\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@h3ravel/router",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.11.0",
|
|
4
4
|
"description": "Route facade, decorators and controller system for H3ravel.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -38,11 +38,11 @@
|
|
|
38
38
|
"dependencies": {
|
|
39
39
|
"h3": "2.0.0-beta.4",
|
|
40
40
|
"reflect-metadata": "^0.2.2",
|
|
41
|
-
"@h3ravel/core": "^1.
|
|
42
|
-
"@h3ravel/
|
|
43
|
-
"@h3ravel/shared": "^0.
|
|
44
|
-
"@h3ravel/support": "^0.
|
|
45
|
-
"@h3ravel/
|
|
41
|
+
"@h3ravel/core": "^1.13.0",
|
|
42
|
+
"@h3ravel/database": "^11.3.0",
|
|
43
|
+
"@h3ravel/shared": "^0.21.0",
|
|
44
|
+
"@h3ravel/support": "^0.13.0",
|
|
45
|
+
"@h3ravel/http": "^11.3.2"
|
|
46
46
|
},
|
|
47
47
|
"scripts": {
|
|
48
48
|
"barrel": "barrelsby --directory src --delete --singleQuotes",
|