diff --git a/lib/config/presets/common.ts b/lib/config/presets/common.ts index ee1233dd7f8..2005e6170f3 100644 --- a/lib/config/presets/common.ts +++ b/lib/config/presets/common.ts @@ -46,6 +46,7 @@ export const removedPresets: Record = { 'customManagers:helmChartYamlAppVersions', 'regexManagers:mavenPropertyVersions': 'customManagers:mavenPropertyVersions', 'regexManagers:tfvarsVersions': 'customManagers:tfvarsVersions', + 'regexManagers:tsconfigNodeVersions': 'customManagers:tsconfigNodeVersions', 'workarounds:reduceRepologyServerLoad': null, }; diff --git a/lib/config/presets/internal/custom-managers.spec.ts b/lib/config/presets/internal/custom-managers.spec.ts index 51a5d39633d..fb2cf741119 100644 --- a/lib/config/presets/internal/custom-managers.spec.ts +++ b/lib/config/presets/internal/custom-managers.spec.ts @@ -805,4 +805,45 @@ describe('config/presets/internal/custom-managers', () => { ]); }); }); + + describe('Update `tsconfig/node` version in tsconfig.json', () => { + const customManager = presets.tsconfigNodeVersions.customManagers?.[0]; + + it(`find dependencies in file`, async () => { + const fileContent = codeBlock` + { + "extends": "@tsconfig/node20/tsconfig.json", + "include": ["src/**/*"] + } + `; + + const res = await extractPackageFile( + 'regex', + fileContent, + 'tsconfig.json', + customManager!, + ); + + expect(res?.deps).toMatchObject([ + { + currentValue: '20', + datasource: 'npm', + depName: '@tsconfig/node20', + }, + ]); + }); + + describe('matches regexes patterns', () => { + it.each` + path | expected + ${'tsconfig.json'} | ${true} + ${'foo/tsconfig.json'} | ${true} + ${'tsconfig.yml'} | ${false} + `('$path', ({ path, expected }) => { + expect( + matchRegexOrGlobList(path, customManager!.managerFilePatterns), + ).toBe(expected); + }); + }); + }); }); diff --git a/lib/config/presets/internal/custom-managers.ts b/lib/config/presets/internal/custom-managers.ts index 9a905d96b4a..f1b5aacc141 100644 --- a/lib/config/presets/internal/custom-managers.ts +++ b/lib/config/presets/internal/custom-managers.ts @@ -147,4 +147,20 @@ export const presets: Record = { ], description: 'Update `*_version` variables in `.tfvars` files.', }, + tsconfigNodeVersions: { + customManagers: [ + { + autoReplaceStringTemplate: + '"extends": "@tsconfig/node{{{major}}}/tsconfig.json"', + currentValueTemplate: '{{{major}}}', + customType: 'regex', + datasourceTemplate: 'npm', + managerFilePatterns: ['**/tsconfig.json'], + matchStrings: [ + '"extends":\\s*"(?@tsconfig/node(?\\d+))/tsconfig\\.json"', + ], + }, + ], + description: 'Update `@tsconfig/node` extends in `tsconfig.json` files.', + }, }; diff --git a/lib/data/replacements.json b/lib/data/replacements.json index 62109d80b18..5b008a1ba0f 100644 --- a/lib/data/replacements.json +++ b/lib/data/replacements.json @@ -44,6 +44,7 @@ "replacements:semantic-release-replace-plugin-to-unscoped", "replacements:spectre-cli-to-spectre-console-cli", "replacements:standard-version-to-commit-and-tag", + "replacements:tsconfig-bases-node", "replacements:typeorm-seeding-to-scoped", "replacements:vso-task-lib-to-azure-pipelines-task-lib", "replacements:vsts-task-lib-to-azure-pipelines-task-lib", @@ -1009,6 +1010,58 @@ } ] }, + "tsconfig-bases-node": { + "description": "`@tsconfig-bases` node updates.", + "packageRules": [ + { + "matchDatasources": ["npm"], + "matchPackageNames": ["@tsconfig/node**"], + "commitMessageExtra": "{{#if isReplacement}}with {{{newName}}}{{else}}to {{{prettyNewVersion}}}{{/if}}" + }, + { + "matchDatasources": ["npm"], + "matchPackageNames": ["@tsconfig/node10"], + "replacementName": "@tsconfig/node12", + "replacementVersion": "12.0.0" + }, + { + "matchDatasources": ["npm"], + "matchPackageNames": ["@tsconfig/node12"], + "replacementName": "@tsconfig/node14", + "replacementVersion": "14.0.0" + }, + { + "matchDatasources": ["npm"], + "matchPackageNames": ["@tsconfig/node14"], + "replacementName": "@tsconfig/node16", + "replacementVersion": "16.0.0" + }, + { + "matchDatasources": ["npm"], + "matchPackageNames": ["@tsconfig/node16", "@tsconfig/node17"], + "replacementName": "@tsconfig/node18", + "replacementVersion": "18.0.0" + }, + { + "matchDatasources": ["npm"], + "matchPackageNames": ["@tsconfig/node18", "@tsconfig/node19"], + "replacementName": "@tsconfig/node20", + "replacementVersion": "20.0.0" + }, + { + "matchDatasources": ["npm"], + "matchPackageNames": ["@tsconfig/node20", "@tsconfig/node21"], + "replacementName": "@tsconfig/node22", + "replacementVersion": "22.0.0" + }, + { + "matchDatasources": ["npm"], + "matchPackageNames": ["@tsconfig/node22", "@tsconfig/node23"], + "replacementName": "@tsconfig/node24", + "replacementVersion": "24.0.0" + } + ] + }, "typeorm-seeding-to-scoped": { "description": "`typeorm-seeding` is now maintained as scoped package.", "packageRules": [