@h3ravel/router 1.8.3 → 1.9.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/Providers/AssetsServiceProvider.ts","../src/Route.ts","../src/Providers/RouteServiceProvider.ts"],"sourcesContent":["export * from './Controller'\nexport * from './Providers/AssetsServiceProvider'\nexport * from './Providers/RouteServiceProvider'\nexport * from './Route'\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 config = this.app.make('config')\n const fsconfig = config.get('filesystem')\n const publicPath = this.app.getPath('public')\n\n app.middleware(`/${fsconfig.public_mask}/**`, (event) => {\n return serveStatic(event, {\n indexNames: ['/index.html'],\n getContents: (id) => {\n const newId = id.replace(`/${fsconfig.public_mask}/`, '')\n return <never>readFile(join(before(publicPath, newId), newId))\n },\n getMeta: async (id) => {\n const newId = id.replace(`/${fsconfig.public_mask}/`, '')\n const stats = await stat(join(before(publicPath, newId), newId)).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 = '') => {\n try {\n statSync(join(before(publicPath, key), key))\n } catch {\n key = def\n }\n\n return join(fsconfig.public_mask, 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, type EventHandler, type IController, type IMiddleware, type IRouter, type RouterEnd } from '@h3ravel/shared'\n\ninterface RouteDefinition {\n method: string\n path: string\n name?: string\n handler: EventHandler\n}\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: string,\n path: string,\n handler: EventHandler,\n name?: string,\n middleware: IMiddleware[] = []\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 })\n this.h3App[method as 'get'](fullPath, this.resolveHandler(handler, middleware))\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 ): 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 (_ctx) => {\n let controller: IController\n\n if (Container.hasAnyDecorator(handler)) {\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: any[] = paramTypes.map((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 return this.app.make(paramType);\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 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), name, middleware)\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 this.addRoute('post', path, this.resolveControllerOrHandler(handler, methodName), name, middleware)\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), name, middleware)\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), name, middleware)\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), name, middleware)\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[], handler: Middleware, opts?: MiddlewareOptions) {\n if (typeof path === 'string') {\n this.h3App.use(path, handler, opts)\n } else {\n this.middlewareMap.concat(path)\n }\n return this\n }\n}\n","import { 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 }\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('.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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","names":["AssetsServiceProvider","ServiceProvider","priority","register","app","make","config","fsconfig","get","publicPath","getPath","middleware","public_mask","event","serveStatic","indexNames","getContents","id","newId","replace","readFile","join","before","getMeta","stats","stat","catch","isFile","size","mtime","mtimeMs","singleton","key","def","statSync","import_core","import_support","Router","routes","nameMap","groupPrefix","middlewareMap","groupMiddleware","h3App","app","resolveHandler","handler","middleware","event","kernel","Kernel","HttpContext","init","request","Request","response","Response","handle","ctx","Promise","resolve","addRoute","method","path","name","length","join","fullPath","replace","push","resolveControllerOrHandler","methodName","prototype","_ctx","controller","Container","hasAnyDecorator","make","action","Error","String","paramTypes","Reflect","getMetadata","args","map","paramType","get","definition","Array","isArray","undefined","post","put","patch","delete","apiResource","Controller","basePath","substring","lastIndexOf","replaceAll","param","singularize","route","params","found","find","r","url","key","value","Object","entries","group","options","callback","prevPrefix","prevMiddleware","prefix","opts","use","concat","import_core","import_node_path","import_promises","RouteServiceProvider","ServiceProvider","priority","register","app","singleton","h3App","make","Router","boot","routePath","getPath","files","readdir","filter","e","includes","i","length","routesModule","path","join","default","router","console","warn"]}
1
+ {"version":3,"file":"index.cjs","names":["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/Helpers.ts","../src/Providers/AssetsServiceProvider.ts","../src/Route.ts","../src/Providers/RouteServiceProvider.ts"],"sourcesContent":["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 config = this.app.make('config')\n const fsconfig = config.get('filesystem')\n const publicPath = this.app.getPath('public')\n\n app.middleware(`/${fsconfig.public_mask}/**`, (event) => {\n return serveStatic(event, {\n indexNames: ['/index.html'],\n getContents: (id) => {\n const newId = id.replace(`/${fsconfig.public_mask}/`, '')\n return <never>readFile(join(before(publicPath, newId), newId))\n },\n getMeta: async (id) => {\n const newId = id.replace(`/${fsconfig.public_mask}/`, '')\n const stats = await stat(join(before(publicPath, newId), newId)).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 = '') => {\n try {\n statSync(join(before(publicPath, key), key))\n } catch {\n key = def\n }\n\n return join(fsconfig.public_mask, 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';\n\ninterface RouteDefinition {\n method: string\n path: string\n name?: string\n handler: EventHandler\n}\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: string,\n path: string,\n handler: EventHandler,\n name?: string,\n middleware: IMiddleware[] = []\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 })\n this.h3App[method as 'get'](fullPath, this.resolveHandler(handler, middleware))\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)) {\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)\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 this.addRoute('post', path, this.resolveControllerOrHandler(handler, methodName, path), name, middleware)\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)\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)\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)\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[], handler: Middleware, opts?: MiddlewareOptions) {\n if (typeof path === 'string') {\n this.h3App.use(path, handler, opts)\n } else {\n this.middlewareMap.concat(path)\n }\n return this\n }\n}\n","import { 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 }\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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"}
package/dist/index.d.cts CHANGED
@@ -1,17 +1,50 @@
1
- import { ServiceProvider, Application } from '@h3ravel/core';
2
- import { H3, Middleware, MiddlewareOptions } from 'h3';
3
- import { IRouter, RouteEventHandler, IMiddleware, RouterEnd, IController, EventHandler } from '@h3ravel/shared';
1
+ import { EventHandler, HttpContext, IController, IMiddleware, IRouter, RouteEventHandler, RouterEnd } from "@h3ravel/shared";
2
+ import { Model } from "@h3ravel/database";
3
+ import { Application, ServiceProvider } from "@h3ravel/core";
4
+ import { H3, Middleware, MiddlewareOptions } from "h3";
4
5
 
6
+ //#region src/Helpers.d.ts
7
+ declare class Helpers {
8
+ /**
9
+ * Extracts parameter names from a route path string.
10
+ *
11
+ * - Looks for segments prefixed with ":" (e.g. "/users/:id")
12
+ * - Captures only the param name (without the ":")
13
+ * - Returns all matches in order of appearance
14
+ *
15
+ * @param path - The route path string (e.g. "/groups/:group/users/:user")
16
+ * @returns An array of parameter names (e.g. ["group", "user"])
17
+ */
18
+ static extractParams(path: string): string[];
19
+ /**
20
+ * Resolves route model binding for a given path, HTTP context, and model.
21
+ *
22
+ * - Extracts all route parameters from the given path
23
+ * - If a parameter matches the model name, it attempts to resolve the model binding
24
+ * using the provided value and binding field (defaults to "id" unless specified).
25
+ * - For non-matching parameters, it simply returns the key-value pair as is.
26
+ * - If no parameters are found, returns an empty object.
27
+ *
28
+ * @param path - The route path (e.g. "/groups/:group/users/:user")
29
+ * @param ctx - The HTTP context containing the request
30
+ * @param model - The model instance to resolve bindings against
31
+ * @returns A resolved model instance or an object containing param values
32
+ */
33
+ static resolveRouteModelBinding(path: string, ctx: HttpContext, model: Model): Promise<any>;
34
+ }
35
+ //#endregion
36
+ //#region src/Providers/AssetsServiceProvider.d.ts
5
37
  /**
6
38
  * Handles public assets loading
7
39
  *
8
40
  * Auto-Registered
9
41
  */
10
42
  declare class AssetsServiceProvider extends ServiceProvider {
11
- static priority: number;
12
- register(): void;
43
+ static priority: number;
44
+ register(): void;
13
45
  }
14
-
46
+ //#endregion
47
+ //#region src/Providers/RouteServiceProvider.d.ts
15
48
  /**
16
49
  * Handles routing registration
17
50
  *
@@ -22,149 +55,151 @@ declare class AssetsServiceProvider extends ServiceProvider {
22
55
  * Auto-Registered
23
56
  */
24
57
  declare class RouteServiceProvider extends ServiceProvider {
25
- static priority: number;
26
- register(): void;
27
- /**
28
- * Load routes from src/routes
29
- */
30
- boot(): Promise<void>;
58
+ static priority: number;
59
+ register(): void;
60
+ /**
61
+ * Load routes from src/routes
62
+ */
63
+ boot(): Promise<void>;
31
64
  }
32
-
65
+ //#endregion
66
+ //#region src/Route.d.ts
33
67
  declare class Router implements IRouter {
34
- protected h3App: H3;
35
- private app;
36
- private routes;
37
- private nameMap;
38
- private groupPrefix;
39
- private middlewareMap;
40
- private groupMiddleware;
41
- constructor(h3App: H3, app: Application);
42
- /**
43
- * Route Resolver
44
- *
45
- * @param handler
46
- * @param middleware
47
- * @returns
48
- */
49
- private resolveHandler;
50
- /**
51
- * Add a route to the stack
52
- *
53
- * @param method
54
- * @param path
55
- * @param handler
56
- * @param name
57
- * @param middleware
58
- */
59
- private addRoute;
60
- /**
61
- * Resolves a route handler definition into an executable EventHandler.
62
- *
63
- * A handler can be:
64
- * - A function matching the EventHandler signature
65
- * - A controller class (optionally decorated for IoC resolution)
66
- *
67
- * If it’s a controller class, this method will:
68
- * - Instantiate it (via IoC or manually)
69
- * - Call the specified method (defaults to `index`)
70
- *
71
- * @param handler Event handler function OR controller class
72
- * @param methodName Method to invoke on the controller (defaults to 'index')
73
- */
74
- private resolveControllerOrHandler;
75
- /**
76
- * Registers a route that responds to HTTP GET requests.
77
- *
78
- * @param path The URL pattern to match (can include parameters, e.g., '/users/:id').
79
- * @param definition Either:
80
- * - An EventHandler function
81
- * - A tuple: [ControllerClass, methodName]
82
- * @param name Optional route name (for URL generation or referencing).
83
- * @param middleware Optional array of middleware functions to execute before the handler.
84
- */
85
- get(path: string, definition: RouteEventHandler | [(new (...args: any[]) => Record<string, any>), methodName: string], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
86
- /**
87
- * Registers a route that responds to HTTP POST requests.
88
- *
89
- * @param path The URL pattern to match (can include parameters, e.g., '/users').
90
- * @param definition Either:
91
- * - An EventHandler function
92
- * - A tuple: [ControllerClass, methodName]
93
- * @param name Optional route name (for URL generation or referencing).
94
- * @param middleware Optional array of middleware functions to execute before the handler.
95
- */
96
- post(path: string, definition: RouteEventHandler | [(new (...args: any[]) => Record<string, any>), methodName: string], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
97
- /**
98
- * Registers a route that responds to HTTP PUT requests.
99
- *
100
- * @param path The URL pattern to match (can include parameters, e.g., '/users/:id').
101
- * @param definition Either:
102
- * - An EventHandler function
103
- * - A tuple: [ControllerClass, methodName]
104
- * @param name Optional route name (for URL generation or referencing).
105
- * @param middleware Optional array of middleware functions to execute before the handler.
106
- */
107
- put(path: string, definition: RouteEventHandler | [(new (...args: any[]) => Record<string, any>), methodName: string], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
108
- /**
109
- * Registers a route that responds to HTTP PATCH requests.
110
- *
111
- * @param path The URL pattern to match (can include parameters, e.g., '/users/:id').
112
- * @param definition Either:
113
- * - An EventHandler function
114
- * - A tuple: [ControllerClass, methodName]
115
- * @param name Optional route name (for URL generation or referencing).
116
- * @param middleware Optional array of middleware functions to execute before the handler.
117
- */
118
- patch(path: string, definition: RouteEventHandler | [(new (...args: any[]) => Record<string, any>), methodName: string], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
119
- /**
120
- * Registers a route that responds to HTTP DELETE requests.
121
- *
122
- * @param path The URL pattern to match (can include parameters, e.g., '/users/:id').
123
- * @param definition Either:
124
- * - An EventHandler function
125
- * - A tuple: [ControllerClass, methodName]
126
- * @param name Optional route name (for URL generation or referencing).
127
- * @param middleware Optional array of middleware functions to execute before the handler.
128
- */
129
- delete(path: string, definition: RouteEventHandler | [(new (...args: any[]) => Record<string, any>), methodName: string], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
130
- /**
131
- * API Resource support
132
- *
133
- * @param path
134
- * @param controller
135
- */
136
- apiResource(path: string, Controller: new (app: Application) => IController, middleware?: IMiddleware[]): Omit<this, RouterEnd | 'name'>;
137
- /**
138
- * Named route URL generator
139
- *
140
- * @param name
141
- * @param params
142
- * @returns
143
- */
144
- route(name: string, params?: Record<string, string>): string | undefined;
145
- /**
146
- * Grouping
147
- *
148
- * @param options
149
- * @param callback
150
- */
151
- group(options: {
152
- prefix?: string;
153
- middleware?: EventHandler[];
154
- }, callback: (_e: this) => void): this;
155
- /**
156
- * Set the name of the current route
157
- *
158
- * @param name
159
- */
160
- name(name: string): this;
161
- /**
162
- * Registers middleware for a specific path.
163
- * @param path - The path to apply the middleware.
164
- * @param handler - The middleware handler.
165
- * @param opts - Optional middleware options.
166
- */
167
- middleware(path: string | IMiddleware[], handler: Middleware, opts?: MiddlewareOptions): this;
68
+ protected h3App: H3;
69
+ private app;
70
+ private routes;
71
+ private nameMap;
72
+ private groupPrefix;
73
+ private middlewareMap;
74
+ private groupMiddleware;
75
+ constructor(h3App: H3, app: Application);
76
+ /**
77
+ * Route Resolver
78
+ *
79
+ * @param handler
80
+ * @param middleware
81
+ * @returns
82
+ */
83
+ private resolveHandler;
84
+ /**
85
+ * Add a route to the stack
86
+ *
87
+ * @param method
88
+ * @param path
89
+ * @param handler
90
+ * @param name
91
+ * @param middleware
92
+ */
93
+ private addRoute;
94
+ /**
95
+ * Resolves a route handler definition into an executable EventHandler.
96
+ *
97
+ * A handler can be:
98
+ * - A function matching the EventHandler signature
99
+ * - A controller class (optionally decorated for IoC resolution)
100
+ *
101
+ * If it’s a controller class, this method will:
102
+ * - Instantiate it (via IoC or manually)
103
+ * - Call the specified method (defaults to `index`)
104
+ *
105
+ * @param handler Event handler function OR controller class
106
+ * @param methodName Method to invoke on the controller (defaults to 'index')
107
+ */
108
+ private resolveControllerOrHandler;
109
+ /**
110
+ * Registers a route that responds to HTTP GET requests.
111
+ *
112
+ * @param path The URL pattern to match (can include parameters, e.g., '/users/:id').
113
+ * @param definition Either:
114
+ * - An EventHandler function
115
+ * - A tuple: [ControllerClass, methodName]
116
+ * @param name Optional route name (for URL generation or referencing).
117
+ * @param middleware Optional array of middleware functions to execute before the handler.
118
+ */
119
+ get(path: string, definition: RouteEventHandler | [(new (...args: any[]) => Record<string, any>), methodName: string], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
120
+ /**
121
+ * Registers a route that responds to HTTP POST requests.
122
+ *
123
+ * @param path The URL pattern to match (can include parameters, e.g., '/users').
124
+ * @param definition Either:
125
+ * - An EventHandler function
126
+ * - A tuple: [ControllerClass, methodName]
127
+ * @param name Optional route name (for URL generation or referencing).
128
+ * @param middleware Optional array of middleware functions to execute before the handler.
129
+ */
130
+ post(path: string, definition: RouteEventHandler | [(new (...args: any[]) => Record<string, any>), methodName: string], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
131
+ /**
132
+ * Registers a route that responds to HTTP PUT requests.
133
+ *
134
+ * @param path The URL pattern to match (can include parameters, e.g., '/users/:id').
135
+ * @param definition Either:
136
+ * - An EventHandler function
137
+ * - A tuple: [ControllerClass, methodName]
138
+ * @param name Optional route name (for URL generation or referencing).
139
+ * @param middleware Optional array of middleware functions to execute before the handler.
140
+ */
141
+ put(path: string, definition: RouteEventHandler | [(new (...args: any[]) => Record<string, any>), methodName: string], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
142
+ /**
143
+ * Registers a route that responds to HTTP PATCH requests.
144
+ *
145
+ * @param path The URL pattern to match (can include parameters, e.g., '/users/:id').
146
+ * @param definition Either:
147
+ * - An EventHandler function
148
+ * - A tuple: [ControllerClass, methodName]
149
+ * @param name Optional route name (for URL generation or referencing).
150
+ * @param middleware Optional array of middleware functions to execute before the handler.
151
+ */
152
+ patch(path: string, definition: RouteEventHandler | [(new (...args: any[]) => Record<string, any>), methodName: string], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
153
+ /**
154
+ * Registers a route that responds to HTTP DELETE requests.
155
+ *
156
+ * @param path The URL pattern to match (can include parameters, e.g., '/users/:id').
157
+ * @param definition Either:
158
+ * - An EventHandler function
159
+ * - A tuple: [ControllerClass, methodName]
160
+ * @param name Optional route name (for URL generation or referencing).
161
+ * @param middleware Optional array of middleware functions to execute before the handler.
162
+ */
163
+ delete(path: string, definition: RouteEventHandler | [(new (...args: any[]) => Record<string, any>), methodName: string], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
164
+ /**
165
+ * API Resource support
166
+ *
167
+ * @param path
168
+ * @param controller
169
+ */
170
+ apiResource(path: string, Controller: new (app: Application) => IController, middleware?: IMiddleware[]): Omit<this, RouterEnd | 'name'>;
171
+ /**
172
+ * Named route URL generator
173
+ *
174
+ * @param name
175
+ * @param params
176
+ * @returns
177
+ */
178
+ route(name: string, params?: Record<string, string>): string | undefined;
179
+ /**
180
+ * Grouping
181
+ *
182
+ * @param options
183
+ * @param callback
184
+ */
185
+ group(options: {
186
+ prefix?: string;
187
+ middleware?: EventHandler[];
188
+ }, callback: (_e: this) => void): this;
189
+ /**
190
+ * Set the name of the current route
191
+ *
192
+ * @param name
193
+ */
194
+ name(name: string): this;
195
+ /**
196
+ * Registers middleware for a specific path.
197
+ * @param path - The path to apply the middleware.
198
+ * @param handler - The middleware handler.
199
+ * @param opts - Optional middleware options.
200
+ */
201
+ middleware(path: string | IMiddleware[], handler: Middleware, opts?: MiddlewareOptions): this;
168
202
  }
169
-
170
- export { AssetsServiceProvider, RouteServiceProvider, Router };
203
+ //#endregion
204
+ export { AssetsServiceProvider, Helpers, RouteServiceProvider, Router };
205
+ //# sourceMappingURL=index.d.cts.map