├── .circleci └── config.yml ├── .github └── workflows │ └── main.yml ├── .gitignore ├── CHANGELOG.md ├── LICENSE ├── README.md ├── VERSION ├── backend ├── .dockerignore ├── .gitignore ├── Dockerfile ├── package-lock.json ├── package.json ├── src │ ├── domain │ │ ├── GitHubApiService.ts │ │ ├── GitHubRepositoryJsonCacheRepository.ts │ │ └── GitHubRepositoryPngCardCacheRepository.ts │ ├── emoji-renderer.ts │ ├── index.ts │ ├── infra │ │ ├── DefaultGitHubApiService.ts │ │ ├── RedisGitHubRepositoryJsonCacheRepository.ts │ │ └── RedisGitHubRepositoryPngCardCacheRepository.ts │ ├── route.ts │ ├── svg-generator.tsx │ └── types.ts ├── test │ └── index.test.ts └── tsconfig.json ├── doc_assets ├── gh-card.gif └── piping-server.svg ├── docker-compose.local.yml ├── docker-compose.yml ├── frontend ├── .browserslistrc ├── .dockerignore ├── .gitignore ├── Dockerfile ├── README.md ├── babel.config.js ├── package-lock.json ├── package.json ├── postcss.config.js ├── public │ ├── favicon.ico │ ├── img │ │ └── icons │ │ │ ├── android-chrome-192x192.png │ │ │ ├── android-chrome-512x512.png │ │ │ ├── apple-touch-icon-120x120.png │ │ │ ├── apple-touch-icon-152x152.png │ │ │ ├── apple-touch-icon-180x180.png │ │ │ ├── apple-touch-icon-60x60.png │ │ │ ├── apple-touch-icon-76x76.png │ │ │ ├── apple-touch-icon.png │ │ │ ├── favicon-16x16.png │ │ │ ├── favicon-32x32.png │ │ │ ├── msapplication-icon-144x144.png │ │ │ ├── mstile-150x150.png │ │ │ └── safari-pinned-tab.svg │ ├── index.html │ ├── manifest.json │ └── robots.txt ├── src │ ├── App.vue │ ├── assets │ │ ├── github.svg │ │ └── logo.png │ ├── components │ │ └── GhCardGenerator.vue │ ├── constants.ts │ ├── main.ts │ ├── registerServiceWorker.ts │ ├── shims-tsx.d.ts │ └── shims-vue.d.ts ├── tsconfig.json ├── tslint.json └── vue.config.js └── reverse-proxy ├── Caddyfile ├── Dockerfile └── local.caddyfile /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | # Scala CircleCI 2.0 configuration file 2 | # 3 | # Check https://circleci.com/docs/2.0/sample-config/ for more details 4 | # 5 | version: 2 6 | jobs: 7 | backend_build: 8 | docker: 9 | - image: circleci/node:12 10 | steps: 11 | - checkout 12 | - run: 13 | command: npm ci 14 | working_directory: backend 15 | # Check whether "run build" is successful 16 | - run: 17 | command: npm run build 18 | working_directory: backend 19 | 20 | frontend_build: 21 | docker: 22 | - image: circleci/node:10 23 | steps: 24 | - checkout 25 | - run: 26 | command: npm install 27 | working_directory: frontend 28 | - run: 29 | command: npm run lint 30 | working_directory: frontend 31 | # Check whether "run build" is successful 32 | - run: 33 | command: npm run build 34 | working_directory: frontend 35 | 36 | docker_compose_build: 37 | machine: 38 | # (base: https://circleci.com/docs/2.0/configuration-reference/#machine) 39 | image: ubuntu-1604:201903-01 40 | steps: 41 | - checkout 42 | - run: 43 | command: docker-compose build 44 | 45 | docker_compose_local_working_test: 46 | machine: 47 | # (base: https://circleci.com/docs/2.0/configuration-reference/#machine) 48 | image: ubuntu-1604:201903-01 49 | steps: 50 | - checkout 51 | - run: 52 | name: Build 53 | command: docker-compose -f docker-compose.local.yml build 54 | - run: 55 | name: Up 56 | command: docker-compose -f docker-compose.local.yml up -d 57 | - run: 58 | name: Web frontend GET 59 | command: curl http://localhost:9080/ 60 | - run: 61 | name: SVG card 62 | command: | 63 | set -xeu 64 | time curl http://localhost:9080/repos/nwtgck/piping-server.svg 65 | # Cache should be enabled 66 | time curl http://localhost:9080/repos/nwtgck/piping-server.svg 67 | - run: 68 | name: PNG card 69 | command: | 70 | set -xeu 71 | time curl -sS http://localhost:9080/repos/nwtgck/piping-server.png | file - 72 | # Cache should be enabled 73 | time curl -sS http://localhost:9080/repos/nwtgck/piping-server.png | file - 74 | - run: 75 | name: Server log 76 | command: docker-compose -f docker-compose.local.yml logs 77 | 78 | workflows: 79 | version: 2 80 | frontend_and_backend: 81 | jobs: 82 | - backend_build 83 | - frontend_build 84 | - docker_compose_build 85 | - docker_compose_local_working_test 86 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: main 2 | 3 | on: [push, pull_request] 4 | 5 | jobs: 6 | build: 7 | runs-on: ubuntu-18.04 8 | defaults: 9 | run: 10 | working-directory: frontend 11 | steps: 12 | - uses: actions/checkout@v2 13 | - uses: actions/setup-node@v1 14 | with: 15 | node-version: 12.x 16 | - run: npm ci 17 | - run: GH_CARD_IMAGE_SERVER_URL=https://gh-card.dev npm run build 18 | 19 | - name: Deploy to Netlify 20 | uses: nwtgck/actions-netlify@v1.1 21 | with: 22 | publish-dir: './frontend/dist' 23 | production-branch: master 24 | github-token: ${{ secrets.GITHUB_TOKEN }} 25 | env: 26 | NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} 27 | NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }} 28 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /log 2 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | All notable changes to this project will be documented in this file. 3 | 4 | The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) 5 | 6 | ## [Unreleased] 7 | 8 | ## [0.2.3] - 2020-05-28 9 | ### Changed 10 | * Update dependencies 11 | 12 | ### Fixed 13 | * Fix backend error when repo doesn't have description by [@Freyskeyd](https://github.com/Freyskeyd) 14 | 15 | ## [0.2.2] - 2020-04-09 16 | ### Fixed 17 | * Fix to generate repo card without language 18 | 19 | ### Changed 20 | * Update dependencies 21 | 22 | ## [0.2.1] - 2020-03-05 23 | ### Changed 24 | * Update dependencies 25 | 26 | ## Fixed 27 | * Fix GitHub API request 28 | 29 | ## [0.2.0] - 2020-02-09 30 | ### Changed 31 | * Update dependencies 32 | * Set fork icon when repo is forked 33 | 34 | ## 0.1.0 - 2020-02-08 35 | ### Added 36 | * Initial release 37 | 38 | [Unreleased]: https://github.com/nwtgck/gh-card/compare/v0.2.3...HEAD 39 | [0.2.3]: https://github.com/nwtgck/gh-card/compare/v0.2.2...v0.2.3 40 | [0.2.2]: https://github.com/nwtgck/gh-card/compare/v0.2.1...v0.2.2 41 | [0.2.1]: https://github.com/nwtgck/gh-card/compare/v0.2.0...v0.2.1 42 | [0.2.0]: https://github.com/nwtgck/gh-card/compare/v0.1.0...v0.2.0 43 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Ryo Ota 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # gh-card 2 | [![CircleCI](https://circleci.com/gh/nwtgck/gh-card.svg?style=shield)](https://circleci.com/gh/nwtgck/gh-card) 3 | 4 | GitHub Repository Card for Every Web Site: 5 | 6 | ## Example SVG card 7 | 8 | ![Piping Server static repo card](doc_assets/piping-server.svg) 9 | 10 | ## Demo 11 | ![gh-card](doc_assets/gh-card.gif) 12 | 13 | ## How it works? 14 | The idea is similar to status badges from Travis CI, CircleCI and etc. 15 | 16 | An image URL is like "". The request triggers the backend server to call GitHub API request. The repository information are cached currently by Redis. 17 | 18 | 19 | ## Related projects 20 | * [GitHub Link Card Creator](https://github.com/po3rin/github_link_creator) 21 | * [Unofficial GitHub Cards](https://github.com/lepture/github-cards) 22 | 23 | This might be similar to them. The purpose of this project is to provide an image which can be used in every site and the design should be like official GitHub repo card. I hope one day GitHub itself provides this feature officially. 24 | -------------------------------------------------------------------------------- /VERSION: -------------------------------------------------------------------------------- 1 | 0.2.3 -------------------------------------------------------------------------------- /backend/.dockerignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | /dist 3 | -------------------------------------------------------------------------------- /backend/.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | /dist 3 | -------------------------------------------------------------------------------- /backend/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:12.14 2 | 3 | LABEL maintainer="Ryo Ota " 4 | 5 | COPY . /app 6 | 7 | # Move to /app 8 | WORKDIR /app 9 | 10 | # Install requirements, build and remove devDependencies 11 | # (from: https://stackoverflow.com/a/25571391/2885946) 12 | RUN npm ci && \ 13 | npm run build && \ 14 | npm prune --production 15 | 16 | # Run a server 17 | ENTRYPOINT [ "node", "dist/src/index.js" ] 18 | -------------------------------------------------------------------------------- /backend/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gh-card-backend", 3 | "version": "0.1.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@types/body-parser": { 8 | "version": "1.19.0", 9 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", 10 | "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", 11 | "dev": true, 12 | "requires": { 13 | "@types/connect": "*", 14 | "@types/node": "*" 15 | } 16 | }, 17 | "@types/color-name": { 18 | "version": "1.1.1", 19 | "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", 20 | "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" 21 | }, 22 | "@types/connect": { 23 | "version": "3.4.33", 24 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.33.tgz", 25 | "integrity": "sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A==", 26 | "dev": true, 27 | "requires": { 28 | "@types/node": "*" 29 | } 30 | }, 31 | "@types/empower": { 32 | "version": "1.2.30", 33 | "resolved": "https://registry.npmjs.org/@types/empower/-/empower-1.2.30.tgz", 34 | "integrity": "sha1-x8/BSzph5Ux0xnTB+8kbot8NE5I=", 35 | "dev": true 36 | }, 37 | "@types/express": { 38 | "version": "4.17.6", 39 | "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.6.tgz", 40 | "integrity": "sha512-n/mr9tZI83kd4azlPG5y997C/M4DNABK9yErhFM6hKdym4kkmd9j0vtsJyjFIwfRBxtrxZtAfGZCNRIBMFLK5w==", 41 | "dev": true, 42 | "requires": { 43 | "@types/body-parser": "*", 44 | "@types/express-serve-static-core": "*", 45 | "@types/qs": "*", 46 | "@types/serve-static": "*" 47 | } 48 | }, 49 | "@types/express-serve-static-core": { 50 | "version": "4.17.7", 51 | "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.7.tgz", 52 | "integrity": "sha512-EMgTj/DF9qpgLXyc+Btimg+XoH7A2liE8uKul8qSmMTHCeNYzydDKFdsJskDvw42UsesCnhO63dO0Grbj8J4Dw==", 53 | "dev": true, 54 | "requires": { 55 | "@types/node": "*", 56 | "@types/qs": "*", 57 | "@types/range-parser": "*" 58 | } 59 | }, 60 | "@types/mime": { 61 | "version": "2.0.2", 62 | "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.2.tgz", 63 | "integrity": "sha512-4kPlzbljFcsttWEq6aBW0OZe6BDajAmyvr2xknBG92tejQnvdGtT9+kXSZ580DqpxY9qG2xeQVF9Dq0ymUTo5Q==", 64 | "dev": true 65 | }, 66 | "@types/mocha": { 67 | "version": "7.0.2", 68 | "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-7.0.2.tgz", 69 | "integrity": "sha512-ZvO2tAcjmMi8V/5Z3JsyofMe3hasRcaw88cto5etSVMwVQfeivGAlEYmaQgceUSVYFofVjT+ioHsATjdWcFt1w==", 70 | "dev": true 71 | }, 72 | "@types/node": { 73 | "version": "12.12.42", 74 | "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.42.tgz", 75 | "integrity": "sha512-R/9QdYFLL9dE9l5cWWzWIZByVGFd7lk7JVOJ7KD+E1SJ4gni7XJRLz9QTjyYQiHIqEAgku9VgxdLjMlhhUaAFg==", 76 | "dev": true 77 | }, 78 | "@types/node-fetch": { 79 | "version": "2.5.7", 80 | "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.7.tgz", 81 | "integrity": "sha512-o2WVNf5UhWRkxlf6eq+jMZDu7kjgpgJfl4xVNlvryc95O/6F2ld8ztKX+qu+Rjyet93WAWm5LjeX9H5FGkODvw==", 82 | "dev": true, 83 | "requires": { 84 | "@types/node": "*", 85 | "form-data": "^3.0.0" 86 | } 87 | }, 88 | "@types/power-assert": { 89 | "version": "1.5.3", 90 | "resolved": "https://registry.npmjs.org/@types/power-assert/-/power-assert-1.5.3.tgz", 91 | "integrity": "sha512-PzV9RX7RRUBYLxp52ipXo9dSvBnqVR09mcvGt3hXuzoJt0EUpPPv0X3btjCQqrhQ1xLbyt0dfPiGfRfrZB4G0A==", 92 | "dev": true, 93 | "requires": { 94 | "@types/empower": "*", 95 | "@types/power-assert-formatter": "*" 96 | } 97 | }, 98 | "@types/power-assert-formatter": { 99 | "version": "1.4.28", 100 | "resolved": "https://registry.npmjs.org/@types/power-assert-formatter/-/power-assert-formatter-1.4.28.tgz", 101 | "integrity": "sha1-Jbj922MiJZxrkcNTONObD45SQlI=", 102 | "dev": true 103 | }, 104 | "@types/prop-types": { 105 | "version": "15.7.3", 106 | "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", 107 | "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==", 108 | "dev": true 109 | }, 110 | "@types/qs": { 111 | "version": "6.9.3", 112 | "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.3.tgz", 113 | "integrity": "sha512-7s9EQWupR1fTc2pSMtXRQ9w9gLOcrJn+h7HOXw4evxyvVqMi4f+q7d2tnFe3ng3SNHjtK+0EzGMGFUQX4/AQRA==", 114 | "dev": true 115 | }, 116 | "@types/range-parser": { 117 | "version": "1.2.3", 118 | "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", 119 | "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", 120 | "dev": true 121 | }, 122 | "@types/react": { 123 | "version": "16.9.35", 124 | "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.35.tgz", 125 | "integrity": "sha512-q0n0SsWcGc8nDqH2GJfWQWUOmZSJhXV64CjVN5SvcNti3TdEaA3AH0D8DwNmMdzjMAC/78tB8nAZIlV8yTz+zQ==", 126 | "dev": true, 127 | "requires": { 128 | "@types/prop-types": "*", 129 | "csstype": "^2.2.0" 130 | } 131 | }, 132 | "@types/react-dom": { 133 | "version": "16.9.8", 134 | "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.8.tgz", 135 | "integrity": "sha512-ykkPQ+5nFknnlU6lDd947WbQ6TE3NNzbQAkInC2EKY1qeYdTKp7onFusmYZb+ityzx2YviqT6BXSu+LyWWJwcA==", 136 | "dev": true, 137 | "requires": { 138 | "@types/react": "*" 139 | } 140 | }, 141 | "@types/redis": { 142 | "version": "2.8.22", 143 | "resolved": "https://registry.npmjs.org/@types/redis/-/redis-2.8.22.tgz", 144 | "integrity": "sha512-O21YLcAtcSzax8wy4CfxMNjIMNf5X2c1pKTXDWLMa2p77Igvy7wuNjWVv+Db93wTvRvLLev6oq3IE7gxNKFZyg==", 145 | "dev": true, 146 | "requires": { 147 | "@types/node": "*" 148 | } 149 | }, 150 | "@types/serve-static": { 151 | "version": "1.13.4", 152 | "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.4.tgz", 153 | "integrity": "sha512-jTDt0o/YbpNwZbQmE/+2e+lfjJEJJR0I3OFaKQKPWkASkCoW3i6fsUnqudSMcNAfbtmADGu8f4MV4q+GqULmug==", 154 | "dev": true, 155 | "requires": { 156 | "@types/express-serve-static-core": "*", 157 | "@types/mime": "*" 158 | } 159 | }, 160 | "@types/svg2png": { 161 | "version": "4.1.0", 162 | "resolved": "https://registry.npmjs.org/@types/svg2png/-/svg2png-4.1.0.tgz", 163 | "integrity": "sha512-02AE1ye4msvqVHCm2kMTuUr8VGytZ0w1S6aPf0nAwTzX+EgmJ3ERYLrij6HSh9FVEqV6putkRjUFjRNiht2Oig==", 164 | "dev": true, 165 | "requires": { 166 | "@types/node": "*" 167 | } 168 | }, 169 | "@types/yargs": { 170 | "version": "15.0.5", 171 | "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz", 172 | "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==", 173 | "dev": true, 174 | "requires": { 175 | "@types/yargs-parser": "*" 176 | } 177 | }, 178 | "@types/yargs-parser": { 179 | "version": "15.0.0", 180 | "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", 181 | "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", 182 | "dev": true 183 | }, 184 | "accepts": { 185 | "version": "1.3.7", 186 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 187 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 188 | "requires": { 189 | "mime-types": "~2.1.24", 190 | "negotiator": "0.6.2" 191 | } 192 | }, 193 | "acorn": { 194 | "version": "5.7.4", 195 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", 196 | "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", 197 | "dev": true 198 | }, 199 | "acorn-es7-plugin": { 200 | "version": "1.1.7", 201 | "resolved": "https://registry.npmjs.org/acorn-es7-plugin/-/acorn-es7-plugin-1.1.7.tgz", 202 | "integrity": "sha1-8u4fMiipDurRJF+asZIusucdM2s=", 203 | "dev": true 204 | }, 205 | "ajv": { 206 | "version": "6.12.2", 207 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", 208 | "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", 209 | "requires": { 210 | "fast-deep-equal": "^3.1.1", 211 | "fast-json-stable-stringify": "^2.0.0", 212 | "json-schema-traverse": "^0.4.1", 213 | "uri-js": "^4.2.2" 214 | } 215 | }, 216 | "ansi-colors": { 217 | "version": "3.2.3", 218 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", 219 | "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", 220 | "dev": true 221 | }, 222 | "ansi-regex": { 223 | "version": "3.0.0", 224 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 225 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 226 | "dev": true 227 | }, 228 | "ansi-styles": { 229 | "version": "3.2.1", 230 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 231 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 232 | "dev": true, 233 | "requires": { 234 | "color-convert": "^1.9.0" 235 | } 236 | }, 237 | "anymatch": { 238 | "version": "3.1.1", 239 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", 240 | "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", 241 | "dev": true, 242 | "requires": { 243 | "normalize-path": "^3.0.0", 244 | "picomatch": "^2.0.4" 245 | } 246 | }, 247 | "arg": { 248 | "version": "4.1.3", 249 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", 250 | "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", 251 | "dev": true 252 | }, 253 | "argparse": { 254 | "version": "1.0.10", 255 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 256 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 257 | "dev": true, 258 | "requires": { 259 | "sprintf-js": "~1.0.2" 260 | } 261 | }, 262 | "array-filter": { 263 | "version": "1.0.0", 264 | "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", 265 | "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=", 266 | "dev": true 267 | }, 268 | "array-flatten": { 269 | "version": "1.1.1", 270 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 271 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 272 | }, 273 | "asn1": { 274 | "version": "0.2.4", 275 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 276 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 277 | "requires": { 278 | "safer-buffer": "~2.1.0" 279 | } 280 | }, 281 | "assert-plus": { 282 | "version": "1.0.0", 283 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 284 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 285 | }, 286 | "asynckit": { 287 | "version": "0.4.0", 288 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 289 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 290 | }, 291 | "aws-sign2": { 292 | "version": "0.7.0", 293 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 294 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 295 | }, 296 | "aws4": { 297 | "version": "1.10.0", 298 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", 299 | "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==" 300 | }, 301 | "balanced-match": { 302 | "version": "1.0.0", 303 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 304 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 305 | "dev": true 306 | }, 307 | "bcrypt-pbkdf": { 308 | "version": "1.0.2", 309 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 310 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 311 | "requires": { 312 | "tweetnacl": "^0.14.3" 313 | } 314 | }, 315 | "binary-extensions": { 316 | "version": "2.0.0", 317 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", 318 | "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", 319 | "dev": true 320 | }, 321 | "body-parser": { 322 | "version": "1.19.0", 323 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", 324 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", 325 | "requires": { 326 | "bytes": "3.1.0", 327 | "content-type": "~1.0.4", 328 | "debug": "2.6.9", 329 | "depd": "~1.1.2", 330 | "http-errors": "1.7.2", 331 | "iconv-lite": "0.4.24", 332 | "on-finished": "~2.3.0", 333 | "qs": "6.7.0", 334 | "raw-body": "2.4.0", 335 | "type-is": "~1.6.17" 336 | } 337 | }, 338 | "brace-expansion": { 339 | "version": "1.1.11", 340 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 341 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 342 | "dev": true, 343 | "requires": { 344 | "balanced-match": "^1.0.0", 345 | "concat-map": "0.0.1" 346 | } 347 | }, 348 | "braces": { 349 | "version": "3.0.2", 350 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 351 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 352 | "dev": true, 353 | "requires": { 354 | "fill-range": "^7.0.1" 355 | } 356 | }, 357 | "browser-stdout": { 358 | "version": "1.3.1", 359 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 360 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 361 | "dev": true 362 | }, 363 | "buffer-crc32": { 364 | "version": "0.2.13", 365 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 366 | "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" 367 | }, 368 | "buffer-from": { 369 | "version": "1.1.1", 370 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 371 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" 372 | }, 373 | "bytes": { 374 | "version": "3.1.0", 375 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 376 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" 377 | }, 378 | "call-signature": { 379 | "version": "0.0.2", 380 | "resolved": "https://registry.npmjs.org/call-signature/-/call-signature-0.0.2.tgz", 381 | "integrity": "sha1-qEq8glpV70yysCi9dOIFpluaSZY=", 382 | "dev": true 383 | }, 384 | "camelcase": { 385 | "version": "5.3.1", 386 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 387 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" 388 | }, 389 | "caseless": { 390 | "version": "0.12.0", 391 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 392 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 393 | }, 394 | "chalk": { 395 | "version": "2.4.2", 396 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 397 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 398 | "dev": true, 399 | "requires": { 400 | "ansi-styles": "^3.2.1", 401 | "escape-string-regexp": "^1.0.5", 402 | "supports-color": "^5.3.0" 403 | }, 404 | "dependencies": { 405 | "supports-color": { 406 | "version": "5.5.0", 407 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 408 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 409 | "dev": true, 410 | "requires": { 411 | "has-flag": "^3.0.0" 412 | } 413 | } 414 | } 415 | }, 416 | "chokidar": { 417 | "version": "3.3.0", 418 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", 419 | "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", 420 | "dev": true, 421 | "requires": { 422 | "anymatch": "~3.1.1", 423 | "braces": "~3.0.2", 424 | "fsevents": "~2.1.1", 425 | "glob-parent": "~5.1.0", 426 | "is-binary-path": "~2.1.0", 427 | "is-glob": "~4.0.1", 428 | "normalize-path": "~3.0.0", 429 | "readdirp": "~3.2.0" 430 | } 431 | }, 432 | "cliui": { 433 | "version": "5.0.0", 434 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", 435 | "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", 436 | "dev": true, 437 | "requires": { 438 | "string-width": "^3.1.0", 439 | "strip-ansi": "^5.2.0", 440 | "wrap-ansi": "^5.1.0" 441 | }, 442 | "dependencies": { 443 | "ansi-regex": { 444 | "version": "4.1.0", 445 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 446 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 447 | "dev": true 448 | }, 449 | "string-width": { 450 | "version": "3.1.0", 451 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 452 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 453 | "dev": true, 454 | "requires": { 455 | "emoji-regex": "^7.0.1", 456 | "is-fullwidth-code-point": "^2.0.0", 457 | "strip-ansi": "^5.1.0" 458 | } 459 | }, 460 | "strip-ansi": { 461 | "version": "5.2.0", 462 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 463 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 464 | "dev": true, 465 | "requires": { 466 | "ansi-regex": "^4.1.0" 467 | } 468 | } 469 | } 470 | }, 471 | "code-point-at": { 472 | "version": "1.1.0", 473 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 474 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 475 | }, 476 | "color-convert": { 477 | "version": "1.9.3", 478 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 479 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 480 | "dev": true, 481 | "requires": { 482 | "color-name": "1.1.3" 483 | } 484 | }, 485 | "color-name": { 486 | "version": "1.1.3", 487 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 488 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 489 | "dev": true 490 | }, 491 | "combined-stream": { 492 | "version": "1.0.8", 493 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 494 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 495 | "requires": { 496 | "delayed-stream": "~1.0.0" 497 | } 498 | }, 499 | "concat-map": { 500 | "version": "0.0.1", 501 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 502 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 503 | "dev": true 504 | }, 505 | "concat-stream": { 506 | "version": "1.6.2", 507 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", 508 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", 509 | "requires": { 510 | "buffer-from": "^1.0.0", 511 | "inherits": "^2.0.3", 512 | "readable-stream": "^2.2.2", 513 | "typedarray": "^0.0.6" 514 | } 515 | }, 516 | "content-disposition": { 517 | "version": "0.5.3", 518 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 519 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 520 | "requires": { 521 | "safe-buffer": "5.1.2" 522 | } 523 | }, 524 | "content-type": { 525 | "version": "1.0.4", 526 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 527 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 528 | }, 529 | "cookie": { 530 | "version": "0.4.0", 531 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", 532 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" 533 | }, 534 | "cookie-signature": { 535 | "version": "1.0.6", 536 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 537 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 538 | }, 539 | "core-js": { 540 | "version": "2.6.11", 541 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", 542 | "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", 543 | "dev": true 544 | }, 545 | "core-util-is": { 546 | "version": "1.0.2", 547 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 548 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 549 | }, 550 | "csstype": { 551 | "version": "2.6.10", 552 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.10.tgz", 553 | "integrity": "sha512-D34BqZU4cIlMCY93rZHbrq9pjTAQJ3U8S8rfBqjwHxkGPThWFjzZDQpgMJY0QViLxth6ZKYiwFBo14RdN44U/w==", 554 | "dev": true 555 | }, 556 | "dashdash": { 557 | "version": "1.14.1", 558 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 559 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 560 | "requires": { 561 | "assert-plus": "^1.0.0" 562 | } 563 | }, 564 | "date-format": { 565 | "version": "3.0.0", 566 | "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", 567 | "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w==" 568 | }, 569 | "debug": { 570 | "version": "2.6.9", 571 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 572 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 573 | "requires": { 574 | "ms": "2.0.0" 575 | } 576 | }, 577 | "decamelize": { 578 | "version": "1.2.0", 579 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 580 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 581 | }, 582 | "define-properties": { 583 | "version": "1.1.3", 584 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 585 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 586 | "dev": true, 587 | "requires": { 588 | "object-keys": "^1.0.12" 589 | } 590 | }, 591 | "delayed-stream": { 592 | "version": "1.0.0", 593 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 594 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 595 | }, 596 | "denque": { 597 | "version": "1.4.1", 598 | "resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz", 599 | "integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ==" 600 | }, 601 | "depd": { 602 | "version": "1.1.2", 603 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 604 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 605 | }, 606 | "destroy": { 607 | "version": "1.0.4", 608 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 609 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 610 | }, 611 | "diff": { 612 | "version": "3.5.0", 613 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", 614 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", 615 | "dev": true 616 | }, 617 | "diff-match-patch": { 618 | "version": "1.0.5", 619 | "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz", 620 | "integrity": "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==", 621 | "dev": true 622 | }, 623 | "eastasianwidth": { 624 | "version": "0.2.0", 625 | "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", 626 | "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", 627 | "dev": true 628 | }, 629 | "ecc-jsbn": { 630 | "version": "0.1.2", 631 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 632 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 633 | "requires": { 634 | "jsbn": "~0.1.0", 635 | "safer-buffer": "^2.1.0" 636 | } 637 | }, 638 | "ee-first": { 639 | "version": "1.1.1", 640 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 641 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 642 | }, 643 | "emoji-regex": { 644 | "version": "7.0.3", 645 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 646 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 647 | "dev": true 648 | }, 649 | "empower": { 650 | "version": "1.3.1", 651 | "resolved": "https://registry.npmjs.org/empower/-/empower-1.3.1.tgz", 652 | "integrity": "sha512-uB6/ViBaawOO/uujFADTK3SqdYlxYNn+N4usK9MRKZ4Hbn/1QSy8k2PezxCA2/+JGbF8vd/eOfghZ90oOSDZCA==", 653 | "dev": true, 654 | "requires": { 655 | "core-js": "^2.0.0", 656 | "empower-core": "^1.2.0" 657 | } 658 | }, 659 | "empower-core": { 660 | "version": "1.2.0", 661 | "resolved": "https://registry.npmjs.org/empower-core/-/empower-core-1.2.0.tgz", 662 | "integrity": "sha512-g6+K6Geyc1o6FdXs9HwrXleCFan7d66G5xSCfSF7x1mJDCes6t0om9lFQG3zOrzh3Bkb/45N0cZ5Gqsf7YrzGQ==", 663 | "dev": true, 664 | "requires": { 665 | "call-signature": "0.0.2", 666 | "core-js": "^2.0.0" 667 | } 668 | }, 669 | "encodeurl": { 670 | "version": "1.0.2", 671 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 672 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 673 | }, 674 | "error-ex": { 675 | "version": "1.3.2", 676 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 677 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 678 | "requires": { 679 | "is-arrayish": "^0.2.1" 680 | } 681 | }, 682 | "es-abstract": { 683 | "version": "1.17.5", 684 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", 685 | "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", 686 | "dev": true, 687 | "requires": { 688 | "es-to-primitive": "^1.2.1", 689 | "function-bind": "^1.1.1", 690 | "has": "^1.0.3", 691 | "has-symbols": "^1.0.1", 692 | "is-callable": "^1.1.5", 693 | "is-regex": "^1.0.5", 694 | "object-inspect": "^1.7.0", 695 | "object-keys": "^1.1.1", 696 | "object.assign": "^4.1.0", 697 | "string.prototype.trimleft": "^2.1.1", 698 | "string.prototype.trimright": "^2.1.1" 699 | } 700 | }, 701 | "es-to-primitive": { 702 | "version": "1.2.1", 703 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 704 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 705 | "dev": true, 706 | "requires": { 707 | "is-callable": "^1.1.4", 708 | "is-date-object": "^1.0.1", 709 | "is-symbol": "^1.0.2" 710 | } 711 | }, 712 | "es6-promise": { 713 | "version": "4.2.8", 714 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", 715 | "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" 716 | }, 717 | "escape-html": { 718 | "version": "1.0.3", 719 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 720 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 721 | }, 722 | "escape-string-regexp": { 723 | "version": "1.0.5", 724 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 725 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 726 | "dev": true 727 | }, 728 | "esprima": { 729 | "version": "4.0.1", 730 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 731 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 732 | "dev": true 733 | }, 734 | "espurify": { 735 | "version": "1.8.1", 736 | "resolved": "https://registry.npmjs.org/espurify/-/espurify-1.8.1.tgz", 737 | "integrity": "sha512-ZDko6eY/o+D/gHCWyHTU85mKDgYcS4FJj7S+YD6WIInm7GQ6AnOjmcL4+buFV/JOztVLELi/7MmuGU5NHta0Mg==", 738 | "dev": true, 739 | "requires": { 740 | "core-js": "^2.0.0" 741 | } 742 | }, 743 | "estraverse": { 744 | "version": "4.3.0", 745 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 746 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 747 | "dev": true 748 | }, 749 | "etag": { 750 | "version": "1.8.1", 751 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 752 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 753 | }, 754 | "express": { 755 | "version": "4.17.1", 756 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", 757 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", 758 | "requires": { 759 | "accepts": "~1.3.7", 760 | "array-flatten": "1.1.1", 761 | "body-parser": "1.19.0", 762 | "content-disposition": "0.5.3", 763 | "content-type": "~1.0.4", 764 | "cookie": "0.4.0", 765 | "cookie-signature": "1.0.6", 766 | "debug": "2.6.9", 767 | "depd": "~1.1.2", 768 | "encodeurl": "~1.0.2", 769 | "escape-html": "~1.0.3", 770 | "etag": "~1.8.1", 771 | "finalhandler": "~1.1.2", 772 | "fresh": "0.5.2", 773 | "merge-descriptors": "1.0.1", 774 | "methods": "~1.1.2", 775 | "on-finished": "~2.3.0", 776 | "parseurl": "~1.3.3", 777 | "path-to-regexp": "0.1.7", 778 | "proxy-addr": "~2.0.5", 779 | "qs": "6.7.0", 780 | "range-parser": "~1.2.1", 781 | "safe-buffer": "5.1.2", 782 | "send": "0.17.1", 783 | "serve-static": "1.14.1", 784 | "setprototypeof": "1.1.1", 785 | "statuses": "~1.5.0", 786 | "type-is": "~1.6.18", 787 | "utils-merge": "1.0.1", 788 | "vary": "~1.1.2" 789 | } 790 | }, 791 | "extend": { 792 | "version": "3.0.2", 793 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 794 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 795 | }, 796 | "extract-zip": { 797 | "version": "1.7.0", 798 | "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", 799 | "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", 800 | "requires": { 801 | "concat-stream": "^1.6.2", 802 | "debug": "^2.6.9", 803 | "mkdirp": "^0.5.4", 804 | "yauzl": "^2.10.0" 805 | } 806 | }, 807 | "extsprintf": { 808 | "version": "1.3.0", 809 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 810 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 811 | }, 812 | "fast-deep-equal": { 813 | "version": "3.1.1", 814 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", 815 | "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" 816 | }, 817 | "fast-json-stable-stringify": { 818 | "version": "2.1.0", 819 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 820 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" 821 | }, 822 | "fd-slicer": { 823 | "version": "1.1.0", 824 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", 825 | "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", 826 | "requires": { 827 | "pend": "~1.2.0" 828 | } 829 | }, 830 | "file-url": { 831 | "version": "2.0.2", 832 | "resolved": "https://registry.npmjs.org/file-url/-/file-url-2.0.2.tgz", 833 | "integrity": "sha1-6VF4TXkJUSfTcTApqwY/QIGMoq4=" 834 | }, 835 | "fill-range": { 836 | "version": "7.0.1", 837 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 838 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 839 | "dev": true, 840 | "requires": { 841 | "to-regex-range": "^5.0.1" 842 | } 843 | }, 844 | "finalhandler": { 845 | "version": "1.1.2", 846 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 847 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 848 | "requires": { 849 | "debug": "2.6.9", 850 | "encodeurl": "~1.0.2", 851 | "escape-html": "~1.0.3", 852 | "on-finished": "~2.3.0", 853 | "parseurl": "~1.3.3", 854 | "statuses": "~1.5.0", 855 | "unpipe": "~1.0.0" 856 | } 857 | }, 858 | "find-up": { 859 | "version": "3.0.0", 860 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", 861 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", 862 | "dev": true, 863 | "requires": { 864 | "locate-path": "^3.0.0" 865 | } 866 | }, 867 | "flat": { 868 | "version": "4.1.0", 869 | "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", 870 | "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", 871 | "dev": true, 872 | "requires": { 873 | "is-buffer": "~2.0.3" 874 | } 875 | }, 876 | "flatted": { 877 | "version": "2.0.2", 878 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", 879 | "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==" 880 | }, 881 | "forever-agent": { 882 | "version": "0.6.1", 883 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 884 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 885 | }, 886 | "form-data": { 887 | "version": "3.0.0", 888 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", 889 | "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", 890 | "dev": true, 891 | "requires": { 892 | "asynckit": "^0.4.0", 893 | "combined-stream": "^1.0.8", 894 | "mime-types": "^2.1.12" 895 | } 896 | }, 897 | "forwarded": { 898 | "version": "0.1.2", 899 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 900 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 901 | }, 902 | "fp-ts": { 903 | "version": "2.6.2", 904 | "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-2.6.2.tgz", 905 | "integrity": "sha512-RUm0iNcD7eMFZo6W1K10kqi0DyYX06lbbjyNgKwEWg1kPZw91ZXlkEx/9cII1x/jY4fHzh14+Hquk5sJnXBzQA==" 906 | }, 907 | "fresh": { 908 | "version": "0.5.2", 909 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 910 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 911 | }, 912 | "fs-extra": { 913 | "version": "8.1.0", 914 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", 915 | "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", 916 | "requires": { 917 | "graceful-fs": "^4.2.0", 918 | "jsonfile": "^4.0.0", 919 | "universalify": "^0.1.0" 920 | } 921 | }, 922 | "fs.realpath": { 923 | "version": "1.0.0", 924 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 925 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 926 | "dev": true 927 | }, 928 | "fsevents": { 929 | "version": "2.1.3", 930 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", 931 | "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", 932 | "dev": true, 933 | "optional": true 934 | }, 935 | "function-bind": { 936 | "version": "1.1.1", 937 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 938 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 939 | "dev": true 940 | }, 941 | "get-caller-file": { 942 | "version": "2.0.5", 943 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 944 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" 945 | }, 946 | "getpass": { 947 | "version": "0.1.7", 948 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 949 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 950 | "requires": { 951 | "assert-plus": "^1.0.0" 952 | } 953 | }, 954 | "gh-language-colors": { 955 | "version": "0.1.0", 956 | "resolved": "https://registry.npmjs.org/gh-language-colors/-/gh-language-colors-0.1.0.tgz", 957 | "integrity": "sha512-G/Ev1m2EfwOLNE5LK5H4DH8iVDx9Yzek2hKCaCaSBx860DRYJ7O+MI3BXrrYUzLb+sk2YPkdWqJQB0PK4sKK8A==" 958 | }, 959 | "glob": { 960 | "version": "7.1.3", 961 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 962 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 963 | "dev": true, 964 | "requires": { 965 | "fs.realpath": "^1.0.0", 966 | "inflight": "^1.0.4", 967 | "inherits": "2", 968 | "minimatch": "^3.0.4", 969 | "once": "^1.3.0", 970 | "path-is-absolute": "^1.0.0" 971 | } 972 | }, 973 | "glob-parent": { 974 | "version": "5.1.1", 975 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", 976 | "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", 977 | "dev": true, 978 | "requires": { 979 | "is-glob": "^4.0.1" 980 | } 981 | }, 982 | "graceful-fs": { 983 | "version": "4.2.4", 984 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", 985 | "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" 986 | }, 987 | "growl": { 988 | "version": "1.10.5", 989 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", 990 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", 991 | "dev": true 992 | }, 993 | "har-schema": { 994 | "version": "2.0.0", 995 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 996 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 997 | }, 998 | "har-validator": { 999 | "version": "5.1.3", 1000 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", 1001 | "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", 1002 | "requires": { 1003 | "ajv": "^6.5.5", 1004 | "har-schema": "^2.0.0" 1005 | } 1006 | }, 1007 | "has": { 1008 | "version": "1.0.3", 1009 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1010 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1011 | "dev": true, 1012 | "requires": { 1013 | "function-bind": "^1.1.1" 1014 | } 1015 | }, 1016 | "has-flag": { 1017 | "version": "3.0.0", 1018 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1019 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 1020 | "dev": true 1021 | }, 1022 | "has-symbols": { 1023 | "version": "1.0.1", 1024 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", 1025 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", 1026 | "dev": true 1027 | }, 1028 | "hasha": { 1029 | "version": "2.2.0", 1030 | "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", 1031 | "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=", 1032 | "requires": { 1033 | "is-stream": "^1.0.1", 1034 | "pinkie-promise": "^2.0.0" 1035 | } 1036 | }, 1037 | "he": { 1038 | "version": "1.2.0", 1039 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 1040 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 1041 | "dev": true 1042 | }, 1043 | "hosted-git-info": { 1044 | "version": "2.8.8", 1045 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", 1046 | "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" 1047 | }, 1048 | "http-errors": { 1049 | "version": "1.7.2", 1050 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 1051 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", 1052 | "requires": { 1053 | "depd": "~1.1.2", 1054 | "inherits": "2.0.3", 1055 | "setprototypeof": "1.1.1", 1056 | "statuses": ">= 1.5.0 < 2", 1057 | "toidentifier": "1.0.0" 1058 | } 1059 | }, 1060 | "http-signature": { 1061 | "version": "1.2.0", 1062 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 1063 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 1064 | "requires": { 1065 | "assert-plus": "^1.0.0", 1066 | "jsprim": "^1.2.2", 1067 | "sshpk": "^1.7.0" 1068 | } 1069 | }, 1070 | "iconv-lite": { 1071 | "version": "0.4.24", 1072 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1073 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1074 | "requires": { 1075 | "safer-buffer": ">= 2.1.2 < 3" 1076 | } 1077 | }, 1078 | "indexof": { 1079 | "version": "0.0.1", 1080 | "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", 1081 | "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", 1082 | "dev": true 1083 | }, 1084 | "inflight": { 1085 | "version": "1.0.6", 1086 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1087 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1088 | "dev": true, 1089 | "requires": { 1090 | "once": "^1.3.0", 1091 | "wrappy": "1" 1092 | } 1093 | }, 1094 | "inherits": { 1095 | "version": "2.0.3", 1096 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1097 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 1098 | }, 1099 | "invert-kv": { 1100 | "version": "1.0.0", 1101 | "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", 1102 | "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" 1103 | }, 1104 | "io-ts": { 1105 | "version": "2.2.4", 1106 | "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-2.2.4.tgz", 1107 | "integrity": "sha512-a8A/3jekTgSPfQ+OG40sTiX2gohXZz89X1+TfKsWJ/vpA2dBilBkrGYPiDE8OaKMMG7xm5ma3SAZL5eNr4Bi2w==" 1108 | }, 1109 | "ipaddr.js": { 1110 | "version": "1.9.1", 1111 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 1112 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 1113 | }, 1114 | "is-arrayish": { 1115 | "version": "0.2.1", 1116 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 1117 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" 1118 | }, 1119 | "is-binary-path": { 1120 | "version": "2.1.0", 1121 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1122 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1123 | "dev": true, 1124 | "requires": { 1125 | "binary-extensions": "^2.0.0" 1126 | } 1127 | }, 1128 | "is-buffer": { 1129 | "version": "2.0.4", 1130 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", 1131 | "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", 1132 | "dev": true 1133 | }, 1134 | "is-callable": { 1135 | "version": "1.1.5", 1136 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", 1137 | "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", 1138 | "dev": true 1139 | }, 1140 | "is-date-object": { 1141 | "version": "1.0.2", 1142 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", 1143 | "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", 1144 | "dev": true 1145 | }, 1146 | "is-extglob": { 1147 | "version": "2.1.1", 1148 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1149 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 1150 | "dev": true 1151 | }, 1152 | "is-fullwidth-code-point": { 1153 | "version": "2.0.0", 1154 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1155 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 1156 | "dev": true 1157 | }, 1158 | "is-glob": { 1159 | "version": "4.0.1", 1160 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 1161 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 1162 | "dev": true, 1163 | "requires": { 1164 | "is-extglob": "^2.1.1" 1165 | } 1166 | }, 1167 | "is-number": { 1168 | "version": "7.0.0", 1169 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1170 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1171 | "dev": true 1172 | }, 1173 | "is-regex": { 1174 | "version": "1.0.5", 1175 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", 1176 | "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", 1177 | "dev": true, 1178 | "requires": { 1179 | "has": "^1.0.3" 1180 | } 1181 | }, 1182 | "is-stream": { 1183 | "version": "1.1.0", 1184 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 1185 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" 1186 | }, 1187 | "is-symbol": { 1188 | "version": "1.0.3", 1189 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", 1190 | "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", 1191 | "dev": true, 1192 | "requires": { 1193 | "has-symbols": "^1.0.1" 1194 | } 1195 | }, 1196 | "is-typedarray": { 1197 | "version": "1.0.0", 1198 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 1199 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 1200 | }, 1201 | "is-utf8": { 1202 | "version": "0.2.1", 1203 | "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", 1204 | "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" 1205 | }, 1206 | "isarray": { 1207 | "version": "1.0.0", 1208 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1209 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 1210 | }, 1211 | "isexe": { 1212 | "version": "2.0.0", 1213 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1214 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 1215 | }, 1216 | "isstream": { 1217 | "version": "0.1.2", 1218 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 1219 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 1220 | }, 1221 | "js-tokens": { 1222 | "version": "4.0.0", 1223 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1224 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 1225 | }, 1226 | "js-yaml": { 1227 | "version": "3.13.1", 1228 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 1229 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 1230 | "dev": true, 1231 | "requires": { 1232 | "argparse": "^1.0.7", 1233 | "esprima": "^4.0.0" 1234 | } 1235 | }, 1236 | "jsbn": { 1237 | "version": "0.1.1", 1238 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 1239 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" 1240 | }, 1241 | "json-schema": { 1242 | "version": "0.2.3", 1243 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 1244 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 1245 | }, 1246 | "json-schema-traverse": { 1247 | "version": "0.4.1", 1248 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1249 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 1250 | }, 1251 | "json-stringify-safe": { 1252 | "version": "5.0.1", 1253 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 1254 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 1255 | }, 1256 | "jsonfile": { 1257 | "version": "4.0.0", 1258 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", 1259 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", 1260 | "requires": { 1261 | "graceful-fs": "^4.1.6" 1262 | } 1263 | }, 1264 | "jsprim": { 1265 | "version": "1.4.1", 1266 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 1267 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 1268 | "requires": { 1269 | "assert-plus": "1.0.0", 1270 | "extsprintf": "1.3.0", 1271 | "json-schema": "0.2.3", 1272 | "verror": "1.10.0" 1273 | } 1274 | }, 1275 | "kew": { 1276 | "version": "0.7.0", 1277 | "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", 1278 | "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=" 1279 | }, 1280 | "klaw": { 1281 | "version": "1.3.1", 1282 | "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", 1283 | "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", 1284 | "requires": { 1285 | "graceful-fs": "^4.1.9" 1286 | } 1287 | }, 1288 | "lcid": { 1289 | "version": "1.0.0", 1290 | "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", 1291 | "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", 1292 | "requires": { 1293 | "invert-kv": "^1.0.0" 1294 | } 1295 | }, 1296 | "load-json-file": { 1297 | "version": "1.1.0", 1298 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", 1299 | "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", 1300 | "requires": { 1301 | "graceful-fs": "^4.1.2", 1302 | "parse-json": "^2.2.0", 1303 | "pify": "^2.0.0", 1304 | "pinkie-promise": "^2.0.0", 1305 | "strip-bom": "^2.0.0" 1306 | } 1307 | }, 1308 | "locate-path": { 1309 | "version": "3.0.0", 1310 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", 1311 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", 1312 | "dev": true, 1313 | "requires": { 1314 | "p-locate": "^3.0.0", 1315 | "path-exists": "^3.0.0" 1316 | } 1317 | }, 1318 | "lodash": { 1319 | "version": "4.17.15", 1320 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 1321 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", 1322 | "dev": true 1323 | }, 1324 | "log-symbols": { 1325 | "version": "3.0.0", 1326 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", 1327 | "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", 1328 | "dev": true, 1329 | "requires": { 1330 | "chalk": "^2.4.2" 1331 | } 1332 | }, 1333 | "log4js": { 1334 | "version": "6.3.0", 1335 | "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.3.0.tgz", 1336 | "integrity": "sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw==", 1337 | "requires": { 1338 | "date-format": "^3.0.0", 1339 | "debug": "^4.1.1", 1340 | "flatted": "^2.0.1", 1341 | "rfdc": "^1.1.4", 1342 | "streamroller": "^2.2.4" 1343 | }, 1344 | "dependencies": { 1345 | "debug": { 1346 | "version": "4.1.1", 1347 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 1348 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 1349 | "requires": { 1350 | "ms": "^2.1.1" 1351 | } 1352 | }, 1353 | "ms": { 1354 | "version": "2.1.2", 1355 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1356 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1357 | } 1358 | } 1359 | }, 1360 | "loose-envify": { 1361 | "version": "1.4.0", 1362 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 1363 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 1364 | "requires": { 1365 | "js-tokens": "^3.0.0 || ^4.0.0" 1366 | } 1367 | }, 1368 | "make-error": { 1369 | "version": "1.3.6", 1370 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", 1371 | "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", 1372 | "dev": true 1373 | }, 1374 | "media-typer": { 1375 | "version": "0.3.0", 1376 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1377 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 1378 | }, 1379 | "merge-descriptors": { 1380 | "version": "1.0.1", 1381 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 1382 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 1383 | }, 1384 | "methods": { 1385 | "version": "1.1.2", 1386 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1387 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 1388 | }, 1389 | "mime": { 1390 | "version": "1.6.0", 1391 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 1392 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 1393 | }, 1394 | "mime-db": { 1395 | "version": "1.44.0", 1396 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", 1397 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" 1398 | }, 1399 | "mime-types": { 1400 | "version": "2.1.27", 1401 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", 1402 | "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", 1403 | "requires": { 1404 | "mime-db": "1.44.0" 1405 | } 1406 | }, 1407 | "minimatch": { 1408 | "version": "3.0.4", 1409 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1410 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1411 | "dev": true, 1412 | "requires": { 1413 | "brace-expansion": "^1.1.7" 1414 | } 1415 | }, 1416 | "minimist": { 1417 | "version": "1.2.5", 1418 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 1419 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 1420 | }, 1421 | "mkdirp": { 1422 | "version": "0.5.5", 1423 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 1424 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 1425 | "requires": { 1426 | "minimist": "^1.2.5" 1427 | } 1428 | }, 1429 | "mocha": { 1430 | "version": "7.2.0", 1431 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz", 1432 | "integrity": "sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==", 1433 | "dev": true, 1434 | "requires": { 1435 | "ansi-colors": "3.2.3", 1436 | "browser-stdout": "1.3.1", 1437 | "chokidar": "3.3.0", 1438 | "debug": "3.2.6", 1439 | "diff": "3.5.0", 1440 | "escape-string-regexp": "1.0.5", 1441 | "find-up": "3.0.0", 1442 | "glob": "7.1.3", 1443 | "growl": "1.10.5", 1444 | "he": "1.2.0", 1445 | "js-yaml": "3.13.1", 1446 | "log-symbols": "3.0.0", 1447 | "minimatch": "3.0.4", 1448 | "mkdirp": "0.5.5", 1449 | "ms": "2.1.1", 1450 | "node-environment-flags": "1.0.6", 1451 | "object.assign": "4.1.0", 1452 | "strip-json-comments": "2.0.1", 1453 | "supports-color": "6.0.0", 1454 | "which": "1.3.1", 1455 | "wide-align": "1.1.3", 1456 | "yargs": "13.3.2", 1457 | "yargs-parser": "13.1.2", 1458 | "yargs-unparser": "1.6.0" 1459 | }, 1460 | "dependencies": { 1461 | "ansi-regex": { 1462 | "version": "4.1.0", 1463 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 1464 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 1465 | "dev": true 1466 | }, 1467 | "debug": { 1468 | "version": "3.2.6", 1469 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 1470 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 1471 | "dev": true, 1472 | "requires": { 1473 | "ms": "^2.1.1" 1474 | } 1475 | }, 1476 | "ms": { 1477 | "version": "2.1.1", 1478 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 1479 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", 1480 | "dev": true 1481 | }, 1482 | "string-width": { 1483 | "version": "3.1.0", 1484 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 1485 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 1486 | "dev": true, 1487 | "requires": { 1488 | "emoji-regex": "^7.0.1", 1489 | "is-fullwidth-code-point": "^2.0.0", 1490 | "strip-ansi": "^5.1.0" 1491 | } 1492 | }, 1493 | "strip-ansi": { 1494 | "version": "5.2.0", 1495 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1496 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1497 | "dev": true, 1498 | "requires": { 1499 | "ansi-regex": "^4.1.0" 1500 | } 1501 | }, 1502 | "yargs": { 1503 | "version": "13.3.2", 1504 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", 1505 | "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", 1506 | "dev": true, 1507 | "requires": { 1508 | "cliui": "^5.0.0", 1509 | "find-up": "^3.0.0", 1510 | "get-caller-file": "^2.0.1", 1511 | "require-directory": "^2.1.1", 1512 | "require-main-filename": "^2.0.0", 1513 | "set-blocking": "^2.0.0", 1514 | "string-width": "^3.0.0", 1515 | "which-module": "^2.0.0", 1516 | "y18n": "^4.0.0", 1517 | "yargs-parser": "^13.1.2" 1518 | } 1519 | } 1520 | } 1521 | }, 1522 | "ms": { 1523 | "version": "2.0.0", 1524 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1525 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1526 | }, 1527 | "negotiator": { 1528 | "version": "0.6.2", 1529 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 1530 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 1531 | }, 1532 | "node-environment-flags": { 1533 | "version": "1.0.6", 1534 | "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", 1535 | "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", 1536 | "dev": true, 1537 | "requires": { 1538 | "object.getownpropertydescriptors": "^2.0.3", 1539 | "semver": "^5.7.0" 1540 | } 1541 | }, 1542 | "node-fetch": { 1543 | "version": "2.6.0", 1544 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", 1545 | "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" 1546 | }, 1547 | "normalize-package-data": { 1548 | "version": "2.5.0", 1549 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", 1550 | "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", 1551 | "requires": { 1552 | "hosted-git-info": "^2.1.4", 1553 | "resolve": "^1.10.0", 1554 | "semver": "2 || 3 || 4 || 5", 1555 | "validate-npm-package-license": "^3.0.1" 1556 | } 1557 | }, 1558 | "normalize-path": { 1559 | "version": "3.0.0", 1560 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1561 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1562 | "dev": true 1563 | }, 1564 | "number-is-nan": { 1565 | "version": "1.0.1", 1566 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 1567 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 1568 | }, 1569 | "oauth-sign": { 1570 | "version": "0.9.0", 1571 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 1572 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" 1573 | }, 1574 | "object-assign": { 1575 | "version": "4.1.1", 1576 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1577 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 1578 | }, 1579 | "object-inspect": { 1580 | "version": "1.7.0", 1581 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", 1582 | "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", 1583 | "dev": true 1584 | }, 1585 | "object-keys": { 1586 | "version": "1.1.1", 1587 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 1588 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 1589 | "dev": true 1590 | }, 1591 | "object.assign": { 1592 | "version": "4.1.0", 1593 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", 1594 | "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", 1595 | "dev": true, 1596 | "requires": { 1597 | "define-properties": "^1.1.2", 1598 | "function-bind": "^1.1.1", 1599 | "has-symbols": "^1.0.0", 1600 | "object-keys": "^1.0.11" 1601 | } 1602 | }, 1603 | "object.getownpropertydescriptors": { 1604 | "version": "2.1.0", 1605 | "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", 1606 | "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", 1607 | "dev": true, 1608 | "requires": { 1609 | "define-properties": "^1.1.3", 1610 | "es-abstract": "^1.17.0-next.1" 1611 | } 1612 | }, 1613 | "on-finished": { 1614 | "version": "2.3.0", 1615 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 1616 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 1617 | "requires": { 1618 | "ee-first": "1.1.1" 1619 | } 1620 | }, 1621 | "once": { 1622 | "version": "1.4.0", 1623 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1624 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1625 | "dev": true, 1626 | "requires": { 1627 | "wrappy": "1" 1628 | } 1629 | }, 1630 | "os-locale": { 1631 | "version": "1.4.0", 1632 | "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", 1633 | "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", 1634 | "requires": { 1635 | "lcid": "^1.0.0" 1636 | } 1637 | }, 1638 | "p-limit": { 1639 | "version": "2.3.0", 1640 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 1641 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 1642 | "requires": { 1643 | "p-try": "^2.0.0" 1644 | } 1645 | }, 1646 | "p-locate": { 1647 | "version": "3.0.0", 1648 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", 1649 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", 1650 | "dev": true, 1651 | "requires": { 1652 | "p-limit": "^2.0.0" 1653 | } 1654 | }, 1655 | "p-try": { 1656 | "version": "2.2.0", 1657 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 1658 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" 1659 | }, 1660 | "parse-json": { 1661 | "version": "2.2.0", 1662 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", 1663 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", 1664 | "requires": { 1665 | "error-ex": "^1.2.0" 1666 | } 1667 | }, 1668 | "parseurl": { 1669 | "version": "1.3.3", 1670 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1671 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 1672 | }, 1673 | "path-exists": { 1674 | "version": "3.0.0", 1675 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 1676 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 1677 | "dev": true 1678 | }, 1679 | "path-is-absolute": { 1680 | "version": "1.0.1", 1681 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1682 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1683 | "dev": true 1684 | }, 1685 | "path-parse": { 1686 | "version": "1.0.6", 1687 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 1688 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" 1689 | }, 1690 | "path-to-regexp": { 1691 | "version": "0.1.7", 1692 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 1693 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 1694 | }, 1695 | "path-type": { 1696 | "version": "1.1.0", 1697 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", 1698 | "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", 1699 | "requires": { 1700 | "graceful-fs": "^4.1.2", 1701 | "pify": "^2.0.0", 1702 | "pinkie-promise": "^2.0.0" 1703 | } 1704 | }, 1705 | "pend": { 1706 | "version": "1.2.0", 1707 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 1708 | "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" 1709 | }, 1710 | "performance-now": { 1711 | "version": "2.1.0", 1712 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 1713 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 1714 | }, 1715 | "phantomjs-prebuilt": { 1716 | "version": "2.1.16", 1717 | "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz", 1718 | "integrity": "sha1-79ISpKOWbTZHaE6ouniFSb4q7+8=", 1719 | "requires": { 1720 | "es6-promise": "^4.0.3", 1721 | "extract-zip": "^1.6.5", 1722 | "fs-extra": "^1.0.0", 1723 | "hasha": "^2.2.0", 1724 | "kew": "^0.7.0", 1725 | "progress": "^1.1.8", 1726 | "request": "^2.81.0", 1727 | "request-progress": "^2.0.1", 1728 | "which": "^1.2.10" 1729 | }, 1730 | "dependencies": { 1731 | "fs-extra": { 1732 | "version": "1.0.0", 1733 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", 1734 | "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", 1735 | "requires": { 1736 | "graceful-fs": "^4.1.2", 1737 | "jsonfile": "^2.1.0", 1738 | "klaw": "^1.0.0" 1739 | } 1740 | }, 1741 | "jsonfile": { 1742 | "version": "2.4.0", 1743 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", 1744 | "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", 1745 | "requires": { 1746 | "graceful-fs": "^4.1.6" 1747 | } 1748 | } 1749 | } 1750 | }, 1751 | "picomatch": { 1752 | "version": "2.2.2", 1753 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", 1754 | "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", 1755 | "dev": true 1756 | }, 1757 | "pify": { 1758 | "version": "2.3.0", 1759 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 1760 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" 1761 | }, 1762 | "pinkie": { 1763 | "version": "2.0.4", 1764 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 1765 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" 1766 | }, 1767 | "pinkie-promise": { 1768 | "version": "2.0.1", 1769 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 1770 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 1771 | "requires": { 1772 | "pinkie": "^2.0.0" 1773 | } 1774 | }, 1775 | "pn": { 1776 | "version": "1.1.0", 1777 | "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", 1778 | "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" 1779 | }, 1780 | "power-assert": { 1781 | "version": "1.6.1", 1782 | "resolved": "https://registry.npmjs.org/power-assert/-/power-assert-1.6.1.tgz", 1783 | "integrity": "sha512-VWkkZV6Y+W8qLX/PtJu2Ur2jDPIs0a5vbP0TpKeybNcIXmT4vcKoVkyTp5lnQvTpY/DxacAZ4RZisHRHLJcAZQ==", 1784 | "dev": true, 1785 | "requires": { 1786 | "define-properties": "^1.1.2", 1787 | "empower": "^1.3.1", 1788 | "power-assert-formatter": "^1.4.1", 1789 | "universal-deep-strict-equal": "^1.2.1", 1790 | "xtend": "^4.0.0" 1791 | } 1792 | }, 1793 | "power-assert-context-formatter": { 1794 | "version": "1.2.0", 1795 | "resolved": "https://registry.npmjs.org/power-assert-context-formatter/-/power-assert-context-formatter-1.2.0.tgz", 1796 | "integrity": "sha512-HLNEW8Bin+BFCpk/zbyKwkEu9W8/zThIStxGo7weYcFkKgMuGCHUJhvJeBGXDZf0Qm2xis4pbnnciGZiX0EpSg==", 1797 | "dev": true, 1798 | "requires": { 1799 | "core-js": "^2.0.0", 1800 | "power-assert-context-traversal": "^1.2.0" 1801 | } 1802 | }, 1803 | "power-assert-context-reducer-ast": { 1804 | "version": "1.2.0", 1805 | "resolved": "https://registry.npmjs.org/power-assert-context-reducer-ast/-/power-assert-context-reducer-ast-1.2.0.tgz", 1806 | "integrity": "sha512-EgOxmZ/Lb7tw4EwSKX7ZnfC0P/qRZFEG28dx/690qvhmOJ6hgThYFm5TUWANDLK5NiNKlPBi5WekVGd2+5wPrw==", 1807 | "dev": true, 1808 | "requires": { 1809 | "acorn": "^5.0.0", 1810 | "acorn-es7-plugin": "^1.0.12", 1811 | "core-js": "^2.0.0", 1812 | "espurify": "^1.6.0", 1813 | "estraverse": "^4.2.0" 1814 | } 1815 | }, 1816 | "power-assert-context-traversal": { 1817 | "version": "1.2.0", 1818 | "resolved": "https://registry.npmjs.org/power-assert-context-traversal/-/power-assert-context-traversal-1.2.0.tgz", 1819 | "integrity": "sha512-NFoHU6g2umNajiP2l4qb0BRWD773Aw9uWdWYH9EQsVwIZnog5bd2YYLFCVvaxWpwNzWeEfZIon2xtyc63026pQ==", 1820 | "dev": true, 1821 | "requires": { 1822 | "core-js": "^2.0.0", 1823 | "estraverse": "^4.1.0" 1824 | } 1825 | }, 1826 | "power-assert-formatter": { 1827 | "version": "1.4.1", 1828 | "resolved": "https://registry.npmjs.org/power-assert-formatter/-/power-assert-formatter-1.4.1.tgz", 1829 | "integrity": "sha1-XcEl7VCj37HdomwZNH879Y7CiEo=", 1830 | "dev": true, 1831 | "requires": { 1832 | "core-js": "^2.0.0", 1833 | "power-assert-context-formatter": "^1.0.7", 1834 | "power-assert-context-reducer-ast": "^1.0.7", 1835 | "power-assert-renderer-assertion": "^1.0.7", 1836 | "power-assert-renderer-comparison": "^1.0.7", 1837 | "power-assert-renderer-diagram": "^1.0.7", 1838 | "power-assert-renderer-file": "^1.0.7" 1839 | } 1840 | }, 1841 | "power-assert-renderer-assertion": { 1842 | "version": "1.2.0", 1843 | "resolved": "https://registry.npmjs.org/power-assert-renderer-assertion/-/power-assert-renderer-assertion-1.2.0.tgz", 1844 | "integrity": "sha512-3F7Q1ZLmV2ZCQv7aV7NJLNK9G7QsostrhOU7U0RhEQS/0vhEqrRg2jEJl1jtUL4ZyL2dXUlaaqrmPv5r9kRvIg==", 1845 | "dev": true, 1846 | "requires": { 1847 | "power-assert-renderer-base": "^1.1.1", 1848 | "power-assert-util-string-width": "^1.2.0" 1849 | } 1850 | }, 1851 | "power-assert-renderer-base": { 1852 | "version": "1.1.1", 1853 | "resolved": "https://registry.npmjs.org/power-assert-renderer-base/-/power-assert-renderer-base-1.1.1.tgz", 1854 | "integrity": "sha1-lqZQxv0F7hvB9mtUrWFELIs/Y+s=", 1855 | "dev": true 1856 | }, 1857 | "power-assert-renderer-comparison": { 1858 | "version": "1.2.0", 1859 | "resolved": "https://registry.npmjs.org/power-assert-renderer-comparison/-/power-assert-renderer-comparison-1.2.0.tgz", 1860 | "integrity": "sha512-7c3RKPDBKK4E3JqdPtYRE9cM8AyX4LC4yfTvvTYyx8zSqmT5kJnXwzR0yWQLOavACllZfwrAGQzFiXPc5sWa+g==", 1861 | "dev": true, 1862 | "requires": { 1863 | "core-js": "^2.0.0", 1864 | "diff-match-patch": "^1.0.0", 1865 | "power-assert-renderer-base": "^1.1.1", 1866 | "stringifier": "^1.3.0", 1867 | "type-name": "^2.0.1" 1868 | } 1869 | }, 1870 | "power-assert-renderer-diagram": { 1871 | "version": "1.2.0", 1872 | "resolved": "https://registry.npmjs.org/power-assert-renderer-diagram/-/power-assert-renderer-diagram-1.2.0.tgz", 1873 | "integrity": "sha512-JZ6PC+DJPQqfU6dwSmpcoD7gNnb/5U77bU5KgNwPPa+i1Pxiz6UuDeM3EUBlhZ1HvH9tMjI60anqVyi5l2oNdg==", 1874 | "dev": true, 1875 | "requires": { 1876 | "core-js": "^2.0.0", 1877 | "power-assert-renderer-base": "^1.1.1", 1878 | "power-assert-util-string-width": "^1.2.0", 1879 | "stringifier": "^1.3.0" 1880 | } 1881 | }, 1882 | "power-assert-renderer-file": { 1883 | "version": "1.2.0", 1884 | "resolved": "https://registry.npmjs.org/power-assert-renderer-file/-/power-assert-renderer-file-1.2.0.tgz", 1885 | "integrity": "sha512-/oaVrRbeOtGoyyd7e4IdLP/jIIUFJdqJtsYzP9/88R39CMnfF/S/rUc8ZQalENfUfQ/wQHu+XZYRMaCEZmEesg==", 1886 | "dev": true, 1887 | "requires": { 1888 | "power-assert-renderer-base": "^1.1.1" 1889 | } 1890 | }, 1891 | "power-assert-util-string-width": { 1892 | "version": "1.2.0", 1893 | "resolved": "https://registry.npmjs.org/power-assert-util-string-width/-/power-assert-util-string-width-1.2.0.tgz", 1894 | "integrity": "sha512-lX90G0igAW0iyORTILZ/QjZWsa1MZ6VVY3L0K86e2eKun3S4LKPH4xZIl8fdeMYLfOjkaszbNSzf1uugLeAm2A==", 1895 | "dev": true, 1896 | "requires": { 1897 | "eastasianwidth": "^0.2.0" 1898 | } 1899 | }, 1900 | "process-nextick-args": { 1901 | "version": "2.0.1", 1902 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 1903 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 1904 | }, 1905 | "progress": { 1906 | "version": "1.1.8", 1907 | "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", 1908 | "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=" 1909 | }, 1910 | "prop-types": { 1911 | "version": "15.7.2", 1912 | "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", 1913 | "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", 1914 | "requires": { 1915 | "loose-envify": "^1.4.0", 1916 | "object-assign": "^4.1.1", 1917 | "react-is": "^16.8.1" 1918 | } 1919 | }, 1920 | "proxy-addr": { 1921 | "version": "2.0.6", 1922 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", 1923 | "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", 1924 | "requires": { 1925 | "forwarded": "~0.1.2", 1926 | "ipaddr.js": "1.9.1" 1927 | } 1928 | }, 1929 | "psl": { 1930 | "version": "1.8.0", 1931 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", 1932 | "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" 1933 | }, 1934 | "punycode": { 1935 | "version": "2.1.1", 1936 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1937 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" 1938 | }, 1939 | "qs": { 1940 | "version": "6.7.0", 1941 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 1942 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" 1943 | }, 1944 | "range-parser": { 1945 | "version": "1.2.1", 1946 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1947 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 1948 | }, 1949 | "raw-body": { 1950 | "version": "2.4.0", 1951 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", 1952 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", 1953 | "requires": { 1954 | "bytes": "3.1.0", 1955 | "http-errors": "1.7.2", 1956 | "iconv-lite": "0.4.24", 1957 | "unpipe": "1.0.0" 1958 | } 1959 | }, 1960 | "react": { 1961 | "version": "16.13.1", 1962 | "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz", 1963 | "integrity": "sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==", 1964 | "requires": { 1965 | "loose-envify": "^1.1.0", 1966 | "object-assign": "^4.1.1", 1967 | "prop-types": "^15.6.2" 1968 | } 1969 | }, 1970 | "react-dom": { 1971 | "version": "16.13.1", 1972 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.1.tgz", 1973 | "integrity": "sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==", 1974 | "requires": { 1975 | "loose-envify": "^1.1.0", 1976 | "object-assign": "^4.1.1", 1977 | "prop-types": "^15.6.2", 1978 | "scheduler": "^0.19.1" 1979 | } 1980 | }, 1981 | "react-is": { 1982 | "version": "16.13.1", 1983 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", 1984 | "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" 1985 | }, 1986 | "read-pkg": { 1987 | "version": "1.1.0", 1988 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", 1989 | "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", 1990 | "requires": { 1991 | "load-json-file": "^1.0.0", 1992 | "normalize-package-data": "^2.3.2", 1993 | "path-type": "^1.0.0" 1994 | } 1995 | }, 1996 | "read-pkg-up": { 1997 | "version": "1.0.1", 1998 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", 1999 | "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", 2000 | "requires": { 2001 | "find-up": "^1.0.0", 2002 | "read-pkg": "^1.0.0" 2003 | }, 2004 | "dependencies": { 2005 | "find-up": { 2006 | "version": "1.1.2", 2007 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", 2008 | "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", 2009 | "requires": { 2010 | "path-exists": "^2.0.0", 2011 | "pinkie-promise": "^2.0.0" 2012 | } 2013 | }, 2014 | "path-exists": { 2015 | "version": "2.1.0", 2016 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", 2017 | "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", 2018 | "requires": { 2019 | "pinkie-promise": "^2.0.0" 2020 | } 2021 | } 2022 | } 2023 | }, 2024 | "readable-stream": { 2025 | "version": "2.3.7", 2026 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 2027 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 2028 | "requires": { 2029 | "core-util-is": "~1.0.0", 2030 | "inherits": "~2.0.3", 2031 | "isarray": "~1.0.0", 2032 | "process-nextick-args": "~2.0.0", 2033 | "safe-buffer": "~5.1.1", 2034 | "string_decoder": "~1.1.1", 2035 | "util-deprecate": "~1.0.1" 2036 | } 2037 | }, 2038 | "readdirp": { 2039 | "version": "3.2.0", 2040 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", 2041 | "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", 2042 | "dev": true, 2043 | "requires": { 2044 | "picomatch": "^2.0.4" 2045 | } 2046 | }, 2047 | "redis": { 2048 | "version": "3.0.2", 2049 | "resolved": "https://registry.npmjs.org/redis/-/redis-3.0.2.tgz", 2050 | "integrity": "sha512-PNhLCrjU6vKVuMOyFu7oSP296mwBkcE6lrAjruBYG5LgdSqtRBoVQIylrMyVZD/lkF24RSNNatzvYag6HRBHjQ==", 2051 | "requires": { 2052 | "denque": "^1.4.1", 2053 | "redis-commands": "^1.5.0", 2054 | "redis-errors": "^1.2.0", 2055 | "redis-parser": "^3.0.0" 2056 | } 2057 | }, 2058 | "redis-commands": { 2059 | "version": "1.5.0", 2060 | "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.5.0.tgz", 2061 | "integrity": "sha512-6KxamqpZ468MeQC3bkWmCB1fp56XL64D4Kf0zJSwDZbVLLm7KFkoIcHrgRvQ+sk8dnhySs7+yBg94yIkAK7aJg==" 2062 | }, 2063 | "redis-errors": { 2064 | "version": "1.2.0", 2065 | "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", 2066 | "integrity": "sha1-62LSrbFeTq9GEMBK/hUpOEJQq60=" 2067 | }, 2068 | "redis-parser": { 2069 | "version": "3.0.0", 2070 | "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", 2071 | "integrity": "sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ=", 2072 | "requires": { 2073 | "redis-errors": "^1.0.0" 2074 | } 2075 | }, 2076 | "request": { 2077 | "version": "2.88.2", 2078 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", 2079 | "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", 2080 | "requires": { 2081 | "aws-sign2": "~0.7.0", 2082 | "aws4": "^1.8.0", 2083 | "caseless": "~0.12.0", 2084 | "combined-stream": "~1.0.6", 2085 | "extend": "~3.0.2", 2086 | "forever-agent": "~0.6.1", 2087 | "form-data": "~2.3.2", 2088 | "har-validator": "~5.1.3", 2089 | "http-signature": "~1.2.0", 2090 | "is-typedarray": "~1.0.0", 2091 | "isstream": "~0.1.2", 2092 | "json-stringify-safe": "~5.0.1", 2093 | "mime-types": "~2.1.19", 2094 | "oauth-sign": "~0.9.0", 2095 | "performance-now": "^2.1.0", 2096 | "qs": "~6.5.2", 2097 | "safe-buffer": "^5.1.2", 2098 | "tough-cookie": "~2.5.0", 2099 | "tunnel-agent": "^0.6.0", 2100 | "uuid": "^3.3.2" 2101 | }, 2102 | "dependencies": { 2103 | "form-data": { 2104 | "version": "2.3.3", 2105 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 2106 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 2107 | "requires": { 2108 | "asynckit": "^0.4.0", 2109 | "combined-stream": "^1.0.6", 2110 | "mime-types": "^2.1.12" 2111 | } 2112 | }, 2113 | "qs": { 2114 | "version": "6.5.2", 2115 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 2116 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 2117 | } 2118 | } 2119 | }, 2120 | "request-progress": { 2121 | "version": "2.0.1", 2122 | "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", 2123 | "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=", 2124 | "requires": { 2125 | "throttleit": "^1.0.0" 2126 | } 2127 | }, 2128 | "require-directory": { 2129 | "version": "2.1.1", 2130 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 2131 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" 2132 | }, 2133 | "require-main-filename": { 2134 | "version": "2.0.0", 2135 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", 2136 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" 2137 | }, 2138 | "resolve": { 2139 | "version": "1.17.0", 2140 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", 2141 | "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", 2142 | "requires": { 2143 | "path-parse": "^1.0.6" 2144 | } 2145 | }, 2146 | "rfdc": { 2147 | "version": "1.1.4", 2148 | "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz", 2149 | "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==" 2150 | }, 2151 | "safe-buffer": { 2152 | "version": "5.1.2", 2153 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 2154 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 2155 | }, 2156 | "safer-buffer": { 2157 | "version": "2.1.2", 2158 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2159 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 2160 | }, 2161 | "scheduler": { 2162 | "version": "0.19.1", 2163 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", 2164 | "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", 2165 | "requires": { 2166 | "loose-envify": "^1.1.0", 2167 | "object-assign": "^4.1.1" 2168 | } 2169 | }, 2170 | "semver": { 2171 | "version": "5.7.1", 2172 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 2173 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 2174 | }, 2175 | "send": { 2176 | "version": "0.17.1", 2177 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", 2178 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", 2179 | "requires": { 2180 | "debug": "2.6.9", 2181 | "depd": "~1.1.2", 2182 | "destroy": "~1.0.4", 2183 | "encodeurl": "~1.0.2", 2184 | "escape-html": "~1.0.3", 2185 | "etag": "~1.8.1", 2186 | "fresh": "0.5.2", 2187 | "http-errors": "~1.7.2", 2188 | "mime": "1.6.0", 2189 | "ms": "2.1.1", 2190 | "on-finished": "~2.3.0", 2191 | "range-parser": "~1.2.1", 2192 | "statuses": "~1.5.0" 2193 | }, 2194 | "dependencies": { 2195 | "ms": { 2196 | "version": "2.1.1", 2197 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 2198 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 2199 | } 2200 | } 2201 | }, 2202 | "serve-static": { 2203 | "version": "1.14.1", 2204 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", 2205 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", 2206 | "requires": { 2207 | "encodeurl": "~1.0.2", 2208 | "escape-html": "~1.0.3", 2209 | "parseurl": "~1.3.3", 2210 | "send": "0.17.1" 2211 | } 2212 | }, 2213 | "set-blocking": { 2214 | "version": "2.0.0", 2215 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 2216 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" 2217 | }, 2218 | "setprototypeof": { 2219 | "version": "1.1.1", 2220 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 2221 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 2222 | }, 2223 | "source-map": { 2224 | "version": "0.6.1", 2225 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 2226 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 2227 | "dev": true 2228 | }, 2229 | "source-map-support": { 2230 | "version": "0.5.19", 2231 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", 2232 | "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", 2233 | "dev": true, 2234 | "requires": { 2235 | "buffer-from": "^1.0.0", 2236 | "source-map": "^0.6.0" 2237 | } 2238 | }, 2239 | "spdx-correct": { 2240 | "version": "3.1.1", 2241 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", 2242 | "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", 2243 | "requires": { 2244 | "spdx-expression-parse": "^3.0.0", 2245 | "spdx-license-ids": "^3.0.0" 2246 | } 2247 | }, 2248 | "spdx-exceptions": { 2249 | "version": "2.3.0", 2250 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", 2251 | "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" 2252 | }, 2253 | "spdx-expression-parse": { 2254 | "version": "3.0.1", 2255 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", 2256 | "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", 2257 | "requires": { 2258 | "spdx-exceptions": "^2.1.0", 2259 | "spdx-license-ids": "^3.0.0" 2260 | } 2261 | }, 2262 | "spdx-license-ids": { 2263 | "version": "3.0.5", 2264 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", 2265 | "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" 2266 | }, 2267 | "sprintf-js": { 2268 | "version": "1.0.3", 2269 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 2270 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 2271 | "dev": true 2272 | }, 2273 | "sshpk": { 2274 | "version": "1.16.1", 2275 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", 2276 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", 2277 | "requires": { 2278 | "asn1": "~0.2.3", 2279 | "assert-plus": "^1.0.0", 2280 | "bcrypt-pbkdf": "^1.0.0", 2281 | "dashdash": "^1.12.0", 2282 | "ecc-jsbn": "~0.1.1", 2283 | "getpass": "^0.1.1", 2284 | "jsbn": "~0.1.0", 2285 | "safer-buffer": "^2.0.2", 2286 | "tweetnacl": "~0.14.0" 2287 | } 2288 | }, 2289 | "statuses": { 2290 | "version": "1.5.0", 2291 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 2292 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 2293 | }, 2294 | "streamroller": { 2295 | "version": "2.2.4", 2296 | "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-2.2.4.tgz", 2297 | "integrity": "sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ==", 2298 | "requires": { 2299 | "date-format": "^2.1.0", 2300 | "debug": "^4.1.1", 2301 | "fs-extra": "^8.1.0" 2302 | }, 2303 | "dependencies": { 2304 | "date-format": { 2305 | "version": "2.1.0", 2306 | "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", 2307 | "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==" 2308 | }, 2309 | "debug": { 2310 | "version": "4.1.1", 2311 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 2312 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 2313 | "requires": { 2314 | "ms": "^2.1.1" 2315 | } 2316 | }, 2317 | "ms": { 2318 | "version": "2.1.2", 2319 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2320 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 2321 | } 2322 | } 2323 | }, 2324 | "string-width": { 2325 | "version": "2.1.1", 2326 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 2327 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 2328 | "dev": true, 2329 | "requires": { 2330 | "is-fullwidth-code-point": "^2.0.0", 2331 | "strip-ansi": "^4.0.0" 2332 | } 2333 | }, 2334 | "string.prototype.trimend": { 2335 | "version": "1.0.1", 2336 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", 2337 | "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", 2338 | "dev": true, 2339 | "requires": { 2340 | "define-properties": "^1.1.3", 2341 | "es-abstract": "^1.17.5" 2342 | } 2343 | }, 2344 | "string.prototype.trimleft": { 2345 | "version": "2.1.2", 2346 | "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", 2347 | "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", 2348 | "dev": true, 2349 | "requires": { 2350 | "define-properties": "^1.1.3", 2351 | "es-abstract": "^1.17.5", 2352 | "string.prototype.trimstart": "^1.0.0" 2353 | } 2354 | }, 2355 | "string.prototype.trimright": { 2356 | "version": "2.1.2", 2357 | "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", 2358 | "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", 2359 | "dev": true, 2360 | "requires": { 2361 | "define-properties": "^1.1.3", 2362 | "es-abstract": "^1.17.5", 2363 | "string.prototype.trimend": "^1.0.0" 2364 | } 2365 | }, 2366 | "string.prototype.trimstart": { 2367 | "version": "1.0.1", 2368 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", 2369 | "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", 2370 | "dev": true, 2371 | "requires": { 2372 | "define-properties": "^1.1.3", 2373 | "es-abstract": "^1.17.5" 2374 | } 2375 | }, 2376 | "string_decoder": { 2377 | "version": "1.1.1", 2378 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 2379 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 2380 | "requires": { 2381 | "safe-buffer": "~5.1.0" 2382 | } 2383 | }, 2384 | "stringifier": { 2385 | "version": "1.4.0", 2386 | "resolved": "https://registry.npmjs.org/stringifier/-/stringifier-1.4.0.tgz", 2387 | "integrity": "sha512-cNsMOqqrcbLcHTXEVmkw9y0fwDwkdgtZwlfyolzpQDoAE1xdNGhQhxBUfiDvvZIKl1hnUEgMv66nHwtMz3OjPw==", 2388 | "dev": true, 2389 | "requires": { 2390 | "core-js": "^2.0.0", 2391 | "traverse": "^0.6.6", 2392 | "type-name": "^2.0.1" 2393 | } 2394 | }, 2395 | "strip-ansi": { 2396 | "version": "4.0.0", 2397 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 2398 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 2399 | "dev": true, 2400 | "requires": { 2401 | "ansi-regex": "^3.0.0" 2402 | } 2403 | }, 2404 | "strip-bom": { 2405 | "version": "2.0.0", 2406 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", 2407 | "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", 2408 | "requires": { 2409 | "is-utf8": "^0.2.0" 2410 | } 2411 | }, 2412 | "strip-json-comments": { 2413 | "version": "2.0.1", 2414 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 2415 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 2416 | "dev": true 2417 | }, 2418 | "supports-color": { 2419 | "version": "6.0.0", 2420 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", 2421 | "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", 2422 | "dev": true, 2423 | "requires": { 2424 | "has-flag": "^3.0.0" 2425 | } 2426 | }, 2427 | "svg2png": { 2428 | "version": "4.1.1", 2429 | "resolved": "https://registry.npmjs.org/svg2png/-/svg2png-4.1.1.tgz", 2430 | "integrity": "sha1-a54DmKpBh3i2Q24Sei+38A1JnCg=", 2431 | "requires": { 2432 | "file-url": "^2.0.0", 2433 | "phantomjs-prebuilt": "^2.1.14", 2434 | "pn": "^1.0.0", 2435 | "yargs": "^6.5.0" 2436 | }, 2437 | "dependencies": { 2438 | "ansi-regex": { 2439 | "version": "2.1.1", 2440 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 2441 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 2442 | }, 2443 | "camelcase": { 2444 | "version": "3.0.0", 2445 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", 2446 | "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" 2447 | }, 2448 | "cliui": { 2449 | "version": "3.2.0", 2450 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", 2451 | "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", 2452 | "requires": { 2453 | "string-width": "^1.0.1", 2454 | "strip-ansi": "^3.0.1", 2455 | "wrap-ansi": "^2.0.0" 2456 | } 2457 | }, 2458 | "get-caller-file": { 2459 | "version": "1.0.3", 2460 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", 2461 | "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" 2462 | }, 2463 | "is-fullwidth-code-point": { 2464 | "version": "1.0.0", 2465 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 2466 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 2467 | "requires": { 2468 | "number-is-nan": "^1.0.0" 2469 | } 2470 | }, 2471 | "require-main-filename": { 2472 | "version": "1.0.1", 2473 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", 2474 | "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" 2475 | }, 2476 | "string-width": { 2477 | "version": "1.0.2", 2478 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 2479 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 2480 | "requires": { 2481 | "code-point-at": "^1.0.0", 2482 | "is-fullwidth-code-point": "^1.0.0", 2483 | "strip-ansi": "^3.0.0" 2484 | } 2485 | }, 2486 | "strip-ansi": { 2487 | "version": "3.0.1", 2488 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 2489 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 2490 | "requires": { 2491 | "ansi-regex": "^2.0.0" 2492 | } 2493 | }, 2494 | "which-module": { 2495 | "version": "1.0.0", 2496 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", 2497 | "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" 2498 | }, 2499 | "wrap-ansi": { 2500 | "version": "2.1.0", 2501 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", 2502 | "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", 2503 | "requires": { 2504 | "string-width": "^1.0.1", 2505 | "strip-ansi": "^3.0.1" 2506 | } 2507 | }, 2508 | "y18n": { 2509 | "version": "3.2.1", 2510 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", 2511 | "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" 2512 | }, 2513 | "yargs": { 2514 | "version": "6.6.0", 2515 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", 2516 | "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", 2517 | "requires": { 2518 | "camelcase": "^3.0.0", 2519 | "cliui": "^3.2.0", 2520 | "decamelize": "^1.1.1", 2521 | "get-caller-file": "^1.0.1", 2522 | "os-locale": "^1.4.0", 2523 | "read-pkg-up": "^1.0.1", 2524 | "require-directory": "^2.1.1", 2525 | "require-main-filename": "^1.0.1", 2526 | "set-blocking": "^2.0.0", 2527 | "string-width": "^1.0.2", 2528 | "which-module": "^1.0.0", 2529 | "y18n": "^3.2.1", 2530 | "yargs-parser": "^4.2.0" 2531 | } 2532 | }, 2533 | "yargs-parser": { 2534 | "version": "4.2.1", 2535 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", 2536 | "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", 2537 | "requires": { 2538 | "camelcase": "^3.0.0" 2539 | } 2540 | } 2541 | } 2542 | }, 2543 | "throttleit": { 2544 | "version": "1.0.0", 2545 | "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", 2546 | "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=" 2547 | }, 2548 | "to-regex-range": { 2549 | "version": "5.0.1", 2550 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2551 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2552 | "dev": true, 2553 | "requires": { 2554 | "is-number": "^7.0.0" 2555 | } 2556 | }, 2557 | "toidentifier": { 2558 | "version": "1.0.0", 2559 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 2560 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 2561 | }, 2562 | "tough-cookie": { 2563 | "version": "2.5.0", 2564 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", 2565 | "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", 2566 | "requires": { 2567 | "psl": "^1.1.28", 2568 | "punycode": "^2.1.1" 2569 | } 2570 | }, 2571 | "traverse": { 2572 | "version": "0.6.6", 2573 | "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", 2574 | "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=", 2575 | "dev": true 2576 | }, 2577 | "ts-node": { 2578 | "version": "8.10.1", 2579 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.10.1.tgz", 2580 | "integrity": "sha512-bdNz1L4ekHiJul6SHtZWs1ujEKERJnHs4HxN7rjTyyVOFf3HaJ6sLqe6aPG62XTzAB/63pKRh5jTSWL0D7bsvw==", 2581 | "dev": true, 2582 | "requires": { 2583 | "arg": "^4.1.0", 2584 | "diff": "^4.0.1", 2585 | "make-error": "^1.1.1", 2586 | "source-map-support": "^0.5.17", 2587 | "yn": "3.1.1" 2588 | }, 2589 | "dependencies": { 2590 | "diff": { 2591 | "version": "4.0.2", 2592 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 2593 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 2594 | "dev": true 2595 | } 2596 | } 2597 | }, 2598 | "tunnel-agent": { 2599 | "version": "0.6.0", 2600 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 2601 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 2602 | "requires": { 2603 | "safe-buffer": "^5.0.1" 2604 | } 2605 | }, 2606 | "tweetnacl": { 2607 | "version": "0.14.5", 2608 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 2609 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" 2610 | }, 2611 | "type-is": { 2612 | "version": "1.6.18", 2613 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 2614 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 2615 | "requires": { 2616 | "media-typer": "0.3.0", 2617 | "mime-types": "~2.1.24" 2618 | } 2619 | }, 2620 | "type-name": { 2621 | "version": "2.0.2", 2622 | "resolved": "https://registry.npmjs.org/type-name/-/type-name-2.0.2.tgz", 2623 | "integrity": "sha1-7+fUEj2KxSr/9/QMfk3sUmYAj7Q=", 2624 | "dev": true 2625 | }, 2626 | "typedarray": { 2627 | "version": "0.0.6", 2628 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 2629 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" 2630 | }, 2631 | "typescript": { 2632 | "version": "3.9.3", 2633 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.3.tgz", 2634 | "integrity": "sha512-D/wqnB2xzNFIcoBG9FG8cXRDjiqSTbG2wd8DMZeQyJlP1vfTkIxH4GKveWaEBYySKIg+USu+E+EDIR47SqnaMQ==", 2635 | "dev": true 2636 | }, 2637 | "universal-deep-strict-equal": { 2638 | "version": "1.2.2", 2639 | "resolved": "https://registry.npmjs.org/universal-deep-strict-equal/-/universal-deep-strict-equal-1.2.2.tgz", 2640 | "integrity": "sha1-DaSsL3PP95JMgfpN4BjKViyisKc=", 2641 | "dev": true, 2642 | "requires": { 2643 | "array-filter": "^1.0.0", 2644 | "indexof": "0.0.1", 2645 | "object-keys": "^1.0.0" 2646 | } 2647 | }, 2648 | "universalify": { 2649 | "version": "0.1.2", 2650 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 2651 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" 2652 | }, 2653 | "unpipe": { 2654 | "version": "1.0.0", 2655 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 2656 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 2657 | }, 2658 | "uri-js": { 2659 | "version": "4.2.2", 2660 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 2661 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 2662 | "requires": { 2663 | "punycode": "^2.1.0" 2664 | } 2665 | }, 2666 | "util-deprecate": { 2667 | "version": "1.0.2", 2668 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2669 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 2670 | }, 2671 | "utils-merge": { 2672 | "version": "1.0.1", 2673 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 2674 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 2675 | }, 2676 | "uuid": { 2677 | "version": "3.4.0", 2678 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", 2679 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" 2680 | }, 2681 | "validate-npm-package-license": { 2682 | "version": "3.0.4", 2683 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", 2684 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", 2685 | "requires": { 2686 | "spdx-correct": "^3.0.0", 2687 | "spdx-expression-parse": "^3.0.0" 2688 | } 2689 | }, 2690 | "vary": { 2691 | "version": "1.1.2", 2692 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 2693 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 2694 | }, 2695 | "verror": { 2696 | "version": "1.10.0", 2697 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 2698 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 2699 | "requires": { 2700 | "assert-plus": "^1.0.0", 2701 | "core-util-is": "1.0.2", 2702 | "extsprintf": "^1.2.0" 2703 | } 2704 | }, 2705 | "which": { 2706 | "version": "1.3.1", 2707 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 2708 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 2709 | "requires": { 2710 | "isexe": "^2.0.0" 2711 | } 2712 | }, 2713 | "which-module": { 2714 | "version": "2.0.0", 2715 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", 2716 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" 2717 | }, 2718 | "wide-align": { 2719 | "version": "1.1.3", 2720 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", 2721 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", 2722 | "dev": true, 2723 | "requires": { 2724 | "string-width": "^1.0.2 || 2" 2725 | } 2726 | }, 2727 | "wrap-ansi": { 2728 | "version": "5.1.0", 2729 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", 2730 | "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", 2731 | "dev": true, 2732 | "requires": { 2733 | "ansi-styles": "^3.2.0", 2734 | "string-width": "^3.0.0", 2735 | "strip-ansi": "^5.0.0" 2736 | }, 2737 | "dependencies": { 2738 | "ansi-regex": { 2739 | "version": "4.1.0", 2740 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 2741 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 2742 | "dev": true 2743 | }, 2744 | "string-width": { 2745 | "version": "3.1.0", 2746 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 2747 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 2748 | "dev": true, 2749 | "requires": { 2750 | "emoji-regex": "^7.0.1", 2751 | "is-fullwidth-code-point": "^2.0.0", 2752 | "strip-ansi": "^5.1.0" 2753 | } 2754 | }, 2755 | "strip-ansi": { 2756 | "version": "5.2.0", 2757 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 2758 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 2759 | "dev": true, 2760 | "requires": { 2761 | "ansi-regex": "^4.1.0" 2762 | } 2763 | } 2764 | } 2765 | }, 2766 | "wrappy": { 2767 | "version": "1.0.2", 2768 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2769 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 2770 | "dev": true 2771 | }, 2772 | "xtend": { 2773 | "version": "4.0.2", 2774 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 2775 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 2776 | "dev": true 2777 | }, 2778 | "y18n": { 2779 | "version": "4.0.0", 2780 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", 2781 | "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" 2782 | }, 2783 | "yargs": { 2784 | "version": "15.3.1", 2785 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", 2786 | "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", 2787 | "requires": { 2788 | "cliui": "^6.0.0", 2789 | "decamelize": "^1.2.0", 2790 | "find-up": "^4.1.0", 2791 | "get-caller-file": "^2.0.1", 2792 | "require-directory": "^2.1.1", 2793 | "require-main-filename": "^2.0.0", 2794 | "set-blocking": "^2.0.0", 2795 | "string-width": "^4.2.0", 2796 | "which-module": "^2.0.0", 2797 | "y18n": "^4.0.0", 2798 | "yargs-parser": "^18.1.1" 2799 | }, 2800 | "dependencies": { 2801 | "ansi-regex": { 2802 | "version": "5.0.0", 2803 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 2804 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" 2805 | }, 2806 | "ansi-styles": { 2807 | "version": "4.2.1", 2808 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", 2809 | "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", 2810 | "requires": { 2811 | "@types/color-name": "^1.1.1", 2812 | "color-convert": "^2.0.1" 2813 | } 2814 | }, 2815 | "cliui": { 2816 | "version": "6.0.0", 2817 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", 2818 | "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", 2819 | "requires": { 2820 | "string-width": "^4.2.0", 2821 | "strip-ansi": "^6.0.0", 2822 | "wrap-ansi": "^6.2.0" 2823 | } 2824 | }, 2825 | "color-convert": { 2826 | "version": "2.0.1", 2827 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 2828 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 2829 | "requires": { 2830 | "color-name": "~1.1.4" 2831 | } 2832 | }, 2833 | "color-name": { 2834 | "version": "1.1.4", 2835 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 2836 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 2837 | }, 2838 | "emoji-regex": { 2839 | "version": "8.0.0", 2840 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 2841 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 2842 | }, 2843 | "find-up": { 2844 | "version": "4.1.0", 2845 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", 2846 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", 2847 | "requires": { 2848 | "locate-path": "^5.0.0", 2849 | "path-exists": "^4.0.0" 2850 | } 2851 | }, 2852 | "is-fullwidth-code-point": { 2853 | "version": "3.0.0", 2854 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 2855 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" 2856 | }, 2857 | "locate-path": { 2858 | "version": "5.0.0", 2859 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 2860 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 2861 | "requires": { 2862 | "p-locate": "^4.1.0" 2863 | } 2864 | }, 2865 | "p-locate": { 2866 | "version": "4.1.0", 2867 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 2868 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 2869 | "requires": { 2870 | "p-limit": "^2.2.0" 2871 | } 2872 | }, 2873 | "path-exists": { 2874 | "version": "4.0.0", 2875 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 2876 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" 2877 | }, 2878 | "string-width": { 2879 | "version": "4.2.0", 2880 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", 2881 | "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", 2882 | "requires": { 2883 | "emoji-regex": "^8.0.0", 2884 | "is-fullwidth-code-point": "^3.0.0", 2885 | "strip-ansi": "^6.0.0" 2886 | } 2887 | }, 2888 | "strip-ansi": { 2889 | "version": "6.0.0", 2890 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 2891 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 2892 | "requires": { 2893 | "ansi-regex": "^5.0.0" 2894 | } 2895 | }, 2896 | "wrap-ansi": { 2897 | "version": "6.2.0", 2898 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", 2899 | "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", 2900 | "requires": { 2901 | "ansi-styles": "^4.0.0", 2902 | "string-width": "^4.1.0", 2903 | "strip-ansi": "^6.0.0" 2904 | } 2905 | }, 2906 | "yargs-parser": { 2907 | "version": "18.1.3", 2908 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", 2909 | "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", 2910 | "requires": { 2911 | "camelcase": "^5.0.0", 2912 | "decamelize": "^1.2.0" 2913 | } 2914 | } 2915 | } 2916 | }, 2917 | "yargs-parser": { 2918 | "version": "13.1.2", 2919 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", 2920 | "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", 2921 | "dev": true, 2922 | "requires": { 2923 | "camelcase": "^5.0.0", 2924 | "decamelize": "^1.2.0" 2925 | } 2926 | }, 2927 | "yargs-unparser": { 2928 | "version": "1.6.0", 2929 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", 2930 | "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", 2931 | "dev": true, 2932 | "requires": { 2933 | "flat": "^4.1.0", 2934 | "lodash": "^4.17.15", 2935 | "yargs": "^13.3.0" 2936 | }, 2937 | "dependencies": { 2938 | "ansi-regex": { 2939 | "version": "4.1.0", 2940 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 2941 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 2942 | "dev": true 2943 | }, 2944 | "string-width": { 2945 | "version": "3.1.0", 2946 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 2947 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 2948 | "dev": true, 2949 | "requires": { 2950 | "emoji-regex": "^7.0.1", 2951 | "is-fullwidth-code-point": "^2.0.0", 2952 | "strip-ansi": "^5.1.0" 2953 | } 2954 | }, 2955 | "strip-ansi": { 2956 | "version": "5.2.0", 2957 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 2958 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 2959 | "dev": true, 2960 | "requires": { 2961 | "ansi-regex": "^4.1.0" 2962 | } 2963 | }, 2964 | "yargs": { 2965 | "version": "13.3.2", 2966 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", 2967 | "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", 2968 | "dev": true, 2969 | "requires": { 2970 | "cliui": "^5.0.0", 2971 | "find-up": "^3.0.0", 2972 | "get-caller-file": "^2.0.1", 2973 | "require-directory": "^2.1.1", 2974 | "require-main-filename": "^2.0.0", 2975 | "set-blocking": "^2.0.0", 2976 | "string-width": "^3.0.0", 2977 | "which-module": "^2.0.0", 2978 | "y18n": "^4.0.0", 2979 | "yargs-parser": "^13.1.2" 2980 | } 2981 | } 2982 | } 2983 | }, 2984 | "yauzl": { 2985 | "version": "2.10.0", 2986 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", 2987 | "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", 2988 | "requires": { 2989 | "buffer-crc32": "~0.2.3", 2990 | "fd-slicer": "~1.1.0" 2991 | } 2992 | }, 2993 | "yn": { 2994 | "version": "3.1.1", 2995 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", 2996 | "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", 2997 | "dev": true 2998 | } 2999 | } 3000 | } 3001 | -------------------------------------------------------------------------------- /backend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gh-card-backend", 3 | "version": "0.1.0", 4 | "description": "", 5 | "main": "dist/src/index.js", 6 | "types": "dist/src/index.d.ts", 7 | "scripts": { 8 | "build": "tsc", 9 | "start": "npm run build && node ./dist/src/index.js", 10 | "prepare": "npm run build", 11 | "test": "mocha --require ts-node/register test/**/*.ts" 12 | }, 13 | "keywords": [], 14 | "repository": { 15 | "type": "git", 16 | "url": "https://github.com/nwtgck/gh-card" 17 | }, 18 | "author": "Ryo Ota", 19 | "license": "MIT", 20 | "devDependencies": { 21 | "@types/express": "^4.17.6", 22 | "@types/mocha": "^7.0.2", 23 | "@types/node": "^12.12.42", 24 | "@types/node-fetch": "^2.5.7", 25 | "@types/power-assert": "^1.5.3", 26 | "@types/react": "^16.9.35", 27 | "@types/react-dom": "^16.9.8", 28 | "@types/redis": "^2.8.22", 29 | "@types/svg2png": "^4.1.0", 30 | "@types/yargs": "^15.0.5", 31 | "mocha": "^7.2.0", 32 | "power-assert": "^1.6.1", 33 | "ts-node": "^8.10.1", 34 | "typescript": "^3.9.3" 35 | }, 36 | "dependencies": { 37 | "express": "^4.17.1", 38 | "fp-ts": "^2.6.2", 39 | "gh-language-colors": "^0.1.0", 40 | "io-ts": "^2.2.4", 41 | "log4js": "^6.3.0", 42 | "node-fetch": "^2.6.0", 43 | "react": "^16.13.1", 44 | "react-dom": "^16.13.1", 45 | "redis": "^3.0.2", 46 | "svg2png": "^4.1.1", 47 | "yargs": "^15.3.1" 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /backend/src/domain/GitHubApiService.ts: -------------------------------------------------------------------------------- 1 | import {GithubRepoJson} from '../types'; 2 | 3 | 4 | export interface GitHubApiService { 5 | /** 6 | * Get GitHub repository JSON via GitHub API 7 | * @param repoName owner/repo 8 | */ 9 | getRepository(repoName: string): Promise<{repo: GithubRepoJson} | {status: number, resText: string}>; 10 | } 11 | -------------------------------------------------------------------------------- /backend/src/domain/GitHubRepositoryJsonCacheRepository.ts: -------------------------------------------------------------------------------- 1 | export interface GitHubRepositoryJsonCacheRepository { 2 | cache(repoName: string, jsonString: string): void; 3 | get(repoName: string): Promise 4 | } 5 | -------------------------------------------------------------------------------- /backend/src/domain/GitHubRepositoryPngCardCacheRepository.ts: -------------------------------------------------------------------------------- 1 | export interface GitHubRepositoryPngCardCacheRepository { 2 | cache(png: Buffer, repoName: string, useFullName: boolean, width: number, height: number): void; 3 | get(repoName: string, useFullName: boolean, width: number, height: number): Promise; 4 | } 5 | -------------------------------------------------------------------------------- /backend/src/emoji-renderer.ts: -------------------------------------------------------------------------------- 1 | const symbolToEmoji = new Map(Object.entries({":+1:": "👍", ":100:": "💯", ":1234:": "🔢", ":8ball:": "🎱", ":a:": "🅰️", ":ab:": "🆎", ":abc:": "🔤", ":abcd:": "🔡", ":accept:": "🉑", ":aerial_tramway:": "🚡", ":airplane:": "✈️", ":alarm_clock:": "⏰", ":alien:": "👽", ":ambulance:": "🚑", ":anchor:": "⚓️", ":angel:": "👼", ":anger:": "💢", ":angry:": "😠", ":anguished:": "😧", ":ant:": "🐜", ":apple:": "🍎", ":aquarius:": "♒️", ":aries:": "♈️", ":arrow_backward:": "◀️", ":arrow_double_down:": "⏬", ":arrow_double_up:": "⏫", ":arrow_down:": "⬇️", ":arrow_down_small:": "🔽", ":arrow_forward:": "▶️", ":arrow_heading_down:": "⤵️", ":arrow_heading_up:": "⤴️", ":arrow_left:": "⬅️", ":arrow_lower_left:": "↙️", ":arrow_lower_right:": "↘️", ":arrow_right:": "➡️", ":arrow_right_hook:": "↪️", ":arrow_up:": "⬆️", ":arrow_up_down:": "↕️", ":arrow_up_small:": "🔼", ":arrow_upper_left:": "↖️", ":arrow_upper_right:": "↗️", ":arrows_clockwise:": "🔃", ":arrows_counterclockwise:": "🔄", ":art:": "🎨", ":articulated_lorry:": "🚛", ":astonished:": "😲", ":athletic_shoe:": "👟", ":atm:": "🏧", ":b:": "🅱️", ":baby:": "👶", ":baby_bottle:": "🍼", ":baby_chick:": "🐤", ":baby_symbol:": "🚼", ":back:": "🔙", ":baggage_claim:": "🛄", ":balloon:": "🎈", ":ballot_box_with_check:": "☑️", ":bamboo:": "🎍", ":banana:": "🍌", ":bangbang:": "‼️", ":bank:": "🏦", ":bar_chart:": "📊", ":barber:": "💈", ":baseball:": "⚾️", ":basketball:": "🏀", ":bath:": "🛀", ":bathtub:": "🛁", ":battery:": "🔋", ":bear:": "🐻", ":bee:": "🐝", ":beer:": "🍺", ":beers:": "🍻", ":beetle:": "🐞", ":beginner:": "🔰", ":bell:": "🔔", ":bento:": "🍱", ":bicyclist:": "🚴", ":bike:": "🚲", ":bikini:": "👙", ":bird:": "🐦", ":birthday:": "🎂", ":black_circle:": "⚫️", ":black_joker:": "🃏", ":black_large_square:": "⬛️", ":black_medium_small_square:": "◾️", ":black_medium_square:": "◼️", ":black_nib:": "✒️", ":black_small_square:": "▪️", ":black_square_button:": "🔲", ":blossom:": "🌼", ":blowfish:": "🐡", ":blue_book:": "📘", ":blue_car:": "🚙", ":blue_heart:": "💙", ":blush:": "😊", ":boar:": "🐗", ":boat:": "⛵️", ":bomb:": "💣", ":book:": "📖", ":bookmark:": "🔖", ":bookmark_tabs:": "📑", ":books:": "📚", ":boom:": "💥", ":boot:": "👢", ":bouquet:": "💐", ":bow:": "🙇", ":bow_and_arrow:": "🏹", ":bowing_man:": "🙇", ":bowing_woman:": "🙇\u200D♀", ":bowling:": "🎳", ":bowtie:": ":bowtie:", ":boy:": "👦", ":bread:": "🍞", ":bride_with_veil:": "👰", ":bridge_at_night:": "🌉", ":briefcase:": "💼", ":broken_heart:": "💔", ":bug:": "🐛", ":bulb:": "💡", ":bullettrain_front:": "🚅", ":bullettrain_side:": "🚄", ":bus:": "🚌", ":busstop:": "🚏", ":bust_in_silhouette:": "👤", ":busts_in_silhouette:": "👥", ":cactus:": "🌵", ":cake:": "🍰", ":calendar:": "📆", ":calling:": "📲", ":camel:": "🐫", ":camera:": "📷", ":canada:": "🇨🇦", ":canary_islands:": "🇮🇨", ":cancer:": "♋️", ":candle:": "🕯", ":candy:": "🍬", ":capital_abcd:": "🔠", ":capricorn:": "♑️", ":car:": "🚗", ":card_index:": "📇", ":carousel_horse:": "🎠", ":cat:": "🐱", ":cat2:": "🐈", ":cd:": "💿", ":chart:": "💹", ":chart_with_downwards_trend:": "📉", ":chart_with_upwards_trend:": "📈", ":checkered_flag:": "🏁", ":cherries:": "🍒", ":cherry_blossom:": "🌸", ":chestnut:": "🌰", ":chicken:": "🐔", ":children_crossing:": "🚸", ":chocolate_bar:": "🍫", ":christmas_tree:": "🎄", ":church:": "⛪️", ":cinema:": "🎦", ":circus_tent:": "🎪", ":city_sunrise:": "🌇", ":city_sunset:": "🌆", ":cl:": "🆑", ":clap:": "👏", ":clapper:": "🎬", ":clipboard:": "📋", ":clock1:": "🕐", ":clock10:": "🕙", ":clock1030:": "🕥", ":clock11:": "🕚", ":clock1130:": "🕦", ":clock12:": "🕛", ":clock1230:": "🕧", ":clock130:": "🕜", ":clock2:": "🕑", ":clock230:": "🕝", ":clock3:": "🕒", ":clock330:": "🕞", ":clock4:": "🕓", ":clock430:": "🕟", ":clock5:": "🕔", ":clock530:": "🕠", ":clock6:": "🕕", ":clock630:": "🕡", ":clock7:": "🕖", ":clock730:": "🕢", ":clock8:": "🕗", ":clock830:": "🕣", ":clock9:": "🕘", ":clock930:": "🕤", ":closed_book:": "📕", ":closed_lock_with_key:": "🔐", ":closed_umbrella:": "🌂", ":cloud:": "☁️", ":clubs:": "♣️", ":cn:": "🇨🇳", ":cocktail:": "🍸", ":coffee:": "☕️", ":cold_sweat:": "😰", ":collision:": "💥", ":computer:": "💻", ":confetti_ball:": "🎊", ":confounded:": "😖", ":confused:": "😕", ":congratulations:": "㊗️", ":construction:": "🚧", ":construction_worker:": "👷", ":convenience_store:": "🏪", ":cookie:": "🍪", ":cool:": "🆒", ":cop:": "👮", ":copyright:": "©️", ":corn:": "🌽", ":couple:": "👫", ":couple_with_heart:": "💑", ":cow:": "🐮", ":cow2:": "🐄", ":credit_card:": "💳", ":crescent_moon:": "🌙", ":crocodile:": "🐊", ":crossed_flags:": "🎌", ":crown:": "👑", ":cry:": "😢", ":crying_cat_face:": "😿", ":crystal_ball:": "🔮", ":cupid:": "💘", ":curly_loop:": "➰", ":currency_exchange:": "💱", ":curry:": "🍛", ":custard:": "🍮", ":customs:": "🛃", ":cyclone:": "🌀", ":dancer:": "💃", ":dancers:": "👯", ":dango:": "🍡", ":dart:": "🎯", ":dash:": "💨", ":date:": "📅", ":de:": "🇩🇪", ":deciduous_tree:": "🌳", ":department_store:": "🏬", ":diamond_shape_with_a_dot_inside:": "💠", ":diamonds:": "♦️", ":disappointed:": "😞", ":disappointed_relieved:": "😥", ":dizzy:": "💫", ":dizzy_face:": "😵", ":do_not_litter:": "🚯", ":dog:": "🐶", ":dog2:": "🐕", ":dollar:": "💵", ":dolls:": "🎎", ":dolphin:": "🐬", ":door:": "🚪", ":doughnut:": "🍩", ":dragon:": "🐉", ":dragon_face:": "🐲", ":dress:": "👗", ":dromedary_camel:": "🐪", ":droplet:": "💧", ":dvd:": "📀", ":e-mail:": "📧", ":ear:": "👂", ":ear_of_rice:": "🌾", ":earth_africa:": "🌍", ":earth_americas:": "🌎", ":earth_asia:": "🌏", ":egg:": "🥚", ":eggplant:": "🍆", ":eight:": "8️⃣", ":eight_pointed_black_star:": "✴️", ":eight_spoked_asterisk:": "✳️", ":electric_plug:": "🔌", ":elephant:": "🐘", ":email:": "✉️", ":end:": "🔚", ":envelope:": "✉️", ":envelope_with_arrow:": "📩", ":es:": "🇪🇸", ":euro:": "💶", ":european_castle:": "🏰", ":european_post_office:": "🏤", ":evergreen_tree:": "🌲", ":exclamation:": "❗️", ":expressionless:": "😑", ":eyeglasses:": "👓", ":eyes:": "👀", ":facepunch:": "👊", ":factory:": "🏭", ":fallen_leaf:": "🍂", ":family:": "👪", ":fast_forward:": "⏩", ":fax:": "📠", ":fearful:": "😨", ":feelsgood:": ":feelsgood:", ":feet:": "🐾", ":ferris_wheel:": "🎡", ":file_folder:": "📁", ":finnadie:": ":finnadie:", ":fire:": "🔥", ":fire_engine:": "🚒", ":fireworks:": "🎆", ":first_quarter_moon:": "🌓", ":first_quarter_moon_with_face:": "🌛", ":fish:": "🐟", ":fish_cake:": "🍥", ":fishing_pole_and_fish:": "🎣", ":fist:": "✊", ":five:": "5️⃣", ":flags:": "🎏", ":flashlight:": "🔦", ":flipper:": "🐬", ":floppy_disk:": "💾", ":flower_playing_cards:": "🎴", ":flushed:": "😳", ":foggy:": "🌁", ":football:": "🏈", ":footprints:": "👣", ":fork_and_knife:": "🍴", ":fountain:": "⛲️", ":four:": "4️⃣", ":four_leaf_clover:": "🍀", ":fr:": "🇫🇷", ":free:": "🆓", ":fried_shrimp:": "🍤", ":fries:": "🍟", ":frog:": "🐸", ":frowning:": "😦", ":fu:": "🖕", ":fuelpump:": "⛽️", ":full_moon:": "🌕", ":full_moon_with_face:": "🌝", ":game_die:": "🎲", ":gb:": "🇬🇧", ":gem:": "💎", ":gemini:": "♊️", ":ghost:": "👻", ":gift:": "🎁", ":gift_heart:": "💝", ":girl:": "👧", ":globe_with_meridians:": "🌐", ":goat:": "🐐", ":goberserk:": ":goberserk:", ":godmode:": ":godmode:", ":golf:": "⛳️", ":grapes:": "🍇", ":green_apple:": "🍏", ":green_book:": "📗", ":green_heart:": "💚", ":grey_exclamation:": "❕", ":grey_question:": "❔", ":grimacing:": "😬", ":grin:": "😁", ":grinning:": "😀", ":guardsman:": "💂", ":guitar:": "🎸", ":gun:": "🔫", ":haircut:": "💇", ":hamburger:": "🍔", ":hammer:": "🔨", ":hamster:": "🐹", ":hand:": "✋", ":handbag:": "👜", ":hankey:": "💩", ":hash:": "#️⃣", ":hatched_chick:": "🐥", ":hatching_chick:": "🐣", ":headphones:": "🎧", ":hear_no_evil:": "🙉", ":heart:": "❤️", ":heart_decoration:": "💟", ":heart_eyes:": "😍", ":heart_eyes_cat:": "😻", ":heartbeat:": "💓", ":heartpulse:": "💗", ":hearts:": "♥️", ":heavy_check_mark:": "✔️", ":heavy_division_sign:": "➗", ":heavy_dollar_sign:": "💲", ":heavy_exclamation_mark:": "❗️", ":heavy_minus_sign:": "➖", ":heavy_multiplication_x:": "✖️", ":heavy_plus_sign:": "➕", ":helicopter:": "🚁", ":herb:": "🌿", ":hibiscus:": "🌺", ":high_brightness:": "🔆", ":high_heel:": "👠", ":hocho:": "🔪", ":honey_pot:": "🍯", ":honeybee:": "🐝", ":horse:": "🐴", ":horse_racing:": "🏇", ":hospital:": "🏥", ":hotel:": "🏨", ":hotsprings:": "♨️", ":hourglass:": "⌛️", ":hourglass_flowing_sand:": "⏳", ":house:": "🏠", ":house_with_garden:": "🏡", ":hurtrealbad:": ":hurtrealbad:", ":hushed:": "😯", ":ice_cream:": "🍨", ":icecream:": "🍦", ":id:": "🆔", ":ideograph_advantage:": "🉐", ":imp:": "👿", ":inbox_tray:": "📥", ":incoming_envelope:": "📨", ":information_desk_person:": "💁", ":information_source:": "ℹ️", ":innocent:": "😇", ":interrobang:": "⁉️", ":iphone:": "📱", ":it:": "🇮🇹", ":izakaya_lantern:": "🏮", ":jack_o_lantern:": "🎃", ":japan:": "🗾", ":japanese_castle:": "🏯", ":japanese_goblin:": "👺", ":japanese_ogre:": "👹", ":jeans:": "👖", ":joy:": "😂", ":joy_cat:": "😹", ":jp:": "🇯🇵", ":key:": "🔑", ":keycap_ten:": "🔟", ":kimono:": "👘", ":kiss:": "💋", ":kissing:": "😗", ":kissing_cat:": "😽", ":kissing_closed_eyes:": "😚", ":kissing_heart:": "😘", ":kissing_smiling_eyes:": "😙", ":koala:": "🐨", ":koko:": "🈁", ":kr:": "🇰🇷", ":lantern:": "🏮", ":large_blue_circle:": "🔵", ":large_blue_diamond:": "🔷", ":large_orange_diamond:": "🔶", ":last_quarter_moon:": "🌗", ":last_quarter_moon_with_face:": "🌜", ":laughing:": "😆", ":leaves:": "🍃", ":ledger:": "📒", ":left_luggage:": "🛅", ":left_right_arrow:": "↔️", ":leftwards_arrow_with_hook:": "↩️", ":lemon:": "🍋", ":leo:": "♌️", ":leopard:": "🐆", ":libra:": "♎️", ":light_rail:": "🚈", ":link:": "🔗", ":lips:": "👄", ":lipstick:": "💄", ":lock:": "🔒", ":lock_with_ink_pen:": "🔏", ":lollipop:": "🍭", ":loop:": "➿", ":loud_sound:": "🔊", ":loudspeaker:": "📢", ":love_hotel:": "🏩", ":love_letter:": "💌", ":low_brightness:": "🔅", ":m:": "Ⓜ️", ":mag:": "🔍", ":mag_right:": "🔎", ":mahjong:": "🀄️", ":mailbox:": "📫", ":mailbox_closed:": "📪", ":mailbox_with_mail:": "📬", ":mailbox_with_no_mail:": "📭", ":man:": "👨", ":man_with_gua_pi_mao:": "👲", ":man_with_turban:": "👳", ":mans_shoe:": "👞", ":maple_leaf:": "🍁", ":mask:": "😷", ":massage:": "💆", ":meat_on_bone:": "🍖", ":mega:": "📣", ":melon:": "🍈", ":memo:": "📝", ":mens:": "🚹", ":metal:": "🤘", ":metro:": "🚇", ":microphone:": "🎤", ":microscope:": "🔬", ":milky_way:": "🌌", ":minibus:": "🚐", ":minidisc:": "💽", ":mobile_phone_off:": "📴", ":money_with_wings:": "💸", ":moneybag:": "💰", ":monkey:": "🐒", ":monkey_face:": "🐵", ":monorail:": "🚝", ":moon:": "🌔", ":mortar_board:": "🎓", ":mount_fuji:": "🗻", ":mountain_bicyclist:": "🚵", ":mountain_cableway:": "🚠", ":mountain_railway:": "🚞", ":mouse:": "🐭", ":mouse2:": "🐁", ":movie_camera:": "🎥", ":moyai:": "🗿", ":muscle:": "💪", ":mushroom:": "🍄", ":musical_keyboard:": "🎹", ":musical_note:": "🎵", ":musical_score:": "🎼", ":mute:": "🔇", ":nail_care:": "💅", ":name_badge:": "📛", ":neckbeard:": ":neckbeard:", ":necktie:": "👔", ":negative_squared_cross_mark:": "❎", ":neutral_face:": "😐", ":new:": "🆕", ":new_moon:": "🌑", ":new_moon_with_face:": "🌚", ":newspaper:": "📰", ":ng:": "🆖", ":night_with_stars:": "🌃", ":nine:": "9️⃣", ":no_bell:": "🔕", ":no_bicycles:": "🚳", ":no_entry:": "⛔️", ":no_entry_sign:": "🚫", ":no_good:": "🙅", ":no_mobile_phones:": "📵", ":no_mouth:": "😶", ":no_pedestrians:": "🚷", ":no_smoking:": "🚭", ":non-potable_water:": "🚱", ":nose:": "👃", ":notebook:": "📓", ":notebook_with_decorative_cover:": "📔", ":notes:": "🎶", ":nut_and_bolt:": "🔩", ":o:": "⭕️", ":o2:": "🅾️", ":ocean:": "🌊", ":octocat:": ":octocat:", ":octopus:": "🐙", ":oden:": "🍢", ":office:": "🏢", ":ok:": "🆗", ":ok_hand:": "👌", ":ok_woman:": "🙆", ":older_man:": "👴", ":older_woman:": "👵", ":on:": "🔛", ":oncoming_automobile:": "🚘", ":oncoming_bus:": "🚍", ":oncoming_police_car:": "🚔", ":oncoming_taxi:": "🚖", ":one:": "1️⃣", ":open_book:": "📖", ":open_file_folder:": "📂", ":open_hands:": "👐", ":open_mouth:": "😮", ":ophiuchus:": "⛎", ":orange_book:": "📙", ":outbox_tray:": "📤", ":ox:": "🐂", ":package:": "📦", ":page_facing_up:": "📄", ":page_with_curl:": "📃", ":pager:": "📟", ":palm_tree:": "🌴", ":panda_face:": "🐼", ":paperclip:": "📎", ":parking:": "🅿️", ":part_alternation_mark:": "〽️", ":partly_sunny:": "⛅️", ":passport_control:": "🛂", ":paw_prints:": "🐾", ":peach:": "🍑", ":pear:": "🍐", ":pencil:": "📝", ":pencil2:": "✏️", ":penguin:": "🐧", ":pensive:": "😔", ":performing_arts:": "🎭", ":persevere:": "😣", ":person_frowning:": "🙍", ":person_with_blond_hair:": "👱", ":person_with_pouting_face:": "🙎", ":phone:": "☎️", ":pig:": "🐷", ":pig2:": "🐖", ":pig_nose:": "🐽", ":pill:": "💊", ":pineapple:": "🍍", ":pisces:": "♓️", ":pizza:": "🍕", ":point_down:": "👇", ":point_left:": "👈", ":point_right:": "👉", ":point_up:": "☝️", ":point_up_2:": "👆", ":police_car:": "🚓", ":poodle:": "🐩", ":poop:": "💩", ":post_office:": "🏣", ":postal_horn:": "📯", ":postbox:": "📮", ":potable_water:": "🚰", ":pouch:": "👝", ":poultry_leg:": "🍗", ":pound:": "💷", ":pouting_cat:": "😾", ":pray:": "🙏", ":princess:": "👸", ":punch:": "👊", ":purple_heart:": "💜", ":purse:": "👛", ":pushpin:": "📌", ":put_litter_in_its_place:": "🚮", ":question:": "❓", ":rabbit:": "🐰", ":rabbit2:": "🐇", ":racehorse:": "🐎", ":radio:": "📻", ":radio_button:": "🔘", ":rage:": "😡", ":rage1:": ":rage1:", ":rage2:": ":rage2:", ":rage3:": ":rage3:", ":rage4:": ":rage4:", ":railway_car:": "🚃", ":rainbow:": "🌈", ":raised_hand:": "✋", ":raised_hands:": "🙌", ":raising_hand:": "🙋", ":ram:": "🐏", ":ramen:": "🍜", ":rat:": "🐀", ":recycle:": "♻️", ":red_car:": "🚗", ":red_circle:": "🔴", ":registered:": "®️", ":relaxed:": "☺️", ":relieved:": "😌", ":repeat:": "🔁", ":repeat_one:": "🔂", ":restroom:": "🚻", ":revolving_hearts:": "💞", ":rewind:": "⏪", ":ribbon:": "🎀", ":rice:": "🍚", ":rice_ball:": "🍙", ":rice_cracker:": "🍘", ":rice_scene:": "🎑", ":ring:": "💍", ":rocket:": "🚀", ":roller_coaster:": "🎢", ":rooster:": "🐓", ":rose:": "🌹", ":rotating_light:": "🚨", ":round_pushpin:": "📍", ":rowboat:": "🚣", ":ru:": "🇷🇺", ":rugby_football:": "🏉", ":runner:": "🏃", ":running:": "🏃", ":running_shirt_with_sash:": "🎽", ":sa:": "🈂️", ":sagittarius:": "♐️", ":sailboat:": "⛵️", ":sake:": "🍶", ":sandal:": "👡", ":santa:": "🎅", ":satellite:": "📡", ":satisfied:": "😆", ":saxophone:": "🎷", ":school:": "🏫", ":school_satchel:": "🎒", ":scissors:": "✂️", ":scorpius:": "♏️", ":scream:": "😱", ":scream_cat:": "🙀", ":scroll:": "📜", ":seat:": "💺", ":secret:": "㊙️", ":see_no_evil:": "🙈", ":seedling:": "🌱", ":seven:": "7️⃣", ":shaved_ice:": "🍧", ":sheep:": "🐑", ":shell:": "🐚", ":ship:": "🚢", ":shipit:": ":shipit:", ":shirt:": "👕", ":shit:": "💩", ":shoe:": "👞", ":shower:": "🚿", ":signal_strength:": "📶", ":six:": "6️⃣", ":six_pointed_star:": "🔯", ":ski:": "🎿", ":skull:": "💀", ":sleeping:": "😴", ":sleepy:": "😪", ":slot_machine:": "🎰", ":small_blue_diamond:": "🔹", ":small_orange_diamond:": "🔸", ":small_red_triangle:": "🔺", ":small_red_triangle_down:": "🔻", ":smile:": "😄", ":smile_cat:": "😸", ":smiley:": "😃", ":smiley_cat:": "😺", ":smiling_imp:": "😈", ":smirk:": "😏", ":smirk_cat:": "😼", ":smoking:": "🚬", ":snail:": "🐌", ":snake:": "🐍", ":snowboarder:": "🏂", ":snowflake:": "❄️", ":snowman:": "⛄️", ":sob:": "😭", ":soccer:": "⚽️", ":soon:": "🔜", ":sos:": "🆘", ":sound:": "🔉", ":space_invader:": "👾", ":spades:": "♠️", ":spaghetti:": "🍝", ":sparkle:": "❇️", ":sparkler:": "🎇", ":sparkles:": "✨", ":sparkling_heart:": "💖", ":speak_no_evil:": "🙊", ":speaker:": "🔈", ":speech_balloon:": "💬", ":speedboat:": "🚤", ":squirrel:": ":shipit:", ":star:": "⭐️", ":star2:": "🌟", ":stars:": "🌠", ":station:": "🚉", ":statue_of_liberty:": "🗽", ":steam_locomotive:": "🚂", ":stew:": "🍲", ":straight_ruler:": "📏", ":strawberry:": "🍓", ":stuck_out_tongue:": "😛", ":stuck_out_tongue_closed_eyes:": "😝", ":stuck_out_tongue_winking_eye:": "😜", ":sun_with_face:": "🌞", ":sunflower:": "🌻", ":sunglasses:": "😎", ":sunny:": "☀️", ":sunrise:": "🌅", ":sunrise_over_mountains:": "🌄", ":surfer:": "🏄", ":sushi:": "🍣", ":suspect:": ":suspect:", ":suspension_railway:": "🚟", ":sweat:": "😓", ":sweat_drops:": "💦", ":sweat_smile:": "😅", ":sweet_potato:": "🍠", ":swimmer:": "🏊", ":symbols:": "🔣", ":syringe:": "💉", ":tada:": "🎉", ":tanabata_tree:": "🎋", ":tangerine:": "🍊", ":taurus:": "♉️", ":taxi:": "🚕", ":tea:": "🍵", ":telephone:": "☎️", ":telephone_receiver:": "📞", ":telescope:": "🔭", ":tennis:": "🎾", ":tent:": "⛺️", ":thought_balloon:": "💭", ":three:": "3️⃣", ":thumbsdown:": "👎", ":thumbsup:": "👍", ":ticket:": "🎫", ":tiger:": "🐯", ":tiger2:": "🐅", ":tired_face:": "😫", ":tm:": "™️", ":toilet:": "🚽", ":tokyo_tower:": "🗼", ":tomato:": "🍅", ":tongue:": "👅", ":top:": "🔝", ":tophat:": "🎩", ":tractor:": "🚜", ":traffic_light:": "🚥", ":train:": "🚋", ":train2:": "🚆", ":tram:": "🚊", ":triangular_flag_on_post:": "🚩", ":triangular_ruler:": "📐", ":trident:": "🔱", ":triumph:": "😤", ":trolleybus:": "🚎", ":trollface:": ":trollface:", ":trophy:": "🏆", ":tropical_drink:": "🍹", ":tropical_fish:": "🐠", ":truck:": "🚚", ":trumpet:": "🎺", ":tshirt:": "👕", ":tulip:": "🌷", ":turtle:": "🐢", ":tv:": "📺", ":twisted_rightwards_arrows:": "🔀", ":two:": "2️⃣", ":two_hearts:": "💕", ":two_men_holding_hands:": "👬", ":two_women_holding_hands:": "👭", ":u5272:": "🈹", ":u5408:": "🈴", ":u55b6:": "🈺", ":u6307:": "🈯️", ":u6708:": "🈷️", ":u6709:": "🈶", ":u6e80:": "🈵", ":u7121:": "🈚️", ":u7533:": "🈸", ":u7981:": "🈲", ":u7a7a:": "🈳", ":uk:": "🇬🇧", ":ukraine:": "🇺🇦", ":umbrella:": "☔️", ":unamused:": "😒", ":underage:": "🔞", ":unlock:": "🔓", ":up:": "🆙", ":us:": "🇺🇸", ":us_virgin_islands:": "🇻🇮", ":v:": "✌️", ":vertical_traffic_light:": "🚦", ":vhs:": "📼", ":vibration_mode:": "📳", ":video_camera:": "📹", ":video_game:": "🎮", ":violin:": "🎻", ":virgo:": "♍️", ":volcano:": "🌋", ":vs:": "🆚", ":walking:": "🚶", ":walking_man:": "🚶", ":walking_woman:": "🚶\u200D♀", ":wallis_futuna:": "🇼🇫", ":waning_crescent_moon:": "🌘", ":waning_gibbous_moon:": "🌖", ":warning:": "⚠️", ":watch:": "⌚️", ":water_buffalo:": "🐃", ":watermelon:": "🍉", ":wave:": "👋", ":wavy_dash:": "〰️", ":waxing_crescent_moon:": "🌒", ":waxing_gibbous_moon:": "🌔", ":wc:": "🚾", ":weary:": "😩", ":wedding:": "💒", ":whale:": "🐳", ":whale2:": "🐋", ":wheel_of_dharma:": "☸️", ":wheelchair:": "♿️", ":white_check_mark:": "✅", ":white_circle:": "⚪️", ":white_flower:": "💮", ":white_large_square:": "⬜️", ":white_medium_small_square:": "◽️", ":white_medium_square:": "◻️", ":white_small_square:": "▫️", ":white_square_button:": "🔳", ":wilted_flower:": "🥀", ":wind_chime:": "🎐", ":wind_face:": "🌬", ":wine_glass:": "🍷", ":wink:": "😉", ":wolf:": "🐺", ":woman:": "👩", ":womans_clothes:": "👚", ":womans_hat:": "👒", ":womens:": "🚺", ":world_map:": "🗺", ":worried:": "😟", ":wrench:": "🔧", ":x:": "❌", ":yellow_heart:": "💛", ":yen:": "💴", ":yum:": "😋", ":zap:": "⚡️", ":zero:": "0️⃣", ":zzz:": "💤"})); 2 | 3 | export function renderEmoji(str: string): string { 4 | const chunks = str.split("(?<=\\s)|(?=\\s)"); 5 | return chunks 6 | .map(chunk => symbolToEmoji.has(chunk) ? symbolToEmoji.get(chunk) : chunk) 7 | .join(""); 8 | } 9 | -------------------------------------------------------------------------------- /backend/src/index.ts: -------------------------------------------------------------------------------- 1 | import * as yargs from "yargs"; 2 | import * as log4js from "log4js"; 3 | import * as redis from "redis"; 4 | 5 | import {RedisGitHubRepositoryJsonCacheRepository} from './infra/RedisGitHubRepositoryJsonCacheRepository'; 6 | import {DefaultGitHubApiService} from "./infra/DefaultGitHubApiService"; 7 | import {RedisGitHubRepositoryPngCardCacheRepository} from "./infra/RedisGitHubRepositoryPngCardCacheRepository"; 8 | import {createServer} from "./route"; 9 | 10 | // Create option parser 11 | const parser = yargs 12 | .option("redis-host", { 13 | describe: "Redis host", 14 | default: "localhost", 15 | }) 16 | .option("github-client-id", { 17 | describe: "GitHub Client ID", 18 | type: "string", 19 | }) 20 | .option("github-client-secret", { 21 | describe: "GitHub Client Secret", 22 | type: "string", 23 | }); 24 | 25 | // Create a logger 26 | const logger = log4js.getLogger(); 27 | logger.level = "info"; 28 | 29 | // Parse arguments 30 | const args = parser.parse(process.argv); 31 | const redisHost: string = args["redis-host"]; 32 | const githubClientId: string | undefined = args["github-client-id"]; 33 | const githubClientSecret: string | undefined = args["github-client-secret"]; 34 | let githubCredential: {githubClientId: string, githubClientSecret: string} | undefined; 35 | 36 | if (githubClientId === undefined || githubClientSecret === undefined) { 37 | logger.info("GitHub client ID or secret is not set"); 38 | } else { 39 | githubCredential = { 40 | githubClientId, 41 | githubClientSecret, 42 | }; 43 | } 44 | 45 | const redisClient = redis.createClient({ 46 | host: redisHost, 47 | }); 48 | 49 | const gitHubRepositoryJsonCacheRepository = new RedisGitHubRepositoryJsonCacheRepository( 50 | redisClient, 51 | // 20 min 52 | // TODO: Hard code 53 | 20 * 60, 54 | ); 55 | const gitHubRepositoryPngCardCacheRepository = new RedisGitHubRepositoryPngCardCacheRepository( 56 | redisClient, 57 | // 20 min 58 | // TODO: Hard code 59 | 20 * 60, 60 | ); 61 | const gitHubApiService = new DefaultGitHubApiService( 62 | logger, 63 | githubCredential, 64 | gitHubRepositoryJsonCacheRepository, 65 | ); 66 | const server = createServer({ 67 | logger, 68 | gitHubApiService, 69 | gitHubRepositoryPngCardCacheRepository, 70 | }); 71 | 72 | // TODO: hard code 73 | const httpPort = 8080 74 | server.listen(httpPort, () =>{ 75 | logger.info(`Listening on ${httpPort}...`); 76 | }); 77 | -------------------------------------------------------------------------------- /backend/src/infra/DefaultGitHubApiService.ts: -------------------------------------------------------------------------------- 1 | import * as log4js from "log4js"; 2 | import fetch from "node-fetch"; 3 | import { isLeft } from 'fp-ts/lib/Either'; 4 | 5 | import {GitHubApiService} from '../domain/GitHubApiService'; 6 | import {GitHubRepositoryJsonCacheRepository} from '../domain/GitHubRepositoryJsonCacheRepository'; 7 | import {GithubRepoJson, githubRepoJsonType} from '../types'; 8 | 9 | export class DefaultGitHubApiService implements GitHubApiService { 10 | constructor( 11 | private readonly logger: log4js.Logger, 12 | private readonly githubCredential: {githubClientId: string, githubClientSecret: string} | undefined, 13 | private readonly gitHubRepositoryJsonCacheRepository: GitHubRepositoryJsonCacheRepository) {} 14 | 15 | async getRepository(repoName: string): Promise<{repo: GithubRepoJson} | {status: number, resText: string}> { 16 | let jsonStr: string | undefined = await this.gitHubRepositoryJsonCacheRepository.get(repoName); 17 | if (jsonStr === undefined) { 18 | this.logger.info(`Repository JSON ${repoName} is not cached`); 19 | 20 | let query = ''; 21 | const headers= (() => { 22 | if (this.githubCredential === undefined) { 23 | return {}; 24 | } else { 25 | const {githubClientId, githubClientSecret} = this.githubCredential; 26 | const h: {[key: string]: string} = { 27 | // Basic Auth 28 | "Authorization": `Basic: ${Buffer.from(`${githubClientId}:${githubClientSecret}`).toString("base64")}`, 29 | }; 30 | query = `?client_id=${githubClientId}&client_secret=${githubClientSecret}`; 31 | return h; 32 | } 33 | })(); 34 | 35 | const githubRes = await fetch(`https://api.github.com/repos/${repoName}${query}`, { 36 | headers, 37 | }); 38 | if (githubRes.status !== 200) { 39 | return { 40 | status: githubRes.status, 41 | resText: await githubRes.text(), 42 | }; 43 | } 44 | jsonStr = await githubRes.text(); 45 | // Cache 46 | this.gitHubRepositoryJsonCacheRepository.cache(repoName, jsonStr); 47 | } 48 | 49 | const githubRepoJsonEither = githubRepoJsonType.decode(JSON.parse(jsonStr)); 50 | if (isLeft(githubRepoJsonEither)) { 51 | throw githubRepoJsonEither.left; 52 | } 53 | const githubRepoJson = githubRepoJsonEither.right; 54 | return { 55 | repo: githubRepoJson, 56 | }; 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /backend/src/infra/RedisGitHubRepositoryJsonCacheRepository.ts: -------------------------------------------------------------------------------- 1 | import * as redis from 'redis'; 2 | import {promisify} from 'util'; 3 | 4 | import {GitHubRepositoryJsonCacheRepository} from '../domain/GitHubRepositoryJsonCacheRepository'; 5 | 6 | export class RedisGitHubRepositoryJsonCacheRepository implements GitHubRepositoryJsonCacheRepository { 7 | private keyPrefix = "repos-json"; 8 | private redisGetAsync: (key: string) => Promise; 9 | 10 | constructor(private readonly redisClient: redis.RedisClient, private readonly ttlSec: number) { 11 | this.redisGetAsync = promisify(this.redisClient.get).bind(this.redisClient); 12 | } 13 | 14 | cache(repoName: string, json: string): void { 15 | this.redisClient.setex(`${this.keyPrefix}/${repoName}`, this.ttlSec, json); 16 | } 17 | 18 | async get(repoName: string): Promise { 19 | const jsonStr: string | null = await this.redisGetAsync(`${this.keyPrefix}/${repoName}`); 20 | return jsonStr ?? undefined; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /backend/src/infra/RedisGitHubRepositoryPngCardCacheRepository.ts: -------------------------------------------------------------------------------- 1 | import * as redis from 'redis'; 2 | import {promisify} from 'util'; 3 | 4 | import {GitHubRepositoryPngCardCacheRepository} from '../domain/GitHubRepositoryPngCardCacheRepository'; 5 | 6 | export class RedisGitHubRepositoryPngCardCacheRepository implements GitHubRepositoryPngCardCacheRepository { 7 | private keyPrefix: string = "repo-png-card"; 8 | private redisGetAsync: (key: string) => Promise; 9 | 10 | constructor(private readonly redisClient: redis.RedisClient, private readonly ttlSec: number) { 11 | this.redisGetAsync = promisify(this.redisClient.get).bind(this.redisClient); 12 | } 13 | 14 | cache(png: Buffer, repoName: string, useFullName: boolean, width: number, height: number): void { 15 | const key = `${this.keyPrefix}/${repoName}/fullname=${useFullName}/${width}x${height}`; 16 | // TODO: Not use base64 for performance 17 | this.redisClient.setex(key, this.ttlSec, png.toString("base64")); 18 | } 19 | 20 | async get(repoName: string, useFullName: boolean, width: number, height: number): Promise { 21 | const key = `${this.keyPrefix}/${repoName}/fullname=${useFullName}/${width}x${height}`; 22 | const pngBase64: string | null = await this.redisGetAsync(key); 23 | if (pngBase64 === null) return undefined; 24 | // TODO: Not use base64 for performance 25 | return Buffer.from(pngBase64, "base64"); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /backend/src/route.ts: -------------------------------------------------------------------------------- 1 | import * as t from 'io-ts'; 2 | import { isLeft } from 'fp-ts/lib/Either'; 3 | import * as express from 'express'; 4 | import * as log4js from "log4js"; 5 | import {renderToString} from 'react-dom/server'; 6 | import * as svg2png from 'svg2png'; 7 | 8 | import {GitHubApiService} from './domain/GitHubApiService'; 9 | import {GitHubRepositoryPngCardCacheRepository} from './domain/GitHubRepositoryPngCardCacheRepository'; 10 | import {generateSvg} from './svg-generator'; 11 | 12 | 13 | const repoWithExtType = t.type({ 14 | ownerName: t.string, 15 | shortRepoName: t.string, 16 | extension: t.union([t.literal("svg"), t.literal("png")]), 17 | }); 18 | type RepoWithExt = t.TypeOf; 19 | 20 | const repoRequestQueryType = t.type({ 21 | fullname: t.union([t.string, t.undefined]), 22 | link_target: t.union([t.string, t.undefined]), 23 | }); 24 | 25 | export function createServer( 26 | {logger, gitHubApiService, gitHubRepositoryPngCardCacheRepository}: 27 | {logger: log4js.Logger, gitHubApiService: GitHubApiService, gitHubRepositoryPngCardCacheRepository: GitHubRepositoryPngCardCacheRepository}) { 28 | const app = express(); 29 | 30 | app.get('/', (req, res) => { 31 | res.send("e.g. /repos/rust-lang/rust.svg"); 32 | }); 33 | 34 | app.get('/repos/:ownerName/:shortRepoName.:extension', async (req, res) => { 35 | const repoWithExtEither = repoWithExtType.decode(req.params); 36 | if (isLeft(repoWithExtEither)) { 37 | res.status(400); 38 | res.send('invalid request'); 39 | return; 40 | } 41 | const repoWithExt = repoWithExtEither.right; 42 | logger.info(`valid request: ${JSON.stringify(repoWithExt)}`); 43 | const {ownerName, shortRepoName, extension} = repoWithExt; 44 | 45 | // Validate query 46 | const repoRequestQueryEither = repoRequestQueryType.decode(req.query); 47 | if (isLeft(repoRequestQueryEither)) { 48 | res.status(400); 49 | res.send('invalid query parameter'); 50 | return; 51 | } 52 | const repoRequestQuery = repoRequestQueryEither.right; 53 | const usesFullName: boolean = repoRequestQuery.fullname !== undefined; 54 | const linkTarget: string = repoRequestQuery.link_target ?? ""; 55 | 56 | const repoName = `${ownerName}/${shortRepoName}`; 57 | const repoResult = await gitHubApiService.getRepository(`${repoName}`); 58 | 59 | if ("status" in repoResult) { 60 | logger.error(`GitHub API error: ${JSON.stringify(repoResult)}`); 61 | if (repoResult.status === 404) { 62 | res.status(404); 63 | res.send(`${repoName} not found\n`); 64 | return; 65 | } 66 | res.status(400); 67 | res.send("Error in GitHub API\n"); 68 | return; 69 | } 70 | const githubRepoJson = repoResult.repo; 71 | 72 | const {width, height, svg} = generateSvg({ 73 | ownerName, 74 | shortRepoName, 75 | usesFullName, 76 | linkTarget, 77 | language: githubRepoJson.language ?? undefined, 78 | description: githubRepoJson.description ?? "", 79 | nStars: githubRepoJson.stargazers_count, 80 | nForks: githubRepoJson.forks_count, 81 | isFork: githubRepoJson.fork, 82 | }); 83 | const svgStr: string = renderToString(svg); 84 | 85 | switch (extension) { 86 | case "svg": 87 | res.header({ 88 | 'Content-Type': 'image/svg+xml', 89 | }); 90 | res.send(svgStr); 91 | return; 92 | case "png": 93 | let pngBuffer: Buffer | undefined = await gitHubRepositoryPngCardCacheRepository.get( 94 | repoName, 95 | usesFullName, 96 | width, 97 | height, 98 | ); 99 | if (pngBuffer === undefined) { 100 | // TODO: High resolution 101 | pngBuffer = await svg2png( 102 | Buffer.from(svgStr), 103 | {width, height} 104 | ); 105 | // Cache PNG 106 | gitHubRepositoryPngCardCacheRepository.cache( 107 | pngBuffer, 108 | repoName, 109 | usesFullName, 110 | width, 111 | height, 112 | ); 113 | } 114 | 115 | res.header({ 116 | 'Content-Type': 'image/png', 117 | }); 118 | res.send(pngBuffer); 119 | return; 120 | } 121 | }); 122 | 123 | return app; 124 | } 125 | -------------------------------------------------------------------------------- /backend/src/svg-generator.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import ghLanguageColors from 'gh-language-colors'; 3 | 4 | import {renderEmoji} from './emoji-renderer'; 5 | 6 | declare global { 7 | namespace JSX { 8 | interface IntrinsicElements { 9 | [elemName: string]: any; 10 | } 11 | } 12 | } 13 | 14 | // TODO: Make it declarative 15 | // TODO: Support non-English description 16 | function descriptionToLines(description: string): readonly string[] { 17 | const splitter = " "; 18 | const words = description.split(splitter); 19 | let line: string = ""; 20 | const lines: string[] = []; 21 | for(const word of words) { 22 | line += word + splitter; 23 | if (line.length > 55) { 24 | lines.push(line); 25 | line = ""; 26 | } 27 | } 28 | if (line !== "") { 29 | lines.push(line); 30 | } 31 | return lines; 32 | } 33 | 34 | // GitHub number string for stars and forks 35 | function gitHubNumberString(n: number): string { 36 | if (n < 950) { 37 | return n.toString(); 38 | } 39 | const k = n / 1000 40 | if (k < 99.9) { 41 | return k.toFixed(1) + "k"; 42 | } 43 | return `${Math.round(k)}k`; 44 | } 45 | 46 | function getGitHubRepositoryUrl(ownerName: string, shortRepoName: string): string { 47 | return `https://github.com/${ownerName}/${shortRepoName}`; 48 | } 49 | 50 | function getGitHubStargazersUrl(ownerName: string, shortRepoName: string): string { 51 | return `https://github.com/${ownerName}/${shortRepoName}/stargazers`; 52 | } 53 | 54 | function getGitHubNetworkMemberUrl(ownerName: string, shortRepoName: string): string { 55 | return `https://github.com/${ownerName}/${shortRepoName}/network/members`; 56 | } 57 | 58 | export function generateSvg( 59 | {ownerName, shortRepoName, usesFullName: usesFullName, linkTarget, language, description, nStars, nForks, isFork}: 60 | {ownerName: string, shortRepoName: string, usesFullName: boolean, linkTarget: string, language: string | undefined, description: string, nStars: number, nForks: number, isFork: boolean} 61 | ): {width: number, height: number, svg: JSX.Element} { 62 | // Name on image 63 | const repoNameInImage: string = usesFullName ? `${ownerName}/${shortRepoName}` : shortRepoName 64 | // Get language color 65 | const colors: {[lang: string]: string} = ghLanguageColors; 66 | const languageColor: string | undefined = (language === undefined) ? undefined : colors[language]; 67 | // Convert description to lines 68 | const descriptionLines: readonly string[] = descriptionToLines( 69 | renderEmoji(description) 70 | ); 71 | // Create description element and last y coordinate 72 | const [descriptionElems, lastDescriptionY] = (() => { 73 | let y = 65 74 | const diff = 21 75 | const elem: JSX.Element[] = descriptionLines.map((line: string) => { 76 | const e: JSX.Element = ( 77 | 78 | {line} 79 | 80 | ); 81 | y += diff; 82 | return e; 83 | }); 84 | 85 | return [elem, y - diff] as const; 86 | })(); 87 | 88 | // Define board's width 89 | const width = 442; 90 | // Define board's height 91 | const height = lastDescriptionY + 43; 92 | // X coordinate next to language 93 | const languageNextX: number = (language === undefined) ? 16 : 60 + (5 * language.length); 94 | 95 | // Star icon 96 | const starIcon = () 97 | // Fork icon 98 | const forkIcon = () 99 | 100 | const svg = 101 | 102 | 103 | 104 | 105 | 106 | 107 | {/* Boarder */} 108 | 109 | 110 | { 111 | (isFork) 112 | // Fork icon 113 | ? 114 | // Repo icon like book 115 | : 116 | } 117 | 118 | 119 | {/* Repo name */} 120 | 121 | {repoNameInImage} 122 | 123 | 124 | {/* Description */} 125 | {descriptionElems} 126 | { 127 | (language === undefined) ? 128 | undefined : 129 | // Language 130 | 131 | {language} 132 | 133 | } 134 | {/* */} 135 | { 136 | (() => { 137 | if (nStars > 0) { 138 | return starIcon; 139 | } else if (nForks > 0){ 140 | return forkIcon; 141 | } else { 142 | return undefined; 143 | } 144 | })() 145 | } 146 | 147 | {/* The number of stars or fork */} 148 | {(() => { 149 | // Url & Number of stars or forks 150 | const urlAndNumberStr: readonly [string, string] | undefined = (() => { 151 | if (nStars > 0) { 152 | return [getGitHubStargazersUrl(ownerName, shortRepoName), gitHubNumberString(nStars)] as const 153 | } else if (nForks > 0){ 154 | return [getGitHubNetworkMemberUrl(ownerName, shortRepoName), gitHubNumberString(nForks)] as const 155 | } else { 156 | return undefined; 157 | } 158 | })(); 159 | 160 | if (urlAndNumberStr === undefined) { 161 | return undefined; 162 | } else { 163 | const [url, numberStr] = urlAndNumberStr; 164 | return ( 165 | 166 | { 167 | numberStr 168 | } 169 | 170 | ); 171 | } 172 | })()} 173 | 174 | 175 | {/* Fork icon or none */} 176 | { 177 | (nStars > 0 && nForks > 0) ? forkIcon: undefined 178 | } 179 | 180 | {/* The number of forks or none */} 181 | { 182 | (nStars > 0 && nForks > 0) ? 183 | 184 | {gitHubNumberString(nForks)} 185 | 186 | : undefined 187 | } 188 | 189 | { 190 | (languageColor === undefined) ? 191 | undefined : 192 | // Language color 193 | 194 | } 195 | 196 | 197 | return { 198 | width, 199 | height, 200 | svg, 201 | }; 202 | } 203 | -------------------------------------------------------------------------------- /backend/src/types.ts: -------------------------------------------------------------------------------- 1 | import * as t from 'io-ts'; 2 | 3 | 4 | // NOTE: You can define fields more if need 5 | // (see: https://developer.github.com/v3/repos/#response-5) 6 | export const githubRepoJsonType = t.type({ 7 | description: t.union([t.string, t.undefined, t.null]), 8 | language: t.union([t.string, t.null]), 9 | stargazers_count: t.number, 10 | forks_count: t.number, 11 | fork: t.boolean, 12 | }); 13 | export type GithubRepoJson = t.TypeOf; 14 | -------------------------------------------------------------------------------- /backend/test/index.test.ts: -------------------------------------------------------------------------------- 1 | // TODO: You should change this content. 2 | 3 | import * as assert from 'power-assert'; 4 | 5 | describe('TODO', () => { 6 | it('1 should be 1', () => { 7 | assert.strictEqual(1, 1); 8 | }); 9 | }); 10 | -------------------------------------------------------------------------------- /backend/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "strict": true, 5 | "noImplicitReturns": true, 6 | "removeComments": true, 7 | "preserveConstEnums": true, 8 | "sourceMap": true, 9 | "declaration": true, 10 | "resolveJsonModule": true, 11 | "target": "es5", 12 | "lib": ["es2015"], // Without this, an error occurs: TS2705: An async function or method in ES5/ES3 requires the 'Promise' constructor. Make sure you have a declaration for the 'Promise' constructor or include 'ES2015' in your `--lib` option. 13 | "outDir": "dist", 14 | "rootDir": "./", 15 | "jsx": "react", 16 | // TODO: remove for safety 17 | "skipLibCheck": true, 18 | }, 19 | "include": [ 20 | "src/**/*", 21 | "test/**/*" 22 | ], 23 | "exclude": [ 24 | "node_modules/*" 25 | ] 26 | } 27 | -------------------------------------------------------------------------------- /doc_assets/gh-card.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nwtgck/gh-card/ee4ab875b607d6d32b1bce4eda10bdae0f6b66cd/doc_assets/gh-card.gif -------------------------------------------------------------------------------- /doc_assets/piping-server.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | piping-server 16 | 17 | 18 | 19 | Streaming Data Transfer Server over HTTP/HTTPS: designed 20 | 21 | for people using pipe in Unix-like OS and even for browser 22 | 23 | users 24 | 25 | 26 | TypeScript 27 | 28 | 29 | 30 | 31 | 32 | 307 33 | 34 | 35 | 36 | 37 | 38 | 39 | 6 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /docker-compose.local.yml: -------------------------------------------------------------------------------- 1 | # Usage: 2 | # docker-compose -f docker-compose.local.yml up 3 | # 4 | # Access to http://localhost:9080 5 | 6 | version: '3.1' 7 | services: 8 | reverse_proxy: 9 | build: ./reverse-proxy 10 | volumes: 11 | - ./reverse-proxy/local.caddyfile:/Caddyfile:ro 12 | - ./log/:/var/log/ 13 | ports: 14 | - "9080:80" 15 | 16 | frontend: 17 | build: ./frontend 18 | restart: always 19 | expose: 20 | - "8000" 21 | 22 | backend: 23 | build: ./backend 24 | restart: always 25 | command: --redis-host=cache 26 | depends_on: 27 | - cache 28 | expose: 29 | - "8080" 30 | 31 | cache: 32 | image: redis 33 | restart: always 34 | expose: 35 | - "6379" 36 | ports: 37 | - "9379:6379" 38 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | # NOTE: This is only for production environment currently 2 | 3 | version: '3.1' 4 | services: 5 | reverse_proxy: 6 | build: ./reverse-proxy 7 | volumes: 8 | - ./reverse-proxy/Caddyfile:/Caddyfile:ro 9 | - /etc/letsencrypt/live/gh-card.dev/fullchain.pem:/etc/tls/fullchain.pem:ro 10 | - /etc/letsencrypt/live/gh-card.dev/privkey.pem:/etc/tls/privkey.pem:ro 11 | - ./log/:/var/log/ 12 | ports: 13 | - "80:80" 14 | - "443:443" 15 | 16 | frontend: 17 | build: ./frontend 18 | restart: always 19 | expose: 20 | - "8000" 21 | 22 | backend: 23 | build: ./backend 24 | restart: always 25 | command: --redis-host=cache --github-client-id=$GITHUB_CLIENT_ID --github-client-secret=$GITHUB_CLIENT_SECRET 26 | depends_on: 27 | - cache 28 | expose: 29 | - "8080" 30 | 31 | cache: 32 | image: redis 33 | restart: always 34 | expose: 35 | - "6379" 36 | ports: 37 | - "6379:6379" 38 | -------------------------------------------------------------------------------- /frontend/.browserslistrc: -------------------------------------------------------------------------------- 1 | > 1% 2 | last 2 versions 3 | -------------------------------------------------------------------------------- /frontend/.dockerignore: -------------------------------------------------------------------------------- 1 | /.gitignore 2 | 3 | /.idea 4 | /dist 5 | /node_modules 6 | 7 | /Dockerfile 8 | /.dockerignore 9 | -------------------------------------------------------------------------------- /frontend/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | 5 | # local env files 6 | .env.local 7 | .env.*.local 8 | 9 | # Log files 10 | npm-debug.log* 11 | yarn-debug.log* 12 | yarn-error.log* 13 | 14 | # Editor directories and files 15 | .idea 16 | .vscode 17 | *.suo 18 | *.ntvs* 19 | *.njsproj 20 | *.sln 21 | *.sw? 22 | -------------------------------------------------------------------------------- /frontend/Dockerfile: -------------------------------------------------------------------------------- 1 | # NOTE: Multi-stage Build 2 | 3 | FROM node:10 as build 4 | 5 | # Copy all things in this repo except files in .dockerignore 6 | COPY . /app 7 | # Move to /app 8 | WORKDIR /app 9 | 10 | # Install requirements, build and remove devDependencies 11 | # (from: https://stackoverflow.com/a/25571391/2885946) 12 | RUN cd /app && \ 13 | npm install && \ 14 | npm run build && \ 15 | npm prune --production 16 | 17 | 18 | # Make directories 19 | RUN mkdir -p /app/backend 20 | 21 | # TODO: Use more proper image 22 | # Python3 23 | FROM python:3 24 | LABEL maintainer="Ryo Ota " 25 | 26 | # Make directories 27 | RUN mkdir -p /app 28 | 29 | # Copy artifact 30 | COPY --from=build /app/dist /app/frontend 31 | 32 | WORKDIR /app/frontend 33 | 34 | # Run entry (Run the server) 35 | ENTRYPOINT ["python3", "-m", "http.server"] 36 | -------------------------------------------------------------------------------- /frontend/README.md: -------------------------------------------------------------------------------- 1 | # gh-card 2 | 3 | ## Project setup 4 | ``` 5 | npm install 6 | ``` 7 | 8 | ### Compiles and hot-reloads for development 9 | ``` 10 | npm run serve 11 | ``` 12 | 13 | ### Compiles and minifies for production 14 | ``` 15 | npm run build 16 | ``` 17 | 18 | ### Run your tests 19 | ``` 20 | npm run test 21 | ``` 22 | 23 | ### Lints and fixes files 24 | ``` 25 | npm run lint 26 | ``` 27 | 28 | ### Customize configuration 29 | See [Configuration Reference](https://cli.vuejs.org/config/). 30 | -------------------------------------------------------------------------------- /frontend/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | '@vue/cli-plugin-babel/preset' 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /frontend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gh-card", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "serve": "vue-cli-service serve", 7 | "build": "vue-cli-service build", 8 | "lint": "vue-cli-service lint" 9 | }, 10 | "dependencies": { 11 | "core-js": "^3.6.5", 12 | "register-service-worker": "^1.7.1", 13 | "vue": "^2.6.11", 14 | "vue-class-component": "^7.2.3", 15 | "vue-property-decorator": "^8.4.2" 16 | }, 17 | "devDependencies": { 18 | "@vue/cli-plugin-babel": "^4.4.1", 19 | "@vue/cli-plugin-pwa": "^4.4.1", 20 | "@vue/cli-plugin-typescript": "^4.4.1", 21 | "@vue/cli-service": "^4.4.1", 22 | "typescript": "~3.9.3", 23 | "vue-template-compiler": "^2.6.11" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /frontend/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | autoprefixer: {} 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /frontend/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nwtgck/gh-card/ee4ab875b607d6d32b1bce4eda10bdae0f6b66cd/frontend/public/favicon.ico -------------------------------------------------------------------------------- /frontend/public/img/icons/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nwtgck/gh-card/ee4ab875b607d6d32b1bce4eda10bdae0f6b66cd/frontend/public/img/icons/android-chrome-192x192.png -------------------------------------------------------------------------------- /frontend/public/img/icons/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nwtgck/gh-card/ee4ab875b607d6d32b1bce4eda10bdae0f6b66cd/frontend/public/img/icons/android-chrome-512x512.png -------------------------------------------------------------------------------- /frontend/public/img/icons/apple-touch-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nwtgck/gh-card/ee4ab875b607d6d32b1bce4eda10bdae0f6b66cd/frontend/public/img/icons/apple-touch-icon-120x120.png -------------------------------------------------------------------------------- /frontend/public/img/icons/apple-touch-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nwtgck/gh-card/ee4ab875b607d6d32b1bce4eda10bdae0f6b66cd/frontend/public/img/icons/apple-touch-icon-152x152.png -------------------------------------------------------------------------------- /frontend/public/img/icons/apple-touch-icon-180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nwtgck/gh-card/ee4ab875b607d6d32b1bce4eda10bdae0f6b66cd/frontend/public/img/icons/apple-touch-icon-180x180.png -------------------------------------------------------------------------------- /frontend/public/img/icons/apple-touch-icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nwtgck/gh-card/ee4ab875b607d6d32b1bce4eda10bdae0f6b66cd/frontend/public/img/icons/apple-touch-icon-60x60.png -------------------------------------------------------------------------------- /frontend/public/img/icons/apple-touch-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nwtgck/gh-card/ee4ab875b607d6d32b1bce4eda10bdae0f6b66cd/frontend/public/img/icons/apple-touch-icon-76x76.png -------------------------------------------------------------------------------- /frontend/public/img/icons/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nwtgck/gh-card/ee4ab875b607d6d32b1bce4eda10bdae0f6b66cd/frontend/public/img/icons/apple-touch-icon.png -------------------------------------------------------------------------------- /frontend/public/img/icons/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nwtgck/gh-card/ee4ab875b607d6d32b1bce4eda10bdae0f6b66cd/frontend/public/img/icons/favicon-16x16.png -------------------------------------------------------------------------------- /frontend/public/img/icons/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nwtgck/gh-card/ee4ab875b607d6d32b1bce4eda10bdae0f6b66cd/frontend/public/img/icons/favicon-32x32.png -------------------------------------------------------------------------------- /frontend/public/img/icons/msapplication-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nwtgck/gh-card/ee4ab875b607d6d32b1bce4eda10bdae0f6b66cd/frontend/public/img/icons/msapplication-icon-144x144.png -------------------------------------------------------------------------------- /frontend/public/img/icons/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nwtgck/gh-card/ee4ab875b607d6d32b1bce4eda10bdae0f6b66cd/frontend/public/img/icons/mstile-150x150.png -------------------------------------------------------------------------------- /frontend/public/img/icons/safari-pinned-tab.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | Created by potrace 1.11, written by Peter Selinger 2001-2013 9 | 10 | 12 | 148 | 149 | 150 | -------------------------------------------------------------------------------- /frontend/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | GitHub Card - gh-card 9 | 10 | 11 | 14 |
15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /frontend/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gh-card", 3 | "short_name": "gh-card", 4 | "icons": [ 5 | { 6 | "src": "./img/icons/android-chrome-192x192.png", 7 | "sizes": "192x192", 8 | "type": "image/png" 9 | }, 10 | { 11 | "src": "./img/icons/android-chrome-512x512.png", 12 | "sizes": "512x512", 13 | "type": "image/png" 14 | } 15 | ], 16 | "start_url": "./index.html", 17 | "display": "standalone", 18 | "background_color": "#000000", 19 | "theme_color": "#4DBA87" 20 | } 21 | -------------------------------------------------------------------------------- /frontend/public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | -------------------------------------------------------------------------------- /frontend/src/App.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 22 | 23 | 36 | -------------------------------------------------------------------------------- /frontend/src/assets/github.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /frontend/src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nwtgck/gh-card/ee4ab875b607d6d32b1bce4eda10bdae0f6b66cd/frontend/src/assets/logo.png -------------------------------------------------------------------------------- /frontend/src/components/GhCardGenerator.vue: -------------------------------------------------------------------------------- 1 | 51 | 52 | 168 | 169 | 170 | 198 | -------------------------------------------------------------------------------- /frontend/src/constants.ts: -------------------------------------------------------------------------------- 1 | // NOTE: The values are defined in vue.config.js 2 | const c = { 3 | // @ts-ignore 4 | imageServerUrl: IMAGE_SERVER_URL, 5 | }; 6 | 7 | export default c; 8 | -------------------------------------------------------------------------------- /frontend/src/main.ts: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import App from './App.vue'; 3 | import './registerServiceWorker'; 4 | 5 | Vue.config.productionTip = false; 6 | 7 | new Vue({ 8 | render: (h) => h(App), 9 | }).$mount('#app'); 10 | -------------------------------------------------------------------------------- /frontend/src/registerServiceWorker.ts: -------------------------------------------------------------------------------- 1 | /* tslint:disable:no-console */ 2 | 3 | import { register } from 'register-service-worker'; 4 | 5 | if (process.env.NODE_ENV === 'production') { 6 | register(`${process.env.BASE_URL}service-worker.js`, { 7 | ready() { 8 | console.log( 9 | 'App is being served from cache by a service worker.\n' + 10 | 'For more details, visit https://goo.gl/AFskqB', 11 | ); 12 | }, 13 | registered() { 14 | console.log('Service worker has been registered.'); 15 | }, 16 | cached() { 17 | console.log('Content has been cached for offline use.'); 18 | }, 19 | updatefound() { 20 | console.log('New content is downloading.'); 21 | }, 22 | updated() { 23 | console.log('New content is available; please refresh.'); 24 | }, 25 | offline() { 26 | console.log('No internet connection found. App is running in offline mode.'); 27 | }, 28 | error(error) { 29 | console.error('Error during service worker registration:', error); 30 | }, 31 | }); 32 | } 33 | -------------------------------------------------------------------------------- /frontend/src/shims-tsx.d.ts: -------------------------------------------------------------------------------- 1 | import Vue, { VNode } from 'vue'; 2 | 3 | declare global { 4 | namespace JSX { 5 | // tslint:disable no-empty-interface 6 | interface Element extends VNode {} 7 | // tslint:disable no-empty-interface 8 | interface ElementClass extends Vue {} 9 | interface IntrinsicElements { 10 | [elem: string]: any; 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /frontend/src/shims-vue.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.vue' { 2 | import Vue from 'vue'; 3 | export default Vue; 4 | } 5 | -------------------------------------------------------------------------------- /frontend/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "esnext", 4 | "module": "esnext", 5 | "strict": true, 6 | "jsx": "preserve", 7 | "importHelpers": true, 8 | "moduleResolution": "node", 9 | "experimentalDecorators": true, 10 | "esModuleInterop": true, 11 | "allowSyntheticDefaultImports": true, 12 | "sourceMap": true, 13 | "baseUrl": ".", 14 | "types": [ 15 | "webpack-env" 16 | ], 17 | "paths": { 18 | "@/*": [ 19 | "src/*" 20 | ] 21 | }, 22 | "lib": [ 23 | "esnext", 24 | "dom", 25 | "dom.iterable", 26 | "scripthost" 27 | ] 28 | }, 29 | "include": [ 30 | "src/**/*.ts", 31 | "src/**/*.tsx", 32 | "src/**/*.vue", 33 | "tests/**/*.ts", 34 | "tests/**/*.tsx" 35 | ], 36 | "exclude": [ 37 | "node_modules" 38 | ] 39 | } 40 | -------------------------------------------------------------------------------- /frontend/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "defaultSeverity": "warning", 3 | "extends": [ 4 | "tslint:recommended" 5 | ], 6 | "linterOptions": { 7 | "exclude": [ 8 | "node_modules/**" 9 | ] 10 | }, 11 | "rules": { 12 | "quotemark": [true, "single"], 13 | "indent": [true, "spaces", 2], 14 | "interface-name": false, 15 | "ordered-imports": false, 16 | "object-literal-sort-keys": false, 17 | "no-consecutive-blank-lines": false 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /frontend/vue.config.js: -------------------------------------------------------------------------------- 1 | const webpack = require('webpack'); 2 | 3 | module.exports = { 4 | // (from: https://cli.vuejs.org/config/#publicpath) 5 | publicPath: "./", 6 | configureWebpack: { 7 | plugins: [ 8 | // (base: https://medium.com/curofy-engineering/a-guide-to-inject-variable-into-your-code-using-webpack-36c49fcc1dcd) 9 | new webpack.DefinePlugin({ 10 | IMAGE_SERVER_URL: (() => { 11 | if (process.env.GH_CARD_IMAGE_SERVER_URL) { 12 | // NOTE: Add quotes 13 | return JSON.stringify(process.env.GH_CARD_IMAGE_SERVER_URL) 14 | } else if (process.env.NODE_ENV === 'production') { 15 | return "location.origin"; 16 | } else { 17 | return "'http://localhost:8080'"; 18 | } 19 | })(), 20 | }) 21 | ] 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /reverse-proxy/Caddyfile: -------------------------------------------------------------------------------- 1 | :80 { 2 | proxy /repos backend:8080 { 3 | header_upstream path {path} 4 | try_duration 10s 5 | } 6 | proxy / frontend:8000 { 7 | try_duration 6s 8 | } 9 | log / /var/log/access.log "{combined}" 10 | } 11 | 12 | :443 { 13 | proxy /repos backend:8080 { 14 | header_upstream path {path} 15 | try_duration 10s 16 | } 17 | proxy / frontend:8000 { 18 | try_duration 6s 19 | } 20 | log / /var/log/access.log "{combined}" 21 | tls /etc/tls/fullchain.pem /etc/tls/privkey.pem 22 | } 23 | -------------------------------------------------------------------------------- /reverse-proxy/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM alpine:3.9 2 | 3 | LABEL maintainer="Ryo Ota " 4 | 5 | RUN apk add --no-cache curl 6 | RUN curl -L https://github.com/mholt/caddy/releases/download/v0.11.5/caddy_v0.11.5_linux_amd64.tar.gz | tar zxf - 7 | 8 | ENTRYPOINT [ "/caddy" ] 9 | -------------------------------------------------------------------------------- /reverse-proxy/local.caddyfile: -------------------------------------------------------------------------------- 1 | 0.0.0.0:80 { 2 | proxy /repos backend:8080 { 3 | header_upstream path {path} 4 | try_duration 10s 5 | } 6 | proxy / frontend:8000 { 7 | try_duration 6s 8 | } 9 | log / /var/log/access.log "{combined}" 10 | } 11 | --------------------------------------------------------------------------------