module-router 0.0.1
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/dist/Module.d.ts +23 -0
- package/dist/Module.js +27 -0
- package/dist/components/HttpResponse.d.ts +23 -0
- package/dist/components/HttpResponse.js +40 -0
- package/dist/components/Middleware.d.ts +6 -0
- package/dist/components/Middleware.js +10 -0
- package/dist/components/RouteSchema.d.ts +41 -0
- package/dist/components/RouteSchema.js +47 -0
- package/dist/components/index.d.ts +3 -0
- package/dist/components/index.js +3 -0
- package/dist/constants/http-status.d.ts +64 -0
- package/dist/constants/http-status.js +69 -0
- package/dist/constants/index.d.ts +2 -0
- package/dist/constants/index.js +2 -0
- package/dist/constants/router.d.ts +7 -0
- package/dist/constants/router.js +7 -0
- package/dist/decorators/controller.d.ts +11 -0
- package/dist/decorators/controller.js +33 -0
- package/dist/decorators/index.d.ts +3 -0
- package/dist/decorators/index.js +3 -0
- package/dist/decorators/middleware.d.ts +5 -0
- package/dist/decorators/middleware.js +28 -0
- package/dist/decorators/route.d.ts +2 -0
- package/dist/decorators/route.js +6 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +6 -0
- package/dist/types/controller.d.ts +8 -0
- package/dist/types/controller.js +1 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.js +3 -0
- package/dist/types/middleware.d.ts +12 -0
- package/dist/types/middleware.js +1 -0
- package/dist/types/route.d.ts +5 -0
- package/dist/types/route.js +1 -0
- package/dist/utils/Middleware.d.ts +4 -0
- package/dist/utils/Middleware.js +23 -0
- package/dist/utils/Route.d.ts +7 -0
- package/dist/utils/Route.js +6 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.js +2 -0
- package/package.json +46 -0
package/dist/Module.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Core, BaseModule } from '@zyrohub/core';
|
|
2
|
+
import { RouterMiddleware } from './components/Middleware.js';
|
|
3
|
+
export interface RouterModuleOptions {
|
|
4
|
+
loader?: {
|
|
5
|
+
path: string;
|
|
6
|
+
pattern?: RegExp;
|
|
7
|
+
};
|
|
8
|
+
controllers?: any[];
|
|
9
|
+
}
|
|
10
|
+
export declare class RouterModule extends BaseModule {
|
|
11
|
+
static options: RouterModuleOptions;
|
|
12
|
+
controllers: any[];
|
|
13
|
+
middlewares: (typeof RouterMiddleware)[];
|
|
14
|
+
constructor();
|
|
15
|
+
init(data: {
|
|
16
|
+
core: Core;
|
|
17
|
+
options: RouterModuleOptions;
|
|
18
|
+
}): Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
declare const _default: {
|
|
21
|
+
RouterModule: typeof RouterModule;
|
|
22
|
+
};
|
|
23
|
+
export default _default;
|
package/dist/Module.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import { BaseModule, Module } from '@zyrohub/core';
|
|
11
|
+
let RouterModule = class RouterModule extends BaseModule {
|
|
12
|
+
static options;
|
|
13
|
+
controllers = [];
|
|
14
|
+
middlewares = [];
|
|
15
|
+
constructor() {
|
|
16
|
+
super();
|
|
17
|
+
}
|
|
18
|
+
async init(data) {
|
|
19
|
+
// this.core?.storage?.set('routes', []);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
RouterModule = __decorate([
|
|
23
|
+
Module(),
|
|
24
|
+
__metadata("design:paramtypes", [])
|
|
25
|
+
], RouterModule);
|
|
26
|
+
export { RouterModule };
|
|
27
|
+
export default { RouterModule };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { HttpStatusCodes } from '../constants/index.js';
|
|
2
|
+
export interface HttpResponseOptions {
|
|
3
|
+
success: boolean;
|
|
4
|
+
status?: number | keyof typeof HttpStatusCodes;
|
|
5
|
+
code?: string;
|
|
6
|
+
data?: Record<string, any>;
|
|
7
|
+
}
|
|
8
|
+
export declare class HttpResponse {
|
|
9
|
+
success: HttpResponseOptions['success'];
|
|
10
|
+
status: NonNullable<HttpResponseOptions['status']>;
|
|
11
|
+
code?: HttpResponseOptions['code'];
|
|
12
|
+
data?: HttpResponseOptions['data'];
|
|
13
|
+
constructor(options: HttpResponseOptions);
|
|
14
|
+
static success(data?: HttpResponseOptions['data']): HttpResponse;
|
|
15
|
+
static created(data?: HttpResponseOptions['data']): HttpResponse;
|
|
16
|
+
static error(status: HttpResponseOptions['status'], code: HttpResponseOptions['code'], data?: HttpResponseOptions['data']): HttpResponse;
|
|
17
|
+
toObject(): {
|
|
18
|
+
success: boolean;
|
|
19
|
+
status: NonNullable<number | "CONTINUE" | "SWITCHING_PROTOCOLS" | "PROCESSING" | "EARLY_HINTS" | "OK" | "CREATED" | "ACCEPTED" | "NON_AUTHORITATIVE_INFORMATION" | "NO_CONTENT" | "RESET_CONTENT" | "PARTIAL_CONTENT" | "MULTI_STATUS" | "ALREADY_REPORTED" | "IM_USED" | "MULTIPLE_CHOICES" | "MOVED_PERMANENTLY" | "FOUND" | "SEE_OTHER" | "NOT_MODIFIED" | "USE_PROXY" | "TEMPORARY_REDIRECT" | "PERMANENT_REDIRECT" | "BAD_REQUEST" | "UNAUTHORIZED" | "PAYMENT_REQUIRED" | "FORBIDDEN" | "NOT_FOUND" | "METHOD_NOT_ALLOWED" | "NOT_ACCEPTABLE" | "PROXY_AUTHENTICATION_REQUIRED" | "REQUEST_TIMEOUT" | "CONFLICT" | "GONE" | "LENGTH_REQUIRED" | "PRECONDITION_FAILED" | "PAYLOAD_TOO_LARGE" | "URI_TOO_LONG" | "UNSUPPORTED_MEDIA_TYPE" | "RANGE_NOT_SATISFIABLE" | "EXPECTATION_FAILED" | "IM_A_TEAPOT" | "MISDIRECTED_REQUEST" | "UNPROCESSABLE_ENTITY" | "LOCKED" | "FAILED_DEPENDENCY" | "TOO_EARLY" | "UPGRADE_REQUIRED" | "PRECONDITION_REQUIRED" | "TOO_MANY_REQUESTS" | "REQUEST_HEADER_FIELDS_TOO_LARGE" | "UNAVAILABLE_FOR_LEGAL_REASONS" | "INTERNAL_SERVER_ERROR" | "NOT_IMPLEMENTED" | "BAD_GATEWAY" | "SERVICE_UNAVAILABLE" | "GATEWAY_TIMEOUT" | "HTTP_VERSION_NOT_SUPPORTED" | "VARIANT_ALSO_NEGOTIATES" | "INSUFFICIENT_STORAGE" | "LOOP_DETECTED" | "NOT_EXTENDED" | "NETWORK_AUTHENTICATION_REQUIRED" | undefined>;
|
|
20
|
+
code: string | undefined;
|
|
21
|
+
data: Record<string, any> | undefined;
|
|
22
|
+
};
|
|
23
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { HttpStatusCodes } from '../constants/index.js';
|
|
2
|
+
export class HttpResponse {
|
|
3
|
+
success;
|
|
4
|
+
status;
|
|
5
|
+
code;
|
|
6
|
+
data;
|
|
7
|
+
constructor(options) {
|
|
8
|
+
this.success = options.success;
|
|
9
|
+
if (typeof options.status === 'string') {
|
|
10
|
+
this.status = HttpStatusCodes[options.status] || 200;
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
this.status = options.status || 200;
|
|
14
|
+
}
|
|
15
|
+
this.code = options.code;
|
|
16
|
+
this.data = options.data;
|
|
17
|
+
}
|
|
18
|
+
static success(data) {
|
|
19
|
+
return new HttpResponse({ success: true, status: 200, data });
|
|
20
|
+
}
|
|
21
|
+
static created(data) {
|
|
22
|
+
return new HttpResponse({ success: true, status: 201, data });
|
|
23
|
+
}
|
|
24
|
+
static error(status, code, data) {
|
|
25
|
+
return new HttpResponse({
|
|
26
|
+
success: false,
|
|
27
|
+
status,
|
|
28
|
+
code,
|
|
29
|
+
data
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
toObject() {
|
|
33
|
+
return {
|
|
34
|
+
success: this.success,
|
|
35
|
+
status: this.status,
|
|
36
|
+
code: this.code,
|
|
37
|
+
data: this.data
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { MountedMiddleware, RouterMiddlewareClass } from '../types/index.js';
|
|
2
|
+
export declare class RouterMiddleware {
|
|
3
|
+
static options: any;
|
|
4
|
+
static configure<TConfigure extends (typeof RouterMiddleware)['options']>(this: RouterMiddlewareClass, options: TConfigure): MountedMiddleware<TConfigure>;
|
|
5
|
+
execute(context: any, options: any): Promise<void>;
|
|
6
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { InferSchemaType, ValidatorSchema } from '@zyrohub/utilities';
|
|
2
|
+
export interface RouteSchemaMeta {
|
|
3
|
+
tags?: string[];
|
|
4
|
+
summary?: string;
|
|
5
|
+
description?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface RouteSchemaOptions<SBody extends ValidatorSchema = ValidatorSchema, SQuery extends ValidatorSchema = ValidatorSchema, SParams extends ValidatorSchema = ValidatorSchema> {
|
|
8
|
+
body?: SBody;
|
|
9
|
+
query?: SQuery;
|
|
10
|
+
params?: SParams;
|
|
11
|
+
meta?: RouteSchemaMeta;
|
|
12
|
+
}
|
|
13
|
+
export interface RouteSchemaContext<SRequest = any, SResponse = any, SBody extends ValidatorSchema = ValidatorSchema, SQuery extends ValidatorSchema = ValidatorSchema, SParams extends ValidatorSchema = ValidatorSchema> {
|
|
14
|
+
request: SRequest;
|
|
15
|
+
response: SResponse;
|
|
16
|
+
body: SBody extends ValidatorSchema ? InferSchemaType<SBody> : undefined;
|
|
17
|
+
query: SQuery extends ValidatorSchema ? InferSchemaType<SQuery> : undefined;
|
|
18
|
+
params: SParams extends ValidatorSchema ? InferSchemaType<SParams> : undefined;
|
|
19
|
+
}
|
|
20
|
+
export declare class RouteSchema<SRequest = any, SResponse = any, SBody extends ValidatorSchema = ValidatorSchema, SQuery extends ValidatorSchema = ValidatorSchema, SParams extends ValidatorSchema = ValidatorSchema> {
|
|
21
|
+
validators: {
|
|
22
|
+
body?: SBody;
|
|
23
|
+
query?: SQuery;
|
|
24
|
+
params?: SParams;
|
|
25
|
+
};
|
|
26
|
+
meta: RouteSchemaMeta;
|
|
27
|
+
context: RouteSchemaContext<SRequest, SResponse, SBody, SQuery, SParams>;
|
|
28
|
+
constructor(options?: RouteSchemaOptions<SBody, SQuery, SParams>);
|
|
29
|
+
static createBase<SRequest = any, SResponse = any, SBody extends ValidatorSchema = ValidatorSchema, SQuery extends ValidatorSchema = ValidatorSchema, SParams extends ValidatorSchema = ValidatorSchema>(options?: RouteSchemaOptions<SBody, SQuery, SParams>): {
|
|
30
|
+
new <IBody extends ValidatorSchema = ValidatorSchema, IQuery extends ValidatorSchema = ValidatorSchema, IParams extends ValidatorSchema = ValidatorSchema>(input?: RouteSchemaOptions<IBody, IQuery, IParams>): {
|
|
31
|
+
validators: {
|
|
32
|
+
body?: (SBody & IBody) | undefined;
|
|
33
|
+
query?: (SQuery & IQuery) | undefined;
|
|
34
|
+
params?: (SParams & IParams) | undefined;
|
|
35
|
+
};
|
|
36
|
+
meta: RouteSchemaMeta;
|
|
37
|
+
context: RouteSchemaContext<SRequest, SResponse, SBody & IBody, SQuery & IQuery, SParams & IParams>;
|
|
38
|
+
};
|
|
39
|
+
createBase<SRequest = any, SResponse = any, SBody extends ValidatorSchema = ValidatorSchema, SQuery extends ValidatorSchema = ValidatorSchema, SParams extends ValidatorSchema = ValidatorSchema>(options?: RouteSchemaOptions<SBody, SQuery, SParams>): /*elided*/ any;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export class RouteSchema {
|
|
2
|
+
validators = {};
|
|
3
|
+
meta = {};
|
|
4
|
+
context = {};
|
|
5
|
+
constructor(options = {}) {
|
|
6
|
+
if (options.body)
|
|
7
|
+
this.validators.body = options.body;
|
|
8
|
+
if (options.query)
|
|
9
|
+
this.validators.query = options.query;
|
|
10
|
+
if (options.params)
|
|
11
|
+
this.validators.params = options.params;
|
|
12
|
+
if (options.meta)
|
|
13
|
+
this.meta = options.meta;
|
|
14
|
+
}
|
|
15
|
+
static createBase(options = {}) {
|
|
16
|
+
return class Base extends RouteSchema {
|
|
17
|
+
constructor(input = {}) {
|
|
18
|
+
super({
|
|
19
|
+
...((input.body || options.body) && {
|
|
20
|
+
body: {
|
|
21
|
+
...options.body,
|
|
22
|
+
...input.body
|
|
23
|
+
}
|
|
24
|
+
}),
|
|
25
|
+
...((input.query || options.query) && {
|
|
26
|
+
query: {
|
|
27
|
+
...options.query,
|
|
28
|
+
...input.query
|
|
29
|
+
}
|
|
30
|
+
}),
|
|
31
|
+
...((input.params || options.params) && {
|
|
32
|
+
params: {
|
|
33
|
+
...options.params,
|
|
34
|
+
...input.params
|
|
35
|
+
}
|
|
36
|
+
}),
|
|
37
|
+
...((input.meta || options.meta) && {
|
|
38
|
+
meta: {
|
|
39
|
+
...options.meta,
|
|
40
|
+
...input.meta
|
|
41
|
+
}
|
|
42
|
+
})
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
export declare const HttpStatusCodes: {
|
|
2
|
+
CONTINUE: number;
|
|
3
|
+
SWITCHING_PROTOCOLS: number;
|
|
4
|
+
PROCESSING: number;
|
|
5
|
+
EARLY_HINTS: number;
|
|
6
|
+
OK: number;
|
|
7
|
+
CREATED: number;
|
|
8
|
+
ACCEPTED: number;
|
|
9
|
+
NON_AUTHORITATIVE_INFORMATION: number;
|
|
10
|
+
NO_CONTENT: number;
|
|
11
|
+
RESET_CONTENT: number;
|
|
12
|
+
PARTIAL_CONTENT: number;
|
|
13
|
+
MULTI_STATUS: number;
|
|
14
|
+
ALREADY_REPORTED: number;
|
|
15
|
+
IM_USED: number;
|
|
16
|
+
MULTIPLE_CHOICES: number;
|
|
17
|
+
MOVED_PERMANENTLY: number;
|
|
18
|
+
FOUND: number;
|
|
19
|
+
SEE_OTHER: number;
|
|
20
|
+
NOT_MODIFIED: number;
|
|
21
|
+
USE_PROXY: number;
|
|
22
|
+
TEMPORARY_REDIRECT: number;
|
|
23
|
+
PERMANENT_REDIRECT: number;
|
|
24
|
+
BAD_REQUEST: number;
|
|
25
|
+
UNAUTHORIZED: number;
|
|
26
|
+
PAYMENT_REQUIRED: number;
|
|
27
|
+
FORBIDDEN: number;
|
|
28
|
+
NOT_FOUND: number;
|
|
29
|
+
METHOD_NOT_ALLOWED: number;
|
|
30
|
+
NOT_ACCEPTABLE: number;
|
|
31
|
+
PROXY_AUTHENTICATION_REQUIRED: number;
|
|
32
|
+
REQUEST_TIMEOUT: number;
|
|
33
|
+
CONFLICT: number;
|
|
34
|
+
GONE: number;
|
|
35
|
+
LENGTH_REQUIRED: number;
|
|
36
|
+
PRECONDITION_FAILED: number;
|
|
37
|
+
PAYLOAD_TOO_LARGE: number;
|
|
38
|
+
URI_TOO_LONG: number;
|
|
39
|
+
UNSUPPORTED_MEDIA_TYPE: number;
|
|
40
|
+
RANGE_NOT_SATISFIABLE: number;
|
|
41
|
+
EXPECTATION_FAILED: number;
|
|
42
|
+
IM_A_TEAPOT: number;
|
|
43
|
+
MISDIRECTED_REQUEST: number;
|
|
44
|
+
UNPROCESSABLE_ENTITY: number;
|
|
45
|
+
LOCKED: number;
|
|
46
|
+
FAILED_DEPENDENCY: number;
|
|
47
|
+
TOO_EARLY: number;
|
|
48
|
+
UPGRADE_REQUIRED: number;
|
|
49
|
+
PRECONDITION_REQUIRED: number;
|
|
50
|
+
TOO_MANY_REQUESTS: number;
|
|
51
|
+
REQUEST_HEADER_FIELDS_TOO_LARGE: number;
|
|
52
|
+
UNAVAILABLE_FOR_LEGAL_REASONS: number;
|
|
53
|
+
INTERNAL_SERVER_ERROR: number;
|
|
54
|
+
NOT_IMPLEMENTED: number;
|
|
55
|
+
BAD_GATEWAY: number;
|
|
56
|
+
SERVICE_UNAVAILABLE: number;
|
|
57
|
+
GATEWAY_TIMEOUT: number;
|
|
58
|
+
HTTP_VERSION_NOT_SUPPORTED: number;
|
|
59
|
+
VARIANT_ALSO_NEGOTIATES: number;
|
|
60
|
+
INSUFFICIENT_STORAGE: number;
|
|
61
|
+
LOOP_DETECTED: number;
|
|
62
|
+
NOT_EXTENDED: number;
|
|
63
|
+
NETWORK_AUTHENTICATION_REQUIRED: number;
|
|
64
|
+
};
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
export const HttpStatusCodes = {
|
|
2
|
+
// Informational responses (100–199)
|
|
3
|
+
CONTINUE: 100,
|
|
4
|
+
SWITCHING_PROTOCOLS: 101,
|
|
5
|
+
PROCESSING: 102,
|
|
6
|
+
EARLY_HINTS: 103,
|
|
7
|
+
// Successful responses (200–299)
|
|
8
|
+
OK: 200,
|
|
9
|
+
CREATED: 201,
|
|
10
|
+
ACCEPTED: 202,
|
|
11
|
+
NON_AUTHORITATIVE_INFORMATION: 203,
|
|
12
|
+
NO_CONTENT: 204,
|
|
13
|
+
RESET_CONTENT: 205,
|
|
14
|
+
PARTIAL_CONTENT: 206,
|
|
15
|
+
MULTI_STATUS: 207,
|
|
16
|
+
ALREADY_REPORTED: 208,
|
|
17
|
+
IM_USED: 226,
|
|
18
|
+
// Redirection messages (300–399)
|
|
19
|
+
MULTIPLE_CHOICES: 300,
|
|
20
|
+
MOVED_PERMANENTLY: 301,
|
|
21
|
+
FOUND: 302,
|
|
22
|
+
SEE_OTHER: 303,
|
|
23
|
+
NOT_MODIFIED: 304,
|
|
24
|
+
USE_PROXY: 305,
|
|
25
|
+
TEMPORARY_REDIRECT: 307,
|
|
26
|
+
PERMANENT_REDIRECT: 308,
|
|
27
|
+
// Client error responses (400–499)
|
|
28
|
+
BAD_REQUEST: 400,
|
|
29
|
+
UNAUTHORIZED: 401,
|
|
30
|
+
PAYMENT_REQUIRED: 402,
|
|
31
|
+
FORBIDDEN: 403,
|
|
32
|
+
NOT_FOUND: 404,
|
|
33
|
+
METHOD_NOT_ALLOWED: 405,
|
|
34
|
+
NOT_ACCEPTABLE: 406,
|
|
35
|
+
PROXY_AUTHENTICATION_REQUIRED: 407,
|
|
36
|
+
REQUEST_TIMEOUT: 408,
|
|
37
|
+
CONFLICT: 409,
|
|
38
|
+
GONE: 410,
|
|
39
|
+
LENGTH_REQUIRED: 411,
|
|
40
|
+
PRECONDITION_FAILED: 412,
|
|
41
|
+
PAYLOAD_TOO_LARGE: 413,
|
|
42
|
+
URI_TOO_LONG: 414,
|
|
43
|
+
UNSUPPORTED_MEDIA_TYPE: 415,
|
|
44
|
+
RANGE_NOT_SATISFIABLE: 416,
|
|
45
|
+
EXPECTATION_FAILED: 417,
|
|
46
|
+
IM_A_TEAPOT: 418,
|
|
47
|
+
MISDIRECTED_REQUEST: 421,
|
|
48
|
+
UNPROCESSABLE_ENTITY: 422,
|
|
49
|
+
LOCKED: 423,
|
|
50
|
+
FAILED_DEPENDENCY: 424,
|
|
51
|
+
TOO_EARLY: 425,
|
|
52
|
+
UPGRADE_REQUIRED: 426,
|
|
53
|
+
PRECONDITION_REQUIRED: 428,
|
|
54
|
+
TOO_MANY_REQUESTS: 429,
|
|
55
|
+
REQUEST_HEADER_FIELDS_TOO_LARGE: 431,
|
|
56
|
+
UNAVAILABLE_FOR_LEGAL_REASONS: 451,
|
|
57
|
+
// Server error responses (500–599)
|
|
58
|
+
INTERNAL_SERVER_ERROR: 500,
|
|
59
|
+
NOT_IMPLEMENTED: 501,
|
|
60
|
+
BAD_GATEWAY: 502,
|
|
61
|
+
SERVICE_UNAVAILABLE: 503,
|
|
62
|
+
GATEWAY_TIMEOUT: 504,
|
|
63
|
+
HTTP_VERSION_NOT_SUPPORTED: 505,
|
|
64
|
+
VARIANT_ALSO_NEGOTIATES: 506,
|
|
65
|
+
INSUFFICIENT_STORAGE: 507,
|
|
66
|
+
LOOP_DETECTED: 508,
|
|
67
|
+
NOT_EXTENDED: 510,
|
|
68
|
+
NETWORK_AUTHENTICATION_REQUIRED: 511
|
|
69
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const ROUTER_ROLE_METADATA_KEY = "zyro:router:role";
|
|
2
|
+
export declare const ROUTER_MIDDLEWARE_ROLE = "middleware";
|
|
3
|
+
export declare const ROUTER_CONTROLLER_ROLE = "controller";
|
|
4
|
+
export declare const ROUTER_MIDDLEWARES_METADATA_KEY = "zyro:controller:middlewares";
|
|
5
|
+
export declare const ROUTER_ROUTES_METADATA_KEY = "zyro:controller:routes";
|
|
6
|
+
export declare const ROUTER_CONTROLLER_OPTIONS_METADATA_KEY = "zyro:controller:options";
|
|
7
|
+
export declare const ROUTER_LOAD_ERROR_METADATA_KEY = "zyro:router:load:error";
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export const ROUTER_ROLE_METADATA_KEY = 'zyro:router:role';
|
|
2
|
+
export const ROUTER_MIDDLEWARE_ROLE = 'middleware';
|
|
3
|
+
export const ROUTER_CONTROLLER_ROLE = 'controller';
|
|
4
|
+
export const ROUTER_MIDDLEWARES_METADATA_KEY = 'zyro:controller:middlewares';
|
|
5
|
+
export const ROUTER_ROUTES_METADATA_KEY = 'zyro:controller:routes';
|
|
6
|
+
export const ROUTER_CONTROLLER_OPTIONS_METADATA_KEY = 'zyro:controller:options';
|
|
7
|
+
export const ROUTER_LOAD_ERROR_METADATA_KEY = 'zyro:router:load:error';
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { MiddlewareVariant } from '../types/index.js';
|
|
2
|
+
export interface ControllerOptions {
|
|
3
|
+
path?: string;
|
|
4
|
+
children?: {
|
|
5
|
+
new (...args: any[]): any;
|
|
6
|
+
}[];
|
|
7
|
+
middlewares?: MiddlewareVariant[];
|
|
8
|
+
}
|
|
9
|
+
export declare function Controller(options: ControllerOptions): (target: {
|
|
10
|
+
new (...args: any[]): {};
|
|
11
|
+
}) => void;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { ROUTER_CONTROLLER_OPTIONS_METADATA_KEY, ROUTER_CONTROLLER_ROLE, ROUTER_LOAD_ERROR_METADATA_KEY, ROUTER_MIDDLEWARES_METADATA_KEY, ROUTER_ROLE_METADATA_KEY } from '../constants/router.js';
|
|
2
|
+
import { Terminal } from '@zyrohub/utilities';
|
|
3
|
+
import { MiddlewareUtils } from '../utils/index.js';
|
|
4
|
+
export function Controller(options) {
|
|
5
|
+
return (target) => {
|
|
6
|
+
Reflect.defineMetadata(ROUTER_ROLE_METADATA_KEY, ROUTER_CONTROLLER_ROLE, target);
|
|
7
|
+
const middlewareList = Reflect.getMetadata(ROUTER_MIDDLEWARES_METADATA_KEY, target.constructor) || [];
|
|
8
|
+
const controllerMiddlewares = options.middlewares || [];
|
|
9
|
+
const mountedControllerMiddlewares = [];
|
|
10
|
+
for (const controllerMiddleware of controllerMiddlewares) {
|
|
11
|
+
try {
|
|
12
|
+
const mountedMiddleware = MiddlewareUtils.processMiddlewareVariant(controllerMiddleware);
|
|
13
|
+
mountedMiddleware.isPrimary = true;
|
|
14
|
+
mountedControllerMiddlewares.push(mountedMiddleware);
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
Reflect.defineMetadata(ROUTER_LOAD_ERROR_METADATA_KEY, true, target.constructor);
|
|
18
|
+
if (error instanceof Error)
|
|
19
|
+
Terminal.error('ROUTER', error.message);
|
|
20
|
+
else
|
|
21
|
+
Terminal.error('ROUTER', `An unknown error occurred while applying middleware. (${target.name} - ${controllerMiddleware})`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const mergedMiddlewares = [...mountedControllerMiddlewares, ...middlewareList];
|
|
25
|
+
Reflect.defineMetadata(ROUTER_MIDDLEWARES_METADATA_KEY, mergedMiddlewares, target);
|
|
26
|
+
const mountedControllerOptions = {
|
|
27
|
+
path: options.path || '/',
|
|
28
|
+
children: options.children || [],
|
|
29
|
+
middlewares: mountedControllerMiddlewares
|
|
30
|
+
};
|
|
31
|
+
Reflect.defineMetadata(ROUTER_CONTROLLER_OPTIONS_METADATA_KEY, mountedControllerOptions, target);
|
|
32
|
+
};
|
|
33
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { ROUTER_LOAD_ERROR_METADATA_KEY, ROUTER_MIDDLEWARE_ROLE, ROUTER_MIDDLEWARES_METADATA_KEY, ROUTER_ROLE_METADATA_KEY } from '../constants/index.js';
|
|
2
|
+
import { Terminal } from '@zyrohub/utilities';
|
|
3
|
+
import { MiddlewareUtils } from '../utils/index.js';
|
|
4
|
+
export function Middleware() {
|
|
5
|
+
return (target) => {
|
|
6
|
+
Reflect.defineMetadata(ROUTER_ROLE_METADATA_KEY, ROUTER_MIDDLEWARE_ROLE, target);
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
export function UseMiddleware(...middlewares) {
|
|
10
|
+
return function (target, propertyKey) {
|
|
11
|
+
const middlewareList = Reflect.getMetadata(ROUTER_MIDDLEWARES_METADATA_KEY, target.constructor) || [];
|
|
12
|
+
for (const middleware of middlewares) {
|
|
13
|
+
try {
|
|
14
|
+
const mountedMiddleware = MiddlewareUtils.processMiddlewareVariant(middleware);
|
|
15
|
+
mountedMiddleware.handlerName = propertyKey;
|
|
16
|
+
middlewareList.push(mountedMiddleware);
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
Reflect.defineMetadata(ROUTER_LOAD_ERROR_METADATA_KEY, true, target.constructor);
|
|
20
|
+
if (error instanceof Error)
|
|
21
|
+
Terminal.error('ROUTER', error.message);
|
|
22
|
+
else
|
|
23
|
+
Terminal.error('ROUTER', `An unknown error occurred while applying middleware. (${target.constructor.name} - ${middleware})`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
Reflect.defineMetadata(ROUTER_MIDDLEWARES_METADATA_KEY, middlewareList, target.constructor);
|
|
27
|
+
};
|
|
28
|
+
}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { RouterMiddleware } from '../components/Middleware.js';
|
|
2
|
+
export type RouterMiddlewareClass<T extends RouterMiddleware = RouterMiddleware> = {
|
|
3
|
+
new (...args: any[]): T;
|
|
4
|
+
configure: (options: any) => MountedMiddleware<any>;
|
|
5
|
+
};
|
|
6
|
+
export type MountedMiddleware<T = any> = {
|
|
7
|
+
constructor: RouterMiddlewareClass<any>;
|
|
8
|
+
options: T;
|
|
9
|
+
handlerName?: string;
|
|
10
|
+
isPrimary?: boolean;
|
|
11
|
+
};
|
|
12
|
+
export type MiddlewareVariant = RouterMiddlewareClass | MountedMiddleware;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { ROUTER_MIDDLEWARES_METADATA_KEY } from '../constants/router.js';
|
|
2
|
+
export class MiddlewareUtils {
|
|
3
|
+
static processMiddlewareVariant(variant) {
|
|
4
|
+
let MiddlewareConstructor;
|
|
5
|
+
if (typeof variant === 'function') {
|
|
6
|
+
MiddlewareConstructor = variant;
|
|
7
|
+
}
|
|
8
|
+
else {
|
|
9
|
+
MiddlewareConstructor = variant.constructor;
|
|
10
|
+
}
|
|
11
|
+
const isMiddleware = Reflect.getMetadata(ROUTER_MIDDLEWARES_METADATA_KEY, MiddlewareConstructor);
|
|
12
|
+
if (!isMiddleware)
|
|
13
|
+
throw new Error(`The class ${MiddlewareConstructor.name} is not a valid middleware. Did you forget the @Middleware() decorator?`);
|
|
14
|
+
let mountedMiddleware = null;
|
|
15
|
+
if (typeof variant === 'function') {
|
|
16
|
+
mountedMiddleware = variant.configure({});
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
mountedMiddleware = variant;
|
|
20
|
+
}
|
|
21
|
+
return mountedMiddleware;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { RouteSchema } from '../components/RouteSchema.js';
|
|
2
|
+
import { RouteMethod } from '../types/route.js';
|
|
3
|
+
export declare class RouteUtils {
|
|
4
|
+
static processMetadata(method: RouteMethod, path: string, handlerName: string, constructor: {
|
|
5
|
+
new (): any;
|
|
6
|
+
}, schema?: RouteSchema): void;
|
|
7
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { ROUTER_ROUTES_METADATA_KEY } from '../constants/router.js';
|
|
2
|
+
export class RouteUtils {
|
|
3
|
+
static processMetadata(method, path, handlerName, constructor, schema) {
|
|
4
|
+
const routesMetadata = Reflect.getMetadata(ROUTER_ROUTES_METADATA_KEY, constructor) || [];
|
|
5
|
+
}
|
|
6
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "module-router",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"author": "DMVMarcio",
|
|
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
|
+
"scripts": {
|
|
15
|
+
"start": "node ./dist/index.js",
|
|
16
|
+
"dev": "ztsc --watch src/index.ts",
|
|
17
|
+
"build": "rimraf dist && tsc && tsc-alias"
|
|
18
|
+
},
|
|
19
|
+
"repository": {
|
|
20
|
+
"type": "git",
|
|
21
|
+
"url": "https://github.com/ZyroHub/module-router.git"
|
|
22
|
+
},
|
|
23
|
+
"publishConfig": {
|
|
24
|
+
"access": "public"
|
|
25
|
+
},
|
|
26
|
+
"files": [
|
|
27
|
+
"/dist"
|
|
28
|
+
],
|
|
29
|
+
"keywords": [],
|
|
30
|
+
"license": "MIT",
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"@zyrohub/utilities": "^1.0.16"
|
|
33
|
+
},
|
|
34
|
+
"devDependencies": {
|
|
35
|
+
"@types/node": "^25.0.3",
|
|
36
|
+
"@zyrohub/config-prettier": "^1.0.6",
|
|
37
|
+
"@zyrohub/core": "^1.1.5",
|
|
38
|
+
"@zyrohub/ts-runner": "^0.0.3",
|
|
39
|
+
"rimraf": "^6.1.2",
|
|
40
|
+
"tsc-alias": "^1.8.16",
|
|
41
|
+
"typescript": "^5.9.3"
|
|
42
|
+
},
|
|
43
|
+
"peerDependencies": {
|
|
44
|
+
"@zyrohub/core": "^1.1.4"
|
|
45
|
+
}
|
|
46
|
+
}
|