@alis-kit/routers 1.0.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.
Files changed (90) hide show
  1. package/README.md +302 -0
  2. package/dist/adapters/BaseAdapter.d.ts +63 -0
  3. package/dist/adapters/BaseAdapter.d.ts.map +1 -0
  4. package/dist/adapters/BaseAdapter.js +17 -0
  5. package/dist/adapters/BaseAdapter.js.map +1 -0
  6. package/dist/adapters/ExpressAdapter.d.ts +44 -0
  7. package/dist/adapters/ExpressAdapter.d.ts.map +1 -0
  8. package/dist/adapters/ExpressAdapter.js +73 -0
  9. package/dist/adapters/ExpressAdapter.js.map +1 -0
  10. package/dist/adapters/FastifyAdapter.d.ts +61 -0
  11. package/dist/adapters/FastifyAdapter.d.ts.map +1 -0
  12. package/dist/adapters/FastifyAdapter.js +132 -0
  13. package/dist/adapters/FastifyAdapter.js.map +1 -0
  14. package/dist/cookie/CookieSetter.d.ts +74 -0
  15. package/dist/cookie/CookieSetter.d.ts.map +1 -0
  16. package/dist/cookie/CookieSetter.js +89 -0
  17. package/dist/cookie/CookieSetter.js.map +1 -0
  18. package/dist/core/Logger.d.ts +36 -0
  19. package/dist/core/Logger.d.ts.map +1 -0
  20. package/dist/core/Logger.js +53 -0
  21. package/dist/core/Logger.js.map +1 -0
  22. package/dist/core/RouteResolver.d.ts +91 -0
  23. package/dist/core/RouteResolver.d.ts.map +1 -0
  24. package/dist/core/RouteResolver.js +279 -0
  25. package/dist/core/RouteResolver.js.map +1 -0
  26. package/dist/core/RouterKit.d.ts +116 -0
  27. package/dist/core/RouterKit.d.ts.map +1 -0
  28. package/dist/core/RouterKit.js +175 -0
  29. package/dist/core/RouterKit.js.map +1 -0
  30. package/dist/decorators/controller/ReqController.d.ts +29 -0
  31. package/dist/decorators/controller/ReqController.d.ts.map +1 -0
  32. package/dist/decorators/controller/ReqController.js +62 -0
  33. package/dist/decorators/controller/ReqController.js.map +1 -0
  34. package/dist/decorators/mapping/index.d.ts +93 -0
  35. package/dist/decorators/mapping/index.d.ts.map +1 -0
  36. package/dist/decorators/mapping/index.js +128 -0
  37. package/dist/decorators/mapping/index.js.map +1 -0
  38. package/dist/decorators/method/index.d.ts +67 -0
  39. package/dist/decorators/method/index.d.ts.map +1 -0
  40. package/dist/decorators/method/index.js +83 -0
  41. package/dist/decorators/method/index.js.map +1 -0
  42. package/dist/decorators/parameter/index.d.ts +155 -0
  43. package/dist/decorators/parameter/index.d.ts.map +1 -0
  44. package/dist/decorators/parameter/index.js +196 -0
  45. package/dist/decorators/parameter/index.js.map +1 -0
  46. package/dist/exceptions/BadRequestException.d.ts +37 -0
  47. package/dist/exceptions/BadRequestException.d.ts.map +1 -0
  48. package/dist/exceptions/BadRequestException.js +37 -0
  49. package/dist/exceptions/BadRequestException.js.map +1 -0
  50. package/dist/exceptions/BaseException.d.ts +29 -0
  51. package/dist/exceptions/BaseException.d.ts.map +1 -0
  52. package/dist/exceptions/BaseException.js +29 -0
  53. package/dist/exceptions/BaseException.js.map +1 -0
  54. package/dist/exceptions/ConflictException.d.ts +28 -0
  55. package/dist/exceptions/ConflictException.d.ts.map +1 -0
  56. package/dist/exceptions/ConflictException.js +28 -0
  57. package/dist/exceptions/ConflictException.js.map +1 -0
  58. package/dist/exceptions/ForbiddenException.d.ts +26 -0
  59. package/dist/exceptions/ForbiddenException.d.ts.map +1 -0
  60. package/dist/exceptions/ForbiddenException.js +26 -0
  61. package/dist/exceptions/ForbiddenException.js.map +1 -0
  62. package/dist/exceptions/NotFoundException.d.ts +28 -0
  63. package/dist/exceptions/NotFoundException.d.ts.map +1 -0
  64. package/dist/exceptions/NotFoundException.js +28 -0
  65. package/dist/exceptions/NotFoundException.js.map +1 -0
  66. package/dist/exceptions/ServerErrorException.d.ts +33 -0
  67. package/dist/exceptions/ServerErrorException.d.ts.map +1 -0
  68. package/dist/exceptions/ServerErrorException.js +33 -0
  69. package/dist/exceptions/ServerErrorException.js.map +1 -0
  70. package/dist/exceptions/UnauthorizedException.d.ts +28 -0
  71. package/dist/exceptions/UnauthorizedException.d.ts.map +1 -0
  72. package/dist/exceptions/UnauthorizedException.js +28 -0
  73. package/dist/exceptions/UnauthorizedException.js.map +1 -0
  74. package/dist/index.d.ts +15 -0
  75. package/dist/index.d.ts.map +1 -0
  76. package/dist/index.js +21 -0
  77. package/dist/index.js.map +1 -0
  78. package/dist/swagger/SwaggerGenerator.d.ts +63 -0
  79. package/dist/swagger/SwaggerGenerator.d.ts.map +1 -0
  80. package/dist/swagger/SwaggerGenerator.js +266 -0
  81. package/dist/swagger/SwaggerGenerator.js.map +1 -0
  82. package/dist/swagger/SwaggerUI.d.ts +30 -0
  83. package/dist/swagger/SwaggerUI.d.ts.map +1 -0
  84. package/dist/swagger/SwaggerUI.js +52 -0
  85. package/dist/swagger/SwaggerUI.js.map +1 -0
  86. package/dist/types/index.d.ts +255 -0
  87. package/dist/types/index.d.ts.map +1 -0
  88. package/dist/types/index.js +31 -0
  89. package/dist/types/index.js.map +1 -0
  90. package/package.json +52 -0
