eslint-plugin-n 17.13.2 → 17.15.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.
@@ -8,6 +8,7 @@ const { checkExtraneous, messages } = require("../util/check-extraneous")
8
8
  const getAllowModules = require("../util/get-allow-modules")
9
9
  const getConvertPath = require("../util/get-convert-path")
10
10
  const getResolvePaths = require("../util/get-resolve-paths")
11
+ const getResolverConfig = require("../util/get-resolver-config")
11
12
  const visitImport = require("../util/visit-import")
12
13
 
13
14
  /** @type {import('eslint').Rule.RuleModule} */
@@ -28,6 +29,7 @@ module.exports = {
28
29
  allowModules: getAllowModules.schema,
29
30
  convertPath: getConvertPath.schema,
30
31
  resolvePaths: getResolvePaths.schema,
32
+ resolverConfig: getResolverConfig.schema,
31
33
  },
32
34
  additionalProperties: false,
33
35
  },
@@ -8,6 +8,7 @@ const { checkExtraneous, messages } = require("../util/check-extraneous")
8
8
  const getAllowModules = require("../util/get-allow-modules")
9
9
  const getConvertPath = require("../util/get-convert-path")
10
10
  const getResolvePaths = require("../util/get-resolve-paths")
11
+ const getResolverConfig = require("../util/get-resolver-config")
11
12
  const getTryExtensions = require("../util/get-try-extensions")
12
13
  const visitRequire = require("../util/visit-require")
13
14
 
@@ -29,6 +30,7 @@ module.exports = {
29
30
  allowModules: getAllowModules.schema,
30
31
  convertPath: getConvertPath.schema,
31
32
  resolvePaths: getResolvePaths.schema,
33
+ resolverConfig: getResolverConfig.schema,
32
34
  tryExtensions: getTryExtensions.schema,
33
35
  },
34
36
  additionalProperties: false,
@@ -7,6 +7,7 @@
7
7
  const { checkExistence, messages } = require("../util/check-existence")
8
8
  const getAllowModules = require("../util/get-allow-modules")
9
9
  const getResolvePaths = require("../util/get-resolve-paths")
10
+ const getResolverConfig = require("../util/get-resolver-config")
10
11
  const getTryExtensions = require("../util/get-try-extensions")
11
12
  const getTSConfig = require("../util/get-tsconfig")
12
13
  const getTypescriptExtensionMap = require("../util/get-typescript-extension-map")
