0
0
Fork 0
mirror of https://github.com/renovatebot/renovate.git synced 2025-02-06 01:20:45 +00:00
renovatebot_renovate/lib/modules/manager/npm/update/dependency/pnpm.spec.ts
Fotis Papadogeorgopoulos 0f06866080
feat(managers/npm): support pnpm catalogs (#33376)
Co-authored-by: Sebastian Poxhofer <secustor@users.noreply.github.com>
2025-01-28 10:11:55 +00:00

574 lines
12 KiB
TypeScript

import { codeBlock } from 'common-tags';
import * as npmUpdater from '../..';
describe('modules/manager/npm/update/dependency/pnpm', () => {
it('handles implicit default catalog dependency', () => {
const upgrade = {
depType: 'pnpm.catalog.default',
depName: 'react',
newValue: '19.0.0',
};
const pnpmWorkspaceYaml = codeBlock`
packages:
- pkg-a
catalog:
react: 18.3.1
`;
const testContent = npmUpdater.updateDependency({
fileContent: pnpmWorkspaceYaml,
upgrade,
});
expect(testContent).toEqual(codeBlock`
packages:
- pkg-a
catalog:
react: 19.0.0
`);
});
it('handles explicit default catalog dependency', () => {
const upgrade = {
depType: 'pnpm.catalog.default',
depName: 'react',
newValue: '19.0.0',
};
const pnpmWorkspaceYaml = codeBlock`
packages:
- pkg-a
catalogs:
default:
react: 18.3.1
`;
const testContent = npmUpdater.updateDependency({
fileContent: pnpmWorkspaceYaml,
upgrade,
});
expect(testContent).toEqual(codeBlock`
packages:
- pkg-a
catalogs:
default:
react: 19.0.0
`);
});
it('handles explicit named catalog dependency', () => {
const upgrade = {
depType: 'pnpm.catalog.react17',
depName: 'react',
newValue: '19.0.0',
};
const pnpmWorkspaceYaml = codeBlock`
packages:
- pkg-a
catalog:
react: 18.3.1
catalogs:
react17:
react: 17.0.0
`;
const testContent = npmUpdater.updateDependency({
fileContent: pnpmWorkspaceYaml,
upgrade,
});
expect(testContent).toEqual(codeBlock`
packages:
- pkg-a
catalog:
react: 18.3.1
catalogs:
react17:
react: 19.0.0
`);
});
it('does nothing if the new and old values match', () => {
const upgrade = {
depType: 'pnpm.catalog.default',
depName: 'react',
newValue: '19.0.0',
};
const pnpmWorkspaceYaml = codeBlock`
packages:
- pkg-a
catalog:
react: 19.0.0
`;
const testContent = npmUpdater.updateDependency({
fileContent: pnpmWorkspaceYaml,
upgrade,
});
expect(testContent).toEqual(pnpmWorkspaceYaml);
});
it('replaces package', () => {
const upgrade = {
depType: 'pnpm.catalog.default',
depName: 'config',
newName: 'abc',
newValue: '2.0.0',
};
const pnpmWorkspaceYaml = codeBlock`
packages:
- pkg-a
catalog:
config: 1.21.0
`;
const testContent = npmUpdater.updateDependency({
fileContent: pnpmWorkspaceYaml,
upgrade,
});
expect(testContent).toEqual(codeBlock`
packages:
- pkg-a
catalog:
abc: 2.0.0
`);
});
it('replaces a github dependency value', () => {
const upgrade = {
depType: 'pnpm.catalog.default',
depName: 'gulp',
currentValue: 'v4.0.0-alpha.2',
currentRawValue: 'gulpjs/gulp#v4.0.0-alpha.2',
newValue: 'v4.0.0',
};
const pnpmWorkspaceYaml = codeBlock`
packages:
- pkg-a
catalog:
gulp: gulpjs/gulp#v4.0.0-alpha.2
`;
const testContent = npmUpdater.updateDependency({
fileContent: pnpmWorkspaceYaml,
upgrade,
});
expect(testContent).toEqual(codeBlock`
packages:
- pkg-a
catalog:
gulp: gulpjs/gulp#v4.0.0
`);
});
it('replaces a npm package alias', () => {
const upgrade = {
depType: 'pnpm.catalog.default',
depName: 'hapi',
npmPackageAlias: true,
packageName: '@hapi/hapi',
currentValue: '18.3.0',
newValue: '18.3.1',
};
const pnpmWorkspaceYaml = codeBlock`
packages:
- pkg-a
catalog:
hapi: npm:@hapi/hapi@18.3.0
`;
const testContent = npmUpdater.updateDependency({
fileContent: pnpmWorkspaceYaml,
upgrade,
});
expect(testContent).toEqual(codeBlock`
packages:
- pkg-a
catalog:
hapi: npm:@hapi/hapi@18.3.1
`);
});
it('replaces a github short hash', () => {
const upgrade = {
depType: 'pnpm.catalog.default',
depName: 'gulp',
currentDigest: 'abcdef7',
currentRawValue: 'gulpjs/gulp#abcdef7',
newDigest: '0000000000111111111122222222223333333333',
};
const pnpmWorkspaceYaml = codeBlock`
packages:
- pkg-a
catalog:
gulp: gulpjs/gulp#abcdef7
`;
const testContent = npmUpdater.updateDependency({
fileContent: pnpmWorkspaceYaml,
upgrade,
});
expect(testContent).toEqual(codeBlock`
packages:
- pkg-a
catalog:
gulp: gulpjs/gulp#0000000
`);
});
it('replaces a github fully specified version', () => {
const upgrade = {
depType: 'pnpm.catalog.default',
depName: 'n',
currentValue: 'v1.0.0',
currentRawValue: 'git+https://github.com/owner/n#v1.0.0',
newValue: 'v1.1.0',
};
const pnpmWorkspaceYaml = codeBlock`
packages:
- pkg-a
catalog:
n: git+https://github.com/owner/n#v1.0.0
`;
const testContent = npmUpdater.updateDependency({
fileContent: pnpmWorkspaceYaml,
upgrade,
});
expect(testContent).toEqual(codeBlock`
packages:
- pkg-a
catalog:
n: git+https://github.com/owner/n#v1.1.0
`);
});
it('returns null if the dependency is not present in the target catalog', () => {
const upgrade = {
depType: 'pnpm.catalog.default',
depName: 'react-not',
newValue: '19.0.0',
};
const pnpmWorkspaceYaml = codeBlock`
packages:
- pkg-a
catalog:
react: 18.3.1
`;
const testContent = npmUpdater.updateDependency({
fileContent: pnpmWorkspaceYaml,
upgrade,
});
expect(testContent).toBeNull();
});
it('returns null if catalogs are missing', () => {
const upgrade = {
depType: 'pnpm.catalog.default',
depName: 'react',
newValue: '19.0.0',
};
const pnpmWorkspaceYaml = codeBlock`
packages:
- pkg-a
`;
const testContent = npmUpdater.updateDependency({
fileContent: pnpmWorkspaceYaml,
upgrade,
});
expect(testContent).toBeNull();
});
it('returns null if empty file', () => {
const upgrade = {
depType: 'pnpm.catalog.default',
depName: 'react',
newValue: '19.0.0',
};
const testContent = npmUpdater.updateDependency({
fileContent: null as never,
upgrade,
});
expect(testContent).toBeNull();
});
it('preserves literal whitespace', () => {
const upgrade = {
depType: 'pnpm.catalog.default',
depName: 'react',
newValue: '19.0.0',
};
const pnpmWorkspaceYaml = codeBlock`
packages:
- pkg-a
catalog:
react: 18.3.1
`;
const testContent = npmUpdater.updateDependency({
fileContent: pnpmWorkspaceYaml,
upgrade,
});
expect(testContent).toEqual(codeBlock`
packages:
- pkg-a
catalog:
react: 19.0.0
`);
});
it('preserves single quote style', () => {
const upgrade = {
depType: 'pnpm.catalog.default',
depName: 'react',
newValue: '19.0.0',
};
const pnpmWorkspaceYaml = codeBlock`
packages:
- pkg-a
catalog:
react: '18.3.1'
`;
const testContent = npmUpdater.updateDependency({
fileContent: pnpmWorkspaceYaml,
upgrade,
});
expect(testContent).toEqual(codeBlock`
packages:
- pkg-a
catalog:
react: '19.0.0'
`);
});
it('preserves comments', () => {
const upgrade = {
depType: 'pnpm.catalog.default',
depName: 'react',
newValue: '19.0.0',
};
const pnpmWorkspaceYaml = codeBlock`
packages:
- pkg-a
catalog:
react: 18.3.1 # This is a comment
# This is another comment
react-dom: 18.3.1
`;
const testContent = npmUpdater.updateDependency({
fileContent: pnpmWorkspaceYaml,
upgrade,
});
expect(testContent).toEqual(codeBlock`
packages:
- pkg-a
catalog:
react: 19.0.0 # This is a comment
# This is another comment
react-dom: 18.3.1
`);
});
it('preserves double quote style', () => {
const upgrade = {
depType: 'pnpm.catalog.default',
depName: 'react',
newValue: '19.0.0',
};
const pnpmWorkspaceYaml = codeBlock`
packages:
- pkg-a
catalog:
react: "18.3.1"
`;
const testContent = npmUpdater.updateDependency({
fileContent: pnpmWorkspaceYaml,
upgrade,
});
expect(testContent).toEqual(codeBlock`
packages:
- pkg-a
catalog:
react: "19.0.0"
`);
});
it('preserves anchors, replacing only the value', () => {
// At the time of writing, this pattern is the recommended way to sync
// dependencies in catalogs.
// @see https://github.com/pnpm/pnpm/issues/8245#issuecomment-2371335323
const upgrade = {
depType: 'pnpm.catalog.default',
depName: 'react',
newValue: '19.0.0',
};
const pnpmWorkspaceYaml = codeBlock`
packages:
- pkg-a
catalog:
react: &react 18.3.1
react-dom: *react
`;
const testContent = npmUpdater.updateDependency({
fileContent: pnpmWorkspaceYaml,
upgrade,
});
expect(testContent).toEqual(codeBlock`
packages:
- pkg-a
catalog:
react: &react 19.0.0
react-dom: *react
`);
});
it('preserves whitespace with anchors', () => {
const upgrade = {
depType: 'pnpm.catalog.default',
depName: 'react',
newValue: '19.0.0',
};
const pnpmWorkspaceYaml = codeBlock`
packages:
- pkg-a
catalog:
react: &react 18.3.1
`;
const testContent = npmUpdater.updateDependency({
fileContent: pnpmWorkspaceYaml,
upgrade,
});
expect(testContent).toEqual(codeBlock`
packages:
- pkg-a
catalog:
react: &react 19.0.0
`);
});
it('preserves quotation style with anchors', () => {
const upgrade = {
depType: 'pnpm.catalog.default',
depName: 'react',
newValue: '19.0.0',
};
const pnpmWorkspaceYaml = codeBlock`
packages:
- pkg-a
catalog:
react: &react "18.3.1"
`;
const testContent = npmUpdater.updateDependency({
fileContent: pnpmWorkspaceYaml,
upgrade,
});
expect(testContent).toEqual(codeBlock`
packages:
- pkg-a
catalog:
react: &react "19.0.0"
`);
});
it('preserves formatting in flow style syntax', () => {
const upgrade = {
depType: 'pnpm.catalog.default',
depName: 'react',
newValue: '19.0.0',
};
const pnpmWorkspaceYaml = codeBlock`
packages:
- pkg-a
catalog: {
# This is a comment
"react": "18.3.1"
}
`;
const testContent = npmUpdater.updateDependency({
fileContent: pnpmWorkspaceYaml,
upgrade,
});
expect(testContent).toEqual(codeBlock`
packages:
- pkg-a
catalog: {
# This is a comment
"react": "19.0.0"
}
`);
});
it('does not replace aliases in the value position', () => {
const upgrade = {
depType: 'pnpm.catalog.default',
depName: 'react',
newValue: '19.0.0',
};
// In the general case, we do not know whether we should replace the anchor
// that an alias is resolved from. We leave this up to the user, e.g. via a
// Regex custom manager.
const pnpmWorkspaceYaml = codeBlock`
__deps:
react: &react 18.3.1
packages:
- pkg-a
catalog:
react: *react
react-dom: *react
`;
const testContent = npmUpdater.updateDependency({
fileContent: pnpmWorkspaceYaml,
upgrade,
});
expect(testContent).toBeNull();
});
it('does not replace aliases in the key position', () => {
const upgrade = {
depType: 'pnpm.catalog.default',
depName: 'react',
newName: 'react-x',
};
const pnpmWorkspaceYaml = codeBlock`
__vars:
&r react: ""
packages:
- pkg-a
catalog:
*r: 18.0.0
`;
const testContent = npmUpdater.updateDependency({
fileContent: pnpmWorkspaceYaml,
upgrade,
});
expect(testContent).toBeNull();
});
});