diff --git a/libraries/npm-check-fork/src/CreatePackageSummary.ts b/libraries/npm-check-fork/src/CreatePackageSummary.ts index 5bdbf601037..1a504643147 100644 --- a/libraries/npm-check-fork/src/CreatePackageSummary.ts +++ b/libraries/npm-check-fork/src/CreatePackageSummary.ts @@ -91,7 +91,8 @@ export default async function createPackageSummary( semver.valid(versionToUse) ? !semver.satisfies(versionToUse, packageJsonVersion) : false, - bump: bump + bump: bump, + ...(fromRegistry.deprecated !== undefined && { deprecated: fromRegistry.deprecated }) }; }); } diff --git a/libraries/npm-check-fork/src/GetLatestFromRegistry.ts b/libraries/npm-check-fork/src/GetLatestFromRegistry.ts index 9bdd76087d7..79b3cf3c5d5 100644 --- a/libraries/npm-check-fork/src/GetLatestFromRegistry.ts +++ b/libraries/npm-check-fork/src/GetLatestFromRegistry.ts @@ -67,7 +67,8 @@ export default async function getNpmInfo(packageName: string): Promise { expect(result).toHaveProperty('latest', '2.0.0'); expect(result).toHaveProperty('installed', '1.0.0'); }); + + it('returns summary with deprecated message for deprecated package', async () => { + mockFindModulePath.mockReturnValue('/mock/path'); + mockReadPackageJson.mockReturnValue({ + dependencies: {}, + devDependencies: {} + } as INpmCheckPackageJson); + mockGetLatestFromRegistry.mockResolvedValue({ + latest: '2.0.0', + next: '2.0.0', + versions: ['1.0.0', '2.0.0'], + homepage: 'https://homepage.com', + deprecated: 'This package is deprecated. Use new-package instead.' + } as INpmRegistryInfo); + const state: INpmCheckState = { + cwd: process.cwd(), + cwdPackageJson: { dependencies: { 'deprecated-pkg': '1.0.0' }, devDependencies: {} } + }; + const result: INpmCheckPackageSummary | boolean = await createPackageSummary('deprecated-pkg', state); + expect(result).toBeTruthy(); + expect(result).toHaveProperty('moduleName', 'deprecated-pkg'); + expect(result).toHaveProperty('deprecated', 'This package is deprecated. Use new-package instead.'); + }); + + it('returns summary without deprecated field for non-deprecated package', async () => { + mockFindModulePath.mockReturnValue('/mock/path'); + mockReadPackageJson.mockReturnValue({ + dependencies: {}, + devDependencies: {} + } as INpmCheckPackageJson); + mockGetLatestFromRegistry.mockResolvedValue({ + latest: '2.0.0', + next: '3.0.0', + versions: ['1.0.0', '2.0.0', '3.0.0'], + homepage: 'https://homepage.com' + } as INpmRegistryInfo); + const state: INpmCheckState = { + cwd: process.cwd(), + cwdPackageJson: { dependencies: { 'good-pkg': '1.0.0' }, devDependencies: {} } + }; + const result: INpmCheckPackageSummary | boolean = await createPackageSummary('good-pkg', state); + expect(result).toBeTruthy(); + expect(result).not.toHaveProperty('deprecated'); + }); }); diff --git a/libraries/npm-check-fork/src/tests/GetLatestFromRegistry.test.ts b/libraries/npm-check-fork/src/tests/GetLatestFromRegistry.test.ts index 17aa23581ec..5a48916ac04 100644 --- a/libraries/npm-check-fork/src/tests/GetLatestFromRegistry.test.ts +++ b/libraries/npm-check-fork/src/tests/GetLatestFromRegistry.test.ts @@ -80,6 +80,42 @@ describe('getNpmInfo', () => { expect(result).toHaveProperty('homepage', ''); }); + it('returns deprecated message for deprecated latest version', async () => { + const mockData: INpmRegistryPackageResponse = { + name: 'test-package', + versions: { + '1.0.0': { + name: 'test-package', + version: '1.0.0', + deprecated: 'This package is deprecated. Use new-package instead.' + } + }, + 'dist-tags': { latest: '1.0.0', next: '1.0.0' } + }; + mockFetchPackageMetadataAsync.mockResolvedValue({ data: mockData }); + + const result: INpmRegistryInfo = await getNpmInfo('test-package'); + expect(result).toHaveProperty('latest', '1.0.0'); + expect(result).toHaveProperty('deprecated', 'This package is deprecated. Use new-package instead.'); + }); + + it('does not set deprecated for non-deprecated package', async () => { + const mockData: INpmRegistryPackageResponse = { + name: 'test-package', + versions: { + '1.0.0': { + name: 'test-package', + version: '1.0.0' + } + }, + 'dist-tags': { latest: '1.0.0', next: '1.0.0' } + }; + mockFetchPackageMetadataAsync.mockResolvedValue({ data: mockData }); + + const result: INpmRegistryInfo = await getNpmInfo('test-package'); + expect(result.deprecated).toBeUndefined(); + }); + it('filters out versions exceeding CRAZY_HIGH_SEMVER threshold', async () => { const mockData: INpmRegistryPackageResponse = { name: 'test-package',