Last active
May 28, 2024 10:33
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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