# 更新日志 · 测试覆盖率100% [![coverage](https://img.shields.io/codecov/c/github/chumijs/chumi/master.svg)](https://app.codecov.io/gh/chumijs/chumi/tree/master) · 功能稳定保障

## 1.1.13

* 提供了高级TS泛型处理，获取控制器函数相关类型（函数参数和返回值），具体参考相关前端代码 [`sample/chumi-types/client/apis.ts`](sample/chumi-types/client/apis.ts)，这是基于`axios`的接口定义示例

## 1.1.12

* 完美的链式调用模式，星链 [`test/chain.test.ts`](test/chain.test.ts)

  ```js
  @Controller()
  class Chain {    
    ctx: Context;
    chain = loadController(Chain);

    async res() {
      return this.ctx.path;
    }

    @Get('/')
    async chain() {
      // 支持无限调用下去，不管是在service，还是controller，都是支持的
      return this.chain.chain.chain.chain.chain.chain.chain.res();
    }
  }
  ```

## 1.1.11

* 支持通过`loadService`和`loadController`，实现星链模型
  
  可以依次链式加载`controller1`、`service1`、`controller2`、`service2`、`service3`、`controller3` 等等

  实现了任意扩展，让开发者自由搭配，更好了助力bff业务的处理

* 完成了并发测试，保证了`chumi`的健壮性 [`test/concurrence.test.ts`](test/concurrence.test.ts)


## 1.1.10

* 支持通过`loadController`，加载其他控制器实例，可以直接调用该控制器上的函数，具体可以查看测试用例代码 [`test/fixtures/chain-controllers`](test/fixtures/chain-controllers)

  支持链式调用，即 控制器1 -> 控制器2 -> 控制器3 -> service1 -> service2

  这样做，可以保证ctx上下文的统一，同时也支持目标函数的中间件的处理逻辑

  例如：有两个控制器，对应的地址为 `/api1/1`(函数1) `/api2/2`(函数2)

  这两个接口都可以正常调用，那如果需要做bff，我就可以这样做，创建一个函数3，`/api3/3`

  函数3内部逻辑如下
  ```js
  @Controller()
  export default class {
    控制器1 = loadController(控制器1)
    控制器2 = loadController(控制器2)

    @Get("/api3/2")
    async index(){
      // `/api1/1`(函数1)
      const r1 = await this.控制器1.函数1()

      // `/api2/2`(函数2)
      const r2 = await this.控制器2.函数2()

      // 处理一些聚合的逻辑即可
      return {
        r1, r2
      }
    }
  }
  ```

## 1.1.9

* 通过`loadService`加载的`service`支持链式调用，具体可以查看测试用例代码 `test/fixtures/chain-services`
  
## 1.1.8

* 新增全局的控制器中间件controllerMiddlewares
* 新增在相同的路由前缀下，提供统一的中间件
* 中间件执行顺序如下，结合 `1.1.7`版本一起看

  ```
  chumi中间件middlewares -> chumi控制器全局中间件controllerMiddlewares -> chumi全局路由前缀指定的中间件 
  -> 单个控制器指定的中间件 -> 控制器函数
  ```

  ```js
  // 具体可以查看单元测试用例 test/middleware.test.ts
  app.use(
    chumi<Koa.Context>(
     {
      '/home': [Home],
      '/detail2': {
        controllers: [Detail]
      },
      '/detail': {
        controllers: [Detail],
        // chumi全局路由前缀指定的中间件 
        middlewares: [
          async (ctx, next) => {
            ctx.name = 'detail';
            await next();
          }
        ]
      }
    },
    {
      // chumi控制器全局中间件controllerMiddlewares
      controllerMiddlewares: [
        async (ctx, next) => {
          await next();
          ctx.body = { ret: 0, data: ctx.body };
        }
      ]
    }
   )
  );
  ```

## 1.1.7

* 扩展chumi的第二个参数，支持传入middlewares数组，统一控制chumi里面的所有控制器
  ```
  chumi中间件 -> 控制器中间件 -> 控制器函数
  ```
  ```js
  app.use(
    chumi(
    {
      '/api': [Sample1]
    },
    {
     swagger: {},
     // chumi中间件middlewares
     middlewares: [
      async (ctx, next) => {
        ctx.abc = 1;
        await next();
        expect(ctx.abc).toBe(2);
      },
      async (ctx, next) => {
        ctx.abc = ctx.abc + 1;
        await next();
        expect(ctx.abc).toBe(2);
      }
     ]
    }
   )
  );
  ```

## 1.1.6

* 升级`swagger-ui-dist`版本到`4.18.1`

## 1.1.4

* 扩展chumi的第一个参数，支持全局按需配置不同控制器的路由前缀
  ```js
  app.use(
    chumi(
      {
        // 地址为 /test/api1/xxx
        '/api1': [Sample1],
        // 地址为 /test/api2/xxx
        '/api2': [Sample1]
      },
      { prefix: '/test', swagger: {} }
    )
  );
	```