diff --git a/packages/code-analyzer-eslint-engine/package.json b/packages/code-analyzer-eslint-engine/package.json index c700fff7..d8679128 100644 --- a/packages/code-analyzer-eslint-engine/package.json +++ b/packages/code-analyzer-eslint-engine/package.json @@ -1,7 +1,7 @@ { "name": "@salesforce/code-analyzer-eslint-engine", "description": "Plugin package that adds 'eslint' as an engine into Salesforce Code Analyzer", - "version": "0.39.0", + "version": "0.40.0-SNAPSHOT", "author": "The Salesforce Code Analyzer Team", "license": "BSD-3-Clause", "homepage": "https://developer.salesforce.com/docs/platform/salesforce-code-analyzer/overview", diff --git a/packages/code-analyzer-eslint-engine/src/config.ts b/packages/code-analyzer-eslint-engine/src/config.ts index d8af0198..ad64612a 100644 --- a/packages/code-analyzer-eslint-engine/src/config.ts +++ b/packages/code-analyzer-eslint-engine/src/config.ts @@ -37,7 +37,7 @@ export type ESLintEngineConfig = { disable_typescript_base_config: boolean // If true then the base configuration that supplies the React/JSX rules will not be applied. - // Default: true (React support is currently gated; will change to false when released) + // Default: false disable_react_base_config: boolean // Extensions of the files in your workspace that will be used to discover rules. @@ -70,7 +70,7 @@ export const DEFAULT_CONFIG: ESLintEngineConfig = { disable_lwc_base_config: false, disable_slds_base_config: false, disable_typescript_base_config: false, - disable_react_base_config: true, // Gated for now - will change to false when released + disable_react_base_config: false, file_extensions: { javascript: ['.js', '.cjs', '.mjs', '.jsx'], typescript: ['.ts', '.tsx'], @@ -119,8 +119,11 @@ export const ESLINT_ENGINE_CONFIG_DESCRIPTION: ConfigDescription = { valueType: "boolean", defaultValue: DEFAULT_CONFIG.disable_typescript_base_config }, - // Note: disable_react_base_config is gated and not user-configurable yet - // TODO: Add to fieldDescriptions when React support is released + disable_react_base_config: { + descriptionText: getMessage('ConfigFieldDescription_disable_react_base_config'), + valueType: "boolean", + defaultValue: DEFAULT_CONFIG.disable_react_base_config + }, file_extensions: { descriptionText: getMessage('ConfigFieldDescription_file_extensions'), valueType: "object", @@ -143,12 +146,9 @@ export const LEGACY_ESLINT_IGNORE_FILE: string = '.eslintignore'; export function validateAndNormalizeConfig(configValueExtractor: ConfigValueExtractor): ESLintEngineConfig { - // disable_react_base_config bypasses validation - React support is gated but we need it for internal testing - // TODO: Move 'disable_react_base_config' to validateContainsOnlySpecifiedKeys when React support is released - configValueExtractor.addKeysThatBypassValidation(['disable_react_base_config']); configValueExtractor.validateContainsOnlySpecifiedKeys(['eslint_config_file', 'eslint_ignore_file', 'auto_discover_eslint_config', 'disable_javascript_base_config', 'disable_lwc_base_config', - 'disable_slds_base_config', 'disable_typescript_base_config', 'file_extensions']); + 'disable_slds_base_config', 'disable_typescript_base_config', 'disable_react_base_config', 'file_extensions']); const eslintConfigValueExtractor: ESLintEngineConfigValueExtractor = new ESLintEngineConfigValueExtractor(configValueExtractor); return { @@ -160,9 +160,7 @@ export function validateAndNormalizeConfig(configValueExtractor: ConfigValueExtr disable_lwc_base_config: eslintConfigValueExtractor.extractBooleanValue('disable_lwc_base_config'), disable_slds_base_config: eslintConfigValueExtractor.extractBooleanValue('disable_slds_base_config'), disable_typescript_base_config: eslintConfigValueExtractor.extractBooleanValue('disable_typescript_base_config'), - // React support is gated - always force to true regardless of customer config - // TODO: Change to eslintConfigValueExtractor.extractBooleanValue('disable_react_base_config') when released - disable_react_base_config: true, + disable_react_base_config: eslintConfigValueExtractor.extractBooleanValue('disable_react_base_config'), file_extensions: eslintConfigValueExtractor.extractFileExtensionsValue(), }; } diff --git a/packages/code-analyzer-eslint-engine/test/engine.test.ts b/packages/code-analyzer-eslint-engine/test/engine.test.ts index a7999343..b735eaf0 100644 --- a/packages/code-analyzer-eslint-engine/test/engine.test.ts +++ b/packages/code-analyzer-eslint-engine/test/engine.test.ts @@ -26,9 +26,7 @@ jest.setTimeout(60_000); const DEFAULT_CONFIG_FOR_TESTING: ESLintEngineConfig = { ...DEFAULT_CONFIG, - config_root: __dirname, - // React is gated in production (default: true). For testing, enable it (eventual default: false) - disable_react_base_config: false + config_root: __dirname } const testDataFolder: string = path.join(__dirname, 'test-data'); diff --git a/packages/code-analyzer-eslint-engine/test/generate-react-a11y-goldfile.test.ts b/packages/code-analyzer-eslint-engine/test/generate-react-a11y-goldfile.test.ts index 83568948..3df56e04 100644 --- a/packages/code-analyzer-eslint-engine/test/generate-react-a11y-goldfile.test.ts +++ b/packages/code-analyzer-eslint-engine/test/generate-react-a11y-goldfile.test.ts @@ -15,9 +15,7 @@ const RUN_GENERATOR = process.env.GENERATE_REACT_A11Y === 'true'; it('writes test/test-data/rules_ReactA11yConfig.goldfile.json', async () => { const config: ESLintEngineConfig = { ...DEFAULT_CONFIG, - config_root: __dirname, - // Ensure React stack is enabled during generation - disable_react_base_config: false + config_root: __dirname }; const enginePlugin = new ESLintEnginePlugin(); const engine: Engine = await enginePlugin.createEngine('eslint', config); diff --git a/packages/code-analyzer-eslint-engine/test/misc.test.ts b/packages/code-analyzer-eslint-engine/test/misc.test.ts index 674fca45..ced0811e 100644 --- a/packages/code-analyzer-eslint-engine/test/misc.test.ts +++ b/packages/code-analyzer-eslint-engine/test/misc.test.ts @@ -8,9 +8,7 @@ import {ESLintWorkspace} from "../src/workspace"; const DEFAULT_CONFIG_FOR_TESTING: ESLintEngineConfig = { ...DEFAULT_CONFIG, - config_root: __dirname, - // React is gated in production (default: true). For testing, enable it (eventual default: false) - disable_react_base_config: false + config_root: __dirname } const testDataFolder: string = path.join(__dirname, 'test-data'); diff --git a/packages/code-analyzer-eslint-engine/test/plugin.test.ts b/packages/code-analyzer-eslint-engine/test/plugin.test.ts index fd653d3b..a19f3b2f 100644 --- a/packages/code-analyzer-eslint-engine/test/plugin.test.ts +++ b/packages/code-analyzer-eslint-engine/test/plugin.test.ts @@ -47,10 +47,9 @@ describe('Tests for the ESLintEnginePlugin', () => { it('When createEngineConfig is called with an object containing an invalid key, then we error', async () => { const userProvidedOverrides: ConfigObject = {dummy: 3}; await expect(callCreateEngineConfig(plugin, userProvidedOverrides)).rejects.toThrow( - // Note: disable_react_base_config is intentionally excluded - React support is gated getMessageFromCatalog(SHARED_MESSAGE_CATALOG, 'ConfigObjectContainsInvalidKey', 'engines.eslint', 'dummy', '["auto_discover_eslint_config","disable_javascript_base_config","disable_lwc_base_config",' + - '"disable_slds_base_config","disable_typescript_base_config",' + + '"disable_react_base_config","disable_slds_base_config","disable_typescript_base_config",' + '"eslint_config_file","eslint_ignore_file","file_extensions"]')); }); diff --git a/packages/code-analyzer-eslint-engine/test/react-a11y.test.ts b/packages/code-analyzer-eslint-engine/test/react-a11y.test.ts index 8d215ff9..01dc6b9d 100644 --- a/packages/code-analyzer-eslint-engine/test/react-a11y.test.ts +++ b/packages/code-analyzer-eslint-engine/test/react-a11y.test.ts @@ -8,8 +8,6 @@ describe('jsx-a11y plugin integration', () => { it('exposes core jsx-a11y rules with React tagging', async () => { const config: ESLintEngineConfig = { ...DEFAULT_CONFIG, - // Enable React base config for tests - disable_react_base_config: false, config_root: __dirname }; const enginePlugin: ESLintEnginePlugin = new ESLintEnginePlugin(); @@ -34,7 +32,6 @@ describe('jsx-a11y plugin integration', () => { it('includes all A11y-tagged rules from rule-mappings', async () => { const config: ESLintEngineConfig = { ...DEFAULT_CONFIG, - disable_react_base_config: false, config_root: __dirname }; const engine: Engine = await new ESLintEnginePlugin().createEngine('eslint', config); diff --git a/packages/code-analyzer-eslint-engine/test/rule-mappings.test.ts b/packages/code-analyzer-eslint-engine/test/rule-mappings.test.ts index 1e7f5b15..f57124a9 100644 --- a/packages/code-analyzer-eslint-engine/test/rule-mappings.test.ts +++ b/packages/code-analyzer-eslint-engine/test/rule-mappings.test.ts @@ -7,10 +7,8 @@ import { createDescribeOptions } from "./test-helpers"; describe('Tests for the rule-mappings', () => { it('Test that the list of all bundled rules matches our RULE_MAPPINGS list', async () => { const enginePlugin: ESLintEnginePlugin = new ESLintEnginePlugin(); - // React is gated in production (default: true). For testing, enable it (eventual default: false) const engine: Engine = await enginePlugin.createEngine('eslint', { - ...DEFAULT_CONFIG, - disable_react_base_config: false + ...DEFAULT_CONFIG }); const ruleDescriptions: RuleDescription[] = await engine.describeRules(createDescribeOptions()); const actualRuleNames: Set = new Set(ruleDescriptions.map(rd => rd.name));