From db137369b72de74f7736e8b162b9024206b1aaf6 Mon Sep 17 00:00:00 2001 From: David Schach <636977+dschach@users.noreply.github.com> Date: Tue, 6 Oct 2026 12:35:46 +1100 Subject: [PATCH] Fix the January floor of AvoidOldSalesforceApiVersions getSalesforceApiVersionFor treated January as part of the Winter release of its own calendar year. That release starts in the October before, so for the whole of January the rule's floor was three versions too high. January now counts in the year before. Four dated test cases cover December, January, and February. forcedotcom/code-analyzer#2102 --- packages/code-analyzer-regex-engine/package.json | 2 +- packages/code-analyzer-regex-engine/src/plugin.ts | 3 ++- packages/code-analyzer-regex-engine/test/plugin.test.ts | 7 ++++++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/code-analyzer-regex-engine/package.json b/packages/code-analyzer-regex-engine/package.json index ce531bbe..2d6dd6c8 100644 --- a/packages/code-analyzer-regex-engine/package.json +++ b/packages/code-analyzer-regex-engine/package.json @@ -1,7 +1,7 @@ { "name": "@salesforce/code-analyzer-regex-engine", "description": "Plugin package that adds 'regex' as an engine into Salesforce Code Analyzer", - "version": "0.40.0", + "version": "0.41.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-regex-engine/src/plugin.ts b/packages/code-analyzer-regex-engine/src/plugin.ts index 19dfce4a..b9e88c84 100644 --- a/packages/code-analyzer-regex-engine/src/plugin.ts +++ b/packages/code-analyzer-regex-engine/src/plugin.ts @@ -151,8 +151,9 @@ function subtractThreeYears(date: Date): Date{ } function getSalesforceApiVersionFor(date: Date): number { - const year: number = date.getUTCFullYear(); const month: number = date.getUTCMonth(); + // January belongs to the Winter release that started in October of the previous calendar year + const year: number = month === 0 ? date.getUTCFullYear() - 1 : date.getUTCFullYear(); if (month >= 1 && month < 5) { // Feb through May (Spring release) return (year - 2004) * 3; } else if (month >= 5 && month < 9) { // Jun through Sep (Summer release) diff --git a/packages/code-analyzer-regex-engine/test/plugin.test.ts b/packages/code-analyzer-regex-engine/test/plugin.test.ts index 39264ef3..55db0165 100644 --- a/packages/code-analyzer-regex-engine/test/plugin.test.ts +++ b/packages/code-analyzer-regex-engine/test/plugin.test.ts @@ -76,7 +76,12 @@ describe('RegexEnginePlugin No Custom Config Tests' , () => { { date: new Date(Date.UTC(2022,2,1)), expectedRegexString: '/(?([1-9]|[1-3][0-9]|4[0-5])(\\.[0-9])?)<\\/apiVersion>/g', expectedVersion: 45 }, // Spring'22 - 3 years = Spring'19 (45.0) { date: new Date(Date.UTC(2023,5,2)), expectedRegexString: '/(?([1-9]|[1-3][0-9]|4[0-9])(\\.[0-9])?)<\\/apiVersion>/g', expectedVersion: 49 }, // Summer'23 - 3 years = Summer'20 (49.0) { date: new Date(Date.UTC(2025,9,3)), expectedRegexString: '/(?([1-9]|[1-4][0-9]|5[0-6])(\\.[0-9])?)<\\/apiVersion>/g', expectedVersion: 56 }, // Winter'26 - 3 years = Winter'23 (56.0) - { date: new Date(Date.UTC(2028,3,7)), expectedRegexString: '/(?([1-9]|[1-5][0-9]|6[0-3])(\\.[0-9])?)<\\/apiVersion>/g', expectedVersion: 63 } // Spring'28 - 3 years = Spring'25 (63.0) + { date: new Date(Date.UTC(2028,3,7)), expectedRegexString: '/(?([1-9]|[1-5][0-9]|6[0-3])(\\.[0-9])?)<\\/apiVersion>/g', expectedVersion: 63 }, // Spring'28 - 3 years = Spring'25 (63.0) + // January belongs to the Winter release that started the October before, so it must give the same version as that December + { date: new Date(Date.UTC(2025,11,15)), expectedRegexString: '/(?([1-9]|[1-4][0-9]|5[0-6])(\\.[0-9])?)<\\/apiVersion>/g', expectedVersion: 56 }, // Winter'26 (December) - 3 years = Winter'23 (56.0) + { date: new Date(Date.UTC(2026,0,15)), expectedRegexString: '/(?([1-9]|[1-4][0-9]|5[0-6])(\\.[0-9])?)<\\/apiVersion>/g', expectedVersion: 56 }, // Winter'26 (January) - 3 years = Winter'23 (56.0) + { date: new Date(Date.UTC(2027,0,1)), expectedRegexString: '/(?([1-9]|[1-4][0-9]|5[0-9])(\\.[0-9])?)<\\/apiVersion>/g', expectedVersion: 59 }, // Winter'27 (January) - 3 years = Winter'24 (59.0) + { date: new Date(Date.UTC(2027,1,1)), expectedRegexString: '/(?([1-9]|[1-5][0-9]|6[0-0])(\\.[0-9])?)<\\/apiVersion>/g', expectedVersion: 60 } // Spring'27 - 3 years = Spring'24 (60.0) ]; it.each(apiVersionTestCases)('RegexEnginePlugin produces engine with AvoidOldSalesforceApiVersions that depends on current date', async (testCase: ApiVersionTestCase) => { enginePlugin._setClock(new FixedClock(testCase.date));