Skip to content

Commit c87d69a

Browse files
committed
✨ Implement support for custom logger with loglevel as default one
1 parent 6efb9c0 commit c87d69a

File tree

13 files changed

+68
-33
lines changed

13 files changed

+68
-33
lines changed
+1-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
export { create as default } from './modules/core';
2-
export type { DefaultRequestConfig } from './modules/core/types';
2+
export type { DefaultRequestConfig } from './types';
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
import Headers from 'fetch-headers';
2-
import { DefaultRequestConfig } from '../types';
2+
import loglevel from 'loglevel';
3+
4+
import { DefaultRequestConfig, GeneralConfig } from '../../../types';
35

46
export const defaultRequestConfig: DefaultRequestConfig = {
57
responseType: 'json',
68
headers: new Headers(),
79
};
10+
11+
export const defaultGeneralConfig: GeneralConfig = {
12+
logger: loglevel,
13+
};
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import { RequestConfig } from './types';
1+
import { RequestConfig, GeneralConfig } from '../../types';
22

33
import HttpClient from './models/HttpClient';
44

5-
export function create(requestConfig?: RequestConfig) {
6-
return new HttpClient(requestConfig);
5+
export default function create(requestConfig?: RequestConfig, generalConfig?: Partial<GeneralConfig>) {
6+
return new HttpClient(requestConfig, generalConfig);
77
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import HttpClient, { generalConfigs } from './models/HttpClient';
2+
3+
export default function destroy(httpClient: HttpClient) {
4+
return generalConfigs.delete(httpClient);
5+
}
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
export { default } from './models/HttpClient';
2-
export * from './create';
2+
export { default as create } from './create';
3+
export { default as destroy } from './destroy';

packages/@ackee/antonio-core/src/modules/core/models/HttpClient.ts

+20-12
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,50 @@
1-
import { RequestConfig, RequestBody } from '../types';
2-
import { defaultRequestConfig } from '../config';
3-
import { mergeConfig } from '../utils';
1+
import { RequestConfig, RequestBody, GeneralConfig } from '../../../types';
2+
import { defaultRequestConfig, defaultGeneralConfig } from '../config';
3+
import { mergeRequestConfigs } from '../utils';
44

55
import request from '../request';
66

7+
export const generalConfigs = new WeakMap();
78
class HttpClient {
89
readonly defaults: RequestConfig;
10+
readonly config: GeneralConfig;
911

10-
constructor(customRequestConfig?: RequestConfig) {
11-
this.defaults = Object.freeze<RequestConfig>(mergeConfig(defaultRequestConfig, customRequestConfig));
12+
constructor(requestConfig?: RequestConfig, generalConfig?: Partial<GeneralConfig>) {
13+
this.defaults = Object.freeze<RequestConfig>(mergeRequestConfigs(defaultRequestConfig, requestConfig));
14+
15+
const config = Object.freeze<GeneralConfig>({
16+
...defaultGeneralConfig,
17+
...generalConfig,
18+
});
19+
generalConfigs.set(this, config);
1220
}
1321

1422
post(url: string, body: RequestBody, requestConfig?: RequestConfig) {
15-
return request('post', url, body, requestConfig, this.defaults);
23+
return request('post', url, body, requestConfig, this.defaults, generalConfigs.get(this));
1624
}
1725

1826
put(url: string, body: RequestBody, requestConfig?: RequestConfig) {
19-
return request('put', url, body, requestConfig, this.defaults);
27+
return request('put', url, body, requestConfig, this.defaults, generalConfigs.get(this));
2028
}
2129

2230
patch(url: string, body: RequestBody, requestConfig?: RequestConfig) {
23-
return request('patch', url, body, requestConfig, this.defaults);
31+
return request('patch', url, body, requestConfig, this.defaults, generalConfigs.get(this));
2432
}
2533

2634
get(url: string, requestConfig?: RequestConfig) {
27-
return request('get', url, undefined, requestConfig, this.defaults);
35+
return request('get', url, undefined, requestConfig, this.defaults, generalConfigs.get(this));
2836
}
2937

3038
delete(url: string, requestConfig?: RequestConfig) {
31-
return request('delete', url, undefined, requestConfig, this.defaults);
39+
return request('delete', url, undefined, requestConfig, this.defaults, generalConfigs.get(this));
3240
}
3341

3442
head(url: string, requestConfig?: RequestConfig) {
35-
return request('head', url, undefined, requestConfig, this.defaults);
43+
return request('head', url, undefined, requestConfig, this.defaults, generalConfigs.get(this));
3644
}
3745

3846
options(url: string, requestConfig?: RequestConfig) {
39-
return request('options', url, undefined, requestConfig, this.defaults);
47+
return request('options', url, undefined, requestConfig, this.defaults, generalConfigs.get(this));
4048
}
4149
}
4250

packages/@ackee/antonio-core/src/modules/core/request.ts

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
1-
import { RequestMethod, RequestConfig, RequestResult } from './types';
1+
import { RequestMethod, RequestConfig, RequestResult, GeneralConfig } from '../../types';
22
import { HTTPError } from './errors';
3-
import { createRequestUrl, formatRequestBody, setRequestHeaders, parseResponse, mergeConfig } from './utils';
3+
import { createRequestUrl, formatRequestBody, setRequestHeaders, parseResponse, mergeRequestConfigs } from './utils';
44

55
export default async function request(
66
method: RequestMethod,
77
requestUrl: string,
88
body: BodyInit | undefined,
99
requestConfig: RequestConfig | undefined,
1010
defaultRequestConfig: RequestConfig,
11+
generalConfig: GeneralConfig,
1112
): Promise<RequestResult> {
12-
const config = mergeConfig(defaultRequestConfig, requestConfig);
13+
const config = mergeRequestConfigs(defaultRequestConfig, requestConfig);
1314

14-
const url = createRequestUrl(requestUrl, config);
15+
const url = createRequestUrl(requestUrl, config, generalConfig);
1516

1617
const { mode, credentials, cache, redirect, referrer, referrerPolicy, integrity, keepalive, signal } = config;
1718

Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
export * from './request';
22
export * from './response';
3-
export * from './config';
3+
export * from './mergeRequestConfigs';

packages/@ackee/antonio-core/src/modules/core/utils/config.ts renamed to packages/@ackee/antonio-core/src/modules/core/utils/mergeRequestConfigs.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import Headers from 'fetch-headers';
2-
import { RequestConfig, RequestHeaders, RequestSearchParams } from '../types';
2+
import { RequestConfig, RequestHeaders, RequestSearchParams } from '../../../types';
33

44
const getSearchParamsEntries = (value?: RequestSearchParams) =>
55
value instanceof URLSearchParams ? value.entries() : Object.entries(value ?? {});
@@ -35,7 +35,7 @@ function mergeHeaders(headersA?: RequestHeaders, headersB?: RequestHeaders): Hea
3535
return result;
3636
}
3737

38-
export function mergeConfig(configA: RequestConfig = {}, configB: RequestConfig = {}): RequestConfig {
38+
export function mergeRequestConfigs(configA: RequestConfig = {}, configB: RequestConfig = {}): RequestConfig {
3939
const result: RequestConfig = {
4040
...configA,
4141
...configB,

packages/@ackee/antonio-core/src/modules/core/utils/request.ts

+9-6
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@ import {
77
RequestHeaders,
88
RequestUriParams,
99
RequestBody,
10-
} from '../types';
11-
import { mergeUrlSearchParams } from './config';
10+
GeneralConfig,
11+
} from '../../../types';
12+
import { mergeUrlSearchParams } from './mergeRequestConfigs';
1213

1314
export function formatRequestBody(body: RequestBody, config: RequestConfig): RequestBody {
1415
if (config.responseType === 'json') {
@@ -46,7 +47,11 @@ function setUriParams(templateUrl: string, uriParams: RequestUriParams): string
4647
return templateUrl.split('/').map(templateToValue).join('/');
4748
}
4849

49-
export function createRequestUrl(requestUrl: string, requestConfig: RequestConfig): string {
50+
export function createRequestUrl(
51+
requestUrl: string,
52+
requestConfig: RequestConfig,
53+
generalConfig: GeneralConfig,
54+
): string {
5055
try {
5156
if (requestConfig.uriParams) {
5257
requestUrl = setUriParams(requestUrl, requestConfig.uriParams);
@@ -61,9 +66,7 @@ export function createRequestUrl(requestUrl: string, requestConfig: RequestConfi
6166

6267
return url.toString();
6368
} catch (e) {
64-
// TODO: use log-level
65-
// eslint-disable-next-line no-console
66-
console.error(e, {
69+
generalConfig.logger.error(e, {
6770
requestUrl,
6871
requestConfig,
6972
});

packages/@ackee/antonio-core/src/modules/core/utils/response.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { ResponseType, Header, ResponseTypes } from '../types';
1+
import { ResponseType, Header, ResponseTypes } from '../../../types';
22

33
function parseHeaderValue(headerValue: string | null): string[] {
44
if (!headerValue) {

packages/@ackee/antonio-core/src/modules/core/types.ts renamed to packages/@ackee/antonio-core/src/types.ts

+6
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import type { Logger } from 'loglevel';
2+
13
export type RequestMethod = 'get' | 'post' | 'put' | 'patch' | 'delete' | 'options' | 'head';
24

35
export type ResponseType = 'json' | 'blob' | 'formData' | 'text';
@@ -40,6 +42,10 @@ export interface RequestConfig extends Omit<RequestInit, 'body' | 'headers' | 'm
4042
searchParams?: RequestSearchParams;
4143
}
4244

45+
export interface GeneralConfig {
46+
logger: Logger;
47+
}
48+
4349
export interface DefaultRequestConfig extends RequestConfig {
4450
headers: RequestHeaders;
4551
responseType: ResponseType;

tsconfig.types.json

+6-1
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,10 @@
1515
"strictNullChecks": true,
1616
"noImplicitAny": false
1717
},
18-
"include": ["packages/@ackee/*/src"]
18+
"include": ["packages/@ackee/*/src"],
19+
"references": [
20+
{
21+
"path": "./packages/@ackee/antonio-core"
22+
}
23+
]
1924
}

0 commit comments

Comments
 (0)