├── .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.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[](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": ""
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": ""
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": ""
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": ""
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": ""
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": ""
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.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 | [](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 | 
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 | 
9 |
10 |
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 |
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 | [](https://topmate.io/vinitshahdeo)
63 | ```
64 | [](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 | 
76 | ```
77 |
78 | ### Available styles
79 |
80 | | Type | Badge |
81 | |:---|:---|
82 | | `flat` This is the default style. |  |
83 | | `flat-square` |  |
84 | | `plastic` |  |
85 | | `social` |  |
86 | | `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 | [](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 | 
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 | [](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 | 
140 |
141 | [](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 | [](https://peerlist.io/vinitshahdeo) [](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 | [](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 | [](https://github.com/sponsors/vinitshahdeo/)
159 |
160 | ## Author
161 |
162 | [](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 | [](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 | [](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 | [](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 |
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 |
--------------------------------------------------------------------------------