• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

typeorm / typeorm / 15219332477

23 May 2025 09:13PM UTC coverage: 17.216% (-59.1%) from 76.346%
15219332477

Pull #11332

github

naorpeled
cr comments - move if block
Pull Request #11332: feat: add new undefined and null behavior flags

1603 of 12759 branches covered (12.56%)

Branch coverage included in aggregate %.

0 of 31 new or added lines in 3 files covered. (0.0%)

14132 existing lines in 166 files now uncovered.

4731 of 24033 relevant lines covered (19.69%)

60.22 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

42.24
/src/logger/AbstractLogger.ts
1
import {
2
    Logger,
3
    LogLevel,
4
    LogMessage,
5
    LogMessageType,
6
    PrepareLogMessagesOptions,
7
} from "./Logger"
8
import { QueryRunner } from "../query-runner/QueryRunner"
9
import { LoggerOptions } from "./LoggerOptions"
10
import { PlatformTools } from "../platform/PlatformTools"
1✔
11

12
export abstract class AbstractLogger implements Logger {
1✔
13
    // -------------------------------------------------------------------------
14
    // Constructor
15
    // -------------------------------------------------------------------------
16

17
    constructor(protected options?: LoggerOptions) {}
47✔
18

19
    // -------------------------------------------------------------------------
20
    // Public Methods
21
    // -------------------------------------------------------------------------
22

23
    /**
24
     * Logs query and parameters used in it.
25
     */
26
    logQuery(query: string, parameters?: any[], queryRunner?: QueryRunner) {
27
        if (!this.isLogEnabledFor("query")) {
3!
UNCOV
28
            return
×
29
        }
30

31
        this.writeLog(
3✔
32
            "query",
33
            {
34
                type: "query",
35
                prefix: "query",
36
                message: query,
37
                format: "sql",
38
                parameters,
39
            },
40
            queryRunner,
41
        )
42
    }
43

44
    /**
45
     * Logs query that is failed.
46
     */
47
    logQueryError(
48
        error: string,
49
        query: string,
50
        parameters?: any[],
51
        queryRunner?: QueryRunner,
52
    ) {
UNCOV
53
        if (!this.isLogEnabledFor("query-error")) {
×
UNCOV
54
            return
×
55
        }
56

57
        this.writeLog(
×
58
            "warn",
59
            [
60
                {
61
                    type: "query-error",
62
                    prefix: "query failed",
63
                    message: query,
64
                    format: "sql",
65
                    parameters,
66
                },
67
                {
68
                    type: "query-error",
69
                    prefix: "error",
70
                    message: error,
71
                },
72
            ],
73
            queryRunner,
74
        )
75
    }
76

77
    /**
78
     * Logs query that is slow.
79
     */
80
    logQuerySlow(
81
        time: number,
82
        query: string,
83
        parameters?: any[],
84
        queryRunner?: QueryRunner,
85
    ) {
UNCOV
86
        if (!this.isLogEnabledFor("query-slow")) {
×
87
            return
×
88
        }
89

UNCOV
90
        this.writeLog(
×
91
            "warn",
92
            [
93
                {
94
                    type: "query-slow",
95
                    prefix: "query is slow",
96
                    message: query,
97
                    format: "sql",
98
                    parameters,
99
                    additionalInfo: {
100
                        time,
101
                    },
102
                },
103
                {
104
                    type: "query-slow",
105
                    prefix: "execution time",
106
                    message: time,
107
                },
108
            ],
109
            queryRunner,
110
        )
111
    }
112

113
    /**
114
     * Logs events from the schema build process.
115
     */
116
    logSchemaBuild(message: string, queryRunner?: QueryRunner) {
117
        if (!this.isLogEnabledFor("schema-build")) {
14✔
118
            return
14✔
119
        }
120

UNCOV
121
        this.writeLog(
×
122
            "schema",
123
            {
124
                type: "schema-build",
125
                message,
126
            },
127
            queryRunner,
128
        )
129
    }
130

131
    /**
132
     * Logs events from the migration run process.
133
     */
134
    logMigration(message: string, queryRunner?: QueryRunner) {
UNCOV
135
        if (!this.isLogEnabledFor("migration")) {
×
136
            return
×
137
        }
138

UNCOV
139
        this.writeLog(
×
140
            "log",
141
            {
142
                type: "migration",
143
                message,
144
            },
145
            queryRunner,
146
        )
147
    }
148

149
    /**
150
     * Perform logging using given logger, or by default to the console.
151
     * Log has its own level and message.
152
     */
153
    log(
154
        level: "log" | "info" | "warn",
155
        message: any,
156
        queryRunner?: QueryRunner,
157
    ) {
158
        switch (level) {
22!
159
            case "log":
160
                if (!this.isLogEnabledFor("log")) {
×
161
                    return
×
162
                }
163

164
                this.writeLog(
×
165
                    "log",
166
                    {
167
                        type: "log",
168
                        message,
169
                    },
170
                    queryRunner,
171
                )
172
                break
×
173

174
            case "info":
175
                if (!this.isLogEnabledFor("info")) {
22✔
176
                    return
22✔
177
                }
178

179
                this.writeLog(
×
180
                    "info",
181
                    {
182
                        type: "info",
183
                        prefix: "info",
184
                        message,
185
                    },
186
                    queryRunner,
187
                )
188
                break
×
189

190
            case "warn":
UNCOV
191
                if (!this.isLogEnabledFor("warn")) {
×
UNCOV
192
                    return
×
193
                }
194

UNCOV
195
                this.writeLog(
×
196
                    "warn",
197
                    {
198
                        type: "warn",
199
                        message,
200
                    },
201
                    queryRunner,
202
                )
UNCOV
203
                break
×
204
        }
205
    }
206

207
    // -------------------------------------------------------------------------
208
    // Protected Methods
209
    // -------------------------------------------------------------------------
210

211
    /**
212
     * Check is logging for level or message type is enabled.
213
     */
214
    protected isLogEnabledFor(type?: LogLevel | LogMessageType) {
215
        switch (type) {
39!
216
            case "query":
217
                return (
3✔
218
                    this.options === "all" ||
3!
219
                    this.options === true ||
220
                    (Array.isArray(this.options) &&
221
                        this.options.indexOf("query") !== -1)
222
                )
223

224
            case "error":
225
            case "query-error":
UNCOV
226
                return (
×
227
                    this.options === "all" ||
×
228
                    this.options === true ||
229
                    (Array.isArray(this.options) &&
230
                        this.options.indexOf("error") !== -1)
231
                )
232

233
            case "query-slow":
UNCOV
234
                return true
×
235

236
            case "schema":
237
            case "schema-build":
238
                return (
14✔
239
                    this.options === "all" ||
28!
240
                    (Array.isArray(this.options) &&
241
                        this.options.indexOf("schema") !== -1)
242
                )
243

244
            case "migration":
UNCOV
245
                return true
×
246

247
            case "log":
248
                return (
×
249
                    this.options === "all" ||
×
250
                    (Array.isArray(this.options) &&
251
                        this.options.indexOf("log") !== -1)
252
                )
253

254
            case "info":
255
                return (
22✔
256
                    this.options === "all" ||
44!
257
                    (Array.isArray(this.options) &&
258
                        this.options.indexOf("info") !== -1)
259
                )
260

261
            case "warn":
UNCOV
262
                return (
×
263
                    this.options === "all" ||
×
264
                    (Array.isArray(this.options) &&
265
                        this.options.indexOf("warn") !== -1)
266
                )
267

268
            default:
269
                return false
×
270
        }
271
    }
272

273
    /**
274
     * Write log to specific output.
275
     */
276
    protected abstract writeLog(
277
        level: LogLevel,
278
        message:
279
            | LogMessage
280
            | string
281
            | number
282
            | (LogMessage | string | number)[],
283
        queryRunner?: QueryRunner,
284
    ): void
285

286
    /**
287
     * Prepare and format log messages
288
     */
289
    protected prepareLogMessages(
290
        logMessage:
291
            | LogMessage
292
            | string
293
            | number
294
            | (LogMessage | string | number)[],
295
        options?: Partial<PrepareLogMessagesOptions>,
296
        queryRunner?: QueryRunner,
297
    ): LogMessage[] {
298
        options = {
3✔
299
            ...{
300
                addColonToPrefix: true,
301
                appendParameterAsComment: true,
302
                highlightSql: true,
303
                formatSql: false,
304
            },
305
            ...options,
306
        }
307
        const messages = Array.isArray(logMessage) ? logMessage : [logMessage]
3!
308

309
        for (let message of messages) {
3✔
310
            if (typeof message !== "object") {
3!
311
                message = {
×
312
                    message,
313
                }
314
            }
315

316
            if (message.format === "sql") {
3✔
317
                let sql = String(message.message)
3✔
318

319
                if (options.formatSql) {
3✔
320
                    sql = PlatformTools.formatSql(
3✔
321
                        sql,
322
                        queryRunner?.connection?.options.type,
323
                    )
324
                }
325

326
                if (
3!
327
                    options.appendParameterAsComment &&
6!
328
                    message.parameters &&
329
                    message.parameters.length
330
                ) {
331
                    sql += ` -- PARAMETERS: ${this.stringifyParams(
×
332
                        message.parameters,
333
                    )}`
334
                }
335

336
                if (options.highlightSql) {
3✔
337
                    sql = PlatformTools.highlightSql(sql)
3✔
338
                }
339

340
                message.message = sql
3✔
341
            }
342

343
            if (options.addColonToPrefix && message.prefix) {
3✔
344
                message.prefix += ":"
3✔
345
            }
346
        }
347

348
        return messages as LogMessage[]
3✔
349
    }
350

351
    /**
352
     * Converts parameters to a string.
353
     * Sometimes parameters can have circular objects and therefor we are handle this case too.
354
     */
355
    protected stringifyParams(parameters: any[]) {
356
        try {
×
357
            return JSON.stringify(parameters)
×
358
        } catch (error) {
359
            // most probably circular objects in parameters
360
            return parameters
×
361
        }
362
    }
363
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc