From cb97b238e94c198d551ad82f815e8b8595b11359 Mon Sep 17 00:00:00 2001 From: waiting <1661926154@qq.com> Date: Mon, 8 Jul 2019 15:32:24 +0800 Subject: [PATCH 1/9] refactor(midway-web): safelyGet() - add types - iterate with for-of instead of while - validate variable undefined with typeof - validate value undefined ahead of null check - return `void 0` instead of `undefined` --- packages/midway-web/src/utils.ts | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/packages/midway-web/src/utils.ts b/packages/midway-web/src/utils.ts index ef7a83fff7f8..98ee0c5dc834 100644 --- a/packages/midway-web/src/utils.ts +++ b/packages/midway-web/src/utils.ts @@ -52,23 +52,22 @@ export function isTypeScriptEnvironment(): boolean { * safelyGet('a.b',{a: {b: 2}}) // => 2 * safelyGet('a.b',{c: {b: 2}}) // => undefined */ -export function safelyGet(list, obj) { - if (arguments.length === 1) { return _obj => safelyGet(list, _obj); } - - if (obj === null || obj === undefined) { - return undefined; +export function safelyGet(list: string | string[], obj?: object): any { + if (arguments.length === 1) { + return (_obj: object) => safelyGet(list, _obj); } - let willReturn = obj; - let counter = 0; + if (typeof obj === 'undefined' || obj === null) { + return void 0; + } const pathArrValue = typeof list === 'string' ? list.split('.') : list; + let willReturn: any = obj; - while (counter < pathArrValue.length) { - if (willReturn === null || willReturn === undefined) { - return undefined; + for (const key of pathArrValue) { + if (typeof willReturn === 'undefined' || willReturn === null) { + return void 0; } - willReturn = willReturn[ pathArrValue[ counter ] ]; - counter++; + willReturn = willReturn[key]; } return willReturn; From 5b48eff711689c8372a3a68e19980a31abd82317 Mon Sep 17 00:00:00 2001 From: waiting <1661926154@qq.com> Date: Mon, 8 Jul 2019 15:59:58 +0800 Subject: [PATCH 2/9] fix(midway-web): path might be numeric string within safelyGet() - safelyGet(['a','1'], {a: {"1": 2}}) // => 2 - safelyGet(['a','1'], {a: {b: 2}}) // => undefined --- packages/midway-web/src/utils.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/midway-web/src/utils.ts b/packages/midway-web/src/utils.ts index 98ee0c5dc834..0e78a367c497 100644 --- a/packages/midway-web/src/utils.ts +++ b/packages/midway-web/src/utils.ts @@ -49,6 +49,8 @@ export function isTypeScriptEnvironment(): boolean { /** * safelyGet(['a','b'],{a: {b: 2}}) // => 2 * safelyGet(['a','b'],{c: {b: 2}}) // => undefined + * safelyGet(['a','1'],{a: {"1": 2}}) // => 2 + * safelyGet(['a','1'],{a: {b: 2}}) // => undefined * safelyGet('a.b',{a: {b: 2}}) // => 2 * safelyGet('a.b',{c: {b: 2}}) // => undefined */ @@ -57,7 +59,7 @@ export function safelyGet(list: string | string[], obj?: object): any { return (_obj: object) => safelyGet(list, _obj); } - if (typeof obj === 'undefined' || obj === null) { + if (typeof obj === 'undefined' || typeof obj !== 'object' || obj === null) { return void 0; } const pathArrValue = typeof list === 'string' ? list.split('.') : list; @@ -67,6 +69,9 @@ export function safelyGet(list: string | string[], obj?: object): any { if (typeof willReturn === 'undefined' || willReturn === null) { return void 0; } + else if (typeof willReturn !== 'object') { // for willReturn is string and key is numeric string + return void 0; + } willReturn = willReturn[key]; } From 61aedbd5182fe647b27ad9a65de2b3e3463ad4c7 Mon Sep 17 00:00:00 2001 From: waiting <1661926154@qq.com> Date: Mon, 8 Jul 2019 16:08:45 +0800 Subject: [PATCH 3/9] chore: update comment --- packages/midway-web/src/utils.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/midway-web/src/utils.ts b/packages/midway-web/src/utils.ts index 0e78a367c497..fa8eb29adb5f 100644 --- a/packages/midway-web/src/utils.ts +++ b/packages/midway-web/src/utils.ts @@ -69,7 +69,8 @@ export function safelyGet(list: string | string[], obj?: object): any { if (typeof willReturn === 'undefined' || willReturn === null) { return void 0; } - else if (typeof willReturn !== 'object') { // for willReturn is string and key is numeric string + // for willReturn is string and key is numeric string, and willReturn[offset] maybe valid string, but not expected + else if (typeof willReturn !== 'object') { return void 0; } willReturn = willReturn[key]; From ea511fa7dbe17203316bf02ce87679164e5fc2bd Mon Sep 17 00:00:00 2001 From: waiting <1661926154@qq.com> Date: Mon, 8 Jul 2019 18:45:46 +0800 Subject: [PATCH 4/9] feat(types): assign egg['Context'] to types of parameter of context within type of KoaMiddleware --- packages/midway-decorator/package.json | 1 + packages/midway-decorator/src/interface.ts | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/midway-decorator/package.json b/packages/midway-decorator/package.json index 053219659328..f41820b02564 100644 --- a/packages/midway-decorator/package.json +++ b/packages/midway-decorator/package.json @@ -16,6 +16,7 @@ "injection": "^1.4.2" }, "devDependencies": { + "egg": "^2.20.0", "midway-bin": "^1.5.6" }, "keywords": [ diff --git a/packages/midway-decorator/src/interface.ts b/packages/midway-decorator/src/interface.ts index 5d9082566f55..dbfcc8c48aa1 100644 --- a/packages/midway-decorator/src/interface.ts +++ b/packages/midway-decorator/src/interface.ts @@ -1 +1,3 @@ -export type KoaMiddleware = (context: any, next: () => Promise) => any; +import {Context} from 'egg'; + +export type KoaMiddleware = (context: Context, next: () => Promise) => void; From 90b4e288ed08eb711e29ea0fa52dd74108d160e1 Mon Sep 17 00:00:00 2001 From: waiting <1661926154@qq.com> Date: Mon, 8 Jul 2019 18:49:50 +0800 Subject: [PATCH 5/9] feat(types): export and use type MiddlewareParamArray - update types of parameters of MidwayWebLoader.handlerWebMiddleware() - fix `no-shadow` error relative to variable `middlewares` --- .../midway-decorator/src/web/requestMapping.ts | 8 +++++--- packages/midway-web/src/interface.ts | 3 ++- packages/midway-web/src/loader/webLoader.ts | 17 +++++++++-------- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/packages/midway-decorator/src/web/requestMapping.ts b/packages/midway-decorator/src/web/requestMapping.ts index 97bcb87ae900..0ac6245f58b0 100644 --- a/packages/midway-decorator/src/web/requestMapping.ts +++ b/packages/midway-decorator/src/web/requestMapping.ts @@ -5,12 +5,14 @@ import { attachClassMetadata } from 'injection'; import { WEB_ROUTER_KEY } from '../constant'; import { KoaMiddleware } from '../interface'; +export type MiddlewareParamArray = Array + export interface RouterOption { path?: string; requestMethod: string; routerName?: string; method: string; - middleware?: Array; + middleware?: MiddlewareParamArray; } export const RequestMethod = { @@ -40,7 +42,7 @@ export interface RequestMappingMetadata { [PATH_METADATA]?: string; [METHOD_METADATA]: string; [ROUTER_NAME_METADATA]?: string; - [ROUTER_MIDDLEWARE]?: Array; + [ROUTER_MIDDLEWARE]?: MiddlewareParamArray; } export const RequestMapping = ( @@ -68,7 +70,7 @@ const createMappingDecorator = (method: string) => ( path?: string, routerOptions: { routerName?: string; - middleware?: Array; + middleware?: MiddlewareParamArray; } = {middleware: []} ): MethodDecorator => { return RequestMapping({ diff --git a/packages/midway-web/src/interface.ts b/packages/midway-web/src/interface.ts index 2d72bfe0e12a..d97f229486ab 100644 --- a/packages/midway-web/src/interface.ts +++ b/packages/midway-web/src/interface.ts @@ -1,8 +1,9 @@ import {EggLoaderOptions} from 'egg-core'; import {IApplicationContext} from 'injection'; +import {KoaMiddleware} from '@midwayjs/decorator'; export interface WebMiddleware { - resolve(): (context: any, next: () => Promise) => any; + resolve(): KoaMiddleware; } export interface MidwayLoaderOptions extends EggLoaderOptions { diff --git a/packages/midway-web/src/loader/webLoader.ts b/packages/midway-web/src/loader/webLoader.ts index a4a3f21c055a..f5a8c07ca7ae 100644 --- a/packages/midway-web/src/loader/webLoader.ts +++ b/packages/midway-web/src/loader/webLoader.ts @@ -3,6 +3,7 @@ import { CONTROLLER_KEY, ControllerOption, KoaMiddleware, + MiddlewareParamArray, PRIORITY_KEY, RouterOption, WEB_ROUTER_KEY, @@ -194,7 +195,7 @@ export class MidwayWebLoader extends EggLoader { if (newRouter) { // implement middleware in controller - const middlewares = controllerOption.routerOptions.middleware; + const middlewares: MiddlewareParamArray | void = controllerOption.routerOptions.middleware; await this.handlerWebMiddleware(middlewares, (middlewareImpl: KoaMiddleware) => { newRouter.use(middlewareImpl); }); @@ -205,10 +206,10 @@ export class MidwayWebLoader extends EggLoader { if (webRouterInfo && typeof webRouterInfo[Symbol.iterator] === 'function') { for (const webRouter of webRouterInfo) { // get middleware - const middlewares = webRouter.middleware; + const middlewares2: MiddlewareParamArray | void = webRouter.middleware; const methodMiddlwares = []; - await this.handlerWebMiddleware(middlewares, (middlewareImpl: KoaMiddleware) => { + await this.handlerWebMiddleware(middlewares2, (middlewareImpl: KoaMiddleware) => { methodMiddlwares.push(middlewareImpl); }); @@ -241,9 +242,9 @@ export class MidwayWebLoader extends EggLoader { } - private async handlerWebMiddleware( - middlewares: T[], - handlerCallback: (ps: T | ReturnType) => any, + private async handlerWebMiddleware( + middlewares: MiddlewareParamArray | void, + handlerCallback: (middlewareImpl: KoaMiddleware) => void, ): Promise { if (middlewares && middlewares.length) { @@ -252,8 +253,8 @@ export class MidwayWebLoader extends EggLoader { // web function middleware handlerCallback(middleware); } else { - const middlewareImpl: WebMiddleware = await this.applicationContext.getAsync(middleware); - if (middlewareImpl && middlewareImpl.resolve) { + const middlewareImpl: WebMiddleware | void = await this.applicationContext.getAsync(middleware); + if (middlewareImpl && typeof middlewareImpl.resolve === 'function') { handlerCallback(middlewareImpl.resolve()); } } From 6c963e5197e7de070a70dffa21973c46bd0d810f Mon Sep 17 00:00:00 2001 From: waiting <1661926154@qq.com> Date: Tue, 9 Jul 2019 10:27:53 +0800 Subject: [PATCH 6/9] fix(types): use generic as typeof context within KoaMiddleware --- packages/midway-decorator/src/interface.ts | 5 ++--- packages/midway-decorator/src/web/controller.ts | 6 +++--- packages/midway-decorator/src/web/requestMapping.ts | 9 ++++----- packages/midway-web/src/interface.ts | 9 +++++++-- packages/midway-web/src/loader/webLoader.ts | 12 +++++------- 5 files changed, 21 insertions(+), 20 deletions(-) diff --git a/packages/midway-decorator/src/interface.ts b/packages/midway-decorator/src/interface.ts index dbfcc8c48aa1..5c681e1e781b 100644 --- a/packages/midway-decorator/src/interface.ts +++ b/packages/midway-decorator/src/interface.ts @@ -1,3 +1,2 @@ -import {Context} from 'egg'; - -export type KoaMiddleware = (context: Context, next: () => Promise) => void; +export type KoaMiddleware = (context: T, next: () => Promise) => void; +export type KoaMiddlewareParamArray = Array> diff --git a/packages/midway-decorator/src/web/controller.ts b/packages/midway-decorator/src/web/controller.ts index 24bcc8ab739a..73fc19feed92 100644 --- a/packages/midway-decorator/src/web/controller.ts +++ b/packages/midway-decorator/src/web/controller.ts @@ -1,18 +1,18 @@ import { saveClassMetadata, saveModule, scope, ScopeEnum } from 'injection'; import { CONTROLLER_KEY } from '../constant'; -import { KoaMiddleware } from '../interface'; +import { KoaMiddlewareParamArray } from '../interface'; export interface ControllerOption { prefix: string; routerOptions: { sensitive?: boolean; - middleware?: Array + middleware?: KoaMiddlewareParamArray }; } export function controller(prefix: string, routerOptions: { sensitive?: boolean, - middleware?: Array + middleware?: KoaMiddlewareParamArray } = {middleware: [], sensitive: true} ): ClassDecorator { return (target: any) => { diff --git a/packages/midway-decorator/src/web/requestMapping.ts b/packages/midway-decorator/src/web/requestMapping.ts index 0ac6245f58b0..f7de8e6dcbec 100644 --- a/packages/midway-decorator/src/web/requestMapping.ts +++ b/packages/midway-decorator/src/web/requestMapping.ts @@ -3,16 +3,15 @@ */ import { attachClassMetadata } from 'injection'; import { WEB_ROUTER_KEY } from '../constant'; -import { KoaMiddleware } from '../interface'; +import { KoaMiddlewareParamArray } from '../interface'; -export type MiddlewareParamArray = Array export interface RouterOption { path?: string; requestMethod: string; routerName?: string; method: string; - middleware?: MiddlewareParamArray; + middleware?: KoaMiddlewareParamArray; } export const RequestMethod = { @@ -42,7 +41,7 @@ export interface RequestMappingMetadata { [PATH_METADATA]?: string; [METHOD_METADATA]: string; [ROUTER_NAME_METADATA]?: string; - [ROUTER_MIDDLEWARE]?: MiddlewareParamArray; + [ROUTER_MIDDLEWARE]?: KoaMiddlewareParamArray; } export const RequestMapping = ( @@ -70,7 +69,7 @@ const createMappingDecorator = (method: string) => ( path?: string, routerOptions: { routerName?: string; - middleware?: MiddlewareParamArray; + middleware?: KoaMiddlewareParamArray; } = {middleware: []} ): MethodDecorator => { return RequestMapping({ diff --git a/packages/midway-web/src/interface.ts b/packages/midway-web/src/interface.ts index d97f229486ab..f37b8f1d01f0 100644 --- a/packages/midway-web/src/interface.ts +++ b/packages/midway-web/src/interface.ts @@ -1,9 +1,14 @@ +import {Context} from 'egg' import {EggLoaderOptions} from 'egg-core'; import {IApplicationContext} from 'injection'; -import {KoaMiddleware} from '@midwayjs/decorator'; +import {KoaMiddleware, KoaMiddlewareParamArray} from '@midwayjs/decorator'; + + +export type Middleware = KoaMiddleware +export type MiddlewareParamArray = KoaMiddlewareParamArray export interface WebMiddleware { - resolve(): KoaMiddleware; + resolve(): Middleware; } export interface MidwayLoaderOptions extends EggLoaderOptions { diff --git a/packages/midway-web/src/loader/webLoader.ts b/packages/midway-web/src/loader/webLoader.ts index f5a8c07ca7ae..041742673312 100644 --- a/packages/midway-web/src/loader/webLoader.ts +++ b/packages/midway-web/src/loader/webLoader.ts @@ -2,8 +2,6 @@ import { EggRouter as Router } from '@eggjs/router'; import { CONTROLLER_KEY, ControllerOption, - KoaMiddleware, - MiddlewareParamArray, PRIORITY_KEY, RouterOption, WEB_ROUTER_KEY, @@ -15,7 +13,7 @@ import * as fs from 'fs'; import { getClassMetadata, getMethodDataFromClass, getProviderId, listModule } from 'injection'; import { ContainerLoader, MidwayHandlerKey, MidwayContainer } from 'midway-core'; import * as path from 'path'; -import { MidwayLoaderOptions, WebMiddleware } from '../interface'; +import { Middleware, MiddlewareParamArray, MidwayLoaderOptions, WebMiddleware } from '../interface'; import { isTypeScriptEnvironment, safelyGet } from '../utils'; import { EggAppInfo } from 'egg'; @@ -196,7 +194,7 @@ export class MidwayWebLoader extends EggLoader { if (newRouter) { // implement middleware in controller const middlewares: MiddlewareParamArray | void = controllerOption.routerOptions.middleware; - await this.handlerWebMiddleware(middlewares, (middlewareImpl: KoaMiddleware) => { + await this.handlerWebMiddleware(middlewares, (middlewareImpl: Middleware) => { newRouter.use(middlewareImpl); }); @@ -207,9 +205,9 @@ export class MidwayWebLoader extends EggLoader { for (const webRouter of webRouterInfo) { // get middleware const middlewares2: MiddlewareParamArray | void = webRouter.middleware; - const methodMiddlwares = []; + const methodMiddlwares: Middleware[] = []; - await this.handlerWebMiddleware(middlewares2, (middlewareImpl: KoaMiddleware) => { + await this.handlerWebMiddleware(middlewares2, (middlewareImpl: Middleware) => { methodMiddlwares.push(middlewareImpl); }); @@ -244,7 +242,7 @@ export class MidwayWebLoader extends EggLoader { private async handlerWebMiddleware( middlewares: MiddlewareParamArray | void, - handlerCallback: (middlewareImpl: KoaMiddleware) => void, + handlerCallback: (middlewareImpl: Middleware) => void, ): Promise { if (middlewares && middlewares.length) { From 167caff206f3aae09d9820353dc658c8130095c5 Mon Sep 17 00:00:00 2001 From: waiting <1661926154@qq.com> Date: Tue, 9 Jul 2019 15:10:17 +0800 Subject: [PATCH 7/9] chore: update comment of naming --- packages/midway-web/src/loader/webLoader.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/midway-web/src/loader/webLoader.ts b/packages/midway-web/src/loader/webLoader.ts index 041742673312..7c578924938e 100644 --- a/packages/midway-web/src/loader/webLoader.ts +++ b/packages/midway-web/src/loader/webLoader.ts @@ -279,7 +279,7 @@ export class MidwayWebLoader extends EggLoader { /** * wrap controller string to middleware function - * @param controllerMapping like xxxController.index + * @param controllerMapping like FooController.index */ public generateController(controllerMapping: string, routeArgsInfo?: RouterParamValue[]) { const [controllerId, methodName] = controllerMapping.split('.'); From dd7172e3d9dd8559b08f978e548cfe37d1939b5e Mon Sep 17 00:00:00 2001 From: waiting <1661926154@qq.com> Date: Tue, 9 Jul 2019 15:20:37 +0800 Subject: [PATCH 8/9] chore(types): assign ReturnType of generateController() --- packages/midway-web/src/loader/webLoader.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/midway-web/src/loader/webLoader.ts b/packages/midway-web/src/loader/webLoader.ts index 7c578924938e..2e9823efc726 100644 --- a/packages/midway-web/src/loader/webLoader.ts +++ b/packages/midway-web/src/loader/webLoader.ts @@ -6,7 +6,7 @@ import { RouterOption, WEB_ROUTER_KEY, WEB_ROUTER_PARAM_KEY, - RouterParamValue + RouterParamValue, } from '@midwayjs/decorator'; import * as extend from 'extend2'; import * as fs from 'fs'; @@ -281,7 +281,7 @@ export class MidwayWebLoader extends EggLoader { * wrap controller string to middleware function * @param controllerMapping like FooController.index */ - public generateController(controllerMapping: string, routeArgsInfo?: RouterParamValue[]) { + public generateController(controllerMapping: string, routeArgsInfo?: RouterParamValue[]): Middleware { const [controllerId, methodName] = controllerMapping.split('.'); return async (ctx, next) => { const args = [ctx, next]; From 9c4852604d1675e62bd42c07c8cec2c133a45e7c Mon Sep 17 00:00:00 2001 From: waiting <1661926154@qq.com> Date: Tue, 9 Jul 2019 15:32:50 +0800 Subject: [PATCH 9/9] chore: prune --- packages/midway-decorator/package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/midway-decorator/package.json b/packages/midway-decorator/package.json index f41820b02564..053219659328 100644 --- a/packages/midway-decorator/package.json +++ b/packages/midway-decorator/package.json @@ -16,7 +16,6 @@ "injection": "^1.4.2" }, "devDependencies": { - "egg": "^2.20.0", "midway-bin": "^1.5.6" }, "keywords": [