From 0a005eb0544ef2fc4e7a3c9e021753f044f0ddc6 Mon Sep 17 00:00:00 2001 From: DC Date: Tue, 3 May 2016 00:08:53 -0700 Subject: [PATCH] Check for missing or unused dependencies --- bin/check-deps.js | 51 +++++++++++++++++++++++++++++++++++++++++++++++ bin/list-deps.sh | 10 ++++++++++ package.json | 3 +-- 3 files changed, 62 insertions(+), 2 deletions(-) create mode 100755 bin/check-deps.js create mode 100755 bin/list-deps.sh diff --git a/bin/check-deps.js b/bin/check-deps.js new file mode 100755 index 00000000..4b3f48ef --- /dev/null +++ b/bin/check-deps.js @@ -0,0 +1,51 @@ +#!/usr/bin/env node + +var fs = require('fs') +var cp = require('child_process') + +var BUILT_IN_DEPS = ['child_process', 'electron', 'fs', 'os', 'path', 'screen'] +var EXECUTABLE_DEPS = ['gh-release', 'standard'] + +main() + +// Scans our codebase and package.json for missing or unused dependencies +// Process returns 0 on success, prints a message and returns 1 on failure +function main () { + if (process.platform === 'win32') { + console.log('Sorry, check-deps only works on Mac and Linux') + return + } + + var jsDeps = findJSDeps() + var packageDeps = findPackageDeps() + + var missingDeps = jsDeps.filter((dep) => + packageDeps.indexOf(dep) < 0 && + BUILT_IN_DEPS.indexOf(dep) < 0) + var unusedDeps = packageDeps.filter((dep) => + jsDeps.indexOf(dep) < 0 && + EXECUTABLE_DEPS.indexOf(dep) < 0) + + if (missingDeps.length > 0) console.log('Missing package dependencies: ' + missingDeps) + if (unusedDeps.length > 0) console.log('Unused package dependencies: ' + unusedDeps) + + if (missingDeps.length + unusedDeps.length > 0) process.exit(1) + + console.log('Lookin good!') +} + +// Finds all dependencies, required, optional, or dev, in package.json +function findPackageDeps () { + var pkg = JSON.parse(fs.readFileSync('package.json', 'utf8')) + var requiredDeps = Object.keys(pkg.dependencies) + var devDeps = Object.keys(pkg.devDependencies) + var optionalDeps = Object.keys(pkg.optionalDependencies) + + return [].concat(requiredDeps, devDeps, optionalDeps) +} + +// Finds all dependencies required() in the code +function findJSDeps () { + var stdout = cp.execSync('./bin/list-deps.sh') + return stdout.toString().trim().split('\n') +} diff --git a/bin/list-deps.sh b/bin/list-deps.sh new file mode 100755 index 00000000..ac492cd4 --- /dev/null +++ b/bin/list-deps.sh @@ -0,0 +1,10 @@ +#!/bin/sh +# This is a truly heinous hack, but it works pretty nicely. +# Find all modules we're requiring---even conditional requires. + +grep "require('" *.js bin/ main/ renderer/ -R | + grep '.js:' | + sed "s/.*require('\([^'\/]*\).*/\1/" | + grep -v '^\.' | + sort | + uniq diff --git a/package.json b/package.json index 66f0dcdb..19350a77 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,6 @@ "prettier-bytes": "^1.0.1", "simple-get": "^2.0.0", "srt-to-vtt": "^1.1.1", - "upload-element": "^1.0.1", "virtual-dom": "^2.1.1", "webtorrent": "0.x", "winreg": "^1.1.1" @@ -75,7 +74,7 @@ "clean": "node ./bin/clean.js", "package": "node ./bin/package.js", "start": "electron .", - "test": "standard", + "test": "standard && ./bin/check-deps.js", "update-authors": "./bin/update-authors.sh" } }