From af4f774be560ac9472d98c99082a678ca5703574 Mon Sep 17 00:00:00 2001 From: Sebastian Good <2230835+scagood@users.noreply.github.com> Date: Fri, 6 Dec 2024 09:14:59 +0000 Subject: [PATCH 1/4] feat(no-unsupported): support node 22.12.0 (#393) --- lib/unsupported-features/node-builtins-modules/sqlite.js | 3 +++ lib/unsupported-features/node-builtins-modules/util.js | 6 +++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/unsupported-features/node-builtins-modules/sqlite.js b/lib/unsupported-features/node-builtins-modules/sqlite.js index cb886040..0cefedcb 100644 --- a/lib/unsupported-features/node-builtins-modules/sqlite.js +++ b/lib/unsupported-features/node-builtins-modules/sqlite.js @@ -8,6 +8,9 @@ const { READ } = require("@eslint-community/eslint-utils") const sqlite = { DatabaseSync: { [READ]: { supported: ["22.5.0"] } }, StatementSync: { [READ]: { supported: ["22.5.0"] } }, + SQLITE_CHANGESET_OMIT: { [READ]: { supported: ["22.12.0"] } }, + SQLITE_CHANGESET_REPLACE: { [READ]: { supported: ["22.12.0"] } }, + SQLITE_CHANGESET_ABORT: { [READ]: { supported: ["22.12.0"] } }, } /** diff --git a/lib/unsupported-features/node-builtins-modules/util.js b/lib/unsupported-features/node-builtins-modules/util.js index 752de056..294c6b06 100644 --- a/lib/unsupported-features/node-builtins-modules/util.js +++ b/lib/unsupported-features/node-builtins-modules/util.js @@ -95,12 +95,12 @@ const util = { format: { [READ]: { supported: ["0.5.3"] } }, formatWithOptions: { [READ]: { supported: ["10.0.0"] } }, getCallSite: { - [READ]: { deprecated: ["23.3.0"], experimental: ["22.9.0"] }, + [READ]: { deprecated: ["23.3.0", "22.12.0"], experimental: ["22.9.0"] }, }, - getCallSites: { [READ]: { experimental: ["23.3.0"] } }, + getCallSites: { [READ]: { experimental: ["23.3.0", "22.12.0"] } }, getSystemErrorName: { [READ]: { supported: ["9.7.0", "8.12.0"] } }, getSystemErrorMap: { [READ]: { supported: ["16.0.0", "14.17.0"] } }, - getSystemErrorMessage: { [READ]: { supported: ["23.1.0"] } }, + getSystemErrorMessage: { [READ]: { supported: ["23.1.0", "22.12.0"] } }, inherits: { [READ]: { supported: ["0.3.0"] } }, inspect: { [READ]: { supported: ["0.3.0"] }, From 1466bec9050606ea874444452a4d58484b480a14 Mon Sep 17 00:00:00 2001 From: Gert Sallaerts <1267900+GertSallaerts@users.noreply.github.com> Date: Tue, 10 Dec 2024 03:02:38 +0100 Subject: [PATCH 2/4] feat(resolve): allow overriding enhanced-resolve's options (#384) --- docs/rules/no-extraneous-import.md | 5 ++ docs/rules/no-extraneous-require.md | 5 ++ docs/rules/no-missing-import.md | 5 ++ docs/rules/no-missing-require.md | 5 ++ docs/rules/no-unpublished-import.md | 5 ++ docs/rules/no-unpublished-require.md | 5 ++ docs/shared-settings.md | 24 ++++++++++ lib/rules/no-extraneous-import.js | 2 + lib/rules/no-extraneous-require.js | 2 + lib/rules/no-missing-import.js | 2 + lib/rules/no-missing-require.js | 2 + lib/rules/no-unpublished-import.js | 2 + lib/rules/no-unpublished-require.js | 2 + lib/util/get-resolver-config.js | 47 +++++++++++++++++++ lib/util/import-target.js | 6 +++ lib/util/visit-import.js | 4 +- lib/util/visit-require.js | 4 +- .../no-missing/my_modules/my-module/a-file.js | 0 .../my_modules/my-module/package.json | 3 ++ tests/lib/rules/no-missing-require.js | 25 ++++++++++ 20 files changed, 153 insertions(+), 2 deletions(-) create mode 100644 lib/util/get-resolver-config.js create mode 100644 tests/fixtures/no-missing/my_modules/my-module/a-file.js create mode 100644 tests/fixtures/no-missing/my_modules/my-module/package.json diff --git a/docs/rules/no-extraneous-import.md b/docs/rules/no-extraneous-import.md index fbeaaa63..1dee0836 100644 --- a/docs/rules/no-extraneous-import.md +++ b/docs/rules/no-extraneous-import.md @@ -37,6 +37,11 @@ Please see the shared settings documentation for more information. This can be configured in the rule options or as a shared setting [`settings.resolvePaths`](../shared-settings.md#resolvepaths). Please see the shared settings documentation for more information. +#### resolverConfig + +This can be configured in the rule options or as a shared setting [`settings.resolverConfig`](../shared-settings.md#resolverconfig). +Please see the shared settings documentation for more information. + #### convertPath This can be configured in the rule options or as a shared setting [`settings.convertPath`](../shared-settings.md#convertpath). diff --git a/docs/rules/no-extraneous-require.md b/docs/rules/no-extraneous-require.md index 25a54224..430a1bc0 100644 --- a/docs/rules/no-extraneous-require.md +++ b/docs/rules/no-extraneous-require.md @@ -38,6 +38,11 @@ Please see the shared settings documentation for more information. This can be configured in the rule options or as a shared setting [`settings.resolvePaths`](../shared-settings.md#resolvepaths). Please see the shared settings documentation for more information. +#### resolverConfig + +This can be configured in the rule options or as a shared setting [`settings.resolverConfig`](../shared-settings.md#resolverconfig). +Please see the shared settings documentation for more information. + #### convertPath This can be configured in the rule options or as a shared setting [`settings.convertPath`](../shared-settings.md#convertpath). diff --git a/docs/rules/no-missing-import.md b/docs/rules/no-missing-import.md index 6de28349..4d284cc2 100644 --- a/docs/rules/no-missing-import.md +++ b/docs/rules/no-missing-import.md @@ -52,6 +52,11 @@ Please see the shared settings documentation for more information. This can be configured in the rule options or as a shared setting [`settings.resolvePaths`](../shared-settings.md#resolvepaths). Please see the shared settings documentation for more information. +#### resolverConfig + +This can be configured in the rule options or as a shared setting [`settings.resolverConfig`](../shared-settings.md#resolverconfig). +Please see the shared settings documentation for more information. + #### tsconfigPath This can be configured in the rule options or as a shared setting [`settings.tsconfigPath`](../shared-settings.md#tsconfigpath). diff --git a/docs/rules/no-missing-require.md b/docs/rules/no-missing-require.md index 899fe381..79c78c4d 100644 --- a/docs/rules/no-missing-require.md +++ b/docs/rules/no-missing-require.md @@ -60,6 +60,11 @@ Please see the shared settings documentation for more information. This can be configured in the rule options or as a shared setting [`settings.resolvePaths`](../shared-settings.md#resolvepaths). Please see the shared settings documentation for more information. +#### resolverConfig + +This can be configured in the rule options or as a shared setting [`settings.resolverConfig`](../shared-settings.md#resolverconfig). +Please see the shared settings documentation for more information. + #### tryExtensions This can be configured in the rule options or as a shared setting [`settings.tryExtensions`](../shared-settings.md#tryextensions). diff --git a/docs/rules/no-unpublished-import.md b/docs/rules/no-unpublished-import.md index c2ccb7f2..e944fe98 100644 --- a/docs/rules/no-unpublished-import.md +++ b/docs/rules/no-unpublished-import.md @@ -41,6 +41,11 @@ Please see the shared settings documentation for more information. This can be configured in the rule options or as a shared setting [`settings.resolvePaths`](../shared-settings.md#resolvepaths). Please see the shared settings documentation for more information. +#### resolverConfig + +This can be configured in the rule options or as a shared setting [`settings.resolverConfig`](../shared-settings.md#resolverconfig). +Please see the shared settings documentation for more information. + #### convertPath This can be configured in the rule options or as a shared setting [`settings.convertPath`](../shared-settings.md#convertpath). diff --git a/docs/rules/no-unpublished-require.md b/docs/rules/no-unpublished-require.md index be02aed1..f227b78e 100644 --- a/docs/rules/no-unpublished-require.md +++ b/docs/rules/no-unpublished-require.md @@ -43,6 +43,11 @@ Please see the shared settings documentation for more information. This can be configured in the rule options or as a shared setting [`settings.resolvePaths`](../shared-settings.md#resolvepaths). Please see the shared settings documentation for more information. +#### resolverConfig + +This can be configured in the rule options or as a shared setting [`settings.resolverConfig`](../shared-settings.md#resolverconfig). +Please see the shared settings documentation for more information. + #### convertPath This can be configured in the rule options or as a shared setting [`settings.convertPath`](../shared-settings.md#convertpath). diff --git a/docs/shared-settings.md b/docs/shared-settings.md index 47b85ee9..2e83967f 100644 --- a/docs/shared-settings.md +++ b/docs/shared-settings.md @@ -60,6 +60,30 @@ If a path is relative, it will be resolved from CWD. { "resolvePaths": [] } ``` +## resolverConfig + +Override the options generated by this plugin for resolving require and import statements. + +While these options are passed down to [`enhanced-resolve`](https://github.com/webpack/enhanced-resolve)'s factory method, we only support a subset of the options they allow. These are documented below. + +The options you define here are assigned over the default options generated by the plugin. + +Supported options: + +- `resolverConfig.modules`: A list of directories to resolve modules from, can be absolute path or folder name + +### Example resolverConfig + +```json +{ "resolverConfig": { "modules": ["node_modules", "bower_components"] } } +``` + +### Default resolverConfig + +```json +{ "resolverConfig": {} } +``` + ## convertPath If we use transpilers (e.g. Babel), perhaps the file path to a source code is never published. diff --git a/lib/rules/no-extraneous-import.js b/lib/rules/no-extraneous-import.js index 0147bf32..c7e46b3d 100644 --- a/lib/rules/no-extraneous-import.js +++ b/lib/rules/no-extraneous-import.js @@ -8,6 +8,7 @@ const { checkExtraneous, messages } = require("../util/check-extraneous") const getAllowModules = require("../util/get-allow-modules") const getConvertPath = require("../util/get-convert-path") const getResolvePaths = require("../util/get-resolve-paths") +const getResolverConfig = require("../util/get-resolver-config") const visitImport = require("../util/visit-import") /** @type {import('eslint').Rule.RuleModule} */ @@ -28,6 +29,7 @@ module.exports = { allowModules: getAllowModules.schema, convertPath: getConvertPath.schema, resolvePaths: getResolvePaths.schema, + resolverConfig: getResolverConfig.schema, }, additionalProperties: false, }, diff --git a/lib/rules/no-extraneous-require.js b/lib/rules/no-extraneous-require.js index f733ee96..6ee15e18 100644 --- a/lib/rules/no-extraneous-require.js +++ b/lib/rules/no-extraneous-require.js @@ -8,6 +8,7 @@ const { checkExtraneous, messages } = require("../util/check-extraneous") const getAllowModules = require("../util/get-allow-modules") const getConvertPath = require("../util/get-convert-path") const getResolvePaths = require("../util/get-resolve-paths") +const getResolverConfig = require("../util/get-resolver-config") const getTryExtensions = require("../util/get-try-extensions") const visitRequire = require("../util/visit-require") @@ -29,6 +30,7 @@ module.exports = { allowModules: getAllowModules.schema, convertPath: getConvertPath.schema, resolvePaths: getResolvePaths.schema, + resolverConfig: getResolverConfig.schema, tryExtensions: getTryExtensions.schema, }, additionalProperties: false, diff --git a/lib/rules/no-missing-import.js b/lib/rules/no-missing-import.js index 2be89254..44a3e5db 100644 --- a/lib/rules/no-missing-import.js +++ b/lib/rules/no-missing-import.js @@ -7,6 +7,7 @@ const { checkExistence, messages } = require("../util/check-existence") const getAllowModules = require("../util/get-allow-modules") const getResolvePaths = require("../util/get-resolve-paths") +const getResolverConfig = require("../util/get-resolver-config") const getTryExtensions = require("../util/get-try-extensions") const getTSConfig = require("../util/get-tsconfig") const getTypescriptExtensionMap = require("../util/get-typescript-extension-map") @@ -29,6 +30,7 @@ module.exports = { properties: { allowModules: getAllowModules.schema, resolvePaths: getResolvePaths.schema, + resolverConfig: getResolverConfig.schema, tryExtensions: getTryExtensions.schema, ignoreTypeImport: { type: "boolean", default: false }, tsconfigPath: getTSConfig.schema, diff --git a/lib/rules/no-missing-require.js b/lib/rules/no-missing-require.js index cd2eabb7..fb7a1cd5 100644 --- a/lib/rules/no-missing-require.js +++ b/lib/rules/no-missing-require.js @@ -7,6 +7,7 @@ const { checkExistence, messages } = require("../util/check-existence") const getAllowModules = require("../util/get-allow-modules") const getResolvePaths = require("../util/get-resolve-paths") +const getResolverConfig = require("../util/get-resolver-config") const getTSConfig = require("../util/get-tsconfig") const getTryExtensions = require("../util/get-try-extensions") const getTypescriptExtensionMap = require("../util/get-typescript-extension-map") @@ -30,6 +31,7 @@ module.exports = { allowModules: getAllowModules.schema, tryExtensions: getTryExtensions.schema, resolvePaths: getResolvePaths.schema, + resolverConfig: getResolverConfig.schema, typescriptExtensionMap: getTypescriptExtensionMap.schema, tsconfigPath: getTSConfig.schema, }, diff --git a/lib/rules/no-unpublished-import.js b/lib/rules/no-unpublished-import.js index 70911783..e517d454 100644 --- a/lib/rules/no-unpublished-import.js +++ b/lib/rules/no-unpublished-import.js @@ -8,6 +8,7 @@ const { checkPublish, messages } = require("../util/check-publish") const getAllowModules = require("../util/get-allow-modules") const getConvertPath = require("../util/get-convert-path") const getResolvePaths = require("../util/get-resolve-paths") +const getResolverConfig = require("../util/get-resolver-config") const visitImport = require("../util/visit-import") /** @type {import('eslint').Rule.RuleModule} */ @@ -28,6 +29,7 @@ module.exports = { allowModules: getAllowModules.schema, convertPath: getConvertPath.schema, resolvePaths: getResolvePaths.schema, + resolverConfig: getResolverConfig.schema, ignoreTypeImport: { type: "boolean", default: false }, ignorePrivate: { type: "boolean", default: true }, }, diff --git a/lib/rules/no-unpublished-require.js b/lib/rules/no-unpublished-require.js index a5f70bcf..a0f1bb92 100644 --- a/lib/rules/no-unpublished-require.js +++ b/lib/rules/no-unpublished-require.js @@ -8,6 +8,7 @@ const { checkPublish, messages } = require("../util/check-publish") const getAllowModules = require("../util/get-allow-modules") const getConvertPath = require("../util/get-convert-path") const getResolvePaths = require("../util/get-resolve-paths") +const getResolverConfig = require("../util/get-resolver-config") const getTryExtensions = require("../util/get-try-extensions") const visitRequire = require("../util/visit-require") @@ -29,6 +30,7 @@ module.exports = { allowModules: getAllowModules.schema, convertPath: getConvertPath.schema, resolvePaths: getResolvePaths.schema, + resolverConfig: getResolverConfig.schema, tryExtensions: getTryExtensions.schema, ignorePrivate: { type: "boolean", default: true }, }, diff --git a/lib/util/get-resolver-config.js b/lib/util/get-resolver-config.js new file mode 100644 index 00000000..d7fd95b9 --- /dev/null +++ b/lib/util/get-resolver-config.js @@ -0,0 +1,47 @@ +/** + * @author Toru Nagashima + * See LICENSE file in root directory for full license. + */ +"use strict" + +/** + * @typedef {Partial} ResolverConfig + */ + +/** @type {ResolverConfig} */ +const DEFAULT_VALUE = {} + +/** + * Gets `resolverConfig` property from a given option object. + * + * @param {{ resolverConfig: ResolverConfig } | undefined} option - An option object to get. + * @returns {ResolverConfig | undefined} The `allowModules` value, or `null`. + */ +function get(option) { + if (option?.resolverConfig) return option.resolverConfig +} + +/** + * Gets "resolverConfig" setting. + * + * 1. This checks `options` property, then returns it if exists. + * 2. This checks `settings.n` | `settings.node` property, then returns it if exists. + * 3. This returns `[]`. + * + * @param {import('eslint').Rule.RuleContext} context - The rule context. + * @returns {ResolverConfig} A resolver config object. + */ +module.exports = function getResolverConfig(context, optionIndex = 0) { + return ( + get(context.options?.[optionIndex]) ?? + get(context.settings?.n) ?? + get(context.settings?.node) ?? + DEFAULT_VALUE + ) +} + +module.exports.schema = { + type: "object", + properties: {}, + additionalProperties: true, +} diff --git a/lib/util/import-target.js b/lib/util/import-target.js index dfb00ea0..bf89b693 100644 --- a/lib/util/import-target.js +++ b/lib/util/import-target.js @@ -71,6 +71,7 @@ function getTSConfigAliases(context) { * @typedef Options * @property {string[]} [extensions] * @property {string[]} [paths] + * @property {Partial} [resolverConfig] * @property {string} basedir */ /** @typedef { 'unknown' | 'relative' | 'absolute' | 'node' | 'npm' | 'http' } ModuleType */ @@ -323,6 +324,11 @@ module.exports = class ImportTarget { ).backward } + this.resolverConfig = { + ...this.resolverConfig, + ...this.options.resolverConfig, + } + const requireResolve = resolver.create.sync(this.resolverConfig) const cwd = this.context.settings?.cwd ?? process.cwd() diff --git a/lib/util/visit-import.js b/lib/util/visit-import.js index 164ba9b6..aee0a194 100644 --- a/lib/util/visit-import.js +++ b/lib/util/visit-import.js @@ -7,6 +7,7 @@ const path = require("path") const { isBuiltin } = require("node:module") const getResolvePaths = require("./get-resolve-paths") +const getResolverConfig = require("./get-resolver-config") const getTryExtensions = require("./get-try-extensions") const ImportTarget = require("./import-target") const stripImportPathParams = require("./strip-import-path-params") @@ -41,8 +42,9 @@ module.exports = function visitImport( path.resolve(context.filename ?? context.getFilename()) ) const paths = getResolvePaths(context, optionIndex) + const resolverConfig = getResolverConfig(context, optionIndex) const extensions = getTryExtensions(context, optionIndex) - const options = { basedir, paths, extensions } + const options = { basedir, paths, extensions, resolverConfig } /** * @param {( diff --git a/lib/util/visit-require.js b/lib/util/visit-require.js index 83924b8f..ba4026f4 100644 --- a/lib/util/visit-require.js +++ b/lib/util/visit-require.js @@ -12,6 +12,7 @@ const { } = require("@eslint-community/eslint-utils") const { isBuiltin } = require("node:module") const getResolvePaths = require("./get-resolve-paths") +const getResolverConfig = require("./get-resolver-config") const getTryExtensions = require("./get-try-extensions") const ImportTarget = require("./import-target") const stripImportPathParams = require("./strip-import-path-params") @@ -42,8 +43,9 @@ module.exports = function visitRequire( path.resolve(context.filename ?? context.getFilename()) ) const paths = getResolvePaths(context) + const resolverConfig = getResolverConfig(context) const extensions = getTryExtensions(context) - const options = { basedir, paths, extensions } + const options = { basedir, paths, extensions, resolverConfig } return { "Program:exit"(node) { diff --git a/tests/fixtures/no-missing/my_modules/my-module/a-file.js b/tests/fixtures/no-missing/my_modules/my-module/a-file.js new file mode 100644 index 00000000..e69de29b diff --git a/tests/fixtures/no-missing/my_modules/my-module/package.json b/tests/fixtures/no-missing/my_modules/my-module/package.json new file mode 100644 index 00000000..0dcbe24d --- /dev/null +++ b/tests/fixtures/no-missing/my_modules/my-module/package.json @@ -0,0 +1,3 @@ +{ + "main": "./a-file.js" +} diff --git a/tests/lib/rules/no-missing-require.js b/tests/lib/rules/no-missing-require.js index 75fac031..98028e05 100644 --- a/tests/lib/rules/no-missing-require.js +++ b/tests/lib/rules/no-missing-require.js @@ -141,6 +141,31 @@ ruleTester.run("no-missing-require", rule, { options: [{ resolvePaths: ["tests"] }], }, + // resolverConfig + { + filename: fixture("test.js"), + code: "require('a');", + options: [ + { + resolverConfig: { + modules: [fixture("./")], + }, + }, + ], + }, + + { + filename: fixture("test.js"), + code: "require('my-module');", + options: [ + { + resolverConfig: { + modules: [fixture("my_modules")], + }, + }, + ], + }, + // Ignores it if not callee. { filename: fixture("test.js"), From db384d13ada7d9f48a7f8bf2ae92f76a4e3789aa Mon Sep 17 00:00:00 2001 From: Sebastian Good <2230835+scagood@users.noreply.github.com> Date: Tue, 10 Dec 2024 02:08:10 +0000 Subject: [PATCH 3/4] fix(no-unsupported): Correctly handle recursive objects on a per module basis (#396) --- lib/util/enumerate-property-names.js | 22 +++-- .../no-unsupported-features/node-builtins.js | 90 ++++++++++++++++++- 2 files changed, 98 insertions(+), 14 deletions(-) diff --git a/lib/util/enumerate-property-names.js b/lib/util/enumerate-property-names.js index de802c46..54fcc455 100644 --- a/lib/util/enumerate-property-names.js +++ b/lib/util/enumerate-property-names.js @@ -15,15 +15,16 @@ const unprefixNodeColon = require("./unprefix-node-colon") * Enumerate property names of a given object recursively. * @param {TraceMap} traceMap The map for APIs to enumerate. * @param {string[]} [path] The path to the current map. - * @param {WeakSet} [recursionSet] A WeakSet used to block recursion (eg Module, Module.Module, Module.Module.Module) + * @param {{ [key: string]: WeakSet }} [recursion] An object to block recursion (per module) * @returns {IterableIterator} The property names of the map. */ -function* enumeratePropertyNames( - traceMap, - path = [], - recursionSet = new WeakSet() -) { - if (recursionSet.has(traceMap)) { +function* enumeratePropertyNames(traceMap, path = [], recursion = {}) { + const recursionSet = + typeof path[0] === "string" + ? (recursion[path[0]] ??= new WeakSet()) + : undefined + + if (recursionSet?.has(traceMap)) { return } @@ -48,11 +49,8 @@ function* enumeratePropertyNames( yield childName } - yield* enumeratePropertyNames( - childValue, - childPath, - recursionSet.add(traceMap) - ) + recursionSet?.add(traceMap) + yield* enumeratePropertyNames(childValue, childPath, recursion) } } diff --git a/tests/lib/rules/no-unsupported-features/node-builtins.js b/tests/lib/rules/no-unsupported-features/node-builtins.js index 1c8295d8..626f518d 100644 --- a/tests/lib/rules/no-unsupported-features/node-builtins.js +++ b/tests/lib/rules/no-unsupported-features/node-builtins.js @@ -4,13 +4,58 @@ */ "use strict" +/** @import { Linter } from 'eslint' */ + const RuleTester = require("../../../test-helpers").RuleTester const rule = require("../../../../lib/rules/no-unsupported-features/node-builtins") +/** + * @typedef ValidTestCase + * @property {string} [name] + * @property {string} code + * @property {any} [options] + * @property {string | undefined} [filename] + * @property {boolean} [only] + * @property {Linter.LanguageOptions | undefined} [languageOptions] + * @property {{ [name: string]: any } | undefined} [settings] + */ +/** + * @typedef SuggestionOutput + * @property {string} [messageId] + * @property {string} [desc] + * @property {Record | undefined} [data] + * @property {string} output + */ +/** + * @typedef InvalidTestExtras + * @property {number | Array} errors + * @property {string | null | undefined} [output] + */ +/** + * @typedef {ValidTestCase & InvalidTestExtras} InvalidTestCase + */ +/** + * @typedef TestCaseError + * @property {string | RegExp} [message] + * @property {string} [messageId] + * @property {string | undefined} [type] + * @property {any} [data] + * @property {number | undefined} [line] + * @property {number | undefined} [column] + * @property {number | undefined} [endLine] + * @property {number | undefined} [endColumn] + * @property {SuggestionOutput[] | undefined} [suggestions] + */ +/** + * @typedef Pattern + * @property {ValidTestCase[]} [valid] + * @property {InvalidTestCase[]} [invalid] + */ + /** * Concatenate patterns. - * @param {Array<{valid:Array,invalid:Array}>} patterns The patterns to concat. - * @returns {{valid:Array,invalid:Array}} The concatenated patterns. + * @param {Pattern[]} patterns The patterns to concat. + * @returns {Pattern} The concatenated patterns. */ function concat(patterns) { const ret = { @@ -5372,6 +5417,47 @@ new RuleTester({ languageOptions: { sourceType: "module" } }).run( ], }, + //---------------------------------------------------------------------- + // timers/promises + //---------------------------------------------------------------------- + { + valid: [ + { + code: ` + import { scheduler } from 'node:timers/promises'; + await scheduler.wait( 1000 ); + `, + options: [ + { + version: ">= 20.0.0", + ignores: ["timers/promises.scheduler.wait"], + }, + ], + languageOptions: { ecmaVersion: "latest" }, + }, + ], + invalid: [ + { + code: ` + import { scheduler } from 'node:timers/promises'; + await scheduler.wait( 1000 ); + `, + options: [{ version: ">= 20.0.0" }], + languageOptions: { ecmaVersion: "latest" }, + + errors: [ + { + messageId: "not-supported-yet", + data: { + name: "timers/promises.scheduler.wait", + version: ">= 20.0.0", + }, + }, + ], + }, + ], + }, + { valid: [ { From 308c80c60490484a9d27c0ab32e1d8d6652807cd Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 10 Dec 2024 10:59:09 +0800 Subject: [PATCH 4/4] chore(master): release 17.15.0 (#394) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/release-please/manifest.json | 2 +- CHANGELOG.md | 13 +++++++++++++ package.json | 2 +- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/.github/release-please/manifest.json b/.github/release-please/manifest.json index 97d890c0..74587ec0 100644 --- a/.github/release-please/manifest.json +++ b/.github/release-please/manifest.json @@ -1 +1 @@ -{".":"17.14.0"} +{".":"17.15.0"} diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b3fc452..fcd03c8c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Changelog +## [17.15.0](https://github.com/eslint-community/eslint-plugin-n/compare/v17.14.0...v17.15.0) (2024-12-10) + + +### 🌟 Features + +* **no-unsupported:** support node 22.12.0 ([#393](https://github.com/eslint-community/eslint-plugin-n/issues/393)) ([af4f774](https://github.com/eslint-community/eslint-plugin-n/commit/af4f774be560ac9472d98c99082a678ca5703574)) +* **resolve:** allow overriding enhanced-resolve's options ([#384](https://github.com/eslint-community/eslint-plugin-n/issues/384)) ([1466bec](https://github.com/eslint-community/eslint-plugin-n/commit/1466bec9050606ea874444452a4d58484b480a14)) + + +### 🩹 Fixes + +* **no-unsupported:** Correctly handle recursive objects on a per module basis ([#396](https://github.com/eslint-community/eslint-plugin-n/issues/396)) ([db384d1](https://github.com/eslint-community/eslint-plugin-n/commit/db384d13ada7d9f48a7f8bf2ae92f76a4e3789aa)) + ## [17.14.0](https://github.com/eslint-community/eslint-plugin-n/compare/v17.13.2...v17.14.0) (2024-11-21) diff --git a/package.json b/package.json index 115fc8e6..800f77cb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "eslint-plugin-n", - "version": "17.14.0", + "version": "17.15.0", "description": "Additional ESLint's rules for Node.js", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0"