Skip to content

Instantly share code, notes, and snippets.

@neophob
Created October 25, 2018 20:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save neophob/e63b672ffb7d6ce8421a974aa76fa298 to your computer and use it in GitHub Desktop.
Save neophob/e63b672ffb7d6ce8421a974aa76fa298 to your computer and use it in GitHub Desktop.
npm prune
#!/usr/bin/env bash
# Port of https://github.com/tj/node-prune to bash
# Also,
# - fixed "*.ts" being overzealous and killing .d.ts files
# - added some more file types from https://github.com/npm/npm/issues/5264#issuecomment-259800486
#
# See also:
# - https://github.com/timoxley/cruft
# - https://yarnpkg.com/en/docs/cli/autoclean
# - https://github.com/ModClean/modclean
#
# Prunes common files that are unnecessarily published in npm packages
# when people don't configure `.npmignore` or package.json's `files`
#
set -e
if test "$#" -ne 1; then
echo "ERROR: Missing target dir! Usage: $0 [PATH-to-root-directory-that-contains-node_modules]"
exit 1
fi
SOURCE=$1
pushd $1
NODE_MODULES_DIR=node_modules
echo "current directory "$(pwd)
echo "NODE MODULES CLEANER $NODE_MODULES_DIR"
echo "Before: "$(du -hs $NODE_MODULES_DIR)
echo "Files: "$(find $NODE_MODULES_DIR/ -type f | wc -l)
# Remove common unneeded files
# "-type d" -> directory
#
find . -type d -name $NODE_MODULES_DIR -prune -exec find {} -type f \( \
-iname Makefile -or \
-iname README -or \
-iname README.md -or \
-iname README.md~ -or \
-iname README.markdown -or \
-iname CHANGELOG -or \
-iname CHANGELOG.md -or \
-name CHANGES -or \
-name COPYING -or \
-name NEWS -or \
-name CHANGES.md -or \
-iname RELEASING.txt -or \
-iname history -or \
-iname history.md -or \
-name .editorconfig -or \
-name .gitmodules -or \
-name .gitattributes -or \
-name .gitignore -or \
-name .gitkeep -or \
-name robot.html -or \
-name .lint -or \
-iname Gulpfile.js -or \
-iname Gruntfile.js -or \
-iname BUILD.bazel -or \
-iname Cakefile -or \
-name .tern-project -or \
-name .uglifyjsrc.json -or \
-name .editorconfig -or \
-name eslint -or \
-name .eslintrc -or \
-name .eslintrc.js -or \
-name .eslintrc.json -or \
-name .eslintrc.yml -or \
-name .eslintignore -or \
-name .stylelitrc -or \
-name tsconfig.json -or \
-name stylelint.config.js -or \
-name .htmllintrc -or \
-name .gitlab-ci.yml -or \
-name _config.yml -or \
-name .wotanrc.yaml -or \
-name .jshintrc -or \
-name .jshintignore -or \
-name .npmignore -or \
-name .flowconfig -or \
-name .coveralls.yml -or \
-name .istanbul.yml -or \
-name appveyor.yml -or \
-name .idea -or \
-name .jscsrc -or \
-name jest.config -or \
-name yo-rc.json -or \
-name .documentup.json -or \
-name .yarn-metadata.json -or \
-name .travis.yml -or \
-name .zuul.yml -or \
-name .codeclimate.yml -or \
-name thumbs.db -or \
-name .tern-port -or \
-name wercker.yml -or \
-iname .ds_store -or \
-name desktop.ini -or \
-name npm-debug.log -or \
-name .npmrc -or \
-name .jscsrc -or \
-name .jscs.json -or \
-name .nvmrc -or \
-name webpack.config.js -or \
-name karma.conf.js -or \
-name mocha.opts -or \
-iname dockerfile -or \
-iname CopyrightNotice.txt -or \
-iname LICENSE.txt -or \
-iname LICENSE.md -or \
-iname LICENSE-MIT -or \
-iname MIT-LICENSE.txt -or \
-iname LICENSE.MIT -or \
-iname LICENSE-MIT.txt -or \
-iname LICENSE.APACHE2 -or \
-iname LICENSE.BSD -or \
-iname LICENSE-BSD -or \
-iname LICENSE.DOCS -or \
-iname LICENSE-jsbn -or \
-iname LICENSE -or \
-iname LICENCE -or \
-iname LICENCE.txt -or \
-iname PATENTS -or \
-iname AUTHORS -or \
-iname CONTRIBUTORS -or \
-name .yarn-integrity -or \
-name .yarnclean -or \
-name yarn-error.log -or \
-name .babelrc -or \
-name builderror.log -or \
-name bower.json -or \
-name yarn.lock -or \
-name "*.map" -or \
-name "*.mkd" -or \
-name "*.md" -or \
-name "*.md~" -or \
-name "*.md.bak" -or \
-name "*.js.map" -or \
-name "*appveyor.yml" -or \
-name "uws_darwin_*.node" -or \
-name "uws_win32_*.node" -or \
-name "build_log.txt" -or \
-name "LayoutEngineTest.cs" -or \
-name "uws_linux_46.node" -or \
-name "uws_linux_47.node" -or \
-name "uws_linux_48.node" -or \
-name "uws_linux_51.node" -or \
-name "*.sln" -or \
-name "*.obj" -or \
-name "*.jar" -or \
-name "*.java" -or \
-name "*.xlsx" -or \
-name "*.csproj" -or \
-name "*.patch" -or \
-name "lorem_1mb.txt" -or \
-name "*.h" -or \
-name "*.c" -or \
-name "*.cc" -or \
-name "*.cpp" -or \
-name "*.hpp" -or \
-name "*.o.d" -or \
-name "*.gypi" -or \
-name "*.vcxproj" -or \
-name "*.vcxproj.filters" -or \
\( -name '*.ts' -and \! -name '*.d.ts' \) -or \
-name "*.jst" -or \
-name "*.coffee" \
\) -print0 \; | xargs -0 rm -rf
# Common unneeded directories
# some project need node-pre-gyp, dont remove them! https://github.com/AlCalzone/node-aead-crypto/issues/7
# -name node-pre-gyp -or \
find . -type d -name $NODE_MODULES_DIR -prune -exec find {} -type d \( \
-name __tests__ -or \
-name test -or \
-name tests -or \
-name powered-test -or \
-name docs -or \
-name doc -or \
-name website -or \
-name assets -or \
-name example -or \
-name examples -or \
-name coverage -or \
-name node-gyp -or \
-name gyp -or \
-name nyc_output -or \
-name .nyc_output -or \
-name .circleci -or \
-name .github -or \
-name .idea -or \
-name .vscode \
\) -print0 \; | xargs -0 rm -rf
echo "50 largest files in node_modules"
find $NODE_MODULES_DIR -type f -printf "%s\t%p\n" | sort -n | tail -50
echo "After: "$(du -hs $NODE_MODULES_DIR)
echo "Files: "$(find $NODE_MODULES_DIR/ -type f | wc -l)
popd
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment