Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion libraries/npm-check-fork/src/CreatePackageSummary.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 })
};
});
}
3 changes: 2 additions & 1 deletion libraries/npm-check-fork/src/GetLatestFromRegistry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,8 @@ export default async function getNpmInfo(packageName: string): Promise<INpmRegis
latest: latestStableRelease,
next: next,
versions: sortedVersions,
homepage: bestGuessHomepage(registryData) || ''
homepage: bestGuessHomepage(registryData) || '',
deprecated: latestStableRelease ? rawData.versions[latestStableRelease]?.deprecated : undefined
};
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,5 @@ export interface INpmCheckPackageSummary {
devDependency: boolean; // Is this a devDependency?
mismatch: boolean; // Does the version installed not match the range in package.json?
bump?: INpmCheckVersionBumpType; // What kind of bump is required to get the latest
deprecated?: string; // Deprecation message if the latest version of the package is deprecated.
}
11 changes: 11 additions & 0 deletions libraries/npm-check-fork/src/interfaces/INpmCheckRegistry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,11 @@ export interface INpmRegistryInfo {
versions?: string[];
homepage?: string;
error?: string;
/**
* Deprecation message for the latest version, if the package has been deprecated.
* Present only when the latest version is deprecated.
*/
deprecated?: string;
}

interface INpmCheckRegistryInfoBugs {
Expand Down Expand Up @@ -40,6 +45,12 @@ export interface INpmRegistryVersionMetadata extends INpmCheckPackageVersion {

/** Version string */
version: string;

/**
* Deprecation message for this version, if the version has been deprecated.
* Present only when the package version is deprecated.
*/
deprecated?: string;
}

/**
Expand Down
44 changes: 44 additions & 0 deletions libraries/npm-check-fork/src/tests/CreatePackageSummary.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -76,4 +76,48 @@ describe('createPackageSummary', () => {
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');
});
});
36 changes: 36 additions & 0 deletions libraries/npm-check-fork/src/tests/GetLatestFromRegistry.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down