dd-trace 2.25.0 → 2.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/index.d.ts +50 -0
  2. package/package.json +1 -1
  3. package/packages/datadog-instrumentations/src/fs.js +350 -4
  4. package/packages/datadog-instrumentations/src/helpers/hooks.js +2 -0
  5. package/packages/datadog-instrumentations/src/helpers/register.js +0 -2
  6. package/packages/datadog-instrumentations/src/jest.js +11 -1
  7. package/packages/datadog-instrumentations/src/mocha.js +3 -2
  8. package/packages/datadog-instrumentations/src/mysql.js +7 -1
  9. package/packages/datadog-instrumentations/src/mysql2.js +7 -1
  10. package/packages/datadog-instrumentations/src/playwright.js +236 -0
  11. package/packages/datadog-plugin-fs/src/index.js +37 -574
  12. package/packages/datadog-plugin-jest/src/index.js +45 -23
  13. package/packages/datadog-plugin-mocha/src/index.js +34 -6
  14. package/packages/datadog-plugin-mysql/src/index.js +8 -7
  15. package/packages/datadog-plugin-playwright/src/index.js +171 -0
  16. package/packages/dd-trace/src/appsec/callbacks/ddwaf.js +1 -1
  17. package/packages/dd-trace/src/appsec/iast/analyzers/analyzers.js +1 -0
  18. package/packages/dd-trace/src/appsec/iast/analyzers/path-traversal-analyzer.js +60 -0
  19. package/packages/dd-trace/src/appsec/index.js +1 -1
  20. package/packages/dd-trace/src/appsec/recommended.json +247 -112
  21. package/packages/dd-trace/src/appsec/sdk/index.js +23 -0
  22. package/packages/dd-trace/src/appsec/sdk/noop.js +11 -0
  23. package/packages/dd-trace/src/appsec/sdk/track_event.js +74 -0
  24. package/packages/dd-trace/src/appsec/sdk/utils.js +10 -0
  25. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +1 -1
  26. package/packages/dd-trace/src/config.js +7 -0
  27. package/packages/dd-trace/src/encode/agentless-ci-visibility.js +44 -4
  28. package/packages/dd-trace/src/encode/coverage-ci-visibility.js +52 -37
  29. package/packages/dd-trace/src/lambda/runtime/patch.js +1 -1
  30. package/packages/dd-trace/src/lambda/runtime/ritm.js +6 -11
  31. package/packages/dd-trace/src/log/channels.js +47 -0
  32. package/packages/dd-trace/src/log/index.js +79 -0
  33. package/packages/dd-trace/src/log/writer.js +108 -0
  34. package/packages/dd-trace/src/noop/proxy.js +3 -0
  35. package/packages/dd-trace/src/plugins/index.js +1 -0
  36. package/packages/dd-trace/src/plugins/util/ci.js +13 -21
  37. package/packages/dd-trace/src/{appsec → plugins/util}/ip_blocklist.js +0 -0
  38. package/packages/dd-trace/src/{appsec → plugins/util}/ip_extractor.js +1 -1
  39. package/packages/dd-trace/src/plugins/util/test.js +27 -10
  40. package/packages/dd-trace/src/plugins/util/user-provided-git.js +2 -7
  41. package/packages/dd-trace/src/plugins/util/web.js +11 -0
  42. package/packages/dd-trace/src/proxy.js +2 -0
  43. package/packages/dd-trace/src/startup-log.js +1 -1
  44. package/scripts/check-proposal-labels.js +71 -0
  45. package/packages/dd-trace/src/log.js +0 -143
@@ -2,6 +2,7 @@
2
2
 
