Skip to content

Commit

Permalink
Merge pull request #33 from harksys/v0.2.0
Browse files Browse the repository at this point in the history
v0.2.0
  • Loading branch information
andrewhathaway authored Jul 10, 2022
2 parents f73c1e1 + a965d71 commit afd0c89
Show file tree
Hide file tree
Showing 29 changed files with 5,918 additions and 2,764 deletions.
8,020 changes: 5,621 additions & 2,399 deletions package-lock.json

Large diffs are not rendered by default.

23 changes: 10 additions & 13 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "npmvet",
"version": "0.1.5",
"version": "0.2.0",
"description": "A simple CLI tool for vetting npm package versions",
"main": "dist/index.js",
"scripts": {
Expand Down Expand Up @@ -31,7 +31,7 @@
"modulePaths": [
"<rootDir>/src/"
],
"testPathDirs": [
"roots": [
"./test/tests"
],
"testRegex": "^.*.(js)$",
Expand All @@ -46,22 +46,19 @@
},
"devDependencies": {
"@types/blessed": "^0.1.4",
"@types/chalk": "^0.4.31",
"@types/commander": "^2.3.31",
"@types/lodash": "^4.14.52",
"@types/node": "^7.0.5",
"@types/semver": "^5.3.30",
"@types/table": "^4.0.1",
"jest": "^18.1.0",
"typescript": "^2.1.5"
"jest": "^28.1.1",
"typescript": "^4.7.4"
},
"dependencies": {
"blessed": "^0.1.81",
"chalk": "^1.1.3",
"commander": "2.9.0",
"lodash": "^4.17.4",
"pluralize": "^3.1.0",
"semver": "^5.3.0",
"table": "^4.0.1"
"chalk": "^4.1.2",
"commander": "9.1.0",
"lodash": "^4.17.21",
"pluralize": "^6.0.0",
"semver": "^7.3.7",
"table": "^6.8.0"
}
}
40 changes: 16 additions & 24 deletions src/cliopts.ts
Original file line number Diff line number Diff line change
@@ -1,34 +1,26 @@
import * as path from 'path';
import * as program from 'commander';
import { Command } from 'commander';

/**
* @param {program.ICommand} prog
* @param {Command} prog
* @returns ICLIOpts
*/
export function getCLIOptions(prog: program.ICommand): ICLIOpts
{
let opts: ICLIOpts = {
package : prog['package'],
modules : prog['modules'],
renderer : prog['renderer'],
strict : typeof prog['strict'] === 'boolean'
? prog['strict']
: false
};

return opts;
};
export const getCLIOptions = (prog: Command): ICLIOpts =>
({
package: prog['package'] ?? '',
modules: prog['modules'] ?? '',
renderer: prog['renderer'] ?? 'inlinetable',
strict: typeof prog['strict'] === 'boolean'
? prog['strict']
: false
});

/**
* @param {ICLIOpts} opts
* @returns IVetPaths
*/
export function makeVetPaths(opts: ICLIOpts): IVetPaths
{
let paths: IVetPaths = {
packagePath : path.resolve(process.cwd(), opts.package, 'package.json'),
modulesPath : path.resolve(process.cwd(), opts.modules, 'node_modules')
};

return paths;
};
export const makeVetPaths = (opts: ICLIOpts): IVetPaths =>
({
packagePath: path.resolve(process.cwd(), opts.package ?? '', 'package.json'),
modulesPath: path.resolve(process.cwd(), opts.modules ?? '', 'node_modules')
});
161 changes: 89 additions & 72 deletions src/deps.ts
Original file line number Diff line number Diff line change
@@ -1,45 +1,45 @@
import * as path from 'path';
import * as semver from 'semver';
import { get } from 'lodash';

import { fileExists } from './filesys';

