From e871106b54a5607812172595f39e0e0a04f7e867 Mon Sep 17 00:00:00 2001 From: Michael Gokhman Date: Sun, 12 Aug 2018 10:23:41 +0300 Subject: [PATCH 1/4] chore: fix tslint.json as it contained eslint rules tried to replace the once that have a similar rule in tslint, removed others --- package.json | 11 ++++++++--- tslint.json | 30 ++++++------------------------ 2 files changed, 14 insertions(+), 27 deletions(-) diff --git a/package.json b/package.json index eb73301e..b9eaf601 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "scripts": { "test": "npm run lint && npm run unit-test", "unit-test": "tap test/lib -R=spec --timeout=300 --node-path ts-node --test-file-pattern '/\\.[tj]s$/'", - "lint": "tslint lib/**/*.ts", + "lint": "tslint -p tsconfig.json", "build": "tsc", "build-watch": "tsc -w", "prepare": "npm run build", @@ -21,8 +21,13 @@ }, "author": "snyk.io", "license": "Apache-2.0", - "engines": { "node" : ">=4" }, - "files": ["bin", "dist"], + "engines": { + "node": ">=4" + }, + "files": [ + "bin", + "dist" + ], "homepage": "https://github.com/snyk/nodejs-lockfile-parser#readme", "dependencies": { "lodash": "4.17.10", diff --git a/tslint.json b/tslint.json index 07a14b46..f67e7c75 100644 --- a/tslint.json +++ b/tslint.json @@ -4,31 +4,13 @@ "max-line-length": { "options": [120] }, - "array-bracket-spacing": [2, "never"], - "comma-dangle": ["error", "always-multiline"], - "computed-property-spacing": [2, "never"], - "curly": 2, - "eqeqeq": [2, "smart"], - "indent": [ - 2, - 2, - { - "SwitchCase": 1 - } - ], - "max-depth": [1, 3], - "max-len": [1, 80], - "max-statements": [1, 15], - "no-use-before-define": [2, "nofunc"], - "object-curly-spacing": [2, "never"], + "trailing-comma": [true, {"multiline": "always"}], + "triple-equals": true, + "curly": true, + "indent": [true, "spaces", 2], + "no-use-before-declare": true, "ordered-imports": false, "quotemark": [true, "single", "avoid-escape", "avoid-template"], - "semi": [2, "always"], - "keyword-spacing": [2, {"before": true, "after": true}] - }, - "jsRules": { - "max-line-length": { - "options": [120] - } + "semicolon": [true, "always"] } } From 7901d48cea6b918e5c0f917401f57f9555ae1035 Mon Sep 17 00:00:00 2001 From: Michael Gokhman Date: Sun, 12 Aug 2018 10:30:49 +0300 Subject: [PATCH 2/4] chore: group exports - as exported & internal function were mixed --- lib/index.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/index.ts b/lib/index.ts index fa4d892b..14f7226b 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -3,7 +3,12 @@ import * as fs from 'fs'; import * as path from 'path'; import * as _ from 'lodash'; -export async function buildDepTree(targetFileRaw, lockFileRaw, options) { +export { + buildDepTree, + buildDepTreeFromFiles, +}; + +async function buildDepTree(targetFileRaw, lockFileRaw, options) { const lockFile = JSON.parse(lockFileRaw); const targetFile = JSON.parse(targetFileRaw); @@ -74,7 +79,7 @@ function getDepPath(depKeys: string[]) { return depPath; } -export function buildDepTreeFromFiles(root, targetFilePath, lockFilePath, options) { +function buildDepTreeFromFiles(root, targetFilePath, lockFilePath, options) { if (!root || !lockFilePath || !lockFilePath) { throw new Error('Missing required parameters for parseLockFile()'); } From b1cb4d4469df0e5af3db0c1def6b2e60b05c030c Mon Sep 17 00:00:00 2001 From: Michael Gokhman Date: Sun, 12 Aug 2018 10:34:53 +0300 Subject: [PATCH 3/4] chore: cleanup unused params and pkgs --- lib/index.ts | 6 +-- package-lock.json | 101 ---------------------------------------------- package.json | 2 - test/lib/index.ts | 3 -- 4 files changed, 3 insertions(+), 109 deletions(-) diff --git a/lib/index.ts b/lib/index.ts index 14f7226b..238d3998 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -8,7 +8,7 @@ export { buildDepTreeFromFiles, }; -async function buildDepTree(targetFileRaw, lockFileRaw, options) { +async function buildDepTree(targetFileRaw, lockFileRaw) { const lockFile = JSON.parse(lockFileRaw); const targetFile = JSON.parse(targetFileRaw); @@ -79,7 +79,7 @@ function getDepPath(depKeys: string[]) { return depPath; } -function buildDepTreeFromFiles(root, targetFilePath, lockFilePath, options) { +function buildDepTreeFromFiles(root, targetFilePath, lockFilePath) { if (!root || !lockFilePath || !lockFilePath) { throw new Error('Missing required parameters for parseLockFile()'); } @@ -97,5 +97,5 @@ function buildDepTreeFromFiles(root, targetFilePath, lockFilePath, options) { const targetFile = fs.readFileSync(targetFileFullPath); const lockFile = fs.readFileSync(lockFileFullPath); - return buildDepTree(targetFile, lockFile, options); + return buildDepTree(targetFile, lockFile); } diff --git a/package-lock.json b/package-lock.json index af59469c..d3e99f54 100644 --- a/package-lock.json +++ b/package-lock.json @@ -176,33 +176,12 @@ } } }, - "@sinonjs/formatio": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz", - "integrity": "sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg==", - "dev": true, - "requires": { - "samsam": "1.3.0" - } - }, - "@sinonjs/samsam": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-2.0.0.tgz", - "integrity": "sha512-D7VxhADdZbDJ0HjUTMnSQ5xIGb4H2yWpg8k9Sf1T08zfFiQYlaxM8LZydpR4FQ2E6LZJX8IlabNZ5io4vdChwg==", - "dev": true - }, "@types/node": { "version": "10.5.5", "resolved": "https://registry.npmjs.org/@types/node/-/node-10.5.5.tgz", "integrity": "sha512-6Qnb1gXbp3g1JX9QVJj3A6ORzc9XCyhokxUKaoonHgNXcQhmk8adhotxfkeK8El9TnFeUuH72yI6jQ5nDJKS6w==", "dev": true }, - "@types/sinon": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-5.0.1.tgz", - "integrity": "sha512-yxzBCIjE3lp9lYjfBbIK/LRCoXgCLLbIIBIje7eNCcUIIR2CZZtyX5uto2hVoMSMqLrsRrT6mwwUEd0yFgOwpA==", - "dev": true - }, "JSONStream": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.3.tgz", @@ -2043,12 +2022,6 @@ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -2159,12 +2132,6 @@ "verror": "1.10.0" } }, - "just-extend": { - "version": "1.1.27", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-1.1.27.tgz", - "integrity": "sha512-mJVp13Ix6gFo3SBAy9U/kL+oeZqzlYYYLQBwXVBlVzIsZwBqGREnOro24oC/8s8aox+rJhtZ2DiQof++IrkA+g==", - "dev": true - }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", @@ -2249,12 +2216,6 @@ "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=", "dev": true }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true - }, "lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", @@ -2279,12 +2240,6 @@ "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", "dev": true }, - "lolex": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.7.1.tgz", - "integrity": "sha512-Oo2Si3RMKV3+lV5MsSWplDQFoTClz/24S0MMHYcgGWWmFXr6TMlqcqk/l1GtH+d5wLBwNRiqGnwDRMirtFalJw==", - "dev": true - }, "longest": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", @@ -2594,19 +2549,6 @@ "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==", "dev": true }, - "nise": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/nise/-/nise-1.4.2.tgz", - "integrity": "sha512-BxH/DxoQYYdhKgVAfqVy4pzXRZELHOIewzoesxpjYvpU+7YOalQhGNPf7wAx8pLrTNPrHRDlLOkAl8UI0ZpXjw==", - "dev": true, - "requires": { - "@sinonjs/formatio": "^2.0.0", - "just-extend": "^1.1.27", - "lolex": "^2.3.2", - "path-to-regexp": "^1.7.0", - "text-encoding": "^0.6.4" - } - }, "node-emoji": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.8.1.tgz", @@ -5587,15 +5529,6 @@ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", "dev": true }, - "path-to-regexp": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", - "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", - "dev": true, - "requires": { - "isarray": "0.0.1" - } - }, "path-type": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", @@ -5929,12 +5862,6 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, - "samsam": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz", - "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==", - "dev": true - }, "semantic-release": { "version": "15.9.3", "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-15.9.3.tgz", @@ -6054,22 +5981,6 @@ "pkg-conf": "^2.1.0" } }, - "sinon": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-6.1.4.tgz", - "integrity": "sha512-NFEts+4D4jp2sBjL94fQpZk5o73kzn/g58+I9Dp15i9vsnT4Lk1UEyUf2jACODWLG6Pz/llF0sArYUw47Aarmg==", - "dev": true, - "requires": { - "@sinonjs/formatio": "^2.0.0", - "@sinonjs/samsam": "^2.0.0", - "diff": "^3.5.0", - "lodash.get": "^4.4.2", - "lolex": "^2.7.1", - "nise": "^1.4.2", - "supports-color": "^5.4.0", - "type-detect": "^4.0.8" - } - }, "slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", @@ -6508,12 +6419,6 @@ "minipass": "^2.2.0" } }, - "text-encoding": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz", - "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=", - "dev": true - }, "text-extensions": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.7.0.tgz", @@ -6690,12 +6595,6 @@ "dev": true, "optional": true }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, "typescript": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.0.1.tgz", diff --git a/package.json b/package.json index b9eaf601..41fc58ef 100644 --- a/package.json +++ b/package.json @@ -36,8 +36,6 @@ }, "devDependencies": { "@types/node": "10.5.5", - "@types/sinon": "5.0.1", - "sinon": "6.1.4", "tap": "github:snyk/node-tap#alternative-runtimes", "ts-node": "7.0.0", "tslint": "5.11.0", diff --git a/test/lib/index.ts b/test/lib/index.ts index 83029caa..e1113e74 100644 --- a/test/lib/index.ts +++ b/test/lib/index.ts @@ -4,7 +4,6 @@ // tslint:disable:max-line-length // tslint:disable:object-literal-key-quotes import {test} from 'tap'; -import * as sinon from 'sinon'; import {buildDepTreeFromFiles} from '../../lib'; import * as fs from 'fs'; @@ -18,7 +17,6 @@ test('Parse npm package-lock.json', async (t) => { `${__dirname}/fixtures/goof/`, 'package.json', 'package-lock.json', - null, ); t.deepEqual(depTree, JSON.parse(expectedDepTree), 'Tree generated as expected'); @@ -29,6 +27,5 @@ test('Parse npm package-lock.json with missing dependency', async (t) => { `${__dirname}/fixtures/goof/`, 'package.json', 'package-lock_missing_dep.json', - null, ), null, 'Error is thrown'); }); From 4e08bcbdf8836229e03841cb5ae1d9cd2cc9a739 Mon Sep 17 00:00:00 2001 From: Michael Gokhman Date: Sun, 12 Aug 2018 11:39:41 +0300 Subject: [PATCH 4/4] chore: add more types --- lib/index.ts | 28 ++++++++++++++++++---------- package-lock.json | 6 ++++++ package.json | 5 +++-- tslint.json | 1 + 4 files changed, 28 insertions(+), 12 deletions(-) diff --git a/lib/index.ts b/lib/index.ts index 238d3998..9146c325 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -8,7 +8,15 @@ export { buildDepTreeFromFiles, }; -async function buildDepTree(targetFileRaw, lockFileRaw) { +interface PkgTree { + name: string; + version: string; + dependencies?: { + [dep: string]: PkgTree; + }; +} + +async function buildDepTree(targetFileRaw: string, lockFileRaw: string): Promise { const lockFile = JSON.parse(lockFileRaw); const targetFile = JSON.parse(targetFileRaw); @@ -20,10 +28,10 @@ async function buildDepTree(targetFileRaw, lockFileRaw) { throw new Error("No 'dependencies' property in package-lock.json"); } - const depTree = { + const depTree: PkgTree = { dependencies: {}, - name: targetFile.name || undefined, - version: targetFile.version || undefined, + name: targetFile.name, + version: targetFile.version, }; const topLevelDeps = Object.keys(targetFile.dependencies); @@ -35,9 +43,9 @@ async function buildDepTree(targetFileRaw, lockFileRaw) { return depTree; } -async function buildSubTreeRecursive(dep: string, depKeys: string[], lockFile: object) { +async function buildSubTreeRecursive(dep: string, depKeys: string[], lockFile: object): Promise { - const depSubTree = { + const depSubTree: PkgTree = { dependencies: {}, name: dep, version: undefined, @@ -79,7 +87,7 @@ function getDepPath(depKeys: string[]) { return depPath; } -function buildDepTreeFromFiles(root, targetFilePath, lockFilePath) { +async function buildDepTreeFromFiles(root: string, targetFilePath: string, lockFilePath: string): Promise { if (!root || !lockFilePath || !lockFilePath) { throw new Error('Missing required parameters for parseLockFile()'); } @@ -94,8 +102,8 @@ function buildDepTreeFromFiles(root, targetFilePath, lockFilePath) { throw new Error(`LockFile package-lock.json not found at location: ${lockFileFullPath}`); } - const targetFile = fs.readFileSync(targetFileFullPath); - const lockFile = fs.readFileSync(lockFileFullPath); + const targetFile = fs.readFileSync(targetFileFullPath, 'utf-8'); + const lockFile = fs.readFileSync(lockFileFullPath, 'utf-8'); - return buildDepTree(targetFile, lockFile); + return await buildDepTree(targetFile, lockFile); } diff --git a/package-lock.json b/package-lock.json index d3e99f54..bcb2fa8f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -176,6 +176,12 @@ } } }, + "@types/lodash": { + "version": "4.14.116", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.116.tgz", + "integrity": "sha512-lRnAtKnxMXcYYXqOiotTmJd74uawNWuPnsnPrrO7HiFuE3npE2iQhfABatbYDyxTNqZNuXzcKGhw37R7RjBFLg==", + "dev": true + }, "@types/node": { "version": "10.5.5", "resolved": "https://registry.npmjs.org/@types/node/-/node-10.5.5.tgz", diff --git a/package.json b/package.json index 41fc58ef..12f83467 100644 --- a/package.json +++ b/package.json @@ -35,11 +35,12 @@ "source-map-support": "^0.5.7" }, "devDependencies": { + "@types/lodash": "^4.14.116", "@types/node": "10.5.5", + "semantic-release": "^15.9.3", "tap": "github:snyk/node-tap#alternative-runtimes", "ts-node": "7.0.0", "tslint": "5.11.0", - "typescript": "3.0.1", - "semantic-release": "^15.9.3" + "typescript": "3.0.1" } } diff --git a/tslint.json b/tslint.json index f67e7c75..e26a8da2 100644 --- a/tslint.json +++ b/tslint.json @@ -8,6 +8,7 @@ "triple-equals": true, "curly": true, "indent": [true, "spaces", 2], + "interface-name": false, "no-use-before-declare": true, "ordered-imports": false, "quotemark": [true, "single", "avoid-escape", "avoid-template"],