From eb1eae736c0fc541e6d21fb726d52d971d6a95da Mon Sep 17 00:00:00 2001 From: Haoliang Gao Date: Tue, 9 Oct 2018 20:25:08 +0800 Subject: [PATCH] refactor(typescript): use egg-logger definition (#3078) --- index.d.ts | 69 +++++++++++-------- test/fixtures/apps/app-ts/app.ts | 8 +++ .../apps/app-ts/app/controller/foo.ts | 12 ++++ test/fixtures/apps/app-ts/lib/export-class.ts | 26 +++++++ test/fixtures/apps/app-ts/lib/logger.ts | 16 +++++ test/fixtures/apps/app-ts/tsconfig.json | 6 +- 6 files changed, 104 insertions(+), 33 deletions(-) create mode 100644 test/fixtures/apps/app-ts/app.ts create mode 100644 test/fixtures/apps/app-ts/lib/export-class.ts create mode 100644 test/fixtures/apps/app-ts/lib/logger.ts diff --git a/index.d.ts b/index.d.ts index 0f317902bf..37bfa12153 100644 --- a/index.d.ts +++ b/index.d.ts @@ -2,9 +2,10 @@ import * as accepts from 'accepts'; import * as KoaApplication from 'koa'; import * as KoaRouter from 'koa-router'; import { EventEmitter } from 'events' -import { RequestOptions } from 'urllib'; import { Readable } from 'stream'; import { Socket } from 'net'; +import { EggLogger, EggLoggers, LoggerLevel as EggLoggerLevel, EggContextLogger } from 'egg-logger'; +import { HttpClient2, RequestOptions } from 'urllib'; import EggCookies = require('egg-cookies'); import 'egg-onerror'; import 'egg-session'; @@ -26,6 +27,13 @@ declare module 'egg' { // Remove specific property from the specific class type RemoveSpecProp = Pick>; + class EggHttpClient extends HttpClient2 { + constructor(app: Application); + } + class EggContextHttpClient extends HttpClient2 { + constructor(ctx: Context); + } + /** * BaseContextClass is a base class that can be extended, * it's instantiated in context level, @@ -55,18 +63,11 @@ declare module 'egg' { /** * logger */ - logger: Logger; + logger: EggLogger; constructor(ctx: Context); } - export interface Logger { - info(msg: any, ...args: any[]): void; - warn(msg: any, ...args: any[]): void; - debug(msg: any, ...args: any[]): void; - error(msg: any, ...args: any[]): void; - } - export type RequestArrayBody = any[]; export type RequestObjectBody = PlainObject; export interface Request extends KoaApplication.Request { // tslint:disable-line @@ -184,7 +185,7 @@ declare module 'egg' { renderString(name: string, locals?: any, options?: any): Promise; } - export type LoggerLevel = 'DEBUG' | 'INFO' | 'WARN' | 'ERROR' | 'NONE'; + export type LoggerLevel = EggLoggerLevel; /** * egg app info @@ -492,11 +493,6 @@ declare module 'egg' { */ env: EggEnvType; - /** - * core logger for framework and plugins, log file is $HOME/logs/{appname}/egg-web - */ - coreLogger: Logger; - /** * Alias to https://npmjs.com/package/depd */ @@ -505,7 +501,7 @@ declare module 'egg' { /** * HttpClient instance */ - httpclient: any; + httpclient: EggHttpClient; /** * The loader instance, the default class is EggLoader. If you want define @@ -523,12 +519,17 @@ declare module 'egg' { * this.logger.warn('WARNING!!!!'); * ``` */ - logger: Logger; + logger: EggLogger; + + /** + * core logger for framework and plugins, log file is $HOME/logs/{appname}/egg-web + */ + coreLogger: EggLogger; /** * All loggers contain logger, coreLogger and customLogger */ - loggers: { [loggerName: string]: Logger }; + loggers: EggLoggers; /** * messenger instance @@ -542,8 +543,6 @@ declare module 'egg' { */ router: Router; - Service: Service; - /** * Whether `application` or `agent` */ @@ -584,7 +583,7 @@ declare module 'egg' { /** * Get logger by name, it's equal to app.loggers['name'], but you can extend it with your own logical */ - getLogger(name: string): Logger; + getLogger(name: string): EggLogger; /** * print the infomation when console.log(app) @@ -595,6 +594,18 @@ declare module 'egg' { * Alias to Router#url */ url(name: string, params: any): any; + + + /** + * export context base classes, let framework can impl sub class and over context extend easily. + */ + ContextCookies: typeof EggCookies; + ContextLogger: typeof EggContextLogger; + ContextHttpClient: typeof EggContextHttpClient; + HttpClient: typeof EggHttpClient; + Subscription: typeof Subscription; + Controller: typeof Controller; + Service: typeof Service; } export type RouterPath = string | RegExp; @@ -640,8 +651,6 @@ declare module 'egg' { controller: IController; - Controller: Controller; - middleware: KoaApplication.Middleware[] & IMiddleware; /** @@ -854,7 +863,12 @@ declare module 'egg' { * this.logger.warn('WARNING!!!!'); * ``` */ - logger: Logger; + logger: EggLogger; + + /** + * Get logger by name, it's equal to app.loggers['name'], but you can extend it with your own logical + */ + getLogger(name: string): EggLogger; /** * Request start time @@ -873,11 +887,6 @@ declare module 'egg' { */ curl(url: string, opt?: RequestOptions): Promise; - /** - * Get logger by name, it's equal to app.loggers['name'], but you can extend it with your own logical - */ - getLogger(name: string): Logger; - /** * Render a file by view engine * @param {String} name - the file path based on root @@ -1089,7 +1098,7 @@ declare module 'egg' { baseDir: string; typescript?: boolean; app: Application; - logger: Logger; + logger: EggLogger; plugins?: any; } diff --git a/test/fixtures/apps/app-ts/app.ts b/test/fixtures/apps/app-ts/app.ts new file mode 100644 index 0000000000..6b7e483c02 --- /dev/null +++ b/test/fixtures/apps/app-ts/app.ts @@ -0,0 +1,8 @@ +import { Application } from 'egg'; +import testExportClass from './lib/export-class'; +import testLogger from './lib/logger'; + +export default (app: Application) => { + testExportClass(app); + testLogger(app); +}; diff --git a/test/fixtures/apps/app-ts/app/controller/foo.ts b/test/fixtures/apps/app-ts/app/controller/foo.ts index 423c9ef7d3..5c7c862972 100644 --- a/test/fixtures/apps/app-ts/app/controller/foo.ts +++ b/test/fixtures/apps/app-ts/app/controller/foo.ts @@ -11,6 +11,7 @@ declare module 'egg' { export default class FooController extends Controller { async getData() { try { + this.ctx.logger.info('getData'); this.ctx.body = await this.ctx.service.foo.bar(); this.ctx.proxy.foo.bar(); } catch (e) { @@ -25,4 +26,15 @@ export default class FooController extends Controller { this.ctx.logger.error(e); } } + async httpclient() { + await this.app.httpclient.request('url', { + method: 'POST', + }); + await this.ctx.curl('url', { + method: 'POST', + }); + await this.app.curl('url', { + method: 'POST', + }); + } } diff --git a/test/fixtures/apps/app-ts/lib/export-class.ts b/test/fixtures/apps/app-ts/lib/export-class.ts new file mode 100644 index 0000000000..099c81ace4 --- /dev/null +++ b/test/fixtures/apps/app-ts/lib/export-class.ts @@ -0,0 +1,26 @@ +import { Application } from 'egg'; + +export default (app: Application) => { + const ctx = app.createAnonymousContext(); + + class HttpClient extends app.HttpClient {}; + new HttpClient(app); + + class Controller extends app.Controller {}; + new Controller(ctx); + + class Service extends app.Service {}; + new Service(ctx); + + class Subscription extends app.Subscription {}; + new Subscription(ctx); + + class ContextHttpClient extends app.ContextHttpClient {}; + new ContextHttpClient(ctx); + + class ContextLogger extends app.ContextLogger {}; + new ContextLogger(ctx, app.logger); + + class ContextCookies extends app.ContextCookies {}; + new ContextCookies(ctx); +}; diff --git a/test/fixtures/apps/app-ts/lib/logger.ts b/test/fixtures/apps/app-ts/lib/logger.ts new file mode 100644 index 0000000000..9fd35a2bcb --- /dev/null +++ b/test/fixtures/apps/app-ts/lib/logger.ts @@ -0,0 +1,16 @@ +import { Application, LoggerLevel } from 'egg'; + +export default (app: Application) => { + app.logger.info('test'); + app.coreLogger.info('test'); + app.loggers.logger.info('test'); + app.loggers.coreLogger.info('test'); + app.getLogger('logger').info('test'); + + const ctx = app.createAnonymousContext(); + ctx.logger.info('test'); + ctx.coreLogger.info('test'); + ctx.getLogger('logger').info('test'); + + const level: LoggerLevel = 'DEBUG'; +}; diff --git a/test/fixtures/apps/app-ts/tsconfig.json b/test/fixtures/apps/app-ts/tsconfig.json index 807292206d..a27da05ccf 100644 --- a/test/fixtures/apps/app-ts/tsconfig.json +++ b/test/fixtures/apps/app-ts/tsconfig.json @@ -1,12 +1,12 @@ { "compilerOptions": { - "target": "es2015", + "target": "es2017", "baseUrl": ".", "paths": { "egg": ["../../../../index"] }, "module": "commonjs", - "lib": ["es7"], - "strict": true + "strict": true, + "noImplicitAny": false } }