91 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
		
		
			
		
	
	
			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 |