@h3ravel/router 1.1.0 → 1.2.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/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # @h3ravel/router
2
2
 
3
+ ## 1.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - feat: hide RouterEnd from itslelf to prevent unintentional chaining.
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies
12
+ - @h3ravel/shared@0.10.0
13
+ - @h3ravel/core@1.0.6
14
+ - @h3ravel/http@4.1.2
15
+ - @h3ravel/support@0.7.1
16
+
3
17
  ## 1.1.0
4
18
 
5
19
  ### Minor Changes
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/Route.ts","../src/Providers/AssetsServiceProvider.ts","../src/Providers/RouteServiceProvider.ts"],"sourcesContent":["/**\n * @file Automatically generated by barrelsby.\n */\n\nexport * from './Controller';\nexport * from './Route';\nexport * from './Providers/AssetsServiceProvider';\nexport * from './Providers/RouteServiceProvider';\n","import { H3Event, Middleware, MiddlewareOptions, type H3 } from 'h3'\nimport { Request, Response } from '@h3ravel/http'\nimport { Application, Controller, Kernel } from '@h3ravel/core'\nimport { afterLast } from '@h3ravel/support'\nimport type { EventHandler, IController, IMiddleware, IRouter } 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(() => ({\n request: new Request(event),\n response: new Response(event)\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 private resolveControllerOrHandler (\n handler: EventHandler | (new (...args: any[]) => IController),\n methodName?: string\n ): EventHandler {\n if (typeof handler === 'function' && (handler as any).prototype instanceof Controller) {\n return (ctx) => {\n const controller = new (handler as new (...args: any[]) => IController)(this.app)\n const action = (methodName || 'index') as keyof IController\n\n if (typeof controller[action] !== 'function') {\n throw new Error(`Method \"${String(action)}\" not found on controller ${handler.name}`)\n }\n\n return controller[action](ctx)\n }\n }\n\n return handler as EventHandler\n }\n\n\n get (\n path: string,\n definition: EventHandler | [(new (...args: any[]) => IController), methodName: string],\n name?: string,\n middleware: IMiddleware[] = []\n ) {\n const handler = Array.isArray(definition) ? definition[0] : definition\n const methodName = Array.isArray(definition) ? definition[1] : undefined\n this.addRoute('get', path, this.resolveControllerOrHandler(handler, methodName), name, middleware)\n return this\n }\n\n post (\n path: string,\n definition: EventHandler | [(new (...args: any[]) => IController), methodName: string],\n name?: string,\n middleware: IMiddleware[] = []\n ) {\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 put (\n path: string,\n definition: EventHandler | [(new (...args: any[]) => IController), methodName: string],\n name?: string,\n middleware: IMiddleware[] = []\n ) {\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 delete (\n path: string,\n definition: EventHandler | [(new (...args: any[]) => IController), methodName: string],\n name?: string,\n middleware: IMiddleware[] = []\n ) {\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 ) {\n path = path.replace(/\\//g, '/')\n\n const name = afterLast(path, '/')\n const basePath = `/${path}`.replace(/\\/+/g, '/')\n\n const controller = new Controller(this.app)\n\n this.addRoute('get', basePath, controller.index.bind(controller), `${name}.index`, middleware)\n this.addRoute('post', basePath, controller.store.bind(controller), `${name}.store`, middleware)\n this.addRoute('get', `${basePath}/:id`, controller.show.bind(controller), `${name}.show`, middleware)\n this.addRoute('put', `${basePath}/:id`, controller.update.bind(controller), `${name}.update`, middleware)\n this.addRoute('patch', `${basePath}/:id`, controller.update.bind(controller), `${name}.update`, middleware)\n this.addRoute('delete', `${basePath}/:id`, controller.destroy.bind(controller), `${name}.destroy`, middleware)\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: () => 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()\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 { 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 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 { 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)\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":["Router","routes","nameMap","groupPrefix","middlewareMap","groupMiddleware","h3App","app","resolveHandler","handler","middleware","event","kernel","Kernel","request","Request","response","Response","handle","ctx","Promise","resolve","addRoute","method","path","name","length","join","fullPath","replace","push","resolveControllerOrHandler","methodName","prototype","Controller","controller","action","Error","String","get","definition","Array","isArray","undefined","post","put","delete","apiResource","afterLast","basePath","index","bind","store","show","update","destroy","route","params","found","find","r","url","key","value","Object","entries","group","options","callback","prevPrefix","prevMiddleware","prefix","opts","use","concat","import_core","import_support","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_node_path","import_promises","RouteServiceProvider","ServiceProvider","priority","register","app","singleton","h3App","make","Router","boot","routePath","getPath","files","readdir","i","length","routesModule","path","join","default","router","e","console","warn"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/Route.ts","../src/Providers/AssetsServiceProvider.ts","../src/Providers/RouteServiceProvider.ts"],"sourcesContent":["/**\n * @file Automatically generated by barrelsby.\n */\n\nexport * from './Controller';\nexport * from './Route';\nexport * from './Providers/AssetsServiceProvider';\nexport * from './Providers/RouteServiceProvider';\n","import { H3Event, Middleware, MiddlewareOptions, type H3 } from 'h3'\nimport { Request, Response } from '@h3ravel/http'\nimport { Application, Controller, Kernel } from '@h3ravel/core'\nimport { afterLast } from '@h3ravel/support'\nimport type { EventHandler, IController, IMiddleware, IRouter, 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(() => ({\n request: new Request(event),\n response: new Response(event)\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 private resolveControllerOrHandler (\n handler: EventHandler | (new (...args: any[]) => IController),\n methodName?: string\n ): EventHandler {\n if (typeof handler === 'function' && (handler as any).prototype instanceof Controller) {\n return (ctx) => {\n const controller = new (handler as new (...args: any[]) => IController)(this.app)\n const action = (methodName || 'index') as keyof IController\n\n if (typeof controller[action] !== 'function') {\n throw new Error(`Method \"${String(action)}\" not found on controller ${handler.name}`)\n }\n\n return controller[action](ctx)\n }\n }\n\n return handler as EventHandler\n }\n\n\n get (\n path: string,\n definition: EventHandler | [(new (...args: any[]) => IController), 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('get', path, this.resolveControllerOrHandler(handler, methodName), name, middleware)\n return this\n }\n\n post (\n path: string,\n definition: EventHandler | [(new (...args: any[]) => IController), 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 put (\n path: string,\n definition: EventHandler | [(new (...args: any[]) => IController), 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 delete (\n path: string,\n definition: EventHandler | [(new (...args: any[]) => IController), 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> {\n path = path.replace(/\\//g, '/')\n\n const name = afterLast(path, '/')\n const basePath = `/${path}`.replace(/\\/+/g, '/')\n\n const controller = new Controller(this.app)\n\n this.addRoute('get', basePath, controller.index.bind(controller), `${name}.index`, middleware)\n this.addRoute('post', basePath, controller.store.bind(controller), `${name}.store`, middleware)\n this.addRoute('get', `${basePath}/:id`, controller.show.bind(controller), `${name}.show`, middleware)\n this.addRoute('put', `${basePath}/:id`, controller.update.bind(controller), `${name}.update`, middleware)\n this.addRoute('patch', `${basePath}/:id`, controller.update.bind(controller), `${name}.update`, middleware)\n this.addRoute('delete', `${basePath}/:id`, controller.destroy.bind(controller), `${name}.destroy`, middleware)\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: () => 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()\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 { 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 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 { 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)\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":["Router","routes","nameMap","groupPrefix","middlewareMap","groupMiddleware","h3App","app","resolveHandler","handler","middleware","event","kernel","Kernel","request","Request","response","Response","handle","ctx","Promise","resolve","addRoute","method","path","name","length","join","fullPath","replace","push","resolveControllerOrHandler","methodName","prototype","Controller","controller","action","Error","String","get","definition","Array","isArray","undefined","post","put","delete","apiResource","afterLast","basePath","index","bind","store","show","update","destroy","route","params","found","find","r","url","key","value","Object","entries","group","options","callback","prevPrefix","prevMiddleware","prefix","opts","use","concat","import_core","import_support","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_node_path","import_promises","RouteServiceProvider","ServiceProvider","priority","register","app","singleton","h3App","make","Router","boot","routePath","getPath","files","readdir","i","length","routesModule","path","join","default","router","e","console","warn"]}
package/dist/index.d.cts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { H3, Middleware, MiddlewareOptions } from 'h3';
2
2
  import { Application, ServiceProvider } from '@h3ravel/core';
3
- import { IRouter, EventHandler, IController, IMiddleware } from '@h3ravel/shared';
3
+ import { IRouter, EventHandler, IController, IMiddleware, RouterEnd } from '@h3ravel/shared';
4
4
 
5
5
  declare class Router implements IRouter {
6
6
  protected h3App: H3;
@@ -30,17 +30,17 @@ declare class Router implements IRouter {
30
30
  */
31
31
  private addRoute;
32
32
  private resolveControllerOrHandler;
33
- get(path: string, definition: EventHandler | [(new (...args: any[]) => IController), methodName: string], name?: string, middleware?: IMiddleware[]): this;
34
- post(path: string, definition: EventHandler | [(new (...args: any[]) => IController), methodName: string], name?: string, middleware?: IMiddleware[]): this;
35
- put(path: string, definition: EventHandler | [(new (...args: any[]) => IController), methodName: string], name?: string, middleware?: IMiddleware[]): this;
36
- delete(path: string, definition: EventHandler | [(new (...args: any[]) => IController), methodName: string], name?: string, middleware?: IMiddleware[]): this;
33
+ get(path: string, definition: EventHandler | [(new (...args: any[]) => IController), methodName: string], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
34
+ post(path: string, definition: EventHandler | [(new (...args: any[]) => IController), methodName: string], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
35
+ put(path: string, definition: EventHandler | [(new (...args: any[]) => IController), methodName: string], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
36
+ delete(path: string, definition: EventHandler | [(new (...args: any[]) => IController), methodName: string], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
37
37
  /**
38
38
  * API Resource support
39
39
  *
40
40
  * @param path
41
41
  * @param controller
42
42
  */
43
- apiResource(path: string, Controller: new (app: Application) => IController, middleware?: IMiddleware[]): this;
43
+ apiResource(path: string, Controller: new (app: Application) => IController, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
44
44
  /**
45
45
  * Named route URL generator
46
46
  *
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { H3, Middleware, MiddlewareOptions } from 'h3';
2
2
  import { Application, ServiceProvider } from '@h3ravel/core';
3
- import { IRouter, EventHandler, IController, IMiddleware } from '@h3ravel/shared';
3
+ import { IRouter, EventHandler, IController, IMiddleware, RouterEnd } from '@h3ravel/shared';
4
4
 
5
5
  declare class Router implements IRouter {
6
6
  protected h3App: H3;
@@ -30,17 +30,17 @@ declare class Router implements IRouter {
30
30
  */
31
31
  private addRoute;
32
32
  private resolveControllerOrHandler;
33
- get(path: string, definition: EventHandler | [(new (...args: any[]) => IController), methodName: string], name?: string, middleware?: IMiddleware[]): this;
34
- post(path: string, definition: EventHandler | [(new (...args: any[]) => IController), methodName: string], name?: string, middleware?: IMiddleware[]): this;
35
- put(path: string, definition: EventHandler | [(new (...args: any[]) => IController), methodName: string], name?: string, middleware?: IMiddleware[]): this;
36
- delete(path: string, definition: EventHandler | [(new (...args: any[]) => IController), methodName: string], name?: string, middleware?: IMiddleware[]): this;
33
+ get(path: string, definition: EventHandler | [(new (...args: any[]) => IController), methodName: string], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
34
+ post(path: string, definition: EventHandler | [(new (...args: any[]) => IController), methodName: string], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
35
+ put(path: string, definition: EventHandler | [(new (...args: any[]) => IController), methodName: string], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
36
+ delete(path: string, definition: EventHandler | [(new (...args: any[]) => IController), methodName: string], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
37
37
  /**
38
38
  * API Resource support
39
39
  *
40
40
  * @param path
41
41
  * @param controller
42
42
  */
43
- apiResource(path: string, Controller: new (app: Application) => IController, middleware?: IMiddleware[]): this;
43
+ apiResource(path: string, Controller: new (app: Application) => IController, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
44
44
  /**
45
45
  * Named route URL generator
46
46
  *
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/Route.ts","../src/Providers/AssetsServiceProvider.ts","../src/Providers/RouteServiceProvider.ts"],"sourcesContent":["import { H3Event, Middleware, MiddlewareOptions, type H3 } from 'h3'\nimport { Request, Response } from '@h3ravel/http'\nimport { Application, Controller, Kernel } from '@h3ravel/core'\nimport { afterLast } from '@h3ravel/support'\nimport type { EventHandler, IController, IMiddleware, IRouter } 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(() => ({\n request: new Request(event),\n response: new Response(event)\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 private resolveControllerOrHandler (\n handler: EventHandler | (new (...args: any[]) => IController),\n methodName?: string\n ): EventHandler {\n if (typeof handler === 'function' && (handler as any).prototype instanceof Controller) {\n return (ctx) => {\n const controller = new (handler as new (...args: any[]) => IController)(this.app)\n const action = (methodName || 'index') as keyof IController\n\n if (typeof controller[action] !== 'function') {\n throw new Error(`Method \"${String(action)}\" not found on controller ${handler.name}`)\n }\n\n return controller[action](ctx)\n }\n }\n\n return handler as EventHandler\n }\n\n\n get (\n path: string,\n definition: EventHandler | [(new (...args: any[]) => IController), methodName: string],\n name?: string,\n middleware: IMiddleware[] = []\n ) {\n const handler = Array.isArray(definition) ? definition[0] : definition\n const methodName = Array.isArray(definition) ? definition[1] : undefined\n this.addRoute('get', path, this.resolveControllerOrHandler(handler, methodName), name, middleware)\n return this\n }\n\n post (\n path: string,\n definition: EventHandler | [(new (...args: any[]) => IController), methodName: string],\n name?: string,\n middleware: IMiddleware[] = []\n ) {\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 put (\n path: string,\n definition: EventHandler | [(new (...args: any[]) => IController), methodName: string],\n name?: string,\n middleware: IMiddleware[] = []\n ) {\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 delete (\n path: string,\n definition: EventHandler | [(new (...args: any[]) => IController), methodName: string],\n name?: string,\n middleware: IMiddleware[] = []\n ) {\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 ) {\n path = path.replace(/\\//g, '/')\n\n const name = afterLast(path, '/')\n const basePath = `/${path}`.replace(/\\/+/g, '/')\n\n const controller = new Controller(this.app)\n\n this.addRoute('get', basePath, controller.index.bind(controller), `${name}.index`, middleware)\n this.addRoute('post', basePath, controller.store.bind(controller), `${name}.store`, middleware)\n this.addRoute('get', `${basePath}/:id`, controller.show.bind(controller), `${name}.show`, middleware)\n this.addRoute('put', `${basePath}/:id`, controller.update.bind(controller), `${name}.update`, middleware)\n this.addRoute('patch', `${basePath}/:id`, controller.update.bind(controller), `${name}.update`, middleware)\n this.addRoute('delete', `${basePath}/:id`, controller.destroy.bind(controller), `${name}.destroy`, middleware)\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: () => 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()\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 { 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 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 { 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)\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":["Request","Response","Controller","Kernel","afterLast","Router","routes","nameMap","groupPrefix","middlewareMap","groupMiddleware","h3App","app","resolveHandler","handler","middleware","event","kernel","Kernel","request","Request","response","Response","handle","ctx","Promise","resolve","addRoute","method","path","name","length","join","fullPath","replace","push","resolveControllerOrHandler","methodName","prototype","Controller","controller","action","Error","String","get","definition","Array","isArray","undefined","post","put","delete","apiResource","afterLast","basePath","index","bind","store","show","update","destroy","route","params","found","find","r","url","key","value","Object","entries","group","options","callback","prevPrefix","prevMiddleware","prefix","opts","use","concat","readFile","stat","ServiceProvider","before","join","serveStatic","statSync","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","ServiceProvider","path","readdir","RouteServiceProvider","ServiceProvider","priority","register","app","singleton","h3App","make","Router","boot","routePath","getPath","files","readdir","i","length","routesModule","path","join","default","router","e","console","warn"]}
1
+ {"version":3,"sources":["../src/Route.ts","../src/Providers/AssetsServiceProvider.ts","../src/Providers/RouteServiceProvider.ts"],"sourcesContent":["import { H3Event, Middleware, MiddlewareOptions, type H3 } from 'h3'\nimport { Request, Response } from '@h3ravel/http'\nimport { Application, Controller, Kernel } from '@h3ravel/core'\nimport { afterLast } from '@h3ravel/support'\nimport type { EventHandler, IController, IMiddleware, IRouter, 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(() => ({\n request: new Request(event),\n response: new Response(event)\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 private resolveControllerOrHandler (\n handler: EventHandler | (new (...args: any[]) => IController),\n methodName?: string\n ): EventHandler {\n if (typeof handler === 'function' && (handler as any).prototype instanceof Controller) {\n return (ctx) => {\n const controller = new (handler as new (...args: any[]) => IController)(this.app)\n const action = (methodName || 'index') as keyof IController\n\n if (typeof controller[action] !== 'function') {\n throw new Error(`Method \"${String(action)}\" not found on controller ${handler.name}`)\n }\n\n return controller[action](ctx)\n }\n }\n\n return handler as EventHandler\n }\n\n\n get (\n path: string,\n definition: EventHandler | [(new (...args: any[]) => IController), 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('get', path, this.resolveControllerOrHandler(handler, methodName), name, middleware)\n return this\n }\n\n post (\n path: string,\n definition: EventHandler | [(new (...args: any[]) => IController), 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 put (\n path: string,\n definition: EventHandler | [(new (...args: any[]) => IController), 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 delete (\n path: string,\n definition: EventHandler | [(new (...args: any[]) => IController), 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> {\n path = path.replace(/\\//g, '/')\n\n const name = afterLast(path, '/')\n const basePath = `/${path}`.replace(/\\/+/g, '/')\n\n const controller = new Controller(this.app)\n\n this.addRoute('get', basePath, controller.index.bind(controller), `${name}.index`, middleware)\n this.addRoute('post', basePath, controller.store.bind(controller), `${name}.store`, middleware)\n this.addRoute('get', `${basePath}/:id`, controller.show.bind(controller), `${name}.show`, middleware)\n this.addRoute('put', `${basePath}/:id`, controller.update.bind(controller), `${name}.update`, middleware)\n this.addRoute('patch', `${basePath}/:id`, controller.update.bind(controller), `${name}.update`, middleware)\n this.addRoute('delete', `${basePath}/:id`, controller.destroy.bind(controller), `${name}.destroy`, middleware)\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: () => 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()\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 { 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 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 { 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)\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":";;;;AACA,SAASA,SAASC,gBAAgB;AAClC,SAAsBC,YAAYC,cAAc;AAChD,SAASC,iBAAiB;AAUnB,IAAMC,SAAN,MAAMA;EAZb,OAYaA;;;;;EACDC,SAA4B,CAAA;EAC5BC,UAAoB,CAAA;EACpBC,cAAc;EACdC,gBAA+B,CAAA;EAC/BC,kBAAkC,CAAA;EAE1C,YAAsBC,OAAmBC,KAAkB;SAArCD,QAAAA;SAAmBC,MAAAA;EAAoB;;;;;;;;EASrDC,eAAgBC,SAAuBC,aAA4B,CAAA,GAAI;AAC3E,WAAO,OAAOC,UAAAA;AACV,YAAMC,SAAS,IAAIC,OAAO,OAAO;QAC7BC,SAAS,IAAIC,QAAQJ,KAAAA;QACrBK,UAAU,IAAIC,SAASN,KAAAA;MAC3B,IAAID,UAAAA;AAEJ,aAAOE,OAAOM,OAAOP,OAAO,CAACQ,QAAQC,QAAQC,QAAQZ,QAAQU,GAAAA,CAAAA,CAAAA;IACjE;EACJ;;;;;;;;;;EAWQG,SACJC,QACAC,OACAf,SACAgB,MACAf,aAA4B,CAAA,GAC9B;AAIE,QAAI,KAAKR,QAAQwB,SAAS,GAAG;AACzBD,aAAO,KAAKvB,QAAQyB,KAAK,GAAA;IAC7B;AAKA,QAAI,KAAKvB,cAAcsB,SAAS,GAAG;AAC/BhB,mBAAa,KAAKN;IACtB;AAEA,UAAMwB,WAAW,GAAG,KAAKzB,WAAW,GAAGqB,KAAAA,GAAOK,QAAQ,QAAQ,GAAA;AAC9D,SAAK5B,OAAO6B,KAAK;MAAEP;MAAQC,MAAMI;MAAUH;MAAMhB;IAAQ,CAAA;AACzD,SAAKH,MAAMiB,MAAAA,EAAiBK,UAAU,KAAKpB,eAAeC,SAASC,UAAAA,CAAAA;EACvE;EAEQqB,2BACJtB,SACAuB,YACY;AACZ,QAAI,OAAOvB,YAAY,cAAeA,QAAgBwB,qBAAqBC,YAAY;AACnF,aAAO,CAACf,QAAAA;AACJ,cAAMgB,aAAa,IAAK1B,QAAgD,KAAKF,GAAG;AAChF,cAAM6B,SAAUJ,cAAc;AAE9B,YAAI,OAAOG,WAAWC,MAAAA,MAAY,YAAY;AAC1C,gBAAM,IAAIC,MAAM,WAAWC,OAAOF,MAAAA,CAAAA,6BAAoC3B,QAAQgB,IAAI,EAAE;QACxF;AAEA,eAAOU,WAAWC,MAAAA,EAAQjB,GAAAA;MAC9B;IACJ;AAEA,WAAOV;EACX;EAGA8B,IACIf,OACAgB,YACAf,MACAf,aAA4B,CAAA,GACP;AACrB,UAAMD,UAAUgC,MAAMC,QAAQF,UAAAA,IAAcA,WAAW,CAAA,IAAKA;AAC5D,UAAMR,aAAaS,MAAMC,QAAQF,UAAAA,IAAcA,WAAW,CAAA,IAAKG;AAC/D,SAAKrB,SAAS,OAAOE,OAAM,KAAKO,2BAA2BtB,SAASuB,UAAAA,GAAaP,MAAMf,UAAAA;AACvF,WAAO;EACX;EAEAkC,KACIpB,OACAgB,YACAf,MACAf,aAA4B,CAAA,GACP;AACrB,UAAMD,UAAUgC,MAAMC,QAAQF,UAAAA,IAAcA,WAAW,CAAA,IAAKA;AAC5D,UAAMR,aAAaS,MAAMC,QAAQF,UAAAA,IAAcA,WAAW,CAAA,IAAKG;AAC/D,SAAKrB,SAAS,QAAQE,OAAM,KAAKO,2BAA2BtB,SAASuB,UAAAA,GAAaP,MAAMf,UAAAA;AACxF,WAAO;EACX;EAEAmC,IACIrB,OACAgB,YACAf,MACAf,aAA4B,CAAA,GACP;AACrB,UAAMD,UAAUgC,MAAMC,QAAQF,UAAAA,IAAcA,WAAW,CAAA,IAAKA;AAC5D,UAAMR,aAAaS,MAAMC,QAAQF,UAAAA,IAAcA,WAAW,CAAA,IAAKG;AAC/D,SAAKrB,SAAS,OAAOE,OAAM,KAAKO,2BAA2BtB,SAASuB,UAAAA,GAAaP,MAAMf,UAAAA;AACvF,WAAO;EACX;EAEAoC,OACItB,OACAgB,YACAf,MACAf,aAA4B,CAAA,GACP;AACrB,UAAMD,UAAUgC,MAAMC,QAAQF,UAAAA,IAAcA,WAAW,CAAA,IAAKA;AAC5D,UAAMR,aAAaS,MAAMC,QAAQF,UAAAA,IAAcA,WAAW,CAAA,IAAKG;AAC/D,SAAKrB,SAAS,UAAUE,OAAM,KAAKO,2BAA2BtB,SAASuB,UAAAA,GAAaP,MAAMf,UAAAA;AAC1F,WAAO;EACX;;;;;;;EAQAqC,YACIvB,OACAU,aACAxB,aAA4B,CAAA,GACP;AACrBc,IAAAA,QAAOA,MAAKK,QAAQ,OAAO,GAAA;AAE3B,UAAMJ,OAAOuB,UAAUxB,OAAM,GAAA;AAC7B,UAAMyB,WAAW,IAAIzB,KAAAA,GAAOK,QAAQ,QAAQ,GAAA;AAE5C,UAAMM,aAAa,IAAID,YAAW,KAAK3B,GAAG;AAE1C,SAAKe,SAAS,OAAO2B,UAAUd,WAAWe,MAAMC,KAAKhB,UAAAA,GAAa,GAAGV,IAAAA,UAAcf,UAAAA;AACnF,SAAKY,SAAS,QAAQ2B,UAAUd,WAAWiB,MAAMD,KAAKhB,UAAAA,GAAa,GAAGV,IAAAA,UAAcf,UAAAA;AACpF,SAAKY,SAAS,OAAO,GAAG2B,QAAAA,QAAgBd,WAAWkB,KAAKF,KAAKhB,UAAAA,GAAa,GAAGV,IAAAA,SAAaf,UAAAA;AAC1F,SAAKY,SAAS,OAAO,GAAG2B,QAAAA,QAAgBd,WAAWmB,OAAOH,KAAKhB,UAAAA,GAAa,GAAGV,IAAAA,WAAef,UAAAA;AAC9F,SAAKY,SAAS,SAAS,GAAG2B,QAAAA,QAAgBd,WAAWmB,OAAOH,KAAKhB,UAAAA,GAAa,GAAGV,IAAAA,WAAef,UAAAA;AAChG,SAAKY,SAAS,UAAU,GAAG2B,QAAAA,QAAgBd,WAAWoB,QAAQJ,KAAKhB,UAAAA,GAAa,GAAGV,IAAAA,YAAgBf,UAAAA;AACnG,WAAO;EACX;;;;;;;;EASA8C,MAAO/B,MAAcgC,SAAiC,CAAC,GAAuB;AAC1E,UAAMC,QAAQ,KAAKzD,OAAO0D,KAAKC,CAAAA,MAAKA,EAAEnC,SAASA,IAAAA;AAC/C,QAAI,CAACiC;AAAO,aAAOf;AAEnB,QAAIkB,MAAMH,MAAMlC;AAChB,eAAW,CAACsC,KAAKC,KAAAA,KAAUC,OAAOC,QAAQR,MAAAA,GAAS;AAC/CI,YAAMA,IAAIhC,QAAQ,IAAIiC,GAAAA,IAAOC,KAAAA;IACjC;AACA,WAAOF;EACX;;;;;;;EAQAK,MAAOC,SAA2DC,UAAsB;AACpF,UAAMC,aAAa,KAAKlE;AACxB,UAAMmE,iBAAiB;SAAI,KAAKjE;;AAEhC,SAAKF,eAAegE,QAAQI,UAAU;AACtC,SAAKlE,gBAAgByB,KAAI,GAAKqC,QAAQzD,cAAc,CAAA,CAAE;AAEtD0D,aAAAA;AAKA,SAAKjE,cAAckE;AACnB,SAAKhE,kBAAkBiE;AACvB,WAAO;EACX;;;;;;EAOA7C,KAAMA,MAAc;AAChB,SAAKvB,QAAQ4B,KAAKL,IAAAA;AAClB,WAAO;EACX;;;;;;;EAQAf,WAAYc,OAA8Bf,SAAqB+D,MAA0B;AACrF,QAAI,OAAOhD,UAAS,UAAU;AAC1B,WAAKlB,MAAMmE,IAAIjD,OAAMf,SAAS+D,IAAAA;IAClC,OAAO;AACH,WAAKpE,cAAcsE,OAAOlD,KAAAA;IAC9B;AACA,WAAO;EACX;AACJ;;;AC5OA,SAASmD,UAAUC,YAAY;AAE/B,SAASC,uBAAuB;AAChC,SAASC,cAAc;AACvB,SAASC,YAAY;AACrB,SAASC,mBAAmB;AAC5B,SAASC,gBAAgB;AAOlB,IAAMC,wBAAN,cAAoCC,gBAAAA;EAb3C,OAa2CA;;;EACvC,OAAcC,WAAW;EAEzBC,WAAY;AACR,UAAMC,MAAM,KAAKA,IAAIC,KAAK,QAAA;AAC1B,UAAMC,SAAS,KAAKF,IAAIC,KAAK,QAAA;AAC7B,UAAME,WAAWD,OAAOE,IAAI,YAAA;AAC5B,UAAMC,aAAa,KAAKL,IAAIM,QAAQ,QAAA;AAEpCN,QAAIO,WAAW,IAAIJ,SAASK,WAAW,OAAO,CAACC,UAAAA;AAC3C,aAAOC,YAAYD,OAAO;QACtBE,YAAY;UAAC;;QACbC,aAAa,CAACC,OAAAA;AACV,gBAAMC,QAAQD,GAAGE,QAAQ,IAAIZ,SAASK,WAAW,KAAK,EAAA;AACtD,iBAAOQ,SAASC,KAAKC,OAAOb,YAAYS,KAAAA,GAAQA,KAAAA,CAAAA;QACpD;QACAK,SAAS,OAAON,OAAAA;AACZ,gBAAMC,QAAQD,GAAGE,QAAQ,IAAIZ,SAASK,WAAW,KAAK,EAAA;AACtD,gBAAMY,QAAQ,MAAMC,KAAKJ,KAAKC,OAAOb,YAAYS,KAAAA,GAAQA,KAAAA,CAAAA,EAAQQ,MAAM,MAAA;UAAQ,CAAA;AAC/E,cAAIF,OAAOG,OAAAA,GAAU;AACjB,mBAAO;cACHC,MAAMJ,MAAMI;cACZC,OAAOL,MAAMM;YACjB;UACJ;QACJ;MACJ,CAAA;IACJ,CAAA;AAEA,SAAK1B,IAAI2B,UAAU,SAAS,MAAA;AACxB,aAAO,CAACC,KAAaC,MAAM,OAAE;AACzB,YAAI;AACAC,mBAASb,KAAKC,OAAOb,YAAYuB,GAAAA,GAAMA,GAAAA,CAAAA;QAC3C,QAAQ;AACJA,gBAAMC;QACV;AAEA,eAAOZ,KAAKd,SAASK,aAAaoB,GAAAA;MACtC;IACJ,CAAA;EACJ;AACJ;;;ACrDA,SAASG,mBAAAA,wBAAuB;AAChC,OAAOC,UAAU;AACjB,SAASC,eAAe;AAWjB,IAAMC,uBAAN,cAAmCC,iBAAAA;EAd1C,OAc0CA;;;EACtC,OAAcC,WAAW;EAEzBC,WAAY;AACR,SAAKC,IAAIC,UAAU,UAAU,MAAA;AACzB,YAAMC,QAAQ,KAAKF,IAAIG,KAAK,UAAA;AAC5B,aAAO,IAAIC,OAAOF,OAAO,KAAKF,GAAG;IACrC,CAAA;EACJ;;;;EAKA,MAAMK,OAAQ;AACV,QAAI;AACA,YAAMC,YAAY,KAAKN,IAAIO,QAAQ,QAAA;AAEnC,YAAMC,QAAQ,MAAMC,QAAQH,SAAAA;AAE5B,eAASI,IAAI,GAAGA,IAAIF,MAAMG,QAAQD,KAAK;AACnC,cAAME,eAAe,MAAM,OAAOC,KAAKC,KAAKR,WAAWE,MAAME,CAAAA,CAAE;AAE/D,YAAI,OAAOE,aAAaG,YAAY,YAAY;AAC5C,gBAAMC,SAAS,KAAKhB,IAAIG,KAAK,QAAA;AAC7BS,uBAAaG,QAAQC,MAAAA;QACzB;MACJ;IACJ,SAASC,GAAG;AACRC,cAAQC,KAAK,0CAA0CF,CAAAA;IAC3D;EACJ;AACJ;","names":["Request","Response","Controller","Kernel","afterLast","Router","routes","nameMap","groupPrefix","middlewareMap","groupMiddleware","h3App","app","resolveHandler","handler","middleware","event","kernel","Kernel","request","Request","response","Response","handle","ctx","Promise","resolve","addRoute","method","path","name","length","join","fullPath","replace","push","resolveControllerOrHandler","methodName","prototype","Controller","controller","action","Error","String","get","definition","Array","isArray","undefined","post","put","delete","apiResource","afterLast","basePath","index","bind","store","show","update","destroy","route","params","found","find","r","url","key","value","Object","entries","group","options","callback","prevPrefix","prevMiddleware","prefix","opts","use","concat","readFile","stat","ServiceProvider","before","join","serveStatic","statSync","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","ServiceProvider","path","readdir","RouteServiceProvider","ServiceProvider","priority","register","app","singleton","h3App","make","Router","boot","routePath","getPath","files","readdir","i","length","routesModule","path","join","default","router","e","console","warn"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@h3ravel/router",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "description": "Route facade, decorators and controller system for H3ravel.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -20,10 +20,10 @@
20
20
  ],
21
21
  "dependencies": {
22
22
  "h3": "^2.0.0-beta.1",
23
- "@h3ravel/core": "1.0.5",
24
- "@h3ravel/http": "4.1.1",
23
+ "@h3ravel/http": "4.1.2",
25
24
  "@h3ravel/support": "0.7.1",
26
- "@h3ravel/shared": "0.9.0"
25
+ "@h3ravel/shared": "0.10.0",
26
+ "@h3ravel/core": "1.0.6"
27
27
  },
28
28
  "scripts": {
29
29
  "barrel": "barrelsby --directory src --delete --singleQuotes",
package/src/Route.ts CHANGED
@@ -2,7 +2,7 @@ import { H3Event, Middleware, MiddlewareOptions, type H3 } from 'h3'
2
2
  import { Request, Response } from '@h3ravel/http'
3
3
  import { Application, Controller, Kernel } from '@h3ravel/core'
4
4
  import { afterLast } from '@h3ravel/support'
5
- import type { EventHandler, IController, IMiddleware, IRouter } from '@h3ravel/shared'
5
+ import type { EventHandler, IController, IMiddleware, IRouter, RouterEnd } from '@h3ravel/shared'
6
6
 
7
7
  interface RouteDefinition {
8
8
  method: string
@@ -99,7 +99,7 @@ export class Router implements IRouter {
99
99
  definition: EventHandler | [(new (...args: any[]) => IController), methodName: string],
100
100
  name?: string,
101
101
  middleware: IMiddleware[] = []
102
- ) {
102
+ ): Omit<this, RouterEnd> {
103
103
  const handler = Array.isArray(definition) ? definition[0] : definition
104
104
  const methodName = Array.isArray(definition) ? definition[1] : undefined
105
105
  this.addRoute('get', path, this.resolveControllerOrHandler(handler, methodName), name, middleware)
@@ -111,7 +111,7 @@ export class Router implements IRouter {
111
111
  definition: EventHandler | [(new (...args: any[]) => IController), methodName: string],
112
112
  name?: string,
113
113
  middleware: IMiddleware[] = []
114
- ) {
114
+ ): Omit<this, RouterEnd> {
115
115
  const handler = Array.isArray(definition) ? definition[0] : definition
116
116
  const methodName = Array.isArray(definition) ? definition[1] : undefined
117
117
  this.addRoute('post', path, this.resolveControllerOrHandler(handler, methodName), name, middleware)
@@ -123,7 +123,7 @@ export class Router implements IRouter {
123
123
  definition: EventHandler | [(new (...args: any[]) => IController), methodName: string],
124
124
  name?: string,
125
125
  middleware: IMiddleware[] = []
126
- ) {
126
+ ): Omit<this, RouterEnd> {
127
127
  const handler = Array.isArray(definition) ? definition[0] : definition
128
128
  const methodName = Array.isArray(definition) ? definition[1] : undefined
129
129
  this.addRoute('put', path, this.resolveControllerOrHandler(handler, methodName), name, middleware)
@@ -135,7 +135,7 @@ export class Router implements IRouter {
135
135
  definition: EventHandler | [(new (...args: any[]) => IController), methodName: string],
136
136
  name?: string,
137
137
  middleware: IMiddleware[] = []
138
- ) {
138
+ ): Omit<this, RouterEnd> {
139
139
  const handler = Array.isArray(definition) ? definition[0] : definition
140
140
  const methodName = Array.isArray(definition) ? definition[1] : undefined
141
141
  this.addRoute('delete', path, this.resolveControllerOrHandler(handler, methodName), name, middleware)
@@ -152,7 +152,7 @@ export class Router implements IRouter {
152
152
  path: string,
153
153
  Controller: new (app: Application) => IController,
154
154
  middleware: IMiddleware[] = []
155
- ) {
155
+ ): Omit<this, RouterEnd> {
156
156
  path = path.replace(/\//g, '/')
157
157
 
158
158
  const name = afterLast(path, '/')