diff --git a/README.md b/README.md index 279ca75..71fa69b 100644 --- a/README.md +++ b/README.md @@ -36,69 +36,39 @@ yarn add @byndyusoft/nest-http-client @nestjs/common axios 1. Create module ```typescript -import { - DynamicModuleHelper, - TRegisterAsyncOptions, -} from "@byndyusoft/nest-dynamic-module"; +import { TRegisterAsyncOptions } from "@byndyusoft/nest-dynamic-module"; import { HttpClientModule, IHttpClientOptions, } from "@byndyusoft/nest-http-client"; -import { DynamicModule, Module } from "@nestjs/common"; +import { DynamicModule, Global, Module } from "@nestjs/common"; import urlJoin from "proper-url-join"; import qs from "qs"; -import { ClientBaseOptionsToken, ClientOptionsToken } from "./tokens"; -import { UsersClient } from "./usersClient"; +import * as providers from "./providers"; +@Global() @Module({ - imports: [ - HttpClientModule.registerAsync({ - inject: [ClientOptionsToken], - useFactory: (options: IHttpClientOptions) => options, - }), - ], - providers: [UsersClient], - exports: [UsersClient], + providers: Object.values(providers), + exports: Object.values(providers), }) export class ClientModule { public static registerAsync( options?: TRegisterAsyncOptions, ): DynamicModule { - return DynamicModuleHelper.registerAsync( - { - module: ClientModule, - global: true, - providers: [ - { - provide: ClientOptionsToken, - inject: [ClientBaseOptionsToken], - useFactory: (baseOptions: IHttpClientOptions) => - ClientModule.clientOptionsFactory(baseOptions), - }, - ], - exports: [ClientOptionsToken], - }, - ClientBaseOptionsToken, + return HttpClientModule.registerClientModule( + { module: ClientModule }, options, - ); - } - - private static clientOptionsFactory( - baseOptions: IHttpClientOptions, - ): IHttpClientOptions { - return { - ...baseOptions, - config: { - ...baseOptions.config, - baseURL: urlJoin(baseOptions.config?.baseURL as string, "/api/v1"), + (config) => ({ + ...config, + baseURL: urlJoin(config?.baseURL as string, "/api/v1"), paramsSerializer: (params) => qs.stringify(params, { skipNulls: true, arrayFormat: "repeat", }), - }, - }; + }), + ); } } ``` diff --git a/src/httpClientBaseOptionsToken.ts b/src/httpClientBaseOptionsToken.ts new file mode 100644 index 0000000..3b75f14 --- /dev/null +++ b/src/httpClientBaseOptionsToken.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2022 Byndyusoft + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export const HttpClientBaseOptionsToken = Symbol("HttpClientBaseOptionsToken"); diff --git a/src/httpClientModule.ts b/src/httpClientModule.ts index 1985f6e..ec9a15b 100644 --- a/src/httpClientModule.ts +++ b/src/httpClientModule.ts @@ -19,15 +19,19 @@ import { TRegisterAsyncOptions, } from "@byndyusoft/nest-dynamic-module"; import { DynamicModule, Module } from "@nestjs/common"; +import { AxiosRequestConfig } from "axios"; import { HttpClient } from "./httpClient"; +import { HttpClientBaseOptionsToken } from "./httpClientBaseOptionsToken"; import { IHttpClientOptions } from "./httpClientOptionsInterface"; import { HttpClientOptionsToken } from "./httpClientOptionsToken"; import { HttpCoreClient } from "./httpCoreClient"; +const providers = [HttpCoreClient, HttpClient]; + @Module({ - providers: [HttpCoreClient, HttpClient], - exports: [HttpCoreClient, HttpClient], + providers, + exports: providers, }) export class HttpClientModule { public static registerAsync( @@ -41,4 +45,32 @@ export class HttpClientModule { options, ); } + + public static registerClientModule( + dynamicModule: DynamicModule, + options?: TRegisterAsyncOptions, + configFactory?: (config?: AxiosRequestConfig) => AxiosRequestConfig, + ): DynamicModule { + return DynamicModuleHelper.registerAsync( + { + ...dynamicModule, + providers: [ + ...providers, + ...(dynamicModule.providers ?? []), + { + provide: HttpClientOptionsToken, + inject: [HttpClientBaseOptionsToken], + useFactory: ( + baseOptions: IHttpClientOptions, + ): IHttpClientOptions => ({ + ...baseOptions, + config: configFactory?.(baseOptions.config) ?? baseOptions.config, + }), + }, + ], + }, + HttpClientBaseOptionsToken, + options, + ); + } } diff --git a/src/index.ts b/src/index.ts index c26c65c..719ea4c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -15,6 +15,7 @@ */ export * from "./httpClient"; +export * from "./httpClientBaseOptionsToken"; export * from "./httpClientModule"; export * from "./httpClientOptionsInterface"; export * from "./httpClientOptionsToken";