From 6ba9c0d148a003dccefe06c06cf68ca540d41d6b Mon Sep 17 00:00:00 2001 From: michael faith Date: Thu, 5 Sep 2024 06:29:19 -0500 Subject: [PATCH] fix(flatConfig): include languageOptions in context This change fixes a bug with flat config support. There is a function called `childContext` that's used by the ExportBuilder to "cleanse" the context object. This function wasn't including the new `languageOptions` object, which contains the parser. So by the time this cleansed context made it to the parse function, `languageOptions` wasn't there anymore. Since `parserPath` was still being included in non-flat config scenarios, the parse function made it through ok and used `parserPath`. However, once you shift to flat config, `parserPath` is no longer defined, and the actual parser object needs to be there. Fixes #3051 --- src/exportMap/childContext.js | 3 +- tests/src/exportMap/childContext.js | 51 +++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 tests/src/exportMap/childContext.js diff --git a/src/exportMap/childContext.js b/src/exportMap/childContext.js index 5f82b8e57..3534c5913 100644 --- a/src/exportMap/childContext.js +++ b/src/exportMap/childContext.js @@ -10,7 +10,7 @@ let prevSettings = ''; * also calculate a cacheKey, where parts of the cacheKey hash are memoized */ export default function childContext(path, context) { - const { settings, parserOptions, parserPath } = context; + const { settings, parserOptions, parserPath, languageOptions } = context; if (JSON.stringify(settings) !== prevSettings) { settingsHash = hashObject({ settings }).digest('hex'); @@ -28,5 +28,6 @@ export default function childContext(path, context) { parserOptions, parserPath, path, + languageOptions, }; } diff --git a/tests/src/exportMap/childContext.js b/tests/src/exportMap/childContext.js new file mode 100644 index 000000000..06fa04afe --- /dev/null +++ b/tests/src/exportMap/childContext.js @@ -0,0 +1,51 @@ +import { expect } from 'chai'; + +import childContext from '../../../src/exportMap/childContext'; + +describe('childContext', () => { + const settings = { + setting1: true, + setting2: false, + }; + const parserOptions = { + ecmaVersion: 'latest', + sourceType: 'module', + }; + const parserPath = 'path/to/parser'; + const path = 'path/to/src/file'; + const languageOptions = { + ecmaVersion: 2024, + sourceType: 'module', + parser: {}, + }; + + // https://github.com/import-js/eslint-plugin-import/issues/3051 + it('should pass context properties through, if present', () => { + const mockContext = { + settings, + parserOptions, + parserPath, + languageOptions, + }; + + const result = childContext(path, mockContext); + + expect(result.settings).to.deep.equal(settings); + expect(result.parserOptions).to.deep.equal(parserOptions); + expect(result.parserPath).to.equal(parserPath); + expect(result.languageOptions).to.deep.equal(languageOptions); + }); + + it('should add path and cacheKey to context', () => { + const mockContext = { + settings, + parserOptions, + parserPath, + }; + + const result = childContext(path, mockContext); + + expect(result.path).to.equal(path); + expect(result.cacheKey).to.be.a('string'); + }); +});