@devbro/neko-router 0.1.2 → 0.1.4
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/Controller.js +6 -8
- package/dist/Controller.js.map +1 -1
- package/dist/Controller.mjs +6 -8
- package/dist/Controller.mjs.map +1 -1
- package/package.json +1 -1
package/dist/Controller.js
CHANGED
|
@@ -54,7 +54,6 @@ class BaseController {
|
|
|
54
54
|
return new this();
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
|
-
BaseController.routes = [];
|
|
58
57
|
BaseController.basePath = "";
|
|
59
58
|
function Controller(path, options = {}) {
|
|
60
59
|
return function(target) {
|
|
@@ -65,17 +64,16 @@ function Controller(path, options = {}) {
|
|
|
65
64
|
}
|
|
66
65
|
function createHttpDecorator(data) {
|
|
67
66
|
return function(target, propertyKey, descriptor) {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
target.constructor.routes.push({
|
|
67
|
+
const ctor = target.constructor;
|
|
68
|
+
if (!ctor.routes) ctor.routes = [];
|
|
69
|
+
ctor.routes.push({
|
|
72
70
|
methods: data.methods,
|
|
73
71
|
path: data.path,
|
|
74
72
|
handler: propertyKey,
|
|
75
73
|
middlewares: data.middlewares || []
|
|
76
74
|
});
|
|
77
75
|
const originalMethod = descriptor.value;
|
|
78
|
-
const paramKeys = Reflect.ownKeys(target);
|
|
76
|
+
const paramKeys = Reflect.ownKeys(target.constructor);
|
|
79
77
|
descriptor.value = function(...args) {
|
|
80
78
|
return __async(this, null, function* () {
|
|
81
79
|
const paramCustomKeys = paramKeys.filter(
|
|
@@ -83,7 +81,7 @@ function createHttpDecorator(data) {
|
|
|
83
81
|
);
|
|
84
82
|
for (const paramKey of paramCustomKeys) {
|
|
85
83
|
const paramIndex = parseInt(paramKey.split(":")[1]);
|
|
86
|
-
let method = Reflect.get(target, paramKey.toString());
|
|
84
|
+
let method = Reflect.get(target.constructor, paramKey.toString());
|
|
87
85
|
if (typeof paramIndex === "number" && typeof method === "function") {
|
|
88
86
|
args[paramIndex] = yield method();
|
|
89
87
|
}
|
|
@@ -137,7 +135,7 @@ function Options(data = {}) {
|
|
|
137
135
|
}
|
|
138
136
|
function createParamDecorator(func) {
|
|
139
137
|
return function MyParamDecorator(target, propertyKey, parameterIndex) {
|
|
140
|
-
Reflect.set(target, `${propertyKey == null ? void 0 : propertyKey.toString()}:${parameterIndex}:custom`, func);
|
|
138
|
+
Reflect.set(target.constructor, `${propertyKey == null ? void 0 : propertyKey.toString()}:${parameterIndex}:custom`, func);
|
|
141
139
|
};
|
|
142
140
|
}
|
|
143
141
|
// Annotate the CommonJS export names for ESM import in node:
|
package/dist/Controller.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/Controller.ts"],"sourcesContent":["import { ControllerDecoratorOptions, HttpMethod, MiddlewareProvider } from './types';\nimport { Middleware } from './Middleware';\n\nexport class BaseController {\n static routes: {\n methods: HttpMethod[];\n path: string;\n handler: string;\n middlewares: MiddlewareProvider[];\n }[]
|
|
1
|
+
{"version":3,"sources":["../src/Controller.ts"],"sourcesContent":["import { ControllerDecoratorOptions, HttpMethod, MiddlewareProvider } from './types';\nimport { Middleware } from './Middleware';\n\nexport class BaseController {\n declare static routes: {\n methods: HttpMethod[];\n path: string;\n handler: string;\n middlewares: MiddlewareProvider[];\n }[];\n static basePath: string = '';\n static baseMiddlewares: MiddlewareProvider[];\n\n static getInstance() {\n return new this();\n }\n}\n\nexport function Controller(path: string, options: ControllerDecoratorOptions = {}): ClassDecorator {\n return function (target: any) {\n (target as any).routes = (target as any).routes || [];\n (target as any).basePath = path;\n (target as any).baseMiddlewares = options.middlewares || [];\n };\n}\n\nfunction createHttpDecorator(data: {\n methods: HttpMethod[];\n path: string;\n middlewares: MiddlewareProvider[];\n}): MethodDecorator {\n return function (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) {\n const ctor = target.constructor;\n if (!ctor.routes) ctor.routes = [];\n ctor.routes.push({\n methods: data.methods,\n path: data.path,\n handler: propertyKey,\n middlewares: data.middlewares || [],\n });\n\n const originalMethod = descriptor.value!;\n const paramKeys = Reflect.ownKeys(target.constructor);\n\n descriptor.value = async function (...args: any[]) {\n const paramCustomKeys = paramKeys.filter(\n (key) => typeof key === 'string' && key.endsWith(':custom')\n );\n for (const paramKey of paramCustomKeys) {\n const paramIndex = parseInt((paramKey as string).split(':')[1]);\n let method = Reflect.get(target.constructor, paramKey.toString());\n if (typeof paramIndex === 'number' && typeof method === 'function') {\n args[paramIndex] = await method();\n }\n }\n\n return originalMethod.apply(this, args);\n };\n };\n}\n\nexport function Get(\n data: { path?: string; middlewares?: MiddlewareProvider[] } = {}\n): MethodDecorator {\n return createHttpDecorator({\n methods: ['GET', 'HEAD'],\n path: data.path || '/',\n middlewares: data.middlewares || [],\n });\n}\n\nexport function Post(\n data: { path?: string; middlewares?: MiddlewareProvider[] } = {}\n): MethodDecorator {\n return createHttpDecorator({\n methods: ['POST'],\n path: data.path || '/',\n middlewares: data.middlewares || [],\n });\n}\n\nexport function Put(\n data: { path?: string; middlewares?: MiddlewareProvider[] } = {}\n): MethodDecorator {\n return createHttpDecorator({\n methods: ['PUT'],\n path: data.path || '/',\n middlewares: data.middlewares || [],\n });\n}\n\nexport function Patch(\n data: { path?: string; middlewares?: MiddlewareProvider[] } = {}\n): MethodDecorator {\n return createHttpDecorator({\n methods: ['PATCH'],\n path: data.path || '/',\n middlewares: data.middlewares || [],\n });\n}\n\nexport function Delete(\n data: { path?: string; middlewares?: MiddlewareProvider[] } = {}\n): MethodDecorator {\n return createHttpDecorator({\n methods: ['DELETE'],\n path: data.path || '/',\n middlewares: data.middlewares || [],\n });\n}\n\nexport function Options(\n data: { path?: string; middlewares?: MiddlewareProvider[] } = {}\n): MethodDecorator {\n return createHttpDecorator({\n methods: ['OPTIONS'],\n path: data.path || '/',\n middlewares: data.middlewares || [],\n });\n}\n\nexport function createParamDecorator(func: () => Promise<any> | (() => any)): ParameterDecorator {\n return function MyParamDecorator(\n target: Object,\n propertyKey: string | symbol | undefined,\n parameterIndex: number\n ) {\n Reflect.set(target.constructor, `${propertyKey?.toString()}:${parameterIndex}:custom`, func);\n };\n}\n"],"mappings":"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","names":[]}
|
package/dist/Controller.mjs
CHANGED
|
@@ -23,7 +23,6 @@ class BaseController {
|
|
|
23
23
|
return new this();
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
|
-
BaseController.routes = [];
|
|
27
26
|
BaseController.basePath = "";
|
|
28
27
|
function Controller(path, options = {}) {
|
|
29
28
|
return function(target) {
|
|
@@ -34,17 +33,16 @@ function Controller(path, options = {}) {
|
|
|
34
33
|
}
|
|
35
34
|
function createHttpDecorator(data) {
|
|
36
35
|
return function(target, propertyKey, descriptor) {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
target.constructor.routes.push({
|
|
36
|
+
const ctor = target.constructor;
|
|
37
|
+
if (!ctor.routes) ctor.routes = [];
|
|
38
|
+
ctor.routes.push({
|
|
41
39
|
methods: data.methods,
|
|
42
40
|
path: data.path,
|
|
43
41
|
handler: propertyKey,
|
|
44
42
|
middlewares: data.middlewares || []
|
|
45
43
|
});
|
|
46
44
|
const originalMethod = descriptor.value;
|
|
47
|
-
const paramKeys = Reflect.ownKeys(target);
|
|
45
|
+
const paramKeys = Reflect.ownKeys(target.constructor);
|
|
48
46
|
descriptor.value = function(...args) {
|
|
49
47
|
return __async(this, null, function* () {
|
|
50
48
|
const paramCustomKeys = paramKeys.filter(
|
|
@@ -52,7 +50,7 @@ function createHttpDecorator(data) {
|
|
|
52
50
|
);
|
|
53
51
|
for (const paramKey of paramCustomKeys) {
|
|
54
52
|
const paramIndex = parseInt(paramKey.split(":")[1]);
|
|
55
|
-
let method = Reflect.get(target, paramKey.toString());
|
|
53
|
+
let method = Reflect.get(target.constructor, paramKey.toString());
|
|
56
54
|
if (typeof paramIndex === "number" && typeof method === "function") {
|
|
57
55
|
args[paramIndex] = yield method();
|
|
58
56
|
}
|
|
@@ -106,7 +104,7 @@ function Options(data = {}) {
|
|
|
106
104
|
}
|
|
107
105
|
function createParamDecorator(func) {
|
|
108
106
|
return function MyParamDecorator(target, propertyKey, parameterIndex) {
|
|
109
|
-
Reflect.set(target, `${propertyKey == null ? void 0 : propertyKey.toString()}:${parameterIndex}:custom`, func);
|
|
107
|
+
Reflect.set(target.constructor, `${propertyKey == null ? void 0 : propertyKey.toString()}:${parameterIndex}:custom`, func);
|
|
110
108
|
};
|
|
111
109
|
}
|
|
112
110
|
export {
|
package/dist/Controller.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/Controller.ts"],"sourcesContent":["import { ControllerDecoratorOptions, HttpMethod, MiddlewareProvider } from './types';\nimport { Middleware } from './Middleware';\n\nexport class BaseController {\n static routes: {\n methods: HttpMethod[];\n path: string;\n handler: string;\n middlewares: MiddlewareProvider[];\n }[]
|
|
1
|
+
{"version":3,"sources":["../src/Controller.ts"],"sourcesContent":["import { ControllerDecoratorOptions, HttpMethod, MiddlewareProvider } from './types';\nimport { Middleware } from './Middleware';\n\nexport class BaseController {\n declare static routes: {\n methods: HttpMethod[];\n path: string;\n handler: string;\n middlewares: MiddlewareProvider[];\n }[];\n static basePath: string = '';\n static baseMiddlewares: MiddlewareProvider[];\n\n static getInstance() {\n return new this();\n }\n}\n\nexport function Controller(path: string, options: ControllerDecoratorOptions = {}): ClassDecorator {\n return function (target: any) {\n (target as any).routes = (target as any).routes || [];\n (target as any).basePath = path;\n (target as any).baseMiddlewares = options.middlewares || [];\n };\n}\n\nfunction createHttpDecorator(data: {\n methods: HttpMethod[];\n path: string;\n middlewares: MiddlewareProvider[];\n}): MethodDecorator {\n return function (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) {\n const ctor = target.constructor;\n if (!ctor.routes) ctor.routes = [];\n ctor.routes.push({\n methods: data.methods,\n path: data.path,\n handler: propertyKey,\n middlewares: data.middlewares || [],\n });\n\n const originalMethod = descriptor.value!;\n const paramKeys = Reflect.ownKeys(target.constructor);\n\n descriptor.value = async function (...args: any[]) {\n const paramCustomKeys = paramKeys.filter(\n (key) => typeof key === 'string' && key.endsWith(':custom')\n );\n for (const paramKey of paramCustomKeys) {\n const paramIndex = parseInt((paramKey as string).split(':')[1]);\n let method = Reflect.get(target.constructor, paramKey.toString());\n if (typeof paramIndex === 'number' && typeof method === 'function') {\n args[paramIndex] = await method();\n }\n }\n\n return originalMethod.apply(this, args);\n };\n };\n}\n\nexport function Get(\n data: { path?: string; middlewares?: MiddlewareProvider[] } = {}\n): MethodDecorator {\n return createHttpDecorator({\n methods: ['GET', 'HEAD'],\n path: data.path || '/',\n middlewares: data.middlewares || [],\n });\n}\n\nexport function Post(\n data: { path?: string; middlewares?: MiddlewareProvider[] } = {}\n): MethodDecorator {\n return createHttpDecorator({\n methods: ['POST'],\n path: data.path || '/',\n middlewares: data.middlewares || [],\n });\n}\n\nexport function Put(\n data: { path?: string; middlewares?: MiddlewareProvider[] } = {}\n): MethodDecorator {\n return createHttpDecorator({\n methods: ['PUT'],\n path: data.path || '/',\n middlewares: data.middlewares || [],\n });\n}\n\nexport function Patch(\n data: { path?: string; middlewares?: MiddlewareProvider[] } = {}\n): MethodDecorator {\n return createHttpDecorator({\n methods: ['PATCH'],\n path: data.path || '/',\n middlewares: data.middlewares || [],\n });\n}\n\nexport function Delete(\n data: { path?: string; middlewares?: MiddlewareProvider[] } = {}\n): MethodDecorator {\n return createHttpDecorator({\n methods: ['DELETE'],\n path: data.path || '/',\n middlewares: data.middlewares || [],\n });\n}\n\nexport function Options(\n data: { path?: string; middlewares?: MiddlewareProvider[] } = {}\n): MethodDecorator {\n return createHttpDecorator({\n methods: ['OPTIONS'],\n path: data.path || '/',\n middlewares: data.middlewares || [],\n });\n}\n\nexport function createParamDecorator(func: () => Promise<any> | (() => any)): ParameterDecorator {\n return function MyParamDecorator(\n target: Object,\n propertyKey: string | symbol | undefined,\n parameterIndex: number\n ) {\n Reflect.set(target.constructor, `${propertyKey?.toString()}:${parameterIndex}:custom`, func);\n };\n}\n"],"mappings":"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","names":[]}
|