@@ -0,0 +1,255 @@
1
+ import type { ZodSchema } from "zod";
2
+ /** Supported framework types: Express or Fastify */
3
+ export type Framework = "express" | "fastify";
4
+ /** Authentication type for route protection */
5
+ export type AuthType = "auth" | "refresh";
6
+ /** HTTP methods supported by the router */
7
+ export type HttpMethod = "get" | "post" | "put" | "patch" | "delete";
8
+ /**
9
+ * Generic middleware function signature.
10
+ * Compatible dengan Express middleware dan Fastify preHandler.
11
+ */
12
+ export type MiddlewareFn = (...args: unknown[]) => unknown;
13
+ /** Generic handler function signature */
14
+ export type HandlerFn = (req: unknown, res: unknown, next?: unknown) => unknown;
15
+ /**
16
+ * Generic class constructor type.
17
+ * Digunakan untuk tipe parameter di `RouterKit.register()`.
18
+ */
19
+ export type Class<T = unknown> = new (...args: unknown[]) => T;
20
+ /** Options for setting HTTP cookies */
21
+ export interface CookieOptions {
22
+ /** Whether the cookie is HTTP-only (default: true) */
23
+ httpOnly?: boolean;
24
+ /** Whether the cookie requires HTTPS (default: true) */
25
+ secure?: boolean;
26
+ /**
27
+ * Cookie max age dalam **detik** (HTTP `Max-Age` attribute spec).
28
+ * Contoh: 30 hari = 2_592_000.
29
+ */
30
+ maxAge?: number;
31
+ /** Cookie path (default: "/") */
32
+ path?: string;
33
+ /** SameSite attribute: strict, lax, atau none */
34
+ sameSite?: "strict" | "lax" | "none";
35
+ }
36
+ /** Swagger UI configuration */
37
+ export interface SwaggerConfig {
38
+ /** Enable or disable Swagger UI */
39
+ enabled: boolean;
40
+ /** URL path untuk serve Swagger UI (default: "/api/docs") */
41
+ path?: string;
42
+ /** API documentation title (default: "API Documentation") */
43
+ title?: string;
44
+ /** API version (default: "1.0.0") */
45
+ version?: string;
46
+ /** Sort endpoints by path or method (default: "path") */
47
+ sortBy?: "path" | "method";
48
+ /** Enable search by path in Swagger UI (default: true) */
49
+ searchByPath?: boolean;
50
+ /** Enable search by method in Swagger UI (default: true) */
51
+ searchByMethod?: boolean;
52
+ /** Enable search by tag in Swagger UI (default: true) */
53
+ searchByTag?: boolean;
54
+ }
55
+ /** Logger configuration */
56
+ export interface LoggerConfig {
57
+ /** Enable request logging (default: false) */
58
+ enabled?: boolean;
59
+ /**
60
+ * Custom handler untuk menerima log data.
61
+ * Berguna untuk menyimpan log ke file atau service eksternal.
62
+ */
63
+ handler?: (level: "info" | "error", message: string, meta: LoggerMeta) => void;
64
+ }
65
+ /** Metadata object yang dikirim ke custom logger handler */
66
+ export interface LoggerMeta {
67
+ /** HTTP method uppercase (GET, POST, dll) */
68
+ method: string;
69
+ /** Request URL path */
70
+ path: string;
71
+ /** HTTP response status code */
72
+ status: number;
73
+ /** Request duration in milliseconds */
74
+ durationMs: number;
75
+ /** Optional error object (ada jika status >= 500) */
76
+ error?: unknown;
77
+ }
78
+ /** Main RouterKit configuration — di-set sekali via `RouterKit.setup()` */
79
+ export interface RouterKitConfig {
80
+ /** Framework yang digunakan: "express" atau "fastify" */
81
+ framework: Framework;
82
+ /** Framework application instance (Express `app` atau Fastify instance) */
83
+ app: unknown;
84
+ /** Middleware untuk authentication type "auth" (contoh: verifyAccessToken) */
85
+ authMiddleware?: MiddlewareFn;
86
+ /** Middleware untuk authentication type "refresh" (contoh: verifyRefreshToken) */
87
+ refreshMiddleware?: MiddlewareFn;
88
+ /** Swagger UI configuration */
89
+ swagger?: SwaggerConfig;
90
+ /** Logger configuration */
91
+ logger?: boolean | LoggerConfig;
92
+ /**
93
+ * Response wrapping policy:
94
+ * - `"wrap"` (default): bungkus response ke `{ message, data }`
95
+ * - `"raw"`: kirim return value controller langsung tanpa bungkus
96
+ */
97
+ responseEnvelope?: "wrap" | "raw";
98
+ /**
99
+ * Optional path prefix untuk semua route (contoh: "/api").
100
+ * Controller bisa tetap pakai `@ReqController("/users")` dan hasilnya "/api/users".
101
+ */
102
+ globalPrefix?: string;
103
+ }
104
+ /** Options untuk `@ReqController` decorator */
105
+ export interface ControllerOptions {
106
+ /** Authentication type untuk semua route di controller ini (default: false) */
107
+ authentication?: AuthType | false;
108
+ /** Swagger tag untuk grouping (default: derived dari class name) */
109
+ tag?: string;
110
+ /** Whether to include in Swagger docs (default: true) */
111
+ swagger?: boolean;
112
+ }
113
+ /** Options untuk mapping decorators (`@GetMapping`, `@PostMapping`, dll) */
114
+ export interface MappingOptions {
115
+ /** Override authentication level untuk route ini */
116
+ authentication?: AuthType | false;
117
+ /** Sembunyikan route ini dari Swagger docs */
118
+ swagger?: boolean;
119
+ /** Override controller tag untuk route ini */
120
+ tag?: string;
121
+ /** Swagger summary (short description) */
122
+ summary?: string;
123
+ /** Swagger description (detailed) */
124
+ description?: string;
125
+ /** Default HTTP response status code (override @HttpStatus) */
126
+ status?: number;
127
+ }
128
+ /** Stored metadata untuk controller class — ditulis oleh `@ReqController` */
129
+ export interface ControllerMetadata {
130
+ basePath: string;
131
+ authentication: AuthType | false;
132
+ tag: string;
133
+ swagger: boolean;
134
+ }
135
+ /** Stored metadata untuk satu route — ditulis oleh `@GetMapping`, dll */
136
+ export interface RouteMetadata {
137
+ method: HttpMethod;
138
+ path: string;
139
+ propertyKey: string;
140
+ options: MappingOptions;
141
+ }
142
+ /** Tipe parameter injection yang didukung */
143
+ export type ParamType = "body" | "query" | "param" | "req" | "cookie" | "reply";
144
+ /** Stored metadata untuk satu parameter — ditulis oleh `@Body`, `@Query`, dll */
145
+ export interface ParamMetadata {
146
+ type: ParamType;
147
+ index: number;
148
+ schema?: ZodSchema;
149
+ key?: string;
150
+ }
151
+ /**
152
+ * Metadata keys untuk TC39 native decorators.
153
+ * Disimpan sebagai Symbol agar tidak konflik dengan metadata lain.
154
+ * Parameter decorators tidak support context.metadata (TC39),
155
+ * jadi kita simpan parameter metadata di WeakMap terpisah.
156
+ */
157
+ export declare const META: {
158
+ /** Key untuk controller metadata (class-level) */
159
+ readonly CONTROLLER: symbol;
160
+ /** Key untuk routes array (class-level) */
161
+ readonly ROUTES: symbol;
162
+ /** Prefix key untuk method-level middlewares */
163
+ readonly MIDDLEWARES_PREFIX: "routerkit:middlewares:";
164
+ /** Prefix key untuk method-level http status */
165
+ readonly HTTP_STATUS_PREFIX: "routerkit:httpstatus:";
166
+ };
167
+ /**
168
+ * WeakMap storage untuk parameter decorators metadata.
169
+ * TC39 tidak mendukung parameter decorators, jadi kita simpan
170
+ * metadata parameter di WeakMap ini.
171
+ *
172
+ * Struktur: WeakMap<ControllerClass, Map<methodName, ParamMetadata[]>>
173
+ */
174
+ export declare const paramMetaStore: WeakMap<object, Map<string, ParamMetadata[]>>;
175
+ export declare function getClassMeta<T = unknown>(Controller: Class, key: symbol | string): T | undefined;
176
+ /** OpenAPI path item — mapping from path to operations */
177
+ export interface OpenAPIPathItem {
178
+ [method: string]: OpenAPIOperation;
179
+ }
180
+ /** OpenAPI operation (GET /users, POST /users, dll) */
181
+ export interface OpenAPIOperation {
182
+ tags: string[];
183
+ summary?: string;
184
+ description?: string;
185
+ parameters?: OpenAPIParameter[];
186
+ requestBody?: OpenAPIRequestBody;
187
+ responses: Record<string, OpenAPIResponse>;
188
+ }
189
+ /** OpenAPI parameter (query, path, header, cookie) */
190
+ export interface OpenAPIParameter {
191
+ name: string;
192
+ in: "query" | "path" | "header" | "cookie";
193
+ required: boolean;
194
+ schema: OpenAPISchema;
195
+ description?: string;
196
+ }
197
+ /** OpenAPI request body definition */
198
+ export interface OpenAPIRequestBody {
199
+ required: boolean;
200
+ content: {
201
+ "application/json": {
202
+ schema: OpenAPISchema;
203
+ };
204
+ };
205
+ }
206
+ /** OpenAPI response definition */
207
+ export interface OpenAPIResponse {
208
+ description: string;
209
+ content?: {
210
+ "application/json": {
211
+ schema: OpenAPISchema;
212
+ };
213
+ };
214
+ }
215
+ /** OpenAPI schema object (subset of JSON Schema) */
216
+ export interface OpenAPISchema {
217
+ type?: string;
218
+ properties?: Record<string, OpenAPISchema>;
219
+ items?: OpenAPISchema;
220
+ required?: string[];
221
+ nullable?: boolean;
222
+ description?: string;
223
+ enum?: unknown[];
224
+ format?: string;
225
+ default?: unknown;
226
+ }
227
+ /** Full OpenAPI 3.0 specification */
228
+ export interface OpenAPISpec {
229
+ openapi: string;
230
+ info: {
231
+ title: string;
232
+ version: string;
233
+ };
234
+ paths: Record<string, OpenAPIPathItem>;
235
+ tags: Array<{
236
+ name: string;
237
+ description?: string;
238
+ }>;
239
+ }
240
+ /**
241
+ * Resolved route — hasil akhir parsing metadata decorator.
242
+ * Digunakan untuk register route ke adapter dan generate Swagger spec.
243
+ */
244
+ export interface ResolvedRoute {
245
+ method: HttpMethod;
246
+ fullPath: string;
247
+ middlewares: MiddlewareFn[];
248
+ params: ParamMetadata[];
249
+ handler: (...args: unknown[]) => unknown;
250
+ statusCode: number;
251
+ controllerTag: string;
252
+ swagger: boolean;
253
+ routeOptions: MappingOptions;
254
+ }
255
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../types/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ // ── TC39 Metadata Keys ────────────────────────────────────────────
2
+ /**
3
+ * Metadata keys untuk TC39 native decorators.
4
+ * Disimpan sebagai Symbol agar tidak konflik dengan metadata lain.
5
+ * Parameter decorators tidak support context.metadata (TC39),
6
+ * jadi kita simpan parameter metadata di WeakMap terpisah.
7
+ */
8
+ export const META = {
9
+ /** Key untuk controller metadata (class-level) */
10
+ CONTROLLER: Symbol("routerkit:controller"),
11
+ /** Key untuk routes array (class-level) */
12
+ ROUTES: Symbol("routerkit:routes"),
13
+ /** Prefix key untuk method-level middlewares */
14
+ MIDDLEWARES_PREFIX: "routerkit:middlewares:",
15
+ /** Prefix key untuk method-level http status */
16
+ HTTP_STATUS_PREFIX: "routerkit:httpstatus:",
17
+ };
18
+ /**
19
+ * WeakMap storage untuk parameter decorators metadata.
20
+ * TC39 tidak mendukung parameter decorators, jadi kita simpan
21
+ * metadata parameter di WeakMap ini.
22
+ *
23
+ * Struktur: WeakMap<ControllerClass, Map<methodName, ParamMetadata[]>>
24
+ */
25
+ export const paramMetaStore = new WeakMap();
26
+ export function getClassMeta(Controller, key) {
27
+ const container = Controller;
28
+ const meta = container[Symbol.metadata];
29
+ return meta?.[key];
30
+ }
31
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../types/index.ts"],"names":[],"mappings":"AAkLA,qEAAqE;AAErE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,kDAAkD;IAClD,UAAU,EAAE,MAAM,CAAC,sBAAsB,CAAC;IAC1C,2CAA2C;IAC3C,MAAM,EAAE,MAAM,CAAC,kBAAkB,CAAC;IAClC,gDAAgD;IAChD,kBAAkB,EAAE,wBAAwB;IAC5C,gDAAgD;IAChD,kBAAkB,EAAE,uBAAuB;CACnC,CAAC;AAEX;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,OAAO,EAAwC,CAAC;AAoBlF,MAAM,UAAU,YAAY,CAAc,UAAiB,EAAE,GAAoB;IAC/E,MAAM,SAAS,GAAG,UAAsC,CAAC;IACzD,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,QAAkB,CAA8B,CAAC;IAC/E,OAAO,IAAI,EAAE,CAAC,GAAG,CAAkB,CAAC;AACtC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "@alis-kit/routers",
3
+ "version": "1.0.0",
4
+ "description": "TC39 decorator-based controller library for Node.js APIs. Supports Express and Fastify with Zod validation.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "engines": {
18
+ "node": ">=18",
19
+ "typescript": ">=5.2"
20
+ },
21
+ "keywords": [
22
+ "router",
23
+ "decorator",
24
+ "tc39",
25
+ "express",
26
+ "fastify",
27
+ "zod",
28
+ "swagger",
29
+ "api"
30
+ ],
31
+ "license": "MIT",
32
+ "dependencies": {
33
+ "zod": "^3.23.0"
34
+ },
35
+ "devDependencies": {
36
+ "@types/node": "^22.0.0",
37
+ "typescript": "^5.6.0",
38
+ "vitest": "^2.0.0"
39
+ },
40
+ "optionalDependencies": {
41
+ "express": "^4.18.0",
42
+ "fastify": "^4.0.0",
43
+ "swagger-ui-express": "^5.0.0"
44
+ },
45
+ "scripts": {
46
+ "build": "tsc",
47
+ "dev": "tsc --watch",
48
+ "test": "vitest run",
49
+ "test:watch": "vitest",
50
+ "lint": "tsc --noEmit"
51
+ }
52
+ }