Skip to content

Instantly share code, notes, and snippets.

@fullkomnun
Last active May 28, 2024 10:33
Show Gist options
  • Save fullkomnun/002c0dd970cf086d7354f2c2bf72b476 to your computer and use it in GitHub Desktop.
Save fullkomnun/002c0dd970cf086d7354f2c2bf72b476 to your computer and use it in GitHub Desktop.
A universal JS package manager API and aliases, detects and supports npm, yarn berry (2+) and pnpm
#!/usr/bin/env sh
find_up() {
path=$(pwd)
while [ "$path" != "" ]; do
if [ -f "$path/$1" ]; then
echo "$path/$1"
return 0
elif [ -d "$path/.git" ] || [ -f "$path/pnpm-workspace.yaml" ]; then # stop at Git root or pnpm workspace root
break
fi
path=${path%/*} # get 'dirname'
done
return 1
}
detect_package_manager() {
json_file=$(find_up "package.json")
json_pkg_manager=""
if [ -n "$json_file" ]; then
json_pkg_manager=$(get_package_manager_from_json "$json_file")
fi
if [ -n "$json_pkg_manager" ]; then
echo "$json_pkg_manager"
else
lock_file=$(find_up "pnpm-lock.yaml")
if [ -n "$lock_file" ]; then
echo "pnpm"
else
lock_file=$(find_up "yarn.lock")
if [ -n "$lock_file" ]; then
echo "yarn"
else
lock_file=$(find_up "package-lock.json")
if [ -n "$lock_file" ]; then
echo "npm"
else
echo "npm" # default to npm if no lock file found
fi
fi
fi
fi
}
get_package_manager_from_json() {
if [ -f "$1" ]; then
# Extracts the value of the packageManager field
pkg_manager=$(jq -r '.packageManager // empty' "$1")
if [ -n "$pkg_manager" ]; then
# Removes the version part, if present
echo "$pkg_manager" | sed 's/@.*//'
fi
fi
}
unalias unpm 2>/dev/null
unpm() {
cmd=$1
shift
case $(detect_package_manager) in
yarn)
case $cmd in
which) echo "yarn" && yarn --version ;;
install|i|in|ins|inst|insta|isnt|isnta|isntal|isntall) yarn install "$@";;
install-frozen|if|install-immutable|ii) yarn install --immutable "$@";;
ci|clean-install|ic|install-clean|isntall-clean) rm -rf node_modules && yarn install --immutable;;
run-script|run|rum|urn) yarn run "$@" ;;
add) yarn add "$@" ;;
uninstall|remove|rm|r|un) yarn remove "$@" ;;
update|up|upgrade|udpate)
if [ $# -eq 0 ]; then
yarn up '*'
else
yarn up "$@"
fi
;;
ls|list) echo "Command not supported" ;;
why) yarn why "$@" ;;
audit) yarn npm audit "$@" ;;
outdated) echo "Command not supported" ;;
test) yarn test "$@" ;;
start) yarn start "$@" ;;
cache-clean) yarn cache clean ;;
pack) yarn pack "$@" ;;
*) echo "Command not supported" ;;
esac
;;
pnpm)
case $cmd in
which) echo "pnpm" && pnpm --version ;;
install|i|in|ins|inst|insta|isnt|isnta|isntal|isntall) pnpm install "$@";;
install-frozen|if|install-immutable|ii) pnpm install --frozen-lockfile "$@";;
ci|clean-install|ic|install-clean|isntall-clean) rm -rf node_modules && pnpm install --frozen-lockfile;;
run-script|run|rum|urn) pnpm run "$@" ;;
add) pnpm add "$@" ;;
uninstall|remove|rm|r|un) pnpm remove "$@" ;;
update|up|upgrade|udpate) pnpm update "$@" ;;
ls|list) pnpm list "$@" ;;
why) pnpm why "$@" ;;
audit) pnpm audit "$@" ;;
outdated) pnpm outdated "$@" ;;
test) pnpm test "$@" ;;
start) pnpm start "$@" ;;
cache-clean) pnpm store prune ;;
pack) pnpm pack "$@" ;;
*) echo "Command not supported" ;;
esac
;;
npm)
case $cmd in
which) echo "npm" && npm --version ;;
install|i|in|ins|inst|insta|isnt|isnta|isntal|isntall) npm i --install-links "$@" && npm run postinstall --if-present && npm run prepare --if-present ;;
# '--no-save' will not change lock file but will not verify that it is synched
install-frozen|if|install-immutable|ii) npm i --install-links --no-save "$@" && npm run postinstall --if-present && npm run prepare --if-present ;;
ci|clean-install|ic|install-clean|isntall-clean) npm ci --install-links && npm run postinstall --if-present && npm run prepare --if-present ;;
run-script|run|rum|urn) npm run "$@" ;;
add) npm install "$@" ;;
uninstall|remove|rm|r|un) npm uninstall "$@" ;;
update|up|upgrade|udpate) npm update "$@" ;;
ls|list) npm list "$@" ;;
why) npm list why "$@" ;;
audit) npm audit "$@" ;;
outdated) npm outdated "$@" ;;
test) npm test "$@" ;;
start) npm start "$@" ;;
cache-clean) npm cache clean --force ;;
pack) npm pack "$@" ;;
*) echo "Command not supported" ;;
esac
;;
*)
echo "No package manager detected."
;;
esac
}
unalias npi 2>/dev/null
npi() {
unpm install "$@"
}
unalias npii 2>/dev/null
npii() {
unpm install-immutable "$@"
}
unalias npif 2>/dev/null
npif() {
unpm install-frozen "$@"
}
unalias npci 2>/dev/null
alias npci="unpm ci"
unalias npr 2>/dev/null
npr() {
unpm run "$@"
}
unalias npa 2>/dev/null
npa() {
unpm add "$@"
}
unalias npad 2>/dev/null
npad() {
unpm add -D "$@"
}
unalias nprm 2>/dev/null
nprm() {
unpm remove "$@"
}
unalias npun 2>/dev/null
npun() {
unpm uninstall "$@"
}
unalias npu 2>/dev/null
npu() {
unpm update "$@"
}
unalias npl 2>/dev/null
npl() {
unpm list "$@"
}
unalias npy 2>/dev/null
npy() {
unpm why "$@"
}
unalias npau 2>/dev/null
npau() {
unpm audit "$@"
}
unalias npout 2>/dev/null
npout() {
unpm outdated "$@"
}
unalias npb 2>/dev/null
npb() {
unpm run build "$@"
}
unalias npt 2>/dev/null
npt() {
unpm test "$@"
}
unalias nps 2>/dev/null
nps() {
unpm start "$@"
}
unalias npcc 2>/dev/null
npcc() {
unpm cache-clean "$@"
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment