diff --git a/benchmark/sirun/appsec-iast/insecure-bank.js b/benchmark/sirun/appsec-iast/insecure-bank.js index d07ab7c762f..883ed471e77 100644 --- a/benchmark/sirun/appsec-iast/insecure-bank.js +++ b/benchmark/sirun/appsec-iast/insecure-bank.js @@ -1,5 +1,5 @@ const http = require('http') -const app = require('/opt/insecure-bank-js/app') // eslint-disable-line import/no-absolute-path +const app = require('/opt/insecure-bank-js/app') // eslint-disable-line import/no-absolute-path, n/no-missing-require const { port } = require('./common') diff --git a/benchmark/sirun/appsec/insecure-bank.js b/benchmark/sirun/appsec/insecure-bank.js index d07ab7c762f..883ed471e77 100644 --- a/benchmark/sirun/appsec/insecure-bank.js +++ b/benchmark/sirun/appsec/insecure-bank.js @@ -1,5 +1,5 @@ const http = require('http') -const app = require('/opt/insecure-bank-js/app') // eslint-disable-line import/no-absolute-path +const app = require('/opt/insecure-bank-js/app') // eslint-disable-line import/no-absolute-path, n/no-missing-require const { port } = require('./common') diff --git a/benchmark/sirun/plugin-bluebird/index.js b/benchmark/sirun/plugin-bluebird/index.js index 2e168ac71fe..0fb94145e18 100644 --- a/benchmark/sirun/plugin-bluebird/index.js +++ b/benchmark/sirun/plugin-bluebird/index.js @@ -4,6 +4,7 @@ if (Number(process.env.USE_TRACER)) { require('../../..').init() } +// eslint-disable-next-line n/no-missing-require const Promise = require('../../../versions/bluebird/node_modules/bluebird/js/release/bluebird') const count = process.env.COUNT ? Number(process.env.COUNT) : 50000 diff --git a/esbuild.js b/esbuild.js index 424ba5cb908..5c80493515a 100644 --- a/esbuild.js +++ b/esbuild.js @@ -1,3 +1,5 @@ 'use strict' +// TODO: It shouldn't be necessary to disable n/no-unpublished-require - Research +// eslint-disable-next-line n/no-unpublished-require module.exports = require('./packages/datadog-esbuild/index.js') diff --git a/eslint.config.mjs b/eslint.config.mjs index d15cf190fff..0d93f4cedef 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -40,11 +40,21 @@ export default [ }, { name: '@eslint/js/recommnded', ...js.configs.recommended }, ...compat.extends('standard').map((config, i) => ({ name: config.name || `standard/${i + 1}`, ...config })), + { + ...n.configs['flat/recommended'], + ignores: [ + 'packages/dd-trace/test/appsec/next/app-dir/**/*.js', + 'packages/dd-trace/test/appsec/next/pages-dir/**/*.js', + 'packages/datadog-plugin-next/test/app/**/*.js', + 'packages/datadog-plugin-next/test/**/pages/**/*.js', + 'packages/datadog-plugin-next/test/middleware.js', + '**/*.mjs' // TODO: This shoudln't be required, research why it is + ] + }, { name: 'dd-trace/defaults', plugins: { - n, '@stylistic/js': stylistic }, @@ -72,6 +82,15 @@ export default [ '@stylistic/js/object-curly-spacing': ['error', 'always'], 'import/no-extraneous-dependencies': 'error', 'n/no-restricted-require': ['error', ['diagnostics_channel']], + 'n/hashbang': 'off', // TODO: Enable this rule once we have a plan to address it + 'n/no-process-exit': 'off', // TODO: Enable this rule once we have a plan to address it + 'n/no-unsupported-features/node-builtins': ['error', { + ignores: [ + 'async_hooks.createHook', + 'async_hooks.executionAsyncId', + 'async_hooks.executionAsyncResource' + ] + }], 'no-console': 'error', 'no-prototype-builtins': 'off', // Override (turned on by @eslint/js/recommnded) 'no-unused-expressions': 'off', // Override (turned on by standard) @@ -107,7 +126,8 @@ export default [ 'mocha/no-sibling-hooks': 'off', 'mocha/no-skipped-tests': 'off', 'mocha/no-top-level-hooks': 'off', - 'n/handle-callback-err': 'off' + 'n/handle-callback-err': 'off', + 'n/no-missing-require': 'off' } }, { diff --git a/index.js b/index.js index a8c61274ad8..ed48ff2fea5 100644 --- a/index.js +++ b/index.js @@ -1,3 +1,5 @@ 'use strict' +// TODO: It shouldn't be necessary to disable n/no-unpublished-require - Research +// eslint-disable-next-line n/no-unpublished-require module.exports = require('./packages/dd-trace') diff --git a/init.js b/init.js index 625d493b3b1..63fa9ba96be 100644 --- a/init.js +++ b/init.js @@ -2,6 +2,8 @@ /* eslint-disable no-var */ +// TODO: It shouldn't be necessary to disable n/no-unpublished-require - Research +// eslint-disable-next-line n/no-unpublished-require var guard = require('./packages/dd-trace/src/guardrails') module.exports = guard(function () { diff --git a/initialize.mjs b/initialize.mjs index b7303848430..d9b08512797 100644 --- a/initialize.mjs +++ b/initialize.mjs @@ -10,6 +10,8 @@ * hook will always be active for ESM support. */ +/* eslint n/no-unsupported-features/node-builtins: ['error', { ignores: ['module.register'] }] */ + import { isMainThread } from 'worker_threads' import * as Module from 'node:module' diff --git a/integration-tests/appsec/esm-app/index.mjs b/integration-tests/appsec/esm-app/index.mjs index 44dce0b46dc..dd531248f76 100644 --- a/integration-tests/appsec/esm-app/index.mjs +++ b/integration-tests/appsec/esm-app/index.mjs @@ -1,4 +1,5 @@ 'use strict' +/* eslint n/no-unsupported-features/node-builtins: ['error', { ignores: ['module.register'] }] */ import childProcess from 'node:child_process' import express from 'express' diff --git a/integration-tests/appsec/multer.spec.js b/integration-tests/appsec/multer.spec.js index b87d7d268b0..cd95ce211e4 100644 --- a/integration-tests/appsec/multer.spec.js +++ b/integration-tests/appsec/multer.spec.js @@ -1,4 +1,5 @@ 'use strict' +/* eslint n/no-unsupported-features/node-builtins: ['error', { allowExperimental: true }] */ const { assert } = require('chai') const path = require('path') diff --git a/integration-tests/ci-visibility/run-workerpool.js b/integration-tests/ci-visibility/run-workerpool.js index 4ab60a1fc0c..6dbd24e6951 100644 --- a/integration-tests/ci-visibility/run-workerpool.js +++ b/integration-tests/ci-visibility/run-workerpool.js @@ -1,4 +1,4 @@ -const workerpool = require('workerpool') +const workerpool = require('workerpool') // eslint-disable-line n/no-extraneous-require const pool = workerpool.pool({ workerType: 'process' }) function add (a, b) { diff --git a/integration-tests/ci-visibility/subproject/cypress.config.js b/integration-tests/ci-visibility/subproject/cypress.config.js index 9a786e4ef75..598e98ced81 100644 --- a/integration-tests/ci-visibility/subproject/cypress.config.js +++ b/integration-tests/ci-visibility/subproject/cypress.config.js @@ -2,7 +2,7 @@ module.exports = { defaultCommandTimeout: 100, e2e: { setupNodeEvents (on, config) { - return require('dd-trace/ci/cypress/plugin')(on, config) + return require('dd-trace/ci/cypress/plugin')(on, config) // eslint-disable-line n/no-extraneous-require }, specPattern: process.env.SPEC_PATTERN || 'cypress/e2e/**/*.cy.js' }, diff --git a/integration-tests/ci-visibility/subproject/cypress/plugins-old/index.js b/integration-tests/ci-visibility/subproject/cypress/plugins-old/index.js index f80695694a9..097d842adcb 100644 --- a/integration-tests/ci-visibility/subproject/cypress/plugins-old/index.js +++ b/integration-tests/ci-visibility/subproject/cypress/plugins-old/index.js @@ -1 +1 @@ -module.exports = require('dd-trace/ci/cypress/plugin') +module.exports = require('dd-trace/ci/cypress/plugin') // eslint-disable-line n/no-extraneous-require diff --git a/integration-tests/ci-visibility/subproject/cypress/support/e2e.js b/integration-tests/ci-visibility/subproject/cypress/support/e2e.js index 26fdad7588a..e758459d14b 100644 --- a/integration-tests/ci-visibility/subproject/cypress/support/e2e.js +++ b/integration-tests/ci-visibility/subproject/cypress/support/e2e.js @@ -1 +1 @@ -require('dd-trace/ci/cypress/support') +require('dd-trace/ci/cypress/support') // eslint-disable-line n/no-extraneous-require diff --git a/integration-tests/ci-visibility/subproject/subproject-test.js b/integration-tests/ci-visibility/subproject/subproject-test.js index 1545789c108..262f93e2dd4 100644 --- a/integration-tests/ci-visibility/subproject/subproject-test.js +++ b/integration-tests/ci-visibility/subproject/subproject-test.js @@ -1,4 +1,3 @@ -const { expect } = require('chai') const dependency = require('./dependency') describe('subproject-test', () => { diff --git a/packages/datadog-instrumentations/src/fetch.js b/packages/datadog-instrumentations/src/fetch.js index 94f40b6a70d..d418ec5949b 100644 --- a/packages/datadog-instrumentations/src/fetch.js +++ b/packages/datadog-instrumentations/src/fetch.js @@ -1,4 +1,5 @@ 'use strict' +/* eslint n/no-unsupported-features/node-builtins: ['error', { ignores: ['fetch', 'Request'] }] */ const shimmer = require('../../datadog-shimmer') const { tracingChannel } = require('dc-polyfill') diff --git a/packages/datadog-instrumentations/test/multer.spec.js b/packages/datadog-instrumentations/test/multer.spec.js index 8bd01b5af49..b699f1c4e82 100644 --- a/packages/datadog-instrumentations/test/multer.spec.js +++ b/packages/datadog-instrumentations/test/multer.spec.js @@ -1,4 +1,5 @@ 'use strict' +/* eslint n/no-unsupported-features/node-builtins: ['error', { ignores: ['FormData'] }] */ const dc = require('dc-polyfill') const axios = require('axios') diff --git a/packages/datadog-plugin-fetch/test/index.spec.js b/packages/datadog-plugin-fetch/test/index.spec.js index bf18053952f..130c9c44637 100644 --- a/packages/datadog-plugin-fetch/test/index.spec.js +++ b/packages/datadog-plugin-fetch/test/index.spec.js @@ -1,4 +1,5 @@ 'use strict' +/* eslint n/no-unsupported-features/node-builtins: ['error', { ignores: ['fetch', 'Request'] }] */ const agent = require('../../dd-trace/test/plugins/agent') const tags = require('../../../ext/tags') diff --git a/packages/datadog-plugin-fetch/test/integration-test/client.spec.js b/packages/datadog-plugin-fetch/test/integration-test/client.spec.js index 922c889134d..a491883e40e 100644 --- a/packages/datadog-plugin-fetch/test/integration-test/client.spec.js +++ b/packages/datadog-plugin-fetch/test/integration-test/client.spec.js @@ -7,6 +7,7 @@ const { } = require('../../../../integration-tests/helpers') const { assert } = require('chai') +// eslint-disable-next-line n/no-unsupported-features/node-builtins const describe = globalThis.fetch ? globalThis.describe : globalThis.describe.skip describe('esm', () => { diff --git a/packages/datadog-plugin-fetch/test/integration-test/server.mjs b/packages/datadog-plugin-fetch/test/integration-test/server.mjs index 578d66a12ca..9835bd5bcd3 100644 --- a/packages/datadog-plugin-fetch/test/integration-test/server.mjs +++ b/packages/datadog-plugin-fetch/test/integration-test/server.mjs @@ -1,3 +1,5 @@ +/* eslint n/no-unsupported-features/node-builtins: ['error', { ignores: ['fetch'] }] */ + import 'dd-trace/init.js' import getPort from 'get-port' diff --git a/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js b/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js index 9b446f2416e..6b22bd0e083 100644 --- a/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +++ b/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js @@ -1,4 +1,5 @@ 'use strict' +/* eslint n/no-unsupported-features/node-builtins: ['error', { ignores: ['module.register'] }] */ const Module = require('module') const { pathToFileURL } = require('url') diff --git a/packages/dd-trace/src/debugger/devtools_client/inspector_promises_polyfill.js b/packages/dd-trace/src/debugger/devtools_client/inspector_promises_polyfill.js index bb4b0340be6..a940065a62d 100644 --- a/packages/dd-trace/src/debugger/devtools_client/inspector_promises_polyfill.js +++ b/packages/dd-trace/src/debugger/devtools_client/inspector_promises_polyfill.js @@ -1,4 +1,5 @@ 'use strict' +/* eslint n/no-unsupported-features/node-builtins: ['error', { ignores: ['inspector/promises'] }] */ const { builtinModules } = require('node:module') diff --git a/packages/dd-trace/src/profiling/exporters/event_serializer.js b/packages/dd-trace/src/profiling/exporters/event_serializer.js index 9cfc89eb5f2..df83c6b96a5 100644 --- a/packages/dd-trace/src/profiling/exporters/event_serializer.js +++ b/packages/dd-trace/src/profiling/exporters/event_serializer.js @@ -1,3 +1,6 @@ +'use strict' +/* eslint n/no-unsupported-features/node-builtins: ['error', { ignores: ['os.availableParallelism'] }] */ + const os = require('os') const perf = require('perf_hooks').performance const version = require('../../../../../package.json').version diff --git a/packages/dd-trace/src/runtime_metrics.js b/packages/dd-trace/src/runtime_metrics.js index f16b227ca18..55574b093ed 100644 --- a/packages/dd-trace/src/runtime_metrics.js +++ b/packages/dd-trace/src/runtime_metrics.js @@ -1,4 +1,5 @@ 'use strict' +/* eslint n/no-unsupported-features/node-builtins: ['error', { ignores: ['v8.GCProfiler'] }] */ // TODO: capture every second and flush every 10 seconds diff --git a/packages/dd-trace/test/appsec/iast/analyzers/path-traversal-analyzer.spec.js b/packages/dd-trace/test/appsec/iast/analyzers/path-traversal-analyzer.spec.js index f914006b5e0..e796379addb 100644 --- a/packages/dd-trace/test/appsec/iast/analyzers/path-traversal-analyzer.spec.js +++ b/packages/dd-trace/test/appsec/iast/analyzers/path-traversal-analyzer.spec.js @@ -1,4 +1,5 @@ 'use strict' +/* eslint n/no-unsupported-features/node-builtins: ['error', { ignores: ['fs.cp'] }] */ const os = require('os') const path = require('path') diff --git a/packages/dd-trace/test/appsec/iast/resources/vm.js b/packages/dd-trace/test/appsec/iast/resources/vm.js index 3719d445c43..63f648aae50 100644 --- a/packages/dd-trace/test/appsec/iast/resources/vm.js +++ b/packages/dd-trace/test/appsec/iast/resources/vm.js @@ -1,4 +1,5 @@ 'use strict' +/* eslint n/no-unsupported-features/node-builtins: ['error', { ignores: ['vm.SourceTextModule'] }] */ const tracer = require('dd-trace') tracer.init({ diff --git a/packages/dd-trace/test/appsec/index.next.plugin.spec.js b/packages/dd-trace/test/appsec/index.next.plugin.spec.js index de711c5ff94..8acb5e780a9 100644 --- a/packages/dd-trace/test/appsec/index.next.plugin.spec.js +++ b/packages/dd-trace/test/appsec/index.next.plugin.spec.js @@ -1,4 +1,5 @@ 'use strict' +/* eslint n/no-unsupported-features/node-builtins: ['error', { ignores: ['fs.cpSync'] }] */ const { spawn, execSync } = require('child_process') const { cpSync, mkdirSync, rmdirSync, unlinkSync } = require('fs') diff --git a/register.js b/register.js index 58adc77bd68..5144929337d 100644 --- a/register.js +++ b/register.js @@ -1,3 +1,5 @@ +/* eslint n/no-unsupported-features/node-builtins: ['error', { version: '>=20.6.0', allowExperimental: true }] */ + const { register } = require('node:module') const { pathToFileURL } = require('node:url') diff --git a/scripts/get-chrome-driver-download-url.js b/scripts/get-chrome-driver-download-url.js index 99f98a9079b..10000ffaf9e 100644 --- a/scripts/get-chrome-driver-download-url.js +++ b/scripts/get-chrome-driver-download-url.js @@ -1,3 +1,5 @@ +/* eslint n/no-unsupported-features/node-builtins: ['error', { version: '>=21.0.0', allowExperimental: true }] */ + const URL = 'https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json' // Get chrome driver download URL from a given chrome version, provided via CHROME_VERSION env var diff --git a/scripts/verify-ci-config.js b/scripts/verify-ci-config.js index becc7287487..94cbb9b6a70 100644 --- a/scripts/verify-ci-config.js +++ b/scripts/verify-ci-config.js @@ -1,5 +1,6 @@ 'use strict' /* eslint-disable no-console */ +/* eslint n/no-unsupported-features/node-builtins: ['error', { version: '>=22.0.0', allowExperimental: true }] */ const fs = require('fs') const path = require('path')