├── .gitignore ├── .travis.yml ├── LICENSE ├── README.md ├── git-stack ├── images └── demo.png ├── package-lock.json ├── package.json └── script └── transfer.sh /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (https://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # TypeScript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | # next.js build output 61 | .next 62 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: false 2 | 3 | language: bash 4 | 5 | # Trigger Travis CI only when master branch is pushed, ignoring develop branch 6 | branches: 7 | only: 8 | - master 9 | 10 | script: 11 | - bash -c 'echo 'complete'' 12 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Hank Chan 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # git-stack    ![GitHub tag (latest SemVer)](https://img.shields.io/github/tag/hankchanocd/git-stack.svg) [![Build Status](https://travis-ci.org/hankchanocd/git-stack.svg?branch=master)](https://travis-ci.org/hankchanocd/git-stack) [![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/) [![Github issues](https://img.shields.io/github/issues/hankchanocd/git-stack.svg)](https://github.com/hankchanocd/git-stack/issues) [![CodeFactor](https://www.codefactor.io/repository/github/hankchanocd/git-stack/badge)](https://www.codefactor.io/repository/github/hankchanocd/git-stack) 2 | 3 | > Compare against master branch with fzf 4 | 5 |

6 | demo 7 |

8 | 9 | Have a quick glance at the differences between `develop` and `master` branch with `git stack`. 10 | 11 | ## Install 12 | 13 | Clone the repo, and run `npm run transfer` to transfer `./git-stack` to `~/bin`, or manually invoke `./script/transfer.sh` if you are not familiar with `npm`. 14 | 15 | If you have a more desired `PATH` for storing scripts, configure `./script/transfer.sh` directly or ignore the transfer instructions. 16 | 17 | ## Requirements 18 | 19 | Make sure [`fzf`](https://github.com/junegunn/fzf) is installed globally. `git stack` won't work if `fzf` is not installed. 20 | 21 | ## Usage 22 | 23 | ``` 24 | git-stack [] 25 | 26 | Compare against master branch with fzf 27 | 28 | where: 29 | -h show this help text 30 | -f fuzzy select a branch to compare with 31 | ``` 32 | 33 | A simple one-liner is all you need. 34 | ```bash 35 | $ git stack 36 | ``` 37 | 38 | `git stack` compares the current branch against `master`. `git stack -f`, however, will ask for input from a fuzzy list of all available branches, to be compared against `master`. 39 | 40 | ## Changelog 41 | 42 | **2018-Nov-11:** `v1` published. Automate commit and file transfer process with [`commitizen`](http://commitizen.github.io/cz-cli/) and [`ghooks`](https://github.com/ghooks-org/ghooks). 43 | 44 | **2018-Nov-13:** `-f` created for fuzzy selecting branch to compare with `master`. 45 | 46 | ## Others 47 | 48 | See [Dotfiles](https://gitlab.com/hankchanocd/dotfiles) for my other works on `git`. 49 | 50 | See [git-overview](https://github.com/hankchanocd/git-overview) - A quick git repository insight at terminal. 51 | 52 | See [git-commands](https://github.com/hankchanocd/git-commands) - Fuzzy search git commands with fzf. 53 | 54 | ## License 55 | 56 | [MIT](./LICENSE) 57 | -------------------------------------------------------------------------------- /git-stack: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | #!/usr/bin/env zsh 3 | # 4 | # Show the difference between the selected branch and master branch 5 | 6 | # Color scheme used exclusively in git-fuzzy-commit 7 | export FZF_DEFAULT_OPTS=' 8 | --color hl:33,fg+:214,hl+:33 9 | --color spinner:208,pointer:196,marker:208 10 | ' 11 | 12 | function main() { 13 | # Check if it's a git repo 14 | [[ $(git root 2>&1) == 'Not a git repo!' ]] && echo "Not a git repo!" && exit 1 15 | 16 | # Assign master to $branch if not defined yet 17 | local branch 18 | [[ -z "$1" ]] && branch='master' || branch=$1 19 | 20 | function git-stack() { 21 | glNoGraph() { 22 | git log "$branch".. --color=always --format="%C(auto)%h%d %s %C(black)%C(bold)%cr% C(auto)%an" "$@" 23 | } 24 | _gitLogLineToHash="echo {} | grep -o '[a-f0-9]\{7\}' | head -1" 25 | _viewGitLogLine="$_gitLogLineToHash | xargs -I % sh -c 'git show --color=always % | diff-so-fancy'" 26 | 27 | glNoGraph | 28 | fzf --cycle --no-sort --reverse --tiebreak=index --no-multi \ 29 | --ansi --preview="$_viewGitLogLine" \ 30 | --header "enter to view, alt-y to copy hash" \ 31 | --bind "enter:execute:$_viewGitLogLine | less -R" \ 32 | --bind "alt-y:execute:$_gitLogLineToHash | xclip" 33 | } 34 | 35 | git-stack 36 | } 37 | 38 | function fuzzy_select_branch() { 39 | # Check if it's a git repo 40 | [[ $(git root 2>&1) == 'Not a git repo!' ]] && echo "Not a git repo!" && exit 1 41 | 42 | result=$(git branch --list | 43 | fzf --reverse --height=40% --cycle 44 | ) 45 | branch=$(echo "$result" | 46 | tr "*" " " | 47 | xargs # Remove trailing whitespaces 48 | ) 49 | 50 | [[ -n "$branch" ]] && main $branch 51 | } 52 | 53 | ################ Help ################ 54 | usage="usage: $(basename "$0") [] 55 | 56 | Compare against master branch with fzf 57 | 58 | where: 59 | -h show this help text 60 | -f fuzzy select a branch to compare with" 61 | 62 | ############# Parse options ############## 63 | while getopts ':hf' option; do 64 | case "$option" in 65 | h) 66 | echo "$usage" 67 | exit 0 68 | ;; 69 | f) 70 | fuzzy_select_branch 71 | exit 72 | ;; 73 | :) 74 | main 75 | exit 76 | ;; 77 | \?) 78 | printf "illegal option: -%s\n" "$OPTARG" >&2 79 | echo -e "$usage" >&2 80 | exit 1 81 | ;; 82 | esac 83 | done 84 | shift $((OPTIND - 1)) 85 | 86 | # Default case when no option provided 87 | main 88 | -------------------------------------------------------------------------------- /images/demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hankchanocd/git-stack/97fd7ed7090635f4c38681fe8ddd539d2c355273/images/demo.png -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "git-stack", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "ansi-escapes": { 8 | "version": "3.1.0", 9 | "resolved": "http://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", 10 | "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", 11 | "dev": true 12 | }, 13 | "ansi-regex": { 14 | "version": "3.0.0", 15 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 16 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 17 | "dev": true 18 | }, 19 | "ansi-styles": { 20 | "version": "3.2.1", 21 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 22 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 23 | "dev": true, 24 | "requires": { 25 | "color-convert": "^1.9.0" 26 | } 27 | }, 28 | "arr-diff": { 29 | "version": "2.0.0", 30 | "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", 31 | "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", 32 | "dev": true, 33 | "requires": { 34 | "arr-flatten": "^1.0.1" 35 | } 36 | }, 37 | "arr-flatten": { 38 | "version": "1.1.0", 39 | "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", 40 | "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", 41 | "dev": true 42 | }, 43 | "array-unique": { 44 | "version": "0.2.1", 45 | "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", 46 | "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", 47 | "dev": true 48 | }, 49 | "balanced-match": { 50 | "version": "1.0.0", 51 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 52 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 53 | "dev": true 54 | }, 55 | "brace-expansion": { 56 | "version": "1.1.11", 57 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 58 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 59 | "dev": true, 60 | "requires": { 61 | "balanced-match": "^1.0.0", 62 | "concat-map": "0.0.1" 63 | } 64 | }, 65 | "braces": { 66 | "version": "1.8.5", 67 | "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", 68 | "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", 69 | "dev": true, 70 | "requires": { 71 | "expand-range": "^1.8.1", 72 | "preserve": "^0.2.0", 73 | "repeat-element": "^1.1.2" 74 | } 75 | }, 76 | "cachedir": { 77 | "version": "2.1.0", 78 | "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.1.0.tgz", 79 | "integrity": "sha512-xGBpPqoBvn3unBW7oxgb8aJn42K0m9m1/wyjmazah10Fq7bROGG3kRAE6OIyr3U3PIJUqGuebhCEdMk9OKJG0A==", 80 | "dev": true 81 | }, 82 | "chalk": { 83 | "version": "2.4.1", 84 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", 85 | "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", 86 | "dev": true, 87 | "requires": { 88 | "ansi-styles": "^3.2.1", 89 | "escape-string-regexp": "^1.0.5", 90 | "supports-color": "^5.3.0" 91 | } 92 | }, 93 | "chardet": { 94 | "version": "0.7.0", 95 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", 96 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", 97 | "dev": true 98 | }, 99 | "cli-cursor": { 100 | "version": "2.1.0", 101 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", 102 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", 103 | "dev": true, 104 | "requires": { 105 | "restore-cursor": "^2.0.0" 106 | } 107 | }, 108 | "cli-width": { 109 | "version": "2.2.0", 110 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", 111 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", 112 | "dev": true 113 | }, 114 | "color-convert": { 115 | "version": "1.9.3", 116 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 117 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 118 | "dev": true, 119 | "requires": { 120 | "color-name": "1.1.3" 121 | } 122 | }, 123 | "color-name": { 124 | "version": "1.1.3", 125 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 126 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 127 | "dev": true 128 | }, 129 | "colors": { 130 | "version": "0.6.2", 131 | "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", 132 | "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", 133 | "dev": true 134 | }, 135 | "commander": { 136 | "version": "2.1.0", 137 | "resolved": "http://registry.npmjs.org/commander/-/commander-2.1.0.tgz", 138 | "integrity": "sha1-0SG7roYNmZKj1Re6lvVliOR8Z4E=", 139 | "dev": true 140 | }, 141 | "commitizen": { 142 | "version": "3.0.4", 143 | "resolved": "https://registry.npmjs.org/commitizen/-/commitizen-3.0.4.tgz", 144 | "integrity": "sha512-djR5F7RBsGALyUEm/B1H/85nsN4L1F5DhWN+9/efSwqHDSyhw2MK6MF2VRuD26PUqGkQbcUlYO61btkTWjcjVw==", 145 | "dev": true, 146 | "requires": { 147 | "cachedir": "2.1.0", 148 | "cz-conventional-changelog": "2.1.0", 149 | "dedent": "0.7.0", 150 | "detect-indent": "^5.0.0", 151 | "find-node-modules": "1.0.4", 152 | "find-root": "1.1.0", 153 | "fs-extra": "^7.0.0", 154 | "glob": "7.1.3", 155 | "inquirer": "6.2.0", 156 | "lodash": "4.17.11", 157 | "minimist": "1.2.0", 158 | "shelljs": "0.7.6", 159 | "strip-json-comments": "2.0.1" 160 | } 161 | }, 162 | "concat-map": { 163 | "version": "0.0.1", 164 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 165 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 166 | "dev": true 167 | }, 168 | "conventional-commit-types": { 169 | "version": "2.2.0", 170 | "resolved": "https://registry.npmjs.org/conventional-commit-types/-/conventional-commit-types-2.2.0.tgz", 171 | "integrity": "sha1-XblXOdbCEqy+e29lahG5QLqmiUY=", 172 | "dev": true 173 | }, 174 | "cz-conventional-changelog": { 175 | "version": "2.1.0", 176 | "resolved": "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-2.1.0.tgz", 177 | "integrity": "sha1-L0vHOQ4yROTfKT5ro1Hkx0Cnx2Q=", 178 | "dev": true, 179 | "requires": { 180 | "conventional-commit-types": "^2.0.0", 181 | "lodash.map": "^4.5.1", 182 | "longest": "^1.0.1", 183 | "right-pad": "^1.0.1", 184 | "word-wrap": "^1.0.3" 185 | } 186 | }, 187 | "dedent": { 188 | "version": "0.7.0", 189 | "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", 190 | "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", 191 | "dev": true 192 | }, 193 | "detect-file": { 194 | "version": "0.1.0", 195 | "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-0.1.0.tgz", 196 | "integrity": "sha1-STXe39lIhkjgBrASlWbpOGcR6mM=", 197 | "dev": true, 198 | "requires": { 199 | "fs-exists-sync": "^0.1.0" 200 | } 201 | }, 202 | "detect-indent": { 203 | "version": "5.0.0", 204 | "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", 205 | "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=", 206 | "dev": true 207 | }, 208 | "escape-string-regexp": { 209 | "version": "1.0.5", 210 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 211 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 212 | "dev": true 213 | }, 214 | "expand-brackets": { 215 | "version": "0.1.5", 216 | "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", 217 | "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", 218 | "dev": true, 219 | "requires": { 220 | "is-posix-bracket": "^0.1.0" 221 | } 222 | }, 223 | "expand-range": { 224 | "version": "1.8.2", 225 | "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", 226 | "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", 227 | "dev": true, 228 | "requires": { 229 | "fill-range": "^2.1.0" 230 | } 231 | }, 232 | "expand-tilde": { 233 | "version": "1.2.2", 234 | "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", 235 | "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", 236 | "dev": true, 237 | "requires": { 238 | "os-homedir": "^1.0.1" 239 | } 240 | }, 241 | "external-editor": { 242 | "version": "3.0.3", 243 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", 244 | "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", 245 | "dev": true, 246 | "requires": { 247 | "chardet": "^0.7.0", 248 | "iconv-lite": "^0.4.24", 249 | "tmp": "^0.0.33" 250 | } 251 | }, 252 | "extglob": { 253 | "version": "0.3.2", 254 | "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", 255 | "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", 256 | "dev": true, 257 | "requires": { 258 | "is-extglob": "^1.0.0" 259 | } 260 | }, 261 | "figures": { 262 | "version": "2.0.0", 263 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", 264 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", 265 | "dev": true, 266 | "requires": { 267 | "escape-string-regexp": "^1.0.5" 268 | } 269 | }, 270 | "filename-regex": { 271 | "version": "2.0.1", 272 | "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", 273 | "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", 274 | "dev": true 275 | }, 276 | "fill-range": { 277 | "version": "2.2.4", 278 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", 279 | "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", 280 | "dev": true, 281 | "requires": { 282 | "is-number": "^2.1.0", 283 | "isobject": "^2.0.0", 284 | "randomatic": "^3.0.0", 285 | "repeat-element": "^1.1.2", 286 | "repeat-string": "^1.5.2" 287 | } 288 | }, 289 | "find-node-modules": { 290 | "version": "1.0.4", 291 | "resolved": "https://registry.npmjs.org/find-node-modules/-/find-node-modules-1.0.4.tgz", 292 | "integrity": "sha1-tt6zzMtpnIcDdne87eLF9YYrJVA=", 293 | "dev": true, 294 | "requires": { 295 | "findup-sync": "0.4.2", 296 | "merge": "^1.2.0" 297 | } 298 | }, 299 | "find-root": { 300 | "version": "1.1.0", 301 | "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", 302 | "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", 303 | "dev": true 304 | }, 305 | "findup": { 306 | "version": "0.1.5", 307 | "resolved": "https://registry.npmjs.org/findup/-/findup-0.1.5.tgz", 308 | "integrity": "sha1-itkpozk7rGJ5V6fl3kYjsGsOLOs=", 309 | "dev": true, 310 | "requires": { 311 | "colors": "~0.6.0-1", 312 | "commander": "~2.1.0" 313 | } 314 | }, 315 | "findup-sync": { 316 | "version": "0.4.2", 317 | "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.4.2.tgz", 318 | "integrity": "sha1-qBF9D3MST1pFRoOVef5S1xKfteU=", 319 | "dev": true, 320 | "requires": { 321 | "detect-file": "^0.1.0", 322 | "is-glob": "^2.0.1", 323 | "micromatch": "^2.3.7", 324 | "resolve-dir": "^0.1.0" 325 | } 326 | }, 327 | "for-in": { 328 | "version": "1.0.2", 329 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", 330 | "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", 331 | "dev": true 332 | }, 333 | "for-own": { 334 | "version": "0.1.5", 335 | "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", 336 | "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", 337 | "dev": true, 338 | "requires": { 339 | "for-in": "^1.0.1" 340 | } 341 | }, 342 | "fs-exists-sync": { 343 | "version": "0.1.0", 344 | "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", 345 | "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=", 346 | "dev": true 347 | }, 348 | "fs-extra": { 349 | "version": "7.0.1", 350 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", 351 | "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", 352 | "dev": true, 353 | "requires": { 354 | "graceful-fs": "^4.1.2", 355 | "jsonfile": "^4.0.0", 356 | "universalify": "^0.1.0" 357 | } 358 | }, 359 | "fs.realpath": { 360 | "version": "1.0.0", 361 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 362 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 363 | "dev": true 364 | }, 365 | "ghooks": { 366 | "version": "2.0.4", 367 | "resolved": "https://registry.npmjs.org/ghooks/-/ghooks-2.0.4.tgz", 368 | "integrity": "sha1-/VDgQP9UiQauQstReToBv+JFZ7k=", 369 | "dev": true, 370 | "requires": { 371 | "findup": "0.1.5", 372 | "lodash.clone": "4.5.0", 373 | "manage-path": "2.0.0", 374 | "opt-cli": "1.5.1", 375 | "path-exists": "3.0.0", 376 | "spawn-command": "0.0.2" 377 | } 378 | }, 379 | "glob": { 380 | "version": "7.1.3", 381 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 382 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 383 | "dev": true, 384 | "requires": { 385 | "fs.realpath": "^1.0.0", 386 | "inflight": "^1.0.4", 387 | "inherits": "2", 388 | "minimatch": "^3.0.4", 389 | "once": "^1.3.0", 390 | "path-is-absolute": "^1.0.0" 391 | } 392 | }, 393 | "glob-base": { 394 | "version": "0.3.0", 395 | "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", 396 | "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", 397 | "dev": true, 398 | "requires": { 399 | "glob-parent": "^2.0.0", 400 | "is-glob": "^2.0.0" 401 | } 402 | }, 403 | "glob-parent": { 404 | "version": "2.0.0", 405 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", 406 | "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", 407 | "dev": true, 408 | "requires": { 409 | "is-glob": "^2.0.0" 410 | } 411 | }, 412 | "global-modules": { 413 | "version": "0.2.3", 414 | "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", 415 | "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", 416 | "dev": true, 417 | "requires": { 418 | "global-prefix": "^0.1.4", 419 | "is-windows": "^0.2.0" 420 | } 421 | }, 422 | "global-prefix": { 423 | "version": "0.1.5", 424 | "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", 425 | "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", 426 | "dev": true, 427 | "requires": { 428 | "homedir-polyfill": "^1.0.0", 429 | "ini": "^1.3.4", 430 | "is-windows": "^0.2.0", 431 | "which": "^1.2.12" 432 | } 433 | }, 434 | "graceful-fs": { 435 | "version": "4.1.15", 436 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", 437 | "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", 438 | "dev": true 439 | }, 440 | "graceful-readlink": { 441 | "version": "1.0.1", 442 | "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", 443 | "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", 444 | "dev": true 445 | }, 446 | "has-flag": { 447 | "version": "3.0.0", 448 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 449 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 450 | "dev": true 451 | }, 452 | "homedir-polyfill": { 453 | "version": "1.0.1", 454 | "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", 455 | "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", 456 | "dev": true, 457 | "requires": { 458 | "parse-passwd": "^1.0.0" 459 | } 460 | }, 461 | "iconv-lite": { 462 | "version": "0.4.24", 463 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 464 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 465 | "dev": true, 466 | "requires": { 467 | "safer-buffer": ">= 2.1.2 < 3" 468 | } 469 | }, 470 | "inflight": { 471 | "version": "1.0.6", 472 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 473 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 474 | "dev": true, 475 | "requires": { 476 | "once": "^1.3.0", 477 | "wrappy": "1" 478 | } 479 | }, 480 | "inherits": { 481 | "version": "2.0.3", 482 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 483 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 484 | "dev": true 485 | }, 486 | "ini": { 487 | "version": "1.3.5", 488 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", 489 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", 490 | "dev": true 491 | }, 492 | "inquirer": { 493 | "version": "6.2.0", 494 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.0.tgz", 495 | "integrity": "sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg==", 496 | "dev": true, 497 | "requires": { 498 | "ansi-escapes": "^3.0.0", 499 | "chalk": "^2.0.0", 500 | "cli-cursor": "^2.1.0", 501 | "cli-width": "^2.0.0", 502 | "external-editor": "^3.0.0", 503 | "figures": "^2.0.0", 504 | "lodash": "^4.17.10", 505 | "mute-stream": "0.0.7", 506 | "run-async": "^2.2.0", 507 | "rxjs": "^6.1.0", 508 | "string-width": "^2.1.0", 509 | "strip-ansi": "^4.0.0", 510 | "through": "^2.3.6" 511 | } 512 | }, 513 | "interpret": { 514 | "version": "1.1.0", 515 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", 516 | "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", 517 | "dev": true 518 | }, 519 | "is-buffer": { 520 | "version": "1.1.6", 521 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 522 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", 523 | "dev": true 524 | }, 525 | "is-dotfile": { 526 | "version": "1.0.3", 527 | "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", 528 | "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", 529 | "dev": true 530 | }, 531 | "is-equal-shallow": { 532 | "version": "0.1.3", 533 | "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", 534 | "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", 535 | "dev": true, 536 | "requires": { 537 | "is-primitive": "^2.0.0" 538 | } 539 | }, 540 | "is-extendable": { 541 | "version": "0.1.1", 542 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", 543 | "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", 544 | "dev": true 545 | }, 546 | "is-extglob": { 547 | "version": "1.0.0", 548 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", 549 | "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", 550 | "dev": true 551 | }, 552 | "is-fullwidth-code-point": { 553 | "version": "2.0.0", 554 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 555 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 556 | "dev": true 557 | }, 558 | "is-glob": { 559 | "version": "2.0.1", 560 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", 561 | "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", 562 | "dev": true, 563 | "requires": { 564 | "is-extglob": "^1.0.0" 565 | } 566 | }, 567 | "is-number": { 568 | "version": "2.1.0", 569 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", 570 | "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", 571 | "dev": true, 572 | "requires": { 573 | "kind-of": "^3.0.2" 574 | } 575 | }, 576 | "is-posix-bracket": { 577 | "version": "0.1.1", 578 | "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", 579 | "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", 580 | "dev": true 581 | }, 582 | "is-primitive": { 583 | "version": "2.0.0", 584 | "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", 585 | "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", 586 | "dev": true 587 | }, 588 | "is-promise": { 589 | "version": "2.1.0", 590 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 591 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", 592 | "dev": true 593 | }, 594 | "is-windows": { 595 | "version": "0.2.0", 596 | "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", 597 | "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=", 598 | "dev": true 599 | }, 600 | "isarray": { 601 | "version": "1.0.0", 602 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 603 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 604 | "dev": true 605 | }, 606 | "isexe": { 607 | "version": "2.0.0", 608 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 609 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 610 | "dev": true 611 | }, 612 | "isobject": { 613 | "version": "2.1.0", 614 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", 615 | "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", 616 | "dev": true, 617 | "requires": { 618 | "isarray": "1.0.0" 619 | } 620 | }, 621 | "jsonfile": { 622 | "version": "4.0.0", 623 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", 624 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", 625 | "dev": true, 626 | "requires": { 627 | "graceful-fs": "^4.1.6" 628 | } 629 | }, 630 | "kind-of": { 631 | "version": "3.2.2", 632 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 633 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 634 | "dev": true, 635 | "requires": { 636 | "is-buffer": "^1.1.5" 637 | } 638 | }, 639 | "lodash": { 640 | "version": "4.17.11", 641 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", 642 | "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", 643 | "dev": true 644 | }, 645 | "lodash._baseclone": { 646 | "version": "4.5.7", 647 | "resolved": "https://registry.npmjs.org/lodash._baseclone/-/lodash._baseclone-4.5.7.tgz", 648 | "integrity": "sha1-zkKt4IOE711i+nfDD2GkbmhvhDQ=", 649 | "dev": true 650 | }, 651 | "lodash.clone": { 652 | "version": "4.5.0", 653 | "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", 654 | "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=", 655 | "dev": true 656 | }, 657 | "lodash.map": { 658 | "version": "4.6.0", 659 | "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", 660 | "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=", 661 | "dev": true 662 | }, 663 | "longest": { 664 | "version": "1.0.1", 665 | "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", 666 | "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", 667 | "dev": true 668 | }, 669 | "manage-path": { 670 | "version": "2.0.0", 671 | "resolved": "https://registry.npmjs.org/manage-path/-/manage-path-2.0.0.tgz", 672 | "integrity": "sha1-9M+EV7km7u4qg7FzUBQUvHbrlZc=", 673 | "dev": true 674 | }, 675 | "math-random": { 676 | "version": "1.0.1", 677 | "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", 678 | "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", 679 | "dev": true 680 | }, 681 | "merge": { 682 | "version": "1.2.1", 683 | "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", 684 | "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==", 685 | "dev": true 686 | }, 687 | "micromatch": { 688 | "version": "2.3.11", 689 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", 690 | "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", 691 | "dev": true, 692 | "requires": { 693 | "arr-diff": "^2.0.0", 694 | "array-unique": "^0.2.1", 695 | "braces": "^1.8.2", 696 | "expand-brackets": "^0.1.4", 697 | "extglob": "^0.3.1", 698 | "filename-regex": "^2.0.0", 699 | "is-extglob": "^1.0.0", 700 | "is-glob": "^2.0.1", 701 | "kind-of": "^3.0.2", 702 | "normalize-path": "^2.0.1", 703 | "object.omit": "^2.0.0", 704 | "parse-glob": "^3.0.4", 705 | "regex-cache": "^0.4.2" 706 | } 707 | }, 708 | "mimic-fn": { 709 | "version": "1.2.0", 710 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", 711 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", 712 | "dev": true 713 | }, 714 | "minimatch": { 715 | "version": "3.0.4", 716 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 717 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 718 | "dev": true, 719 | "requires": { 720 | "brace-expansion": "^1.1.7" 721 | } 722 | }, 723 | "minimist": { 724 | "version": "1.2.0", 725 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 726 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 727 | "dev": true 728 | }, 729 | "mute-stream": { 730 | "version": "0.0.7", 731 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", 732 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", 733 | "dev": true 734 | }, 735 | "normalize-path": { 736 | "version": "2.1.1", 737 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", 738 | "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", 739 | "dev": true, 740 | "requires": { 741 | "remove-trailing-separator": "^1.0.1" 742 | } 743 | }, 744 | "object.omit": { 745 | "version": "2.0.1", 746 | "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", 747 | "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", 748 | "dev": true, 749 | "requires": { 750 | "for-own": "^0.1.4", 751 | "is-extendable": "^0.1.1" 752 | } 753 | }, 754 | "once": { 755 | "version": "1.4.0", 756 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 757 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 758 | "dev": true, 759 | "requires": { 760 | "wrappy": "1" 761 | } 762 | }, 763 | "onetime": { 764 | "version": "2.0.1", 765 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", 766 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", 767 | "dev": true, 768 | "requires": { 769 | "mimic-fn": "^1.0.0" 770 | } 771 | }, 772 | "opt-cli": { 773 | "version": "1.5.1", 774 | "resolved": "https://registry.npmjs.org/opt-cli/-/opt-cli-1.5.1.tgz", 775 | "integrity": "sha1-BNtEexPJa5kusxaFJm9O0NlzbcI=", 776 | "dev": true, 777 | "requires": { 778 | "commander": "2.9.0", 779 | "lodash.clone": "4.3.2", 780 | "manage-path": "2.0.0", 781 | "spawn-command": "0.0.2-1" 782 | }, 783 | "dependencies": { 784 | "commander": { 785 | "version": "2.9.0", 786 | "resolved": "http://registry.npmjs.org/commander/-/commander-2.9.0.tgz", 787 | "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", 788 | "dev": true, 789 | "requires": { 790 | "graceful-readlink": ">= 1.0.0" 791 | } 792 | }, 793 | "lodash.clone": { 794 | "version": "4.3.2", 795 | "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.3.2.tgz", 796 | "integrity": "sha1-5WsXa2gjp93jj38r9Y3n1ZcSAOk=", 797 | "dev": true, 798 | "requires": { 799 | "lodash._baseclone": "~4.5.0" 800 | } 801 | }, 802 | "spawn-command": { 803 | "version": "0.0.2-1", 804 | "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", 805 | "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=", 806 | "dev": true 807 | } 808 | } 809 | }, 810 | "os-homedir": { 811 | "version": "1.0.2", 812 | "resolved": "http://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 813 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", 814 | "dev": true 815 | }, 816 | "os-tmpdir": { 817 | "version": "1.0.2", 818 | "resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 819 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 820 | "dev": true 821 | }, 822 | "parse-glob": { 823 | "version": "3.0.4", 824 | "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", 825 | "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", 826 | "dev": true, 827 | "requires": { 828 | "glob-base": "^0.3.0", 829 | "is-dotfile": "^1.0.0", 830 | "is-extglob": "^1.0.0", 831 | "is-glob": "^2.0.0" 832 | } 833 | }, 834 | "parse-passwd": { 835 | "version": "1.0.0", 836 | "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", 837 | "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", 838 | "dev": true 839 | }, 840 | "path-exists": { 841 | "version": "3.0.0", 842 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 843 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 844 | "dev": true 845 | }, 846 | "path-is-absolute": { 847 | "version": "1.0.1", 848 | "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 849 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 850 | "dev": true 851 | }, 852 | "path-parse": { 853 | "version": "1.0.6", 854 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 855 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 856 | "dev": true 857 | }, 858 | "preserve": { 859 | "version": "0.2.0", 860 | "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", 861 | "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", 862 | "dev": true 863 | }, 864 | "randomatic": { 865 | "version": "3.1.1", 866 | "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", 867 | "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", 868 | "dev": true, 869 | "requires": { 870 | "is-number": "^4.0.0", 871 | "kind-of": "^6.0.0", 872 | "math-random": "^1.0.1" 873 | }, 874 | "dependencies": { 875 | "is-number": { 876 | "version": "4.0.0", 877 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", 878 | "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", 879 | "dev": true 880 | }, 881 | "kind-of": { 882 | "version": "6.0.2", 883 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", 884 | "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", 885 | "dev": true 886 | } 887 | } 888 | }, 889 | "rechoir": { 890 | "version": "0.6.2", 891 | "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", 892 | "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", 893 | "dev": true, 894 | "requires": { 895 | "resolve": "^1.1.6" 896 | } 897 | }, 898 | "regex-cache": { 899 | "version": "0.4.4", 900 | "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", 901 | "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", 902 | "dev": true, 903 | "requires": { 904 | "is-equal-shallow": "^0.1.3" 905 | } 906 | }, 907 | "remove-trailing-separator": { 908 | "version": "1.1.0", 909 | "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", 910 | "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", 911 | "dev": true 912 | }, 913 | "repeat-element": { 914 | "version": "1.1.3", 915 | "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", 916 | "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", 917 | "dev": true 918 | }, 919 | "repeat-string": { 920 | "version": "1.6.1", 921 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 922 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", 923 | "dev": true 924 | }, 925 | "resolve": { 926 | "version": "1.8.1", 927 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", 928 | "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", 929 | "dev": true, 930 | "requires": { 931 | "path-parse": "^1.0.5" 932 | } 933 | }, 934 | "resolve-dir": { 935 | "version": "0.1.1", 936 | "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", 937 | "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", 938 | "dev": true, 939 | "requires": { 940 | "expand-tilde": "^1.2.2", 941 | "global-modules": "^0.2.3" 942 | } 943 | }, 944 | "restore-cursor": { 945 | "version": "2.0.0", 946 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", 947 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", 948 | "dev": true, 949 | "requires": { 950 | "onetime": "^2.0.0", 951 | "signal-exit": "^3.0.2" 952 | } 953 | }, 954 | "right-pad": { 955 | "version": "1.0.1", 956 | "resolved": "https://registry.npmjs.org/right-pad/-/right-pad-1.0.1.tgz", 957 | "integrity": "sha1-jKCMLLtbVedNr6lr9/0aJ9VoyNA=", 958 | "dev": true 959 | }, 960 | "run-async": { 961 | "version": "2.3.0", 962 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", 963 | "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", 964 | "dev": true, 965 | "requires": { 966 | "is-promise": "^2.1.0" 967 | } 968 | }, 969 | "rxjs": { 970 | "version": "6.3.3", 971 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", 972 | "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", 973 | "dev": true, 974 | "requires": { 975 | "tslib": "^1.9.0" 976 | } 977 | }, 978 | "safer-buffer": { 979 | "version": "2.1.2", 980 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 981 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 982 | "dev": true 983 | }, 984 | "shelljs": { 985 | "version": "0.7.6", 986 | "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.6.tgz", 987 | "integrity": "sha1-N5zM+1a5HIYB5HkzVutTgpJN6a0=", 988 | "dev": true, 989 | "requires": { 990 | "glob": "^7.0.0", 991 | "interpret": "^1.0.0", 992 | "rechoir": "^0.6.2" 993 | } 994 | }, 995 | "signal-exit": { 996 | "version": "3.0.2", 997 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 998 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 999 | "dev": true 1000 | }, 1001 | "spawn-command": { 1002 | "version": "0.0.2", 1003 | "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", 1004 | "integrity": "sha1-lUThpDygRfhTGqwaSMspva5iM44=", 1005 | "dev": true 1006 | }, 1007 | "string-width": { 1008 | "version": "2.1.1", 1009 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 1010 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 1011 | "dev": true, 1012 | "requires": { 1013 | "is-fullwidth-code-point": "^2.0.0", 1014 | "strip-ansi": "^4.0.0" 1015 | } 1016 | }, 1017 | "strip-ansi": { 1018 | "version": "4.0.0", 1019 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 1020 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 1021 | "dev": true, 1022 | "requires": { 1023 | "ansi-regex": "^3.0.0" 1024 | } 1025 | }, 1026 | "strip-json-comments": { 1027 | "version": "2.0.1", 1028 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 1029 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 1030 | "dev": true 1031 | }, 1032 | "supports-color": { 1033 | "version": "5.5.0", 1034 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1035 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1036 | "dev": true, 1037 | "requires": { 1038 | "has-flag": "^3.0.0" 1039 | } 1040 | }, 1041 | "through": { 1042 | "version": "2.3.8", 1043 | "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", 1044 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 1045 | "dev": true 1046 | }, 1047 | "tmp": { 1048 | "version": "0.0.33", 1049 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 1050 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 1051 | "dev": true, 1052 | "requires": { 1053 | "os-tmpdir": "~1.0.2" 1054 | } 1055 | }, 1056 | "tslib": { 1057 | "version": "1.9.3", 1058 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", 1059 | "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", 1060 | "dev": true 1061 | }, 1062 | "universalify": { 1063 | "version": "0.1.2", 1064 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 1065 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", 1066 | "dev": true 1067 | }, 1068 | "which": { 1069 | "version": "1.3.1", 1070 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1071 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1072 | "dev": true, 1073 | "requires": { 1074 | "isexe": "^2.0.0" 1075 | } 1076 | }, 1077 | "word-wrap": { 1078 | "version": "1.2.3", 1079 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 1080 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 1081 | "dev": true 1082 | }, 1083 | "wrappy": { 1084 | "version": "1.0.2", 1085 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1086 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1087 | "dev": true 1088 | } 1089 | } 1090 | } 1091 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "git-stack", 3 | "version": "1.0.0", 4 | "description": "View difference between git branches", 5 | "main": "git-stack", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "commit": "git-cz", 9 | "transfer": "bash ./script/transfer.sh" 10 | }, 11 | "repository": { 12 | "type": "git", 13 | "url": "git+https://github.com/hankchanocd/git-stack.git" 14 | }, 15 | "keywords": [ 16 | "git", 17 | "branch", 18 | "fuzzy", 19 | "fzf", 20 | "differences", 21 | "git-stack" 22 | ], 23 | "author": "Hank Chan (https://github.com/hankchanocd)", 24 | "license": "MIT", 25 | "bugs": { 26 | "url": "https://github.com/hankchanocd/git-stack/issues" 27 | }, 28 | "homepage": "https://github.com/hankchanocd/git-stack#readme", 29 | "devDependencies": { 30 | "commitizen": "^3.0.4", 31 | "cz-conventional-changelog": "^2.1.0", 32 | "ghooks": "^2.0.4" 33 | }, 34 | "config": { 35 | "ghooks": { 36 | "post-commit": "npm run transfer" 37 | }, 38 | "commitizen": { 39 | "path": "node_modules/cz-conventional-changelog" 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /script/transfer.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | #!/usr/bin/env zsh 3 | # 4 | # Transfer git-stack to PATH upon each commit automatically 5 | 6 | main() { 7 | if [ -d "$HOME/.script/bin" ]; then # look for ~/.script/bin first 8 | cp -v './git-stack' "$HOME/.script/bin" 9 | 10 | elif [ -d "$HOME/bin" ]; then # default to ~/bin 11 | cp -v './git-stack' "$HOME/bin" 12 | 13 | else 14 | echo 'transfer.sh does not know where to put git-stack. Please do it manually.' 15 | exit 1 16 | 17 | fi 18 | 19 | echo -e '\e[92mComplete \e[0m' # Light green followed by white 20 | echo ' ' 21 | } 22 | 23 | main 24 | --------------------------------------------------------------------------------