Skip to content

Commit

Permalink
feat: reads versions from lock files
Browse files Browse the repository at this point in the history
Reading from the appropriate lock files instead of the
package.json means having a better idea of what packages
are installed. With the package.json, there's a chance to
miss the actual installed version due to using a range
like ^7.0.0 whereas with the lock file, the version is
printed to what the package manager resolved.

To make this more easily achievable, I refactored the
info.action.ts file to be more class based so I could
reuse the package manager instead of having to re-find it
each time.

re: #896
  • Loading branch information
jmcdo29 committed Nov 17, 2020
1 parent 10143d1 commit 95f2012
Show file tree
Hide file tree
Showing 7 changed files with 60 additions and 46 deletions.
65 changes: 22 additions & 43 deletions actions/info.action.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,14 @@ import {
import { BANNER, MESSAGES } from '../lib/ui';
import { AbstractAction } from './abstract.action';

interface LockfileDependency {
version: string;
resolved: string;
integrity: string;
}

interface PackageJsonDependencies {
[key: string]: string;
[key: string]: LockfileDependency;
}

interface NestDependency {
Expand All @@ -20,42 +26,24 @@ interface NestDependency {
}

export class InfoAction extends AbstractAction {
private manager!: AbstractPackageManager;

public async handle() {
displayBanner();
await displaySystemInformation();
await displayNestInformation();
this.manager = await PackageManagerFactory.find();
this.displayBanner();
await this.displaySystemInformation();
await this.displayNestInformation();
}
}

const displayBanner = () => {
console.info(chalk.red(BANNER));
};

const displaySystemInformation = async () => {
console.info(chalk.green('[System Information]'));
console.info('OS Version :', chalk.blue(osName(platform(), release())));
console.info('NodeJS Version :', chalk.blue(process.version));
await displayPackageManagerVersion();
};

const displayPackageManagerVersion = async () => {
const manager: AbstractPackageManager = await PackageManagerFactory.find();
try {
const version: string = await manager.version();
console.info(`${manager.name} Version :`, chalk.blue(version), '\n');
} catch {
console.error(`${manager.name} Version :`, chalk.red('Unknown'), '\n');
private displayBanner() {
console.info(chalk.red(BANNER));
}
};

const displayNestInformation = async () => {
displayCliVersion();
console.info(chalk.green('[Nest Platform Information]'));
try {
const dependencies: PackageJsonDependencies = await readProjectPackageJsonDependencies();
displayNestVersions(dependencies);
} catch {
console.error(chalk.red(MESSAGES.NEST_INFORMATION_PACKAGE_MANAGER_FAILED));
private async displaySystemInformation(): Promise<void> {
console.info(chalk.green('[System Information]'));
console.info('OS Version :', chalk.blue(osName(platform(), release())));
console.info('NodeJS Version :', chalk.blue(process.version));
await this.displayPackageManagerVersion();
}
};

Expand Down Expand Up @@ -123,15 +111,6 @@ const format = (dependencies: NestDependency[]): NestDependency[] => {
if (dependency.name.length < length) {
dependency.name = rightPad(dependency.name, length);
}
dependency.name = dependency.name.concat(' :');
dependency.value = dependency.value.replace(/(\^|\~)/, '');
});
return sorted;
};

const rightPad = (name: string, length: number): string => {
while (name.length < length) {
name = name.concat(' ');
return name;
}
return name;
};
}
3 changes: 3 additions & 0 deletions lib/package-managers/abstract.package-manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import * as ora from 'ora';
import { join } from 'path';
import { AbstractRunner } from '../runners/abstract.runner';
import { MESSAGES } from '../ui';
import { LockParser } from './lock-parser';
import { PackageManagerCommands } from './package-manager-commands';
import { ProjectDependency } from './project.dependency';

Expand Down Expand Up @@ -177,4 +178,6 @@ export abstract class AbstractPackageManager {
public abstract get name(): string;

public abstract get cli(): PackageManagerCommands;

public abstract get lockParser(): LockParser;
}
4 changes: 4 additions & 0 deletions lib/package-managers/lock-parser.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
export interface LockParser {
stringify: (record: Record<string, any>) => string;
parse: (file: string) => Record<string, any>
}
5 changes: 5 additions & 0 deletions lib/package-managers/npm.package-manager.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { Runner, RunnerFactory } from '../runners';
import { NpmRunner } from '../runners/npm.runner';
import { AbstractPackageManager } from './abstract.package-manager';
import { LockParser } from './lock-parser';
import { PackageManager } from './package-manager';
import { PackageManagerCommands } from './package-manager-commands';

Expand All @@ -23,4 +24,8 @@ export class NpmPackageManager extends AbstractPackageManager {
saveDevFlag: '--save-dev',
};
}

get lockParser(): LockParser {
return JSON;
}
}
6 changes: 6 additions & 0 deletions lib/package-managers/yarn.package-manager.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import * as yarnLockParser from '@yarnpkg/lockfile';
import { Runner, RunnerFactory } from '../runners';
import { YarnRunner } from '../runners/yarn.runner';
import { AbstractPackageManager } from './abstract.package-manager';
import { LockParser } from './lock-parser';
import { PackageManager } from './package-manager';
import { PackageManagerCommands } from './package-manager-commands';

Expand All @@ -23,4 +25,8 @@ export class YarnPackageManager extends AbstractPackageManager {
saveDevFlag: '-D',
};
}

get lockParser(): LockParser {
return yarnLockParser;
}
}
17 changes: 14 additions & 3 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,12 @@
"@angular-devkit/schematics": "11.0.1",
"@angular-devkit/schematics-cli": "0.1100.1",
"@nestjs/schematics": "^7.1.0",
<<<<<<< HEAD
"@types/webpack": "4.41.25",
=======
"@types/webpack": "4.41.21",
"@yarnpkg/lockfile": "^1.1.0",
>>>>>>> feat: reads versions from lock files
"chalk": "3.0.0",
"chokidar": "3.4.3",
"cli-table3": "0.5.1",
Expand Down Expand Up @@ -79,6 +84,7 @@
"@types/rimraf": "3.0.0",
"@types/shelljs": "0.8.8",
"@types/webpack-node-externals": "2.5.0",
"@types/yarnpkg__lockfile": "^1.1.4",
"@typescript-eslint/eslint-plugin": "^2.19.0",
"@typescript-eslint/parser": "^2.19.0",
"delete-empty": "3.0.0",
Expand Down

0 comments on commit 95f2012

Please sign in to comment.