@midnight-jd/web 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/bootstrap/HttpServerAdapter.d.ts +6 -0
- package/dist/bootstrap/HttpServerAdapter.js +5 -0
- package/dist/decorators/PathVariable.d.ts +1 -0
- package/dist/decorators/PathVariable.js +20 -0
- package/dist/decorators/RequestBody.d.ts +1 -0
- package/dist/decorators/RequestBody.js +16 -0
- package/dist/decorators/RequestMapping.d.ts +5 -0
- package/dist/decorators/RequestMapping.js +14 -0
- package/dist/decorators/RestController.d.ts +2 -0
- package/dist/decorators/RestController.js +11 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +20 -0
- package/dist/metadatas/metadataKeys.d.ts +5 -0
- package/dist/metadatas/metadataKeys.js +8 -0
- package/dist/module/WebModule.d.ts +9 -0
- package/dist/module/WebModule.js +37 -0
- package/dist/pipelines/ControllerDiscovery.d.ts +3 -0
- package/dist/pipelines/ControllerDiscovery.js +16 -0
- package/dist/pipelines/Parameters/ParametersResolver.d.ts +5 -0
- package/dist/pipelines/Parameters/ParametersResolver.js +32 -0
- package/dist/pipelines/Parameters/Resolvers/BodyResolver.d.ts +6 -0
- package/dist/pipelines/Parameters/Resolvers/BodyResolver.js +14 -0
- package/dist/pipelines/Parameters/Resolvers/PathResolver.d.ts +6 -0
- package/dist/pipelines/Parameters/Resolvers/PathResolver.js +15 -0
- package/dist/pipelines/Router.d.ts +4 -0
- package/dist/pipelines/Router.js +27 -0
- package/dist/types/AnyController.d.ts +4 -0
- package/dist/types/AnyController.js +2 -0
- package/dist/types/HttpMethod.d.ts +2 -0
- package/dist/types/HttpMethod.js +2 -0
- package/dist/types/HttpRequest.d.ts +7 -0
- package/dist/types/HttpRequest.js +2 -0
- package/dist/types/OriginalMethod.d.ts +2 -0
- package/dist/types/OriginalMethod.js +2 -0
- package/dist/types/ParamMetadata.d.ts +8 -0
- package/dist/types/ParamMetadata.js +2 -0
- package/dist/types/ParamResolver.d.ts +8 -0
- package/dist/types/ParamResolver.js +2 -0
- package/dist/types/RouteDefinition.d.ts +9 -0
- package/dist/types/RouteDefinition.js +3 -0
- package/dist/types/SourceParam.d.ts +3 -0
- package/dist/types/SourceParam.js +2 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.js +2 -0
- package/package.json +34 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function PathVariable(name: string): ParameterDecorator;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = PathVariable;
|
|
4
|
+
const metadataKeys_1 = require("../metadatas/metadataKeys");
|
|
5
|
+
function PathVariable(name) {
|
|
6
|
+
return function (target, propertyKey, parameterIndex) {
|
|
7
|
+
if (!propertyKey)
|
|
8
|
+
return;
|
|
9
|
+
const existingParams = Reflect.getOwnMetadata(metadataKeys_1.METADATA_KEYS.PARAMS_VARIABLES, target, propertyKey) ?? [];
|
|
10
|
+
const types = Reflect.getMetadata("design:paramtypes", target, propertyKey);
|
|
11
|
+
const type = types[parameterIndex];
|
|
12
|
+
existingParams.push({
|
|
13
|
+
name,
|
|
14
|
+
type,
|
|
15
|
+
source: 'path',
|
|
16
|
+
parameterIndex,
|
|
17
|
+
});
|
|
18
|
+
Reflect.defineMetadata(metadataKeys_1.METADATA_KEYS.PARAMS_VARIABLES, existingParams, target, propertyKey);
|
|
19
|
+
};
|
|
20
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function RequestBody(target: Object, propertyKey: string | symbol, parameterIndex: number): void;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = RequestBody;
|
|
4
|
+
const metadataKeys_1 = require("../metadatas/metadataKeys");
|
|
5
|
+
function RequestBody(target, propertyKey, parameterIndex) {
|
|
6
|
+
const existingParams = Reflect.getOwnMetadata(metadataKeys_1.METADATA_KEYS.PARAMS_VARIABLES, target, propertyKey) ?? [];
|
|
7
|
+
const types = Reflect.getMetadata("design:paramtypes", target, propertyKey);
|
|
8
|
+
const type = types[parameterIndex];
|
|
9
|
+
existingParams.push({
|
|
10
|
+
name: undefined,
|
|
11
|
+
type,
|
|
12
|
+
source: 'body',
|
|
13
|
+
parameterIndex,
|
|
14
|
+
});
|
|
15
|
+
Reflect.defineMetadata(metadataKeys_1.METADATA_KEYS.PARAMS_VARIABLES, existingParams, target, propertyKey);
|
|
16
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = RequestMapping;
|
|
4
|
+
const metadataKeys_1 = require("../metadatas/metadataKeys");
|
|
5
|
+
function RequestMapping({ httpMethod, path }) {
|
|
6
|
+
return function (target, propertyId, descriptor) {
|
|
7
|
+
const originalMethod = descriptor.value;
|
|
8
|
+
if (!originalMethod)
|
|
9
|
+
return;
|
|
10
|
+
const existingRoutes = Reflect.getMetadata('routes', target) || [];
|
|
11
|
+
existingRoutes.push({ path: path ?? '', httpMethod, method: propertyId });
|
|
12
|
+
Reflect.defineMetadata(metadataKeys_1.METADATA_KEYS.ROUTES, existingRoutes, target);
|
|
13
|
+
};
|
|
14
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = RestController;
|
|
4
|
+
const core_1 = require("@midnight.jd/core");
|
|
5
|
+
const metadataKeys_1 = require("../metadatas/metadataKeys");
|
|
6
|
+
function RestController(path = '/') {
|
|
7
|
+
return (target) => {
|
|
8
|
+
Reflect.defineMetadata(metadataKeys_1.METADATA_KEYS.CLASS_ROUTE, path, target);
|
|
9
|
+
(0, core_1.Controller)()(target);
|
|
10
|
+
};
|
|
11
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { default as Module } from './module/WebModule';
|
|
2
|
+
export { default as HttpServerAdapter } from './bootstrap/HttpServerAdapter';
|
|
3
|
+
export { default as RequestBody } from './decorators/RequestBody';
|
|
4
|
+
export { default as PathVariable } from './decorators/PathVariable';
|
|
5
|
+
export { default as RequestMapping } from './decorators/RequestMapping';
|
|
6
|
+
export { default as RestController } from './decorators/RestController';
|
|
7
|
+
export { default as ParameterResolver } from './pipelines/Parameters/ParametersResolver';
|
|
8
|
+
export { default as HttpRequest } from './types/HttpRequest';
|
|
9
|
+
export { default as RouteDefinition } from './types/RouteDefinition';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ParameterResolver = exports.RestController = exports.RequestMapping = exports.PathVariable = exports.RequestBody = exports.HttpServerAdapter = exports.Module = void 0;
|
|
7
|
+
var WebModule_1 = require("./module/WebModule");
|
|
8
|
+
Object.defineProperty(exports, "Module", { enumerable: true, get: function () { return __importDefault(WebModule_1).default; } });
|
|
9
|
+
var HttpServerAdapter_1 = require("./bootstrap/HttpServerAdapter");
|
|
10
|
+
Object.defineProperty(exports, "HttpServerAdapter", { enumerable: true, get: function () { return __importDefault(HttpServerAdapter_1).default; } });
|
|
11
|
+
var RequestBody_1 = require("./decorators/RequestBody");
|
|
12
|
+
Object.defineProperty(exports, "RequestBody", { enumerable: true, get: function () { return __importDefault(RequestBody_1).default; } });
|
|
13
|
+
var PathVariable_1 = require("./decorators/PathVariable");
|
|
14
|
+
Object.defineProperty(exports, "PathVariable", { enumerable: true, get: function () { return __importDefault(PathVariable_1).default; } });
|
|
15
|
+
var RequestMapping_1 = require("./decorators/RequestMapping");
|
|
16
|
+
Object.defineProperty(exports, "RequestMapping", { enumerable: true, get: function () { return __importDefault(RequestMapping_1).default; } });
|
|
17
|
+
var RestController_1 = require("./decorators/RestController");
|
|
18
|
+
Object.defineProperty(exports, "RestController", { enumerable: true, get: function () { return __importDefault(RestController_1).default; } });
|
|
19
|
+
var ParametersResolver_1 = require("./pipelines/Parameters/ParametersResolver");
|
|
20
|
+
Object.defineProperty(exports, "ParameterResolver", { enumerable: true, get: function () { return __importDefault(ParametersResolver_1).default; } });
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type MidnightModule } from "@midnight.jd/core";
|
|
2
|
+
import HttpServerAdapter from "../bootstrap/HttpServerAdapter";
|
|
3
|
+
export default class WebModule implements MidnightModule {
|
|
4
|
+
private readonly serverAdapter;
|
|
5
|
+
name: string;
|
|
6
|
+
dependencies: string[];
|
|
7
|
+
constructor(serverAdapter: HttpServerAdapter);
|
|
8
|
+
init(): Promise<void>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
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;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
const core_1 = require("@midnight.jd/core");
|
|
16
|
+
const Router_1 = __importDefault(require("../pipelines/Router"));
|
|
17
|
+
const HttpServerAdapter_1 = __importDefault(require("../bootstrap/HttpServerAdapter"));
|
|
18
|
+
let WebModule = class WebModule {
|
|
19
|
+
serverAdapter;
|
|
20
|
+
name = 'web';
|
|
21
|
+
dependencies = ['core', 'conversor'];
|
|
22
|
+
constructor(serverAdapter) {
|
|
23
|
+
this.serverAdapter = serverAdapter;
|
|
24
|
+
}
|
|
25
|
+
async init() {
|
|
26
|
+
const routes = Router_1.default.discover();
|
|
27
|
+
for (const route of routes) {
|
|
28
|
+
this.serverAdapter.registerRoute(route);
|
|
29
|
+
}
|
|
30
|
+
await this.serverAdapter.listen(8080);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
WebModule = __decorate([
|
|
34
|
+
core_1.Module,
|
|
35
|
+
__metadata("design:paramtypes", [HttpServerAdapter_1.default])
|
|
36
|
+
], WebModule);
|
|
37
|
+
exports.default = WebModule;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const core_1 = require("@midnight.jd/core");
|
|
4
|
+
class ControllerDiscovery {
|
|
5
|
+
static resolve() {
|
|
6
|
+
const controllers = [];
|
|
7
|
+
const beans = core_1.BeanRegistry.getAll();
|
|
8
|
+
for (const bean of beans.values()) {
|
|
9
|
+
if (bean.stereoType != 'controller')
|
|
10
|
+
continue;
|
|
11
|
+
controllers.push(core_1.Container.get(bean.token));
|
|
12
|
+
}
|
|
13
|
+
return controllers;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.default = ControllerDiscovery;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const metadataKeys_1 = require("../../metadatas/metadataKeys");
|
|
7
|
+
const PathResolver_1 = __importDefault(require("./Resolvers/PathResolver"));
|
|
8
|
+
const BodyResolver_1 = __importDefault(require("./Resolvers/BodyResolver"));
|
|
9
|
+
class ParameterResolver {
|
|
10
|
+
static resolvers;
|
|
11
|
+
static {
|
|
12
|
+
this.resolvers = [
|
|
13
|
+
new PathResolver_1.default(),
|
|
14
|
+
new BodyResolver_1.default()
|
|
15
|
+
];
|
|
16
|
+
}
|
|
17
|
+
static getArgs(req, controller, method) {
|
|
18
|
+
const resolvedParams = [];
|
|
19
|
+
const params = Reflect.getMetadata(metadataKeys_1.METADATA_KEYS.PARAMS_VARIABLES, controller, method);
|
|
20
|
+
if (!params)
|
|
21
|
+
return resolvedParams;
|
|
22
|
+
const orderedParams = [...params].sort((a, b) => a.parameterIndex - b.parameterIndex);
|
|
23
|
+
for (const param of orderedParams) {
|
|
24
|
+
const resolver = this.resolvers.find(resolver => resolver.source == param.source);
|
|
25
|
+
if (!resolver)
|
|
26
|
+
throw new Error(`No resolver found for source "${param.source}"`);
|
|
27
|
+
resolvedParams.push(resolver.resolver(req, param));
|
|
28
|
+
}
|
|
29
|
+
return resolvedParams;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
exports.default = ParameterResolver;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { HttpRequest, ParamMetadata, ParamResolver, SourceParam } from "../../../types";
|
|
2
|
+
export default class BodyResolver implements ParamResolver {
|
|
3
|
+
readonly source: SourceParam;
|
|
4
|
+
constructor();
|
|
5
|
+
resolver(req: HttpRequest, paramMetadata: ParamMetadata): unknown;
|
|
6
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const conversor_1 = require("@midnight.jd/conversor");
|
|
4
|
+
class BodyResolver {
|
|
5
|
+
source;
|
|
6
|
+
constructor() {
|
|
7
|
+
this.source = 'body';
|
|
8
|
+
}
|
|
9
|
+
resolver(req, paramMetadata) {
|
|
10
|
+
const source = req[this.source];
|
|
11
|
+
return conversor_1.Conversor.convert(source, paramMetadata.type);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
exports.default = BodyResolver;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { HttpRequest, ParamMetadata, ParamResolver, SourceParam } from "../../../types";
|
|
2
|
+
export default class PathResolver implements ParamResolver {
|
|
3
|
+
readonly source: SourceParam;
|
|
4
|
+
constructor();
|
|
5
|
+
resolver(req: HttpRequest, paramMetadata: ParamMetadata): unknown;
|
|
6
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const conversor_1 = require("@midnight.jd/conversor");
|
|
4
|
+
class PathResolver {
|
|
5
|
+
source;
|
|
6
|
+
constructor() {
|
|
7
|
+
this.source = 'path';
|
|
8
|
+
}
|
|
9
|
+
resolver(req, paramMetadata) {
|
|
10
|
+
const source = req[this.source];
|
|
11
|
+
const rawValue = source[paramMetadata.name];
|
|
12
|
+
return conversor_1.Conversor.convert(rawValue, paramMetadata.type);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
exports.default = PathResolver;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const metadataKeys_1 = require("../metadatas/metadataKeys");
|
|
7
|
+
const ControllerDiscovery_1 = __importDefault(require("./ControllerDiscovery"));
|
|
8
|
+
class Router {
|
|
9
|
+
static discover() {
|
|
10
|
+
const controlles = ControllerDiscovery_1.default.resolve();
|
|
11
|
+
const routes = [];
|
|
12
|
+
for (const controller of controlles) {
|
|
13
|
+
const classPath = Reflect.getMetadata(metadataKeys_1.METADATA_KEYS.CLASS_ROUTE, controller.constructor);
|
|
14
|
+
const definitions = Reflect.getMetadata(metadataKeys_1.METADATA_KEYS.ROUTES, controller) ?? [];
|
|
15
|
+
for (const { httpMethod, method, path: routePath } of definitions) {
|
|
16
|
+
routes.push({
|
|
17
|
+
httpMethod,
|
|
18
|
+
path: `${classPath ?? '/'}${routePath ?? ''}`,
|
|
19
|
+
controller,
|
|
20
|
+
method,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return routes;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.default = Router;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import HttpRequest from "./HttpRequest";
|
|
2
|
+
import ParamMetadata from "./ParamMetadata";
|
|
3
|
+
import SourceParam from "./SourceParam";
|
|
4
|
+
interface ParamResolver {
|
|
5
|
+
readonly source: SourceParam;
|
|
6
|
+
resolver(req: HttpRequest, paramMetadata: ParamMetadata): any;
|
|
7
|
+
}
|
|
8
|
+
export default ParamResolver;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type { default as HttpMethod } from './HttpMethod';
|
|
2
|
+
export type { default as HttpRequest } from './HttpRequest';
|
|
3
|
+
export type { default as RouteDefinition } from './RouteDefinition';
|
|
4
|
+
export type { default as AnyController } from './AnyController';
|
|
5
|
+
export type { default as OriginalMethod } from './OriginalMethod';
|
|
6
|
+
export type { default as SourceParam } from './SourceParam';
|
|
7
|
+
export type { default as ParamMetadata } from './ParamMetadata';
|
|
8
|
+
export type { default as ParamResolver } from './ParamResolver';
|
package/package.json
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@midnight-jd/web",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Web module for Spring TS",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist"
|
|
9
|
+
],
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"dev": "tsc -w",
|
|
13
|
+
"clean": "rm -rf dist"
|
|
14
|
+
},
|
|
15
|
+
"keywords": [
|
|
16
|
+
"spring",
|
|
17
|
+
"typescript",
|
|
18
|
+
"web",
|
|
19
|
+
"http",
|
|
20
|
+
"mvc",
|
|
21
|
+
"controllers"
|
|
22
|
+
],
|
|
23
|
+
"author": "Felippe Ramos",
|
|
24
|
+
"license": "MIT",
|
|
25
|
+
"peerDependencies": {
|
|
26
|
+
"@midnight.jd/core": "^0.0.1",
|
|
27
|
+
"@midnight.jd/conversor": "^0.0.1",
|
|
28
|
+
"reflect-metadata": "^0.2.2"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@types/node": "^25.6.0",
|
|
32
|
+
"typescript": "^6.0.3"
|
|
33
|
+
}
|
|
34
|
+
}
|