├── .eslintrc ├── .github ├── FUNDING.yml └── workflows │ └── node.js.yml ├── .gitignore ├── CHANGELOG.md ├── Makefile ├── README.md ├── bin ├── gitopen ├── hgopen ├── open-commander.js ├── openrc.js └── svnopen ├── demo.gif ├── lib ├── gitopenrc ├── gitremote.js ├── hgremote.js ├── index.js ├── scheme │ ├── antcode.js │ ├── bitbucket.js │ ├── coding.js │ ├── gitcode.js │ ├── gitea.js │ ├── gitee.js │ ├── github.js │ └── gitlab.js └── xopen.js ├── package-lock.json ├── package.json ├── pnpm-lock.yaml └── test └── gitopen.test.js /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "globals": { 3 | "module": true, 4 | "exports": true, 5 | "process": true, 6 | "child_process": true 7 | }, 8 | "ecmaFeatures": { 9 | "jsx": false 10 | }, 11 | "parser": "espree", 12 | "env": { 13 | "amd": false, 14 | "jasmine": false, 15 | "node": true, 16 | "mocha": true, 17 | "browser": true, 18 | "builtin": true, 19 | "es6": true 20 | }, 21 | "rules": { 22 | "eol-last": 2, 23 | "linebreak-style": [0, "unix"], 24 | "no-alert": 2, 25 | "no-array-constructor": 2, 26 | "no-bitwise": 2, 27 | "no-caller": 2, 28 | "no-catch-shadow": 2, 29 | "no-cond-assign": [2, "except-parens"], 30 | "no-constant-condition": 2, 31 | "no-continue": 0, 32 | "no-control-regex": 2, 33 | "no-debugger": 2, 34 | "no-delete-var": 2, 35 | "no-div-regex": 0, 36 | "no-dupe-args": 2, 37 | "no-dupe-keys": 2, 38 | "no-duplicate-case": 2, 39 | "no-else-return": 0, 40 | "no-empty": 2, 41 | "no-empty-character-class": 2, 42 | "no-eq-null": 0, 43 | "no-eval": 2, 44 | "no-ex-assign": 2, 45 | "no-extend-native": 2, 46 | "no-extra-bind": 2, 47 | "no-extra-boolean-cast": 2, 48 | "no-extra-parens": 0, 49 | "no-extra-semi": 2, 50 | "no-fallthrough": 2, 51 | "no-floating-decimal": 0, 52 | "no-func-assign": 2, 53 | "no-implied-eval": 2, 54 | "no-inline-comments": 0, 55 | "no-inner-declarations": [2, "functions"], 56 | "no-invalid-regexp": 2, 57 | "no-irregular-whitespace": 2, 58 | "no-iterator": 0, 59 | "no-label-var": 2, 60 | "no-labels": 2, 61 | "no-lone-blocks": 2, 62 | "no-lonely-if": 0, 63 | "no-loop-func": 2, 64 | "no-mixed-requires": [0, false], 65 | "no-mixed-spaces-and-tabs": [2, false], 66 | "no-multi-spaces": 2, 67 | "no-multi-str": 2, 68 | "no-multiple-empty-lines": [0, { 69 | "max": 2 70 | }], 71 | "no-native-reassign": 2, 72 | "no-negated-in-lhs": 2, 73 | "no-nested-ternary": 0, 74 | "no-new": 0, 75 | "no-new-func": 2, 76 | "no-new-object": 2, 77 | "no-new-require": 0, 78 | "no-new-wrappers": 2, 79 | "no-obj-calls": 2, 80 | "no-octal": 2, 81 | "no-octal-escape": 2, 82 | "no-param-reassign": 0, 83 | "no-path-concat": 0, 84 | "no-plusplus": 0, 85 | "no-process-env": 0, 86 | "no-process-exit": 0, 87 | "no-proto": 2, 88 | "no-redeclare": 2, 89 | "no-regex-spaces": 2, 90 | "no-restricted-modules": 0, 91 | "no-return-assign": 0, 92 | "no-script-url": 2, 93 | "no-self-compare": 0, 94 | "no-sequences": 2, 95 | "no-shadow": 0, 96 | "no-shadow-restricted-names": 2, 97 | "no-spaced-func": 2, 98 | "no-sparse-arrays": 2, 99 | "no-sync": 0, 100 | "no-ternary": 0, 101 | "no-trailing-spaces": 2, 102 | "no-this-before-super": 0, 103 | "no-throw-literal": 0, 104 | "no-undef": 2, 105 | "no-undef-init": 2, 106 | "no-undefined": 0, 107 | "no-unexpected-multiline": 0, 108 | "no-underscore-dangle": 0, 109 | "no-unneeded-ternary": 0, 110 | "no-unreachable": 2, 111 | "no-unused-expressions": 0, 112 | "no-unused-vars": 2, 113 | "no-use-before-define": [2, "nofunc"], 114 | "no-void": 0, 115 | "no-var": 0, 116 | "no-const-assign": 2, 117 | "prefer-const": 0, 118 | "no-warning-comments": [0, { 119 | "terms": ["todo", "fixme", "xxx"], 120 | "location": "start" 121 | }], 122 | "accessor-pairs": 0, 123 | "array-bracket-spacing": [0, "never"], 124 | "block-scoped-var": 0, 125 | "brace-style": [0, "1tbs"], 126 | "camelcase": 0, 127 | "comma-dangle": [2, "always-multiline"], 128 | "comma-spacing": 2, 129 | "comma-style": 0, 130 | "complexity": [0, 11], 131 | "computed-property-spacing": [0, "never"], 132 | "consistent-return": 2, 133 | "consistent-this": [0, "that"], 134 | "constructor-super": 0, 135 | "curly": [2, "multi-line"], 136 | "default-case": 0, 137 | "dot-location": 0, 138 | "dot-notation": 0, 139 | "eqeqeq": 2, 140 | "func-names": 0, 141 | "func-style": [0, "declaration"], 142 | "generator-star-spacing": 0, 143 | "guard-for-in": 0, 144 | "handle-callback-err": 0, 145 | "indent": [2, 2], 146 | "no-with": 2, 147 | "key-spacing": [2, { 148 | "beforeColon": false, 149 | "afterColon": true 150 | }], 151 | "lines-around-comment": 0, 152 | "max-depth": [0, 4], 153 | "max-len": [0, 80, 4], 154 | "max-nested-callbacks": [0, 2], 155 | "max-params": [0, 3], 156 | "max-statements": [0, 10], 157 | "new-cap": 0, 158 | "new-parens": 2, 159 | "newline-after-var": 0, 160 | "object-curly-spacing": [0, "never"], 161 | "object-shorthand": 0, 162 | "one-var": 0, 163 | "operator-assignment": [0, "always"], 164 | "operator-linebreak": 0, 165 | "padded-blocks": 0, 166 | "quote-props": 0, 167 | "quotes": [2, "single"], 168 | "radix": 0, 169 | "semi": 2, 170 | "semi-spacing": [2, { 171 | "before": false, 172 | "after": true 173 | }], 174 | "sort-vars": 0, 175 | "space-before-blocks": [2, "always"], 176 | "space-before-function-paren": [2, "never"], 177 | "space-in-parens": [2, "never"], 178 | "space-infix-ops": 2, 179 | "keyword-spacing": 2, 180 | "space-unary-ops": [2, { 181 | "words": true, 182 | "nonwords": false 183 | }], 184 | "spaced-comment": [2, "always"], 185 | "strict": [2, "global"], 186 | "use-isnan": 2, 187 | "valid-jsdoc": [2, { 188 | "prefer": { 189 | "returns": "return" 190 | } 191 | }], 192 | "valid-typeof": 0, 193 | "vars-on-top": 0, 194 | "wrap-iife": 0, 195 | "wrap-regex": 0, 196 | "yoda": [2, "never"] 197 | } 198 | } 199 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [hotoo] 4 | 5 | # patreon: # Replace with a single Patreon username 6 | # open_collective: # Replace with a single Open Collective username 7 | # ko_fi: # Replace with a single Ko-fi username 8 | # tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 9 | # community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 10 | # liberapay: # Replace with a single Liberapay username 11 | # issuehunt: # Replace with a single IssueHunt username 12 | # lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry 13 | # polar: # Replace with a single Polar username 14 | # buy_me_a_coffee: # Replace with a single Buy Me a Coffee username 15 | # thanks_dev: # Replace with a single thanks.dev username 16 | # custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 17 | -------------------------------------------------------------------------------- /.github/workflows/node.js.yml: -------------------------------------------------------------------------------- 1 | # This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions 3 | 4 | name: Node.js CI 5 | 6 | on: 7 | push: 8 | branches: [ master ] 9 | pull_request: 10 | branches: [ master ] 11 | 12 | jobs: 13 | build: 14 | 15 | runs-on: ubuntu-latest 16 | 17 | strategy: 18 | matrix: 19 | node-version: [12.x, 18.x, 22.x] 20 | # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ 21 | 22 | steps: 23 | - uses: actions/checkout@v3 24 | - name: Use Node.js ${{ matrix.node-version }} 25 | uses: actions/setup-node@v3 26 | with: 27 | node-version: ${{ matrix.node-version }} 28 | cache: 'npm' 29 | - run: npm i 30 | - run: make test 31 | 32 | - name: Coveralls 33 | uses: coverallsapp/github-action@master 34 | with: 35 | github-token: ${{ secrets.GITHUB_TOKEN }} 36 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | test/hghttp/ 3 | test/hgssh/ 4 | .DS_Store 5 | coverage/ 6 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | 2 | # CHANGELOG 3 | 4 | ## 3.3.0 (2024-01-04) 5 | 6 | - Feature: support [Gitea.com](https://about.gitea.com/) 7 | 8 | ## 3.2.0 (2020-11-28) 9 | 10 | - Feat: 内置类型也支持部分自定义配置。 11 | 12 | ## 3.1.1 (2020-10-24) 13 | 14 | - Feat: 支持 AntCode。 15 | 16 | ## 3.0.1 (2019-04-28) 17 | 18 | - fixed #73 19 | 20 | ## 3.0.0 (2019-04-25) 21 | 22 | - feat: config in .gitconfig. 23 | - config: github PR scheme config. 24 | - feat: support `--remote` bash paramter. 25 | 26 | ## 2.8.0 (2017-10-01) 27 | 28 | - feat: check update. 29 | - feat: gitopen blame. 30 | - feat: alias cis -> commits. 31 | - fix: encode branch name. 32 | - fix: support branch name with dot. 33 | - fix: replace multiple times schema placeholder. 34 | 35 | ## 2.7.3 (2017-05-04) 36 | 37 | - fix(github): Open PR by id in github. #56 38 | 39 | ## 2.7.2 (2017-04-11) 40 | 41 | - [fixed]: getBaseBranch when commit message with square brackets. #52 42 | 43 | ## 2.7.1 (2017-03-02) 44 | 45 | - feat: Useful error message for user. 46 | 47 | ## 2.7.0 (2017-02-22) 48 | 49 | - feat: Auto get base branch for create PR/MR. #47, #48 50 | 51 | ## 2.6.0 (2017-02-09) 52 | 53 | - feat: Support code.csdn.net #46 54 | 55 | ## 2.5.2 (2017-02-09) 56 | 57 | - feat: Add `gitopen branches` command. #44 58 | - feat: Delete gitcafe(merged into coding.net). #45 59 | 60 | ## 2.5.1 (2016-10-27) 61 | 62 | * fix(path.dirname): path.dirname(undefined) throw error since node v6. #40, #41 63 | 64 | ## 2.5.0 (2016-06-01) 65 | 66 | * better open pull request way. You can choose remote branch by option menu. #35 67 | 68 | ## 2.4.2 (2016-05-30) 69 | 70 | * `gitopen pulls` alias: `gitopen prs`, `gitopen mrs`. #34 71 | 72 | ## 2.4.1 (2015-08-15) 73 | 74 | * #28, fixed bitbucket's commit scheme config. 75 | 76 | ## 2.4.0 (2015-08-12) 77 | 78 | * #27, `$ gitopen {hash}` 79 | 80 | ## 2.3.4 (2015-08-03) 81 | 82 | * fixed(config): fixed bitbucket pulls scheme config. #26 83 | 84 | ## 2.3.3 (2015-07-24) 85 | 86 | * fixed #24 escape url for command args. 87 | * fixed GitLab not support releases. 88 | 89 | ## 2.3.2 (2015-07-23) 90 | 91 | * fixed `--path` option. #23 92 | 93 | ## 2.3.1 (2015-07-23) 94 | 95 | * #22 fixed resolve relative path. 96 | 97 | ## 2.3.0 (2015-07-23) 98 | 99 | * feat(path): support open filepath or directory. #16 #21 100 | 101 | ## 2.2.0 (2015-07-22) 102 | 103 | * Add and Update gitopen, hgopen, svnopen documents 104 | * Change `gitopen issue` to open new issue. 105 | * Change `gitopen milestone` to open new milestone. 106 | * Add `gitopen pr#1` alias for pull-request, more details sea README. 107 | 108 | ## 2.1.0 (2015-07-21) 109 | 110 | * Add feature: open pull-request or merge request by id. fixed #10 111 | 112 | ## 2.0.0 (2015-07-21) 113 | 114 | * Add `hgopen` feature #7, #14 115 | * Refact open-commander. 116 | * Fixed gitopen new pull-request. 117 | * More testcases. 118 | 119 | ## 1.2.1 (2015-07-15) 120 | 121 | * Fixed custom gitlab server without scheme. #8, #9 122 | 123 | ## 1.2.0 (2015-07-15) 124 | 125 | * Add coding.net support. #2 126 | * Add @profile support. #3 127 | 128 | [milestone@1.2.0](https://github.com/hotoo/gitopen/issues?q=milestone%3A1.2.0) 129 | 130 | ## 1.1.0 (2015-07-13) 131 | 132 | * Support Windows, Mac OS X, Unix and Linux. #1 133 | 134 | ## 1.0.1 (2015-07-12) 135 | 136 | * feat(windows): Add windows supports. 137 | 138 | ## 1.0.0 (2015-07-05) 139 | 140 | ## 0.2.0 (2015-07-05) 141 | 142 | ## 0.1.0 (2015-07-02) 143 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | version = $(shell cat package.json | grep version | awk -F'"' '{print $$4}') 2 | TESTS = $(shell ls -S `find test -type f -name "*.test.js" -print`) 3 | HG_SSH_DIR = test/hgssh 4 | HG_HTTP_DIR = test/hghttp 5 | REPORTER = spec 6 | TIMEOUT = 15000 7 | MOCHA_OPTS = 8 | 9 | lint: 10 | @npm run lint 11 | 12 | test: lint 13 | @./node_modules/.bin/istanbul cover \ 14 | ./node_modules/.bin/_mocha \ 15 | -- \ 16 | --harmony \ 17 | --reporter $(REPORTER) \ 18 | --timeout $(TIMEOUT) \ 19 | --require should \ 20 | --inline-diffs \ 21 | $(TESTS) 22 | 23 | testHg: 24 | @if [ ! -d $(HG_SSH_DIR) ]; then \ 25 | mkdir -p $(HG_SSH_DIR); \ 26 | cd $(HG_SSH_DIR); \ 27 | hg init; \ 28 | echo [paths] >> .hg/hgrc; \ 29 | echo default = ssh://hg@bitbucket.org/hotoo/gitopen >> .hg/hgrc; \ 30 | fi 31 | @if [ ! -d $(HG_HTTP_DIR) ]; then \ 32 | mkdir -p $(HG_HTTP_DIR); \ 33 | cd $(HG_HTTP_DIR); \ 34 | hg init; \ 35 | echo [paths] >> .hg/hgrc; \ 36 | echo default = https://hotoo@bitbucket.org/hotoo/gitopen >> .hg/hgrc; \ 37 | fi 38 | 39 | publish: 40 | @npm publish --registry https://registry.npmjs.org/ --access public 41 | @git tag $(version) 42 | @git push origin $(version) 43 | 44 | .PHONY: test publish coverage 45 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # gitopen 3 | 4 | [![NPM version][npm-badge]][npm-url] 5 | [![Build status][travis-badge]][travis-url] 6 | [![Coveralls status][Coveralls-badge]][coveralls-url] 7 | 8 | [npm-badge]: https://img.shields.io/npm/v/gitopen.svg?style=flat 9 | [npm-url]: https://www.npmjs.com/package/gitopen 10 | [travis-badge]: https://travis-ci.org/hotoo/gitopen.svg 11 | [travis-url]: https://travis-ci.org/hotoo/gitopen 12 | [coveralls-badge]: https://coveralls.io/repos/hotoo/gitopen/badge.svg?branch=master 13 | [coveralls-url]: https://coveralls.io/r/hotoo/gitopen 14 | 15 | Open git/hg/svn remote url in web browser from terminal. 16 | 17 | ![demo](./demo.gif) 18 | 19 | Support: 20 | 21 | * Mac OS X 22 | * Windows 23 | * Linux/Unix 24 | 25 | , 26 | 27 | * git 28 | * hg 29 | * svn 30 | 31 | and 32 | 33 | * [GitHub](https://github.com/) 34 | * [GitLab](https://gitlab.com/) 35 | * [BitBucket](https://bitbucket.org/) 36 | * [Gitea](https://gitea.com/) 37 | * ~~[GitCafe](https://gitcafe.com/)~~ Merged into coding.net. 38 | * [Coding](https://coding.net/) 39 | * [gitee](https://gitee.com/) 40 | * [CSDN gitcode.net](https://gitcode.net/) 41 | * [AntCode](https://code.alipay.com/) 42 | * Custom 43 | 44 | If you are use [GitBucket](https://github.com/takezoe/gitbucket), 45 | [tell me please](https://github.com/hotoo/gitopen/issues/new). 46 | 47 | ## Install 48 | 49 | ``` 50 | $ npm install -g gitopen 51 | ``` 52 | 53 | ## Usage 54 | 55 | ``` 56 | $ git remote -v 57 | origin git@github.com:hotoo/gitopen.git (fetch) 58 | origin git@github.com:hotoo/gitopen.git (push) 59 | $ git branch 60 | * master 61 | $ cd subdir 62 | 63 | $ gitopen # Open git repository homepage, like: https://github.com/hotoo/gitopen 64 | $ gitopen :master # Open git repository on given branch name. 65 | $ gitopen -b master # Same the `:master` 66 | $ gitopen issues # https://github.com/hotoo/gitopen/issues 67 | $ gitopen #1 # https://github.com/hotoo/gitopen/issues/1 68 | $ gitopen pr # New a pull-request 69 | $ gitopen !1 # Open merge/pull request by id. 70 | $ gitopen prs # https://github.com/hotoo/gitopen/pulls, alias `pulls`, `mrs`. 71 | $ gitopen wiki # Open wiki pages. 72 | $ gitopen release # Open releases page. 73 | $ gitopen tags # Open tags page. 74 | $ gitopen commits # Open commits page. 75 | $ gitopen brs # Open branches page, alias `branchs` and `branches`. 76 | $ gitopen {hash} # Open commit page by hash code. 77 | 78 | $ gitopen README.md # Open remote blob url. default use current working branch. 79 | $ gitopen README.md -b branch # Open remote blob url by given branch. 80 | $ gitopen README.md :branch # Open remote blob url by given branch. 81 | $ gitopen path/to/dir # Open remote tree url. default use current working branch. 82 | 83 | # global command. 84 | $ gitopen @lizzie # https://github.com/lizzie 85 | $ gitopen @hotoo/gitopen # https://github.com/hotoo/gitopen 86 | ``` 87 | 88 | ## Configuration 89 | 90 | Default support [github.com](https://github.com/), 91 | [bitbucket.org](https://bitbucket.org/), 92 | [gitlab.com](https://gitlab.com/), 93 | [gitea.com](https://gitea.com/), 94 | ~~[gitcafe.com](https://gitcafe.com/)~~, 95 | [coding.net](https://coding.net/), 96 | [gitee.com](https://gitee.com/), 97 | [AntCode](https://code.alipay.com/) 98 | and CSDN [gitcode.com](https://gitcode.net/). 99 | 100 | If you are use [GitHub Enterprise](https://enterprise.github.com/), 101 | [GitLab Community Edition (CE), GitLab Enterprise Edition (EE)](https://gitlab.org/), 102 | [Atlassian Stash](https://www.atlassian.com/software/stash), 103 | ~~[GitCafe Enterprise](https://enterprise.gitcafe.com/)~~ 104 | You need config in ~/.gitconfig file: 105 | 106 | ``` 107 | [gitopen "github.company.com"] 108 | type = github 109 | protocol = https 110 | [gitopen "gitlab.company.net"] 111 | type = gitlab 112 | protocol = http 113 | ``` 114 | 115 | You can config it by git command-line: 116 | 117 | ```bash 118 | ; global 119 | $ git config --global gitopen.github.company.com.type github 120 | $ git config --global gitopen.github.company.com.protocol https 121 | 122 | ; set local repo default remote name. 123 | $ git remote add gitlabRemote git@gitlab.com:hotoo/gitopen.git 124 | $ git config gitopen.remote gitlabRemote 125 | ``` 126 | 127 | 128 | Also you can config it in ~/.gitopenrc file for global settings: 129 | 130 | ```yaml 131 | github.company.com: 132 | type: github 133 | protocol: https 134 | gitlab.company.net: 135 | type: gitlab 136 | protocol: http 137 | ``` 138 | 139 | - `github.company.com`, `gitlab.company.net` is your company's git web server domain name. 140 | - `type` is the type of your company's git web server, support `github`, `gitlab`, `gitbucket`, `gitea`, `coding`, `gitee`, `gitcode`, `antcode`. 141 | - `protocol`: protocol of your company's git web server, `http` or `https`. 142 | 143 | Else if you are using other custom web system build your owner git server, you need config like: 144 | 145 | ```yaml 146 | git.example.com: 147 | type: custom 148 | protocol: http 149 | scheme: 150 | issues: /path/to/issues 151 | wiki: /path/to/wikis 152 | more: [reference to github scheme](./lib/scheme/github.js) 153 | ... 154 | ``` 155 | 156 | You can git alias in ~/.gitconfig: 157 | 158 | ``` 159 | [alias] 160 | open = !gitopen 161 | ``` 162 | 163 | Then you can use command like: 164 | 165 | ``` 166 | $ git open 167 | ``` 168 | 169 | ## gitopen Commands 170 | 171 | ### $ gitopen 172 | 173 | Open git repository homepage. 174 | 175 | ### $ gitopen issues 176 | 177 | Open git repository issues list page. 178 | 179 | ### $ gitopen issue [title] 180 | 181 | Open new issue with title (optional). 182 | 183 | ### $ gitopen #1 184 | 185 | Open git repository issue by id. 186 | 187 | ### $ gitopen pulls 188 | 189 | Open git repository pulls list page. 190 | 191 | ### $ gitopen pull [branch-name] 192 | 193 | Open pull request or merge request from given branch or current working branch 194 | for git repository. 195 | 196 | alias: 197 | 198 | * `$ gitopen pr` 199 | * `$ gitopen mr` 200 | 201 | for example: 202 | 203 | ``` 204 | $ gitopen pr # current working branch to compare default branch. 205 | $ gitopen pr a # given branch(a) to compare default branch. 206 | $ gitopen pr a b # branch b to compare branch a. 207 | $ gitopen pr a...b # branch b to compare branch a. 208 | ``` 209 | 210 | ### $ gitopen !1 211 | 212 | Open git repository pull request or merge request by id. 213 | 214 | alias: 215 | 216 | * `$ gitopen pr1` 217 | * `$ gitopen mr#1` 218 | 219 | support `@`, `/`, `#`, `:`, `-` or without sparator. 220 | 221 | ### $ gitopen blame path/to/file 222 | 223 | Open file blame information page. 224 | 225 | ### $ gitopen commits 226 | 227 | Open git repository commits list page. 228 | 229 | alias: 230 | 231 | * `$ gitopen commit` 232 | * `$ gitopen ci` 233 | 234 | ### $ gitopen {hash} 235 | 236 | Open commit page by hash code. 237 | 238 | ### $ gitopen wiki 239 | 240 | Open git repository wiki home page. 241 | 242 | alias: 243 | 244 | * `$ gitopen wikis` 245 | 246 | ### $ gitopen tags 247 | 248 | Open git repository tags list page. 249 | 250 | alias: 251 | 252 | * `$ gitopen tag` 253 | 254 | ### $ gitopen milestones 255 | 256 | Open git repository milestones list page. 257 | 258 | ### $ gitopen milestones@id 259 | 260 | Open git repository milestones by given id. 261 | 262 | alias: 263 | 264 | * `$ gitopen milestone@id` 265 | 266 | support `@`, `/`, `#`, `:`, `-` sparator. 267 | 268 | ### $ gitopen milestone 269 | 270 | Open new milestone for git. 271 | 272 | ### $ gitopen releases 273 | 274 | Open git repository releases list page. 275 | 276 | alias: 277 | 278 | * `$ gitopen release` 279 | 280 | ### $ gitopen release new [tag-name] 281 | 282 | Open new release by tag name. 283 | 284 | ### $ gitopen release edit 285 | 286 | Edit release by tag name. 287 | 288 | ### $ gitopen filename [--branch ] 289 | 290 | Open given file on given branch, default use current working branch. 291 | 292 | alias: 293 | 294 | * `$ gitopen filename :branch` 295 | * `$ gitopen filename -b branch` 296 | 297 | ### $ gitopen directory [--branch ] 298 | 299 | Open given directory on given branch, default use current working branch. 300 | 301 | alias: 302 | 303 | * `$ gitopen directory :branch` 304 | * `$ gitopen directory -b branch` 305 | 306 | ### $ gitopen snippet 307 | 308 | [LOCAL COMMAND] Open new snippet. 309 | 310 | [GLOBAL COMMAND] Open https://gist.github.com/ 311 | 312 | alias: 313 | 314 | * `$ gitopen snip` 315 | * `$ gitopen gist` 316 | 317 | ### $ gitopen network 318 | 319 | Open network page. 320 | 321 | ### $ gitopen @profile 322 | 323 | [GLOBAL COMMAND] Open profile page on GitHub. 324 | 325 | ### $ gitopen @profile/repository-name 326 | 327 | [GLOBAL COMMAND] Open given repository homepage on GitHub. 328 | 329 | ## hgopen Commands 330 | 331 | Support all of gitopen in repository local commands (not support global commands), like: 332 | 333 | * `$ hgopen` open homepage. 334 | * `$ hgopen issues` open issues list page. 335 | * `$ hgopen #id` op issues by id. 336 | * ... 337 | 338 | ## svnopen Commands 339 | 340 | ### $ svnopen 341 | 342 | Open svn repository on current working directory. 343 | 344 | ## Options 345 | 346 | ### -p, --path 347 | 348 | Specify file/directory path, default is current working directory. 349 | 350 | If you want open a file or directory name is reserved words, like `issues` and 351 | `pr`, you can use `--path` option instead. 352 | 353 | ``` 354 | $ gitopen -p issues 355 | $ gitopen --path pr 356 | ``` 357 | 358 | ### -b, --branch 359 | 360 | Specify git/hg branch name, default is current working branch. 361 | 362 | ### -r, --remote 363 | 364 | Specify git remote name, default is `origin`. 365 | 366 | ### -v, --verbose 367 | 368 | Display detail information for debug. 369 | 370 | ## FAQ 371 | 372 | ### `xdg-open: not found` in Linux 373 | 374 | ```bash 375 | sudo apt-get install xdg-utils --fix-missing 376 | ``` 377 | 378 | - See [xdg-open command is not working](https://askubuntu.com/questions/704712/in-ubuntu-xdg-open-command-is-not-working) 379 | 380 | ## License 381 | 382 | [MIT](http://hotoo.mit-license.org/) 383 | 384 | ## Donate 385 | 386 | If this tool is useful for you, please [Star this repository](https://github.com/hotoo/gitopen). 387 | 388 | And maybe you want to donate me via Alipay / WeChat: 389 | 390 | Alipay:hotoo.cn@gmail.com, WeChat:hotoome 391 | 392 | 393 | Thank you. 394 | -------------------------------------------------------------------------------- /bin/gitopen: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 'use strict'; 3 | 4 | var xopen = require('../lib/xopen'); 5 | var getConfig = require('./openrc'); 6 | var gitremote = require('../lib/gitremote'); 7 | var gitresolve = require('../lib/'); 8 | var commander = require('./open-commander'); 9 | 10 | var cwd = process.cwd(); 11 | var cwb = gitremote.getCurrentBranch(cwd) || 'master'; 12 | var gitroot = gitremote.getGitRootPath(cwd); 13 | // 1. commander 14 | // 2. if help then print help. 15 | // 3. if version then print version. 16 | commander(process.argv, { 17 | cwd: cwd, 18 | cwb: cwb, 19 | root: gitroot, 20 | }, function(command) { 21 | 22 | var url; 23 | // 4. if @profile then open @profile 24 | if (command.category === 'profile') { 25 | var username = command.args.username; 26 | var reponame = command.args.reponame; 27 | url = 'https://github.com/' + username + (reponame ? '/' + reponame : ''); 28 | if (command.verbose) { 29 | console.log('URL:', url); 30 | return process.exit(0); 31 | } 32 | xopen(url); 33 | return process.exit(0); 34 | } 35 | 36 | // 5. git/hg/svn remote url. 37 | var remote = gitremote.getRemoteName({ 38 | cwd: process.cwd(), 39 | remote: command.remote, 40 | }); 41 | 42 | var uri; 43 | try { 44 | uri = gitremote.getRemoteUrl({ 45 | cwd: process.cwd(), 46 | remote, 47 | }); 48 | } catch (ex) { 49 | if (command.category === 'snippets/new') { 50 | uri = 'https://github.com/hotoo/gitopen'; 51 | } else { 52 | console.error('Not in git repository directory'); 53 | return process.exit(1); 54 | } 55 | } 56 | // 6. get openrc 57 | var config = getConfig(uri, { 58 | cwd: process.cwd(), 59 | remote, 60 | }); 61 | command.type = config.type; 62 | command.scheme = config.scheme; 63 | command.protocol = config.protocol; 64 | command.remote = remote; 65 | // 6. resolve paths. 66 | url = gitresolve(uri, command); 67 | // 7. open 68 | if (command.verbose) { 69 | console.log('Option:', command); 70 | console.log('URL:', url); 71 | } else { 72 | xopen(url); 73 | } 74 | 75 | return 0; 76 | }); 77 | 78 | // 每天检查一次更新。 79 | var updateNotifier = require('update-notifier'); 80 | var pkg = require('../package.json'); 81 | 82 | updateNotifier({ 83 | pkg: pkg, 84 | updateCheckInterval: 1000 * 60 * 60 * 24, 85 | }).notify(); 86 | 87 | // vim:ft=javascript 88 | -------------------------------------------------------------------------------- /bin/hgopen: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 'use strict'; 3 | 4 | var xopen = require('../lib/xopen'); 5 | var getConfig = require('./openrc'); 6 | var hgremote = require('../lib/hgremote'); 7 | var gitresolve = require('../lib/'); 8 | var commander = require('./open-commander'); 9 | 10 | var cwd = process.cwd(); 11 | var cwb = hgremote.getCurrentBranch(cwd) || 'default'; 12 | var hgroot = hgremote.getHgRootPath(cwd); 13 | // 1. commander 14 | // 2. if help then print help. 15 | // 3. if version then print version. 16 | commander(process.argv, { 17 | cwd: cwd, 18 | cwb: cwb, 19 | root: hgroot, 20 | }, function(command) { 21 | var url; 22 | 23 | // 4. if @profile then open @profile 24 | if (command.category === 'profile') { 25 | var username = command.args.username; 26 | var reponame = command.args.reponame; 27 | url = 'https://github.com/' + username + (reponame ? '/' + reponame : ''); 28 | if (command.verbose) { 29 | console.log('URL:', url); 30 | process.exit(0); 31 | return 0; 32 | } 33 | xopen(url); 34 | process.exit(0); 35 | return 0; 36 | } 37 | 38 | // 5. git/hg/svn remote url. 39 | var uri = hgremote.getRemoteUrl({cwd: process.cwd()}); 40 | // 6. get openrc 41 | var config = getConfig(uri); 42 | command.scheme = config.scheme; 43 | command.protocol = config.protocol; 44 | // 6. resolve paths. 45 | url = gitresolve(uri, command); 46 | // 7. open 47 | if (command.verbose) { 48 | console.log('Option:', command); 49 | console.log('URL:', url); 50 | } else { 51 | xopen(url); 52 | } 53 | 54 | return 0; 55 | }); 56 | 57 | // 每天检查一次更新。 58 | var updateNotifier = require('update-notifier'); 59 | var pkg = require('../package.json'); 60 | 61 | updateNotifier({ 62 | pkg: pkg, 63 | updateCheckInterval: 1000 * 60 * 60 * 24, 64 | }).notify(); 65 | 66 | // vim:ft=javascript 67 | -------------------------------------------------------------------------------- /bin/open-commander.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var fs = require('fs'); 4 | var path = require('path'); 5 | var commander = require('commander'); 6 | // var inquirer = require('inquirer'); 7 | var gitremote = require('../lib/gitremote'); 8 | 9 | // resolve absolute path to relative path base repository root. 10 | function resolve(filepath, cwd, root) { 11 | return path.normalize(path.join(cwd, filepath)) 12 | .replace(root, ''); 13 | } 14 | 15 | // @param {argv} process.argv 16 | // @param {Object} option, current working branch name. 17 | // - {String} cwd: current working directory, 18 | // - {String} cwb: current working branch name. 19 | // - {String} root: git repo root directory. 20 | module.exports = function(argv, option, callback) { 21 | 22 | function parseFilePath(options, cpath) { 23 | try { 24 | var stat = fs.statSync(cpath); // throw error when cpath is not accessable. 25 | 26 | var filepath = resolve(cpath, option.cwd, option.root); 27 | if (stat.isFile()) { 28 | options.category = 'blob'; 29 | options.args = { 30 | cwd: path.dirname(filepath), 31 | path: filepath, 32 | }; 33 | return options; 34 | } else if (stat.isDirectory()) { 35 | options.category = 'tree'; 36 | options.args = { 37 | cwd: path.resolve(filepath, options.cwd), 38 | path: filepath, 39 | }; 40 | return options; 41 | } else { 42 | return null; 43 | } 44 | } catch (ex) { 45 | return null; 46 | } 47 | } 48 | 49 | commander 50 | .version(require('../package.json').version) 51 | .usage('[command] [options]') 52 | .option('-p, --path ', 'CWD path') 53 | .option('-b, --branch ', 'Specify branch, default is current working branch, also support alias `:branch`') 54 | .option('-r, --remote ', 'Goto remote in browser, default is `origin`.') 55 | .option('-v, --verbose', 'Print verbose information.') 56 | .on('--help', function() { 57 | console.log(' Local Commanders:'); 58 | console.log(); 59 | console.log(' issue [title] Open new issues with optional title'); 60 | console.log(' issues Open issues list page'); 61 | console.log(' #1 Open issues by id'); 62 | console.log(' pull Open new pull/merge request by given branch, default is current working branch. alias `pr`, `mr`.'); 63 | console.log(' pulls Open pull/merge request list page'); 64 | console.log(' !1 Open pull/merge request by id, alias `pr1`, `mr@1`, `pull#1`, support sparator `@`, `#`, `-`, `:`'); 65 | console.log(' {filepath} Open filepath by given branch, default is current working branch.'); 66 | console.log(' {directory} Open directory by given branch, default is current working branch.'); 67 | console.log(' wiki Open wiki page'); 68 | console.log(' commits Open commits list page, alias `ci`'); 69 | console.log(' blame Open file blame information page.'); 70 | console.log(' branches Open branches list page, alias `brs` and `branchs`'); 71 | console.log(' tags Open tags list page'); 72 | console.log(' milestones Open milestones list page'); 73 | console.log(' milestones#1 Open milestones by id'); 74 | console.log(' milestone Open new milestone'); 75 | console.log(' releases Open releases list page, alias `release`.'); 76 | console.log(' releases new Open new releases list page'); 77 | console.log(' releases edit Edit release by tag'); 78 | console.log(' network Open repository network page.'); 79 | console.log(' snippet Open new snippet on current repository\'s code hosting. support GitHub, GitLab, BitBucket.'); 80 | console.log(); 81 | console.log(' Global Commanders (out of repository directory):'); 82 | console.log(); 83 | console.log(' @lizzie Open lizzie\'s profile page'); 84 | console.log(' @hotoo/gitopen Open https://github.com/hotoo/gitopen repository homepage.'); 85 | console.log(' snippet Open new snippet on https://gist.github.com/'); 86 | console.log(); 87 | }) 88 | .parse(argv); 89 | 90 | var options = { 91 | category: 'home', 92 | cwd: commander.path ? path.dirname(commander.path) : option.cwd || process.cwd(), 93 | hash: commander.branch || option.cwb || 'master', 94 | remote: commander.remote, 95 | protocol: 'https', 96 | verbose: commander.verbose, 97 | }; 98 | 99 | // prepare processing branch alias like `:branch-name` 100 | for (var i = commander.args.length - 1; i >= 0; i--) { 101 | if (commander.args[i].indexOf(':') === 0) { 102 | var br = commander.args[i].substring(1); 103 | options.hash = br; 104 | commander.branch = br; 105 | commander.args.splice(i, 1); 106 | } 107 | } 108 | 109 | var RE_ISSUE_ID = /^#\d+$/; 110 | var RE_PR_ID = /^(?:!|(?:pr|mr)[\-:\/#@]?)(\d+)$/i; 111 | var RE_PROFILE = /^@([a-z0-9-_]+)(?:\/([a-z0-9\-_.]+)(?:#\d+|:\w+|\/\w+)?)?$/i; 112 | var RE_MILESTONE = /^milestones?[@\/:#\-](.+)$/i; 113 | var RE_GIST = /^(?:gist|snippet|snip)(?:@(.+))?$/i; 114 | // branch-a:branch-b 115 | // branch-a...branch-b 116 | var RE_BRANCH_COMPARE = /^(.*?)(?::|\.{3})(.*)$/; 117 | var RE_HASH = /^[0-9a-fA-F]{6,40}$/; 118 | 119 | var category = commander.args[0]; 120 | var match; 121 | 122 | switch (category) { 123 | case 'issue': 124 | options.category = 'issues/new'; 125 | options.args = { 126 | title: commander.args.slice(1).join(' '), 127 | }; 128 | break; 129 | case 'issues': 130 | options.category = 'issues'; 131 | break; 132 | case 'pr': 133 | case 'mr': 134 | case 'pull': 135 | options.category = 'pulls/new'; 136 | // current working branch name. 137 | if (commander.args.length === 1) { // gitopen pr 138 | options.args = { 139 | 'branch-B': option.cwb, 140 | }; 141 | } else if (commander.args.length === 2) { // gitopen pr branchName 142 | match = RE_BRANCH_COMPARE.exec(commander.args[1]); 143 | if (match) { // gitopen pr a...b 144 | options.args = { 145 | 'branch-A': match[1], 146 | 'branch-B': match[2] || option.cwb, 147 | }; 148 | } else { // gitopen pr branchName 149 | options.args = { 150 | 'branch-B': commander.args[1], 151 | }; 152 | } 153 | } else if (commander.args.length >= 3) { 154 | options.args = { 155 | 'branch-A': commander.args[1], 156 | 'branch-B': commander.args[2] || option.cwb, 157 | }; 158 | } 159 | 160 | if (!options.args['branch-A']) { 161 | var cwd = commander.cwd || process.cwd(); 162 | var remoteBranches = gitremote.getBaseBranches(cwd); 163 | var remoteBranchLength = remoteBranches.length; 164 | if (remoteBranchLength === 0) { 165 | console.log('Not found base branch, rebase it before create PR/MR.'); 166 | return; 167 | // remoteBranches = gitremote.getRemoteBranches(cwd) 168 | // .map(function(br) { 169 | // return br.name; 170 | // }) 171 | // .filter(function(name) { 172 | // return name !== option.cwb; 173 | // }); 174 | } 175 | // TODO: 目前这个分支走不到,后面获取所有的祖先分支列表时再供用户选择。 176 | // if (remoteBranchLength > 1) { 177 | // inquirer.prompt([{ 178 | // name: 'remoteBranch', 179 | // type: 'list', 180 | // message: 'Choose remote brance to compare:', 181 | // choices: remoteBranches, 182 | // }]).then(function(answers) { 183 | // options.args['branch-A'] = answers.remoteBranch; 184 | // return callback(options); 185 | // }); 186 | // return; 187 | // } 188 | options.args['branch-A'] = remoteBranches[0]; 189 | } 190 | 191 | break; 192 | case 'pulls': 193 | case 'prs': 194 | case 'mrs': 195 | options.category = 'pulls'; 196 | if (commander.args[1] === 'new') { 197 | options.category = 'pulls/new'; 198 | } 199 | break; 200 | case 'wiki': 201 | case 'wikis': 202 | options.category = 'wiki'; 203 | break; 204 | case 'tag': 205 | case 'tags': 206 | options.category = 'tags'; 207 | break; 208 | case 'milestone': 209 | options.category = 'milestones/new'; 210 | options.args = { 211 | title: commander.args.slice(1).join(' '), 212 | }; 213 | break; 214 | case 'milestones': 215 | options.category = 'milestones'; 216 | break; 217 | case 'release': 218 | case 'releases': 219 | options.category = 'releases'; 220 | if (commander.args[1] === 'new') { 221 | options.category = 'releases/new'; 222 | if (commander.args[2]) { 223 | options.category = 'releases/new-with-tag'; 224 | options.args = { 225 | tag: commander.args[2], 226 | }; 227 | } 228 | } else if (commander.args[1] === 'edit') { 229 | options.category = 'releases/edit/tag-id'; 230 | options.args = { 231 | tag: commander.args[2], 232 | }; 233 | } 234 | break; 235 | case 'network': 236 | options.category = 'network'; 237 | break; 238 | case 'ci': 239 | case 'commit': 240 | case 'cis': 241 | case 'commits': 242 | options.category = 'commits'; 243 | if (commander.branch) { 244 | options.cwb = option.cwb; 245 | options.category = 'commits-with-branch'; 246 | } 247 | break; 248 | case 'blame': 249 | options.category = 'blame'; 250 | options.branch = commander.branch || option.cwb; 251 | options.args = { 252 | path: commander.args[1], 253 | }; 254 | break; 255 | case 'brs': 256 | case 'branchs': 257 | case 'branches': 258 | options.category = 'branches'; 259 | break; 260 | case 'gist': 261 | case 'snip': 262 | case 'snippet': 263 | options.category = 'snippets/new'; 264 | options.args = { 265 | type: 'github', 266 | }; 267 | break; 268 | case undefined: // 未指定任何特定信息。 269 | options.category = 'home'; 270 | if (commander.branch) { 271 | options.category = 'tree'; 272 | options.args = { 273 | path: '', 274 | }; 275 | } 276 | break; 277 | default: 278 | var m; 279 | if (category.indexOf(':') === 0) { 280 | options.category = 'tree'; 281 | options.hash = category.substring(1); 282 | options.args = { 283 | path: '', 284 | }; 285 | } else if (RE_ISSUE_ID.test(category)) { 286 | options.category = 'issues/id'; 287 | options.args = { 288 | issue_id: category.substring(1), 289 | }; 290 | } else if ((m = RE_PR_ID.exec(category))) { 291 | options.category = 'pulls/id'; 292 | options.args = { 293 | pull_id: m[1], 294 | }; 295 | } else if ((m = RE_PROFILE.exec(category))) { 296 | var username = m[1]; 297 | var reponame = m[2]; 298 | options.category = 'profile'; 299 | options.args = { 300 | username: username, 301 | reponame: reponame, 302 | }; 303 | } else if ((m = RE_MILESTONE.exec(category))) { 304 | options.category = 'milestones/id'; 305 | options.args = { 306 | milestone_id: m[1], 307 | }; 308 | } else if ((m = RE_GIST.exec(category))) { 309 | options.category = 'snippets/new'; 310 | options.args = { 311 | type: m[1], 312 | }; 313 | } else if (RE_HASH.test(category)) { 314 | options.category = 'commit'; 315 | options.hash = category; 316 | } else { 317 | // FILE/DIR PATH 318 | if (!parseFilePath(options, category)) { 319 | console.error('Unknow category or path: ' + category); 320 | process.exit(1); 321 | } 322 | } 323 | } 324 | 325 | if (commander.path && !parseFilePath(options, commander.path)) { 326 | console.error('Unknow path: ' + commander.path); 327 | process.exit(1); 328 | } 329 | 330 | callback(options); 331 | }; 332 | -------------------------------------------------------------------------------- /bin/openrc.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var fs = require('fs'); 4 | var merge = require('deepmerge'); 5 | var path = require('path'); 6 | var child_process = require('child_process'); 7 | var yaml = require('js-yaml'); 8 | var gitresolve = require('../lib/index'); 9 | var DEFAULT_CONFIG = require('../lib/gitopenrc'); 10 | 11 | function getUserHome() { 12 | return process.env[(process.platform === 'win32') ? 'USERPROFILE' : 'HOME']; 13 | } 14 | 15 | var $HOME = getUserHome(); 16 | 17 | /** 18 | * 获取 gitopen 配置。 19 | * @param {String} uri Git remote 地址。 20 | * @param {Object} options gitopen 传入的配置,例如当前目录 cwd。 21 | * @return {Object} 返回 gitopen 配置信息。 22 | */ 23 | function openrc(uri, options) { 24 | var HOSTNAME = gitresolve.parse(uri).hostname; 25 | var config = DEFAULT_CONFIG[HOSTNAME]; 26 | 27 | // 命中内置的 gitopenrc 中对应域名的配置,直接返回。 28 | if (config) { 29 | return { 30 | type: config.type, 31 | scheme: require('../lib/scheme/' + DEFAULT_CONFIG[HOSTNAME].type), 32 | protocol: config.protocol, 33 | }; 34 | } 35 | 36 | // get config from ~/.gitopenrc 37 | var gitopenConfig = {}; 38 | var gitopenrc = path.join($HOME, '.gitopenrc'); 39 | if (fs.existsSync(gitopenrc)) { 40 | try { 41 | config = yaml.load(fs.readFileSync(gitopenrc, 'utf8')); 42 | Object.keys(config).some(function(hostname) { 43 | if (HOSTNAME === hostname) { 44 | gitopenConfig.protocol = config[hostname].protocol || 'https'; 45 | var type = config[hostname].type; 46 | // oschina 更名为 gitee,做兼容,用户可以保持配置为 oschina 47 | if (type === 'oschina') { 48 | type = 'gitee'; 49 | console.warn('The type of "oschina" is deprecated, please use "gitee" in ~/.gitopenrc file.'); 50 | } else if (type === 'csdn') { 51 | type = 'gitcode'; 52 | console.warn('The type of "csdn" is deprecated, please use "gitcode" in ~/.gitopenrc file.'); 53 | } 54 | gitopenConfig.type = type; 55 | if (type === 'custom') { 56 | // 完全自定义类型的 gitopen 57 | gitopenConfig.scheme = config[hostname].scheme || {}; 58 | } else { 59 | // 内置类型的 gitopen 配置,但是可以覆盖部分 scheme 配置。 60 | var gitopenConfigScheme = require('../lib/scheme/' + type); 61 | gitopenConfig.scheme = merge(merge({}, gitopenConfigScheme), config[hostname].scheme); 62 | } 63 | return true; 64 | } 65 | return false; 66 | }); 67 | } catch (ex) { 68 | console.error('Read %s error: %s', gitopenrc, ex.message); 69 | return process.exit(1); 70 | } 71 | } 72 | 73 | let gitConfig = {}; 74 | var cwd = options.cwd || process.cwd(); 75 | 76 | // parse config from global .gitconfig 77 | try { 78 | child_process.execSync( 79 | 'git config --list --global | grep "^gitopen\\.' + HOSTNAME.replace(/\./g, '\\.') + '\\."', 80 | {cwd: cwd} 81 | ).toString().trim().split(/\r\n|\r|\n/).forEach(item => { 82 | var kv = item.split('='); 83 | if (kv.length < 2) { return; } 84 | var key = kv.shift().trim().replace('gitopen.' + HOSTNAME + '.', ''); 85 | var val = kv.join('=').trim(); 86 | gitConfig[key] = val; 87 | }); 88 | } catch (ex) { /* */ } 89 | 90 | // parse config from local repo .gitconfig 91 | try { 92 | child_process.execSync( 93 | 'git config --list --local | grep "^gitopen\\."', 94 | {cwd: cwd} 95 | ).toString().trim().split(/\r\n|\r|\n/).forEach(item => { 96 | var kv = item.split('='); 97 | if (kv.length < 2) { return; } 98 | var key = kv.shift().trim().replace(/^gitopen\./, ''); 99 | var val = kv.join('=').trim(); 100 | gitConfig[key] = val; 101 | }); 102 | } catch (ex) { /* */ } 103 | 104 | // 当 .gitopenrc 中定义为 type=custom,.gitconfig 中定义 type!=custom 时, 105 | // 将 schema 改回 .gitconfig 中定义的 scheme 配置。 106 | var type = gitConfig.type; 107 | if (type && type !== 'custom') { 108 | // oschina 更名为 gitee,做兼容,用户可以保持配置为 oschina 109 | if (type === 'oschina') { 110 | type = 'gitee'; 111 | console.warn('The type of "oschina" is deprecated, please use "gitee" in git config.'); 112 | console.warn('Try to execute command "git config gitopen.type gitee" in terminal.'); 113 | } else if (type === 'csdn') { 114 | type = 'gitcode'; 115 | console.warn('The type of "csdn" is deprecated, please use "gitcode" in git config.'); 116 | console.warn('Try to execute command "git config gitopen.type gitcode" in terminal.'); 117 | } 118 | gitConfig.scheme = require('../lib/scheme/' + type); 119 | } 120 | 121 | // 优先使用 gitopenConfig 的配置。 122 | const mergeConfig = merge(merge({}, gitConfig), gitopenConfig); 123 | 124 | if (!mergeConfig.type) { 125 | console.error('Not found gitopen configs.'); 126 | console.error('Please read [Configuration](https://github.com/hotoo/gitopen#configuration) for more information.'); 127 | process.exit(1); 128 | } 129 | 130 | return mergeConfig; 131 | } 132 | 133 | module.exports = openrc; 134 | -------------------------------------------------------------------------------- /bin/svnopen: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 'use strict'; 3 | 4 | var commander = require('commander'); 5 | var child_process = require('child_process'); 6 | var xopen = require('../lib/xopen'); 7 | 8 | commander 9 | .version(require('../package.json').version) 10 | .option('-v, --verbose', 'Print verbose information.') 11 | .parse(process.argv); 12 | 13 | function svnremote(cwd) { 14 | var m = child_process.execSync( 15 | 'svn info', 16 | {cwd: cwd} 17 | ).toString().match(/^URL: (.+)/m); 18 | return m ? m[1] : ''; 19 | } 20 | 21 | var url = svnremote(process.cwd()); 22 | if (url) { 23 | xopen(url, commander); 24 | } else { 25 | console.error('Can not resolve svn remote url.'); 26 | } 27 | 28 | // 每天检查一次更新。 29 | var updateNotifier = require('update-notifier'); 30 | var pkg = require('../package.json'); 31 | 32 | updateNotifier({ 33 | pkg: pkg, 34 | updateCheckInterval: 1000 * 60 * 60 * 24, 35 | }).notify(); 36 | 37 | // vim:ft=javascript 38 | -------------------------------------------------------------------------------- /demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/gitopen/b038a19e38f64fc99c33789e92d1d66a794a7295/demo.gif -------------------------------------------------------------------------------- /lib/gitopenrc: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | "github.com": { 3 | protocol: "https", 4 | type: "github" 5 | }, 6 | "gitlab.com": { 7 | protocol: "https", 8 | type: "gitlab" 9 | }, 10 | "bitbucket.org": { 11 | protocol: "https", 12 | type: "bitbucket" 13 | }, 14 | "gitee.com": { 15 | protocol: "https", 16 | type: "gitee" 17 | }, 18 | "git.oschina.net": { 19 | protocol: "https", 20 | type: "gitee" 21 | }, 22 | "coding.com": { 23 | protocol: "https", 24 | type: "coding" 25 | }, 26 | "gitcode.net": { 27 | protocol: "https", 28 | type: "gitcode" 29 | }, 30 | "code.csdn.net": { 31 | protocol: "https", 32 | type: "gitcode" 33 | }, 34 | "code.alipay.com": { 35 | protocol: "https", 36 | type: "antcode" 37 | }, 38 | }; 39 | -------------------------------------------------------------------------------- /lib/gitremote.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var child_process = require('child_process'); 4 | 5 | /** 6 | * 获取 remote name。 7 | * remote 不同,URL 就完全不同,后面所有的配置等都会受影响。 8 | * @param {Object} options 参数配置 9 | * @return {String} remote name 10 | */ 11 | exports.getRemoteName = function(options) { 12 | if (!options) { 13 | options = {}; 14 | } 15 | if (options.remote) { 16 | return options.remote; 17 | } 18 | try { 19 | return child_process.execSync( 20 | 'git config gitopen.remote', 21 | { cwd: options.cwd || process.cwd() } 22 | ).toString().trim() || 'origin'; 23 | } catch (ex) { 24 | return 'origin'; 25 | } 26 | }; 27 | 28 | exports.getRemoteUrl = function getRemoteUrl(options) { 29 | if (!options) { 30 | options = {}; 31 | } 32 | var cwd = options.cwd || process.cwd(); 33 | var uri = child_process.execSync( 34 | 'git config remote.' + (options.remote || 'origin') + '.url', 35 | {cwd: cwd} 36 | ).toString().trim(); 37 | 38 | if (!uri) { 39 | throw new Error('Can not get remote url from dir: ' + cwd); 40 | } 41 | 42 | return uri; 43 | }; 44 | 45 | exports.getCurrentBranch = function getCurrentBranch(cwd) { 46 | var cmds = [ 47 | 'git symbolic-ref --short HEAD', 48 | 'git rev-parse --abbrev-ref HEAD', 49 | ]; 50 | for (var i = 0, l = cmds.length; i < l; i++) { 51 | try { 52 | var out = child_process.execSync(cmds[i], {cwd: cwd}) 53 | .toString().trim(); 54 | if (out.indexOf('fatal: ') === 0) { 55 | return null; 56 | } 57 | return out; 58 | } catch (ex) { /* */ } 59 | } 60 | return null; 61 | }; 62 | 63 | exports.getGitRootPath = function(cwd) { 64 | try { 65 | return child_process.execSync('git rev-parse --show-toplevel', {cwd: cwd}) 66 | .toString().trim(); 67 | } catch (ex) { 68 | return null; 69 | } 70 | }; 71 | 72 | var RE_REMOTE_BRANCH_NAME = /^(\w+)\/(.+)/; // "origin/branch-name" 73 | exports.getRemoteBranches = function(cwd) { 74 | var remoteBranches = child_process.execSync( 75 | 'git branch -r', 76 | {cwd: cwd} 77 | ).toString() 78 | .trim() 79 | .split(/\r\n|\r|\n/) 80 | .filter(function(branchName) { 81 | return branchName && 82 | branchName.indexOf(' -> ') === -1; // ` origin/HEAD -> origin/master` 83 | }) 84 | .map(function(branchName) { 85 | var br = branchName.trim(); 86 | var m = RE_REMOTE_BRANCH_NAME.exec(br); 87 | return { 88 | fullName: br, 89 | remote: m[1], 90 | name: m[2], 91 | }; 92 | }); 93 | return remoteBranches; 94 | }; 95 | 96 | var RE_CURRENT_BASE_BRANCHES = /^[ -+]*\*/; 97 | var RE_BASE_BRANCHE_NAME = /.*?\[([^\]\^~]+).*/; // " +* [MS170216105211~2^2] test: fixed lint" 98 | exports.getBaseBranches = function(cwd) { 99 | var cwb = exports.getCurrentBranch(cwd); 100 | var baseBranches = child_process.execSync( 101 | 'git show-branch --no-color', 102 | {cwd: cwd} 103 | ).toString() 104 | .trim() 105 | .split(/\r\n|\r|\n/) 106 | .filter(function(line) { 107 | return RE_CURRENT_BASE_BRANCHES.test(line); 108 | }) 109 | .map(function(line) { 110 | var m = RE_BASE_BRANCHE_NAME.exec(line); 111 | return m ? m[1] : null; 112 | }) 113 | .filter(function(branchName) { 114 | return branchName !== cwb; 115 | }); 116 | // TODO: 获取当前分支的所有祖先分支列表,并按照倒序排列,最近切出的祖先分支排第一。 117 | return baseBranches.length >= 0 ? [baseBranches[0]] : []; 118 | // return unique(baseBranches); 119 | }; 120 | 121 | // 转义分支名称。 122 | // 直接 encodeURIComponent 会将 `/` 也进行转换。 123 | // @param {String} branchName: 分支名称。 124 | // @return {String} 转义后的分支名称。 125 | exports.encodeBranchName = function(branchName) { 126 | return encodeURIComponent(branchName).replace(/%2F/g, '/'); 127 | }; 128 | 129 | // function unique(array) { 130 | // return array.filter(function(item, index) { 131 | // var firstIndex = array.indexOf(item); 132 | // return firstIndex === index; 133 | // }); 134 | // } 135 | -------------------------------------------------------------------------------- /lib/hgremote.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var child_process = require('child_process'); 4 | 5 | exports.getRemoteUrl = function getRemoteUrl(options) { 6 | if (!options) { 7 | options = {}; 8 | } 9 | var cwd = options.cwd || process.cwd(); 10 | var uri = child_process.execSync( 11 | 'hg paths ' + (options.remote || 'default'), 12 | {cwd: cwd} 13 | ).toString().trim(); 14 | 15 | if (!uri) { 16 | throw new Error('Can not get remote url from dir: ' + cwd); 17 | } 18 | 19 | return uri; 20 | }; 21 | 22 | exports.getCurrentBranch = function getCurrentBranch(cwd) { 23 | try { 24 | return child_process.execSync('hg branch', {cwd: cwd}) 25 | .toString().trim(); 26 | } catch (ex) { 27 | return null; 28 | } 29 | }; 30 | 31 | exports.getHgRootPath = function(cwd) { 32 | try { 33 | return child_process.execSync('hg root', {cwd: cwd}) 34 | .toString().trim(); 35 | } catch (ex) { 36 | return null; 37 | } 38 | }; 39 | -------------------------------------------------------------------------------- /lib/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var merge = require('deepmerge'); 4 | var gitremote = require('./gitremote'); 5 | 6 | var DEFAULT_OPTIONS = { 7 | hash: 'master', 8 | protocol: 'https', 9 | remote: 'origin', 10 | scheme: { 11 | base: '{protocol}://{hostname}/{username}/{reponame}', 12 | }, 13 | }; 14 | 15 | var RE_URL = /^https?:\/\//i; 16 | // git@hostname:username/reponame.git 17 | var RE_SCP_URL = /^git@([^:]+):([^\/]+)\/(.+?)(?:\.git)?$/i; 18 | // git://hostname/username/reponame.git 19 | var RE_GIT_URL = /^git:\/\/([^\/]+)\/([^\/]+)\/(.+?)(?:\.git)?$/i; 20 | // ssh://hostname/username/reponame.git 21 | // ssh://hg@hostname/username/reponame.git 22 | var RE_SSH_URL = /^ssh:\/\/(?:[^@]+@)?([^\/]+)\/([^\/]+)\/(.+?)(?:\.git)?$/i; 23 | // https://hostname/username/reponame.git 24 | // https://hg@hostname/username/reponame.git 25 | var RE_HTTP_URL = /^https?:\/\/(?:[a-z0-9-_.]+@)?([^\/]+)\/([^\/]+)\/(.+?)(?:\.git)?$/i; 26 | 27 | // Parse git remote url,hg paths, or svn url. 28 | // @param {String} uri: 29 | // 30 | // ssh://github.com/hotoo/gitopen 31 | // git://github.com/hotoo/gitopen 32 | // git@github.com:hotoo/gitopen 33 | // ... 34 | function parse(uri) { 35 | var match = RE_SCP_URL.exec(uri) || 36 | RE_GIT_URL.exec(uri) || 37 | RE_SSH_URL.exec(uri) || 38 | RE_HTTP_URL.exec(uri); 39 | 40 | if (!match) { 41 | throw new Error('Can not resolve url: ' + uri); 42 | } 43 | 44 | return { 45 | hostname: match[1], 46 | username: match[2], 47 | reponame: match[3], 48 | }; 49 | } 50 | 51 | function resolve(uri, options) { 52 | options = merge(DEFAULT_OPTIONS, options); 53 | var protocol = options.protocol || 'https'; 54 | var parsedUri = parse(uri); 55 | 56 | return options.scheme.base.replace('{protocol}', protocol) 57 | .replace('{hostname}', parsedUri.hostname) 58 | .replace('{username}', parsedUri.username) 59 | .replace('{reponame}', parsedUri.reponame); 60 | } 61 | 62 | module.exports = function(uri, options) { 63 | options = merge(DEFAULT_OPTIONS, options); 64 | var url = resolve(uri, options); 65 | var scheme = options.scheme || require('./scheme/github'); 66 | var path = ''; 67 | 68 | switch (options.category) { 69 | case 'issues': 70 | path = scheme.issues; 71 | break; 72 | case 'issues/id': 73 | path = scheme['issues/id'] 74 | .replace('{issue-id}', options.args.issue_id); 75 | break; 76 | case 'issues/new': 77 | if (options.args && options.args.title) { 78 | path = scheme['issues/new?title'].replace('{title}', encodeURIComponent(options.args.title)); 79 | } else { 80 | path = scheme['issues/new']; 81 | } 82 | break; 83 | case 'mrs': 84 | case 'prs': 85 | case 'pulls': 86 | path = scheme.pulls; 87 | break; 88 | case 'pulls/new': 89 | if (options.args) { 90 | var branchA = gitremote.encodeBranchName(options.args['branch-A']); 91 | var branchB = gitremote.encodeBranchName(options.args['branch-B']); 92 | if (options.args['branch-A']) { 93 | path = scheme['pulls/new-with-base-branch'] 94 | .replace('{branch-A}', branchA) 95 | .replace('{branch-B}', branchB); 96 | } else if (options.args['branch-B']) { 97 | path = scheme['pulls/new-with-compare-branch'] 98 | .replace('{branch-A}', branchA) 99 | .replace('{branch-B}', branchB); 100 | } 101 | } else { 102 | path = scheme['pulls/new']; 103 | } 104 | break; 105 | case 'pulls/id': 106 | path = scheme['pulls/id'] 107 | .replace('{pull-id}', options.args.pull_id); 108 | break; 109 | case 'wiki': 110 | path = scheme.wiki; 111 | break; 112 | case 'milestones/new': 113 | path = scheme['milestones/new']; 114 | break; 115 | case 'milestones/id': 116 | path = scheme['milestones/id'].replace('{milestone-id}', encodeURIComponent(options.args.milestone_id)); 117 | break; 118 | case 'milestones': 119 | path = scheme.milestones; 120 | break; 121 | case 'tags': 122 | path = scheme.tags; 123 | break; 124 | case 'releases': 125 | path = scheme.releases; 126 | break; 127 | case 'releases/new': 128 | path = scheme['releases/new']; 129 | break; 130 | case 'releases/new-with-tag': 131 | path = scheme['releases/new-with-tag'] 132 | .replace('{tag}', options.args.tag); 133 | break; 134 | case 'releases/edit/tag-id': 135 | path = scheme['releases/edit/tag-id'] 136 | .replace('{tag}', options.args.tag); 137 | break; 138 | case 'network': 139 | path = scheme.network; 140 | break; 141 | case 'commit': 142 | path = scheme['commit'] 143 | .replace('{hash}', options.hash); 144 | break; 145 | case 'commits': 146 | path = scheme.commits; 147 | if (options.type === 'gitlab') { 148 | path = scheme['commits-with-branch'] 149 | .replace('{branch-name}', gitremote.encodeBranchName(options.cwb || options.hash)); 150 | } 151 | break; 152 | case 'commits-with-branch': 153 | path = scheme['commits-with-branch'] 154 | .replace('{branch-name}', gitremote.encodeBranchName(options.branch)); 155 | break; 156 | case 'blame': 157 | path = scheme.blame.replace('{branch-name}', options.branch) 158 | .replace('{path}', options.args.path); 159 | break; 160 | case 'brs': 161 | case 'branchs': 162 | case 'branches': 163 | path = scheme['branches']; 164 | break; 165 | case 'tree': 166 | path = scheme.tree.replace(/\{hash\}/g, options.hash) 167 | .replace('{path}', options.args.path); 168 | break; 169 | case 'blob': 170 | path = scheme.blob.replace(/\{hash\}/g, options.hash) 171 | .replace('{path}', options.args.path); 172 | break; 173 | case 'home': 174 | path = scheme.home; 175 | break; 176 | case 'snippets/new': 177 | var snippets_uri = parse(uri, options); 178 | path = scheme['snippets/new'].replace('{protocol}', snippets_uri.protocol || options.protocol || 'https') 179 | .replace('{hostname}', snippets_uri.hostname); 180 | break; 181 | default: 182 | path = ''; 183 | if (options.hash !== 'master') { 184 | path = scheme.tree.replace('{hash}', options.hash); 185 | } 186 | break; 187 | } 188 | // if (options.path) { 189 | // path += options.path; 190 | // } 191 | return RE_URL.test(path) ? path : url + path; 192 | }; 193 | 194 | module.exports.parse = parse; 195 | module.exports.resolve = resolve; 196 | -------------------------------------------------------------------------------- /lib/scheme/antcode.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | module.exports = { 3 | 'base': '{protocol}://{hostname}/{username}/{reponame}', 4 | 'home': '', 5 | 'issues': '', 6 | 'issues/id': '', 7 | 'issues/new': '', 8 | 'issues/new?title': '', 9 | 'wiki': '', 10 | 'network': '', 11 | 'tree': '/tree/{hash}{path}', 12 | 'blob': '/blob/{hash}{path}', 13 | 'commit': '/commit/{hash}', 14 | 'commits': '/commits', 15 | 'commits-with-branch': '/commits/{branch-name}', 16 | 'blame': '/commits/{branch-name}/{path}', 17 | 'branches': '/branches', 18 | 'milestones': '/tags', 19 | 'milestones/new': '/tags', 20 | 'milestones/id': '/tags', 21 | 'tags': '/tags', 22 | 'releases': '/tags', 23 | 'releases/new': '/tags', 24 | 'releases/new-with-tag': '/tags', 25 | 'releases/edit/tag-id': '/tags', 26 | 'pulls': '/pull_requests', 27 | 'pulls/id': '/pull_requests/{pull-id}', 28 | 'pulls/new': '/pull_requests/new?source_branch={branch-B}&target_branch={branch-A}', 29 | 'pulls/new-with-compare-branch': '/pull_requests/new?source_branch={branch-B}&target_branch={branch-A}', 30 | 'pulls/new-with-base-branch': '/pull_requests/new?source_branch={branch-B}&target_branch={branch-A}', 31 | 'snippets/new': '{protocol}://{hostname}/snippets/new', 32 | }; 33 | -------------------------------------------------------------------------------- /lib/scheme/bitbucket.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | module.exports = { 3 | 'base': '{protocol}://{hostname}/{username}/{reponame}', 4 | 'home': '', 5 | 'issues': '/issues', 6 | 'issues/id': '/issues/{issue-id}', 7 | 'issues/new': '/issues/new', 8 | 'issues/new?title': '/issues/new?title={title}', 9 | 'wiki': '/wiki', 10 | 'network': '/network', 11 | 'tree': '/src/{hash}{path}?at={hash}', 12 | 'blob': '/src/{hash}{path}?at={hash}', 13 | 'commit': '/commits/{hash}', 14 | 'commits': '/commits', 15 | 'commits-with-branch': '/commits/{branch-name}', 16 | 'blame': '/annotate/blame/{branch-name}/{path}?at={branch-name}&fileviewer=file-view-default', 17 | 'branches': '/branches/', 18 | 'milestones': '/admin/issues/milestones', 19 | 'milestones/new': '/admin/issues/milestones', 20 | 'milestones/id': '/issues?milestone={milestone-id}&status=open&status=new', 21 | 'tags': '/tags', 22 | 'releases': '/releases', 23 | 'releases/new': '/releases/new', 24 | 'releases/new-with-tag': '/releases/new?tag={tag}', 25 | 'releases/edit/tag-id': '/releases/edit/{tag}', 26 | 'pulls': '/pull-requests/', 27 | 'pulls/id': '/pull-requests/{pull-id}', 28 | 'pulls/new': '/pull-requests/new', 29 | 'pulls/new-with-compare-branch': '/pull-requests/new?source={branch-B}&t=1', 30 | 'pulls/new-with-base-branch': '/pull-requests/new?source={branch-B}&dest={branch-A}&t=1', 31 | 'snippets/new': '{protocol}://{hostname}/snippets/new', 32 | }; 33 | -------------------------------------------------------------------------------- /lib/scheme/coding.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | module.exports = { 3 | 'base': '{protocol}://coding.net/u/{username}/p/{reponame}', 4 | 'home': '/git', 5 | 'issues': '/topic', 6 | 'issues/id': '/topic/{issue-id}', 7 | 'issues/new': '/topic/new', 8 | 'issues/new?title': '/topic/new?title={title}', 9 | 'wiki': '/wiki', 10 | 'network': '/git/graph', 11 | 'tree': '/git/tree/{hash}', 12 | 'blob': '/git/blob/{hash}', 13 | 'commit': '/commit/{hash}', 14 | 'commits': '/git/commits', 15 | 'commits-with-branch': '/git/commits/{branch-name}', 16 | 'blame': '/blame/{branch-name}/{path}', 17 | 'branches': '/git/branches', 18 | 'milestones': '/milestones', 19 | 'milestones/new': '/milestones/new', 20 | 'milestones/id': '/milestones/{milestone-id}', 21 | 'tags': '/git/tags', 22 | 'releases': '/git/releases', 23 | 'releases/new': '/git/releases/new', 24 | 'releases/new-with-tag': '/git/releases/new?tag={tag}', 25 | 'releases/edit/tag-id': '/git/releases/edit/{tag}', 26 | 'pulls': '/git/pulls', 27 | 'pulls/id': '/git/pulls/{pull-id}', 28 | 'pulls/new': '/git/compare', 29 | 'pulls/new-with-compare-branch': '/git/compare/{branch-B}', 30 | 'pulls/new-with-base-branch': '/git/compare/{branch-A}...{branch-B}', 31 | 'snippets/new': 'https://gist.github.com/', 32 | }; 33 | -------------------------------------------------------------------------------- /lib/scheme/gitcode.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | module.exports = { 3 | 'base': '{protocol}://{hostname}/{username}/{reponame}', 4 | 'home': '', 5 | 'issues': '/-/issues', 6 | 'issues/id': '/-/issues/{issue-id}', 7 | 'issues/new': '/-/issues/new', 8 | 'issues/new?title': '/-/issues/new?title={title}', 9 | 'wiki': '/-/wikis', 10 | 'network': '/graph', 11 | 'tree': '/-/tree/{hash}{path}', 12 | 'blob': '/-/blob/{hash}{path}', 13 | 'commit': '/-/commit/{hash}', 14 | 'commits': '/-/commits', 15 | 'commits-with-branch': '/-/commits/{branch-name}', 16 | 'blame': '/-/blame/{branch-name}/{path}', 17 | 'branches': '/-/branches', 18 | 'milestones': '/-/milestones', 19 | 'milestones/new': '/-/milestones/new', 20 | 'milestones/id': '/-/milestones/{milestone-id}', 21 | 'tags': '/-/tags', 22 | 'releases': '', 23 | 'releases/new': '', 24 | 'releases/new-with-tag': '', 25 | 'releases/edit/tag-id': '', 26 | 'pulls': '/-/merge_requests', 27 | 'pulls/id': '/-/merge_requests/{pull-id}', 28 | 'pulls/new': '/-/compare', 29 | 'pulls/new-with-compare-branch': '/-/compare/{branch-B}?expand=1', 30 | 'pulls/new-with-base-branch': '/-/compare/{branch-A}...{branch-B}', 31 | 'snippets/new': '', 32 | }; 33 | -------------------------------------------------------------------------------- /lib/scheme/gitea.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | module.exports = { 3 | 'base': '{protocol}://{hostname}/{username}/{reponame}', 4 | 'home': '', 5 | 'issues': '/issues', 6 | 'issues/id': '/issues/{issue-id}', 7 | 'issues/new': '/issues/new', 8 | 'issues/new?title': '/issues/new?title={title}', 9 | 'wiki': '/wiki', 10 | 'network': '/activity', 11 | 'tree': '/src/branch/{hash}{path}', 12 | 'blob': '/src/branch/{hash}{path}', 13 | 'commit': '/commit/{hash}', 14 | 'commits': '/commits/branch/{branch-name}', 15 | 'commits-with-branch': '/commits/branch/{branch-name}', 16 | 'blame': '/blame/branch/{branch-name}/{path}', 17 | 'branches': '/branches', 18 | 'milestones': '/milestones', 19 | 'milestones/new': '/milestones/new', 20 | 'milestones/id': '/issues?q=milestone%3A{milestone-id}', 21 | 'tags': '/tags', 22 | 'releases': '/releases', 23 | 'releases/new': '/releases/new', 24 | 'releases/new-with-tag': '/releases/new?tag={tag}', 25 | 'releases/edit/tag-id': '/releases/edit/{tag}', 26 | 'pulls': '/pulls', 27 | 'pulls/id': '/pulls/{pull-id}', 28 | 'pulls/new': '/compare', 29 | 'pulls/new-with-compare-branch': '/compare/{branch-B}?expand=1', 30 | 'pulls/new-with-base-branch': '/compare/{branch-A}...{branch-B}?expand=1', 31 | 'snippets/new': '', 32 | }; 33 | -------------------------------------------------------------------------------- /lib/scheme/gitee.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | module.exports = { 3 | 'base': '{protocol}://{hostname}/{username}/{reponame}', 4 | 'home': '', 5 | 'issues': '/issues', 6 | 'issues/id': '/issues/{issue-id}', 7 | 'issues/new': '/issues/new', 8 | 'issues/new?title': '/issues/new?title={title}', 9 | 'wiki': '/wikis/home', 10 | 'network': '/network', 11 | 'tree': '/tree/{hash}{path}', 12 | 'blob': '/blob/{hash}{path}', 13 | 'commit': '/commit/{hash}', 14 | 'commits': '/commits/master', 15 | 'commits-with-branch': '/commits/{branch-name}', 16 | 'blame': '/blame/{branch-name}/{path}', 17 | 'branches': '/branches', 18 | 'milestones': '/milestones', 19 | 'milestones/new': '/milestones/new', 20 | 'milestones/id': '/milestones/{milestone-id}', 21 | 'tags': '/tags', 22 | 'releases': '/releases', 23 | 'releases/new': '/releases/new', 24 | 'releases/new-with-tag': '/releases/new?tag={tag}', 25 | 'releases/edit/tag-id': '/releases/edit/{tag}', 26 | 'pulls': '/pulls', 27 | 'pulls/id': '/pulls/{pull-id}', 28 | 'pulls/new': '/compare', 29 | 'pulls/new-with-compare-branch': '/compare/{branch-B}?expand=1', 30 | 'pulls/new-with-base-branch': '/compare/{branch-A}...{branch-B}', 31 | 'snippets/new': '{protocol}://{hostname}/snippets/new', 32 | }; 33 | -------------------------------------------------------------------------------- /lib/scheme/github.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | module.exports = { 3 | 'base': '{protocol}://{hostname}/{username}/{reponame}', 4 | 'home': '', 5 | 'issues': '/issues', 6 | 'issues/id': '/issues/{issue-id}', 7 | 'issues/new': '/issues/new', 8 | 'issues/new?title': '/issues/new?title={title}', 9 | 'wiki': '/wiki', 10 | 'network': '/network', 11 | 'tree': '/tree/{hash}{path}', 12 | 'blob': '/blob/{hash}{path}', 13 | 'commit': '/commit/{hash}', 14 | 'commits': '/commits', 15 | 'commits-with-branch': '/commits/{branch-name}', 16 | 'blame': '/blame/{branch-name}/{path}', 17 | 'branches': '/branches', 18 | 'milestones': '/milestones', 19 | 'milestones/new': '/milestones/new', 20 | 'milestones/id': '/issues?q=milestone%3A{milestone-id}', 21 | 'tags': '/tags', 22 | 'releases': '/releases', 23 | 'releases/new': '/releases/new', 24 | 'releases/new-with-tag': '/releases/new?tag={tag}', 25 | 'releases/edit/tag-id': '/releases/edit/{tag}', 26 | 'pulls': '/pulls', 27 | 'pulls/id': '/pull/{pull-id}', 28 | 'pulls/new': '/compare', 29 | 'pulls/new-with-compare-branch': '/compare/{branch-B}?expand=1', 30 | 'pulls/new-with-base-branch': '/compare/{branch-A}...{branch-B}?expand=1', 31 | 'snippets/new': '{protocol}://gist.{hostname}/', 32 | }; 33 | -------------------------------------------------------------------------------- /lib/scheme/gitlab.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | module.exports = { 3 | 'base': '{protocol}://{hostname}/{username}/{reponame}', 4 | 'home': '', 5 | 'issues': '/issues', 6 | 'issues/id': '/issues/{issue-id}', 7 | 'issues/new': '/issues/new', 8 | 'issues/new?title': '/issues/new?title={title}', 9 | 'wiki': '/wikis/home', 10 | 'network': '/network', 11 | 'tree': '/tree/{hash}{path}', 12 | 'blob': '/blob/{hash}{path}', 13 | 'commit': '/commit/{hash}', 14 | 'commits': '/commits', 15 | 'commits-with-branch': '/commits/{branch-name}', 16 | 'blame': '/blame/{branch-name}/{path}', 17 | 'branches': '/branches', 18 | 'milestones': '/milestones', 19 | 'milestones/new': '/milestones/new', 20 | 'milestones/id': '/milestones/{milestone-id}', 21 | 'tags': '/tags', 22 | 'releases': '/tags', 23 | 'releases/new': '/tags/new', 24 | 'releases/new-with-tag': '/tags/new?tag_name={tag}', 25 | 'releases/edit/tag-id': '/tags', 26 | 'pulls': '/merge_requests', 27 | 'pulls/id': '/merge_requests/{pull-id}', 28 | 'pulls/new': '/merge_requests/new', 29 | 'pulls/new-with-compare-branch': '/merge_requests/new?merge_request%5Bsource_branch%5D={branch-B}', 30 | 'pulls/new-with-base-branch': '/merge_requests/new?merge_request%5Bsource_branch%5D={branch-B}&merge_request%5Btarget_branch%5D={branch-A}', 31 | 'snippets/new': '{protocol}://{hostname}/snippets/new', 32 | }; 33 | -------------------------------------------------------------------------------- /lib/xopen.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var child_process = require('child_process'); 4 | 5 | function escapeCommand(url) { 6 | return url.replace(/&/g, '\\&') 7 | .replace(/\?/g, '\\?') 8 | .replace(/=/g, '\\='); 9 | } 10 | 11 | module.exports = function open(url, options) { 12 | if (!options) { 13 | options = {}; 14 | } 15 | 16 | var shell; 17 | 18 | if (options.verbose) { 19 | console.log('URL:', url); 20 | } 21 | 22 | switch (process.platform) { 23 | case 'win32': 24 | case 'win64': 25 | shell = 'start'; 26 | break; 27 | case 'unix': 28 | case 'linux': 29 | shell = 'xdg-open'; 30 | break; 31 | // case 'darwin': 32 | default: 33 | shell = 'open'; 34 | } 35 | 36 | child_process.execSync(shell + ' ' + escapeCommand(url)); 37 | }; 38 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gitopen", 3 | "version": "3.3.0", 4 | "description": "Open git remote url in web browser from terminal.", 5 | "main": "lib/index.js", 6 | "bin": { 7 | "gitopen": "bin/gitopen", 8 | "svnopen": "bin/svnopen", 9 | "hgopen": "bin/hgopen" 10 | }, 11 | "scripts": { 12 | "test": "make test", 13 | "lint": "eslint --fix bin lib test" 14 | }, 15 | "repository": { 16 | "type": "git", 17 | "url": "https://github.com/hotoo/gitopen.git" 18 | }, 19 | "keywords": [ 20 | "git", 21 | "svn", 22 | "hg", 23 | "open", 24 | "browser", 25 | "remote" 26 | ], 27 | "author": "闲耘 ", 28 | "license": "MIT", 29 | "bugs": { 30 | "url": "https://github.com/hotoo/gitopen/issues" 31 | }, 32 | "homepage": "https://github.com/hotoo/gitopen", 33 | "dependencies": { 34 | "commander": "^2.8.1", 35 | "deepmerge": "^4.2.2", 36 | "inquirer": "^8.2.2", 37 | "js-yaml": "^4.1.0", 38 | "update-notifier": "^5.1.0" 39 | }, 40 | "devDependencies": { 41 | "@types/update-notifier": "^6.0.8", 42 | "coveralls": "^3.1.1", 43 | "eslint": "^6.6.0", 44 | "istanbul": "^0.4.5", 45 | "mocha": "^10.2.0", 46 | "should": "^7.0.1" 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | commander: 12 | specifier: ^2.8.1 13 | version: 2.20.3 14 | deepmerge: 15 | specifier: ^4.2.2 16 | version: 4.3.1 17 | inquirer: 18 | specifier: ^8.2.2 19 | version: 8.2.6 20 | js-yaml: 21 | specifier: ^4.1.0 22 | version: 4.1.0 23 | update-notifier: 24 | specifier: ^5.1.0 25 | version: 5.1.0 26 | devDependencies: 27 | '@types/update-notifier': 28 | specifier: ^6.0.8 29 | version: 6.0.8 30 | coveralls: 31 | specifier: ^3.1.1 32 | version: 3.1.1 33 | eslint: 34 | specifier: ^6.6.0 35 | version: 6.8.0 36 | istanbul: 37 | specifier: ^0.4.5 38 | version: 0.4.5 39 | mocha: 40 | specifier: ^10.2.0 41 | version: 10.8.2 42 | should: 43 | specifier: ^7.0.1 44 | version: 7.1.1 45 | 46 | packages: 47 | 48 | '@babel/code-frame@7.27.1': 49 | resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} 50 | engines: {node: '>=6.9.0'} 51 | 52 | '@babel/helper-validator-identifier@7.27.1': 53 | resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} 54 | engines: {node: '>=6.9.0'} 55 | 56 | '@sindresorhus/is@0.14.0': 57 | resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==} 58 | engines: {node: '>=6'} 59 | 60 | '@szmarczak/http-timer@1.1.2': 61 | resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==} 62 | engines: {node: '>=6'} 63 | 64 | '@types/configstore@6.0.2': 65 | resolution: {integrity: sha512-OS//b51j9uyR3zvwD04Kfs5kHpve2qalQ18JhY/ho3voGYUTPLEG90/ocfKPI48hyHH8T04f7KEEbK6Ue60oZQ==} 66 | 67 | '@types/keyv@3.1.4': 68 | resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} 69 | 70 | '@types/node@22.15.29': 71 | resolution: {integrity: sha512-LNdjOkUDlU1RZb8e1kOIUpN1qQUlzGkEtbVNo53vbrwDg5om6oduhm4SiUaPW5ASTXhAiP0jInWG8Qx9fVlOeQ==} 72 | 73 | '@types/responselike@1.0.3': 74 | resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} 75 | 76 | '@types/update-notifier@6.0.8': 77 | resolution: {integrity: sha512-IlDFnfSVfYQD+cKIg63DEXn3RFmd7W1iYtKQsJodcHK9R1yr8aKbKaPKfBxzPpcHCq2DU8zUq4PIPmy19Thjfg==} 78 | 79 | abbrev@1.0.9: 80 | resolution: {integrity: sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==} 81 | 82 | acorn-jsx@5.3.2: 83 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 84 | peerDependencies: 85 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 86 | 87 | acorn@7.4.1: 88 | resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} 89 | engines: {node: '>=0.4.0'} 90 | hasBin: true 91 | 92 | ajv@6.12.6: 93 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 94 | 95 | amdefine@1.0.1: 96 | resolution: {integrity: sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==} 97 | engines: {node: '>=0.4.2'} 98 | 99 | ansi-align@3.0.1: 100 | resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} 101 | 102 | ansi-colors@4.1.3: 103 | resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} 104 | engines: {node: '>=6'} 105 | 106 | ansi-escapes@4.3.2: 107 | resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} 108 | engines: {node: '>=8'} 109 | 110 | ansi-regex@4.1.1: 111 | resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} 112 | engines: {node: '>=6'} 113 | 114 | ansi-regex@5.0.1: 115 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 116 | engines: {node: '>=8'} 117 | 118 | ansi-regex@6.1.0: 119 | resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} 120 | engines: {node: '>=12'} 121 | 122 | ansi-styles@3.2.1: 123 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 124 | engines: {node: '>=4'} 125 | 126 | ansi-styles@4.3.0: 127 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 128 | engines: {node: '>=8'} 129 | 130 | ansi-styles@6.2.1: 131 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 132 | engines: {node: '>=12'} 133 | 134 | anymatch@3.1.3: 135 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 136 | engines: {node: '>= 8'} 137 | 138 | argparse@1.0.10: 139 | resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} 140 | 141 | argparse@2.0.1: 142 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 143 | 144 | asn1@0.2.6: 145 | resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} 146 | 147 | assert-plus@1.0.0: 148 | resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} 149 | engines: {node: '>=0.8'} 150 | 151 | astral-regex@1.0.0: 152 | resolution: {integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==} 153 | engines: {node: '>=4'} 154 | 155 | async@1.5.2: 156 | resolution: {integrity: sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==} 157 | 158 | asynckit@0.4.0: 159 | resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} 160 | 161 | aws-sign2@0.7.0: 162 | resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} 163 | 164 | aws4@1.13.2: 165 | resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} 166 | 167 | balanced-match@1.0.2: 168 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 169 | 170 | base64-js@1.5.1: 171 | resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} 172 | 173 | bcrypt-pbkdf@1.0.2: 174 | resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} 175 | 176 | binary-extensions@2.3.0: 177 | resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} 178 | engines: {node: '>=8'} 179 | 180 | bl@4.1.0: 181 | resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} 182 | 183 | boxen@5.1.2: 184 | resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} 185 | engines: {node: '>=10'} 186 | 187 | boxen@7.1.1: 188 | resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} 189 | engines: {node: '>=14.16'} 190 | 191 | brace-expansion@1.1.11: 192 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 193 | 194 | brace-expansion@2.0.1: 195 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 196 | 197 | braces@3.0.3: 198 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 199 | engines: {node: '>=8'} 200 | 201 | browser-stdout@1.3.1: 202 | resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} 203 | 204 | buffer@5.7.1: 205 | resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} 206 | 207 | cacheable-request@6.1.0: 208 | resolution: {integrity: sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==} 209 | engines: {node: '>=8'} 210 | 211 | callsites@3.1.0: 212 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 213 | engines: {node: '>=6'} 214 | 215 | camelcase@6.3.0: 216 | resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} 217 | engines: {node: '>=10'} 218 | 219 | camelcase@7.0.1: 220 | resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} 221 | engines: {node: '>=14.16'} 222 | 223 | caseless@0.12.0: 224 | resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} 225 | 226 | chalk@2.4.2: 227 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 228 | engines: {node: '>=4'} 229 | 230 | chalk@4.1.2: 231 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 232 | engines: {node: '>=10'} 233 | 234 | chalk@5.4.1: 235 | resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} 236 | engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} 237 | 238 | chardet@0.7.0: 239 | resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} 240 | 241 | chokidar@3.6.0: 242 | resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} 243 | engines: {node: '>= 8.10.0'} 244 | 245 | ci-info@2.0.0: 246 | resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} 247 | 248 | cli-boxes@2.2.1: 249 | resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} 250 | engines: {node: '>=6'} 251 | 252 | cli-boxes@3.0.0: 253 | resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} 254 | engines: {node: '>=10'} 255 | 256 | cli-cursor@3.1.0: 257 | resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} 258 | engines: {node: '>=8'} 259 | 260 | cli-spinners@2.9.2: 261 | resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} 262 | engines: {node: '>=6'} 263 | 264 | cli-width@3.0.0: 265 | resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} 266 | engines: {node: '>= 10'} 267 | 268 | cliui@7.0.4: 269 | resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} 270 | 271 | clone-response@1.0.3: 272 | resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} 273 | 274 | clone@1.0.4: 275 | resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} 276 | engines: {node: '>=0.8'} 277 | 278 | color-convert@1.9.3: 279 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 280 | 281 | color-convert@2.0.1: 282 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 283 | engines: {node: '>=7.0.0'} 284 | 285 | color-name@1.1.3: 286 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 287 | 288 | color-name@1.1.4: 289 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 290 | 291 | combined-stream@1.0.8: 292 | resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} 293 | engines: {node: '>= 0.8'} 294 | 295 | commander@2.20.3: 296 | resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} 297 | 298 | concat-map@0.0.1: 299 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 300 | 301 | configstore@5.0.1: 302 | resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==} 303 | engines: {node: '>=8'} 304 | 305 | core-util-is@1.0.2: 306 | resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} 307 | 308 | coveralls@3.1.1: 309 | resolution: {integrity: sha512-+dxnG2NHncSD1NrqbSM3dn/lE57O6Qf/koe9+I7c+wzkqRmEvcp0kgJdxKInzYzkICKkFMZsX3Vct3++tsF9ww==} 310 | engines: {node: '>=6'} 311 | hasBin: true 312 | 313 | cross-spawn@6.0.6: 314 | resolution: {integrity: sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==} 315 | engines: {node: '>=4.8'} 316 | 317 | crypto-random-string@2.0.0: 318 | resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} 319 | engines: {node: '>=8'} 320 | 321 | dashdash@1.14.1: 322 | resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} 323 | engines: {node: '>=0.10'} 324 | 325 | debug@4.4.1: 326 | resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} 327 | engines: {node: '>=6.0'} 328 | peerDependencies: 329 | supports-color: '*' 330 | peerDependenciesMeta: 331 | supports-color: 332 | optional: true 333 | 334 | decamelize@4.0.0: 335 | resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} 336 | engines: {node: '>=10'} 337 | 338 | decompress-response@3.3.0: 339 | resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==} 340 | engines: {node: '>=4'} 341 | 342 | deep-extend@0.6.0: 343 | resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} 344 | engines: {node: '>=4.0.0'} 345 | 346 | deep-is@0.1.4: 347 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 348 | 349 | deepmerge@4.3.1: 350 | resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 351 | engines: {node: '>=0.10.0'} 352 | 353 | defaults@1.0.4: 354 | resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} 355 | 356 | defer-to-connect@1.1.3: 357 | resolution: {integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==} 358 | 359 | delayed-stream@1.0.0: 360 | resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} 361 | engines: {node: '>=0.4.0'} 362 | 363 | diff@5.2.0: 364 | resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} 365 | engines: {node: '>=0.3.1'} 366 | 367 | doctrine@3.0.0: 368 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 369 | engines: {node: '>=6.0.0'} 370 | 371 | dot-prop@5.3.0: 372 | resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} 373 | engines: {node: '>=8'} 374 | 375 | duplexer3@0.1.5: 376 | resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} 377 | 378 | eastasianwidth@0.2.0: 379 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 380 | 381 | ecc-jsbn@0.1.2: 382 | resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} 383 | 384 | emoji-regex@7.0.3: 385 | resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} 386 | 387 | emoji-regex@8.0.0: 388 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 389 | 390 | emoji-regex@9.2.2: 391 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 392 | 393 | end-of-stream@1.4.4: 394 | resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} 395 | 396 | escalade@3.2.0: 397 | resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 398 | engines: {node: '>=6'} 399 | 400 | escape-goat@2.1.1: 401 | resolution: {integrity: sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==} 402 | engines: {node: '>=8'} 403 | 404 | escape-string-regexp@1.0.5: 405 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 406 | engines: {node: '>=0.8.0'} 407 | 408 | escape-string-regexp@4.0.0: 409 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 410 | engines: {node: '>=10'} 411 | 412 | escodegen@1.8.1: 413 | resolution: {integrity: sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==} 414 | engines: {node: '>=0.12.0'} 415 | hasBin: true 416 | 417 | eslint-scope@5.1.1: 418 | resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} 419 | engines: {node: '>=8.0.0'} 420 | 421 | eslint-utils@1.4.3: 422 | resolution: {integrity: sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==} 423 | engines: {node: '>=6'} 424 | 425 | eslint-visitor-keys@1.3.0: 426 | resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} 427 | engines: {node: '>=4'} 428 | 429 | eslint@6.8.0: 430 | resolution: {integrity: sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==} 431 | engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} 432 | deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. 433 | hasBin: true 434 | 435 | espree@6.2.1: 436 | resolution: {integrity: sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==} 437 | engines: {node: '>=6.0.0'} 438 | 439 | esprima@2.7.3: 440 | resolution: {integrity: sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==} 441 | engines: {node: '>=0.10.0'} 442 | hasBin: true 443 | 444 | esprima@4.0.1: 445 | resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} 446 | engines: {node: '>=4'} 447 | hasBin: true 448 | 449 | esquery@1.6.0: 450 | resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} 451 | engines: {node: '>=0.10'} 452 | 453 | esrecurse@4.3.0: 454 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 455 | engines: {node: '>=4.0'} 456 | 457 | estraverse@1.9.3: 458 | resolution: {integrity: sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==} 459 | engines: {node: '>=0.10.0'} 460 | 461 | estraverse@4.3.0: 462 | resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} 463 | engines: {node: '>=4.0'} 464 | 465 | estraverse@5.3.0: 466 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 467 | engines: {node: '>=4.0'} 468 | 469 | esutils@2.0.3: 470 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 471 | engines: {node: '>=0.10.0'} 472 | 473 | extend@3.0.2: 474 | resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} 475 | 476 | external-editor@3.1.0: 477 | resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} 478 | engines: {node: '>=4'} 479 | 480 | extsprintf@1.3.0: 481 | resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} 482 | engines: {'0': node >=0.6.0} 483 | 484 | fast-deep-equal@3.1.3: 485 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 486 | 487 | fast-json-stable-stringify@2.1.0: 488 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 489 | 490 | fast-levenshtein@2.0.6: 491 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 492 | 493 | figures@3.2.0: 494 | resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} 495 | engines: {node: '>=8'} 496 | 497 | file-entry-cache@5.0.1: 498 | resolution: {integrity: sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==} 499 | engines: {node: '>=4'} 500 | 501 | fill-range@7.1.1: 502 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 503 | engines: {node: '>=8'} 504 | 505 | find-up@5.0.0: 506 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 507 | engines: {node: '>=10'} 508 | 509 | flat-cache@2.0.1: 510 | resolution: {integrity: sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==} 511 | engines: {node: '>=4'} 512 | 513 | flat@5.0.2: 514 | resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} 515 | hasBin: true 516 | 517 | flatted@2.0.2: 518 | resolution: {integrity: sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==} 519 | 520 | forever-agent@0.6.1: 521 | resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} 522 | 523 | form-data@2.3.3: 524 | resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} 525 | engines: {node: '>= 0.12'} 526 | 527 | fs.realpath@1.0.0: 528 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 529 | 530 | fsevents@2.3.3: 531 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 532 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 533 | os: [darwin] 534 | 535 | functional-red-black-tree@1.0.1: 536 | resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} 537 | 538 | get-caller-file@2.0.5: 539 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 540 | engines: {node: 6.* || 8.* || >= 10.*} 541 | 542 | get-stream@4.1.0: 543 | resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} 544 | engines: {node: '>=6'} 545 | 546 | get-stream@5.2.0: 547 | resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} 548 | engines: {node: '>=8'} 549 | 550 | getpass@0.1.7: 551 | resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} 552 | 553 | glob-parent@5.1.2: 554 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 555 | engines: {node: '>= 6'} 556 | 557 | glob@5.0.15: 558 | resolution: {integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==} 559 | deprecated: Glob versions prior to v9 are no longer supported 560 | 561 | glob@7.2.3: 562 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 563 | deprecated: Glob versions prior to v9 are no longer supported 564 | 565 | glob@8.1.0: 566 | resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} 567 | engines: {node: '>=12'} 568 | deprecated: Glob versions prior to v9 are no longer supported 569 | 570 | global-dirs@3.0.1: 571 | resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} 572 | engines: {node: '>=10'} 573 | 574 | globals@12.4.0: 575 | resolution: {integrity: sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==} 576 | engines: {node: '>=8'} 577 | 578 | got@9.6.0: 579 | resolution: {integrity: sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==} 580 | engines: {node: '>=8.6'} 581 | 582 | graceful-fs@4.2.11: 583 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 584 | 585 | handlebars@4.7.8: 586 | resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} 587 | engines: {node: '>=0.4.7'} 588 | hasBin: true 589 | 590 | har-schema@2.0.0: 591 | resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} 592 | engines: {node: '>=4'} 593 | 594 | har-validator@5.1.5: 595 | resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} 596 | engines: {node: '>=6'} 597 | deprecated: this library is no longer supported 598 | 599 | has-flag@1.0.0: 600 | resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==} 601 | engines: {node: '>=0.10.0'} 602 | 603 | has-flag@3.0.0: 604 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 605 | engines: {node: '>=4'} 606 | 607 | has-flag@4.0.0: 608 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 609 | engines: {node: '>=8'} 610 | 611 | has-yarn@2.1.0: 612 | resolution: {integrity: sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==} 613 | engines: {node: '>=8'} 614 | 615 | he@1.2.0: 616 | resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} 617 | hasBin: true 618 | 619 | http-cache-semantics@4.2.0: 620 | resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} 621 | 622 | http-signature@1.2.0: 623 | resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} 624 | engines: {node: '>=0.8', npm: '>=1.3.7'} 625 | 626 | iconv-lite@0.4.24: 627 | resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} 628 | engines: {node: '>=0.10.0'} 629 | 630 | ieee754@1.2.1: 631 | resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} 632 | 633 | ignore@4.0.6: 634 | resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} 635 | engines: {node: '>= 4'} 636 | 637 | import-fresh@3.3.1: 638 | resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} 639 | engines: {node: '>=6'} 640 | 641 | import-lazy@2.1.0: 642 | resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==} 643 | engines: {node: '>=4'} 644 | 645 | imurmurhash@0.1.4: 646 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 647 | engines: {node: '>=0.8.19'} 648 | 649 | inflight@1.0.6: 650 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 651 | deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. 652 | 653 | inherits@2.0.4: 654 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 655 | 656 | ini@1.3.8: 657 | resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} 658 | 659 | ini@2.0.0: 660 | resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} 661 | engines: {node: '>=10'} 662 | 663 | inquirer@7.3.3: 664 | resolution: {integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==} 665 | engines: {node: '>=8.0.0'} 666 | 667 | inquirer@8.2.6: 668 | resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} 669 | engines: {node: '>=12.0.0'} 670 | 671 | is-binary-path@2.1.0: 672 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 673 | engines: {node: '>=8'} 674 | 675 | is-ci@2.0.0: 676 | resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} 677 | hasBin: true 678 | 679 | is-extglob@2.1.1: 680 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 681 | engines: {node: '>=0.10.0'} 682 | 683 | is-fullwidth-code-point@2.0.0: 684 | resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} 685 | engines: {node: '>=4'} 686 | 687 | is-fullwidth-code-point@3.0.0: 688 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 689 | engines: {node: '>=8'} 690 | 691 | is-glob@4.0.3: 692 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 693 | engines: {node: '>=0.10.0'} 694 | 695 | is-installed-globally@0.4.0: 696 | resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} 697 | engines: {node: '>=10'} 698 | 699 | is-interactive@1.0.0: 700 | resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} 701 | engines: {node: '>=8'} 702 | 703 | is-npm@5.0.0: 704 | resolution: {integrity: sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==} 705 | engines: {node: '>=10'} 706 | 707 | is-number@7.0.0: 708 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 709 | engines: {node: '>=0.12.0'} 710 | 711 | is-obj@2.0.0: 712 | resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} 713 | engines: {node: '>=8'} 714 | 715 | is-path-inside@3.0.3: 716 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 717 | engines: {node: '>=8'} 718 | 719 | is-plain-obj@2.1.0: 720 | resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} 721 | engines: {node: '>=8'} 722 | 723 | is-typedarray@1.0.0: 724 | resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} 725 | 726 | is-unicode-supported@0.1.0: 727 | resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} 728 | engines: {node: '>=10'} 729 | 730 | is-yarn-global@0.3.0: 731 | resolution: {integrity: sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==} 732 | 733 | isexe@2.0.0: 734 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 735 | 736 | isstream@0.1.2: 737 | resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} 738 | 739 | istanbul@0.4.5: 740 | resolution: {integrity: sha512-nMtdn4hvK0HjUlzr1DrKSUY8ychprt8dzHOgY2KXsIhHu5PuQQEOTM27gV9Xblyon7aUH/TSFIjRHEODF/FRPg==} 741 | deprecated: |- 742 | This module is no longer maintained, try this instead: 743 | npm i nyc 744 | Visit https://istanbul.js.org/integrations for other alternatives. 745 | hasBin: true 746 | 747 | js-tokens@4.0.0: 748 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 749 | 750 | js-yaml@3.14.1: 751 | resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} 752 | hasBin: true 753 | 754 | js-yaml@4.1.0: 755 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 756 | hasBin: true 757 | 758 | jsbn@0.1.1: 759 | resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} 760 | 761 | json-buffer@3.0.0: 762 | resolution: {integrity: sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==} 763 | 764 | json-schema-traverse@0.4.1: 765 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 766 | 767 | json-schema@0.4.0: 768 | resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} 769 | 770 | json-stable-stringify-without-jsonify@1.0.1: 771 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 772 | 773 | json-stringify-safe@5.0.1: 774 | resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} 775 | 776 | jsprim@1.4.2: 777 | resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} 778 | engines: {node: '>=0.6.0'} 779 | 780 | keyv@3.1.0: 781 | resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==} 782 | 783 | latest-version@5.1.0: 784 | resolution: {integrity: sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==} 785 | engines: {node: '>=8'} 786 | 787 | lcov-parse@1.0.0: 788 | resolution: {integrity: sha512-aprLII/vPzuQvYZnDRU78Fns9I2Ag3gi4Ipga/hxnVMCZC8DnR2nI7XBqrPoywGfxqIx/DgarGvDJZAD3YBTgQ==} 789 | hasBin: true 790 | 791 | levn@0.3.0: 792 | resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} 793 | engines: {node: '>= 0.8.0'} 794 | 795 | locate-path@6.0.0: 796 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 797 | engines: {node: '>=10'} 798 | 799 | lodash@4.17.21: 800 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 801 | 802 | log-driver@1.2.7: 803 | resolution: {integrity: sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==} 804 | engines: {node: '>=0.8.6'} 805 | 806 | log-symbols@4.1.0: 807 | resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} 808 | engines: {node: '>=10'} 809 | 810 | lowercase-keys@1.0.1: 811 | resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} 812 | engines: {node: '>=0.10.0'} 813 | 814 | lowercase-keys@2.0.0: 815 | resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} 816 | engines: {node: '>=8'} 817 | 818 | make-dir@3.1.0: 819 | resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} 820 | engines: {node: '>=8'} 821 | 822 | mime-db@1.52.0: 823 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 824 | engines: {node: '>= 0.6'} 825 | 826 | mime-types@2.1.35: 827 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 828 | engines: {node: '>= 0.6'} 829 | 830 | mimic-fn@2.1.0: 831 | resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} 832 | engines: {node: '>=6'} 833 | 834 | mimic-response@1.0.1: 835 | resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} 836 | engines: {node: '>=4'} 837 | 838 | minimatch@3.1.2: 839 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 840 | 841 | minimatch@5.1.6: 842 | resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} 843 | engines: {node: '>=10'} 844 | 845 | minimist@1.2.8: 846 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 847 | 848 | mkdirp@0.5.6: 849 | resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} 850 | hasBin: true 851 | 852 | mocha@10.8.2: 853 | resolution: {integrity: sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==} 854 | engines: {node: '>= 14.0.0'} 855 | hasBin: true 856 | 857 | ms@2.1.3: 858 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 859 | 860 | mute-stream@0.0.8: 861 | resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} 862 | 863 | natural-compare@1.4.0: 864 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 865 | 866 | neo-async@2.6.2: 867 | resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} 868 | 869 | nice-try@1.0.5: 870 | resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} 871 | 872 | nopt@3.0.6: 873 | resolution: {integrity: sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==} 874 | hasBin: true 875 | 876 | normalize-path@3.0.0: 877 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 878 | engines: {node: '>=0.10.0'} 879 | 880 | normalize-url@4.5.1: 881 | resolution: {integrity: sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==} 882 | engines: {node: '>=8'} 883 | 884 | oauth-sign@0.9.0: 885 | resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} 886 | 887 | once@1.4.0: 888 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 889 | 890 | onetime@5.1.2: 891 | resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} 892 | engines: {node: '>=6'} 893 | 894 | optionator@0.8.3: 895 | resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} 896 | engines: {node: '>= 0.8.0'} 897 | 898 | ora@5.4.1: 899 | resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} 900 | engines: {node: '>=10'} 901 | 902 | os-tmpdir@1.0.2: 903 | resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} 904 | engines: {node: '>=0.10.0'} 905 | 906 | p-cancelable@1.1.0: 907 | resolution: {integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==} 908 | engines: {node: '>=6'} 909 | 910 | p-limit@3.1.0: 911 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 912 | engines: {node: '>=10'} 913 | 914 | p-locate@5.0.0: 915 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 916 | engines: {node: '>=10'} 917 | 918 | package-json@6.5.0: 919 | resolution: {integrity: sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==} 920 | engines: {node: '>=8'} 921 | 922 | parent-module@1.0.1: 923 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 924 | engines: {node: '>=6'} 925 | 926 | path-exists@4.0.0: 927 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 928 | engines: {node: '>=8'} 929 | 930 | path-is-absolute@1.0.1: 931 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 932 | engines: {node: '>=0.10.0'} 933 | 934 | path-key@2.0.1: 935 | resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} 936 | engines: {node: '>=4'} 937 | 938 | performance-now@2.1.0: 939 | resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} 940 | 941 | picocolors@1.1.1: 942 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 943 | 944 | picomatch@2.3.1: 945 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 946 | engines: {node: '>=8.6'} 947 | 948 | prelude-ls@1.1.2: 949 | resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} 950 | engines: {node: '>= 0.8.0'} 951 | 952 | prepend-http@2.0.0: 953 | resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==} 954 | engines: {node: '>=4'} 955 | 956 | progress@2.0.3: 957 | resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} 958 | engines: {node: '>=0.4.0'} 959 | 960 | psl@1.15.0: 961 | resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} 962 | 963 | pump@3.0.2: 964 | resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} 965 | 966 | punycode@2.3.1: 967 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 968 | engines: {node: '>=6'} 969 | 970 | pupa@2.1.1: 971 | resolution: {integrity: sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==} 972 | engines: {node: '>=8'} 973 | 974 | qs@6.5.3: 975 | resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} 976 | engines: {node: '>=0.6'} 977 | 978 | randombytes@2.1.0: 979 | resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} 980 | 981 | rc@1.2.8: 982 | resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} 983 | hasBin: true 984 | 985 | readable-stream@3.6.2: 986 | resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} 987 | engines: {node: '>= 6'} 988 | 989 | readdirp@3.6.0: 990 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 991 | engines: {node: '>=8.10.0'} 992 | 993 | regexpp@2.0.1: 994 | resolution: {integrity: sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==} 995 | engines: {node: '>=6.5.0'} 996 | 997 | registry-auth-token@4.2.2: 998 | resolution: {integrity: sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==} 999 | engines: {node: '>=6.0.0'} 1000 | 1001 | registry-url@5.1.0: 1002 | resolution: {integrity: sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==} 1003 | engines: {node: '>=8'} 1004 | 1005 | request@2.88.2: 1006 | resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} 1007 | engines: {node: '>= 6'} 1008 | deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 1009 | 1010 | require-directory@2.1.1: 1011 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 1012 | engines: {node: '>=0.10.0'} 1013 | 1014 | resolve-from@4.0.0: 1015 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1016 | engines: {node: '>=4'} 1017 | 1018 | resolve@1.1.7: 1019 | resolution: {integrity: sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==} 1020 | 1021 | responselike@1.0.2: 1022 | resolution: {integrity: sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==} 1023 | 1024 | restore-cursor@3.1.0: 1025 | resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} 1026 | engines: {node: '>=8'} 1027 | 1028 | rimraf@2.6.3: 1029 | resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} 1030 | deprecated: Rimraf versions prior to v4 are no longer supported 1031 | hasBin: true 1032 | 1033 | run-async@2.4.1: 1034 | resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} 1035 | engines: {node: '>=0.12.0'} 1036 | 1037 | rxjs@6.6.7: 1038 | resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} 1039 | engines: {npm: '>=2.0.0'} 1040 | 1041 | rxjs@7.8.2: 1042 | resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} 1043 | 1044 | safe-buffer@5.2.1: 1045 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 1046 | 1047 | safer-buffer@2.1.2: 1048 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 1049 | 1050 | semver-diff@3.1.1: 1051 | resolution: {integrity: sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==} 1052 | engines: {node: '>=8'} 1053 | 1054 | semver@5.7.2: 1055 | resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} 1056 | hasBin: true 1057 | 1058 | semver@6.3.1: 1059 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 1060 | hasBin: true 1061 | 1062 | semver@7.7.2: 1063 | resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} 1064 | engines: {node: '>=10'} 1065 | hasBin: true 1066 | 1067 | serialize-javascript@6.0.2: 1068 | resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} 1069 | 1070 | shebang-command@1.2.0: 1071 | resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} 1072 | engines: {node: '>=0.10.0'} 1073 | 1074 | shebang-regex@1.0.0: 1075 | resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} 1076 | engines: {node: '>=0.10.0'} 1077 | 1078 | should-equal@0.5.0: 1079 | resolution: {integrity: sha512-y+N0u99fC0EjLbWovcpwSziVnzhEEmJo7//4DKM5Ioc0FfqDKnDNNnDXjWCU2G9SoGLnJnfdq0NiOoZFoDBEqA==} 1080 | 1081 | should-format@0.3.1: 1082 | resolution: {integrity: sha512-CBN7ZbI2QpfNEmex46Y45YanmvAgBWNhUsKxFAsvaahNIcFbezERyQJwwlI+xFyHXjDHQHn9/Fbs81bonjqmIg==} 1083 | 1084 | should-type@0.2.0: 1085 | resolution: {integrity: sha512-ixbc1p6gw4W29fp4MifFynWVQvuqfuZjib+y1tWezbjinoXu0eab/rXxLDP6drfZXlz6lZBwuzHJrs/BjLCLuQ==} 1086 | 1087 | should@7.1.1: 1088 | resolution: {integrity: sha512-llSOcffBvYZGDZk6xie5jazh1RonS/MuknPrZOOu/uqcUFBGHFhWo+2fseOekmylqyZu9BiQYkAp3zeQFiQFmA==} 1089 | 1090 | signal-exit@3.0.7: 1091 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 1092 | 1093 | slice-ansi@2.1.0: 1094 | resolution: {integrity: sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==} 1095 | engines: {node: '>=6'} 1096 | 1097 | source-map@0.2.0: 1098 | resolution: {integrity: sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==} 1099 | engines: {node: '>=0.8.0'} 1100 | 1101 | source-map@0.6.1: 1102 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1103 | engines: {node: '>=0.10.0'} 1104 | 1105 | sprintf-js@1.0.3: 1106 | resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} 1107 | 1108 | sshpk@1.18.0: 1109 | resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} 1110 | engines: {node: '>=0.10.0'} 1111 | hasBin: true 1112 | 1113 | string-width@3.1.0: 1114 | resolution: {integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==} 1115 | engines: {node: '>=6'} 1116 | 1117 | string-width@4.2.3: 1118 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1119 | engines: {node: '>=8'} 1120 | 1121 | string-width@5.1.2: 1122 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 1123 | engines: {node: '>=12'} 1124 | 1125 | string_decoder@1.3.0: 1126 | resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} 1127 | 1128 | strip-ansi@5.2.0: 1129 | resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} 1130 | engines: {node: '>=6'} 1131 | 1132 | strip-ansi@6.0.1: 1133 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1134 | engines: {node: '>=8'} 1135 | 1136 | strip-ansi@7.1.0: 1137 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 1138 | engines: {node: '>=12'} 1139 | 1140 | strip-json-comments@2.0.1: 1141 | resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} 1142 | engines: {node: '>=0.10.0'} 1143 | 1144 | strip-json-comments@3.1.1: 1145 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1146 | engines: {node: '>=8'} 1147 | 1148 | supports-color@3.2.3: 1149 | resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==} 1150 | engines: {node: '>=0.8.0'} 1151 | 1152 | supports-color@5.5.0: 1153 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 1154 | engines: {node: '>=4'} 1155 | 1156 | supports-color@7.2.0: 1157 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1158 | engines: {node: '>=8'} 1159 | 1160 | supports-color@8.1.1: 1161 | resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} 1162 | engines: {node: '>=10'} 1163 | 1164 | table@5.4.6: 1165 | resolution: {integrity: sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==} 1166 | engines: {node: '>=6.0.0'} 1167 | 1168 | text-table@0.2.0: 1169 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 1170 | 1171 | through@2.3.8: 1172 | resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} 1173 | 1174 | tmp@0.0.33: 1175 | resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} 1176 | engines: {node: '>=0.6.0'} 1177 | 1178 | to-readable-stream@1.0.0: 1179 | resolution: {integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==} 1180 | engines: {node: '>=6'} 1181 | 1182 | to-regex-range@5.0.1: 1183 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1184 | engines: {node: '>=8.0'} 1185 | 1186 | tough-cookie@2.5.0: 1187 | resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} 1188 | engines: {node: '>=0.8'} 1189 | 1190 | tslib@1.14.1: 1191 | resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} 1192 | 1193 | tslib@2.8.1: 1194 | resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 1195 | 1196 | tunnel-agent@0.6.0: 1197 | resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} 1198 | 1199 | tweetnacl@0.14.5: 1200 | resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} 1201 | 1202 | type-check@0.3.2: 1203 | resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} 1204 | engines: {node: '>= 0.8.0'} 1205 | 1206 | type-fest@0.20.2: 1207 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 1208 | engines: {node: '>=10'} 1209 | 1210 | type-fest@0.21.3: 1211 | resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} 1212 | engines: {node: '>=10'} 1213 | 1214 | type-fest@0.8.1: 1215 | resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} 1216 | engines: {node: '>=8'} 1217 | 1218 | type-fest@2.19.0: 1219 | resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} 1220 | engines: {node: '>=12.20'} 1221 | 1222 | typedarray-to-buffer@3.1.5: 1223 | resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} 1224 | 1225 | uglify-js@3.19.3: 1226 | resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} 1227 | engines: {node: '>=0.8.0'} 1228 | hasBin: true 1229 | 1230 | undici-types@6.21.0: 1231 | resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} 1232 | 1233 | unique-string@2.0.0: 1234 | resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} 1235 | engines: {node: '>=8'} 1236 | 1237 | update-notifier@5.1.0: 1238 | resolution: {integrity: sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==} 1239 | engines: {node: '>=10'} 1240 | 1241 | uri-js@4.4.1: 1242 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1243 | 1244 | url-parse-lax@3.0.0: 1245 | resolution: {integrity: sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==} 1246 | engines: {node: '>=4'} 1247 | 1248 | util-deprecate@1.0.2: 1249 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 1250 | 1251 | uuid@3.4.0: 1252 | resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} 1253 | deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. 1254 | hasBin: true 1255 | 1256 | v8-compile-cache@2.4.0: 1257 | resolution: {integrity: sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==} 1258 | 1259 | verror@1.10.0: 1260 | resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} 1261 | engines: {'0': node >=0.6.0} 1262 | 1263 | wcwidth@1.0.1: 1264 | resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} 1265 | 1266 | which@1.3.1: 1267 | resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} 1268 | hasBin: true 1269 | 1270 | widest-line@3.1.0: 1271 | resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} 1272 | engines: {node: '>=8'} 1273 | 1274 | widest-line@4.0.1: 1275 | resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} 1276 | engines: {node: '>=12'} 1277 | 1278 | word-wrap@1.2.5: 1279 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 1280 | engines: {node: '>=0.10.0'} 1281 | 1282 | wordwrap@1.0.0: 1283 | resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} 1284 | 1285 | workerpool@6.5.1: 1286 | resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} 1287 | 1288 | wrap-ansi@6.2.0: 1289 | resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} 1290 | engines: {node: '>=8'} 1291 | 1292 | wrap-ansi@7.0.0: 1293 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1294 | engines: {node: '>=10'} 1295 | 1296 | wrap-ansi@8.1.0: 1297 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 1298 | engines: {node: '>=12'} 1299 | 1300 | wrappy@1.0.2: 1301 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1302 | 1303 | write-file-atomic@3.0.3: 1304 | resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} 1305 | 1306 | write@1.0.3: 1307 | resolution: {integrity: sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==} 1308 | engines: {node: '>=4'} 1309 | 1310 | xdg-basedir@4.0.0: 1311 | resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==} 1312 | engines: {node: '>=8'} 1313 | 1314 | y18n@5.0.8: 1315 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 1316 | engines: {node: '>=10'} 1317 | 1318 | yargs-parser@20.2.9: 1319 | resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} 1320 | engines: {node: '>=10'} 1321 | 1322 | yargs-unparser@2.0.0: 1323 | resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} 1324 | engines: {node: '>=10'} 1325 | 1326 | yargs@16.2.0: 1327 | resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} 1328 | engines: {node: '>=10'} 1329 | 1330 | yocto-queue@0.1.0: 1331 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1332 | engines: {node: '>=10'} 1333 | 1334 | snapshots: 1335 | 1336 | '@babel/code-frame@7.27.1': 1337 | dependencies: 1338 | '@babel/helper-validator-identifier': 7.27.1 1339 | js-tokens: 4.0.0 1340 | picocolors: 1.1.1 1341 | 1342 | '@babel/helper-validator-identifier@7.27.1': {} 1343 | 1344 | '@sindresorhus/is@0.14.0': {} 1345 | 1346 | '@szmarczak/http-timer@1.1.2': 1347 | dependencies: 1348 | defer-to-connect: 1.1.3 1349 | 1350 | '@types/configstore@6.0.2': {} 1351 | 1352 | '@types/keyv@3.1.4': 1353 | dependencies: 1354 | '@types/node': 22.15.29 1355 | 1356 | '@types/node@22.15.29': 1357 | dependencies: 1358 | undici-types: 6.21.0 1359 | 1360 | '@types/responselike@1.0.3': 1361 | dependencies: 1362 | '@types/node': 22.15.29 1363 | 1364 | '@types/update-notifier@6.0.8': 1365 | dependencies: 1366 | '@types/configstore': 6.0.2 1367 | boxen: 7.1.1 1368 | 1369 | abbrev@1.0.9: {} 1370 | 1371 | acorn-jsx@5.3.2(acorn@7.4.1): 1372 | dependencies: 1373 | acorn: 7.4.1 1374 | 1375 | acorn@7.4.1: {} 1376 | 1377 | ajv@6.12.6: 1378 | dependencies: 1379 | fast-deep-equal: 3.1.3 1380 | fast-json-stable-stringify: 2.1.0 1381 | json-schema-traverse: 0.4.1 1382 | uri-js: 4.4.1 1383 | 1384 | amdefine@1.0.1: 1385 | optional: true 1386 | 1387 | ansi-align@3.0.1: 1388 | dependencies: 1389 | string-width: 4.2.3 1390 | 1391 | ansi-colors@4.1.3: {} 1392 | 1393 | ansi-escapes@4.3.2: 1394 | dependencies: 1395 | type-fest: 0.21.3 1396 | 1397 | ansi-regex@4.1.1: {} 1398 | 1399 | ansi-regex@5.0.1: {} 1400 | 1401 | ansi-regex@6.1.0: {} 1402 | 1403 | ansi-styles@3.2.1: 1404 | dependencies: 1405 | color-convert: 1.9.3 1406 | 1407 | ansi-styles@4.3.0: 1408 | dependencies: 1409 | color-convert: 2.0.1 1410 | 1411 | ansi-styles@6.2.1: {} 1412 | 1413 | anymatch@3.1.3: 1414 | dependencies: 1415 | normalize-path: 3.0.0 1416 | picomatch: 2.3.1 1417 | 1418 | argparse@1.0.10: 1419 | dependencies: 1420 | sprintf-js: 1.0.3 1421 | 1422 | argparse@2.0.1: {} 1423 | 1424 | asn1@0.2.6: 1425 | dependencies: 1426 | safer-buffer: 2.1.2 1427 | 1428 | assert-plus@1.0.0: {} 1429 | 1430 | astral-regex@1.0.0: {} 1431 | 1432 | async@1.5.2: {} 1433 | 1434 | asynckit@0.4.0: {} 1435 | 1436 | aws-sign2@0.7.0: {} 1437 | 1438 | aws4@1.13.2: {} 1439 | 1440 | balanced-match@1.0.2: {} 1441 | 1442 | base64-js@1.5.1: {} 1443 | 1444 | bcrypt-pbkdf@1.0.2: 1445 | dependencies: 1446 | tweetnacl: 0.14.5 1447 | 1448 | binary-extensions@2.3.0: {} 1449 | 1450 | bl@4.1.0: 1451 | dependencies: 1452 | buffer: 5.7.1 1453 | inherits: 2.0.4 1454 | readable-stream: 3.6.2 1455 | 1456 | boxen@5.1.2: 1457 | dependencies: 1458 | ansi-align: 3.0.1 1459 | camelcase: 6.3.0 1460 | chalk: 4.1.2 1461 | cli-boxes: 2.2.1 1462 | string-width: 4.2.3 1463 | type-fest: 0.20.2 1464 | widest-line: 3.1.0 1465 | wrap-ansi: 7.0.0 1466 | 1467 | boxen@7.1.1: 1468 | dependencies: 1469 | ansi-align: 3.0.1 1470 | camelcase: 7.0.1 1471 | chalk: 5.4.1 1472 | cli-boxes: 3.0.0 1473 | string-width: 5.1.2 1474 | type-fest: 2.19.0 1475 | widest-line: 4.0.1 1476 | wrap-ansi: 8.1.0 1477 | 1478 | brace-expansion@1.1.11: 1479 | dependencies: 1480 | balanced-match: 1.0.2 1481 | concat-map: 0.0.1 1482 | 1483 | brace-expansion@2.0.1: 1484 | dependencies: 1485 | balanced-match: 1.0.2 1486 | 1487 | braces@3.0.3: 1488 | dependencies: 1489 | fill-range: 7.1.1 1490 | 1491 | browser-stdout@1.3.1: {} 1492 | 1493 | buffer@5.7.1: 1494 | dependencies: 1495 | base64-js: 1.5.1 1496 | ieee754: 1.2.1 1497 | 1498 | cacheable-request@6.1.0: 1499 | dependencies: 1500 | clone-response: 1.0.3 1501 | get-stream: 5.2.0 1502 | http-cache-semantics: 4.2.0 1503 | keyv: 3.1.0 1504 | lowercase-keys: 2.0.0 1505 | normalize-url: 4.5.1 1506 | responselike: 1.0.2 1507 | 1508 | callsites@3.1.0: {} 1509 | 1510 | camelcase@6.3.0: {} 1511 | 1512 | camelcase@7.0.1: {} 1513 | 1514 | caseless@0.12.0: {} 1515 | 1516 | chalk@2.4.2: 1517 | dependencies: 1518 | ansi-styles: 3.2.1 1519 | escape-string-regexp: 1.0.5 1520 | supports-color: 5.5.0 1521 | 1522 | chalk@4.1.2: 1523 | dependencies: 1524 | ansi-styles: 4.3.0 1525 | supports-color: 7.2.0 1526 | 1527 | chalk@5.4.1: {} 1528 | 1529 | chardet@0.7.0: {} 1530 | 1531 | chokidar@3.6.0: 1532 | dependencies: 1533 | anymatch: 3.1.3 1534 | braces: 3.0.3 1535 | glob-parent: 5.1.2 1536 | is-binary-path: 2.1.0 1537 | is-glob: 4.0.3 1538 | normalize-path: 3.0.0 1539 | readdirp: 3.6.0 1540 | optionalDependencies: 1541 | fsevents: 2.3.3 1542 | 1543 | ci-info@2.0.0: {} 1544 | 1545 | cli-boxes@2.2.1: {} 1546 | 1547 | cli-boxes@3.0.0: {} 1548 | 1549 | cli-cursor@3.1.0: 1550 | dependencies: 1551 | restore-cursor: 3.1.0 1552 | 1553 | cli-spinners@2.9.2: {} 1554 | 1555 | cli-width@3.0.0: {} 1556 | 1557 | cliui@7.0.4: 1558 | dependencies: 1559 | string-width: 4.2.3 1560 | strip-ansi: 6.0.1 1561 | wrap-ansi: 7.0.0 1562 | 1563 | clone-response@1.0.3: 1564 | dependencies: 1565 | mimic-response: 1.0.1 1566 | 1567 | clone@1.0.4: {} 1568 | 1569 | color-convert@1.9.3: 1570 | dependencies: 1571 | color-name: 1.1.3 1572 | 1573 | color-convert@2.0.1: 1574 | dependencies: 1575 | color-name: 1.1.4 1576 | 1577 | color-name@1.1.3: {} 1578 | 1579 | color-name@1.1.4: {} 1580 | 1581 | combined-stream@1.0.8: 1582 | dependencies: 1583 | delayed-stream: 1.0.0 1584 | 1585 | commander@2.20.3: {} 1586 | 1587 | concat-map@0.0.1: {} 1588 | 1589 | configstore@5.0.1: 1590 | dependencies: 1591 | dot-prop: 5.3.0 1592 | graceful-fs: 4.2.11 1593 | make-dir: 3.1.0 1594 | unique-string: 2.0.0 1595 | write-file-atomic: 3.0.3 1596 | xdg-basedir: 4.0.0 1597 | 1598 | core-util-is@1.0.2: {} 1599 | 1600 | coveralls@3.1.1: 1601 | dependencies: 1602 | js-yaml: 3.14.1 1603 | lcov-parse: 1.0.0 1604 | log-driver: 1.2.7 1605 | minimist: 1.2.8 1606 | request: 2.88.2 1607 | 1608 | cross-spawn@6.0.6: 1609 | dependencies: 1610 | nice-try: 1.0.5 1611 | path-key: 2.0.1 1612 | semver: 5.7.2 1613 | shebang-command: 1.2.0 1614 | which: 1.3.1 1615 | 1616 | crypto-random-string@2.0.0: {} 1617 | 1618 | dashdash@1.14.1: 1619 | dependencies: 1620 | assert-plus: 1.0.0 1621 | 1622 | debug@4.4.1(supports-color@8.1.1): 1623 | dependencies: 1624 | ms: 2.1.3 1625 | optionalDependencies: 1626 | supports-color: 8.1.1 1627 | 1628 | decamelize@4.0.0: {} 1629 | 1630 | decompress-response@3.3.0: 1631 | dependencies: 1632 | mimic-response: 1.0.1 1633 | 1634 | deep-extend@0.6.0: {} 1635 | 1636 | deep-is@0.1.4: {} 1637 | 1638 | deepmerge@4.3.1: {} 1639 | 1640 | defaults@1.0.4: 1641 | dependencies: 1642 | clone: 1.0.4 1643 | 1644 | defer-to-connect@1.1.3: {} 1645 | 1646 | delayed-stream@1.0.0: {} 1647 | 1648 | diff@5.2.0: {} 1649 | 1650 | doctrine@3.0.0: 1651 | dependencies: 1652 | esutils: 2.0.3 1653 | 1654 | dot-prop@5.3.0: 1655 | dependencies: 1656 | is-obj: 2.0.0 1657 | 1658 | duplexer3@0.1.5: {} 1659 | 1660 | eastasianwidth@0.2.0: {} 1661 | 1662 | ecc-jsbn@0.1.2: 1663 | dependencies: 1664 | jsbn: 0.1.1 1665 | safer-buffer: 2.1.2 1666 | 1667 | emoji-regex@7.0.3: {} 1668 | 1669 | emoji-regex@8.0.0: {} 1670 | 1671 | emoji-regex@9.2.2: {} 1672 | 1673 | end-of-stream@1.4.4: 1674 | dependencies: 1675 | once: 1.4.0 1676 | 1677 | escalade@3.2.0: {} 1678 | 1679 | escape-goat@2.1.1: {} 1680 | 1681 | escape-string-regexp@1.0.5: {} 1682 | 1683 | escape-string-regexp@4.0.0: {} 1684 | 1685 | escodegen@1.8.1: 1686 | dependencies: 1687 | esprima: 2.7.3 1688 | estraverse: 1.9.3 1689 | esutils: 2.0.3 1690 | optionator: 0.8.3 1691 | optionalDependencies: 1692 | source-map: 0.2.0 1693 | 1694 | eslint-scope@5.1.1: 1695 | dependencies: 1696 | esrecurse: 4.3.0 1697 | estraverse: 4.3.0 1698 | 1699 | eslint-utils@1.4.3: 1700 | dependencies: 1701 | eslint-visitor-keys: 1.3.0 1702 | 1703 | eslint-visitor-keys@1.3.0: {} 1704 | 1705 | eslint@6.8.0: 1706 | dependencies: 1707 | '@babel/code-frame': 7.27.1 1708 | ajv: 6.12.6 1709 | chalk: 2.4.2 1710 | cross-spawn: 6.0.6 1711 | debug: 4.4.1(supports-color@8.1.1) 1712 | doctrine: 3.0.0 1713 | eslint-scope: 5.1.1 1714 | eslint-utils: 1.4.3 1715 | eslint-visitor-keys: 1.3.0 1716 | espree: 6.2.1 1717 | esquery: 1.6.0 1718 | esutils: 2.0.3 1719 | file-entry-cache: 5.0.1 1720 | functional-red-black-tree: 1.0.1 1721 | glob-parent: 5.1.2 1722 | globals: 12.4.0 1723 | ignore: 4.0.6 1724 | import-fresh: 3.3.1 1725 | imurmurhash: 0.1.4 1726 | inquirer: 7.3.3 1727 | is-glob: 4.0.3 1728 | js-yaml: 3.14.1 1729 | json-stable-stringify-without-jsonify: 1.0.1 1730 | levn: 0.3.0 1731 | lodash: 4.17.21 1732 | minimatch: 3.1.2 1733 | mkdirp: 0.5.6 1734 | natural-compare: 1.4.0 1735 | optionator: 0.8.3 1736 | progress: 2.0.3 1737 | regexpp: 2.0.1 1738 | semver: 6.3.1 1739 | strip-ansi: 5.2.0 1740 | strip-json-comments: 3.1.1 1741 | table: 5.4.6 1742 | text-table: 0.2.0 1743 | v8-compile-cache: 2.4.0 1744 | transitivePeerDependencies: 1745 | - supports-color 1746 | 1747 | espree@6.2.1: 1748 | dependencies: 1749 | acorn: 7.4.1 1750 | acorn-jsx: 5.3.2(acorn@7.4.1) 1751 | eslint-visitor-keys: 1.3.0 1752 | 1753 | esprima@2.7.3: {} 1754 | 1755 | esprima@4.0.1: {} 1756 | 1757 | esquery@1.6.0: 1758 | dependencies: 1759 | estraverse: 5.3.0 1760 | 1761 | esrecurse@4.3.0: 1762 | dependencies: 1763 | estraverse: 5.3.0 1764 | 1765 | estraverse@1.9.3: {} 1766 | 1767 | estraverse@4.3.0: {} 1768 | 1769 | estraverse@5.3.0: {} 1770 | 1771 | esutils@2.0.3: {} 1772 | 1773 | extend@3.0.2: {} 1774 | 1775 | external-editor@3.1.0: 1776 | dependencies: 1777 | chardet: 0.7.0 1778 | iconv-lite: 0.4.24 1779 | tmp: 0.0.33 1780 | 1781 | extsprintf@1.3.0: {} 1782 | 1783 | fast-deep-equal@3.1.3: {} 1784 | 1785 | fast-json-stable-stringify@2.1.0: {} 1786 | 1787 | fast-levenshtein@2.0.6: {} 1788 | 1789 | figures@3.2.0: 1790 | dependencies: 1791 | escape-string-regexp: 1.0.5 1792 | 1793 | file-entry-cache@5.0.1: 1794 | dependencies: 1795 | flat-cache: 2.0.1 1796 | 1797 | fill-range@7.1.1: 1798 | dependencies: 1799 | to-regex-range: 5.0.1 1800 | 1801 | find-up@5.0.0: 1802 | dependencies: 1803 | locate-path: 6.0.0 1804 | path-exists: 4.0.0 1805 | 1806 | flat-cache@2.0.1: 1807 | dependencies: 1808 | flatted: 2.0.2 1809 | rimraf: 2.6.3 1810 | write: 1.0.3 1811 | 1812 | flat@5.0.2: {} 1813 | 1814 | flatted@2.0.2: {} 1815 | 1816 | forever-agent@0.6.1: {} 1817 | 1818 | form-data@2.3.3: 1819 | dependencies: 1820 | asynckit: 0.4.0 1821 | combined-stream: 1.0.8 1822 | mime-types: 2.1.35 1823 | 1824 | fs.realpath@1.0.0: {} 1825 | 1826 | fsevents@2.3.3: 1827 | optional: true 1828 | 1829 | functional-red-black-tree@1.0.1: {} 1830 | 1831 | get-caller-file@2.0.5: {} 1832 | 1833 | get-stream@4.1.0: 1834 | dependencies: 1835 | pump: 3.0.2 1836 | 1837 | get-stream@5.2.0: 1838 | dependencies: 1839 | pump: 3.0.2 1840 | 1841 | getpass@0.1.7: 1842 | dependencies: 1843 | assert-plus: 1.0.0 1844 | 1845 | glob-parent@5.1.2: 1846 | dependencies: 1847 | is-glob: 4.0.3 1848 | 1849 | glob@5.0.15: 1850 | dependencies: 1851 | inflight: 1.0.6 1852 | inherits: 2.0.4 1853 | minimatch: 3.1.2 1854 | once: 1.4.0 1855 | path-is-absolute: 1.0.1 1856 | 1857 | glob@7.2.3: 1858 | dependencies: 1859 | fs.realpath: 1.0.0 1860 | inflight: 1.0.6 1861 | inherits: 2.0.4 1862 | minimatch: 3.1.2 1863 | once: 1.4.0 1864 | path-is-absolute: 1.0.1 1865 | 1866 | glob@8.1.0: 1867 | dependencies: 1868 | fs.realpath: 1.0.0 1869 | inflight: 1.0.6 1870 | inherits: 2.0.4 1871 | minimatch: 5.1.6 1872 | once: 1.4.0 1873 | 1874 | global-dirs@3.0.1: 1875 | dependencies: 1876 | ini: 2.0.0 1877 | 1878 | globals@12.4.0: 1879 | dependencies: 1880 | type-fest: 0.8.1 1881 | 1882 | got@9.6.0: 1883 | dependencies: 1884 | '@sindresorhus/is': 0.14.0 1885 | '@szmarczak/http-timer': 1.1.2 1886 | '@types/keyv': 3.1.4 1887 | '@types/responselike': 1.0.3 1888 | cacheable-request: 6.1.0 1889 | decompress-response: 3.3.0 1890 | duplexer3: 0.1.5 1891 | get-stream: 4.1.0 1892 | lowercase-keys: 1.0.1 1893 | mimic-response: 1.0.1 1894 | p-cancelable: 1.1.0 1895 | to-readable-stream: 1.0.0 1896 | url-parse-lax: 3.0.0 1897 | 1898 | graceful-fs@4.2.11: {} 1899 | 1900 | handlebars@4.7.8: 1901 | dependencies: 1902 | minimist: 1.2.8 1903 | neo-async: 2.6.2 1904 | source-map: 0.6.1 1905 | wordwrap: 1.0.0 1906 | optionalDependencies: 1907 | uglify-js: 3.19.3 1908 | 1909 | har-schema@2.0.0: {} 1910 | 1911 | har-validator@5.1.5: 1912 | dependencies: 1913 | ajv: 6.12.6 1914 | har-schema: 2.0.0 1915 | 1916 | has-flag@1.0.0: {} 1917 | 1918 | has-flag@3.0.0: {} 1919 | 1920 | has-flag@4.0.0: {} 1921 | 1922 | has-yarn@2.1.0: {} 1923 | 1924 | he@1.2.0: {} 1925 | 1926 | http-cache-semantics@4.2.0: {} 1927 | 1928 | http-signature@1.2.0: 1929 | dependencies: 1930 | assert-plus: 1.0.0 1931 | jsprim: 1.4.2 1932 | sshpk: 1.18.0 1933 | 1934 | iconv-lite@0.4.24: 1935 | dependencies: 1936 | safer-buffer: 2.1.2 1937 | 1938 | ieee754@1.2.1: {} 1939 | 1940 | ignore@4.0.6: {} 1941 | 1942 | import-fresh@3.3.1: 1943 | dependencies: 1944 | parent-module: 1.0.1 1945 | resolve-from: 4.0.0 1946 | 1947 | import-lazy@2.1.0: {} 1948 | 1949 | imurmurhash@0.1.4: {} 1950 | 1951 | inflight@1.0.6: 1952 | dependencies: 1953 | once: 1.4.0 1954 | wrappy: 1.0.2 1955 | 1956 | inherits@2.0.4: {} 1957 | 1958 | ini@1.3.8: {} 1959 | 1960 | ini@2.0.0: {} 1961 | 1962 | inquirer@7.3.3: 1963 | dependencies: 1964 | ansi-escapes: 4.3.2 1965 | chalk: 4.1.2 1966 | cli-cursor: 3.1.0 1967 | cli-width: 3.0.0 1968 | external-editor: 3.1.0 1969 | figures: 3.2.0 1970 | lodash: 4.17.21 1971 | mute-stream: 0.0.8 1972 | run-async: 2.4.1 1973 | rxjs: 6.6.7 1974 | string-width: 4.2.3 1975 | strip-ansi: 6.0.1 1976 | through: 2.3.8 1977 | 1978 | inquirer@8.2.6: 1979 | dependencies: 1980 | ansi-escapes: 4.3.2 1981 | chalk: 4.1.2 1982 | cli-cursor: 3.1.0 1983 | cli-width: 3.0.0 1984 | external-editor: 3.1.0 1985 | figures: 3.2.0 1986 | lodash: 4.17.21 1987 | mute-stream: 0.0.8 1988 | ora: 5.4.1 1989 | run-async: 2.4.1 1990 | rxjs: 7.8.2 1991 | string-width: 4.2.3 1992 | strip-ansi: 6.0.1 1993 | through: 2.3.8 1994 | wrap-ansi: 6.2.0 1995 | 1996 | is-binary-path@2.1.0: 1997 | dependencies: 1998 | binary-extensions: 2.3.0 1999 | 2000 | is-ci@2.0.0: 2001 | dependencies: 2002 | ci-info: 2.0.0 2003 | 2004 | is-extglob@2.1.1: {} 2005 | 2006 | is-fullwidth-code-point@2.0.0: {} 2007 | 2008 | is-fullwidth-code-point@3.0.0: {} 2009 | 2010 | is-glob@4.0.3: 2011 | dependencies: 2012 | is-extglob: 2.1.1 2013 | 2014 | is-installed-globally@0.4.0: 2015 | dependencies: 2016 | global-dirs: 3.0.1 2017 | is-path-inside: 3.0.3 2018 | 2019 | is-interactive@1.0.0: {} 2020 | 2021 | is-npm@5.0.0: {} 2022 | 2023 | is-number@7.0.0: {} 2024 | 2025 | is-obj@2.0.0: {} 2026 | 2027 | is-path-inside@3.0.3: {} 2028 | 2029 | is-plain-obj@2.1.0: {} 2030 | 2031 | is-typedarray@1.0.0: {} 2032 | 2033 | is-unicode-supported@0.1.0: {} 2034 | 2035 | is-yarn-global@0.3.0: {} 2036 | 2037 | isexe@2.0.0: {} 2038 | 2039 | isstream@0.1.2: {} 2040 | 2041 | istanbul@0.4.5: 2042 | dependencies: 2043 | abbrev: 1.0.9 2044 | async: 1.5.2 2045 | escodegen: 1.8.1 2046 | esprima: 2.7.3 2047 | glob: 5.0.15 2048 | handlebars: 4.7.8 2049 | js-yaml: 3.14.1 2050 | mkdirp: 0.5.6 2051 | nopt: 3.0.6 2052 | once: 1.4.0 2053 | resolve: 1.1.7 2054 | supports-color: 3.2.3 2055 | which: 1.3.1 2056 | wordwrap: 1.0.0 2057 | 2058 | js-tokens@4.0.0: {} 2059 | 2060 | js-yaml@3.14.1: 2061 | dependencies: 2062 | argparse: 1.0.10 2063 | esprima: 4.0.1 2064 | 2065 | js-yaml@4.1.0: 2066 | dependencies: 2067 | argparse: 2.0.1 2068 | 2069 | jsbn@0.1.1: {} 2070 | 2071 | json-buffer@3.0.0: {} 2072 | 2073 | json-schema-traverse@0.4.1: {} 2074 | 2075 | json-schema@0.4.0: {} 2076 | 2077 | json-stable-stringify-without-jsonify@1.0.1: {} 2078 | 2079 | json-stringify-safe@5.0.1: {} 2080 | 2081 | jsprim@1.4.2: 2082 | dependencies: 2083 | assert-plus: 1.0.0 2084 | extsprintf: 1.3.0 2085 | json-schema: 0.4.0 2086 | verror: 1.10.0 2087 | 2088 | keyv@3.1.0: 2089 | dependencies: 2090 | json-buffer: 3.0.0 2091 | 2092 | latest-version@5.1.0: 2093 | dependencies: 2094 | package-json: 6.5.0 2095 | 2096 | lcov-parse@1.0.0: {} 2097 | 2098 | levn@0.3.0: 2099 | dependencies: 2100 | prelude-ls: 1.1.2 2101 | type-check: 0.3.2 2102 | 2103 | locate-path@6.0.0: 2104 | dependencies: 2105 | p-locate: 5.0.0 2106 | 2107 | lodash@4.17.21: {} 2108 | 2109 | log-driver@1.2.7: {} 2110 | 2111 | log-symbols@4.1.0: 2112 | dependencies: 2113 | chalk: 4.1.2 2114 | is-unicode-supported: 0.1.0 2115 | 2116 | lowercase-keys@1.0.1: {} 2117 | 2118 | lowercase-keys@2.0.0: {} 2119 | 2120 | make-dir@3.1.0: 2121 | dependencies: 2122 | semver: 6.3.1 2123 | 2124 | mime-db@1.52.0: {} 2125 | 2126 | mime-types@2.1.35: 2127 | dependencies: 2128 | mime-db: 1.52.0 2129 | 2130 | mimic-fn@2.1.0: {} 2131 | 2132 | mimic-response@1.0.1: {} 2133 | 2134 | minimatch@3.1.2: 2135 | dependencies: 2136 | brace-expansion: 1.1.11 2137 | 2138 | minimatch@5.1.6: 2139 | dependencies: 2140 | brace-expansion: 2.0.1 2141 | 2142 | minimist@1.2.8: {} 2143 | 2144 | mkdirp@0.5.6: 2145 | dependencies: 2146 | minimist: 1.2.8 2147 | 2148 | mocha@10.8.2: 2149 | dependencies: 2150 | ansi-colors: 4.1.3 2151 | browser-stdout: 1.3.1 2152 | chokidar: 3.6.0 2153 | debug: 4.4.1(supports-color@8.1.1) 2154 | diff: 5.2.0 2155 | escape-string-regexp: 4.0.0 2156 | find-up: 5.0.0 2157 | glob: 8.1.0 2158 | he: 1.2.0 2159 | js-yaml: 4.1.0 2160 | log-symbols: 4.1.0 2161 | minimatch: 5.1.6 2162 | ms: 2.1.3 2163 | serialize-javascript: 6.0.2 2164 | strip-json-comments: 3.1.1 2165 | supports-color: 8.1.1 2166 | workerpool: 6.5.1 2167 | yargs: 16.2.0 2168 | yargs-parser: 20.2.9 2169 | yargs-unparser: 2.0.0 2170 | 2171 | ms@2.1.3: {} 2172 | 2173 | mute-stream@0.0.8: {} 2174 | 2175 | natural-compare@1.4.0: {} 2176 | 2177 | neo-async@2.6.2: {} 2178 | 2179 | nice-try@1.0.5: {} 2180 | 2181 | nopt@3.0.6: 2182 | dependencies: 2183 | abbrev: 1.0.9 2184 | 2185 | normalize-path@3.0.0: {} 2186 | 2187 | normalize-url@4.5.1: {} 2188 | 2189 | oauth-sign@0.9.0: {} 2190 | 2191 | once@1.4.0: 2192 | dependencies: 2193 | wrappy: 1.0.2 2194 | 2195 | onetime@5.1.2: 2196 | dependencies: 2197 | mimic-fn: 2.1.0 2198 | 2199 | optionator@0.8.3: 2200 | dependencies: 2201 | deep-is: 0.1.4 2202 | fast-levenshtein: 2.0.6 2203 | levn: 0.3.0 2204 | prelude-ls: 1.1.2 2205 | type-check: 0.3.2 2206 | word-wrap: 1.2.5 2207 | 2208 | ora@5.4.1: 2209 | dependencies: 2210 | bl: 4.1.0 2211 | chalk: 4.1.2 2212 | cli-cursor: 3.1.0 2213 | cli-spinners: 2.9.2 2214 | is-interactive: 1.0.0 2215 | is-unicode-supported: 0.1.0 2216 | log-symbols: 4.1.0 2217 | strip-ansi: 6.0.1 2218 | wcwidth: 1.0.1 2219 | 2220 | os-tmpdir@1.0.2: {} 2221 | 2222 | p-cancelable@1.1.0: {} 2223 | 2224 | p-limit@3.1.0: 2225 | dependencies: 2226 | yocto-queue: 0.1.0 2227 | 2228 | p-locate@5.0.0: 2229 | dependencies: 2230 | p-limit: 3.1.0 2231 | 2232 | package-json@6.5.0: 2233 | dependencies: 2234 | got: 9.6.0 2235 | registry-auth-token: 4.2.2 2236 | registry-url: 5.1.0 2237 | semver: 6.3.1 2238 | 2239 | parent-module@1.0.1: 2240 | dependencies: 2241 | callsites: 3.1.0 2242 | 2243 | path-exists@4.0.0: {} 2244 | 2245 | path-is-absolute@1.0.1: {} 2246 | 2247 | path-key@2.0.1: {} 2248 | 2249 | performance-now@2.1.0: {} 2250 | 2251 | picocolors@1.1.1: {} 2252 | 2253 | picomatch@2.3.1: {} 2254 | 2255 | prelude-ls@1.1.2: {} 2256 | 2257 | prepend-http@2.0.0: {} 2258 | 2259 | progress@2.0.3: {} 2260 | 2261 | psl@1.15.0: 2262 | dependencies: 2263 | punycode: 2.3.1 2264 | 2265 | pump@3.0.2: 2266 | dependencies: 2267 | end-of-stream: 1.4.4 2268 | once: 1.4.0 2269 | 2270 | punycode@2.3.1: {} 2271 | 2272 | pupa@2.1.1: 2273 | dependencies: 2274 | escape-goat: 2.1.1 2275 | 2276 | qs@6.5.3: {} 2277 | 2278 | randombytes@2.1.0: 2279 | dependencies: 2280 | safe-buffer: 5.2.1 2281 | 2282 | rc@1.2.8: 2283 | dependencies: 2284 | deep-extend: 0.6.0 2285 | ini: 1.3.8 2286 | minimist: 1.2.8 2287 | strip-json-comments: 2.0.1 2288 | 2289 | readable-stream@3.6.2: 2290 | dependencies: 2291 | inherits: 2.0.4 2292 | string_decoder: 1.3.0 2293 | util-deprecate: 1.0.2 2294 | 2295 | readdirp@3.6.0: 2296 | dependencies: 2297 | picomatch: 2.3.1 2298 | 2299 | regexpp@2.0.1: {} 2300 | 2301 | registry-auth-token@4.2.2: 2302 | dependencies: 2303 | rc: 1.2.8 2304 | 2305 | registry-url@5.1.0: 2306 | dependencies: 2307 | rc: 1.2.8 2308 | 2309 | request@2.88.2: 2310 | dependencies: 2311 | aws-sign2: 0.7.0 2312 | aws4: 1.13.2 2313 | caseless: 0.12.0 2314 | combined-stream: 1.0.8 2315 | extend: 3.0.2 2316 | forever-agent: 0.6.1 2317 | form-data: 2.3.3 2318 | har-validator: 5.1.5 2319 | http-signature: 1.2.0 2320 | is-typedarray: 1.0.0 2321 | isstream: 0.1.2 2322 | json-stringify-safe: 5.0.1 2323 | mime-types: 2.1.35 2324 | oauth-sign: 0.9.0 2325 | performance-now: 2.1.0 2326 | qs: 6.5.3 2327 | safe-buffer: 5.2.1 2328 | tough-cookie: 2.5.0 2329 | tunnel-agent: 0.6.0 2330 | uuid: 3.4.0 2331 | 2332 | require-directory@2.1.1: {} 2333 | 2334 | resolve-from@4.0.0: {} 2335 | 2336 | resolve@1.1.7: {} 2337 | 2338 | responselike@1.0.2: 2339 | dependencies: 2340 | lowercase-keys: 1.0.1 2341 | 2342 | restore-cursor@3.1.0: 2343 | dependencies: 2344 | onetime: 5.1.2 2345 | signal-exit: 3.0.7 2346 | 2347 | rimraf@2.6.3: 2348 | dependencies: 2349 | glob: 7.2.3 2350 | 2351 | run-async@2.4.1: {} 2352 | 2353 | rxjs@6.6.7: 2354 | dependencies: 2355 | tslib: 1.14.1 2356 | 2357 | rxjs@7.8.2: 2358 | dependencies: 2359 | tslib: 2.8.1 2360 | 2361 | safe-buffer@5.2.1: {} 2362 | 2363 | safer-buffer@2.1.2: {} 2364 | 2365 | semver-diff@3.1.1: 2366 | dependencies: 2367 | semver: 6.3.1 2368 | 2369 | semver@5.7.2: {} 2370 | 2371 | semver@6.3.1: {} 2372 | 2373 | semver@7.7.2: {} 2374 | 2375 | serialize-javascript@6.0.2: 2376 | dependencies: 2377 | randombytes: 2.1.0 2378 | 2379 | shebang-command@1.2.0: 2380 | dependencies: 2381 | shebang-regex: 1.0.0 2382 | 2383 | shebang-regex@1.0.0: {} 2384 | 2385 | should-equal@0.5.0: 2386 | dependencies: 2387 | should-type: 0.2.0 2388 | 2389 | should-format@0.3.1: 2390 | dependencies: 2391 | should-type: 0.2.0 2392 | 2393 | should-type@0.2.0: {} 2394 | 2395 | should@7.1.1: 2396 | dependencies: 2397 | should-equal: 0.5.0 2398 | should-format: 0.3.1 2399 | should-type: 0.2.0 2400 | 2401 | signal-exit@3.0.7: {} 2402 | 2403 | slice-ansi@2.1.0: 2404 | dependencies: 2405 | ansi-styles: 3.2.1 2406 | astral-regex: 1.0.0 2407 | is-fullwidth-code-point: 2.0.0 2408 | 2409 | source-map@0.2.0: 2410 | dependencies: 2411 | amdefine: 1.0.1 2412 | optional: true 2413 | 2414 | source-map@0.6.1: {} 2415 | 2416 | sprintf-js@1.0.3: {} 2417 | 2418 | sshpk@1.18.0: 2419 | dependencies: 2420 | asn1: 0.2.6 2421 | assert-plus: 1.0.0 2422 | bcrypt-pbkdf: 1.0.2 2423 | dashdash: 1.14.1 2424 | ecc-jsbn: 0.1.2 2425 | getpass: 0.1.7 2426 | jsbn: 0.1.1 2427 | safer-buffer: 2.1.2 2428 | tweetnacl: 0.14.5 2429 | 2430 | string-width@3.1.0: 2431 | dependencies: 2432 | emoji-regex: 7.0.3 2433 | is-fullwidth-code-point: 2.0.0 2434 | strip-ansi: 5.2.0 2435 | 2436 | string-width@4.2.3: 2437 | dependencies: 2438 | emoji-regex: 8.0.0 2439 | is-fullwidth-code-point: 3.0.0 2440 | strip-ansi: 6.0.1 2441 | 2442 | string-width@5.1.2: 2443 | dependencies: 2444 | eastasianwidth: 0.2.0 2445 | emoji-regex: 9.2.2 2446 | strip-ansi: 7.1.0 2447 | 2448 | string_decoder@1.3.0: 2449 | dependencies: 2450 | safe-buffer: 5.2.1 2451 | 2452 | strip-ansi@5.2.0: 2453 | dependencies: 2454 | ansi-regex: 4.1.1 2455 | 2456 | strip-ansi@6.0.1: 2457 | dependencies: 2458 | ansi-regex: 5.0.1 2459 | 2460 | strip-ansi@7.1.0: 2461 | dependencies: 2462 | ansi-regex: 6.1.0 2463 | 2464 | strip-json-comments@2.0.1: {} 2465 | 2466 | strip-json-comments@3.1.1: {} 2467 | 2468 | supports-color@3.2.3: 2469 | dependencies: 2470 | has-flag: 1.0.0 2471 | 2472 | supports-color@5.5.0: 2473 | dependencies: 2474 | has-flag: 3.0.0 2475 | 2476 | supports-color@7.2.0: 2477 | dependencies: 2478 | has-flag: 4.0.0 2479 | 2480 | supports-color@8.1.1: 2481 | dependencies: 2482 | has-flag: 4.0.0 2483 | 2484 | table@5.4.6: 2485 | dependencies: 2486 | ajv: 6.12.6 2487 | lodash: 4.17.21 2488 | slice-ansi: 2.1.0 2489 | string-width: 3.1.0 2490 | 2491 | text-table@0.2.0: {} 2492 | 2493 | through@2.3.8: {} 2494 | 2495 | tmp@0.0.33: 2496 | dependencies: 2497 | os-tmpdir: 1.0.2 2498 | 2499 | to-readable-stream@1.0.0: {} 2500 | 2501 | to-regex-range@5.0.1: 2502 | dependencies: 2503 | is-number: 7.0.0 2504 | 2505 | tough-cookie@2.5.0: 2506 | dependencies: 2507 | psl: 1.15.0 2508 | punycode: 2.3.1 2509 | 2510 | tslib@1.14.1: {} 2511 | 2512 | tslib@2.8.1: {} 2513 | 2514 | tunnel-agent@0.6.0: 2515 | dependencies: 2516 | safe-buffer: 5.2.1 2517 | 2518 | tweetnacl@0.14.5: {} 2519 | 2520 | type-check@0.3.2: 2521 | dependencies: 2522 | prelude-ls: 1.1.2 2523 | 2524 | type-fest@0.20.2: {} 2525 | 2526 | type-fest@0.21.3: {} 2527 | 2528 | type-fest@0.8.1: {} 2529 | 2530 | type-fest@2.19.0: {} 2531 | 2532 | typedarray-to-buffer@3.1.5: 2533 | dependencies: 2534 | is-typedarray: 1.0.0 2535 | 2536 | uglify-js@3.19.3: 2537 | optional: true 2538 | 2539 | undici-types@6.21.0: {} 2540 | 2541 | unique-string@2.0.0: 2542 | dependencies: 2543 | crypto-random-string: 2.0.0 2544 | 2545 | update-notifier@5.1.0: 2546 | dependencies: 2547 | boxen: 5.1.2 2548 | chalk: 4.1.2 2549 | configstore: 5.0.1 2550 | has-yarn: 2.1.0 2551 | import-lazy: 2.1.0 2552 | is-ci: 2.0.0 2553 | is-installed-globally: 0.4.0 2554 | is-npm: 5.0.0 2555 | is-yarn-global: 0.3.0 2556 | latest-version: 5.1.0 2557 | pupa: 2.1.1 2558 | semver: 7.7.2 2559 | semver-diff: 3.1.1 2560 | xdg-basedir: 4.0.0 2561 | 2562 | uri-js@4.4.1: 2563 | dependencies: 2564 | punycode: 2.3.1 2565 | 2566 | url-parse-lax@3.0.0: 2567 | dependencies: 2568 | prepend-http: 2.0.0 2569 | 2570 | util-deprecate@1.0.2: {} 2571 | 2572 | uuid@3.4.0: {} 2573 | 2574 | v8-compile-cache@2.4.0: {} 2575 | 2576 | verror@1.10.0: 2577 | dependencies: 2578 | assert-plus: 1.0.0 2579 | core-util-is: 1.0.2 2580 | extsprintf: 1.3.0 2581 | 2582 | wcwidth@1.0.1: 2583 | dependencies: 2584 | defaults: 1.0.4 2585 | 2586 | which@1.3.1: 2587 | dependencies: 2588 | isexe: 2.0.0 2589 | 2590 | widest-line@3.1.0: 2591 | dependencies: 2592 | string-width: 4.2.3 2593 | 2594 | widest-line@4.0.1: 2595 | dependencies: 2596 | string-width: 5.1.2 2597 | 2598 | word-wrap@1.2.5: {} 2599 | 2600 | wordwrap@1.0.0: {} 2601 | 2602 | workerpool@6.5.1: {} 2603 | 2604 | wrap-ansi@6.2.0: 2605 | dependencies: 2606 | ansi-styles: 4.3.0 2607 | string-width: 4.2.3 2608 | strip-ansi: 6.0.1 2609 | 2610 | wrap-ansi@7.0.0: 2611 | dependencies: 2612 | ansi-styles: 4.3.0 2613 | string-width: 4.2.3 2614 | strip-ansi: 6.0.1 2615 | 2616 | wrap-ansi@8.1.0: 2617 | dependencies: 2618 | ansi-styles: 6.2.1 2619 | string-width: 5.1.2 2620 | strip-ansi: 7.1.0 2621 | 2622 | wrappy@1.0.2: {} 2623 | 2624 | write-file-atomic@3.0.3: 2625 | dependencies: 2626 | imurmurhash: 0.1.4 2627 | is-typedarray: 1.0.0 2628 | signal-exit: 3.0.7 2629 | typedarray-to-buffer: 3.1.5 2630 | 2631 | write@1.0.3: 2632 | dependencies: 2633 | mkdirp: 0.5.6 2634 | 2635 | xdg-basedir@4.0.0: {} 2636 | 2637 | y18n@5.0.8: {} 2638 | 2639 | yargs-parser@20.2.9: {} 2640 | 2641 | yargs-unparser@2.0.0: 2642 | dependencies: 2643 | camelcase: 6.3.0 2644 | decamelize: 4.0.0 2645 | flat: 5.0.2 2646 | is-plain-obj: 2.1.0 2647 | 2648 | yargs@16.2.0: 2649 | dependencies: 2650 | cliui: 7.0.4 2651 | escalade: 3.2.0 2652 | get-caller-file: 2.0.5 2653 | require-directory: 2.1.1 2654 | string-width: 4.2.3 2655 | y18n: 5.0.8 2656 | yargs-parser: 20.2.9 2657 | 2658 | yocto-queue@0.1.0: {} 2659 | -------------------------------------------------------------------------------- /test/gitopen.test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var gitresolve = require('../'); 4 | var gitremote = require('../lib/gitremote'); 5 | var child_process = require('child_process'); 6 | var should = require('should'); 7 | 8 | var cwb = gitremote.getCurrentBranch(); 9 | var RE_URL = /^https?:\/\//i; 10 | 11 | describe('gitresolve.parse()', function() { 12 | var cases = [ 13 | ['git@github.com:hotoo/gitopen.git', {hostname: 'github.com', username: 'hotoo', reponame: 'gitopen'}], 14 | ['git://github.com/hotoo/gitopen.git', {hostname: 'github.com', username: 'hotoo', reponame: 'gitopen'}], 15 | ['ssh://github.com/hotoo/gitopen.git', {hostname: 'github.com', username: 'hotoo', reponame: 'gitopen'}], 16 | ['ssh://hg@bitbucket.org/hotoo/gitopen.git', {hostname: 'bitbucket.org', username: 'hotoo', reponame: 'gitopen'}], 17 | ['https://github.com/hotoo/gitopen.git', {hostname: 'github.com', username: 'hotoo', reponame: 'gitopen'}], 18 | ['https://hotoo@bitbucket.org/hotoo/gitopen.git', {hostname: 'bitbucket.org', username: 'hotoo', reponame: 'gitopen'}], 19 | ]; 20 | cases.forEach(function(test) { 21 | it('gitresolve.parse(' + test[0] + ')', function() { 22 | gitresolve.parse(test[0]).should.be.eql(test[1]); 23 | }); 24 | }); 25 | }); 26 | 27 | describe('gitresolve.resolve()', function() { 28 | var cases = [ 29 | ['git@github.com:hotoo/gitopen.git', 'github.com/hotoo/gitopen'], 30 | ['git://github.com/hotoo/gitopen.git', 'github.com/hotoo/gitopen'], 31 | ['ssh://github.com/hotoo/gitopen.git', 'github.com/hotoo/gitopen'], 32 | ['ssh://hg@bitbucket.org/hotoo/gitopen.git', 'bitbucket.org/hotoo/gitopen'], 33 | ['https://github.com/hotoo/gitopen.git', 'github.com/hotoo/gitopen'], 34 | ['https://hotoo@bitbucket.org/hotoo/gitopen.git', 'bitbucket.org/hotoo/gitopen'], 35 | ]; 36 | cases.forEach(function(test) { 37 | it('gitresolve.resolve(' + test[0] + ',{base})', function() { 38 | gitresolve.resolve(test[0], { 39 | scheme: {base: '{protocol}://{hostname}/{username}/{reponame}'}, 40 | }).should.be.eql('https://' + test[1]); 41 | }); 42 | 43 | it('gitresolve.resolve(' + test[0] + ',{base,protocol})', function() { 44 | gitresolve.resolve(test[0], { 45 | protocol: 'http', 46 | scheme: {base: '{protocol}://{hostname}/{username}/{reponame}'}, 47 | }).should.be.eql('http://' + test[1]); 48 | }); 49 | }); 50 | }); 51 | 52 | describe('gitresolve()', function() { 53 | var cases = [ 54 | ['git@github.com:hotoo/gitopen.git', 'github.com/hotoo/gitopen'], 55 | ['git://github.com/hotoo/gitopen.git', 'github.com/hotoo/gitopen'], 56 | ['ssh://github.com/hotoo/gitopen.git', 'github.com/hotoo/gitopen'], 57 | ['ssh://hg@bitbucket.org/hotoo/gitopen.git', 'bitbucket.org/hotoo/gitopen'], 58 | ['https://github.com/hotoo/gitopen.git', 'github.com/hotoo/gitopen'], 59 | ['https://hotoo@bitbucket.org/hotoo/gitopen.git', 'bitbucket.org/hotoo/gitopen'], 60 | ]; 61 | cases.forEach(function(test) { 62 | it('gitresolve(' + test[0] + ')', function() { 63 | gitresolve(test[0], { 64 | scheme: {base: '{protocol}://{hostname}/{username}/{reponame}'}, 65 | }).should.be.eql('https://' + test[1]); 66 | }); 67 | 68 | it('gitresolve.resolve(' + test[0] + ',{base,protocol})', function() { 69 | gitresolve(test[0], { 70 | protocol: 'http', 71 | scheme: {base: '{protocol}://{hostname}/{username}/{reponame}/something'}, 72 | }).should.be.eql('http://' + test[1] + '/something'); 73 | }); 74 | 75 | it('gitresolve(' + test[0] + ', {issues})', function() { 76 | gitresolve(test[0], { 77 | category: 'issues', 78 | scheme: { 79 | base: '{protocol}://{hostname}/{username}/{reponame}', 80 | issues: '/issues', 81 | }, 82 | }).should.be.eql('https://' + test[1] + '/issues'); 83 | }); 84 | 85 | it('gitresolve(' + test[0] + ', {issues/id})', function() { 86 | gitresolve(test[0], { 87 | category: 'issues/id', 88 | args: {'issue_id': '1'}, 89 | scheme: { 90 | base: '{protocol}://{hostname}/{username}/{reponame}', 91 | 'issues/id': '/issues/{issue-id}', 92 | }, 93 | }).should.be.eql('https://' + test[1] + '/issues/1'); 94 | }); 95 | 96 | it('gitresolve(' + test[0] + ', {issues/new})', function() { 97 | gitresolve(test[0], { 98 | category: 'issues/new', 99 | scheme: { 100 | base: '{protocol}://{hostname}/{username}/{reponame}', 101 | 'issues/new': '/issues/new', 102 | }, 103 | }).should.be.eql('https://' + test[1] + '/issues/new'); 104 | }); 105 | 106 | it('gitresolve(' + test[0] + ', {issues/new?title})', function() { 107 | gitresolve(test[0], { 108 | category: 'issues/new', 109 | args: {title: 'TEST'}, 110 | scheme: { 111 | base: '{protocol}://{hostname}/{username}/{reponame}', 112 | 'issues/new?title': '/issues/new?title={title}', 113 | }, 114 | }).should.be.eql('https://' + test[1] + '/issues/new?title=TEST'); 115 | }); 116 | 117 | it('gitresolve(' + test[0] + ', {milestones})', function() { 118 | gitresolve(test[0], { 119 | category: 'milestones', 120 | scheme: { 121 | base: '{protocol}://{hostname}/{username}/{reponame}', 122 | milestones: '/milestones', 123 | }, 124 | }).should.be.eql('https://' + test[1] + '/milestones'); 125 | }); 126 | 127 | it('gitresolve(' + test[0] + ', {milestones/id})', function() { 128 | gitresolve(test[0], { 129 | category: 'milestones/id', 130 | args: {'milestone_id': '1'}, 131 | scheme: { 132 | base: '{protocol}://{hostname}/{username}/{reponame}', 133 | 'milestones/id': '/milestones/{milestone-id}', 134 | }, 135 | }).should.be.eql('https://' + test[1] + '/milestones/1'); 136 | }); 137 | 138 | it('gitresolve(' + test[0] + ', {milestones/new})', function() { 139 | gitresolve(test[0], { 140 | category: 'milestones/new', 141 | scheme: { 142 | base: '{protocol}://{hostname}/{username}/{reponame}', 143 | 'milestones/new': '/milestones/new', 144 | }, 145 | }).should.be.eql('https://' + test[1] + '/milestones/new'); 146 | }); 147 | 148 | it('gitresolve(' + test[0] + ', {pulls})', function() { 149 | gitresolve(test[0], { 150 | category: 'pulls', 151 | scheme: { 152 | base: '{protocol}://{hostname}/{username}/{reponame}', 153 | pulls: '/pulls', 154 | }, 155 | }).should.be.eql('https://' + test[1] + '/pulls'); 156 | }); 157 | 158 | it('gitresolve(' + test[0] + ', {pulls/id})', function() { 159 | gitresolve(test[0], { 160 | category: 'pulls/id', 161 | args: {'pull_id': '1'}, 162 | scheme: { 163 | base: '{protocol}://{hostname}/{username}/{reponame}', 164 | 'pulls/id': '/pull/{pull-id}', 165 | }, 166 | }).should.be.eql('https://' + test[1] + '/pull/1'); 167 | }); 168 | 169 | it('gitresolve(' + test[0] + ', {pulls/new})', function() { 170 | gitresolve(test[0], { 171 | category: 'pulls/new', 172 | scheme: { 173 | base: '{protocol}://{hostname}/{username}/{reponame}', 174 | 'pulls/new': '/compare', 175 | }, 176 | }).should.be.eql('https://' + test[1] + '/compare'); 177 | }); 178 | 179 | it('gitresolve(' + test[0] + ', {pulls/new})', function() { 180 | gitresolve(test[0], { 181 | category: 'pulls/new', 182 | args: { 183 | 'branch-A': '123', 184 | 'branch-B': '456', 185 | }, 186 | scheme: { 187 | base: '{protocol}://{hostname}/{username}/{reponame}', 188 | 'pulls/new-with-base-branch': '/compare/{branch-A}...{branch-B}', 189 | }, 190 | }).should.be.eql('https://' + test[1] + '/compare/123...456'); 191 | }); 192 | 193 | it('gitresolve(' + test[0] + ', {pulls/new/branchName})', function() { 194 | gitresolve(test[0], { 195 | category: 'pulls/new', 196 | args: { 197 | 'branch-B': '456', 198 | }, 199 | scheme: { 200 | base: '{protocol}://{hostname}/{username}/{reponame}', 201 | 'pulls/new-with-compare-branch': '/compare/{branch-B}?expand=1', 202 | }, 203 | }).should.be.eql('https://' + test[1] + '/compare/456?expand=1'); 204 | }); 205 | 206 | it('gitresolve(' + test[0] + ', {wiki})', function() { 207 | gitresolve(test[0], { 208 | category: 'wiki', 209 | scheme: { 210 | base: '{protocol}://{hostname}/{username}/{reponame}', 211 | wiki: '/wiki', 212 | }, 213 | }).should.be.eql('https://' + test[1] + '/wiki'); 214 | }); 215 | 216 | it('gitresolve(' + test[0] + ', {tags})', function() { 217 | gitresolve(test[0], { 218 | category: 'tags', 219 | scheme: { 220 | base: '{protocol}://{hostname}/{username}/{reponame}', 221 | tags: '/tags', 222 | }, 223 | }).should.be.eql('https://' + test[1] + '/tags'); 224 | }); 225 | 226 | it('gitresolve(' + test[0] + ', {releases})', function() { 227 | gitresolve(test[0], { 228 | category: 'releases', 229 | scheme: { 230 | base: '{protocol}://{hostname}/{username}/{reponame}', 231 | releases: '/releases', 232 | }, 233 | }).should.be.eql('https://' + test[1] + '/releases'); 234 | }); 235 | 236 | it('gitresolve(' + test[0] + ', {releases/new})', function() { 237 | gitresolve(test[0], { 238 | category: 'releases/new', 239 | scheme: { 240 | base: '{protocol}://{hostname}/{username}/{reponame}', 241 | 'releases/new': '/releases/new', 242 | }, 243 | }).should.be.eql('https://' + test[1] + '/releases/new'); 244 | }); 245 | 246 | it('gitresolve(' + test[0] + ', {releases/new-with-tag})', function() { 247 | gitresolve(test[0], { 248 | category: 'releases/new-with-tag', 249 | scheme: { 250 | base: '{protocol}://{hostname}/{username}/{reponame}', 251 | 'releases/new-with-tag': '/releases/new?tag={tag}', 252 | }, 253 | args: {tag: '2.0.0'}, 254 | }).should.be.eql('https://' + test[1] + '/releases/new?tag=2.0.0'); 255 | }); 256 | 257 | it('gitresolve(' + test[0] + ', {releases/edit/tag-id})', function() { 258 | gitresolve(test[0], { 259 | category: 'releases/edit/tag-id', 260 | scheme: { 261 | base: '{protocol}://{hostname}/{username}/{reponame}', 262 | 'releases/edit/tag-id': '/releases/edit/{tag}', 263 | }, 264 | args: {tag: '2.0.0'}, 265 | }).should.be.eql('https://' + test[1] + '/releases/edit/2.0.0'); 266 | }); 267 | 268 | it('gitresolve(' + test[0] + ', {network})', function() { 269 | gitresolve(test[0], { 270 | category: 'network', 271 | scheme: { 272 | base: '{protocol}://{hostname}/{username}/{reponame}', 273 | 'network': '/network', 274 | }, 275 | }).should.be.eql('https://' + test[1] + '/network'); 276 | }); 277 | 278 | it('gitresolve(' + test[0] + ', {commits})', function() { 279 | gitresolve(test[0], { 280 | category: 'commits', 281 | scheme: { 282 | base: '{protocol}://{hostname}/{username}/{reponame}', 283 | 'commits': '/commits', 284 | }, 285 | }).should.be.eql('https://' + test[1] + '/commits'); 286 | }); 287 | 288 | it('gitresolve(' + test[0] + ', {commits-with-branch})', function() { 289 | gitresolve(test[0], { 290 | category: 'commits-with-branch', 291 | scheme: { 292 | base: '{protocol}://{hostname}/{username}/{reponame}', 293 | 'commits-with-branch': '/commits?branch={branch-name}', 294 | }, 295 | branch: 'br', 296 | }).should.be.eql('https://' + test[1] + '/commits?branch=br'); 297 | }); 298 | 299 | it('gitresolve(' + test[0] + ', {branches})', function() { 300 | gitresolve(test[0], { 301 | category: 'branches', 302 | scheme: { 303 | base: '{protocol}://{hostname}/{username}/{reponame}', 304 | 'branches': '/branches', 305 | }, 306 | }).should.be.eql('https://' + test[1] + '/branches'); 307 | }); 308 | 309 | it('gitresolve(' + test[0] + ', {home})', function() { 310 | gitresolve(test[0], { 311 | category: 'home', 312 | scheme: { 313 | base: '{protocol}://{hostname}/{username}/{reponame}', 314 | 'home': '', 315 | }, 316 | args: {branch: 'br'}, 317 | }).should.be.eql('https://' + test[1]); 318 | }); 319 | 320 | it('gitresolve(' + test[0] + ', {tree})', function() { 321 | gitresolve(test[0], { 322 | category: 'tree', 323 | scheme: { 324 | base: '{protocol}://{hostname}/{username}/{reponame}', 325 | 'tree': '/tree/{hash}/', 326 | }, 327 | hash: 'br', 328 | args: {path: ''}, 329 | }).should.be.eql('https://' + test[1] + '/tree/br/'); 330 | }); 331 | 332 | it('gitresolve(' + test[0] + ', {blob})', function() { 333 | gitresolve(test[0], { 334 | category: 'blob', 335 | scheme: { 336 | base: '{protocol}://{hostname}/{username}/{reponame}', 337 | 'blob': '/blob/{hash}{path}', 338 | }, 339 | hash: 'br', 340 | args: {path: '/README'}, 341 | }).should.be.eql('https://' + test[1] + '/blob/br/README'); 342 | }); 343 | 344 | it('gitresolve(' + test[0] + ', {snippets/new})', function() { 345 | gitresolve(test[0], { 346 | category: 'snippets/new', 347 | scheme: { 348 | base: '{protocol}://{hostname}/{username}/{reponame}', 349 | 'snippets/new': '/snippets/new', 350 | }, 351 | }).should.be.eql('https://' + test[1] + '/snippets/new'); 352 | }); 353 | 354 | it('gitresolve(' + test[0] + ', {commit:ed8d9e3})', function() { 355 | gitresolve(test[0], { 356 | category: 'commit', 357 | scheme: { 358 | base: '{protocol}://{hostname}/{username}/{reponame}', 359 | 'commit': '/commits/{hash}', 360 | }, 361 | hash: 'ed8d9e3', 362 | }).should.be.eql('https://' + test[1] + '/commits/ed8d9e3'); 363 | }); 364 | 365 | }); 366 | }); 367 | 368 | describe('gitremote()', function() { 369 | var RE_PROTOCOL = /^(?:\w+\:\/\/|\w+@)/; 370 | var RE_GIT_EXT = /\.git$/i; 371 | function resolve(uri) { 372 | return uri.replace(RE_PROTOCOL, '') 373 | .replace(':', '/') 374 | .replace(RE_GIT_EXT, ''); 375 | } 376 | it('gitremote.getRemoteUrl()', function() { 377 | resolve(gitremote.getRemoteUrl()).should.be.eql('github.com/hotoo/gitopen'); 378 | }); 379 | 380 | it('gitremote.getRemoteUrl({cwd})', function() { 381 | resolve(gitremote.getRemoteUrl({cwd: '.'})).should.be.eql('github.com/hotoo/gitopen'); 382 | }); 383 | 384 | it('gitremote.getRemoteUrl({remote})', function(done) { 385 | resolve(gitremote.getRemoteUrl({remote: 'origin'})).should.be.eql('github.com/hotoo/gitopen'); 386 | child_process.exec('git remote add gitlab git@gitlab.com:hotoo/gitopen.git', {cwd: '.'}, function(/* err, stdout */) { 387 | resolve(gitremote.getRemoteUrl({remote: 'gitlab'})).should.be.eql('gitlab.com/hotoo/gitopen'); 388 | 389 | child_process.exec('git remote remove gitlab', {}, done); 390 | }); 391 | }); 392 | 393 | // git remote name 394 | it('gitremote.getRemoteName({remote: "test"})', function() { 395 | resolve(gitremote.getRemoteName({remote: 'test'})).should.be.eql('test'); 396 | }); 397 | 398 | it('gitremote.getRemoteName()', function() { 399 | resolve(gitremote.getRemoteName()).should.be.eql('origin'); 400 | }); 401 | }); 402 | 403 | describe('$ cd non-git-dir && gitopen', function() { 404 | it('$ gitopen @hotoo', function(done) { 405 | child_process.exec('./gitopen/bin/gitopen --verbose @hotoo', {cwd: '..'}, function(err, stdout) { 406 | should(err).not.be.ok(); 407 | stdout.should.be.containEql('URL: https://github.com/hotoo\n'); 408 | done(); 409 | }); 410 | }); 411 | 412 | it('$ gitopen @hotoo/gitopen', function(done) { 413 | child_process.exec('./gitopen/bin/gitopen --verbose @hotoo/gitopen', {cwd: '..'}, function(err, stdout) { 414 | should(err).not.be.ok(); 415 | stdout.should.be.containEql('URL: https://github.com/hotoo/gitopen\n'); 416 | done(); 417 | }); 418 | }); 419 | 420 | it('$ gitopen snippet', function(done) { 421 | child_process.exec('./gitopen/bin/gitopen --verbose snippet', {cwd: '..'}, function(err, stdout) { 422 | should(err).not.be.ok(); 423 | stdout.should.be.containEql('URL: https://gist.github.com/\n'); 424 | done(); 425 | }); 426 | }); 427 | 428 | it('$ gitopen #1 SHOULD ERROR', function(done) { 429 | child_process.exec('./gitopen/bin/gitopen --verbose "#1"', {cwd: '..'}, function(err) { 430 | should(err).be.ok(); 431 | done(); 432 | }); 433 | }); 434 | }); 435 | 436 | describe('$ gitopen', function() { 437 | 438 | var git_command_case = [ 439 | ['', '/hotoo/gitopen'], 440 | ['"#1"', '/hotoo/gitopen/issues/1'], 441 | [':master', '/hotoo/gitopen/tree/master'], 442 | [':master README.md', '/hotoo/gitopen/blob/master/README.md'], 443 | ['README.md :master', '/hotoo/gitopen/blob/master/README.md'], 444 | ['README.md', '/hotoo/gitopen/blob/' + cwb + '/README.md'], 445 | ['-p README.md', '/hotoo/gitopen/blob/' + cwb + '/README.md'], 446 | ['--path README.md', '/hotoo/gitopen/blob/' + cwb + '/README.md'], 447 | ['--path README.md :master', '/hotoo/gitopen/blob/master/README.md'], 448 | ['--path README.md -b master', '/hotoo/gitopen/blob/master/README.md'], 449 | ['lib', '/hotoo/gitopen/tree/' + cwb + '/lib'], 450 | [':master lib', '/hotoo/gitopen/tree/master/lib'], 451 | [':master lib/', '/hotoo/gitopen/tree/master/lib/'], 452 | ['lib :master', '/hotoo/gitopen/tree/master/lib'], 453 | ['-p lib :master', '/hotoo/gitopen/tree/master/lib'], 454 | ['--path lib :master', '/hotoo/gitopen/tree/master/lib'], 455 | ['--path lib -b master', '/hotoo/gitopen/tree/master/lib'], 456 | ['-b master', '/hotoo/gitopen/tree/master'], 457 | ['--branch master', '/hotoo/gitopen/tree/master'], 458 | ['wiki', '/hotoo/gitopen/wiki'], 459 | ['wikis', '/hotoo/gitopen/wiki'], 460 | ['issues', '/hotoo/gitopen/issues'], 461 | ['issue', '/hotoo/gitopen/issues/new'], 462 | ['issue TITLE', '/hotoo/gitopen/issues/new?title=TITLE'], 463 | ['issue 标题', '/hotoo/gitopen/issues/new?title=%E6%A0%87%E9%A2%98'], 464 | ['issue TITLE 标题', '/hotoo/gitopen/issues/new?title=TITLE%20%E6%A0%87%E9%A2%98'], 465 | ['milestones', '/hotoo/gitopen/milestones'], 466 | ['milestone', '/hotoo/gitopen/milestones/new'], 467 | ['milestone@2.0.0', '/hotoo/gitopen/issues?q=milestone%3A2.0.0'], 468 | ['milestone/2.0.0', '/hotoo/gitopen/issues?q=milestone%3A2.0.0'], 469 | ['milestone-2.0.0', '/hotoo/gitopen/issues?q=milestone%3A2.0.0'], 470 | ['milestone#2.0.0', '/hotoo/gitopen/issues?q=milestone%3A2.0.0'], 471 | ['milestone#里程碑', '/hotoo/gitopen/issues?q=milestone%3A%E9%87%8C%E7%A8%8B%E7%A2%91'], 472 | ['pr', '/hotoo/gitopen/compare/' + cwb + '?expand=1'], 473 | // ['pr', '/hotoo/gitopen/compare/master...' + cwb + '?expand=1'], 474 | ['pull', '/hotoo/gitopen/compare/' + cwb + '?expand=1'], 475 | // ['pull', '/hotoo/gitopen/compare/master...' + cwb + '?expand=1'], 476 | ['pr compare-branch', '/hotoo/gitopen/compare/compare-branch?expand=1'], 477 | // ['pr compare-branch', '/hotoo/gitopen/compare/master...compare-branch?expand=1'], 478 | ['pull compare-branch', '/hotoo/gitopen/compare/compare-branch?expand=1'], 479 | // ['pull compare-branch', '/hotoo/gitopen/compare/master...compare-branch?expand=1'], 480 | ['pr base-branch:compare-branch', '/hotoo/gitopen/compare/base-branch...compare-branch?expand=1'], 481 | ['pr base/branch:compare/branch', '/hotoo/gitopen/compare/base/branch...compare/branch?expand=1'], 482 | ['pr base-branch...compare-branch', '/hotoo/gitopen/compare/base-branch...compare-branch?expand=1'], 483 | ['pr base/branch...compare/branch', '/hotoo/gitopen/compare/base/branch...compare/branch?expand=1'], 484 | ['pr base/branch+name...compare/branch#name', '/hotoo/gitopen/compare/base/branch%2Bname...compare/branch%23name?expand=1'], 485 | ['pulls', '/hotoo/gitopen/pulls'], 486 | ['prs', '/hotoo/gitopen/pulls'], 487 | ['mrs', '/hotoo/gitopen/pulls'], 488 | ['pulls new', '/hotoo/gitopen/compare'], 489 | ['!1', '/hotoo/gitopen/pull/1'], 490 | ['pr1', '/hotoo/gitopen/pull/1'], 491 | ['pr:1', '/hotoo/gitopen/pull/1'], 492 | ['pr-1', '/hotoo/gitopen/pull/1'], 493 | ['pr/1', '/hotoo/gitopen/pull/1'], 494 | ['pr@1', '/hotoo/gitopen/pull/1'], 495 | ['mr1', '/hotoo/gitopen/pull/1'], 496 | ['mr:1', '/hotoo/gitopen/pull/1'], 497 | ['mr-1', '/hotoo/gitopen/pull/1'], 498 | ['mr/1', '/hotoo/gitopen/pull/1'], 499 | ['mr@1', '/hotoo/gitopen/pull/1'], 500 | ['ci', '/hotoo/gitopen/commits'], 501 | ['commit', '/hotoo/gitopen/commits'], 502 | ['commits', '/hotoo/gitopen/commits'], 503 | ['blame path/to/file', '/hotoo/gitopen/blame/' + cwb + '/path/to/file'], 504 | ['blame -b branch-name path/to/file', '/hotoo/gitopen/blame/branch-name/path/to/file'], 505 | ['ed8d9e3', '/hotoo/gitopen/commit/ed8d9e3'], 506 | ['brs', '/hotoo/gitopen/branches'], 507 | ['branches', '/hotoo/gitopen/branches'], 508 | ['@hotoo', '/hotoo'], 509 | ['@hotoo/gitopen', '/hotoo/gitopen'], 510 | ['snippet', 'https://gist.github.com/'], 511 | ['snip', 'https://gist.github.com/'], 512 | ['gist', 'https://gist.github.com/'], 513 | ]; 514 | 515 | git_command_case.forEach(function(testcase) { 516 | var cmd = testcase[0] ? ' ' + testcase[0] : ''; 517 | it('$ gitopen' + cmd, function(done) { 518 | child_process.exec('./bin/gitopen --verbose' + cmd, function(err, stdout) { 519 | should(err).not.be.ok(); 520 | stdout.should.be.containEql('URL: ' + (RE_URL.test(testcase[1]) ? testcase[1] : 'https://github.com' + testcase[1]) + '\n'); 521 | done(); 522 | }); 523 | }); 524 | }); 525 | 526 | var git_command_case_in_subdir = [ 527 | ['../README.md :master', '/hotoo/gitopen/blob/master/README.md'], 528 | ['../README.md -b master', '/hotoo/gitopen/blob/master/README.md'], 529 | [':master ../lib', '/hotoo/gitopen/tree/master/lib'], 530 | ['-b master ../lib', '/hotoo/gitopen/tree/master/lib'], 531 | ]; 532 | git_command_case_in_subdir.forEach(function(testcase) { 533 | var cmd = testcase[0] ? ' ' + testcase[0] : ''; 534 | it('$ cd bin && gitopen' + cmd, function(done) { 535 | child_process.exec('./gitopen --verbose' + cmd, {cwd: './bin'}, function(err, stdout) { 536 | should(err).not.be.ok(); 537 | stdout.should.be.containEql('URL: ' + (RE_URL.test(testcase[1]) ? testcase[1] : 'https://github.com' + testcase[1]) + '\n'); 538 | done(); 539 | }); 540 | }); 541 | }); 542 | 543 | 544 | it('$ gitopen --remote gitlab', function(done) { 545 | child_process.exec('git remote add gitlab git@gitlab.com:hotoo/gitopen.git && ./bin/gitopen --verbose --remote gitlab', function(err, stdout) { 546 | should(err).not.be.ok(); 547 | stdout.should.be.containEql('URL: https://gitlab.com/hotoo/gitopen\n'); 548 | child_process.exec('git remote remove gitlab ', done); 549 | }); 550 | }); 551 | 552 | it('gitopen with .gitconfig setting gitopen.remote', function(done) { 553 | child_process.exec('git remote add gitlab git@gitlab.com:hotoo/gitopen.git && git config gitopen.remote gitlab', {cwd: '.'}, function(err/* , stdout */) { 554 | should(err).not.be.ok(); 555 | 556 | child_process.exec('./bin/gitopen --verbose', function(errOpen, stdoutOpen) { 557 | should(errOpen).not.be.ok(); 558 | stdoutOpen.should.be.containEql('URL: https://gitlab.com/hotoo/gitopen\n'); 559 | 560 | child_process.exec('git remote remove gitlab && git config gitopen.remote origin', {}, done); 561 | }); 562 | }); 563 | }); 564 | }); 565 | 566 | 567 | describe.skip('$ hgopen', function() { 568 | var hg_command_case = [ 569 | ['', '/hotoo/gitopen'], 570 | ['#1', '/hotoo/gitopen/issues/1'], 571 | ['snippet', 'https://bitbucket.org/snippets/new'], 572 | ['snip', 'https://bitbucket.org/snippets/new'], 573 | ['gist', 'https://bitbucket.org/snippets/new'], 574 | ]; 575 | 576 | describe('$ ssh://', function() { 577 | hg_command_case.forEach(function(testcase) { 578 | var cmd = testcase[0] ? ' "' + testcase[0] + '"' : ''; 579 | it('$ hgopen' + cmd, function(done) { 580 | child_process.exec('../../bin/hgopen --verbose' + cmd, {cwd: 'test/hgssh'}, function(err, stdout) { 581 | should(err).not.be.ok(); 582 | stdout.should.be.containEql('URL: ' + (RE_URL.test(testcase[1]) ? testcase[1] : 'https://bitbucket.org' + testcase[1]) + '\n'); 583 | done(); 584 | }); 585 | }); 586 | }); 587 | }); 588 | 589 | describe('$ https://', function() { 590 | hg_command_case.forEach(function(testcase) { 591 | var cmd = testcase[0] ? ' "' + testcase[0] + '"' : ''; 592 | it('$ hgopen' + cmd, function(done) { 593 | child_process.exec('../../bin/hgopen --verbose' + cmd, {cwd: 'test/hghttp'}, function(err, stdout) { 594 | should(err).not.be.ok(); 595 | stdout.should.be.containEql('URL: ' + (RE_URL.test(testcase[1]) ? testcase[1] : 'https://bitbucket.org' + testcase[1]) + '\n'); 596 | done(); 597 | }); 598 | }); 599 | }); 600 | }); 601 | }); 602 | 603 | describe.skip('$ svnopen', function() { 604 | // TODO: 605 | }); 606 | --------------------------------------------------------------------------------