Skip to content

Commit

Permalink
feat: add warning message for the info command
Browse files Browse the repository at this point in the history
  More details here: #1929
  • Loading branch information
GreGosPhaTos committed Nov 22, 2023
1 parent 4dc64e8 commit 32b9380
Show file tree
Hide file tree
Showing 2 changed files with 163 additions and 1 deletion.
74 changes: 73 additions & 1 deletion actions/info.action.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,11 @@ interface PackageJsonDependencies {
interface NestDependency {
name: string;
value: string;
fullName: string;
}

interface NestDependencyWarnings {
[key: string]: Array<NestDependency>;
}

export class InfoAction extends AbstractAction {
Expand Down Expand Up @@ -104,9 +109,74 @@ export class InfoAction extends AbstractAction {
}

displayNestVersions(dependencies: PackageJsonDependencies) {
this.buildNestVersionsMessage(dependencies).forEach((dependency) =>
const nestDependencies = this.buildNestVersionsMessage(dependencies);
nestDependencies.forEach((dependency) =>
console.info(dependency.name, chalk.blue(dependency.value)),
);

this.displayWarningMessage(nestDependencies);
}

displayWarningMessage(nestDependencies: NestDependency[]) {
const warnings = this.buildNestVersionsWarningMessage(nestDependencies);
const minorVersions = Object.keys(warnings);
if (minorVersions.length > 0) {
console.info('\r');

console.info(chalk.yellow('[Warnings]'));
console.info('The following packages are not in the same minor version');
console.info('This could lead to runtime errors');
minorVersions.forEach(version => {
console.info(chalk.bold(`* Under version ${version}`));
warnings[version].forEach(({ fullName, value }) => {
console.info((`- ${fullName} ${value}`));
});
})
}
}

buildNestVersionsWarningMessage(
nestDependencies: NestDependency[],
): NestDependencyWarnings {

const dependenciesWhiteList = [
'@nestjs/core',
'@nestjs/common',
'@nestjs/schematics',
'@nestjs/platform-express',
'@nestjs/platform-fastify',
'@nestjs/platform-socket.io',
'@nestjs/platform-ws',
'@nestjs/websockets',
];

const unsortedWarnings: NestDependencyWarnings = nestDependencies.reduce<NestDependencyWarnings>(
(acc, { name, fullName, value }) => {
if (!dependenciesWhiteList.includes(fullName)) {
return acc;
}

const [major, minor] = value.split('.').map(parseFloat);
const minorVersion = `${major}.${minor}`;
acc[minorVersion] = [...(acc[minorVersion] || []), { name, fullName, value }];
return acc;
},
{}
);

const unsortedMinorVersions = Object.keys(unsortedWarnings);
if (unsortedMinorVersions.length <= 1) {
return {};
}

const sortedMinorVersions = unsortedMinorVersions.sort(
(versionA, versionB) => parseFloat(versionB) - parseFloat(versionA)
);

return sortedMinorVersions.reduce<NestDependencyWarnings>((warnings, minorVersion) => {
warnings[minorVersion] = unsortedWarnings[minorVersion];
return warnings;
}, {});
}

buildNestVersionsMessage(
Expand All @@ -130,9 +200,11 @@ export class InfoAction extends AbstractAction {
nestDependencies.push({
name: `${key.replace(/@nestjs\//, '').replace(/@.*/, '')} version`,
value: value || dependencies[key].version,
fullName: key,
});
}
});

return nestDependencies;
}

Expand Down
90 changes: 90 additions & 0 deletions test/actions/info.action.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
import { InfoAction } from '../../actions/info.action';

jest.mock('fs', () => ({
readFileSync: jest.fn(() => '{"version": "1.2.3"}'),
}));

jest.mock('../../lib/package-managers', () => ({
PackageManagerFactory: {
find: jest.fn(() => ({
name: 'MockedPackageManager',
version: jest.fn(() => '1.0.0'),
})),
},
}));

describe('InfoAction', () => {
let infoAction: InfoAction;

beforeEach(() => {
infoAction = new InfoAction();
});

describe('buildNestVersionsWarningMessage', () => {
it('should return an empty object for one or zero minor versions', () => {
const dependencies = [
{ fullName: '@nestjs/core', name: 'core', value: '1.2.3' },
{ fullName: '@nestjs/common', name: 'common', value: '1.2.4' },
];
const result = infoAction.buildNestVersionsWarningMessage(dependencies);
expect(result).toEqual({});

});

it('should return an object only with whitelisted dependencies', () => {
const dependencies = [
{ fullName: '@nestjs/core', name: 'core', value: '1.2.3' },
{ fullName: '@nestjs/common', name: 'common', value: '1.2.4' },
{ fullName: '@nestjs/schematics', name: 'schematics', value: '1.2.4' },
{ fullName: '@nestjs/platform-express', name: 'platform-express', value: '1.2.4' },
{ fullName: '@nestjs/platform-fastify', name: 'platform-fastify', value: '1.2.4' },
{ fullName: '@nestjs/platform-socket.io', name: 'platform-socket.io', value: '1.2.4' },
{ fullName: '@nestjs/platform-ws', name: 'platform-ws', value: '2.1.0' },
{ fullName: '@nestjs/websockets', name: 'websockets', value: '2.1.0' },
{ fullName: '@nestjs/test1', name: 'test1', value: '1.2.4' },
{ fullName: '@nestjs/test2', name: 'test2', value: '1.2.4' },
];
const result = infoAction.buildNestVersionsWarningMessage(dependencies);
const expected = {
'1.2': [
{ fullName: '@nestjs/core', name: 'core', value: '1.2.3' },
{ fullName: '@nestjs/common', name: 'common', value: '1.2.4' },
{ fullName: '@nestjs/schematics', name: 'schematics', value: '1.2.4' },
{ fullName: '@nestjs/platform-express', name: 'platform-express', value: '1.2.4' },
{ fullName: '@nestjs/platform-fastify', name: 'platform-fastify', value: '1.2.4' },
{ fullName: '@nestjs/platform-socket.io', name: 'platform-socket.io', value: '1.2.4' },
],
'2.1':[
{ fullName: '@nestjs/platform-ws', name: 'platform-ws', value: '2.1.0' },
{ fullName: '@nestjs/websockets', name: 'websockets', value: '2.1.0' },
],
};
expect(result).toEqual(expected);

});

it('should group dependencies by minor versions and sort them in descending order', () => {
const dependencies = [
{ name: 'schematics', fullName: '@nestjs/schematics', value: '1.2.3' },
{ name: 'platform-express', fullName: '@nestjs/platform-express', value: '1.2.4' },
{ name: 'platform-fastify', fullName: '@nestjs/platform-fastify', value: '2.1.0' },
{ name: 'platform-socket.io', fullName: '@nestjs/platform-socket.io', value: '2.0.1' },
];

const result = infoAction.buildNestVersionsWarningMessage(dependencies);
const expected = {
'2.1': [{ name: 'platform-fastify', fullName: '@nestjs/platform-fastify', value: '2.1.0' }],
'2.0': [
{ name: 'platform-socket.io', fullName: '@nestjs/platform-socket.io', value: '2.0.1' },
],
'1.2': [
{ name: 'schematics', fullName: '@nestjs/schematics', value: '1.2.3' },
{ name: 'platform-express', fullName: '@nestjs/platform-express', value: '1.2.4' },
],
};

expect(result).toEqual(expected);
});
});
});

0 comments on commit 32b9380

Please sign in to comment.