@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.
Files changed (45) hide show
  1. package/dist/bootstrap/HttpServerAdapter.d.ts +6 -0
  2. package/dist/bootstrap/HttpServerAdapter.js +5 -0
  3. package/dist/decorators/PathVariable.d.ts +1 -0
  4. package/dist/decorators/PathVariable.js +20 -0
  5. package/dist/decorators/RequestBody.d.ts +1 -0
  6. package/dist/decorators/RequestBody.js +16 -0
  7. package/dist/decorators/RequestMapping.d.ts +5 -0
  8. package/dist/decorators/RequestMapping.js +14 -0
  9. package/dist/decorators/RestController.d.ts +2 -0
  10. package/dist/decorators/RestController.js +11 -0
  11. package/dist/index.d.ts +9 -0
  12. package/dist/index.js +20 -0
  13. package/dist/metadatas/metadataKeys.d.ts +5 -0
  14. package/dist/metadatas/metadataKeys.js +8 -0
  15. package/dist/module/WebModule.d.ts +9 -0
  16. package/dist/module/WebModule.js +37 -0
  17. package/dist/pipelines/ControllerDiscovery.d.ts +3 -0
  18. package/dist/pipelines/ControllerDiscovery.js +16 -0
  19. package/dist/pipelines/Parameters/ParametersResolver.d.ts +5 -0
  20. package/dist/pipelines/Parameters/ParametersResolver.js +32 -0
  21. package/dist/pipelines/Parameters/Resolvers/BodyResolver.d.ts +6 -0
  22. package/dist/pipelines/Parameters/Resolvers/BodyResolver.js +14 -0
  23. package/dist/pipelines/Parameters/Resolvers/PathResolver.d.ts +6 -0
  24. package/dist/pipelines/Parameters/Resolvers/PathResolver.js +15 -0
  25. package/dist/pipelines/Router.d.ts +4 -0
  26. package/dist/pipelines/Router.js +27 -0
  27. package/dist/types/AnyController.d.ts +4 -0
  28. package/dist/types/AnyController.js +2 -0
  29. package/dist/types/HttpMethod.d.ts +2 -0
  30. package/dist/types/HttpMethod.js +2 -0
  31. package/dist/types/HttpRequest.d.ts +7 -0
  32. package/dist/types/HttpRequest.js +2 -0
  33. package/dist/types/OriginalMethod.d.ts +2 -0
  34. package/dist/types/OriginalMethod.js +2 -0
  35. package/dist/types/ParamMetadata.d.ts +8 -0
  36. package/dist/types/ParamMetadata.js +2 -0
  37. package/dist/types/ParamResolver.d.ts +8 -0
  38. package/dist/types/ParamResolver.js +2 -0
  39. package/dist/types/RouteDefinition.d.ts +9 -0
  40. package/dist/types/RouteDefinition.js +3 -0
  41. package/dist/types/SourceParam.d.ts +3 -0
  42. package/dist/types/SourceParam.js +2 -0
  43. package/dist/types/index.d.ts +8 -0
  44. package/dist/types/index.js +2 -0
  45. package/package.json +34 -0
@@ -0,0 +1,6 @@
1
+ import { RouteDefinition } from "../types";
2
+ export default abstract class HttpServerAdapter {
3
+ abstract registerRoute({}: RouteDefinition): void;
4
+ abstract listen(port: number): Promise<void>;
5
+ abstract logError(err: any): void;
6
+ }
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ class HttpServerAdapter {
4
+ }
5
+ exports.default = HttpServerAdapter;
@@ -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,5 @@
1
+ import type { HttpMethod } from "../types";
2
+ export default function RequestMapping({ httpMethod, path }: {
3
+ path?: `/${string}`;
4
+ httpMethod: HttpMethod;
5
+ }): MethodDecorator;
@@ -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,2 @@
1
+ export default function RestController(): ClassDecorator;
2
+ export default function RestController(path: `/${string}`): ClassDecorator;
@@ -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
+ }
@@ -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,5 @@
1
+ export declare const METADATA_KEYS: {
2
+ readonly ROUTES: "routes";
3
+ readonly CLASS_ROUTE: "class_route";
4
+ readonly PARAMS_VARIABLES: "params_variables";
5
+ };
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.METADATA_KEYS = void 0;
4
+ exports.METADATA_KEYS = {
5
+ ROUTES: "routes",
6
+ CLASS_ROUTE: "class_route",
7
+ PARAMS_VARIABLES: "params_variables"
8
+ };
@@ -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,3 @@
1
+ export default class ControllerDiscovery {
2
+ static resolve(): any[];
3
+ }
@@ -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,5 @@
1
+ import type { AnyController, HttpRequest } from "../../types";
2
+ export default class ParameterResolver {
3
+ private static resolvers;
4
+ static getArgs(req: HttpRequest, controller: AnyController, method: string | symbol): any[];
5
+ }
@@ -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,4 @@
1
+ import type { RouteDefinition } from "../types";
2
+ export default class Router {
3
+ static discover(): RouteDefinition[];
4
+ }
@@ -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,4 @@
1
+ type AnyController = {
2
+ [key: string | symbol]: (...args: any[]) => any;
3
+ };
4
+ export default AnyController;
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE';
2
+ export default HttpMethod;
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,7 @@
1
+ interface HttpRequest {
2
+ body?: any;
3
+ query?: Record<string, any>;
4
+ path?: Record<string, any>;
5
+ headers?: Record<string, string>;
6
+ }
7
+ export default HttpRequest;
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ type OriginalMethod = (...args: any[]) => any;
2
+ export default OriginalMethod;
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,8 @@
1
+ import SourceParam from "./SourceParam";
2
+ interface ParamMetadata {
3
+ parameterIndex: number;
4
+ name?: string;
5
+ type: any;
6
+ source: SourceParam;
7
+ }
8
+ export default ParamMetadata;
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -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,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,9 @@
1
+ import AnyController from "./AnyController";
2
+ import HttpMethod from "./HttpMethod";
3
+ interface RouteDefinition {
4
+ path: string;
5
+ httpMethod: HttpMethod;
6
+ method: string | symbol;
7
+ controller?: AnyController;
8
+ }
9
+ export default RouteDefinition;
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ ;
@@ -0,0 +1,3 @@
1
+ import HttpRequest from "./HttpRequest";
2
+ type SourceParam = keyof HttpRequest;
3
+ export default SourceParam;
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -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';
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
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
+ }