Files
server/nix/trimNodeModules.sh
2026-02-03 03:15:59 +01:00

167 lines
8.3 KiB
Bash
Executable File

# shellcheck shell=bash
# We don't care about CLI scripts:
echo "Removing CLI scripts..."
for f in ./node_modules/.bin/*; do
rm -f "$(realpath $f)" $f
done
find ./node_modules -type d -name '.bin' | while read -r dir; do
echo "Removing CLI scripts from $dir..."
for f in "$dir"/*; do
rm -f "$(realpath $f)" $f
done
done
# Unused stuff in specific packages
time (
echo -n "Removing unused module features: "
rm -rf ./node_modules/typeorm/browser && echo -n .
rm -rf ./node_modules/typeorm/cli && echo -n .
rm -rf ./node_modules/typeorm/driver/**/*.map && echo -n .
rm -rf ./node_modules/ajv/lib && echo -n .
# rm -rf ./node_modules/ajv/dist/refs && echo -n .
)
time (
echo -en "\nRemoving specific known large unneeded packages: "
rm -rf ./node_modules/typescript && echo -n .
rm -rf ./node_modules/@typescript/native-preview && echo -n .
rm -rf ./node_modules/@tsconfig && echo -n .
rm -rf ./node_modules/ts-node && echo -n .
rm -rf ./node_modules/node-gyp && echo -n .
rm -rf ./node_modules/node-gyp-build-optional-packages && echo -n .
rm -rf ./node_modules/discord-protos/{discord_protos,scripts} && echo -n .
rm -f ./node_modules/.package-lock.json && echo -n .
rm -rf ./node_modules/@jimp/plugin-print/fonts && echo -n . # duplicated in dist/fonts
rm -rf ./node_modules/@toondepauw/node-zstd-linux-x64-musl && echo -n .
for i in ./node_modules/@jimp/*; do
if [ -d "$i/dist/commonjs" ]; then
rm -rf "$i/dist/commonjs" && echo -n .
fi
if [ -d "$i/dist/browser" ]; then
rm -rf "$i/dist/browser" && echo -n .
fi
done
find ./node_modules -name '*.map' -type f -delete -printf .
)
# sources
time (
echo -en "\nRemoving source files: "
# typescript
echo -en "\n - Typescript: "
find ./node_modules -regextype posix-extended -iregex '.*\.(ts|mts|cts|d\.ts)$' -type f -delete -printf .
# C/C++
echo -en "\n - C/C++: "
find ./node_modules -regextype posix-extended -iregex '.*\.(c|cc|cpp|h|hh|hpp)$' -type f -delete -printf .
# rust
echo -en "\n - Rust: "
find ./node_modules -name '*.rs' -type f -delete -printf .
# coffeescript
echo -en "\n - Coffeescript: "
find ./node_modules -name '*.coffee' -type f -delete -printf .
)
# standard C/C++ build artifacts
time (
echo -en "\nRemoving build artifacts: "
find ./node_modules -regextype posix-extended -iregex '.*\.(o|a|d|obj)$' -type f -delete -printf .
)
# ???
time (
echo -en "\nRemoving other random build artifacts: "
# find ./node_modules -wholename '*build/Release/obj' -type d -exec rm -rfv {} +
# find ./node_modules -wholename '*build/Release/obj.target' -type d -exec rm -rfv {} +
find ./node_modules -iname 'obj' -type f -delete -printf .
find ./node_modules -iname 'obj.target' -type f -delete -printf .
find ./node_modules -iname '*.ar-file-list' -type f -delete -printf .
find ./node_modules -iname '*.stamp' -type f -delete -printf .
find ./node_modules -iname '*musl.node' -type f -delete -printf .
# rm -rf ./node_modules/typescript-json-schema
rm -rf ./node_modules/node-gyp && echo -n .
find ./node_modules -iname '@types' -type d -exec rm -rf {} + -printf .
)
time (
echo "Removing random common files..."
echo -en "\n - other: "
find ./node_modules -regextype posix-extended -iregex '.*(\.(github|idea|devcontainer)|tests?|docs?|examples?)$' -type d -exec rm -rf {} + -printf .
find ./node_modules -regextype posix-extended -iregex '.*(__image_snapshots__|__snapshots__|__tests__|__fixtures__)$' -type d -exec rm -rf {} + -printf .
find ./node_modules -name '.tshy' -type d -exec rm -rf {} + -printf .
echo -en "\n - scripts: "
find ./node_modules -regextype posix-extended -iregex '.*\.(sh|cmd|bat|makefile|mk)$' -type f -delete -printf .
find ./node_modules -iname 'makefile' -type f -delete -printf .
find ./node_modules -regextype posix-extended -iregex '.*\.(in|py)$' -type f -delete -printf .
echo -en "\n - package locks: "
find ./node_modules -regextype posix-extended -iregex '.*(yarn\.lock|deno-lock\.json|deno\.lock|deno\.jsonc)$' -type f -delete -printf .
echo -en "\n - ignore files: "
find ./node_modules -regextype posix-extended -iregex '.*\.(docker|git|npm|eslint|prettier)ignore$' -type f -delete -printf .
echo -en "\n - git metadata: "
find ./node_modules -regextype posix-extended -iregex '.*\.git(keep|attributes|modules)$' -type f -delete -printf .
find ./node_modules -regextype posix-extended -iregex '.*(codeowners|changelog)$' -type f -delete -printf .
echo -en "\n - README files: "
find ./node_modules -regextype posix-extended -iregex '.*readme(\.md|\.txt)?$' -type f -delete -printf .
find ./node_modules -iname 'readme' -type f -delete -printf .
echo -en "\n - RC files: "
find ./node_modules -regextype posix-extended -iregex '.*\.(babel|eslint|prettier|npm|nvm|swc|stylelint|mocha|jshint|nyc|yarn|ncurc)rc(\.(yml|json|(m|c)?js))?$' -type f -delete -printf .
echo -en "\n - image files: "
find ./node_modules -regextype posix-extended -iregex '.*\.(png|jpg|jpeg|gif|svg|ico|webp|bmp|tiff)$' -type f -delete -printf .
echo -en "\n - text files: "
find ./node_modules -regextype posix-extended -iregex '.*\.(txt|rst|log|md|markdown|hbs|bnf)$' -type f -delete -printf .
echo -en "\n - IDE/editor config/buffer files: "
find ./node_modules -regextype posix-extended -iregex '.*(\.(swp|swo|eslintcache)|~)$' -type f -delete -printf .
find ./node_modules -regextype posix-extended -iregex '.*\.(vscode|editorconfig|pre-commit-config\.yaml)$' -type f -delete -printf .
find ./node_modules -regextype posix-extended -iregex '.*\.(vscode|idea)$' -type d -exec rm -rf {} + -printf .
find ./node_modules -regextype posix-extended -iregex '.*\.jsdoc-conf\.json$' -type f -delete -printf .
find ./node_modules -iname '*.iml' -type f -delete -printf .
echo -en "\n - CI configuration files: "
find ./node_modules -regextype posix-extended -iregex '.*(travis|circleci|github|gitlab|airtap|appveyor|wercker|codeship|drone|semaphoreci|buildkite).*\.(yml|yaml)$' -type f -delete -printf .
find ./node_modules -regextype posix-extended -iregex '.*\.runkit_example\.js$' -type d -exec rm -rf {} + -printf .
find ./node_modules -regextype posix-extended -iregex '.*dockerfile.*' -type f -delete -printf .
echo -en "\n - TypeScript meta files: "
find ./node_modules -iname '*.tsbuildinfo' -type f -delete -printf .
find ./node_modules -iname 'tsconfig.json' -type f -delete -printf .
echo -en "\n - YAML/TOML/HTML/CSS files: "
find ./node_modules -regextype posix-extended -iregex '.*\.(html|yml|yaml|toml|css)$' -type f -delete -printf .
echo -en "\n - Non-normalised JS files (ie. umd/amd/...): "
find ./node_modules -regextype posix-extended -iregex '.*\.(amd|umd|browser|web)\.(cjs|mjs|js)$' -type f -delete -printf .
echo -en "\n - Test/spec JS files: "
find ./node_modules -regextype posix-extended -iregex '.*\.(test|spec)\.(m|c)?js$' -type f -delete -printf .
find ./node_modules -regextype posix-extended -iregex '.*\.(conf|config)\.(m|c)?js$' -type f -delete -printf .
)
if true; then
# Probably dont do this, lol, only saves ~1M anyways
# Purely for statistical purposes
echo -en "\nRemoving license files: "
find ./node_modules -iname 'LICENSE' -type f -delete -printf .
find ./node_modules -iname 'license.terms' -type f -delete -printf .
find ./node_modules -iname 'LICENSE.txt' -type f -delete -printf .
find ./node_modules -iname 'LICENSE.BSD' -type f -delete -printf .
find ./node_modules -iname 'LICENSE.MIT' -type f -delete -printf .
find ./node_modules -iname 'LICENSE.APACHE2' -type f -delete -printf .
find ./node_modules -iname 'LICENSE-MIT.txt' -type f -delete -printf .
find ./node_modules -iname 'LICENSE-MIT' -type f -delete -printf .
find ./node_modules -iname '*LICENSE*' -type f -delete -printf .
find ./node_modules -iname '*LICENCE*' -type f -delete -printf .
fi
time (
echo -en "\nReplacing all dotenv transitive dependencies with own version: "
find ./node_modules -regextype posix-extended -iregex '\./node_modules/.*/node_modules/dotenv' -type d | while read -r dir; do
echo -n .
echo "Replacing $dir"
rm -rf "$dir"
relpath=$(realpath --relative-to="$(dirname "$dir")" ./node_modules/dotenv)
ln -s "$relpath" "$dir"
done
)
echo -en "\nRemoving empty directories: "
find ./node_modules -maxdepth 10 -type d -empty -delete -printf .
echo -e "\nTrimming complete. Stats:"
du -sh ./{,.}* . 2>/dev/null | sort -h