// Regex for checking whether this version references a git ssh url
const urlRegex = /(?:git|ssh|https?|git@[-\w.]+):(\/\/)?(.*?)(\.git)(\/?|\#[-\d\w._]+?)$/
// Regex for checking whether this version references an alias
const npmAliasRegex = /npm:.*@([\^\~]?[0-9]+(\.?[0-9]?)+)/

/**
* @param {string} packageJsonPath
* @returns IDependencyMap
*/
export function createDependencyMap(packageFile: any): IDependencyMap
{
let deps = get(packageFile, `dependencies`, {});
let devDeps = get(packageFile, `devDependencies`, {});

let dependencyMap: IDependencyMap = {
deps : toDependencies(deps),
devDeps : toDependencies(devDeps)
};
export const createDependencyMap = (packageFile: any): IDependencyMap => {
let deps = packageFile?.dependencies ?? {};
let devDeps = packageFile?.devDependencies ?? {};

return dependencyMap;
return {
deps: toDependencies(deps),
devDeps: toDependencies(devDeps)
};
};

/**
* @param {{}} object
* @returns IDependency
*/
export function toDependencies(object: {}): IDependency[]
{
return Object.keys(object)
.map(packageName => ({
name : packageName,
version : object[packageName]
}));
};
export const toDependencies = (object: {}): IDependency[] =>
Object
.keys(object)
.map(packageName =>
({
name: packageName,
version: object[packageName]
}));

/**
* @param {string} version
* @returns string
*/
export function parseVersion(version: string): string
{
export const parseVersion = (version: string): string => {
// Tests for whether the version starts with ~ (tilde) or ^ (caret)
if (/^[~^]/.test(version)) {
return version.substring(1);
Expand All @@ -52,74 +52,78 @@ export function parseVersion(version: string): string
* @param {string} version
* @returns string
*/
export function extractVersionFromUrl(version: string) : string
{
// Regex for checking whether this version references a git ssh url
const regex = /(?:git|ssh|https?|git@[-\w.]+):(\/\/)?(.*?)(\.git)(\/?|\#[-\d\w._]+?)$/
if (regex.test(version)) {
// If a version number is present, then return that version number, else return 'Unknown'
var i = version.indexOf('.git#v');
if (i > 0) {
return version.substring(i+6);
}
else {
return 'Unknown';
}
export const extractVersionFromUrl = (version: string): string => {
const npmAliasVersion = extractNpmAliasVersion(version);
if (npmAliasVersion !== null) {
return npmAliasVersion;
}

if (!urlRegex.test(version)) {
return version.indexOf('workspace:') === 0
? version.replace('workspace:', '')
: version;
}
return version;

// Gett the last group which is the #versionspec at the end
let lastGroup = version.match(urlRegex)[4];
if (!lastGroup) {
return 'Unknown';
}

let versionTag = lastGroup.replace('#', ''); //strip off the '#'
return versionTag.indexOf('v') === 0
? versionTag.substring(1) //strip off the leading 'v' if present
: versionTag;
}

/**
* @param {IDependency} dep
* @returns IPackageDescriptor
*/
export function dependencyToPackageDescriptor(dep: IDependency): IPackageDescriptor
{
let packageDescriptor: IPackageDescriptor = {
name : dep.name,
definedVersion : extractVersionFromUrl(dep.version),
parsedDefinedVersion : parseVersion(dep.version),
installedVersion : null,
installed : false,
locked : semver.clean(extractVersionFromUrl(dep.version)) !== null
};

return packageDescriptor;
};
export const dependencyToPackageDescriptor = (dep: IDependency): IPackageDescriptor => {
const b = ({
name: dep.name,
definedVersion: extractVersionFromUrl(dep.version),
parsedDefinedVersion: parseVersion(dep.version),
installedVersion: null,
installed: false,
locked: semver.clean(extractVersionFromUrl(dep.version)) !== null
});

return b;
}

/**
* @param {IDependencyMap} depMap
* @returns IPackageDescriptorMap
*/
export function dependencyMapToPackageDescriptorMap(depMap: IDependencyMap): IPackageDescriptorMap
{
export const dependencyMapToPackageDescriptorMap = (depMap: IDependencyMap): IPackageDescriptorMap => {
let { deps, devDeps } = depMap;

let map: IPackageDescriptorMap = {
deps : deps.map(dependencyToPackageDescriptor),
devDeps : devDeps.map(dependencyToPackageDescriptor)
return {
deps: deps.map(dependencyToPackageDescriptor),
devDeps: devDeps.map(dependencyToPackageDescriptor)
};

return map;
};

/**
* @param {IPackageDescriptor} descriptor
* @param {string} modulesPath
* @returns IPackageDescriptor
*/
export function packageDescriptorCheckInstall(descriptor: IPackageDescriptor,
modulesPath: string): IPackageDescriptor
{
export const packageDescriptorCheckInstall = (
descriptor: IPackageDescriptor,
modulesPath: string
): IPackageDescriptor => {
const packagePath = path.resolve(modulesPath, descriptor.name, 'package.json');
const installed = fileExists(packagePath);
const installed = fileExists(packagePath);

if (!installed) {
return descriptor;
}

const pkg = require(packagePath);
descriptor.installed = true;
descriptor.installed = true;
descriptor.installedVersion = pkg.version;

return descriptor;
Expand All @@ -130,25 +134,38 @@ export function packageDescriptorCheckInstall(descriptor: IPackageDescriptor,
* @param {string} modulesPath
* @returns IPackageDescriptorMap
*/
export function packageDescriptorMapCheckInstall(map: IPackageDescriptorMap,
modulesPath: string): IPackageDescriptorMap
{
export const packageDescriptorMapCheckInstall = (
map: IPackageDescriptorMap,
modulesPath: string
): IPackageDescriptorMap => {
let { deps, devDeps } = map;

let newMap: IPackageDescriptorMap = {
deps : deps.map(m => packageDescriptorCheckInstall(m, modulesPath)),
devDeps : devDeps.map(m => packageDescriptorCheckInstall(m, modulesPath)),
return {
deps: deps.map(m => packageDescriptorCheckInstall(m, modulesPath)),
devDeps: devDeps.map(m => packageDescriptorCheckInstall(m, modulesPath)),
};

return newMap;
};

/**
* @param {string} version
* @param {string} expected
* @returns boolean
*/
export function isMatchingVersion(version: string, expected: string): boolean
{
return version === expected;
};
export const isMatchingVersion = (version: string, expected: string): boolean =>
version === expected;

/**
* @param {string} version
* @returns string
*/
const extractNpmAliasVersion = (version: string): string => {
if (!npmAliasRegex.test(version)) {
return null;
}

const i = /^.*[~^].*$/.test(version)
? version.indexOf('~') > 0 ? version.indexOf('~') : version.indexOf('^')
: version.lastIndexOf('@');

return version.substring(i + 1);
}
16 changes: 7 additions & 9 deletions src/filesys.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,19 @@ import * as fs from 'fs';
* @param {string} path
* @returns boolean
*/
export function fileExists(path: string): boolean
{
return fs.existsSync(path);
};
export const fileExists = (path: string): boolean =>
fs.existsSync(path);

/**
* @param {string} path
* @returns boolean
*/
export function folderExists(path: string): boolean
{
export const folderExists = (path: string): boolean => {
try {
return fs.lstatSync(path)
.isDirectory();
return fs
.lstatSync(path)
.isDirectory();
} catch(e) {
return false;
}
};
};
Loading

0 comments on commit afd0c89

Please sign in to comment.