You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

91 lines
1.9 KiB
Bash

#!/usr/bin/env bash
# ensure git is latest clean branch
# require npm user
# bump package version
# commit
# create tag
# push commit & tag
# publish
usage() {
echo ""
echo " Usage: bash $0 <major|minor|patch>"
}
print() {
echo "NPM RELEASE: $1"
}
run() {
local version=$1
# ensure git is ready, fetch before making comparisons
git fetch
local local_sha=$(git rev-parse @)
local remote_sha=$(git rev-parse @{u})
local base_sha=$(git merge-base @ @{u})
if [[ -n $(git status --porcelain) ]]; then
print "Commit or stash you changes before releasing"
exit 1
else
print "Working directory is clean"
fi
if [ $local_sha = $remote_sha ]; then
print "Local branch is up-to-date."
elif [ $local_sha = $base_sha ]; then
print "You need to pull changes before you can release."
exit 1
elif [ $remote_sha = $base_sha ]; then
print "You need to push changes before you can release."
exit 1
else
print "Your branch has diverged from the remote, you cannot release."
exit 1
fi
# ensure npm is ready
local npm_user=$(npm whoami)
local is_collaborator=$(npm access ls-collaborators | grep ".*$npm_user.*:.*write.*")
local is_owner=$(npm owner ls | grep ".*$npm_user <.*")
if ! [[ "$npm_user" ]]; then
print "You must be logged in to NPM to publish, run \"npm login\" first."
exit 1
fi
if [[ -z "$is_collaborator" ]] && [[ -z "$is_owner" ]]; then
print "$npm_user is not an NPM owner or collaborator. Request access from:"
npm owner ls
exit 1
fi
# all checks out, publish
print "Publishing new $version version as $npm_user."
print "...npm version $version"
npm version ${version}
print "...git push"
git push
print "...git push --follow-tags"
git push --follow-tags
print "...npm publish"
npm publish
}
case $1 in
"major" | "minor" | "patch")
run $1
;;
*)
usage
exit 1
;;
esac