├── .github ├── FUNDING.yml └── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md ├── .gitignore ├── .postman ├── collection │ └── Topmate README Badges API.postman_collection.json └── schema │ └── Topmate.yaml ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── _config.yml ├── app.js ├── bin └── www ├── config └── index.js ├── package-lock.json ├── package.json ├── public ├── images │ ├── Topmate cover.png │ ├── Topmate icon.png │ ├── banner.jpeg │ ├── topmate-badge.png │ ├── topmate-banner.png │ ├── topmate-figma-mocks.png │ ├── topmate-og-image.png │ ├── topmate-product-hunt.png │ ├── topmate-readme-asset.png │ ├── topmate-readme-badge-generator.png │ ├── topmate-readme-badge-og.png │ ├── topmate-readme-banner.png │ ├── topmate-readme-cover.png │ ├── topmate.io:vinitshahdeo.png │ ├── topmate.png │ ├── vinitshahdeo-banner-readme.png │ ├── vinitshahdeo-blog-cover.png │ ├── vinitshahdeo-mentor.png │ ├── vinitshahdeo-topmate-1-1.png │ ├── vinitshahdeo-topmate-io.png │ ├── vinitshahdeo-topmate-poster.png │ ├── vinitshahdeo-topmate.png │ └── vinitshahdeo.png └── stylesheets │ └── style.css ├── routes └── index.js ├── services └── topmate.js └── views ├── error.ejs └── index.ejs /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: vinitshahdeo 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: vinitshahdeo 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: vinitshahdeo 11 | otechie: # Replace with a single Otechie username 12 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry 13 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 14 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | - OS: [e.g. iOS] 28 | - Browser [e.g. chrome, safari] 29 | - Version [e.g. 22] 30 | 31 | **Smartphone (please complete the following information):** 32 | - Device: [e.g. iPhone6] 33 | - OS: [e.g. iOS8.1] 34 | - Browser [e.g. stock browser, safari] 35 | - Version [e.g. 22] 36 | 37 | **Additional context** 38 | Add any other context about the problem here. 39 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | *.lcov 24 | 25 | # nyc test coverage 26 | .nyc_output 27 | 28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 29 | .grunt 30 | 31 | # Bower dependency directory (https://bower.io/) 32 | bower_components 33 | 34 | # node-waf configuration 35 | .lock-wscript 36 | 37 | # Compiled binary addons (https://nodejs.org/api/addons.html) 38 | build/Release 39 | 40 | # Dependency directories 41 | node_modules/ 42 | jspm_packages/ 43 | 44 | # TypeScript v1 declaration files 45 | typings/ 46 | 47 | # TypeScript cache 48 | *.tsbuildinfo 49 | 50 | # Optional npm cache directory 51 | .npm 52 | 53 | # Optional eslint cache 54 | .eslintcache 55 | 56 | # Microbundle cache 57 | .rpt2_cache/ 58 | .rts2_cache_cjs/ 59 | .rts2_cache_es/ 60 | .rts2_cache_umd/ 61 | 62 | # Optional REPL history 63 | .node_repl_history 64 | 65 | # Output of 'npm pack' 66 | *.tgz 67 | 68 | # Yarn Integrity file 69 | .yarn-integrity 70 | 71 | # dotenv environment variables file 72 | .env 73 | .env.test 74 | 75 | # parcel-bundler cache (https://parceljs.org/) 76 | .cache 77 | 78 | # Next.js build output 79 | .next 80 | 81 | # Nuxt.js build / generate output 82 | .nuxt 83 | dist 84 | 85 | # Gatsby files 86 | .cache/ 87 | # Comment in the public line in if your project uses Gatsby and *not* Next.js 88 | # https://nextjs.org/blog/next-9-1#public-directory-support 89 | # public 90 | 91 | # vuepress build output 92 | .vuepress/dist 93 | 94 | # Serverless directories 95 | .serverless/ 96 | 97 | # FuseBox cache 98 | .fusebox/ 99 | 100 | # DynamoDB Local files 101 | .dynamodb/ 102 | 103 | # TernJS port file 104 | .tern-port 105 | -------------------------------------------------------------------------------- /.postman/collection/Topmate README Badges API.postman_collection.json: -------------------------------------------------------------------------------- 1 | { 2 | "info": { 3 | "_postman_id": "c863d626-b2e3-49bf-82d0-4e4cb46a089c", 4 | "name": "Topmate README Badges API", 5 | "description": "Topmate is a platform to connect 1:1 with your audience & monetise your time better. Basically, one link to do it all ➥ [topmate.io/vinitshahdeo](https://topmate.io/vinitshahdeo). Even better, you can now **add a markdown badge** in your GitHub profile `README` to connect with your community! If you haven't claimed your topmate link yet, visit [topmate.io](https://topmate.io/) to join 1000+ creators, experts and mentors creating impact with their time.\n\n[![](https://topmate-readme-badge.onrender.com/vinitshahdeo)](https://topmate.io/vinitshahdeo)\n\n> **Here's the GitHub repository: [vinitshahdeo/topmate-readme-badge](https://github.com/vinitshahdeo/topmate-readme-badge/)**\n\n### API\n\n\n- Base URL: https://topmate-readme-badge.herokuapp.com\n- Route param: `username` - Your Topmate username\n- Query param: `style` - It can be flat, flat-square, plastic, social and for-the-badge\n\n### Usage\n\n```markdown\n[![Topmate](https://topmate-readme-badge.onrender.com/vinitshahdeo)](https://topmate.io/vinitshahdeo)\n```", 6 | "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", 7 | "_exporter_id": "6186519" 8 | }, 9 | "item": [ 10 | { 11 | "name": "Get Default Badge", 12 | "request": { 13 | "method": "GET", 14 | "header": [], 15 | "url": { 16 | "raw": "{{baseUrl}}/:username", 17 | "host": [ 18 | "{{baseUrl}}" 19 | ], 20 | "path": [ 21 | ":username" 22 | ], 23 | "variable": [ 24 | { 25 | "key": "username", 26 | "value": "vinitshahdeo", 27 | "description": "Enter your Topmate.io username" 28 | } 29 | ] 30 | }, 31 | "description": "![](https://topmate-readme-badge.onrender.com/vinitshahdeo?style=flat)" 32 | }, 33 | "response": [] 34 | }, 35 | { 36 | "name": "Get Flat Badge", 37 | "request": { 38 | "method": "GET", 39 | "header": [], 40 | "url": { 41 | "raw": "{{baseUrl}}/:username?style=flat", 42 | "host": [ 43 | "{{baseUrl}}" 44 | ], 45 | "path": [ 46 | ":username" 47 | ], 48 | "query": [ 49 | { 50 | "key": "style", 51 | "value": "flat", 52 | "description": "Badge style. It can be flat, flat-square, plastic, social and for-the-badge" 53 | } 54 | ], 55 | "variable": [ 56 | { 57 | "key": "username", 58 | "value": "vinitshahdeo", 59 | "description": "Enter your Topmate.io username" 60 | } 61 | ] 62 | }, 63 | "description": "![](https://topmate-readme-badge.onrender.com/vinitshahdeo?style=flat)" 64 | }, 65 | "response": [] 66 | }, 67 | { 68 | "name": "Get Flat Square Badge", 69 | "request": { 70 | "method": "GET", 71 | "header": [], 72 | "url": { 73 | "raw": "{{baseUrl}}/:username?style=flat-square", 74 | "host": [ 75 | "{{baseUrl}}" 76 | ], 77 | "path": [ 78 | ":username" 79 | ], 80 | "query": [ 81 | { 82 | "key": "style", 83 | "value": "flat-square", 84 | "description": "Badge style. It can be flat, flat-square, plastic, social and for-the-badge" 85 | } 86 | ], 87 | "variable": [ 88 | { 89 | "key": "username", 90 | "value": "vinitshahdeo", 91 | "description": "Enter your Topmate.io username" 92 | } 93 | ] 94 | }, 95 | "description": "![](https://topmate-readme-badge.onrender.com/vinitshahdeo?style=flat-square)" 96 | }, 97 | "response": [] 98 | }, 99 | { 100 | "name": "Get Plastic Badge", 101 | "request": { 102 | "method": "GET", 103 | "header": [], 104 | "url": { 105 | "raw": "{{baseUrl}}/:username?style=plastic", 106 | "host": [ 107 | "{{baseUrl}}" 108 | ], 109 | "path": [ 110 | ":username" 111 | ], 112 | "query": [ 113 | { 114 | "key": "style", 115 | "value": "plastic", 116 | "description": "Badge style. It can be flat, flat-square, plastic, social and for-the-badge" 117 | } 118 | ], 119 | "variable": [ 120 | { 121 | "key": "username", 122 | "value": "vinitshahdeo", 123 | "description": "Enter your Topmate.io username" 124 | } 125 | ] 126 | }, 127 | "description": "![](https://topmate-readme-badge.onrender.com/vinitshahdeo?style=plastic)" 128 | }, 129 | "response": [] 130 | }, 131 | { 132 | "name": "Get Social Badge", 133 | "request": { 134 | "method": "GET", 135 | "header": [], 136 | "url": { 137 | "raw": "{{baseUrl}}/:username?style=social", 138 | "host": [ 139 | "{{baseUrl}}" 140 | ], 141 | "path": [ 142 | ":username" 143 | ], 144 | "query": [ 145 | { 146 | "key": "style", 147 | "value": "social", 148 | "description": "Badge style. It can be flat, flat-square, plastic, social and for-the-badge" 149 | } 150 | ], 151 | "variable": [ 152 | { 153 | "key": "username", 154 | "value": "vinitshahdeo", 155 | "description": "Enter your Topmate.io username" 156 | } 157 | ] 158 | }, 159 | "description": "![](https://topmate-readme-badge.onrender.com/vinitshahdeo?style=social)" 160 | }, 161 | "response": [] 162 | }, 163 | { 164 | "name": "Get For The Badge", 165 | "request": { 166 | "method": "GET", 167 | "header": [], 168 | "url": { 169 | "raw": "{{baseUrl}}/:username?style=for-the-badge", 170 | "host": [ 171 | "{{baseUrl}}" 172 | ], 173 | "path": [ 174 | ":username" 175 | ], 176 | "query": [ 177 | { 178 | "key": "style", 179 | "value": "for-the-badge", 180 | "description": "Badge style. It can be flat, flat-square, plastic, social and for-the-badge" 181 | } 182 | ], 183 | "variable": [ 184 | { 185 | "key": "username", 186 | "value": "vinitshahdeo", 187 | "description": "Enter your Topmate.io username" 188 | } 189 | ] 190 | }, 191 | "description": "![](https://topmate-readme-badge.onrender.com/vinitshahdeo?style=for-the-badge)" 192 | }, 193 | "response": [] 194 | } 195 | ] 196 | } -------------------------------------------------------------------------------- /.postman/schema/Topmate.yaml: -------------------------------------------------------------------------------- 1 | openapi: 3.0.0 2 | info: 3 | title: Topmate README Badges API 4 | description: >- 5 | Topmate is a platform to connect 1:1 with your audience & monetise your time 6 | better. Basically, one link to do it all ➥ 7 | [topmate.io/vinitshahdeo](https://topmate.io/vinitshahdeo). Even better, you 8 | can now **add a markdown badge** in your GitHub profile `README` to connect 9 | with your community! If you haven't claimed your topmate link yet, visit 10 | [topmate.io](https://topmate.io/) to join 1000+ creators, experts and 11 | mentors creating impact with their time. 12 | 13 | 14 | [![](https://topmate-readme-badge.onrender.com/vinitshahdeo)](https://topmate.io/vinitshahdeo) 15 | 16 | 17 | > **Here's the GitHub repository: 18 | [vinitshahdeo/topmate-readme-badge](https://github.com/vinitshahdeo/topmate-readme-badge/)** 19 | 20 | 21 | ### API 22 | 23 | 24 | 25 | - Base URL: https://topmate-readme-badge.herokuapp.com 26 | 27 | - Route param: `username` - Your Topmate username 28 | 29 | - Query param: `style` - It can be flat, flat-square, plastic, social and 30 | for-the-badge 31 | 32 | 33 | ### Usage 34 | 35 | 36 | ```markdown 37 | 38 | [![Topmate](https://topmate-readme-badge.onrender.com/vinitshahdeo)](https://topmate.io/vinitshahdeo) 39 | 40 | ``` 41 | version: 1.0.0 42 | servers: 43 | - url: http://{{baseurl}} 44 | paths: 45 | /{username}: 46 | get: 47 | tags: 48 | - default 49 | summary: Get For The Badge 50 | description: >- 51 | ![](https://topmate-readme-badge.onrender.com/vinitshahdeo?style=for-the-badge) 52 | parameters: 53 | - name: style 54 | in: query 55 | schema: 56 | type: string 57 | description: >- 58 | Badge style. It can be flat, flat-square, plastic, social and 59 | for-the-badge 60 | example: for-the-badge 61 | - name: username 62 | in: path 63 | schema: 64 | type: string 65 | required: true 66 | description: Enter your Topmate.io username 67 | example: vinitshahdeo 68 | responses: 69 | '200': 70 | description: Successful response 71 | content: 72 | application/json: {} 73 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | We as members, contributors, and leaders pledge to make participation in our 6 | community a harassment-free experience for everyone, regardless of age, body 7 | size, visible or invisible disability, ethnicity, sex characteristics, gender 8 | identity and expression, level of experience, education, socio-economic status, 9 | nationality, personal appearance, race, religion, or sexual identity 10 | and orientation. 11 | 12 | We pledge to act and interact in ways that contribute to an open, welcoming, 13 | diverse, inclusive, and healthy community. 14 | 15 | ## Our Standards 16 | 17 | Examples of behavior that contributes to a positive environment for our 18 | community include: 19 | 20 | * Demonstrating empathy and kindness toward other people 21 | * Being respectful of differing opinions, viewpoints, and experiences 22 | * Giving and gracefully accepting constructive feedback 23 | * Accepting responsibility and apologizing to those affected by our mistakes, 24 | and learning from the experience 25 | * Focusing on what is best not just for us as individuals, but for the 26 | overall community 27 | 28 | Examples of unacceptable behavior include: 29 | 30 | * The use of sexualized language or imagery, and sexual attention or 31 | advances of any kind 32 | * Trolling, insulting or derogatory comments, and personal or political attacks 33 | * Public or private harassment 34 | * Publishing others' private information, such as a physical or email 35 | address, without their explicit permission 36 | * Other conduct which could reasonably be considered inappropriate in a 37 | professional setting 38 | 39 | ## Enforcement Responsibilities 40 | 41 | Community leaders are responsible for clarifying and enforcing our standards of 42 | acceptable behavior and will take appropriate and fair corrective action in 43 | response to any behavior that they deem inappropriate, threatening, offensive, 44 | or harmful. 45 | 46 | Community leaders have the right and responsibility to remove, edit, or reject 47 | comments, commits, code, wiki edits, issues, and other contributions that are 48 | not aligned to this Code of Conduct, and will communicate reasons for moderation 49 | decisions when appropriate. 50 | 51 | ## Scope 52 | 53 | This Code of Conduct applies within all community spaces, and also applies when 54 | an individual is officially representing the community in public spaces. 55 | Examples of representing our community include using an official e-mail address, 56 | posting via an official social media account, or acting as an appointed 57 | representative at an online or offline event. 58 | 59 | ## Enforcement 60 | 61 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 62 | reported to the community leaders responsible for enforcement at 63 | vinitshahdeo[at]gmail.com. 64 | All complaints will be reviewed and investigated promptly and fairly. 65 | 66 | All community leaders are obligated to respect the privacy and security of the 67 | reporter of any incident. 68 | 69 | ## Enforcement Guidelines 70 | 71 | Community leaders will follow these Community Impact Guidelines in determining 72 | the consequences for any action they deem in violation of this Code of Conduct: 73 | 74 | ### 1. Correction 75 | 76 | **Community Impact**: Use of inappropriate language or other behavior deemed 77 | unprofessional or unwelcome in the community. 78 | 79 | **Consequence**: A private, written warning from community leaders, providing 80 | clarity around the nature of the violation and an explanation of why the 81 | behavior was inappropriate. A public apology may be requested. 82 | 83 | ### 2. Warning 84 | 85 | **Community Impact**: A violation through a single incident or series 86 | of actions. 87 | 88 | **Consequence**: A warning with consequences for continued behavior. No 89 | interaction with the people involved, including unsolicited interaction with 90 | those enforcing the Code of Conduct, for a specified period of time. This 91 | includes avoiding interactions in community spaces as well as external channels 92 | like social media. Violating these terms may lead to a temporary or 93 | permanent ban. 94 | 95 | ### 3. Temporary Ban 96 | 97 | **Community Impact**: A serious violation of community standards, including 98 | sustained inappropriate behavior. 99 | 100 | **Consequence**: A temporary ban from any sort of interaction or public 101 | communication with the community for a specified period of time. No public or 102 | private interaction with the people involved, including unsolicited interaction 103 | with those enforcing the Code of Conduct, is allowed during this period. 104 | Violating these terms may lead to a permanent ban. 105 | 106 | ### 4. Permanent Ban 107 | 108 | **Community Impact**: Demonstrating a pattern of violation of community 109 | standards, including sustained inappropriate behavior, harassment of an 110 | individual, or aggression toward or disparagement of classes of individuals. 111 | 112 | **Consequence**: A permanent ban from any sort of public interaction within 113 | the community. 114 | 115 | ## Attribution 116 | 117 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], 118 | version 2.0, available at 119 | https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. 120 | 121 | Community Impact Guidelines were inspired by [Mozilla's code of conduct 122 | enforcement ladder](https://github.com/mozilla/diversity). 123 | 124 | [homepage]: https://www.contributor-covenant.org 125 | 126 | For answers to common questions about this code of conduct, see the FAQ at 127 | https://www.contributor-covenant.org/faq. Translations are available at 128 | https://www.contributor-covenant.org/translations. 129 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to Topmate Readme Badge 2 | 3 | We love your input! We want to make contributing to this project as easy and transparent as possible, whether it's: 4 | 5 | - Reporting a bug 6 | - Discussing the current state of the code 7 | - Submitting a fix 8 | - Proposing new features 9 | - Becoming a maintainer 10 | 11 | ## We Develop with Github 12 | 13 | We use github to host code, to track issues and feature requests, as well as accept pull requests. 14 | 15 | ## We Use [Github Flow](https://guides.github.com/introduction/flow/index.html), So All Code Changes Happen Through Pull Requests 16 | 17 | Pull requests are the best way to propose changes to the codebase (we use [Github Flow](https://guides.github.com/introduction/flow/index.html)). We actively welcome your pull requests: 18 | 19 | 1. Fork the repo and create your branch from `main`. 20 | 2. Write clear meaningful git commit messages. 21 | 3. Always create PR to `develop` branch. 22 | 4. Make sure your code lints. 23 | 5. Issue that pull request! 24 | 25 | ## Any contributions you make will be under the MIT Software License 26 | 27 | In short, when you submit code changes, your submissions are understood to be under the same [MIT License](https://github.com/vinitshahdeo/topmate-readme-badge/blob/master/LICENSE) that covers the project. Feel free to contact the maintainers if that's a concern. 28 | 29 | ## Report bugs using Github's [issues](https://github.com/vinitshahdeo/topmate-readme-badge/issues) 30 | 31 | We use GitHub issues to track public bugs. Report a bug by [opening a new issue](https://github.com/vinitshahdeo/topmate-readme-badge/issues/new); it's that easy! 32 | 33 | ## License 34 | 35 | By contributing, you agree that your contributions will be licensed under its [MIT License](https://github.com/vinitshahdeo/topmate-readme-badge/blob/master/LICENSE). 36 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Vinit Shahdeo 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 |