@@ -29,6 +30,7 @@ module.exports = {
29
30
  properties: {
30
31
  allowModules: getAllowModules.schema,
31
32
  resolvePaths: getResolvePaths.schema,
33
+ resolverConfig: getResolverConfig.schema,
32
34
  tryExtensions: getTryExtensions.schema,
33
35
  ignoreTypeImport: { type: "boolean", default: false },
34
36
  tsconfigPath: getTSConfig.schema,
@@ -7,6 +7,7 @@
7
7
  const { checkExistence, messages } = require("../util/check-existence")
8
8
  const getAllowModules = require("../util/get-allow-modules")
9
9
  const getResolvePaths = require("../util/get-resolve-paths")
10
+ const getResolverConfig = require("../util/get-resolver-config")
10
11
  const getTSConfig = require("../util/get-tsconfig")
11
12
  const getTryExtensions = require("../util/get-try-extensions")
12
13
  const getTypescriptExtensionMap = require("../util/get-typescript-extension-map")
@@ -30,6 +31,7 @@ module.exports = {
30
31
  allowModules: getAllowModules.schema,
31
32
  tryExtensions: getTryExtensions.schema,
32
33
  resolvePaths: getResolvePaths.schema,
34
+ resolverConfig: getResolverConfig.schema,
33
35
  typescriptExtensionMap: getTypescriptExtensionMap.schema,
34
36
  tsconfigPath: getTSConfig.schema,
35
37
  },
@@ -4,23 +4,13 @@
4
4
  */
5
5
  "use strict"
6
6
 
7
- const allowedAtRootLevelSelector = [
7
+ const selectors = [
8
8
  // fs.readFileSync()
9
- ":function MemberExpression > Identifier[name=/Sync$/]",
10
9
  // readFileSync.call(null, 'path')
11
- ":function MemberExpression > Identifier[name=/Sync$/]",
10
+ "CallExpression > MemberExpression.callee Identifier[name=/Sync$/]",
12
11
  // readFileSync()
13
- ":function :not(MemberExpression) > Identifier[name=/Sync$/]",
14
- ].join(",")
15
-
16
- const disallowedAtRootLevelSelector = [
17
- // fs.readFileSync()
18
- "MemberExpression > Identifier[name=/Sync$/]",
19
- // readFileSync.call(null, 'path')
20
- "MemberExpression > Identifier[name=/Sync$/]",
21
- // readFileSync()
22
- ":not(MemberExpression) > Identifier[name=/Sync$/]",
23
- ].join(",")
12
+ "CallExpression > Identifier[name=/Sync$/]",
13
+ ]
24
14
 
25
15
  /** @type {import('eslint').Rule.RuleModule} */
26
16
  module.exports = {
@@ -40,6 +30,11 @@ module.exports = {
40
30
  type: "boolean",
41
31
  default: false,
42
32
  },
33
+ ignores: {
34
+ type: "array",
35
+ items: { type: "string" },
36
+ default: [],
37
+ },
43
38
  },
44
39
  additionalProperties: false,
45
40
  },
@@ -50,17 +45,22 @@ module.exports = {
50
45
  },
51
46
 
52
47
  create(context) {
53
- const selector = context.options[0]?.allowAtRootLevel
54
- ? allowedAtRootLevelSelector
55
- : disallowedAtRootLevelSelector
48
+ const options = context.options[0] ?? {}
49
+ const ignores = options.ignores ?? []
56
50
 
51
+ const selector = options.allowAtRootLevel
52
+ ? selectors.map(selector => `:function ${selector}`)
53
+ : selectors
57
54
  return {
58
55
  /**
59
- * [node description]
60
56
  * @param {import('estree').Identifier & {parent: import('estree').Node}} node
61
57
  * @returns {void}
62
58
  */
63
- [selector](node) {
59
+ [selector.join(",")](node) {
60
+ if (ignores.includes(node.name)) {
61
+ return
62
+ }
63
+
64
64
  context.report({
65
65
  node: node.parent,
66
66
  messageId: "noSync",
@@ -8,6 +8,7 @@ const { checkPublish, messages } = require("../util/check-publish")
8
8
  const getAllowModules = require("../util/get-allow-modules")
9
9
  const getConvertPath = require("../util/get-convert-path")
10
10
  const getResolvePaths = require("../util/get-resolve-paths")
11
+ const getResolverConfig = require("../util/get-resolver-config")
11
12
  const visitImport = require("../util/visit-import")
12
13
 
13
14
  /** @type {import('eslint').Rule.RuleModule} */
@@ -28,6 +29,7 @@ module.exports = {
28
29
  allowModules: getAllowModules.schema,
29
30
  convertPath: getConvertPath.schema,
30
31
  resolvePaths: getResolvePaths.schema,
32
+ resolverConfig: getResolverConfig.schema,
31
33
  ignoreTypeImport: { type: "boolean", default: false },
32
34
  ignorePrivate: { type: "boolean", default: true },
33
35
  },
@@ -8,6 +8,7 @@ const { checkPublish, messages } = require("../util/check-publish")
8
8
  const getAllowModules = require("../util/get-allow-modules")
9
9
  const getConvertPath = require("../util/get-convert-path")
10
10
  const getResolvePaths = require("../util/get-resolve-paths")
11
+ const getResolverConfig = require("../util/get-resolver-config")
11
12
  const getTryExtensions = require("../util/get-try-extensions")
12
13
  const visitRequire = require("../util/visit-require")
13
14
 
@@ -29,6 +30,7 @@ module.exports = {
29
30
  allowModules: getAllowModules.schema,
30
31
  convertPath: getConvertPath.schema,
31
32
  resolvePaths: getResolvePaths.schema,
33
+ resolverConfig: getResolverConfig.schema,
32
34
  tryExtensions: getTryExtensions.schema,
33
35
  ignorePrivate: { type: "boolean", default: true },
34
36
  },
@@ -20,10 +20,12 @@ const Module = {
20
20
  },
21
21
  },
22
22
  enableCompileCache: { [READ]: { experimental: ["22.8.0"] } },
23
+ findPackageJSON: { [READ]: { experimental: ["23.2.0"] } },
23
24
  flushCompileCache: { [READ]: { experimental: ["23.0.0", "22.10.0"] } },
24
25
  getCompileCacheDir: { [READ]: { experimental: ["22.8.0"] } },
25
26
  isBuiltin: { [READ]: { supported: ["18.6.0", "16.17.0"] } },
26
27
  register: { [READ]: { experimental: ["20.6.0"] } },
28
+ stripTypeScriptTypes: { [READ]: { experimental: ["23.2.0"] } },
27
29
  syncBuiltinESMExports: { [READ]: { supported: ["12.12.0"] } },
28
30
  findSourceMap: { [READ]: { supported: ["13.7.0", "12.17.0"] } },
29
31
  SourceMap: { [READ]: { supported: ["13.7.0", "12.17.0"] } },
@@ -55,6 +55,7 @@ const process = {
55
55
  experimental: ["11.8.0"],
56
56
  supported: ["13.12.0", "12.17.0"],
57
57
  },
58
+ excludeEnv: { [READ]: { supported: ["23.3.0"] } },
58
59
  },
59
60
  sourceMapsEnabled: { [READ]: { experimental: ["20.7.0"] } },
60
61
  stdin: {
@@ -8,6 +8,9 @@ const { READ } = require("@eslint-community/eslint-utils")
8
8
  const sqlite = {
9
9
  DatabaseSync: { [READ]: { supported: ["22.5.0"] } },
10
10
  StatementSync: { [READ]: { supported: ["22.5.0"] } },
11
+ SQLITE_CHANGESET_OMIT: { [READ]: { supported: ["22.12.0"] } },
12
+ SQLITE_CHANGESET_REPLACE: { [READ]: { supported: ["22.12.0"] } },
13
+ SQLITE_CHANGESET_ABORT: { [READ]: { supported: ["22.12.0"] } },
11
14
  }
12
15
 
13
16
  /**
@@ -94,10 +94,13 @@ const util = {
94
94
  deprecate: { [READ]: { supported: ["0.8.0"] } },
95
95
  format: { [READ]: { supported: ["0.5.3"] } },
96
96
  formatWithOptions: { [READ]: { supported: ["10.0.0"] } },
97
- getCallSite: { [READ]: { experimental: ["22.9.0"] } },
97
+ getCallSite: {
98
+ [READ]: { deprecated: ["23.3.0", "22.12.0"], experimental: ["22.9.0"] },
99
+ },
100
+ getCallSites: { [READ]: { experimental: ["23.3.0", "22.12.0"] } },
98
101
  getSystemErrorName: { [READ]: { supported: ["9.7.0", "8.12.0"] } },
99
102
  getSystemErrorMap: { [READ]: { supported: ["16.0.0", "14.17.0"] } },
100
- getSystemErrorMessage: { [READ]: { supported: ["23.1.0"] } },
103
+ getSystemErrorMessage: { [READ]: { supported: ["23.1.0", "22.12.0"] } },
101
104
  inherits: { [READ]: { supported: ["0.3.0"] } },
102
105
  inspect: {
103
106
  [READ]: { supported: ["0.3.0"] },
@@ -15,15 +15,16 @@ const unprefixNodeColon = require("./unprefix-node-colon")
15
15
  * Enumerate property names of a given object recursively.
16
16
  * @param {TraceMap} traceMap The map for APIs to enumerate.
17
17
  * @param {string[]} [path] The path to the current map.
18
- * @param {WeakSet<TraceMap>} [recursionSet] A WeakSet used to block recursion (eg Module, Module.Module, Module.Module.Module)
18
+ * @param {{ [key: string]: WeakSet<TraceMap> }} [recursion] An object to block recursion (per module)
19
19
  * @returns {IterableIterator<string>} The property names of the map.
20
20
  */
21
- function* enumeratePropertyNames(
22
- traceMap,
23
- path = [],
24
- recursionSet = new WeakSet()
25
- ) {
26
- if (recursionSet.has(traceMap)) {
21
+ function* enumeratePropertyNames(traceMap, path = [], recursion = {}) {
22
+ const recursionSet =
23
+ typeof path[0] === "string"
24
+ ? (recursion[path[0]] ??= new WeakSet())
25
+ : undefined
26
+
27
+ if (recursionSet?.has(traceMap)) {
27
28
  return
28
29
  }
29
30
 
@@ -48,11 +49,8 @@ function* enumeratePropertyNames(
48
49
  yield childName
49
50
  }
50
51
 
51
- yield* enumeratePropertyNames(
52
- childValue,
53
- childPath,
54
- recursionSet.add(traceMap)
55
- )
52
+ recursionSet?.add(traceMap)
53
+ yield* enumeratePropertyNames(childValue, childPath, recursion)
56
54
  }
57
55
  }
58
56
 
@@ -0,0 +1,47 @@
1
+ /**
2
+ * @author Toru Nagashima
3
+ * See LICENSE file in root directory for full license.
4
+ */
5
+ "use strict"
6
+
7
+ /**
8
+ * @typedef {Partial<import('enhanced-resolve').ResolveOptions>} ResolverConfig
9
+ */
10
+
11
+ /** @type {ResolverConfig} */
12
+ const DEFAULT_VALUE = {}
13
+
14
+ /**
15
+ * Gets `resolverConfig` property from a given option object.
16
+ *
17
+ * @param {{ resolverConfig: ResolverConfig } | undefined} option - An option object to get.
18
+ * @returns {ResolverConfig | undefined} The `allowModules` value, or `null`.
19
+ */
20
+ function get(option) {
21
+ if (option?.resolverConfig) return option.resolverConfig
22
+ }
23
+
24
+ /**
25
+ * Gets "resolverConfig" setting.
26
+ *
27
+ * 1. This checks `options` property, then returns it if exists.
28
+ * 2. This checks `settings.n` | `settings.node` property, then returns it if exists.
29
+ * 3. This returns `[]`.
30
+ *
31
+ * @param {import('eslint').Rule.RuleContext} context - The rule context.
32
+ * @returns {ResolverConfig} A resolver config object.
33
+ */
34
+ module.exports = function getResolverConfig(context, optionIndex = 0) {
35
+ return (
36
+ get(context.options?.[optionIndex]) ??
37
+ get(context.settings?.n) ??
38
+ get(context.settings?.node) ??
39
+ DEFAULT_VALUE
40
+ )
41
+ }
42
+
43
+ module.exports.schema = {
44
+ type: "object",
45
+ properties: {},
46
+ additionalProperties: true,
47
+ }
@@ -71,6 +71,7 @@ function getTSConfigAliases(context) {
71
71
  * @typedef Options
72
72
  * @property {string[]} [extensions]
73
73
  * @property {string[]} [paths]
74
+ * @property {Partial<import('enhanced-resolve').ResolveOptions>} [resolverConfig]
74
75
  * @property {string} basedir
75
76
  */
76
77
  /** @typedef { 'unknown' | 'relative' | 'absolute' | 'node' | 'npm' | 'http' } ModuleType */
@@ -323,6 +324,11 @@ module.exports = class ImportTarget {
323
324
  ).backward
324
325
  }
325
326
 
327
+ this.resolverConfig = {
328
+ ...this.resolverConfig,
329
+ ...this.options.resolverConfig,
330
+ }
331
+
326
332
  const requireResolve = resolver.create.sync(this.resolverConfig)
327
333
 
328
334
  const cwd = this.context.settings?.cwd ?? process.cwd()
@@ -7,6 +7,7 @@
7
7
  const path = require("path")
8
8
  const { isBuiltin } = require("node:module")
9
9
  const getResolvePaths = require("./get-resolve-paths")
10
+ const getResolverConfig = require("./get-resolver-config")
10
11
  const getTryExtensions = require("./get-try-extensions")
11
12
  const ImportTarget = require("./import-target")
12
13
  const stripImportPathParams = require("./strip-import-path-params")
@@ -41,8 +42,9 @@ module.exports = function visitImport(
41
42
  path.resolve(context.filename ?? context.getFilename())
42
43
  )
43
44
  const paths = getResolvePaths(context, optionIndex)
45
+ const resolverConfig = getResolverConfig(context, optionIndex)
44
46
  const extensions = getTryExtensions(context, optionIndex)
45
- const options = { basedir, paths, extensions }
47
+ const options = { basedir, paths, extensions, resolverConfig }
46
48
 
47
49
  /**
48
50
  * @param {(
@@ -12,6 +12,7 @@ const {
12
12
  } = require("@eslint-community/eslint-utils")
13
13
  const { isBuiltin } = require("node:module")
14
14
  const getResolvePaths = require("./get-resolve-paths")
15
+ const getResolverConfig = require("./get-resolver-config")
15
16
  const getTryExtensions = require("./get-try-extensions")
16
17
  const ImportTarget = require("./import-target")
17
18
  const stripImportPathParams = require("./strip-import-path-params")
@@ -42,8 +43,9 @@ module.exports = function visitRequire(
42
43
  path.resolve(context.filename ?? context.getFilename())
43
44
  )
44
45
  const paths = getResolvePaths(context)
46
+ const resolverConfig = getResolverConfig(context)
45
47
  const extensions = getTryExtensions(context)
46
- const options = { basedir, paths, extensions }
48
+ const options = { basedir, paths, extensions, resolverConfig }
47
49
 
48
50
  return {
49
51
  "Program:exit"(node) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eslint-plugin-n",
3
- "version": "17.13.2",
3
+ "version": "17.15.0",
4
4
  "description": "Additional ESLint's rules for Node.js",
5
5
  "engines": {
6
6
  "node": "^18.18.0 || ^20.9.0 || >=21.1.0"