Skip to content

Commit

Permalink
Merge pull request #15 from snyk/feat/support-dev-dependencies
Browse files Browse the repository at this point in the history
feat: add support for different type of dependencies
  • Loading branch information
miiila authored Aug 16, 2018
2 parents 8135695 + 355f3fb commit 17a580b
Show file tree
Hide file tree
Showing 7 changed files with 12,427 additions and 8 deletions.
34 changes: 27 additions & 7 deletions lib/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,29 @@ import * as fs from 'fs';
import * as path from 'path';
import * as _ from 'lodash';

export {
buildDepTree,
buildDepTreeFromFiles,
};
enum DepType {
prod = 'prod',
dev = 'dev',
}

interface PkgTree {
name: string;
version: string;
dependencies?: {
[dep: string]: PkgTree;
};
depType?: DepType;
hasDevDependencies?: boolean;
}

async function buildDepTree(targetFileRaw: string, lockFileRaw: string): Promise<PkgTree> {
export {
buildDepTree,
buildDepTreeFromFiles,
PkgTree,
DepType,
};

async function buildDepTree(targetFileRaw: string, lockFileRaw: string, includeDev = false): Promise<PkgTree> {

const lockFile = JSON.parse(lockFileRaw);
const targetFile = JSON.parse(targetFileRaw);
Expand All @@ -30,6 +39,7 @@ async function buildDepTree(targetFileRaw: string, lockFileRaw: string): Promise

const depTree: PkgTree = {
dependencies: {},
hasDevDependencies: !!targetFile.devDependencies && Object.keys(targetFile.devDependencies).length > 0,
name: targetFile.name,
version: targetFile.version,
};
Expand All @@ -40,12 +50,20 @@ async function buildDepTree(targetFileRaw: string, lockFileRaw: string): Promise
depTree.dependencies[dep] = await buildSubTreeRecursive(dep, [], lockFile);
}));

if (includeDev && targetFile.devDependencies) {
const topLevelDevDeps = Object.keys(targetFile.devDependencies);
await Promise.all(topLevelDevDeps.map(async (dep) => {
depTree.dependencies[dep] = await buildSubTreeRecursive(dep, [], lockFile);
}));
}

return depTree;
}

async function buildSubTreeRecursive(dep: string, depKeys: string[], lockFile: object): Promise<PkgTree> {

const depSubTree: PkgTree = {
depType: undefined,
dependencies: {},
name: dep,
version: undefined,
Expand All @@ -61,6 +79,7 @@ async function buildSubTreeRecursive(dep: string, depKeys: string[], lockFile: o
if (deps && deps[dep]) {
// update the tree
depSubTree.version = deps[dep].version;
depSubTree.depType = deps[dep].dev ? DepType.dev : DepType.prod;
// repeat the process for dependencies of looked-up dep
const newDeps = deps[dep].requires ? Object.keys(deps[dep].requires) : [];
await Promise.all(newDeps.map(async (subDep) => {
Expand All @@ -87,7 +106,8 @@ function getDepPath(depKeys: string[]) {
return depPath;
}

async function buildDepTreeFromFiles(root: string, targetFilePath: string, lockFilePath: string): Promise<PkgTree> {
async function buildDepTreeFromFiles(
root: string, targetFilePath: string, lockFilePath: string, includeDev = false): Promise<PkgTree> {
if (!root || !lockFilePath || !lockFilePath) {
throw new Error('Missing required parameters for parseLockFile()');
}
Expand All @@ -105,5 +125,5 @@ async function buildDepTreeFromFiles(root: string, targetFilePath: string, lockF
const targetFile = fs.readFileSync(targetFileFullPath, 'utf-8');
const lockFile = fs.readFileSync(lockFileFullPath, 'utf-8');

return await buildDepTree(targetFile, lockFile);
return await buildDepTree(targetFile, lockFile, includeDev);
}
13 changes: 13 additions & 0 deletions test/lib/fixtures/empty-dev-deps/package-lock.json

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

22 changes: 22 additions & 0 deletions test/lib/fixtures/empty-dev-deps/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{
"name": "goof",
"version": "0.0.3",
"description": "A vulnerable todo demo application",
"homepage": "https://snyk.io/",
"repository": {
"type": "git",
"url": "https://github.com/Snyk/snyk-todo-list-demo-app/"
},
"scripts": {
"start": "node app.js",
"build": "browserify -r jquery > public/js/bundle.js",
"cleanup": "mongo express-todo --eval 'db.todos.remove({});'"
},
"engines": {
"node": "6.14.1"
},
"dependencies": {
"adm-zip": "0.4.7"
},
"devDependencies": {}
}
Loading

0 comments on commit 17a580b

Please sign in to comment.