3
3
  module.exports = {
4
4
  get '@cucumber/cucumber' () { return require('../../../datadog-plugin-cucumber/src') },
5
+ get '@playwright/test' () { return require('../../../datadog-plugin-playwright/src') },
5
6
  get '@elastic/elasticsearch' () { return require('../../../datadog-plugin-elasticsearch/src') },
6
7
  get '@elastic/transport' () { return require('../../../datadog-plugin-elasticsearch/src') },
7
8
  get '@google-cloud/pubsub' () { return require('../../../datadog-plugin-google-cloud-pubsub/src') },
@@ -122,7 +122,7 @@ module.exports = {
122
122
  [CI_ENV_VARS]: JSON.stringify({ DD_CUSTOM_TRACE_ID })
123
123
  }
124
124
 
125
- const isTag = JENKINS_GIT_BRANCH && JENKINS_GIT_BRANCH.includes('tags')
125
+ const isTag = JENKINS_GIT_BRANCH && JENKINS_GIT_BRANCH.includes('tags/')
126
126
  const refKey = isTag ? GIT_TAG : GIT_BRANCH
127
127
  const ref = normalizeRef(JENKINS_GIT_BRANCH)
128
128
 
@@ -216,7 +216,8 @@ module.exports = {
216
216
  [GIT_REPOSITORY_URL]: CIRCLE_REPOSITORY_URL,
217
217
  [CI_JOB_URL]: CIRCLE_BUILD_URL,
218
218
  [CI_WORKSPACE_PATH]: CIRCLE_WORKING_DIRECTORY,
219
- [CIRCLE_TAG ? GIT_TAG : GIT_BRANCH]: CIRCLE_TAG || CIRCLE_BRANCH,
219
+ [GIT_TAG]: CIRCLE_TAG,
220
+ [GIT_BRANCH]: CIRCLE_BRANCH,
220
221
  [CI_ENV_VARS]: JSON.stringify({
221
222
  CIRCLE_WORKFLOW_ID,
222
223
  CIRCLE_BUILD_NUM
@@ -249,7 +250,7 @@ module.exports = {
249
250
  const jobUrl = `${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/commit/${GITHUB_SHA}/checks`
250
251
 
251
252
  const ref = GITHUB_HEAD_REF || GITHUB_REF || ''
252
- const refKey = ref.includes('tags') ? GIT_TAG : GIT_BRANCH
253
+ const refKey = ref.includes('tags/') ? GIT_TAG : GIT_BRANCH
253
254
 
254
255
  tags = {
255
256
  [CI_PIPELINE_ID]: GITHUB_RUN_ID,
@@ -305,13 +306,12 @@ module.exports = {
305
306
  }
306
307
 
307
308
  if (APPVEYOR_REPO_PROVIDER === 'github') {
308
- const refKey = APPVEYOR_REPO_TAG_NAME ? GIT_TAG : GIT_BRANCH
309
- const ref = APPVEYOR_REPO_TAG_NAME || APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH || APPVEYOR_REPO_BRANCH
310
309
  tags = {
311
310
  ...tags,
312
311
  [GIT_REPOSITORY_URL]: `https://github.com/${APPVEYOR_REPO_NAME}.git`,
313
312
  [GIT_COMMIT_SHA]: APPVEYOR_REPO_COMMIT,
314
- [refKey]: ref
313
+ [GIT_TAG]: APPVEYOR_REPO_TAG_NAME,
314
+ [GIT_BRANCH]: APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH || APPVEYOR_REPO_BRANCH
315
315
  }
316
316
  }
317
317
  }
@@ -340,7 +340,7 @@ module.exports = {
340
340
  } = env
341
341
 
342
342
  const ref = SYSTEM_PULLREQUEST_SOURCEBRANCH || BUILD_SOURCEBRANCH || BUILD_SOURCEBRANCHNAME
343
- const refKey = (ref || '').includes('tags') ? GIT_TAG : GIT_BRANCH
343
+ const refKey = (ref || '').includes('tags/') ? GIT_TAG : GIT_BRANCH
344
344
 
345
345
  tags = {
346
346
  [CI_PROVIDER_NAME]: 'azurepipelines',
@@ -419,10 +419,6 @@ module.exports = {
419
419
  BITRISE_GIT_MESSAGE
420
420
  } = env
421
421
 
422
- const isTag = !!BITRISE_GIT_TAG
423
- const refKey = isTag ? GIT_TAG : GIT_BRANCH
424
- const ref = BITRISE_GIT_TAG || BITRISEIO_GIT_BRANCH_DEST || BITRISE_GIT_BRANCH
425
-
426
422
  tags = {
427
423
  [CI_PROVIDER_NAME]: 'bitrise',
428
424
  [CI_PIPELINE_ID]: BITRISE_BUILD_SLUG,
@@ -432,7 +428,8 @@ module.exports = {
432
428
  [GIT_COMMIT_SHA]: BITRISE_GIT_COMMIT || GIT_CLONE_COMMIT_HASH,
433
429
  [GIT_REPOSITORY_URL]: BITRISE_GIT_REPOSITORY_URL,
434
430
  [CI_WORKSPACE_PATH]: BITRISE_SOURCE_DIR,
435
- [refKey]: ref,
431
+ [GIT_TAG]: BITRISE_GIT_TAG,
432
+ [GIT_BRANCH]: BITRISEIO_GIT_BRANCH_DEST || BITRISE_GIT_BRANCH,
436
433
  [GIT_COMMIT_MESSAGE]: BITRISE_GIT_MESSAGE
437
434
  }
438
435
  }
@@ -454,9 +451,6 @@ module.exports = {
454
451
  BUILDKITE_MESSAGE
455
452
  } = env
456
453
 
457
- const ref = BUILDKITE_TAG || BUILDKITE_BRANCH
458
- const refKey = BUILDKITE_TAG ? GIT_TAG : GIT_BRANCH
459
-
460
454
  tags = {
461
455
  [CI_PROVIDER_NAME]: 'buildkite',
462
456
  [CI_PIPELINE_ID]: BUILDKITE_BUILD_ID,
@@ -467,7 +461,8 @@ module.exports = {
467
461
  [GIT_COMMIT_SHA]: BUILDKITE_COMMIT,
468
462
  [CI_WORKSPACE_PATH]: BUILDKITE_BUILD_CHECKOUT_PATH,
469
463
  [GIT_REPOSITORY_URL]: BUILDKITE_REPO,
470
- [refKey]: ref,
464
+ [GIT_TAG]: BUILDKITE_TAG,
465
+ [GIT_BRANCH]: BUILDKITE_BRANCH,
471
466
  [GIT_COMMIT_AUTHOR_NAME]: BUILDKITE_BUILD_AUTHOR,
472
467
  [GIT_COMMIT_AUTHOR_EMAIL]: BUILDKITE_BUILD_AUTHOR_EMAIL,
473
468
  [GIT_COMMIT_MESSAGE]: BUILDKITE_MESSAGE,
@@ -493,10 +488,6 @@ module.exports = {
493
488
  TRAVIS_COMMIT_MESSAGE
494
489
  } = env
495
490
 
496
- const isTag = !!TRAVIS_TAG
497
- const ref = TRAVIS_TAG || TRAVIS_PULL_REQUEST_BRANCH || TRAVIS_BRANCH
498
- const refKey = isTag ? GIT_TAG : GIT_BRANCH
499
-
500
491
  tags = {
501
492
  [CI_PROVIDER_NAME]: 'travisci',
502
493
  [CI_JOB_URL]: TRAVIS_JOB_WEB_URL,
@@ -507,7 +498,8 @@ module.exports = {
507
498
  [GIT_COMMIT_SHA]: TRAVIS_COMMIT,
508
499
  [GIT_REPOSITORY_URL]: `https://github.com/${TRAVIS_REPO_SLUG}.git`,
509
500
  [CI_WORKSPACE_PATH]: TRAVIS_BUILD_DIR,
510
- [refKey]: ref,
501
+ [GIT_TAG]: TRAVIS_TAG,
502
+ [GIT_BRANCH]: TRAVIS_PULL_REQUEST_BRANCH || TRAVIS_BRANCH,
511
503
  [GIT_COMMIT_MESSAGE]: TRAVIS_COMMIT_MESSAGE
512
504
  }
513
505
  }
@@ -2,7 +2,7 @@
2
2
 
3
3
  const BlockList = require('./ip_blocklist')
4
4
  const net = require('net')
5
- const log = require('../log')
5
+ const log = require('../../log')
6
6
 
7
7
  const ipHeaderList = [
8
8
  'x-forwarded-for',
@@ -38,7 +38,9 @@ const TEST_CODE_OWNERS = 'test.codeowners'
38
38
  const TEST_SOURCE_FILE = 'test.source.file'
39
39
  const LIBRARY_VERSION = 'library_version'
40
40
  const TEST_COMMAND = 'test.command'
41
+ const TEST_BUNDLE = 'test.bundle'
41
42
  const TEST_SESSION_ID = 'test_session_id'
43
+ const TEST_MODULE_ID = 'test_module_id'
42
44
  const TEST_SUITE_ID = 'test_suite_id'
43
45
 
44
46
  const CI_APP_ORIGIN = 'ciapp-test'
@@ -75,9 +77,11 @@ module.exports = {
75
77
  getCodeOwnersForFilename,
76
78
  getTestCommonTags,
77
79
  getTestSessionCommonTags,
80
+ getTestModuleCommonTags,
78
81
  getTestSuiteCommonTags,
79
82
  TEST_COMMAND,
80
83
  TEST_SESSION_ID,
84
+ TEST_MODULE_ID,
81
85
  TEST_SUITE_ID,
82
86
  TEST_ITR_TESTS_SKIPPED,
83
87
  TEST_SESSION_ITR_SKIPPING_ENABLED,
@@ -242,26 +246,39 @@ function getCodeOwnersForFilename (filename, entries) {
242
246
  return null
243
247
  }
244
248
 
245
- function getTestSessionCommonTags (command, version) {
249
+ function getTestLevelCommonTags (command, testFrameworkVersion) {
250
+ return {
251
+ [TEST_FRAMEWORK_VERSION]: testFrameworkVersion,
252
+ [LIBRARY_VERSION]: ddTraceVersion,
253
+ [TEST_COMMAND]: command,
254
+ [TEST_TYPE]: 'test'
255
+ }
256
+ }
257
+
258
+ function getTestSessionCommonTags (command, testFrameworkVersion) {
246
259
  return {
247
260
  [SPAN_TYPE]: 'test_session_end',
248
- [TEST_TYPE]: 'test',
249
261
  [RESOURCE_NAME]: `test_session.${command}`,
250
- [TEST_FRAMEWORK_VERSION]: version,
251
- [LIBRARY_VERSION]: ddTraceVersion,
252
- [TEST_COMMAND]: command
262
+ ...getTestLevelCommonTags(command, testFrameworkVersion)
253
263
  }
254
264
  }
255
265
 
256
- function getTestSuiteCommonTags (command, version, testSuite) {
266
+ function getTestModuleCommonTags (command, testFrameworkVersion) {
267
+ return {
268
+ [SPAN_TYPE]: 'test_module_end',
269
+ [RESOURCE_NAME]: `test_module.${command}`,
270
+ [TEST_BUNDLE]: command,
271
+ ...getTestLevelCommonTags(command, testFrameworkVersion)
272
+ }
273
+ }
274
+
275
+ function getTestSuiteCommonTags (command, testFrameworkVersion, testSuite) {
257
276
  return {
258
277
  [SPAN_TYPE]: 'test_suite_end',
259
- [TEST_TYPE]: 'test',
260
278
  [RESOURCE_NAME]: `test_suite.${testSuite}`,
261
- [TEST_FRAMEWORK_VERSION]: version,
262
- [LIBRARY_VERSION]: ddTraceVersion,
279
+ [TEST_BUNDLE]: command,
263
280
  [TEST_SUITE]: testSuite,
264
- [TEST_COMMAND]: command
281
+ ...getTestLevelCommonTags(command, testFrameworkVersion)
265
282
  }
266
283
  }
267
284
 
@@ -54,16 +54,11 @@ function getUserProviderGitMetadata () {
54
54
  DD_GIT_COMMIT_AUTHOR_DATE
55
55
  } = process.env
56
56
 
57
- let branch = normalizeRef(DD_GIT_BRANCH)
57
+ const branch = normalizeRef(DD_GIT_BRANCH)
58
58
  let tag = normalizeRef(DD_GIT_TAG)
59
59
 
60
- if (DD_GIT_TAG) {
61
- branch = undefined
62
- }
63
-
64
- // if DD_GIT_BRANCH is a tag, we associate its value to TAG instead of BRANCH
60
+ // if DD_GIT_BRANCH is a tag, we associate its value to TAG too
65
61
  if ((DD_GIT_BRANCH || '').includes('origin/tags') || (DD_GIT_BRANCH || '').includes('refs/heads/tags')) {
66
- branch = undefined
67
62
  tag = normalizeRef(DD_GIT_BRANCH)
68
63
  }
69
64
 
@@ -8,6 +8,7 @@ const tags = require('../../../../../ext/tags')
8
8
  const types = require('../../../../../ext/types')
9
9
  const kinds = require('../../../../../ext/kinds')
10
10
  const urlFilter = require('./urlfilter')
11
+ const { extractIp } = require('./ip_extractor')
11
12
  const { ERROR_MESSAGE, ERROR_TYPE, ERROR_STACK } = require('../../constants')
12
13
 
13
14
  const WEB = types.WEB
@@ -24,6 +25,7 @@ const HTTP_ROUTE = tags.HTTP_ROUTE
24
25
  const HTTP_REQUEST_HEADERS = tags.HTTP_REQUEST_HEADERS
25
26
  const HTTP_RESPONSE_HEADERS = tags.HTTP_RESPONSE_HEADERS
26
27
  const HTTP_USERAGENT = tags.HTTP_USERAGENT
28
+ const HTTP_CLIENT_IP = tags.HTTP_CLIENT_IP
27
29
  const MANUAL_DROP = tags.MANUAL_DROP
28
30
 
29
31
  const HTTP2_HEADER_AUTHORITY = ':authority'
@@ -432,6 +434,15 @@ function addRequestTags (context) {
432
434
  [HTTP_USERAGENT]: req.headers['user-agent']
433
435
  })
434
436
 
437
+ // if client ip has already been set by appsec, no need to run it again
438
+ if (config.clientIpEnabled && !span.context()._tags.hasOwnProperty(HTTP_CLIENT_IP)) {
439
+ const clientIp = extractIp(config, req)
440
+
441
+ if (clientIp) {
442
+ span.setTag(HTTP_CLIENT_IP, clientIp)
443
+ }
444
+ }
445
+
435
446
  addHeaders(context)
436
447
  }
437
448
 
@@ -8,6 +8,7 @@ const log = require('./log')
8
8
  const { setStartupLogPluginManager } = require('./startup-log')
9
9
  const telemetry = require('./telemetry')
10
10
  const remoteConfig = require('./appsec/remote_config')
11
+ const AppsecSdk = require('./appsec/sdk')
11
12
 
12
13
  class Tracer extends NoopProxy {
13
14
  constructor () {
@@ -50,6 +51,7 @@ class Tracer extends NoopProxy {
50
51
  }
51
52
 
52
53
  this._tracer = new DatadogTracer(config)
54
+ this.appsec = new AppsecSdk(this._tracer)
53
55
 
54
56
  if (config.iast.enabled) {
55
57
  require('./appsec/iast').enable(config, this._tracer)
@@ -7,7 +7,7 @@ const { inspect } = require('util')
7
7
  const tracerVersion = require('../../../package.json').version
8
8
 
9
9
  const logger = Object.create(mainLogger)
10
- logger._enabled = true
10
+ logger.toggle(true)
11
11
 
12
12
  let config
13
13
  let pluginManager
@@ -0,0 +1,71 @@
1
+ /* eslint-disable no-console */
2
+
3
+ const childProcess = require('child_process')
4
+ const ORIGIN = 'origin/'
5
+
6
+ let releaseBranch = process.env['GITHUB_BASE_REF'] // 'origin/v3.x'
7
+ let releaseVersion = releaseBranch
8
+ if (releaseBranch.startsWith(ORIGIN)) {
9
+ releaseVersion = releaseBranch.substring(ORIGIN.length)
10
+ } else {
11
+ releaseBranch = ORIGIN + releaseBranch
12
+ }
13
+ let currentBranch = process.env['GITHUB_HEAD_REF'] // 'ugaitz/workflow-to-verify-dont-land-on-v3.x'
14
+ if (!currentBranch.startsWith(ORIGIN)) {
15
+ currentBranch = ORIGIN + currentBranch
16
+ }
17
+
18
+ const getHashesCommandWithExclusions = 'branch-diff --user DataDog --repo dd-trace-js --exclude-label=semver-major' +
19
+ ` --exclude-label=dont-land-on-${releaseVersion} ${releaseBranch} ${currentBranch}`
20
+ const getHashesCommandWithoutExclusions =
21
+ `branch-diff --user DataDog --repo dd-trace-js ${releaseBranch} ${currentBranch}`
22
+
23
+ childProcess.exec(getHashesCommandWithExclusions, { timeout: 30000 },
24
+ (withExclusionError, withExclusionStdout, withExclusionStderr) => {
25
+ if (withExclusionError) {
26
+ console.error(`stdout:
27
+ ${withExclusionStdout}
28
+ stderr:
29
+ ${withExclusionStderr}
30
+ `, withExclusionError)
31
+ process.exit(1)
32
+ return
33
+ }
34
+ if (withExclusionStderr) {
35
+ console.error(withExclusionStderr)
36
+ process.exit(1)
37
+ return
38
+ }
39
+ const commitsHashesWithExclusions = withExclusionStdout.split('\n')
40
+
41
+ childProcess.exec(getHashesCommandWithoutExclusions,
42
+ (withoutExclusionError, withoutExclusionStdout, withoutExclusionStderr) => {
43
+ if (withoutExclusionError) {
44
+ console.error(`stdout:
45
+ ${withoutExclusionStdout}
46
+ stderr:
47
+ ${withoutExclusionStderr}
48
+ `, withoutExclusionError)
49
+ process.exit(1)
50
+ return
51
+ }
52
+ if (withoutExclusionStderr) {
53
+ console.error(withoutExclusionStderr)
54
+ process.exit(1)
55
+ return
56
+ }
57
+ const commitsHashesWithoutExclusions = withoutExclusionStdout.split('\n')
58
+ if (commitsHashesWithExclusions.length !== commitsHashesWithoutExclusions.length) {
59
+ const commitsWithInvalidLabels = []
60
+ commitsHashesWithoutExclusions.filter(c1 => {
61
+ if (!commitsHashesWithExclusions.some(c2 => c2 === c1)) {
62
+ commitsWithInvalidLabels.push(c1)
63
+ }
64
+ })
65
+ console.error('Some excluded label added in the release proposal', commitsWithInvalidLabels)
66
+ process.exit(1)
67
+ } else {
68
+ console.log('Commit PRs label looks OK')
69
+ }
70
+ })
71
+ })
@@ -1,143 +0,0 @@
1
- 'use strict'
2
-
3
- const { storage } = require('../../datadog-core')
4
-
5
- const _default = {
6
- debug: msg => console.debug(msg), /* eslint-disable-line no-console */
7
- info: msg => console.info(msg), /* eslint-disable-line no-console */
8
- warn: msg => console.warn(msg), /* eslint-disable-line no-console */
9
- error: msg => console.error(msg) /* eslint-disable-line no-console */
10
- }
11
-
12
- // based on: https://github.com/trentm/node-bunyan#levels
13
- const _logLevels = {
14
- 'debug': 20,
15
- 'info': 30,
16
- 'warn': 40,
17
- 'error': 50
18
- }
19
-
20
- const _defaultLogLevel = 'debug'
21
-
22
- const _checkLogLevel = (logLevel) => {
23
- if (logLevel && typeof logLevel === 'string') {
24
- return _logLevels[logLevel.toLowerCase().trim()] || _logLevels[_defaultLogLevel]
25
- }
26
-
27
- return _logLevels[_defaultLogLevel]
28
- }
29
-
30
- const memoize = func => {
31
- const cache = {}
32
- const memoized = function (key) {
33
- if (!cache[key]) {
34
- cache[key] = func.apply(this, arguments)
35
- }
36
-
37
- return cache[key]
38
- }
39
-
40
- return memoized
41
- }
42
-
43
- function processMsg (msg) {
44
- return typeof msg === 'function' ? msg() : msg
45
- }
46
-
47
- function withNoop (fn) {
48
- const store = storage.getStore()
49
-
50
- storage.enterWith({ noop: true })
51
- fn()
52
- storage.enterWith(store)
53
- }
54
-
55
- const log = {
56
- _isLogLevelEnabled (level) {
57
- return _logLevels[level] >= this._logLevel
58
- },
59
-
60
- use (logger) {
61
- if (logger && logger.debug instanceof Function && logger.error instanceof Function) {
62
- this._logger = logger
63
- }
64
-
65
- return this
66
- },
67
-
68
- toggle (enabled, logLevel, tracer) {
69
- this._enabled = enabled
70
- this._logLevel = _checkLogLevel(logLevel)
71
- this._tracer = tracer
72
-
73
- return this
74
- },
75
-
76
- reset () {
77
- this._logger = _default
78
- this._enabled = false
79
- this._deprecate = memoize((code, message) => {
80
- withNoop(() => this._logger.error(message))
81
- return this
82
- })
83
- this._logLevel = _checkLogLevel()
84
-
85
- return this
86
- },
87
-
88
- debug (message) {
89
- if (this._enabled && this._isLogLevelEnabled('debug')) {
90
- withNoop(() => this._logger.debug(processMsg(message)))
91
- }
92
-
93
- return this
94
- },
95
-
96
- info (message) {
97
- if (!this._logger.info) return this.debug(message)
98
- if (this._enabled && this._isLogLevelEnabled('info')) {
99
- withNoop(() => this._logger.info(processMsg(message)))
100
- }
101
-
102
- return this
103
- },
104
-
105
- warn (message) {
106
- if (!this._logger.warn) return this.debug(message)
107
- if (this._enabled && this._isLogLevelEnabled('warn')) {
108
- withNoop(() => this._logger.warn(processMsg(message)))
109
- }
110
-
111
- return this
112
- },
113
-
114
- error (err) {
115
- if (this._enabled && this._isLogLevelEnabled('error')) {
116
- if (err instanceof Function) {
117
- err = err()
118
- }
119
-
120
- if (typeof err !== 'object' || !err) {
121
- err = String(err)
122
- } else if (!err.stack) {
123
- err = String(err.message || err)
124
- }
125
-
126
- if (typeof err === 'string') {
127
- err = new Error(err)
128
- }
129
-
130
- withNoop(() => this._logger.error(err))
131
- }
132
-
133
- return this
134
- },
135
-
136
- deprecate (code, message) {
137
- return this._deprecate(code, message)
138
- }
139
- }
140
-
141
- log.reset()
142
-
143
- module.exports = log