This repository has been archived by the owner on Apr 18, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
index.ts
107 lines (94 loc) · 2.73 KB
/
index.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import { nanoid } from 'nanoid';
import { ApolloServerPlugin, GraphQLRequestListener } from 'apollo-server-plugin-base';
import winston from 'winston';
const stringify = (obj: unknown) => JSON.stringify(obj);
const logger = winston.createLogger({ transports: [new winston.transports.Console()] });
interface Options {
config?: {
didEncounterErrors?: boolean;
didResolveOperation?: boolean;
executionDidStart?: boolean;
parsingDidStart?: boolean;
responseForOperation?: boolean;
validationDidStart?: boolean;
willSendResponse?: boolean;
requestDidStart?: boolean;
}
winstonInstance?: winston.Logger;
levels?: {
debug?: string;
info?: string;
error?: string;
}
}
const apolloWinstonLoggingPlugin = (opts: Options = {}): ApolloServerPlugin => {
const {
didEncounterErrors = true,
didResolveOperation = false,
executionDidStart = false,
parsingDidStart = false,
responseForOperation = false,
validationDidStart = false,
willSendResponse = true,
requestDidStart = true,
} = opts.config || {};
const { debug = 'debug', info = 'info', error = 'error' } = opts.levels || {};
const { winstonInstance = logger } = opts;
return {
requestDidStart(context) {
const id = nanoid();
const { query, operationName, variables } = context.request;
if (requestDidStart) {
winstonInstance.log(info, stringify({
id,
event: 'request',
operationName,
query: query?.replace(/\s+/g, ' '),
variables,
}));
}
const handlers: GraphQLRequestListener = {
didEncounterErrors({ errors }) {
if (didEncounterErrors) { winstonInstance.log(error, stringify({ id, event: 'errors', errors })); }
},
willSendResponse({ response }) {
if (willSendResponse) {
winstonInstance.log(debug, stringify({
id,
event: 'response',
response: response.data,
}));
}
},
didResolveOperation(ctx) {
if (didResolveOperation) {
winstonInstance.log(debug, stringify({
id, event: 'didResolveOperation', ctx,
}));
}
},
executionDidStart(ctx) {
if (executionDidStart) { winstonInstance.log(debug, stringify({ id, event: 'executionDidStart', ctx })); }
},
parsingDidStart(ctx) {
if (parsingDidStart) { winstonInstance.log(debug, stringify({ id, event: 'parsingDidStart', ctx })); }
},
validationDidStart(ctx) {
if (validationDidStart) {
winstonInstance.log(debug, stringify({ id, event: 'validationDidStart', ctx }));
}
},
responseForOperation(ctx) {
if (responseForOperation) {
winstonInstance.log(debug, stringify({
id, event: 'responseForOperation', ctx,
}));
}
return null;
},
};
return handlers;
},
};
};
export default apolloWinstonLoggingPlugin;