@h3ravel/router 1.0.3 → 1.1.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 +24 -0
- package/dist/index.cjs +47 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +23 -9
- package/dist/index.d.ts +23 -9
- package/dist/index.js +47 -5
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
- package/src/Route.ts +67 -12
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,29 @@
|
|
|
1
1
|
# @h3ravel/router
|
|
2
2
|
|
|
3
|
+
## 1.1.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- refactor!: make route definition more similar to the way it is handled in laravel.
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- Updated dependencies
|
|
12
|
+
- @h3ravel/shared@0.9.0
|
|
13
|
+
- @h3ravel/core@1.0.5
|
|
14
|
+
- @h3ravel/http@4.1.1
|
|
15
|
+
- @h3ravel/support@0.7.1
|
|
16
|
+
|
|
17
|
+
## 1.0.4
|
|
18
|
+
|
|
19
|
+
### Patch Changes
|
|
20
|
+
|
|
21
|
+
- Updated dependencies
|
|
22
|
+
- @h3ravel/http@4.1.0
|
|
23
|
+
- @h3ravel/shared@0.8.0
|
|
24
|
+
- @h3ravel/core@1.0.4
|
|
25
|
+
- @h3ravel/support@0.7.1
|
|
26
|
+
|
|
3
27
|
## 1.0.3
|
|
4
28
|
|
|
5
29
|
### Patch Changes
|
package/dist/index.cjs
CHANGED
|
@@ -48,7 +48,9 @@ var Router = class {
|
|
|
48
48
|
h3App;
|
|
49
49
|
app;
|
|
50
50
|
routes = [];
|
|
51
|
+
nameMap = [];
|
|
51
52
|
groupPrefix = "";
|
|
53
|
+
middlewareMap = [];
|
|
52
54
|
groupMiddleware = [];
|
|
53
55
|
constructor(h3App, app) {
|
|
54
56
|
this.h3App = h3App;
|
|
@@ -80,6 +82,12 @@ var Router = class {
|
|
|
80
82
|
* @param middleware
|
|
81
83
|
*/
|
|
82
84
|
addRoute(method, path2, handler, name, middleware = []) {
|
|
85
|
+
if (this.nameMap.length > 0) {
|
|
86
|
+
name = this.nameMap.join(".");
|
|
87
|
+
}
|
|
88
|
+
if (this.middlewareMap.length > 0) {
|
|
89
|
+
middleware = this.middlewareMap;
|
|
90
|
+
}
|
|
83
91
|
const fullPath = `${this.groupPrefix}${path2}`.replace(/\/+/g, "/");
|
|
84
92
|
this.routes.push({
|
|
85
93
|
method,
|
|
@@ -102,17 +110,29 @@ var Router = class {
|
|
|
102
110
|
}
|
|
103
111
|
return handler;
|
|
104
112
|
}
|
|
105
|
-
get(path2,
|
|
113
|
+
get(path2, definition, name, middleware = []) {
|
|
114
|
+
const handler = Array.isArray(definition) ? definition[0] : definition;
|
|
115
|
+
const methodName = Array.isArray(definition) ? definition[1] : void 0;
|
|
106
116
|
this.addRoute("get", path2, this.resolveControllerOrHandler(handler, methodName), name, middleware);
|
|
117
|
+
return this;
|
|
107
118
|
}
|
|
108
|
-
post(path2,
|
|
119
|
+
post(path2, definition, name, middleware = []) {
|
|
120
|
+
const handler = Array.isArray(definition) ? definition[0] : definition;
|
|
121
|
+
const methodName = Array.isArray(definition) ? definition[1] : void 0;
|
|
109
122
|
this.addRoute("post", path2, this.resolveControllerOrHandler(handler, methodName), name, middleware);
|
|
123
|
+
return this;
|
|
110
124
|
}
|
|
111
|
-
put(path2,
|
|
125
|
+
put(path2, definition, name, middleware = []) {
|
|
126
|
+
const handler = Array.isArray(definition) ? definition[0] : definition;
|
|
127
|
+
const methodName = Array.isArray(definition) ? definition[1] : void 0;
|
|
112
128
|
this.addRoute("put", path2, this.resolveControllerOrHandler(handler, methodName), name, middleware);
|
|
129
|
+
return this;
|
|
113
130
|
}
|
|
114
|
-
delete(path2,
|
|
131
|
+
delete(path2, definition, name, middleware = []) {
|
|
132
|
+
const handler = Array.isArray(definition) ? definition[0] : definition;
|
|
133
|
+
const methodName = Array.isArray(definition) ? definition[1] : void 0;
|
|
115
134
|
this.addRoute("delete", path2, this.resolveControllerOrHandler(handler, methodName), name, middleware);
|
|
135
|
+
return this;
|
|
116
136
|
}
|
|
117
137
|
/**
|
|
118
138
|
* API Resource support
|
|
@@ -131,6 +151,7 @@ var Router = class {
|
|
|
131
151
|
this.addRoute("put", `${basePath}/:id`, controller.update.bind(controller), `${name}.update`, middleware);
|
|
132
152
|
this.addRoute("patch", `${basePath}/:id`, controller.update.bind(controller), `${name}.update`, middleware);
|
|
133
153
|
this.addRoute("delete", `${basePath}/:id`, controller.destroy.bind(controller), `${name}.destroy`, middleware);
|
|
154
|
+
return this;
|
|
134
155
|
}
|
|
135
156
|
/**
|
|
136
157
|
* Named route URL generator
|
|
@@ -165,9 +186,30 @@ var Router = class {
|
|
|
165
186
|
callback();
|
|
166
187
|
this.groupPrefix = prevPrefix;
|
|
167
188
|
this.groupMiddleware = prevMiddleware;
|
|
189
|
+
return this;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Set the name of the current route
|
|
193
|
+
*
|
|
194
|
+
* @param name
|
|
195
|
+
*/
|
|
196
|
+
name(name) {
|
|
197
|
+
this.nameMap.push(name);
|
|
198
|
+
return this;
|
|
168
199
|
}
|
|
200
|
+
/**
|
|
201
|
+
* Registers middleware for a specific path.
|
|
202
|
+
* @param path - The path to apply the middleware.
|
|
203
|
+
* @param handler - The middleware handler.
|
|
204
|
+
* @param opts - Optional middleware options.
|
|
205
|
+
*/
|
|
169
206
|
middleware(path2, handler, opts) {
|
|
170
|
-
|
|
207
|
+
if (typeof path2 === "string") {
|
|
208
|
+
this.h3App.use(path2, handler, opts);
|
|
209
|
+
} else {
|
|
210
|
+
this.middlewareMap.concat(path2);
|
|
211
|
+
}
|
|
212
|
+
return this;
|
|
171
213
|
}
|
|
172
214
|
};
|
|
173
215
|
|
package/dist/index.cjs.map
CHANGED
|
@@ -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 { EventHandler, IController, IMiddleware } from '@h3ravel/shared'\n\ninterface RouteDefinition {\n method: string\n path: string\n name?: string\n handler: EventHandler\n}\n\nexport class Router {\n private routes: RouteDefinition[] = []\n private groupPrefix = ''\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 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 handler: EventHandler | (new (...args: any[]) => IController),\n methodName?: string, name?: string, middleware: IMiddleware[] = []\n ) {\n this.addRoute('get', path, this.resolveControllerOrHandler(handler, methodName), name, middleware)\n }\n\n post (\n path: string,\n handler: EventHandler | (new (...args: any[]) => IController),\n methodName?: string, name?: string, middleware: IMiddleware[] = []\n ) {\n this.addRoute('post', path, this.resolveControllerOrHandler(handler, methodName), name, middleware)\n }\n\n put (\n path: string,\n handler: EventHandler | (new (...args: any[]) => IController),\n methodName?: string, name?: string, middleware: IMiddleware[] = []\n ) {\n this.addRoute('put', path, this.resolveControllerOrHandler(handler, methodName), name, middleware)\n }\n\n delete (\n path: string,\n handler: EventHandler | (new (...args: any[]) => IController),\n methodName?: string, name?: string, middleware: IMiddleware[] = []\n ) {\n this.addRoute('delete', path, this.resolveControllerOrHandler(handler, methodName), name, middleware)\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 }\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 }\n\n middleware (path: string, handler: Middleware, opts?: MiddlewareOptions) {\n this.h3App.use(path, handler, opts)\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","groupPrefix","groupMiddleware","h3App","app","resolveHandler","handler","middleware","event","kernel","Kernel","request","Request","response","Response","handle","ctx","Promise","resolve","addRoute","method","path","name","fullPath","replace","push","resolveControllerOrHandler","methodName","prototype","Controller","controller","action","Error","String","get","post","put","delete","apiResource","afterLast","basePath","index","bind","store","show","update","destroy","route","params","found","find","r","undefined","url","key","value","Object","entries","group","options","callback","prevPrefix","prevMiddleware","prefix","opts","use","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 } 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"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { H3, Middleware, MiddlewareOptions } from 'h3';
|
|
2
2
|
import { Application, ServiceProvider } from '@h3ravel/core';
|
|
3
|
-
import { EventHandler, IController, IMiddleware } from '@h3ravel/shared';
|
|
3
|
+
import { IRouter, EventHandler, IController, IMiddleware } from '@h3ravel/shared';
|
|
4
4
|
|
|
5
|
-
declare class Router {
|
|
5
|
+
declare class Router implements IRouter {
|
|
6
6
|
protected h3App: H3;
|
|
7
7
|
private app;
|
|
8
8
|
private routes;
|
|
9
|
+
private nameMap;
|
|
9
10
|
private groupPrefix;
|
|
11
|
+
private middlewareMap;
|
|
10
12
|
private groupMiddleware;
|
|
11
13
|
constructor(h3App: H3, app: Application);
|
|
12
14
|
/**
|
|
@@ -28,17 +30,17 @@ declare class Router {
|
|
|
28
30
|
*/
|
|
29
31
|
private addRoute;
|
|
30
32
|
private resolveControllerOrHandler;
|
|
31
|
-
get(path: string,
|
|
32
|
-
post(path: string,
|
|
33
|
-
put(path: string,
|
|
34
|
-
delete(path: string,
|
|
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;
|
|
35
37
|
/**
|
|
36
38
|
* API Resource support
|
|
37
39
|
*
|
|
38
40
|
* @param path
|
|
39
41
|
* @param controller
|
|
40
42
|
*/
|
|
41
|
-
apiResource(path: string, Controller: new (app: Application) => IController, middleware?: IMiddleware[]):
|
|
43
|
+
apiResource(path: string, Controller: new (app: Application) => IController, middleware?: IMiddleware[]): this;
|
|
42
44
|
/**
|
|
43
45
|
* Named route URL generator
|
|
44
46
|
*
|
|
@@ -56,8 +58,20 @@ declare class Router {
|
|
|
56
58
|
group(options: {
|
|
57
59
|
prefix?: string;
|
|
58
60
|
middleware?: EventHandler[];
|
|
59
|
-
}, callback: () => void):
|
|
60
|
-
|
|
61
|
+
}, callback: () => void): this;
|
|
62
|
+
/**
|
|
63
|
+
* Set the name of the current route
|
|
64
|
+
*
|
|
65
|
+
* @param name
|
|
66
|
+
*/
|
|
67
|
+
name(name: string): this;
|
|
68
|
+
/**
|
|
69
|
+
* Registers middleware for a specific path.
|
|
70
|
+
* @param path - The path to apply the middleware.
|
|
71
|
+
* @param handler - The middleware handler.
|
|
72
|
+
* @param opts - Optional middleware options.
|
|
73
|
+
*/
|
|
74
|
+
middleware(path: string | IMiddleware[], handler: Middleware, opts?: MiddlewareOptions): this;
|
|
61
75
|
}
|
|
62
76
|
|
|
63
77
|
/**
|
package/dist/index.d.ts
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { H3, Middleware, MiddlewareOptions } from 'h3';
|
|
2
2
|
import { Application, ServiceProvider } from '@h3ravel/core';
|
|
3
|
-
import { EventHandler, IController, IMiddleware } from '@h3ravel/shared';
|
|
3
|
+
import { IRouter, EventHandler, IController, IMiddleware } from '@h3ravel/shared';
|
|
4
4
|
|
|
5
|
-
declare class Router {
|
|
5
|
+
declare class Router implements IRouter {
|
|
6
6
|
protected h3App: H3;
|
|
7
7
|
private app;
|
|
8
8
|
private routes;
|
|
9
|
+
private nameMap;
|
|
9
10
|
private groupPrefix;
|
|
11
|
+
private middlewareMap;
|
|
10
12
|
private groupMiddleware;
|
|
11
13
|
constructor(h3App: H3, app: Application);
|
|
12
14
|
/**
|
|
@@ -28,17 +30,17 @@ declare class Router {
|
|
|
28
30
|
*/
|
|
29
31
|
private addRoute;
|
|
30
32
|
private resolveControllerOrHandler;
|
|
31
|
-
get(path: string,
|
|
32
|
-
post(path: string,
|
|
33
|
-
put(path: string,
|
|
34
|
-
delete(path: string,
|
|
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;
|
|
35
37
|
/**
|
|
36
38
|
* API Resource support
|
|
37
39
|
*
|
|
38
40
|
* @param path
|
|
39
41
|
* @param controller
|
|
40
42
|
*/
|
|
41
|
-
apiResource(path: string, Controller: new (app: Application) => IController, middleware?: IMiddleware[]):
|
|
43
|
+
apiResource(path: string, Controller: new (app: Application) => IController, middleware?: IMiddleware[]): this;
|
|
42
44
|
/**
|
|
43
45
|
* Named route URL generator
|
|
44
46
|
*
|
|
@@ -56,8 +58,20 @@ declare class Router {
|
|
|
56
58
|
group(options: {
|
|
57
59
|
prefix?: string;
|
|
58
60
|
middleware?: EventHandler[];
|
|
59
|
-
}, callback: () => void):
|
|
60
|
-
|
|
61
|
+
}, callback: () => void): this;
|
|
62
|
+
/**
|
|
63
|
+
* Set the name of the current route
|
|
64
|
+
*
|
|
65
|
+
* @param name
|
|
66
|
+
*/
|
|
67
|
+
name(name: string): this;
|
|
68
|
+
/**
|
|
69
|
+
* Registers middleware for a specific path.
|
|
70
|
+
* @param path - The path to apply the middleware.
|
|
71
|
+
* @param handler - The middleware handler.
|
|
72
|
+
* @param opts - Optional middleware options.
|
|
73
|
+
*/
|
|
74
|
+
middleware(path: string | IMiddleware[], handler: Middleware, opts?: MiddlewareOptions): this;
|
|
61
75
|
}
|
|
62
76
|
|
|
63
77
|
/**
|
package/dist/index.js
CHANGED
|
@@ -12,7 +12,9 @@ var Router = class {
|
|
|
12
12
|
h3App;
|
|
13
13
|
app;
|
|
14
14
|
routes = [];
|
|
15
|
+
nameMap = [];
|
|
15
16
|
groupPrefix = "";
|
|
17
|
+
middlewareMap = [];
|
|
16
18
|
groupMiddleware = [];
|
|
17
19
|
constructor(h3App, app) {
|
|
18
20
|
this.h3App = h3App;
|
|
@@ -44,6 +46,12 @@ var Router = class {
|
|
|
44
46
|
* @param middleware
|
|
45
47
|
*/
|
|
46
48
|
addRoute(method, path2, handler, name, middleware = []) {
|
|
49
|
+
if (this.nameMap.length > 0) {
|
|
50
|
+
name = this.nameMap.join(".");
|
|
51
|
+
}
|
|
52
|
+
if (this.middlewareMap.length > 0) {
|
|
53
|
+
middleware = this.middlewareMap;
|
|
54
|
+
}
|
|
47
55
|
const fullPath = `${this.groupPrefix}${path2}`.replace(/\/+/g, "/");
|
|
48
56
|
this.routes.push({
|
|
49
57
|
method,
|
|
@@ -66,17 +74,29 @@ var Router = class {
|
|
|
66
74
|
}
|
|
67
75
|
return handler;
|
|
68
76
|
}
|
|
69
|
-
get(path2,
|
|
77
|
+
get(path2, definition, name, middleware = []) {
|
|
78
|
+
const handler = Array.isArray(definition) ? definition[0] : definition;
|
|
79
|
+
const methodName = Array.isArray(definition) ? definition[1] : void 0;
|
|
70
80
|
this.addRoute("get", path2, this.resolveControllerOrHandler(handler, methodName), name, middleware);
|
|
81
|
+
return this;
|
|
71
82
|
}
|
|
72
|
-
post(path2,
|
|
83
|
+
post(path2, definition, name, middleware = []) {
|
|
84
|
+
const handler = Array.isArray(definition) ? definition[0] : definition;
|
|
85
|
+
const methodName = Array.isArray(definition) ? definition[1] : void 0;
|
|
73
86
|
this.addRoute("post", path2, this.resolveControllerOrHandler(handler, methodName), name, middleware);
|
|
87
|
+
return this;
|
|
74
88
|
}
|
|
75
|
-
put(path2,
|
|
89
|
+
put(path2, definition, name, middleware = []) {
|
|
90
|
+
const handler = Array.isArray(definition) ? definition[0] : definition;
|
|
91
|
+
const methodName = Array.isArray(definition) ? definition[1] : void 0;
|
|
76
92
|
this.addRoute("put", path2, this.resolveControllerOrHandler(handler, methodName), name, middleware);
|
|
93
|
+
return this;
|
|
77
94
|
}
|
|
78
|
-
delete(path2,
|
|
95
|
+
delete(path2, definition, name, middleware = []) {
|
|
96
|
+
const handler = Array.isArray(definition) ? definition[0] : definition;
|
|
97
|
+
const methodName = Array.isArray(definition) ? definition[1] : void 0;
|
|
79
98
|
this.addRoute("delete", path2, this.resolveControllerOrHandler(handler, methodName), name, middleware);
|
|
99
|
+
return this;
|
|
80
100
|
}
|
|
81
101
|
/**
|
|
82
102
|
* API Resource support
|
|
@@ -95,6 +115,7 @@ var Router = class {
|
|
|
95
115
|
this.addRoute("put", `${basePath}/:id`, controller.update.bind(controller), `${name}.update`, middleware);
|
|
96
116
|
this.addRoute("patch", `${basePath}/:id`, controller.update.bind(controller), `${name}.update`, middleware);
|
|
97
117
|
this.addRoute("delete", `${basePath}/:id`, controller.destroy.bind(controller), `${name}.destroy`, middleware);
|
|
118
|
+
return this;
|
|
98
119
|
}
|
|
99
120
|
/**
|
|
100
121
|
* Named route URL generator
|
|
@@ -129,9 +150,30 @@ var Router = class {
|
|
|
129
150
|
callback();
|
|
130
151
|
this.groupPrefix = prevPrefix;
|
|
131
152
|
this.groupMiddleware = prevMiddleware;
|
|
153
|
+
return this;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Set the name of the current route
|
|
157
|
+
*
|
|
158
|
+
* @param name
|
|
159
|
+
*/
|
|
160
|
+
name(name) {
|
|
161
|
+
this.nameMap.push(name);
|
|
162
|
+
return this;
|
|
132
163
|
}
|
|
164
|
+
/**
|
|
165
|
+
* Registers middleware for a specific path.
|
|
166
|
+
* @param path - The path to apply the middleware.
|
|
167
|
+
* @param handler - The middleware handler.
|
|
168
|
+
* @param opts - Optional middleware options.
|
|
169
|
+
*/
|
|
133
170
|
middleware(path2, handler, opts) {
|
|
134
|
-
|
|
171
|
+
if (typeof path2 === "string") {
|
|
172
|
+
this.h3App.use(path2, handler, opts);
|
|
173
|
+
} else {
|
|
174
|
+
this.middlewareMap.concat(path2);
|
|
175
|
+
}
|
|
176
|
+
return this;
|
|
135
177
|
}
|
|
136
178
|
};
|
|
137
179
|
|
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 { EventHandler, IController, IMiddleware } from '@h3ravel/shared'\n\ninterface RouteDefinition {\n method: string\n path: string\n name?: string\n handler: EventHandler\n}\n\nexport class Router {\n private routes: RouteDefinition[] = []\n private groupPrefix = ''\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 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 handler: EventHandler | (new (...args: any[]) => IController),\n methodName?: string, name?: string, middleware: IMiddleware[] = []\n ) {\n this.addRoute('get', path, this.resolveControllerOrHandler(handler, methodName), name, middleware)\n }\n\n post (\n path: string,\n handler: EventHandler | (new (...args: any[]) => IController),\n methodName?: string, name?: string, middleware: IMiddleware[] = []\n ) {\n this.addRoute('post', path, this.resolveControllerOrHandler(handler, methodName), name, middleware)\n }\n\n put (\n path: string,\n handler: EventHandler | (new (...args: any[]) => IController),\n methodName?: string, name?: string, middleware: IMiddleware[] = []\n ) {\n this.addRoute('put', path, this.resolveControllerOrHandler(handler, methodName), name, middleware)\n }\n\n delete (\n path: string,\n handler: EventHandler | (new (...args: any[]) => IController),\n methodName?: string, name?: string, middleware: IMiddleware[] = []\n ) {\n this.addRoute('delete', path, this.resolveControllerOrHandler(handler, methodName), name, middleware)\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 }\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 }\n\n middleware (path: string, handler: Middleware, opts?: MiddlewareOptions) {\n this.h3App.use(path, handler, opts)\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","groupPrefix","groupMiddleware","h3App","app","resolveHandler","handler","middleware","event","kernel","Kernel","request","Request","response","Response","handle","ctx","Promise","resolve","addRoute","method","path","name","fullPath","replace","push","resolveControllerOrHandler","methodName","prototype","Controller","controller","action","Error","String","get","post","put","delete","apiResource","afterLast","basePath","index","bind","store","show","update","destroy","route","params","found","find","r","undefined","url","key","value","Object","entries","group","options","callback","prevPrefix","prevMiddleware","prefix","opts","use","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 } 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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@h3ravel/router",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.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/
|
|
24
|
-
"@h3ravel/
|
|
23
|
+
"@h3ravel/core": "1.0.5",
|
|
24
|
+
"@h3ravel/http": "4.1.1",
|
|
25
25
|
"@h3ravel/support": "0.7.1",
|
|
26
|
-
"@h3ravel/
|
|
26
|
+
"@h3ravel/shared": "0.9.0"
|
|
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 { EventHandler, IController, IMiddleware } from '@h3ravel/shared'
|
|
5
|
+
import type { EventHandler, IController, IMiddleware, IRouter } from '@h3ravel/shared'
|
|
6
6
|
|
|
7
7
|
interface RouteDefinition {
|
|
8
8
|
method: string
|
|
@@ -11,9 +11,11 @@ interface RouteDefinition {
|
|
|
11
11
|
handler: EventHandler
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
export class Router {
|
|
14
|
+
export class Router implements IRouter {
|
|
15
15
|
private routes: RouteDefinition[] = []
|
|
16
|
+
private nameMap: string[] = []
|
|
16
17
|
private groupPrefix = ''
|
|
18
|
+
private middlewareMap: IMiddleware[] = []
|
|
17
19
|
private groupMiddleware: EventHandler[] = []
|
|
18
20
|
|
|
19
21
|
constructor(protected h3App: H3, private app: Application) { }
|
|
@@ -52,6 +54,20 @@ export class Router {
|
|
|
52
54
|
name?: string,
|
|
53
55
|
middleware: IMiddleware[] = []
|
|
54
56
|
) {
|
|
57
|
+
/**
|
|
58
|
+
* Join all defined route names to make a single route name
|
|
59
|
+
*/
|
|
60
|
+
if (this.nameMap.length > 0) {
|
|
61
|
+
name = this.nameMap.join('.')
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Join all defined middlewares
|
|
66
|
+
*/
|
|
67
|
+
if (this.middlewareMap.length > 0) {
|
|
68
|
+
middleware = this.middlewareMap
|
|
69
|
+
}
|
|
70
|
+
|
|
55
71
|
const fullPath = `${this.groupPrefix}${path}`.replace(/\/+/g, '/')
|
|
56
72
|
this.routes.push({ method, path: fullPath, name, handler })
|
|
57
73
|
this.h3App[method as 'get'](fullPath, this.resolveHandler(handler, middleware))
|
|
@@ -80,34 +96,50 @@ export class Router {
|
|
|
80
96
|
|
|
81
97
|
get (
|
|
82
98
|
path: string,
|
|
83
|
-
|
|
84
|
-
|
|
99
|
+
definition: EventHandler | [(new (...args: any[]) => IController), methodName: string],
|
|
100
|
+
name?: string,
|
|
101
|
+
middleware: IMiddleware[] = []
|
|
85
102
|
) {
|
|
103
|
+
const handler = Array.isArray(definition) ? definition[0] : definition
|
|
104
|
+
const methodName = Array.isArray(definition) ? definition[1] : undefined
|
|
86
105
|
this.addRoute('get', path, this.resolveControllerOrHandler(handler, methodName), name, middleware)
|
|
106
|
+
return this
|
|
87
107
|
}
|
|
88
108
|
|
|
89
109
|
post (
|
|
90
110
|
path: string,
|
|
91
|
-
|
|
92
|
-
|
|
111
|
+
definition: EventHandler | [(new (...args: any[]) => IController), methodName: string],
|
|
112
|
+
name?: string,
|
|
113
|
+
middleware: IMiddleware[] = []
|
|
93
114
|
) {
|
|
115
|
+
const handler = Array.isArray(definition) ? definition[0] : definition
|
|
116
|
+
const methodName = Array.isArray(definition) ? definition[1] : undefined
|
|
94
117
|
this.addRoute('post', path, this.resolveControllerOrHandler(handler, methodName), name, middleware)
|
|
118
|
+
return this
|
|
95
119
|
}
|
|
96
120
|
|
|
97
121
|
put (
|
|
98
122
|
path: string,
|
|
99
|
-
|
|
100
|
-
|
|
123
|
+
definition: EventHandler | [(new (...args: any[]) => IController), methodName: string],
|
|
124
|
+
name?: string,
|
|
125
|
+
middleware: IMiddleware[] = []
|
|
101
126
|
) {
|
|
127
|
+
const handler = Array.isArray(definition) ? definition[0] : definition
|
|
128
|
+
const methodName = Array.isArray(definition) ? definition[1] : undefined
|
|
102
129
|
this.addRoute('put', path, this.resolveControllerOrHandler(handler, methodName), name, middleware)
|
|
130
|
+
return this
|
|
103
131
|
}
|
|
104
132
|
|
|
105
133
|
delete (
|
|
106
134
|
path: string,
|
|
107
|
-
|
|
108
|
-
|
|
135
|
+
definition: EventHandler | [(new (...args: any[]) => IController), methodName: string],
|
|
136
|
+
name?: string,
|
|
137
|
+
middleware: IMiddleware[] = []
|
|
109
138
|
) {
|
|
139
|
+
const handler = Array.isArray(definition) ? definition[0] : definition
|
|
140
|
+
const methodName = Array.isArray(definition) ? definition[1] : undefined
|
|
110
141
|
this.addRoute('delete', path, this.resolveControllerOrHandler(handler, methodName), name, middleware)
|
|
142
|
+
return this
|
|
111
143
|
}
|
|
112
144
|
|
|
113
145
|
/**
|
|
@@ -134,6 +166,7 @@ export class Router {
|
|
|
134
166
|
this.addRoute('put', `${basePath}/:id`, controller.update.bind(controller), `${name}.update`, middleware)
|
|
135
167
|
this.addRoute('patch', `${basePath}/:id`, controller.update.bind(controller), `${name}.update`, middleware)
|
|
136
168
|
this.addRoute('delete', `${basePath}/:id`, controller.destroy.bind(controller), `${name}.destroy`, middleware)
|
|
169
|
+
return this
|
|
137
170
|
}
|
|
138
171
|
|
|
139
172
|
/**
|
|
@@ -174,9 +207,31 @@ export class Router {
|
|
|
174
207
|
*/
|
|
175
208
|
this.groupPrefix = prevPrefix
|
|
176
209
|
this.groupMiddleware = prevMiddleware
|
|
210
|
+
return this
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Set the name of the current route
|
|
215
|
+
*
|
|
216
|
+
* @param name
|
|
217
|
+
*/
|
|
218
|
+
name (name: string) {
|
|
219
|
+
this.nameMap.push(name)
|
|
220
|
+
return this
|
|
177
221
|
}
|
|
178
222
|
|
|
179
|
-
|
|
180
|
-
|
|
223
|
+
/**
|
|
224
|
+
* Registers middleware for a specific path.
|
|
225
|
+
* @param path - The path to apply the middleware.
|
|
226
|
+
* @param handler - The middleware handler.
|
|
227
|
+
* @param opts - Optional middleware options.
|
|
228
|
+
*/
|
|
229
|
+
middleware (path: string | IMiddleware[], handler: Middleware, opts?: MiddlewareOptions) {
|
|
230
|
+
if (typeof path === 'string') {
|
|
231
|
+
this.h3App.use(path, handler, opts)
|
|
232
|
+
} else {
|
|
233
|
+
this.middlewareMap.concat(path)
|
|
234
|
+
}
|
|
235
|
+
return this
|
|
181
236
|
}
|
|
182
237
|
}
|