From b4e85fc763fe1f99cd8eac6855bd37fe81a9795a Mon Sep 17 00:00:00 2001 From: hyj1991 Date: Tue, 6 Sep 2022 11:42:16 +0800 Subject: [PATCH] refactor: remove DefineTrigger (#188) --- package.json | 9 +++++---- src/application.ts | 6 +----- src/constant.ts | 1 - src/decorator.ts | 1 - src/loader/impl/module.ts | 1 - src/trigger/decorator.ts | 12 ------------ src/trigger/index.ts | 5 ++--- src/types.ts | 2 -- test/app.test.ts | 4 ---- test/fixtures/app_koa_with_ts/src/app.ts | 9 ++++++--- test/fixtures/app_koa_with_ts/src/http_trigger.ts | 5 ++--- test/fixtures/frameworks/abstract/foo/index.ts | 2 +- test/fixtures/frameworks/bar/src/lifecycle.ts | 4 +++- .../frameworks/layer/foo/foo1/src/lifecycle.ts | 7 +++++-- .../frameworks/layer/foo/foo1/src/trigger/http.ts | 8 ++++---- .../frameworks/layer/foo/foo2/src/lifecycle.ts | 7 +++++-- .../frameworks/layer/foo/foo2/src/trigger/http.ts | 8 ++++---- test/fixtures/trigger/event/app.ts | 15 +++++++++------ test/fixtures/trigger/event/event_trigger.ts | 5 ++--- test/fixtures/trigger/http/app.ts | 9 ++++++--- test/fixtures/trigger/http/http_trigger.ts | 5 ++--- test/fixtures/trigger/timer/app.ts | 13 ++++++++----- test/fixtures/trigger/timer/timer_trigger.ts | 5 ++--- 23 files changed, 67 insertions(+), 76 deletions(-) delete mode 100644 src/trigger/decorator.ts diff --git a/package.json b/package.json index fc59e06..ab8d3f2 100644 --- a/package.json +++ b/package.json @@ -28,8 +28,9 @@ ], "scripts": { "build": "tsc -p ./tsconfig.build.json", - "test": "jest --coverage --detectOpenHandles --testTimeout=15000", - "ci": "npm run lint && npm run test", + "test": "jest --detectOpenHandles --testTimeout=15000", + "cov": "jest --coverage --detectOpenHandles --testTimeout=15000", + "ci": "npm run lint && npm run cov", "lint:fix": "eslint . --ext .ts --fix", "lint": "eslint . --ext .ts" }, @@ -61,10 +62,10 @@ "reflect-metadata": "^0.1.13", "ts-jest": "^27.1.3", "tslib": "^2.4.0", - "typescript": "~4.7.2" + "typescript": "^4.8.0" }, "dependencies": { - "@artus/injection": "^0.4.1", + "@artus/injection": "^0.5.1", "@artus/pipeline": "^0.2.2", "deepmerge": "^4.2.2", "minimatch": "^5.0.1" diff --git a/src/application.ts b/src/application.ts index c85bbad..f1fbe4a 100644 --- a/src/application.ts +++ b/src/application.ts @@ -4,7 +4,7 @@ import { ArtusInjectEnum } from './constant'; import { ArtusStdError, ExceptionHandler } from './exception'; import { HookFunction, LifecycleManager } from './lifecycle'; import { LoaderFactory, Manifest } from './loader'; -import { Application, ApplicationInitOptions, TriggerType } from './types'; +import { Application, ApplicationInitOptions } from './types'; import Trigger from './trigger'; import ConfigurationHandler from './configuration'; import { ArtusLogger, Logger } from './logger'; @@ -44,10 +44,6 @@ export class ArtusApplication implements Application { return this.container.get(ArtusInjectEnum.Packages); } - get trigger(): TriggerType { - return this.container.get(ArtusInjectEnum.Trigger); - } - get exceptionHandler(): ExceptionHandler { return this.container.get(ExceptionHandler); } diff --git a/src/constant.ts b/src/constant.ts index 2b15f23..694b3bc 100644 --- a/src/constant.ts +++ b/src/constant.ts @@ -11,7 +11,6 @@ export enum ArtusInjectEnum { LifecycleManager = 'artus#lifecycle-manager', Logger = 'artus#logger', Packages = 'artus#packages', - Trigger = 'artus#trigger', } export enum ARTUS_DEFAULT_CONFIG_ENV { diff --git a/src/decorator.ts b/src/decorator.ts index a8484a0..9ebf30c 100644 --- a/src/decorator.ts +++ b/src/decorator.ts @@ -21,4 +21,3 @@ export function LifecycleHook(hookName?: string): PropertyDecorator { } export * from './loader/decorator'; -export * from './trigger/decorator'; diff --git a/src/loader/impl/module.ts b/src/loader/impl/module.ts index 80e9a26..a17f7d6 100644 --- a/src/loader/impl/module.ts +++ b/src/loader/impl/module.ts @@ -22,7 +22,6 @@ class ModuleLoader implements Loader { for (const name of state.exportNames) { const moduleClazz = origin[name]; const opts: Partial = { - path: item.path, type: moduleClazz, scope: ScopeEnum.EXECUTION, // The class used with @artus/core will have default scope EXECUTION, can be overwritten by Injectable decorator }; diff --git a/src/trigger/decorator.ts b/src/trigger/decorator.ts deleted file mode 100644 index 61b166f..0000000 --- a/src/trigger/decorator.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Injectable, ScopeEnum } from '@artus/injection'; -import { ArtusInjectEnum, SHOULD_OVERWRITE_VALUE } from '../constant'; - -export function DefineTrigger(): ClassDecorator { - return (target:any) => { - Reflect.defineMetadata(SHOULD_OVERWRITE_VALUE, true, target); - return Injectable({ - id: ArtusInjectEnum.Trigger, - scope: ScopeEnum.SINGLETON, - })(target); - }; -} diff --git a/src/trigger/index.ts b/src/trigger/index.ts index 71d231d..ee3dfb0 100644 --- a/src/trigger/index.ts +++ b/src/trigger/index.ts @@ -1,10 +1,9 @@ -import { ExecutionContainer, Inject } from '@artus/injection'; +import { ExecutionContainer, Inject, Injectable, ScopeEnum } from '@artus/injection'; import { Input, Context, MiddlewareInput, Pipeline, Output } from '@artus/pipeline'; import { ArtusInjectEnum } from '../constant'; import { Application, TriggerType } from '../types'; -import { DefineTrigger } from './decorator'; -@DefineTrigger() +@Injectable({ scope: ScopeEnum.SINGLETON }) export default class Trigger implements TriggerType { private pipeline: Pipeline; diff --git a/src/types.ts b/src/types.ts index dfeffbc..d5c373c 100644 --- a/src/types.ts +++ b/src/types.ts @@ -23,8 +23,6 @@ export interface Application { manifest?: Manifest; config?: Record; - get trigger(): TriggerType; - load(manifest: Manifest): Promise; run(): Promise; registerHook(hookName: string, hookFn: HookFunction): void; diff --git a/test/app.test.ts b/test/app.test.ts index b11c77d..ba71874 100644 --- a/test/app.test.ts +++ b/test/app.test.ts @@ -2,7 +2,6 @@ import 'reflect-metadata'; import axios from 'axios'; import assert from 'assert'; import { ArtusInjectEnum, ConfigurationHandler, ExceptionHandler } from '../src'; -import HttpTrigger from './fixtures/app_koa_with_ts/src/http_trigger'; describe('test/app.test.ts', () => { describe('app koa with ts', () => { @@ -27,13 +26,10 @@ describe('test/app.test.ts', () => { expect(() => app.container.get(ArtusInjectEnum.Application)).not.toThrow(); expect(() => app.container.get(ArtusInjectEnum.LifecycleManager)).not.toThrow(); expect(() => app.container.get(ArtusInjectEnum.Logger)).not.toThrow(); - expect(() => app.container.get(ArtusInjectEnum.Trigger)).not.toThrow(); expect(() => app.container.get(ExceptionHandler)).not.toThrow(); expect(() => app.container.get(ConfigurationHandler)).not.toThrow(); await main(); - - expect(app.container.get(ArtusInjectEnum.Trigger)).toBeInstanceOf(HttpTrigger); const testResponse = await axios.get('http://127.0.0.1:3000', { headers: { diff --git a/test/fixtures/app_koa_with_ts/src/app.ts b/test/fixtures/app_koa_with_ts/src/app.ts index ff819c6..f8b8789 100644 --- a/test/fixtures/app_koa_with_ts/src/app.ts +++ b/test/fixtures/app_koa_with_ts/src/app.ts @@ -9,6 +9,7 @@ import { ApplicationLifecycle } from '../../../../src/types'; import KoaApplication from './koa_app'; import HelloController from './controllers/hello'; +import HttpTrigger from './http_trigger'; export let server: Server; @@ -18,6 +19,8 @@ export default class MyLifecycle implements ApplicationLifecycle { app: ArtusApplication; @Inject() container: Container; + @Inject() + trigger: HttpTrigger; get koaApp(): KoaApplication { return this.container.get(KoaApplication); @@ -25,7 +28,7 @@ export default class MyLifecycle implements ApplicationLifecycle { @LifecycleHook() async didLoad() { - this.app.trigger.use(async (ctx: Context) => { + this.trigger.use(async (ctx: Context) => { const { koaCtx } = ctx.input.params; ctx.container.set({ id: 'headers', value: koaCtx.headers }); ctx.output.data = await ctx.container.get(HelloController).index(); @@ -38,8 +41,8 @@ export default class MyLifecycle implements ApplicationLifecycle { const input = new Input(); const { req, res } = koaCtx; input.params = { koaCtx, req, res }; - const ctx = await this.app.trigger.initContext(input); - await this.app.trigger.startPipeline(ctx); + const ctx = await this.trigger.initContext(input); + await this.trigger.startPipeline(ctx); }); } diff --git a/test/fixtures/app_koa_with_ts/src/http_trigger.ts b/test/fixtures/app_koa_with_ts/src/http_trigger.ts index 738adeb..be74406 100644 --- a/test/fixtures/app_koa_with_ts/src/http_trigger.ts +++ b/test/fixtures/app_koa_with_ts/src/http_trigger.ts @@ -1,8 +1,7 @@ import { Context, Next } from '@artus/pipeline'; -import { Trigger } from '../../../../src'; -import { DefineTrigger } from '../../../../src/decorator'; +import { Injectable, ScopeEnum, Trigger } from '../../../../src'; -@DefineTrigger() +@Injectable({ scope: ScopeEnum.SINGLETON }) export default class HttpTrigger extends Trigger { constructor() { super(); diff --git a/test/fixtures/frameworks/abstract/foo/index.ts b/test/fixtures/frameworks/abstract/foo/index.ts index 2ec403d..f254f34 100644 --- a/test/fixtures/frameworks/abstract/foo/index.ts +++ b/test/fixtures/frameworks/abstract/foo/index.ts @@ -4,4 +4,4 @@ export interface AbstractFoo { isListening: () => boolean } -export interface HttpTrigger extends Trigger {} \ No newline at end of file +export class HttpTrigger extends Trigger { } \ No newline at end of file diff --git a/test/fixtures/frameworks/bar/src/lifecycle.ts b/test/fixtures/frameworks/bar/src/lifecycle.ts index 064cd19..3adb481 100644 --- a/test/fixtures/frameworks/bar/src/lifecycle.ts +++ b/test/fixtures/frameworks/bar/src/lifecycle.ts @@ -11,10 +11,12 @@ export let server: Server; export default class MyLifecycle implements ApplicationLifecycle { @Inject(ArtusInjectEnum.Application) app: ArtusApplication; + @Inject() + trigger: HttpTrigger; @LifecycleHook() async didLoad() { // register controller - registerController(this.app.trigger as HttpTrigger); + registerController(this.trigger as HttpTrigger); } } diff --git a/test/fixtures/frameworks/layer/foo/foo1/src/lifecycle.ts b/test/fixtures/frameworks/layer/foo/foo1/src/lifecycle.ts index 7cde8b6..314900c 100644 --- a/test/fixtures/frameworks/layer/foo/foo1/src/lifecycle.ts +++ b/test/fixtures/frameworks/layer/foo/foo1/src/lifecycle.ts @@ -3,6 +3,7 @@ import { LifecycleHookUnit, LifecycleHook } from '../../../../../../../src/decor import { ApplicationLifecycle } from '../../../../../../../src/types'; import { Input } from '@artus/pipeline'; import { ArtusApplication, Inject, ArtusInjectEnum } from '../../../../../../../src'; +import { HttpTrigger } from '../../../../abstract/foo'; export let server: Server; @@ -10,6 +11,8 @@ export let server: Server; export default class MyLifecycle implements ApplicationLifecycle { @Inject(ArtusInjectEnum.Application) app: ArtusApplication; + @Inject() + trigger: HttpTrigger; @LifecycleHook() willReady() { @@ -19,8 +22,8 @@ export default class MyLifecycle implements ApplicationLifecycle { .createServer(async (req: http.IncomingMessage, res: http.ServerResponse) => { const input = new Input(); input.params = { req, res, config, app: this.app }; - const ctx = await this.app.trigger.initContext(input); - await this.app.trigger.startPipeline(ctx); + const ctx = await this.trigger.initContext(input); + await this.trigger.startPipeline(ctx); }) .listen(port); } diff --git a/test/fixtures/frameworks/layer/foo/foo1/src/trigger/http.ts b/test/fixtures/frameworks/layer/foo/foo1/src/trigger/http.ts index d22f1f0..a185e86 100644 --- a/test/fixtures/frameworks/layer/foo/foo1/src/trigger/http.ts +++ b/test/fixtures/frameworks/layer/foo/foo1/src/trigger/http.ts @@ -1,10 +1,10 @@ import { Stream } from 'stream'; import { Context, Next } from '@artus/pipeline'; -import { Trigger } from '../../../../../../../../src'; -import { DefineTrigger } from '../../../../../../../../src/decorator'; +import { Injectable, ScopeEnum, Trigger } from '../../../../../../../../src'; +import { HttpTrigger } from '../../../../../abstract/foo'; -@DefineTrigger() -export default class HttpTrigger extends Trigger { +@Injectable({ id: HttpTrigger, scope: ScopeEnum.SINGLETON }) +export default class HttpTriggerImpl extends Trigger { constructor() { super(); // first of all diff --git a/test/fixtures/frameworks/layer/foo/foo2/src/lifecycle.ts b/test/fixtures/frameworks/layer/foo/foo2/src/lifecycle.ts index 7cde8b6..314900c 100644 --- a/test/fixtures/frameworks/layer/foo/foo2/src/lifecycle.ts +++ b/test/fixtures/frameworks/layer/foo/foo2/src/lifecycle.ts @@ -3,6 +3,7 @@ import { LifecycleHookUnit, LifecycleHook } from '../../../../../../../src/decor import { ApplicationLifecycle } from '../../../../../../../src/types'; import { Input } from '@artus/pipeline'; import { ArtusApplication, Inject, ArtusInjectEnum } from '../../../../../../../src'; +import { HttpTrigger } from '../../../../abstract/foo'; export let server: Server; @@ -10,6 +11,8 @@ export let server: Server; export default class MyLifecycle implements ApplicationLifecycle { @Inject(ArtusInjectEnum.Application) app: ArtusApplication; + @Inject() + trigger: HttpTrigger; @LifecycleHook() willReady() { @@ -19,8 +22,8 @@ export default class MyLifecycle implements ApplicationLifecycle { .createServer(async (req: http.IncomingMessage, res: http.ServerResponse) => { const input = new Input(); input.params = { req, res, config, app: this.app }; - const ctx = await this.app.trigger.initContext(input); - await this.app.trigger.startPipeline(ctx); + const ctx = await this.trigger.initContext(input); + await this.trigger.startPipeline(ctx); }) .listen(port); } diff --git a/test/fixtures/frameworks/layer/foo/foo2/src/trigger/http.ts b/test/fixtures/frameworks/layer/foo/foo2/src/trigger/http.ts index d22f1f0..a185e86 100644 --- a/test/fixtures/frameworks/layer/foo/foo2/src/trigger/http.ts +++ b/test/fixtures/frameworks/layer/foo/foo2/src/trigger/http.ts @@ -1,10 +1,10 @@ import { Stream } from 'stream'; import { Context, Next } from '@artus/pipeline'; -import { Trigger } from '../../../../../../../../src'; -import { DefineTrigger } from '../../../../../../../../src/decorator'; +import { Injectable, ScopeEnum, Trigger } from '../../../../../../../../src'; +import { HttpTrigger } from '../../../../../abstract/foo'; -@DefineTrigger() -export default class HttpTrigger extends Trigger { +@Injectable({ id: HttpTrigger, scope: ScopeEnum.SINGLETON }) +export default class HttpTriggerImpl extends Trigger { constructor() { super(); // first of all diff --git a/test/fixtures/trigger/event/app.ts b/test/fixtures/trigger/event/app.ts index d76b1ff..88da6ba 100644 --- a/test/fixtures/trigger/event/app.ts +++ b/test/fixtures/trigger/event/app.ts @@ -3,6 +3,7 @@ import { ArtusApplication, Inject, ArtusInjectEnum } from '../../../../src'; import { LifecycleHookUnit, LifecycleHook } from '../../../../src/decorator'; import { Context, Input, Next } from '@artus/pipeline'; import { ApplicationLifecycle } from '../../../../src/types'; +import EventTrigger from './event_trigger'; export const event = new EventEmitter(); @@ -10,10 +11,12 @@ export const event = new EventEmitter(); export default class MyLifecycle implements ApplicationLifecycle { @Inject(ArtusInjectEnum.Application) app: ArtusApplication; + @Inject() + trigger: EventTrigger; @LifecycleHook() async didLoad() { - this.app.trigger.use(async (ctx: Context, next: Next) => { + this.trigger.use(async (ctx: Context, next: Next) => { const { input: { params: { type, payload } } } = ctx; if (type !== 'e1') { await next(); @@ -24,7 +27,7 @@ export default class MyLifecycle implements ApplicationLifecycle { data.payload = payload; }); - this.app.trigger.use(async (ctx: Context, next: Next) => { + this.trigger.use(async (ctx: Context, next: Next) => { const { input: { params: { type, payload } } } = ctx; if (type !== 'e2') { await next(); @@ -42,16 +45,16 @@ export default class MyLifecycle implements ApplicationLifecycle { const input = new Input(); input.params.type = 'e1'; input.params.payload = payload; - const ctx = await this.app.trigger.initContext(input); - await this.app.trigger.startPipeline(ctx); + const ctx = await this.trigger.initContext(input); + await this.trigger.startPipeline(ctx); }); event.on('e2', async payload => { const input = new Input(); input.params.type = 'e2'; input.params.payload = payload; - const ctx = await this.app.trigger.initContext(input); - await this.app.trigger.startPipeline(ctx); + const ctx = await this.trigger.initContext(input); + await this.trigger.startPipeline(ctx); }); } diff --git a/test/fixtures/trigger/event/event_trigger.ts b/test/fixtures/trigger/event/event_trigger.ts index 0d9cb2a..99d4c09 100644 --- a/test/fixtures/trigger/event/event_trigger.ts +++ b/test/fixtures/trigger/event/event_trigger.ts @@ -1,8 +1,7 @@ import { Context, Next } from '@artus/pipeline'; -import { Trigger } from '../../../../src'; -import { DefineTrigger } from '../../../../src/decorator'; +import { Injectable, ScopeEnum, Trigger } from '../../../../src'; -@DefineTrigger() +@Injectable({ scope: ScopeEnum.SINGLETON }) export default class EventTrigger extends Trigger { constructor() { super(); diff --git a/test/fixtures/trigger/http/app.ts b/test/fixtures/trigger/http/app.ts index 88a2311..d9752cd 100644 --- a/test/fixtures/trigger/http/app.ts +++ b/test/fixtures/trigger/http/app.ts @@ -3,6 +3,7 @@ import { Context, Input } from '@artus/pipeline'; import { ArtusApplication, Inject, ArtusInjectEnum } from '../../../../src'; import { LifecycleHookUnit, LifecycleHook } from '../../../../src/decorator'; import { ApplicationLifecycle } from '../../../../src/types'; +import HttpTrigger from './http_trigger'; export let server: Server; @@ -10,10 +11,12 @@ export let server: Server; export default class MyLifecycle implements ApplicationLifecycle { @Inject(ArtusInjectEnum.Application) app: ArtusApplication; + @Inject() + trigger: HttpTrigger; @LifecycleHook() async didLoad() { - this.app.trigger.use(async (ctx: Context) => { + this.trigger.use(async (ctx: Context) => { const { data } = ctx.output; data.content = { title: 'Hello Artus' }; }); @@ -25,8 +28,8 @@ export default class MyLifecycle implements ApplicationLifecycle { .createServer(async (req: http.IncomingMessage, res: http.ServerResponse) => { const input = new Input(); input.params = { req, res }; - const ctx = await this.app.trigger.initContext(input); - await this.app.trigger.startPipeline(ctx); + const ctx = await this.trigger.initContext(input); + await this.trigger.startPipeline(ctx); }) .listen(3001); } diff --git a/test/fixtures/trigger/http/http_trigger.ts b/test/fixtures/trigger/http/http_trigger.ts index 17ca4ed..4fbd497 100644 --- a/test/fixtures/trigger/http/http_trigger.ts +++ b/test/fixtures/trigger/http/http_trigger.ts @@ -1,9 +1,8 @@ import { Stream } from 'stream'; import { Context, Next } from '@artus/pipeline'; -import { Trigger } from '../../../../src'; -import { DefineTrigger } from '../../../../src/decorator'; +import { Injectable, ScopeEnum, Trigger } from '../../../../src'; -@DefineTrigger() +@Injectable({ scope: ScopeEnum.SINGLETON }) export default class HttpTrigger extends Trigger { constructor() { super(); diff --git a/test/fixtures/trigger/timer/app.ts b/test/fixtures/trigger/timer/app.ts index 769e9ad..bc3150b 100644 --- a/test/fixtures/trigger/timer/app.ts +++ b/test/fixtures/trigger/timer/app.ts @@ -2,6 +2,7 @@ import { ArtusApplication, Inject, ArtusInjectEnum } from '../../../../src'; import { LifecycleHookUnit, LifecycleHook } from '../../../../src/decorator'; import { Context, Input } from '@artus/pipeline'; import { ApplicationLifecycle } from '../../../../src/types'; +import TimerTrigger from './timer_trigger'; const timers: any[] = []; export const execution = { @@ -19,10 +20,12 @@ export const execution = { export default class MyLifecycle implements ApplicationLifecycle { @Inject(ArtusInjectEnum.Application) app: ArtusApplication; + @Inject() + trigger: TimerTrigger; @LifecycleHook() async didLoad() { - this.app.trigger.use(async (ctx: Context) => { + this.trigger.use(async (ctx: Context) => { const { input: { params } } = ctx; // task 1 @@ -44,15 +47,15 @@ export default class MyLifecycle implements ApplicationLifecycle { timers.push(setInterval(async () => { const input = new Input(); input.params = { task: '1', execution }; - const ctx = await this.app.trigger.initContext(input); - await this.app.trigger.startPipeline(ctx); + const ctx = await this.trigger.initContext(input); + await this.trigger.startPipeline(ctx); }, 100)); timers.push(setInterval(async () => { const input = new Input(); input.params = { task: '2', execution }; - const ctx = await this.app.trigger.initContext(input); - await this.app.trigger.startPipeline(ctx); + const ctx = await this.trigger.initContext(input); + await this.trigger.startPipeline(ctx); }, 200)); } diff --git a/test/fixtures/trigger/timer/timer_trigger.ts b/test/fixtures/trigger/timer/timer_trigger.ts index a5a3da6..795938c 100644 --- a/test/fixtures/trigger/timer/timer_trigger.ts +++ b/test/fixtures/trigger/timer/timer_trigger.ts @@ -1,8 +1,7 @@ import { Context, Next } from '@artus/pipeline'; -import { Trigger } from '../../../../src'; -import { DefineTrigger } from '../../../../src/decorator'; +import { Injectable, ScopeEnum, Trigger } from '../../../../src'; -@DefineTrigger() +@Injectable({ scope: ScopeEnum.SINGLETON }) export default class TimerTrigger extends Trigger { constructor() { super();