@h3ravel/router 1.5.4 → 1.6.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,18 @@
1
1
  # @h3ravel/router
2
2
 
3
+ ## 1.6.0
4
+
5
+ ### Minor Changes
6
+
7
+ - feat: implement full IoC container resolution
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies
12
+ - @h3ravel/core@1.3.0
13
+ - @h3ravel/shared@0.15.4
14
+ - @h3ravel/http@7.0.0
15
+
3
16
  ## 1.5.4
4
17
 
5
18
  ### Patch Changes
package/dist/index.cjs CHANGED
@@ -101,7 +101,12 @@ var Router = class {
101
101
  resolveControllerOrHandler(handler, methodName) {
102
102
  if (typeof handler === "function" && handler.prototype instanceof import_core.Controller) {
103
103
  return (ctx) => {
104
- const controller = new handler(this.app);
104
+ let controller;
105
+ if (import_core.Container.hasAnyDecorator(handler)) {
106
+ controller = this.app.make(handler);
107
+ } else {
108
+ controller = new handler(this.app);
109
+ }
105
110
  const action = methodName || "index";
106
111
  if (typeof controller[action] !== "function") {
107
112
  throw new Error(`Method "${String(action)}" not found on controller ${handler.name}`);
@@ -287,7 +292,9 @@ var RouteServiceProvider = class extends import_core3.ServiceProvider {
287
292
  async boot() {
288
293
  try {
289
294
  const routePath = this.app.getPath("routes");
290
- const files = await (0, import_promises2.readdir)(routePath);
295
+ const files = (await (0, import_promises2.readdir)(routePath)).filter((e) => {
296
+ return !e.includes(".d.ts") && !e.includes(".map");
297
+ });
291
298
  for (let i = 0; i < files.length; i++) {
292
299
  const routesModule = await import(import_node_path2.default.join(routePath, files[i]));
293
300
  if (typeof routesModule.default === "function") {
@@ -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, 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 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 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 | 'name'> {\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, Container, 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 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 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 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 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 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 | 'name'> {\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 <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 { 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":["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","Container","hasAnyDecorator","make","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","filter","e","includes","i","length","routesModule","path","join","default","router","console","warn"]}
package/dist/index.js CHANGED
@@ -3,7 +3,7 @@ var __name = (target, value) => __defProp(target, "name", { value, configurable:
3
3
 
4
4
  // src/Route.ts
5
5
  import { Request, Response } from "@h3ravel/http";
6
- import { Controller, Kernel } from "@h3ravel/core";
6
+ import { Container, Controller, Kernel } from "@h3ravel/core";
7
7
  import { afterLast } from "@h3ravel/support";
8
8
  var Router = class {
9
9
  static {
@@ -65,7 +65,12 @@ var Router = class {
65
65
  resolveControllerOrHandler(handler, methodName) {
66
66
  if (typeof handler === "function" && handler.prototype instanceof Controller) {
67
67
  return (ctx) => {
68
- const controller = new handler(this.app);
68
+ let controller;
69
+ if (Container.hasAnyDecorator(handler)) {
70
+ controller = this.app.make(handler);
71
+ } else {
72
+ controller = new handler(this.app);
73
+ }
69
74
  const action = methodName || "index";
70
75
  if (typeof controller[action] !== "function") {
71
76
  throw new Error(`Method "${String(action)}" not found on controller ${handler.name}`);
@@ -179,12 +184,12 @@ var Router = class {
179
184
  };
180
185
 
181
186
  // src/Providers/AssetsServiceProvider.ts
182
- import { readFile, stat } from "node:fs/promises";
187
+ import { readFile, stat } from "fs/promises";
183
188
  import { ServiceProvider } from "@h3ravel/core";
184
189
  import { before } from "@h3ravel/support";
185
- import { join } from "node:path";
190
+ import { join } from "path";
186
191
  import { serveStatic } from "h3";
187
- import { statSync } from "node:fs";
192
+ import { statSync } from "fs";
188
193
  var AssetsServiceProvider = class extends ServiceProvider {
189
194
  static {
190
195
  __name(this, "AssetsServiceProvider");
@@ -232,8 +237,8 @@ var AssetsServiceProvider = class extends ServiceProvider {
232
237
 
233
238
  // src/Providers/RouteServiceProvider.ts
234
239
  import { ServiceProvider as ServiceProvider2 } from "@h3ravel/core";
235
- import path from "node:path";
236
- import { readdir } from "node:fs/promises";
240
+ import path from "path";
241
+ import { readdir } from "fs/promises";
237
242
  var RouteServiceProvider = class extends ServiceProvider2 {
238
243
  static {
239
244
  __name(this, "RouteServiceProvider");
@@ -251,7 +256,9 @@ var RouteServiceProvider = class extends ServiceProvider2 {
251
256
  async boot() {
252
257
  try {
253
258
  const routePath = this.app.getPath("routes");
254
- const files = await readdir(routePath);
259
+ const files = (await readdir(routePath)).filter((e) => {
260
+ return !e.includes(".d.ts") && !e.includes(".map");
261
+ });
255
262
  for (let i = 0; i < files.length; i++) {
256
263
  const routesModule = await import(path.join(routePath, files[i]));
257
264
  if (typeof routesModule.default === "function") {
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, 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 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 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 | 'name'> {\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;QAC7BN,KAAK,KAAKA;QACVO,SAAS,IAAIC,QAAQJ,OAAO,KAAKJ,GAAG;QACpCS,UAAU,IAAIC,SAASN,OAAO,KAAKJ,GAAG;MAC1C,IAAIG,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,GACE;AAC9Bc,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;;;AC7OA,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"]}
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, Container, 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 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 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 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 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 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 | 'name'> {\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 <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 { 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":["Request","Response","Container","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","Container","hasAnyDecorator","make","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","filter","e","includes","i","length","routesModule","path","join","default","router","console","warn"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@h3ravel/router",
3
- "version": "1.5.4",
3
+ "version": "1.6.0",
4
4
  "description": "Route facade, decorators and controller system for H3ravel.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -26,10 +26,10 @@
26
26
  ],
27
27
  "dependencies": {
28
28
  "h3": "^2.0.0-beta.1",
29
- "@h3ravel/http": "^6.0.2",
30
- "@h3ravel/core": "^1.2.2",
31
- "@h3ravel/shared": "^0.15.2",
32
- "@h3ravel/support": "^0.7.5"
29
+ "@h3ravel/support": "^0.7.5",
30
+ "@h3ravel/core": "^1.3.0",
31
+ "@h3ravel/http": "^7.0.0",
32
+ "@h3ravel/shared": "^0.15.4"
33
33
  },
34
34
  "scripts": {
35
35
  "barrel": "barrelsby --directory src --delete --singleQuotes",
@@ -25,7 +25,7 @@ export class AssetsServiceProvider extends ServiceProvider {
25
25
  indexNames: ['/index.html'],
26
26
  getContents: (id) => {
27
27
  const newId = id.replace(`/${fsconfig.public_mask}/`, '')
28
- return readFile(join(before(publicPath, newId), newId))
28
+ return <never>readFile(join(before(publicPath, newId), newId))
29
29
  },
30
30
  getMeta: async (id) => {
31
31
  const newId = id.replace(`/${fsconfig.public_mask}/`, '')
@@ -29,7 +29,9 @@ export class RouteServiceProvider extends ServiceProvider {
29
29
  try {
30
30
  const routePath = this.app.getPath('routes')
31
31
 
32
- const files = await readdir(routePath)
32
+ const files = (await readdir(routePath)).filter((e) => {
33
+ return !e.includes('.d.ts') && !e.includes('.map')
34
+ })
33
35
 
34
36
  for (let i = 0; i < files.length; i++) {
35
37
  const routesModule = await import(path.join(routePath, files[i]))
package/src/Route.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { H3Event, Middleware, MiddlewareOptions, type H3 } from 'h3'
2
2
  import { Request, Response } from '@h3ravel/http'
3
- import { Application, Controller, Kernel } from '@h3ravel/core'
3
+ import { Application, Container, Controller, Kernel } from '@h3ravel/core'
4
4
  import { afterLast } from '@h3ravel/support'
5
5
  import type { EventHandler, IController, IMiddleware, IRouter, RouterEnd } from '@h3ravel/shared'
6
6
 
@@ -80,7 +80,20 @@ export class Router implements IRouter {
80
80
  ): EventHandler {
81
81
  if (typeof handler === 'function' && (handler as any).prototype instanceof Controller) {
82
82
  return (ctx) => {
83
- const controller = new (handler as new (...args: any[]) => IController)(this.app)
83
+ let controller: IController
84
+
85
+ if (Container.hasAnyDecorator(handler)) {
86
+ /**
87
+ * If the controller is decorated use the IoC container
88
+ */
89
+ controller = this.app.make<any, IController>(handler as any)
90
+ } else {
91
+ /**
92
+ * Otherwise instantiate manually so that we can at least
93
+ * pass the app instance
94
+ */
95
+ controller = new (handler as new (...args: any[]) => IController)(this.app)
96
+ }
84
97
  const action = (methodName || 'index') as keyof IController
85
98
 
86
99
  if (typeof controller[action] !== 'function') {
@@ -94,7 +107,6 @@ export class Router implements IRouter {
94
107
  return handler as EventHandler
95
108
  }
96
109
 
97
-
98
110
  get (
99
111
  path: string,
100
112
  definition: EventHandler | [(new (...args: any[]) => IController), methodName: string],