@ovotech/axios-logger
Advanced tools
Comparing version 1.0.0 to 1.1.0
@@ -17,40 +17,19 @@ import { AxiosError, AxiosRequestConfig, AxiosResponse } from 'axios'; | ||
} | ||
export interface WithLoggerAxiosResponse<T = any, TConfig extends WithLogger = WithLogger> extends AxiosResponse<T> { | ||
config: TConfig; | ||
} | ||
export interface WithLoggerAxiosError<TConfig extends WithLogger = WithLogger> extends AxiosError { | ||
config: TConfig; | ||
response?: WithLoggerAxiosResponse<any, TConfig>; | ||
} | ||
export declare const redactPaths: (paths: string[], object: any) => any; | ||
export declare const getMeta: (response: AxiosResponse<any>) => LogMeta; | ||
export declare const axiosLogger: (log: (level: "error" | "info", meta: LogMeta) => void) => { | ||
export declare const axiosLogger: <TConfig extends WithLogger = WithLogger>(log: (level: "error" | "info", meta: LogMeta, config: TConfig) => void) => { | ||
request: { | ||
onFullfilled: (config: WithLogger) => { | ||
requestStartedAt: Date; | ||
url?: string | undefined; | ||
method?: string | undefined; | ||
baseURL?: string | undefined; | ||
transformRequest?: import("axios").AxiosTransformer | import("axios").AxiosTransformer[] | undefined; | ||
transformResponse?: import("axios").AxiosTransformer | import("axios").AxiosTransformer[] | undefined; | ||
headers?: any; | ||
params?: any; | ||
paramsSerializer?: ((params: any) => string) | undefined; | ||
data?: any; | ||
timeout?: number | undefined; | ||
withCredentials?: boolean | undefined; | ||
adapter?: import("axios").AxiosAdapter | undefined; | ||
auth?: import("axios").AxiosBasicCredentials | undefined; | ||
responseType?: string | undefined; | ||
xsrfCookieName?: string | undefined; | ||
xsrfHeaderName?: string | undefined; | ||
onUploadProgress?: ((progressEvent: any) => void) | undefined; | ||
onDownloadProgress?: ((progressEvent: any) => void) | undefined; | ||
maxContentLength?: number | undefined; | ||
validateStatus?: ((status: number) => boolean) | undefined; | ||
maxRedirects?: number | undefined; | ||
httpAgent?: any; | ||
httpsAgent?: any; | ||
proxy?: false | import("axios").AxiosProxyConfig | undefined; | ||
cancelToken?: import("axios").CancelToken | undefined; | ||
redact?: string[] | undefined; | ||
}; | ||
onFulfilled: (config: TConfig) => TConfig; | ||
}; | ||
response: { | ||
onFullfilled: (response: AxiosResponse<any>) => AxiosResponse<any>; | ||
onRejected: (error: AxiosError) => Promise<never>; | ||
onFulfilled: (response: WithLoggerAxiosResponse<any, TConfig>) => WithLoggerAxiosResponse<any, TConfig>; | ||
onRejected: (error: WithLoggerAxiosError<TConfig>) => Promise<never>; | ||
}; | ||
}; |
"use strict"; | ||
var __rest = (this && this.__rest) || function (s, e) { | ||
var t = {}; | ||
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) | ||
t[p] = s[p]; | ||
if (s != null && typeof Object.getOwnPropertySymbols === "function") | ||
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0) | ||
t[p[i]] = s[p[i]]; | ||
return t; | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
@@ -17,3 +8,4 @@ const redactPath = (path, obj) => { | ||
: obj[current] | ||
? Object.assign({}, obj, { [current]: rest.length ? redactPath(rest, obj[current]) : '<Removed>' }) : obj; | ||
? { ...obj, [current]: rest.length ? redactPath(rest, obj[current]) : '<Removed>' } | ||
: obj; | ||
}; | ||
@@ -32,7 +24,10 @@ const defaultRedact = ['requestBody', 'uri', 'params', 'responseBody']; | ||
request: { | ||
onFullfilled: (config) => (Object.assign({}, config, { requestStartedAt: config.requestStartedAt || new Date() })), | ||
onFulfilled: (config) => ({ | ||
...config, | ||
requestStartedAt: config.requestStartedAt || new Date(), | ||
}), | ||
}, | ||
response: { | ||
onFullfilled: (response) => { | ||
log('info', exports.getMeta(response)); | ||
onFulfilled: (response) => { | ||
log('info', exports.getMeta(response), response.config); | ||
return response; | ||
@@ -42,4 +37,4 @@ }, | ||
if (error.response) { | ||
const _a = exports.getMeta(error.response), { responseBody } = _a, meta = __rest(_a, ["responseBody"]); | ||
log('error', meta); | ||
const { responseBody, ...meta } = exports.getMeta(error.response); | ||
log('error', meta, error.config); | ||
} | ||
@@ -46,0 +41,0 @@ return Promise.reject(error); |
{ | ||
"name": "@ovotech/axios-logger", | ||
"description": "Log responses with sanitization", | ||
"version": "1.0.0", | ||
"version": "1.1.0", | ||
"main": "dist/index.js", | ||
@@ -28,3 +28,3 @@ "source": "src/index.ts", | ||
"tslint-config-prettier": "^1.18.0", | ||
"typescript": "^3.3.4000" | ||
"typescript": "^3.4.3" | ||
}, | ||
@@ -34,3 +34,3 @@ "jest": { | ||
}, | ||
"gitHead": "2d6ec9723f56a258c94f18c434a97bfbd7807cad" | ||
"gitHead": "72d7ad2099b362786b576b69797bbe020fbd36e7" | ||
} |
@@ -15,3 +15,3 @@ # Axios Logger Interceptor | ||
const logger = axiosLogger(console.log); | ||
const logger = axiosLogger((level, meta, config) => console.log(level, meta, config.url)); | ||
@@ -38,3 +38,3 @@ const api = axios.create(); | ||
The log function will receive 2 arguments - level and meta. The first one indicates what type of log level to use - "info" for success and "error" for error. The second contains an object of data to log. | ||
The log function will receive 3 arguments - level, meta and axios request config. The first one indicates what type of log level to use - "info" for success and "error" for error. The second contains an object of data to log. | ||
@@ -41,0 +41,0 @@ ```js |
@@ -20,2 +20,11 @@ import { AxiosError, AxiosRequestConfig, AxiosResponse } from 'axios'; | ||
export interface WithLoggerAxiosResponse<T = any, TConfig extends WithLogger = WithLogger> extends AxiosResponse<T> { | ||
config: TConfig; | ||
} | ||
export interface WithLoggerAxiosError<TConfig extends WithLogger = WithLogger> extends AxiosError { | ||
config: TConfig; | ||
response?: WithLoggerAxiosResponse<any, TConfig>; | ||
} | ||
const redactPath = (path: string[], obj: any): any => { | ||
@@ -46,15 +55,20 @@ const [current, ...rest] = path; | ||
export const axiosLogger = (log: (level: 'info' | 'error', meta: LogMeta) => void) => ({ | ||
export const axiosLogger = <TConfig extends WithLogger = WithLogger>( | ||
log: (level: 'info' | 'error', meta: LogMeta, config: TConfig) => void, | ||
) => ({ | ||
request: { | ||
onFullfilled: (config: WithLogger) => ({ ...config, requestStartedAt: config.requestStartedAt || new Date() }), | ||
onFulfilled: (config: TConfig): TConfig => ({ | ||
...config, | ||
requestStartedAt: config.requestStartedAt || new Date(), | ||
}), | ||
}, | ||
response: { | ||
onFullfilled: (response: AxiosResponse) => { | ||
log('info', getMeta(response)); | ||
onFulfilled: (response: WithLoggerAxiosResponse<any, TConfig>) => { | ||
log('info', getMeta(response), response.config); | ||
return response; | ||
}, | ||
onRejected: (error: AxiosError) => { | ||
onRejected: (error: WithLoggerAxiosError<TConfig>) => { | ||
if (error.response) { | ||
const { responseBody, ...meta } = getMeta(error.response); | ||
log('error', meta); | ||
log('error', meta, error.config); | ||
} | ||
@@ -61,0 +75,0 @@ return Promise.reject(error); |
@@ -5,8 +5,15 @@ import axios from 'axios'; | ||
interface ConfigWithLogger extends WithLogger { | ||
test?: string; | ||
} | ||
const log = jest.fn(); | ||
const instance = axios.create({ baseURL: 'http://api.example.com' }); | ||
const logger = axiosLogger(log); | ||
const logger = axiosLogger<ConfigWithLogger>((level, meta, cfg) => { | ||
log(level, meta); | ||
cfg.test = '123'; | ||
}); | ||
instance.interceptors.request.use(logger.request.onFullfilled); | ||
instance.interceptors.response.use(logger.response.onFullfilled, logger.response.onRejected); | ||
instance.interceptors.request.use(logger.request.onFulfilled); | ||
instance.interceptors.response.use(logger.response.onFulfilled, logger.response.onRejected); | ||
@@ -13,0 +20,0 @@ describe('Integration test', () => { |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
16282
238