2 | Topmate README Badge
3 | 4 | 5 | 6 |

7 | 8 | ![](./public/images/topmate-readme-cover.png) 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 |
40 |
41 |
42 | 43 |
44 | 45 | Topmate is a platform to connect 1:1 with your audience & monetise your time better. Basically, one link to do it all ➥ topmate.io/vinitshahdeo. Even better, you can now add a markdown badge in your GitHub profile README to connect with your community! If you haven't claimed your topmate link yet, visit topmate.io to join 1000+ creators, experts and mentors creating impact with their time. 46 | 47 |
48 | 49 | Topmate.io README Badge Generator - Get a markdown badge for your Topmate.io profile | Product Hunt Topmate.io Readme Badge Generator - Get a markdown badge for your Topmate.io profile | Product Hunt
50 | 51 | Try now: topmate-readme-badge.netlify.app 52 | 53 | 54 |
55 | 56 | 57 | 58 | ## Here's how? 59 | Replace `vinitshahdeo` in the markdown with your Topmate username. **[Claim your Topmate link](https://topmate.io/) if you haven't yet!** 60 | 61 | ```markdown 62 | [![Topmate](https://topmate-readme-badge.onrender.com/vinitshahdeo)](https://topmate.io/vinitshahdeo) 63 | ``` 64 | [![Topmate](https://topmate-readme-badge.onrender.com/vinitshahdeo)](https://topmate.io/vinitshahdeo) 65 | 66 | ➥ **Try it out here**: [topmate-readme-badge.netlify.app](https://topmate-readme-badge.netlify.app/) *(Best viewed in Desktop)* 67 | 68 | > **Note**: In case, you're facing issues in accessing the badge using the above API which is deployed on Heroku. This happens once the monthly free dynos hours are exhausted. In such cases, consider using the service hosted on Render. Please replace the base URL from `https://topmate-readme-badge.herokuapp.com` to `https://topmate-readme-badge.onrender.com`. 69 | 70 | ## Style your badge 💅 71 | 72 | Additionally it supports the styles. **To use a different style**: Replace `flat-square` in the markdown with any of the styles below ⤵ 73 | 74 | ```markdown 75 | ![Topmate](https://topmate-readme-badge.onrender.com/vinitshahdeo?style=flat-square) 76 | ``` 77 | 78 | ### Available styles 79 | 80 | | Type | Badge | 81 | |:---|:---| 82 | | `flat`
This is the default style. | ![Topmate](https://topmate-readme-badge.onrender.com/vinitshahdeo) | 83 | | `flat-square` | ![Topmate](https://topmate-readme-badge.onrender.com/vinitshahdeo?style=flat-square) | 84 | | `plastic` | ![Topmate](https://topmate-readme-badge.onrender.com/vinitshahdeo?style=plastic) | 85 | | `social` | ![Topmate](https://topmate-readme-badge.onrender.com/vinitshahdeo?style=social) | 86 | | `for-the-badge` | ![Topmate](https://topmate-readme-badge.onrender.com/vinitshahdeo?style=for-the-badge) | 87 | 88 | ## Setup 89 | 90 | ```console 91 | npm install 92 | npm start 93 | ``` 94 | 95 | Run the above command and visit `http://localhost:3000/` 96 | 97 | ## API Documentation 98 | 99 | [![Run in Postman](https://run.pstmn.io/button.svg)](https://god.gw.postman.com/run-collection/6178851-c863d626-b2e3-49bf-82d0-4e4cb46a089c?action=collection%2Ffork&collection-url=entityId%3D6178851-c863d626-b2e3-49bf-82d0-4e4cb46a089c%26entityType%3Dcollection%26workspaceId%3Ddfda0a54-561a-45a8-b795-18038b8fd159#?env%5Btopmate%5D=W3sia2V5IjoiYmFzZVVybCIsInZhbHVlIjoiaHR0cHM6Ly90b3BtYXRlLXJlYWRtZS1iYWRnZS5oZXJva3VhcHAuY29tIiwiZW5hYmxlZCI6dHJ1ZSwidHlwZSI6ImRlZmF1bHQifV0=) 100 | 101 | `GET baseUrl/:username` - please refer to the [Topmate README Badges public Postman collection](https://www.postman.com/restless-rocket-22186/workspace/topmate-readme-badges-api/documentation/6178851-c863d626-b2e3-49bf-82d0-4e4cb46a089c) for the API documentation. Please feel free to fork and use! You can directly run the collection in Postman by using the **Run in Postman** button above. 102 | 103 | ## Under the hood 104 | 105 | ![Deployed on Heroku](https://img.shields.io/badge/Deployed%20on%20Heroku-430098?style=flat&logo=heroku&logoColor=white) 106 | 107 | The badges are powered by an express app deployed on Heroku. These are generated using a tiny-service written by me: [topmate.js](https://github.com/vinitshahdeo/topmate-readme-badge/blob/main/services/topmate.js) 108 | 109 | ```js 110 | topmate 111 | .generateBadge(username, style) 112 | .then((badge) => { 113 | // here is your badge 114 | }) 115 | .catch(console.log); 116 | ``` 117 | 118 | > Huge shoutout to [Shields.io](https://shields.io/) service for providing badges in the SVG format. 119 | 120 | ### Topmate `README` Badge Generator 121 | 122 | [![Netlify Status](https://api.netlify.com/api/v1/badges/0e91f197-4f59-438f-9eae-54ee4beb6ffe/deploy-status)](https://app.netlify.com/sites/topmate-readme-badge/deploys) 123 | 124 | > The react app is available inside the `client/` directory in the `feature/web-app`. This is currently deployed using Netlify. Try it our here: [topmate-readme-badge.netlify.app](https://topmate-readme-badge.netlify.app/) 125 | 126 | Run the commands below to build locally 👇 127 | 128 | ```bash 129 | git checkout feature/web-app 130 | cd client/topmate-readme-badge 131 | npm install 132 | npm start 133 | ``` 134 | 135 | ## Contributing 136 | 137 | This project is also open for the [Hacktoberfest](https://hacktoberfest.com/) participants. Please check out the open [issues](https://github.com/vinitshahdeo/topmate-readme-badge/issues). **Your contributions are most welcome!** 138 | 139 | ![GitHub Hacktoberfest combined status](https://img.shields.io/github/hacktoberfest/2022/vinitshahdeo/topmate-readme-badge?logo=digitalocean&logoColor=white) 140 | 141 | [![Forkers repo roster for @vinitshahdeo/topmate-readme-badge](https://reporoster.com/forks/vinitshahdeo/topmate-readme-badge)](https://github.com/vinitshahdeo/topmate-readme-badge/network/members) 142 | 143 | ## Similar projects 144 | 145 | Peerlist is a community of working professionals focused on building a personal brand, sharing professional content, and finding peers to collaborate with. A [Peerlist profile](https://peerlist.io/vinitshahdeo) can be used as a simple resume or a complete portfolio to showcase your work. You can style your `README.md` with an awesome Peerlist markdown badge. 146 | 147 | [![Peerlist](https://peerlist.onrender.com/api/vinitshahdeo)](https://peerlist.io/vinitshahdeo) [![Peerlist Badges Postman Collection](http://img.shields.io/badge/Postman-Collection-orange.svg?style=flat&logo=postman)](https://www.postman.com/restless-rocket-22186/workspace/peerlist-readme-badges/collection/6178851-67cf0bab-e978-4a37-b3ad-a5b3b42bf69e) 148 | 149 | Here's `markdown` badge generator for any Peerlist profile 💚 150 | ➥ [peerlist-readme-badge](https://github.com/vinitshahdeo/peerlist-readme-badge) 151 | 152 | [![peerlist-readme-badge](https://github-readme-stats.vercel.app/api/pin/?username=vinitshahdeo&repo=peerlist-readme-badge&theme=ayu-mirage)](https://github.com/vinitshahdeo/peerlist-readme-badge) 153 | 154 | ## Sponsor 155 | 156 | The service stops running once 550 free dyno hours on Heroku are exhausted. **[Consider sponsoring](https://github.com/sponsors/vinitshahdeo/) :dollar: me in order to keep this running by upgrading to [Hobby dynos](https://www.heroku.com/pricing) for $7 per dyno per month**. The service will never sleep and you will get 24/7 access to the awesome Topmate.io badges. 157 | 158 | [![GitHub Sponsors](https://img.shields.io/github/sponsors/vinitshahdeo?label=Sponsor%20%40vinitshahdeo&logo=github)](https://github.com/sponsors/vinitshahdeo/) 159 | 160 | ## Author 161 | 162 | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/profile?username=vinitshahdeo&data=followers,repositories,stars,commits)](https://github.com/vinitshahdeo) 163 | 164 | ## Acknowledgement 165 | 166 | - My gratitude to [Yashvi](https://github.com/yashvi2001) for helping me in building [React app](https://topmate-readme-badge.netlify.app/). Thanks for the [contributions](https://github.com/vinitshahdeo/topmate-readme-badge/pulls?q=is%3Apr+is%3Aclosed+author%3Ayashvi2001). 167 | 168 | - Special thanks to [Tejasvi](https://github.com/TejasviArora) for designing the [Figma mocks](https://www.figma.com/file/DGSis1DiZrULEiWydKtpJb/Peerlist?node-id=89%3A6). 169 | 170 | ## Stargazers :heart: 171 | 172 | [![Stargazers repo roster for @vinitshahdeo/topmate-readme-badge](https://reporoster.com/stars/vinitshahdeo/topmate-readme-badge)](https://github.com/vinitshahdeo/topmate-readme-badge/stargazers) 173 | 174 | ## Are you a student? 175 | 176 | With the placement season around the corner and the internship season already started in many colleges, I would like to make myself available to help students in their prep. Since I have been through this phase, I know that this period can be extremely challenging, not to mention mentally exhausting. So I am opening my slots on [topmate.io](https://topmate.io/vinitshahdeo) to help and guide in whatever ways I can. **Find me here: [topmate.io/vinitshahdeo](https://topmate.io/vinitshahdeo)** 177 | 178 | 179 | 180 | 181 | 182 | ## Support 183 | 184 | Glad to see you here! Let me briefly tell you what has motivated me to build this ⤵ 185 | 186 | [![Open Source Love](https://badges.frapsoft.com/os/v2/open-source.svg?v=103)](https://github.com/vinitshahdeo/) 187 | 188 | A lot has changed over the years, from being mentored to mentoring. I've always believed in [giving back to the community](https://vinitshahdeo.dev/mentorship-mock-interviews-and-giving-back-to-the-community), and Topmate has made it easy for me to connect with my mentees - [topmate.io/vinitshahdeo](https://topmate.io/vinitshahdeo). I made this tiny-service to produce `README` badges for my GitHub repositories, which will help me engage with the **open-source** community. 189 | 190 | [![](./public/images/vinitshahdeo-topmate.png)](https://vinitshahdeo.dev/mentorship-mock-interviews-and-giving-back-to-the-community) 191 | 192 | Did you love it? Consider giving a :star: and share it with your friends! You can also find me on [Twitter](https://twitter.com/Vinit_Shahdeo) ⏎ 193 | 194 | Buy Me A Coffee 195 | 196 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | title: Topmate README Badge 2 | theme: jekyll-theme-modernist 3 | plugins: 4 | - jemoji 5 | -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | var createError = require('http-errors'); 2 | var express = require('express'); 3 | var path = require('path'); 4 | var cookieParser = require('cookie-parser'); 5 | var logger = require('morgan'); 6 | 7 | var indexRouter = require('./routes/index'); 8 | 9 | var app = express(); 10 | 11 | // view engine setup 12 | app.set('views', path.join(__dirname, 'views')); 13 | app.set('view engine', 'ejs'); 14 | 15 | app.use(logger('dev')); 16 | app.use(express.json()); 17 | app.use(express.urlencoded({ extended: false })); 18 | app.use(cookieParser()); 19 | app.use(express.static(path.join(__dirname, 'public'))); 20 | 21 | app.use('/', indexRouter); 22 | 23 | // catch 404 and forward to error handler 24 | app.use(function(req, res, next) { 25 | next(createError(404)); 26 | }); 27 | 28 | // error handler 29 | app.use(function(err, req, res, next) { 30 | // set locals, only providing error in development 31 | res.locals.message = err.message; 32 | res.locals.error = req.app.get('env') === 'development' ? err : {}; 33 | 34 | // render the error page 35 | res.status(err.status || 500); 36 | res.render('error'); 37 | }); 38 | 39 | module.exports = app; 40 | -------------------------------------------------------------------------------- /bin/www: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | /** 4 | * Module dependencies. 5 | */ 6 | 7 | var app = require('../app'); 8 | var debug = require('debug')('topmate-readme-badge:server'); 9 | var http = require('http'); 10 | 11 | /** 12 | * Get port from environment and store in Express. 13 | */ 14 | 15 | var port = normalizePort(process.env.PORT || '3000'); 16 | app.set('port', port); 17 | 18 | /** 19 | * Create HTTP server. 20 | */ 21 | 22 | var server = http.createServer(app); 23 | 24 | /** 25 | * Listen on provided port, on all network interfaces. 26 | */ 27 | 28 | server.listen(port); 29 | server.on('error', onError); 30 | server.on('listening', onListening); 31 | 32 | /** 33 | * Normalize a port into a number, string, or false. 34 | */ 35 | 36 | function normalizePort(val) { 37 | var port = parseInt(val, 10); 38 | 39 | if (isNaN(port)) { 40 | // named pipe 41 | return val; 42 | } 43 | 44 | if (port >= 0) { 45 | // port number 46 | return port; 47 | } 48 | 49 | return false; 50 | } 51 | 52 | /** 53 | * Event listener for HTTP server "error" event. 54 | */ 55 | 56 | function onError(error) { 57 | if (error.syscall !== 'listen') { 58 | throw error; 59 | } 60 | 61 | var bind = typeof port === 'string' 62 | ? 'Pipe ' + port 63 | : 'Port ' + port; 64 | 65 | // handle specific listen errors with friendly messages 66 | switch (error.code) { 67 | case 'EACCES': 68 | console.error(bind + ' requires elevated privileges'); 69 | process.exit(1); 70 | break; 71 | case 'EADDRINUSE': 72 | console.error(bind + ' is already in use'); 73 | process.exit(1); 74 | break; 75 | default: 76 | throw error; 77 | } 78 | } 79 | 80 | /** 81 | * Event listener for HTTP server "listening" event. 82 | */ 83 | 84 | function onListening() { 85 | var addr = server.address(); 86 | var bind = typeof addr === 'string' 87 | ? 'pipe ' + addr 88 | : 'port ' + addr.port; 89 | debug('Listening on ' + bind); 90 | } 91 | -------------------------------------------------------------------------------- /config/index.js: -------------------------------------------------------------------------------- 1 | module.exports.DEFAULT_USERNAME = 'vinitshahdeo'; 2 | module.exports.DEFAULT_PROFILE_URL = 'https://topmate.io/vinitshahdeo'; 3 | module.exports.TOPMATE_BASE_URL = 'https://topmate.io' 4 | 5 | // Learn more about these options @ https://shields.io/ 6 | module.exports.BADGE_OPTIONS = { 7 | COLOR_A: '2A2827', 8 | COLOR_B: 'E44332', 9 | DEFAULT_STYLE: 'flat', 10 | BASE_URL: 'https://img.shields.io/badge/topmate.io', 11 | }; 12 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "topmate-readme-badge", 3 | "version": "1.0.1", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@eslint/eslintrc": { 8 | "version": "1.3.3", 9 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", 10 | "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", 11 | "dev": true, 12 | "requires": { 13 | "ajv": "^6.12.4", 14 | "debug": "^4.3.2", 15 | "espree": "^9.4.0", 16 | "globals": "^13.15.0", 17 | "ignore": "^5.2.0", 18 | "import-fresh": "^3.2.1", 19 | "js-yaml": "^4.1.0", 20 | "minimatch": "^3.1.2", 21 | "strip-json-comments": "^3.1.1" 22 | }, 23 | "dependencies": { 24 | "debug": { 25 | "version": "4.3.4", 26 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 27 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 28 | "dev": true, 29 | "requires": { 30 | "ms": "2.1.2" 31 | } 32 | }, 33 | "ms": { 34 | "version": "2.1.2", 35 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 36 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 37 | "dev": true 38 | } 39 | } 40 | }, 41 | "@humanwhocodes/config-array": { 42 | "version": "0.10.7", 43 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.7.tgz", 44 | "integrity": "sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==", 45 | "dev": true, 46 | "requires": { 47 | "@humanwhocodes/object-schema": "^1.2.1", 48 | "debug": "^4.1.1", 49 | "minimatch": "^3.0.4" 50 | }, 51 | "dependencies": { 52 | "debug": { 53 | "version": "4.3.4", 54 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 55 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 56 | "dev": true, 57 | "requires": { 58 | "ms": "2.1.2" 59 | } 60 | }, 61 | "ms": { 62 | "version": "2.1.2", 63 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 64 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 65 | "dev": true 66 | } 67 | } 68 | }, 69 | "@humanwhocodes/module-importer": { 70 | "version": "1.0.1", 71 | "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 72 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 73 | "dev": true 74 | }, 75 | "@humanwhocodes/object-schema": { 76 | "version": "1.2.1", 77 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", 78 | "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", 79 | "dev": true 80 | }, 81 | "@nodelib/fs.scandir": { 82 | "version": "2.1.5", 83 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 84 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 85 | "dev": true, 86 | "requires": { 87 | "@nodelib/fs.stat": "2.0.5", 88 | "run-parallel": "^1.1.9" 89 | } 90 | }, 91 | "@nodelib/fs.stat": { 92 | "version": "2.0.5", 93 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 94 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 95 | "dev": true 96 | }, 97 | "@nodelib/fs.walk": { 98 | "version": "1.2.8", 99 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 100 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 101 | "dev": true, 102 | "requires": { 103 | "@nodelib/fs.scandir": "2.1.5", 104 | "fastq": "^1.6.0" 105 | } 106 | }, 107 | "accepts": { 108 | "version": "1.3.8", 109 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 110 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 111 | "requires": { 112 | "mime-types": "~2.1.34", 113 | "negotiator": "0.6.3" 114 | } 115 | }, 116 | "acorn": { 117 | "version": "8.8.0", 118 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", 119 | "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", 120 | "dev": true 121 | }, 122 | "acorn-jsx": { 123 | "version": "5.3.2", 124 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 125 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 126 | "dev": true 127 | }, 128 | "ajax-request": { 129 | "version": "1.2.3", 130 | "resolved": "https://registry.npmjs.org/ajax-request/-/ajax-request-1.2.3.tgz", 131 | "integrity": "sha512-1o4a9TxDmET7NmU8eIeIsV8t1SD7dooKT7wVFgoKDJC++zljg0vLhcPsoBA3Za2bD5A5LJJBMlGoglsTHa517w==", 132 | "requires": { 133 | "file-system": "^2.1.1", 134 | "utils-extend": "^1.0.7" 135 | } 136 | }, 137 | "ajv": { 138 | "version": "6.12.6", 139 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 140 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 141 | "dev": true, 142 | "requires": { 143 | "fast-deep-equal": "^3.1.1", 144 | "fast-json-stable-stringify": "^2.0.0", 145 | "json-schema-traverse": "^0.4.1", 146 | "uri-js": "^4.2.2" 147 | } 148 | }, 149 | "ansi-regex": { 150 | "version": "5.0.1", 151 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 152 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 153 | "dev": true 154 | }, 155 | "ansi-styles": { 156 | "version": "4.3.0", 157 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 158 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 159 | "dev": true, 160 | "requires": { 161 | "color-convert": "^2.0.1" 162 | } 163 | }, 164 | "argparse": { 165 | "version": "2.0.1", 166 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 167 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 168 | "dev": true 169 | }, 170 | "array-flatten": { 171 | "version": "1.1.1", 172 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 173 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 174 | }, 175 | "array-union": { 176 | "version": "2.1.0", 177 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", 178 | "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", 179 | "dev": true 180 | }, 181 | "asynckit": { 182 | "version": "0.4.0", 183 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 184 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 185 | }, 186 | "axios": { 187 | "version": "0.27.2", 188 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", 189 | "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", 190 | "requires": { 191 | "follow-redirects": "^1.14.9", 192 | "form-data": "^4.0.0" 193 | } 194 | }, 195 | "balanced-match": { 196 | "version": "1.0.2", 197 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 198 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 199 | "dev": true 200 | }, 201 | "base64-img": { 202 | "version": "1.0.4", 203 | "resolved": "https://registry.npmjs.org/base64-img/-/base64-img-1.0.4.tgz", 204 | "integrity": "sha512-5RVat9C4bkht6kf4nrQy5gDhiLPs6Iq2sptiR8C6DV0yQ+oeo+oydDFEUgbBAW2yTwQNkthtOlAPG50gjUHaTA==", 205 | "requires": { 206 | "ajax-request": "^1.2.0", 207 | "file-system": "^2.1.0" 208 | } 209 | }, 210 | "basic-auth": { 211 | "version": "2.0.1", 212 | "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", 213 | "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", 214 | "requires": { 215 | "safe-buffer": "5.1.2" 216 | } 217 | }, 218 | "body-parser": { 219 | "version": "1.18.3", 220 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", 221 | "integrity": "sha512-YQyoqQG3sO8iCmf8+hyVpgHHOv0/hCEFiS4zTGUwTA1HjAFX66wRcNQrVCeJq9pgESMRvUAOvSil5MJlmccuKQ==", 222 | "requires": { 223 | "bytes": "3.0.0", 224 | "content-type": "~1.0.4", 225 | "debug": "2.6.9", 226 | "depd": "~1.1.2", 227 | "http-errors": "~1.6.3", 228 | "iconv-lite": "0.4.23", 229 | "on-finished": "~2.3.0", 230 | "qs": "6.5.2", 231 | "raw-body": "2.3.3", 232 | "type-is": "~1.6.16" 233 | } 234 | }, 235 | "brace-expansion": { 236 | "version": "1.1.11", 237 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 238 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 239 | "dev": true, 240 | "requires": { 241 | "balanced-match": "^1.0.0", 242 | "concat-map": "0.0.1" 243 | } 244 | }, 245 | "braces": { 246 | "version": "3.0.2", 247 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 248 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 249 | "dev": true, 250 | "requires": { 251 | "fill-range": "^7.0.1" 252 | } 253 | }, 254 | "bytes": { 255 | "version": "3.0.0", 256 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 257 | "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==" 258 | }, 259 | "callsites": { 260 | "version": "3.1.0", 261 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 262 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 263 | "dev": true 264 | }, 265 | "chalk": { 266 | "version": "4.1.2", 267 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 268 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 269 | "dev": true, 270 | "requires": { 271 | "ansi-styles": "^4.1.0", 272 | "supports-color": "^7.1.0" 273 | } 274 | }, 275 | "color-convert": { 276 | "version": "2.0.1", 277 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 278 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 279 | "dev": true, 280 | "requires": { 281 | "color-name": "~1.1.4" 282 | } 283 | }, 284 | "color-name": { 285 | "version": "1.1.4", 286 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 287 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 288 | "dev": true 289 | }, 290 | "combined-stream": { 291 | "version": "1.0.8", 292 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 293 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 294 | "requires": { 295 | "delayed-stream": "~1.0.0" 296 | } 297 | }, 298 | "concat-map": { 299 | "version": "0.0.1", 300 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 301 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 302 | "dev": true 303 | }, 304 | "content-disposition": { 305 | "version": "0.5.2", 306 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 307 | "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==" 308 | }, 309 | "content-type": { 310 | "version": "1.0.4", 311 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 312 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 313 | }, 314 | "cookie": { 315 | "version": "0.4.1", 316 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", 317 | "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" 318 | }, 319 | "cookie-parser": { 320 | "version": "1.4.6", 321 | "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", 322 | "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", 323 | "requires": { 324 | "cookie": "0.4.1", 325 | "cookie-signature": "1.0.6" 326 | } 327 | }, 328 | "cookie-signature": { 329 | "version": "1.0.6", 330 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 331 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 332 | }, 333 | "cross-spawn": { 334 | "version": "7.0.3", 335 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 336 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 337 | "dev": true, 338 | "requires": { 339 | "path-key": "^3.1.0", 340 | "shebang-command": "^2.0.0", 341 | "which": "^2.0.1" 342 | } 343 | }, 344 | "debug": { 345 | "version": "2.6.9", 346 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 347 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 348 | "requires": { 349 | "ms": "2.0.0" 350 | } 351 | }, 352 | "deep-is": { 353 | "version": "0.1.4", 354 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 355 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 356 | "dev": true 357 | }, 358 | "delayed-stream": { 359 | "version": "1.0.0", 360 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 361 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" 362 | }, 363 | "depd": { 364 | "version": "1.1.2", 365 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 366 | "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" 367 | }, 368 | "destroy": { 369 | "version": "1.0.4", 370 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 371 | "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==" 372 | }, 373 | "dir-glob": { 374 | "version": "3.0.1", 375 | "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", 376 | "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", 377 | "dev": true, 378 | "requires": { 379 | "path-type": "^4.0.0" 380 | } 381 | }, 382 | "doctrine": { 383 | "version": "3.0.0", 384 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 385 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 386 | "dev": true, 387 | "requires": { 388 | "esutils": "^2.0.2" 389 | } 390 | }, 391 | "ee-first": { 392 | "version": "1.1.1", 393 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 394 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 395 | }, 396 | "ejs": { 397 | "version": "2.6.2", 398 | "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.2.tgz", 399 | "integrity": "sha512-PcW2a0tyTuPHz3tWyYqtK6r1fZ3gp+3Sop8Ph+ZYN81Ob5rwmbHEzaqs10N3BEsaGTkh/ooniXK+WwszGlc2+Q==" 400 | }, 401 | "encodeurl": { 402 | "version": "1.0.2", 403 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 404 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" 405 | }, 406 | "escape-html": { 407 | "version": "1.0.3", 408 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 409 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 410 | }, 411 | "escape-string-regexp": { 412 | "version": "4.0.0", 413 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 414 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 415 | "dev": true 416 | }, 417 | "eslint": { 418 | "version": "8.25.0", 419 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.25.0.tgz", 420 | "integrity": "sha512-DVlJOZ4Pn50zcKW5bYH7GQK/9MsoQG2d5eDH0ebEkE8PbgzTTmtt/VTH9GGJ4BfeZCpBLqFfvsjX35UacUL83A==", 421 | "dev": true, 422 | "requires": { 423 | "@eslint/eslintrc": "^1.3.3", 424 | "@humanwhocodes/config-array": "^0.10.5", 425 | "@humanwhocodes/module-importer": "^1.0.1", 426 | "ajv": "^6.10.0", 427 | "chalk": "^4.0.0", 428 | "cross-spawn": "^7.0.2", 429 | "debug": "^4.3.2", 430 | "doctrine": "^3.0.0", 431 | "escape-string-regexp": "^4.0.0", 432 | "eslint-scope": "^7.1.1", 433 | "eslint-utils": "^3.0.0", 434 | "eslint-visitor-keys": "^3.3.0", 435 | "espree": "^9.4.0", 436 | "esquery": "^1.4.0", 437 | "esutils": "^2.0.2", 438 | "fast-deep-equal": "^3.1.3", 439 | "file-entry-cache": "^6.0.1", 440 | "find-up": "^5.0.0", 441 | "glob-parent": "^6.0.1", 442 | "globals": "^13.15.0", 443 | "globby": "^11.1.0", 444 | "grapheme-splitter": "^1.0.4", 445 | "ignore": "^5.2.0", 446 | "import-fresh": "^3.0.0", 447 | "imurmurhash": "^0.1.4", 448 | "is-glob": "^4.0.0", 449 | "js-sdsl": "^4.1.4", 450 | "js-yaml": "^4.1.0", 451 | "json-stable-stringify-without-jsonify": "^1.0.1", 452 | "levn": "^0.4.1", 453 | "lodash.merge": "^4.6.2", 454 | "minimatch": "^3.1.2", 455 | "natural-compare": "^1.4.0", 456 | "optionator": "^0.9.1", 457 | "regexpp": "^3.2.0", 458 | "strip-ansi": "^6.0.1", 459 | "strip-json-comments": "^3.1.0", 460 | "text-table": "^0.2.0" 461 | }, 462 | "dependencies": { 463 | "debug": { 464 | "version": "4.3.4", 465 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 466 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 467 | "dev": true, 468 | "requires": { 469 | "ms": "2.1.2" 470 | } 471 | }, 472 | "ms": { 473 | "version": "2.1.2", 474 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 475 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 476 | "dev": true 477 | } 478 | } 479 | }, 480 | "eslint-scope": { 481 | "version": "7.1.1", 482 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", 483 | "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", 484 | "dev": true, 485 | "requires": { 486 | "esrecurse": "^4.3.0", 487 | "estraverse": "^5.2.0" 488 | } 489 | }, 490 | "eslint-utils": { 491 | "version": "3.0.0", 492 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", 493 | "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", 494 | "dev": true, 495 | "requires": { 496 | "eslint-visitor-keys": "^2.0.0" 497 | }, 498 | "dependencies": { 499 | "eslint-visitor-keys": { 500 | "version": "2.1.0", 501 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", 502 | "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", 503 | "dev": true 504 | } 505 | } 506 | }, 507 | "eslint-visitor-keys": { 508 | "version": "3.3.0", 509 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", 510 | "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", 511 | "dev": true 512 | }, 513 | "espree": { 514 | "version": "9.4.0", 515 | "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", 516 | "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", 517 | "dev": true, 518 | "requires": { 519 | "acorn": "^8.8.0", 520 | "acorn-jsx": "^5.3.2", 521 | "eslint-visitor-keys": "^3.3.0" 522 | } 523 | }, 524 | "esquery": { 525 | "version": "1.4.0", 526 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", 527 | "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", 528 | "dev": true, 529 | "requires": { 530 | "estraverse": "^5.1.0" 531 | } 532 | }, 533 | "esrecurse": { 534 | "version": "4.3.0", 535 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 536 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 537 | "dev": true, 538 | "requires": { 539 | "estraverse": "^5.2.0" 540 | } 541 | }, 542 | "estraverse": { 543 | "version": "5.3.0", 544 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 545 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 546 | "dev": true 547 | }, 548 | "esutils": { 549 | "version": "2.0.3", 550 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 551 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 552 | "dev": true 553 | }, 554 | "etag": { 555 | "version": "1.8.1", 556 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 557 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" 558 | }, 559 | "express": { 560 | "version": "4.16.4", 561 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", 562 | "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", 563 | "requires": { 564 | "accepts": "~1.3.5", 565 | "array-flatten": "1.1.1", 566 | "body-parser": "1.18.3", 567 | "content-disposition": "0.5.2", 568 | "content-type": "~1.0.4", 569 | "cookie": "0.3.1", 570 | "cookie-signature": "1.0.6", 571 | "debug": "2.6.9", 572 | "depd": "~1.1.2", 573 | "encodeurl": "~1.0.2", 574 | "escape-html": "~1.0.3", 575 | "etag": "~1.8.1", 576 | "finalhandler": "1.1.1", 577 | "fresh": "0.5.2", 578 | "merge-descriptors": "1.0.1", 579 | "methods": "~1.1.2", 580 | "on-finished": "~2.3.0", 581 | "parseurl": "~1.3.2", 582 | "path-to-regexp": "0.1.7", 583 | "proxy-addr": "~2.0.4", 584 | "qs": "6.5.2", 585 | "range-parser": "~1.2.0", 586 | "safe-buffer": "5.1.2", 587 | "send": "0.16.2", 588 | "serve-static": "1.13.2", 589 | "setprototypeof": "1.1.0", 590 | "statuses": "~1.4.0", 591 | "type-is": "~1.6.16", 592 | "utils-merge": "1.0.1", 593 | "vary": "~1.1.2" 594 | }, 595 | "dependencies": { 596 | "cookie": { 597 | "version": "0.3.1", 598 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 599 | "integrity": "sha512-+IJOX0OqlHCszo2mBUq+SrEbCj6w7Kpffqx60zYbPTFaO4+yYgRjHwcZNpWvaTylDHaV7PPmBHzSecZiMhtPgw==" 600 | } 601 | } 602 | }, 603 | "fast-deep-equal": { 604 | "version": "3.1.3", 605 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 606 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 607 | "dev": true 608 | }, 609 | "fast-glob": { 610 | "version": "3.2.12", 611 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", 612 | "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", 613 | "dev": true, 614 | "requires": { 615 | "@nodelib/fs.stat": "^2.0.2", 616 | "@nodelib/fs.walk": "^1.2.3", 617 | "glob-parent": "^5.1.2", 618 | "merge2": "^1.3.0", 619 | "micromatch": "^4.0.4" 620 | }, 621 | "dependencies": { 622 | "glob-parent": { 623 | "version": "5.1.2", 624 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 625 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 626 | "dev": true, 627 | "requires": { 628 | "is-glob": "^4.0.1" 629 | } 630 | } 631 | } 632 | }, 633 | "fast-json-stable-stringify": { 634 | "version": "2.1.0", 635 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 636 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 637 | "dev": true 638 | }, 639 | "fast-levenshtein": { 640 | "version": "2.0.6", 641 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 642 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 643 | "dev": true 644 | }, 645 | "fastq": { 646 | "version": "1.13.0", 647 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", 648 | "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", 649 | "dev": true, 650 | "requires": { 651 | "reusify": "^1.0.4" 652 | } 653 | }, 654 | "file-entry-cache": { 655 | "version": "6.0.1", 656 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", 657 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", 658 | "dev": true, 659 | "requires": { 660 | "flat-cache": "^3.0.4" 661 | } 662 | }, 663 | "file-match": { 664 | "version": "1.0.2", 665 | "resolved": "https://registry.npmjs.org/file-match/-/file-match-1.0.2.tgz", 666 | "integrity": "sha512-g9p6bZV3HlSUM35QPvFWiP/PckDVe5jLPDhx6PfMuy06o+htesJTyDu7zRdXnOm3BY8pXmxb+QY5qIcsoWMGNg==", 667 | "requires": { 668 | "utils-extend": "^1.0.6" 669 | } 670 | }, 671 | "file-system": { 672 | "version": "2.2.2", 673 | "resolved": "https://registry.npmjs.org/file-system/-/file-system-2.2.2.tgz", 674 | "integrity": "sha512-YgbXEVCu21CfmoeJ1rFLVLPGhW9o7iCzVFqk7ydy2TxF7rXH2YB68CFgDXLOvTD2pMLtg8paVqurzVjxGRdYmw==", 675 | "requires": { 676 | "file-match": "^1.0.1", 677 | "utils-extend": "^1.0.4" 678 | } 679 | }, 680 | "fill-range": { 681 | "version": "7.0.1", 682 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 683 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 684 | "dev": true, 685 | "requires": { 686 | "to-regex-range": "^5.0.1" 687 | } 688 | }, 689 | "finalhandler": { 690 | "version": "1.1.1", 691 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", 692 | "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", 693 | "requires": { 694 | "debug": "2.6.9", 695 | "encodeurl": "~1.0.2", 696 | "escape-html": "~1.0.3", 697 | "on-finished": "~2.3.0", 698 | "parseurl": "~1.3.2", 699 | "statuses": "~1.4.0", 700 | "unpipe": "~1.0.0" 701 | } 702 | }, 703 | "find-up": { 704 | "version": "5.0.0", 705 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 706 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 707 | "dev": true, 708 | "requires": { 709 | "locate-path": "^6.0.0", 710 | "path-exists": "^4.0.0" 711 | } 712 | }, 713 | "flat-cache": { 714 | "version": "3.0.4", 715 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", 716 | "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", 717 | "dev": true, 718 | "requires": { 719 | "flatted": "^3.1.0", 720 | "rimraf": "^3.0.2" 721 | } 722 | }, 723 | "flatted": { 724 | "version": "3.2.7", 725 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", 726 | "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", 727 | "dev": true 728 | }, 729 | "follow-redirects": { 730 | "version": "1.15.2", 731 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", 732 | "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" 733 | }, 734 | "form-data": { 735 | "version": "4.0.0", 736 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 737 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 738 | "requires": { 739 | "asynckit": "^0.4.0", 740 | "combined-stream": "^1.0.8", 741 | "mime-types": "^2.1.12" 742 | } 743 | }, 744 | "forwarded": { 745 | "version": "0.2.0", 746 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 747 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" 748 | }, 749 | "fresh": { 750 | "version": "0.5.2", 751 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 752 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" 753 | }, 754 | "fs.realpath": { 755 | "version": "1.0.0", 756 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 757 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 758 | "dev": true 759 | }, 760 | "glob": { 761 | "version": "7.2.3", 762 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 763 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 764 | "dev": true, 765 | "requires": { 766 | "fs.realpath": "^1.0.0", 767 | "inflight": "^1.0.4", 768 | "inherits": "2", 769 | "minimatch": "^3.1.1", 770 | "once": "^1.3.0", 771 | "path-is-absolute": "^1.0.0" 772 | } 773 | }, 774 | "glob-parent": { 775 | "version": "6.0.2", 776 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 777 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 778 | "dev": true, 779 | "requires": { 780 | "is-glob": "^4.0.3" 781 | } 782 | }, 783 | "globals": { 784 | "version": "13.17.0", 785 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", 786 | "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", 787 | "dev": true, 788 | "requires": { 789 | "type-fest": "^0.20.2" 790 | } 791 | }, 792 | "globby": { 793 | "version": "11.1.0", 794 | "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", 795 | "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", 796 | "dev": true, 797 | "requires": { 798 | "array-union": "^2.1.0", 799 | "dir-glob": "^3.0.1", 800 | "fast-glob": "^3.2.9", 801 | "ignore": "^5.2.0", 802 | "merge2": "^1.4.1", 803 | "slash": "^3.0.0" 804 | } 805 | }, 806 | "grapheme-splitter": { 807 | "version": "1.0.4", 808 | "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", 809 | "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", 810 | "dev": true 811 | }, 812 | "has-flag": { 813 | "version": "4.0.0", 814 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 815 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 816 | "dev": true 817 | }, 818 | "http-errors": { 819 | "version": "1.6.3", 820 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 821 | "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", 822 | "requires": { 823 | "depd": "~1.1.2", 824 | "inherits": "2.0.3", 825 | "setprototypeof": "1.1.0", 826 | "statuses": ">= 1.4.0 < 2" 827 | } 828 | }, 829 | "iconv-lite": { 830 | "version": "0.4.23", 831 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", 832 | "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", 833 | "requires": { 834 | "safer-buffer": ">= 2.1.2 < 3" 835 | } 836 | }, 837 | "ignore": { 838 | "version": "5.2.0", 839 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", 840 | "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", 841 | "dev": true 842 | }, 843 | "import-fresh": { 844 | "version": "3.3.0", 845 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 846 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 847 | "dev": true, 848 | "requires": { 849 | "parent-module": "^1.0.0", 850 | "resolve-from": "^4.0.0" 851 | } 852 | }, 853 | "imurmurhash": { 854 | "version": "0.1.4", 855 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 856 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 857 | "dev": true 858 | }, 859 | "inflight": { 860 | "version": "1.0.6", 861 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 862 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 863 | "dev": true, 864 | "requires": { 865 | "once": "^1.3.0", 866 | "wrappy": "1" 867 | } 868 | }, 869 | "inherits": { 870 | "version": "2.0.3", 871 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 872 | "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" 873 | }, 874 | "ipaddr.js": { 875 | "version": "1.9.1", 876 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 877 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 878 | }, 879 | "is-extglob": { 880 | "version": "2.1.1", 881 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 882 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 883 | "dev": true 884 | }, 885 | "is-glob": { 886 | "version": "4.0.3", 887 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 888 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 889 | "dev": true, 890 | "requires": { 891 | "is-extglob": "^2.1.1" 892 | } 893 | }, 894 | "is-number": { 895 | "version": "7.0.0", 896 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 897 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 898 | "dev": true 899 | }, 900 | "isexe": { 901 | "version": "2.0.0", 902 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 903 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 904 | "dev": true 905 | }, 906 | "js-sdsl": { 907 | "version": "4.1.5", 908 | "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", 909 | "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==", 910 | "dev": true 911 | }, 912 | "js-yaml": { 913 | "version": "4.1.0", 914 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 915 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 916 | "dev": true, 917 | "requires": { 918 | "argparse": "^2.0.1" 919 | } 920 | }, 921 | "json-schema-traverse": { 922 | "version": "0.4.1", 923 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 924 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 925 | "dev": true 926 | }, 927 | "json-stable-stringify-without-jsonify": { 928 | "version": "1.0.1", 929 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 930 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 931 | "dev": true 932 | }, 933 | "levn": { 934 | "version": "0.4.1", 935 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 936 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 937 | "dev": true, 938 | "requires": { 939 | "prelude-ls": "^1.2.1", 940 | "type-check": "~0.4.0" 941 | } 942 | }, 943 | "locate-path": { 944 | "version": "6.0.0", 945 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 946 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 947 | "dev": true, 948 | "requires": { 949 | "p-locate": "^5.0.0" 950 | } 951 | }, 952 | "lodash.merge": { 953 | "version": "4.6.2", 954 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 955 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 956 | "dev": true 957 | }, 958 | "media-typer": { 959 | "version": "0.3.0", 960 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 961 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" 962 | }, 963 | "merge-descriptors": { 964 | "version": "1.0.1", 965 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 966 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 967 | }, 968 | "merge2": { 969 | "version": "1.4.1", 970 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 971 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 972 | "dev": true 973 | }, 974 | "methods": { 975 | "version": "1.1.2", 976 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 977 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" 978 | }, 979 | "micromatch": { 980 | "version": "4.0.5", 981 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 982 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 983 | "dev": true, 984 | "requires": { 985 | "braces": "^3.0.2", 986 | "picomatch": "^2.3.1" 987 | } 988 | }, 989 | "mime": { 990 | "version": "1.4.1", 991 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 992 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" 993 | }, 994 | "mime-db": { 995 | "version": "1.52.0", 996 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 997 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" 998 | }, 999 | "mime-types": { 1000 | "version": "2.1.35", 1001 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 1002 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1003 | "requires": { 1004 | "mime-db": "1.52.0" 1005 | } 1006 | }, 1007 | "minimatch": { 1008 | "version": "3.1.2", 1009 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1010 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1011 | "dev": true, 1012 | "requires": { 1013 | "brace-expansion": "^1.1.7" 1014 | } 1015 | }, 1016 | "morgan": { 1017 | "version": "1.9.1", 1018 | "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", 1019 | "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", 1020 | "requires": { 1021 | "basic-auth": "~2.0.0", 1022 | "debug": "2.6.9", 1023 | "depd": "~1.1.2", 1024 | "on-finished": "~2.3.0", 1025 | "on-headers": "~1.0.1" 1026 | } 1027 | }, 1028 | "ms": { 1029 | "version": "2.0.0", 1030 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1031 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 1032 | }, 1033 | "natural-compare": { 1034 | "version": "1.4.0", 1035 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1036 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 1037 | "dev": true 1038 | }, 1039 | "negotiator": { 1040 | "version": "0.6.3", 1041 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 1042 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" 1043 | }, 1044 | "on-finished": { 1045 | "version": "2.3.0", 1046 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 1047 | "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", 1048 | "requires": { 1049 | "ee-first": "1.1.1" 1050 | } 1051 | }, 1052 | "on-headers": { 1053 | "version": "1.0.2", 1054 | "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", 1055 | "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" 1056 | }, 1057 | "once": { 1058 | "version": "1.4.0", 1059 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1060 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1061 | "dev": true, 1062 | "requires": { 1063 | "wrappy": "1" 1064 | } 1065 | }, 1066 | "optionator": { 1067 | "version": "0.9.1", 1068 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", 1069 | "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", 1070 | "dev": true, 1071 | "requires": { 1072 | "deep-is": "^0.1.3", 1073 | "fast-levenshtein": "^2.0.6", 1074 | "levn": "^0.4.1", 1075 | "prelude-ls": "^1.2.1", 1076 | "type-check": "^0.4.0", 1077 | "word-wrap": "^1.2.3" 1078 | } 1079 | }, 1080 | "p-limit": { 1081 | "version": "3.1.0", 1082 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 1083 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 1084 | "dev": true, 1085 | "requires": { 1086 | "yocto-queue": "^0.1.0" 1087 | } 1088 | }, 1089 | "p-locate": { 1090 | "version": "5.0.0", 1091 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 1092 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 1093 | "dev": true, 1094 | "requires": { 1095 | "p-limit": "^3.0.2" 1096 | } 1097 | }, 1098 | "parent-module": { 1099 | "version": "1.0.1", 1100 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1101 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1102 | "dev": true, 1103 | "requires": { 1104 | "callsites": "^3.0.0" 1105 | } 1106 | }, 1107 | "parseurl": { 1108 | "version": "1.3.3", 1109 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1110 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 1111 | }, 1112 | "path-exists": { 1113 | "version": "4.0.0", 1114 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1115 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 1116 | "dev": true 1117 | }, 1118 | "path-is-absolute": { 1119 | "version": "1.0.1", 1120 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1121 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1122 | "dev": true 1123 | }, 1124 | "path-key": { 1125 | "version": "3.1.1", 1126 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1127 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1128 | "dev": true 1129 | }, 1130 | "path-to-regexp": { 1131 | "version": "0.1.7", 1132 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 1133 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 1134 | }, 1135 | "path-type": { 1136 | "version": "4.0.0", 1137 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", 1138 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", 1139 | "dev": true 1140 | }, 1141 | "picomatch": { 1142 | "version": "2.3.1", 1143 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1144 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1145 | "dev": true 1146 | }, 1147 | "prelude-ls": { 1148 | "version": "1.2.1", 1149 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 1150 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 1151 | "dev": true 1152 | }, 1153 | "proxy-addr": { 1154 | "version": "2.0.7", 1155 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 1156 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 1157 | "requires": { 1158 | "forwarded": "0.2.0", 1159 | "ipaddr.js": "1.9.1" 1160 | } 1161 | }, 1162 | "punycode": { 1163 | "version": "2.1.1", 1164 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1165 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 1166 | "dev": true 1167 | }, 1168 | "qs": { 1169 | "version": "6.5.2", 1170 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 1171 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 1172 | }, 1173 | "queue-microtask": { 1174 | "version": "1.2.3", 1175 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1176 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 1177 | "dev": true 1178 | }, 1179 | "range-parser": { 1180 | "version": "1.2.1", 1181 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1182 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 1183 | }, 1184 | "raw-body": { 1185 | "version": "2.3.3", 1186 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", 1187 | "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", 1188 | "requires": { 1189 | "bytes": "3.0.0", 1190 | "http-errors": "1.6.3", 1191 | "iconv-lite": "0.4.23", 1192 | "unpipe": "1.0.0" 1193 | } 1194 | }, 1195 | "regexpp": { 1196 | "version": "3.2.0", 1197 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", 1198 | "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", 1199 | "dev": true 1200 | }, 1201 | "resolve-from": { 1202 | "version": "4.0.0", 1203 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1204 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1205 | "dev": true 1206 | }, 1207 | "reusify": { 1208 | "version": "1.0.4", 1209 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 1210 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 1211 | "dev": true 1212 | }, 1213 | "rimraf": { 1214 | "version": "3.0.2", 1215 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 1216 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1217 | "dev": true, 1218 | "requires": { 1219 | "glob": "^7.1.3" 1220 | } 1221 | }, 1222 | "run-parallel": { 1223 | "version": "1.2.0", 1224 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 1225 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 1226 | "dev": true, 1227 | "requires": { 1228 | "queue-microtask": "^1.2.2" 1229 | } 1230 | }, 1231 | "safe-buffer": { 1232 | "version": "5.1.2", 1233 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1234 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1235 | }, 1236 | "safer-buffer": { 1237 | "version": "2.1.2", 1238 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1239 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1240 | }, 1241 | "send": { 1242 | "version": "0.16.2", 1243 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", 1244 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", 1245 | "requires": { 1246 | "debug": "2.6.9", 1247 | "depd": "~1.1.2", 1248 | "destroy": "~1.0.4", 1249 | "encodeurl": "~1.0.2", 1250 | "escape-html": "~1.0.3", 1251 | "etag": "~1.8.1", 1252 | "fresh": "0.5.2", 1253 | "http-errors": "~1.6.2", 1254 | "mime": "1.4.1", 1255 | "ms": "2.0.0", 1256 | "on-finished": "~2.3.0", 1257 | "range-parser": "~1.2.0", 1258 | "statuses": "~1.4.0" 1259 | } 1260 | }, 1261 | "serve-static": { 1262 | "version": "1.13.2", 1263 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", 1264 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", 1265 | "requires": { 1266 | "encodeurl": "~1.0.2", 1267 | "escape-html": "~1.0.3", 1268 | "parseurl": "~1.3.2", 1269 | "send": "0.16.2" 1270 | } 1271 | }, 1272 | "setprototypeof": { 1273 | "version": "1.1.0", 1274 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 1275 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" 1276 | }, 1277 | "shebang-command": { 1278 | "version": "2.0.0", 1279 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1280 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1281 | "dev": true, 1282 | "requires": { 1283 | "shebang-regex": "^3.0.0" 1284 | } 1285 | }, 1286 | "shebang-regex": { 1287 | "version": "3.0.0", 1288 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1289 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1290 | "dev": true 1291 | }, 1292 | "slash": { 1293 | "version": "3.0.0", 1294 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", 1295 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", 1296 | "dev": true 1297 | }, 1298 | "statuses": { 1299 | "version": "1.4.0", 1300 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 1301 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 1302 | }, 1303 | "strip-ansi": { 1304 | "version": "6.0.1", 1305 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1306 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1307 | "dev": true, 1308 | "requires": { 1309 | "ansi-regex": "^5.0.1" 1310 | } 1311 | }, 1312 | "strip-json-comments": { 1313 | "version": "3.1.1", 1314 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 1315 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 1316 | "dev": true 1317 | }, 1318 | "supports-color": { 1319 | "version": "7.2.0", 1320 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1321 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1322 | "dev": true, 1323 | "requires": { 1324 | "has-flag": "^4.0.0" 1325 | } 1326 | }, 1327 | "text-table": { 1328 | "version": "0.2.0", 1329 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1330 | "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", 1331 | "dev": true 1332 | }, 1333 | "to-regex-range": { 1334 | "version": "5.0.1", 1335 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1336 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1337 | "dev": true, 1338 | "requires": { 1339 | "is-number": "^7.0.0" 1340 | } 1341 | }, 1342 | "type-check": { 1343 | "version": "0.4.0", 1344 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 1345 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 1346 | "dev": true, 1347 | "requires": { 1348 | "prelude-ls": "^1.2.1" 1349 | } 1350 | }, 1351 | "type-fest": { 1352 | "version": "0.20.2", 1353 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", 1354 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", 1355 | "dev": true 1356 | }, 1357 | "type-is": { 1358 | "version": "1.6.18", 1359 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1360 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1361 | "requires": { 1362 | "media-typer": "0.3.0", 1363 | "mime-types": "~2.1.24" 1364 | } 1365 | }, 1366 | "unpipe": { 1367 | "version": "1.0.0", 1368 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1369 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" 1370 | }, 1371 | "uri-js": { 1372 | "version": "4.4.1", 1373 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1374 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1375 | "dev": true, 1376 | "requires": { 1377 | "punycode": "^2.1.0" 1378 | } 1379 | }, 1380 | "utils-extend": { 1381 | "version": "1.0.8", 1382 | "resolved": "https://registry.npmjs.org/utils-extend/-/utils-extend-1.0.8.tgz", 1383 | "integrity": "sha512-+VzQieEAijyCFGqnGAWIy7Em1dFGdgf1w+orKwmTWHyaGL19aw9Oq5e5ZZaxgcS777AkPYEsbgWqpz5E6KniPg==" 1384 | }, 1385 | "utils-merge": { 1386 | "version": "1.0.1", 1387 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1388 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" 1389 | }, 1390 | "vary": { 1391 | "version": "1.1.2", 1392 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1393 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" 1394 | }, 1395 | "which": { 1396 | "version": "2.0.2", 1397 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1398 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1399 | "dev": true, 1400 | "requires": { 1401 | "isexe": "^2.0.0" 1402 | } 1403 | }, 1404 | "word-wrap": { 1405 | "version": "1.2.3", 1406 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 1407 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 1408 | "dev": true 1409 | }, 1410 | "wrappy": { 1411 | "version": "1.0.2", 1412 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1413 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 1414 | "dev": true 1415 | }, 1416 | "yocto-queue": { 1417 | "version": "0.1.0", 1418 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 1419 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 1420 | "dev": true 1421 | } 1422 | } 1423 | } 1424 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "topmate-readme-badge", 3 | "version": "1.0.1", 4 | "author": { 5 | "name": "Vinit Shahdeo", 6 | "url": "https://topmate.io/vinitshahdeo" 7 | }, 8 | "private": true, 9 | "scripts": { 10 | "start": "node ./bin/www", 11 | "lint": "eslint" 12 | }, 13 | "dependencies": { 14 | "axios": "^0.27.2", 15 | "base64-img": "^1.0.4", 16 | "cookie-parser": "~1.4.4", 17 | "debug": "~2.6.9", 18 | "ejs": "~2.6.1", 19 | "express": "~4.16.1", 20 | "http-errors": "~1.6.3", 21 | "morgan": "~1.9.1" 22 | }, 23 | "devDependencies": { 24 | "eslint": "^8.25.0" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /public/images/Topmate cover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vinitshahdeo/topmate-readme-badge/e52c4518791702e4f3a87fb5beb888e9a1296044/public/images/Topmate cover.png -------------------------------------------------------------------------------- /public/images/Topmate icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vinitshahdeo/topmate-readme-badge/e52c4518791702e4f3a87fb5beb888e9a1296044/public/images/Topmate icon.png -------------------------------------------------------------------------------- /public/images/banner.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vinitshahdeo/topmate-readme-badge/e52c4518791702e4f3a87fb5beb888e9a1296044/public/images/banner.jpeg -------------------------------------------------------------------------------- /public/images/topmate-badge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vinitshahdeo/topmate-readme-badge/e52c4518791702e4f3a87fb5beb888e9a1296044/public/images/topmate-badge.png -------------------------------------------------------------------------------- /public/images/topmate-banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vinitshahdeo/topmate-readme-badge/e52c4518791702e4f3a87fb5beb888e9a1296044/public/images/topmate-banner.png -------------------------------------------------------------------------------- /public/images/topmate-figma-mocks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vinitshahdeo/topmate-readme-badge/e52c4518791702e4f3a87fb5beb888e9a1296044/public/images/topmate-figma-mocks.png -------------------------------------------------------------------------------- /public/images/topmate-og-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vinitshahdeo/topmate-readme-badge/e52c4518791702e4f3a87fb5beb888e9a1296044/public/images/topmate-og-image.png -------------------------------------------------------------------------------- /public/images/topmate-product-hunt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vinitshahdeo/topmate-readme-badge/e52c4518791702e4f3a87fb5beb888e9a1296044/public/images/topmate-product-hunt.png -------------------------------------------------------------------------------- /public/images/topmate-readme-asset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vinitshahdeo/topmate-readme-badge/e52c4518791702e4f3a87fb5beb888e9a1296044/public/images/topmate-readme-asset.png -------------------------------------------------------------------------------- /public/images/topmate-readme-badge-generator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vinitshahdeo/topmate-readme-badge/e52c4518791702e4f3a87fb5beb888e9a1296044/public/images/topmate-readme-badge-generator.png -------------------------------------------------------------------------------- /public/images/topmate-readme-badge-og.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vinitshahdeo/topmate-readme-badge/e52c4518791702e4f3a87fb5beb888e9a1296044/public/images/topmate-readme-badge-og.png -------------------------------------------------------------------------------- /public/images/topmate-readme-banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vinitshahdeo/topmate-readme-badge/e52c4518791702e4f3a87fb5beb888e9a1296044/public/images/topmate-readme-banner.png -------------------------------------------------------------------------------- /public/images/topmate-readme-cover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vinitshahdeo/topmate-readme-badge/e52c4518791702e4f3a87fb5beb888e9a1296044/public/images/topmate-readme-cover.png -------------------------------------------------------------------------------- /public/images/topmate.io:vinitshahdeo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vinitshahdeo/topmate-readme-badge/e52c4518791702e4f3a87fb5beb888e9a1296044/public/images/topmate.io:vinitshahdeo.png -------------------------------------------------------------------------------- /public/images/topmate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vinitshahdeo/topmate-readme-badge/e52c4518791702e4f3a87fb5beb888e9a1296044/public/images/topmate.png -------------------------------------------------------------------------------- /public/images/vinitshahdeo-banner-readme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vinitshahdeo/topmate-readme-badge/e52c4518791702e4f3a87fb5beb888e9a1296044/public/images/vinitshahdeo-banner-readme.png -------------------------------------------------------------------------------- /public/images/vinitshahdeo-blog-cover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vinitshahdeo/topmate-readme-badge/e52c4518791702e4f3a87fb5beb888e9a1296044/public/images/vinitshahdeo-blog-cover.png -------------------------------------------------------------------------------- /public/images/vinitshahdeo-mentor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vinitshahdeo/topmate-readme-badge/e52c4518791702e4f3a87fb5beb888e9a1296044/public/images/vinitshahdeo-mentor.png -------------------------------------------------------------------------------- /public/images/vinitshahdeo-topmate-1-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vinitshahdeo/topmate-readme-badge/e52c4518791702e4f3a87fb5beb888e9a1296044/public/images/vinitshahdeo-topmate-1-1.png -------------------------------------------------------------------------------- /public/images/vinitshahdeo-topmate-io.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vinitshahdeo/topmate-readme-badge/e52c4518791702e4f3a87fb5beb888e9a1296044/public/images/vinitshahdeo-topmate-io.png -------------------------------------------------------------------------------- /public/images/vinitshahdeo-topmate-poster.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vinitshahdeo/topmate-readme-badge/e52c4518791702e4f3a87fb5beb888e9a1296044/public/images/vinitshahdeo-topmate-poster.png -------------------------------------------------------------------------------- /public/images/vinitshahdeo-topmate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vinitshahdeo/topmate-readme-badge/e52c4518791702e4f3a87fb5beb888e9a1296044/public/images/vinitshahdeo-topmate.png -------------------------------------------------------------------------------- /public/images/vinitshahdeo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vinitshahdeo/topmate-readme-badge/e52c4518791702e4f3a87fb5beb888e9a1296044/public/images/vinitshahdeo.png -------------------------------------------------------------------------------- /public/stylesheets/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding: 50px; 3 | font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; 4 | } 5 | 6 | a { 7 | color: #00B7FF; 8 | } 9 | -------------------------------------------------------------------------------- /routes/index.js: -------------------------------------------------------------------------------- 1 | const express = require('express'), 2 | router = express.Router(), 3 | topmate = require('../services/topmate'); 4 | 5 | router.get('/:id', function (req, res, next) { 6 | const username = req.params.id, // topmate username 7 | style = req.query.style; 8 | 9 | topmate 10 | .generateBadge(username, style) 11 | .then((badge) => { 12 | res.setHeader('content-type', 'image/svg+xml;charset=utf-8'); 13 | res.send(badge); 14 | }) 15 | .catch(console.log); 16 | }); 17 | 18 | // defaults to badge for https://topmate.io/vinitshahdeo 19 | router.get('/', function (req, res, next) { 20 | topmate 21 | .generateBadge() 22 | .then((badge) => { 23 | res.setHeader('content-type', 'image/svg+xml;charset=utf-8'); 24 | res.send(badge); 25 | }) 26 | .catch(console.log); 27 | }); 28 | 29 | module.exports = router; 30 | -------------------------------------------------------------------------------- /services/topmate.js: -------------------------------------------------------------------------------- 1 | const base64Img = require('base64-img'), 2 | axios = require('axios'), 3 | logo = base64Img.base64Sync('./public/images/topmate.png'), 4 | 5 | // default config for badge 6 | { 7 | DEFAULT_USERNAME, 8 | DEFAULT_PROFILE_URL, 9 | TOPMATE_BASE_URL, 10 | BADGE_OPTIONS, 11 | } = require('../config'), 12 | { COLOR_A, COLOR_B, DEFAULT_STYLE, BASE_URL } = BADGE_OPTIONS; 13 | 14 | (getProfileUrl = (username) => { 15 | if (!username) return DEFAULT_PROFILE_URL; 16 | 17 | const profileURL = `${TOPMATE_BASE_URL}/${username}`; 18 | return profileURL; 19 | }), 20 | (downloadBadge = async (badgeURL) => { 21 | const response = await axios.get(badgeURL), 22 | svgXml = response.data; 23 | 24 | return svgXml; 25 | }); 26 | 27 | module.exports = { 28 | /** 29 | * 30 | * Generate a badge for your Topmate profile 31 | * Sample profile: https://topmate.io/vinitshahdeo 32 | * 33 | * @param {string} username - topmate username like `vinitshahdeo` 34 | * @param {style} style - possible values are `flat`, `flat-square`, `plastic`, `for-the-badge`, `social` 35 | * @returns Topmate README Badge 36 | */ 37 | generateBadge: (username = DEFAULT_USERNAME, style = DEFAULT_STYLE) => { 38 | const profileUrl = getProfileUrl(username), 39 | sanitizedUsername = username.replace(/[^a-zA-Z0-9 ]/g, ''), // remove special chars otherwise shields will throw an error 40 | qs = `link=${profileUrl}&logo=${logo}&colorA=${COLOR_A}&colorB=${COLOR_B}&style=${style}`, 41 | badgeURL = `${BASE_URL}-${sanitizedUsername}-critical?${qs}`; 42 | 43 | return downloadBadge(badgeURL); 44 | }, 45 | }; 46 | -------------------------------------------------------------------------------- /views/error.ejs: -------------------------------------------------------------------------------- 1 |

<%= message %>

2 |

<%= error.status %>

3 |
<%= error.stack %>
4 | -------------------------------------------------------------------------------- /views/index.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | <%= title %> 5 | 6 | 7 | 8 |

<%= title %>

9 |

Welcome to <%= title %>

10 | 11 | 12 | --------------------------------------------------------------------------------