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));