├── .babelrc ├── .editorconfig ├── .eslintrc.js ├── .gitignore ├── .prettierignore ├── .prettierrc ├── .vercelignore ├── CODE_OF_CONDUCT.md ├── LICENSE.md ├── README.md ├── THEMES.md ├── api ├── index.ts ├── routes.ts └── routes │ ├── profile-route.ts │ └── skills-route.ts ├── package.json ├── public ├── api │ ├── index.js │ ├── index.js.map │ ├── routes.js │ ├── routes.js.map │ └── routes │ │ ├── profile-route.js │ │ ├── profile-route.js.map │ │ ├── skills-route.js │ │ └── skills-route.js.map └── src │ ├── components │ ├── card.js │ ├── card.js.map │ ├── gradient-box.js │ └── gradient-box.js.map │ ├── data │ ├── frameworks.js │ ├── frameworks.js.map │ ├── languages.js │ ├── languages.js.map │ ├── libraries.js │ ├── libraries.js.map │ ├── software-ides.js │ ├── software-ides.js.map │ ├── themes.js │ ├── themes.js.map │ ├── tools.js │ └── tools.js.map │ ├── fetchers │ ├── user-stats-fetcher.js │ └── user-stats-fetcher.js.map │ ├── interfaces │ ├── Contributions.js │ ├── Contributions.js.map │ ├── GithubUser.js │ ├── GithubUser.js.map │ ├── IconData.js │ ├── IconData.js.map │ ├── Repositories.js │ ├── Repositories.js.map │ ├── Theme.js │ └── Theme.js.map │ ├── utils.js │ ├── utils.js.map │ └── widgets │ ├── error.js │ ├── error.js.map │ ├── profile.js │ ├── profile.js.map │ ├── skills.js │ └── skills.js.map ├── src ├── components │ ├── card.ts │ └── gradient-box.ts ├── data │ ├── frameworks.ts │ ├── languages.ts │ ├── libraries.ts │ ├── software-ides.ts │ ├── themes.ts │ └── tools.ts ├── fetchers │ └── user-stats-fetcher.ts ├── interfaces │ ├── Contributions.ts │ ├── GithubUser.ts │ ├── IconData.ts │ ├── Repositories.ts │ └── Theme.ts ├── utils.ts └── widgets │ ├── error.ts │ ├── profile.ts │ └── skills.ts ├── tsconfig.json └── vercel.json /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "test": { 4 | "presets": [ 5 | [ 6 | "@babel/preset-env", 7 | { 8 | "targets": { 9 | "node": "current" 10 | } 11 | } 12 | ] 13 | ] 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 4 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | es2021: true, 4 | node: true, 5 | }, 6 | extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended'], 7 | parser: '@typescript-eslint/parser', 8 | parserOptions: { 9 | ecmaVersion: 12, 10 | sourceType: 'module', 11 | }, 12 | plugins: ['@typescript-eslint'], 13 | rules: { 14 | 'no-console': 'off', 15 | '@typescript-eslint/no-var-requires': 0, 16 | '@typescript-eslint/ban-types': 'off', 17 | }, 18 | } 19 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # IDEs 2 | .vscode/ 3 | .idea/ 4 | 5 | # Build & deploy 6 | .vercel 7 | vercel_token 8 | 9 | # Secrets 10 | .env 11 | 12 | # Node 13 | node_modules 14 | package-lock.json 15 | 16 | # Testing 17 | coverage 18 | 19 | # Others 20 | src/widgets/prototyping.svg 21 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | *.md 3 | coverage 4 | .vercel 5 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "semi": false, 3 | "singleQuote": true, 4 | "tabWidth": 4 5 | } 6 | -------------------------------------------------------------------------------- /.vercelignore: -------------------------------------------------------------------------------- 1 | .env 2 | package-lock.json 3 | -------------------------------------------------------------------------------- /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 | github@jurre.me. 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 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Jurre de Ruiter 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 | ![image](https://user-images.githubusercontent.com/62119716/165963936-dc518c49-69b6-4106-aadb-26f15346df03.png) 2 | 3 |

4 | [✨] Beautiful, dynamic widgets for GitHub Readme pages. (Statistics, Skills, etc.) 5 |

6 |

7 | 8 | ## Widgets 9 | 10 | ### Skills 11 | 12 | A clear way to give an overview of programming languages, tools, and software that you're familiar with. 13 | 14 | #### Languages 15 | 16 | 17 | Default | &includeNames=true 18 | :-------------------------:|:-------------------------: 19 | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/skills?languages=js,ts,java,php,python,html,css,c,cpp,csharp,swift,rust,ruby,kotlin,erlang,dart,go,scala,elm,bash,r,xml,json,yaml,postgresql,mysql,haskell,powershell,lua,visualbasic,x86,arm,groovy,perl,solidity,fortran,sass,graphql,clojure,clojurescript,markdown)](https://github.com/Jurredr/github-widgetbox) | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/skills?languages=js,ts,java,php,python,html,css,c,cpp,csharp,swift,rust,ruby,kotlin,erlang,dart,go,scala,elm,bash,r,xml,json,yaml,postgresql,mysql,haskell,powershell,lua,visualbasic,x86,arm,groovy,perl,solidity,fortran,sass,graphql,clojure,clojurescript,markdown&includeNames=true)](https://github.com/Jurredr/github-widgetbox) 20 | 21 | ```md 22 | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/skills?languages=js,ts,java,php,python,html,css,c,cpp,csharp,swift,rust,ruby,kotlin,erlang,dart,go,scala,elm,bash,r,xml,json,yaml,postgresql,mysql,haskell,powershell,lua,visualbasic,x86,arm,groovy,perl,solidity,fortran,sass,graphql,clojure,clojurescript,markdown)](https://github.com/Jurredr/github-widgetbox) 23 | ``` 24 | 25 | #### Frameworks 26 | 27 | Default | &includeNames=true 28 | :-------------------------:|:-------------------------: 29 | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/skills?frameworks=vue,react,nuxt,next,django,flutter,electron,bootstrap,gatsby,nest,tailwind,windi,express,svelte,angular,dotnetcore,laravel,ionic,dotnet)](https://github.com/Jurredr/github-widgetbox) | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/skills?frameworks=vue,react,nuxt,next,django,flutter,electron,bootstrap,gatsby,nest,tailwind,windi,express,svelte,angular,dotnetcore,laravel,ionic,dotnet&includeNames=true)](https://github.com/Jurredr/github-widgetbox) 30 | 31 | ```md 32 | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/skills?frameworks=vue,react,nuxt,next,django,flutter,electron,bootstrap,gatsby,nest,tailwind,windi,express,svelte,angular,dotnetcore,laravel,ionic,dotnet)](https://github.com/Jurredr/github-widgetbox) 33 | ``` 34 | 35 | #### Libraries 36 | 37 | Default | &includeNames=true 38 | :-------------------------:|:-------------------------: 39 | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/skills?libraries=babel,p5,tensorflow,jquery)](https://github.com/Jurredr/github-widgetbox) | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/skills?libraries=babel,p5,tensorflow,jquery&includeNames=true)](https://github.com/Jurredr/github-widgetbox) 40 | 41 | ```md 42 | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/skills?libraries=babel,p5,tensorflow,jquery)](https://github.com/Jurredr/github-widgetbox) 43 | ``` 44 | 45 | #### Tools 46 | 47 | Default | &includeNames=true 48 | :-------------------------:|:-------------------------: 49 | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/skills?tools=git,docker,npm,yarn,webpack,gulp,firebase,mongodb,wordpress,shopify,woocommerce,vercel,redis,nodejs,heroku,apache,nginx,aws,jupyter,gradle,prettier)](https://github.com/Jurredr/github-widgetbox) | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/skills?tools=git,docker,npm,yarn,webpack,gulp,firebase,mongodb,wordpress,shopify,woocommerce,vercel,redis,nodejs,heroku,apache,nginx,aws,jupyter,gradle,prettier&includeNames=true)](https://github.com/Jurredr/github-widgetbox) 50 | 51 | ```md 52 | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/skills?tools=git,docker,npm,yarn,webpack,gulp,firebase,mongodb,wordpress,shopify,woocommerce,vercel,redis,nodejs,heroku,apache,nginx,aws,jupyter,gradle,prettier)](https://github.com/Jurredr/github-widgetbox) 53 | ``` 54 | 55 | 56 | #### Software & IDE's 57 | 58 | Default | &includeNames=true 59 | :-------------------------:|:-------------------------: 60 | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/skills?software=linux,windows,vscode)](https://github.com/Jurredr/github-widgetbox) | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/skills?software=linux,windows,vscode&includeNames=true)](https://github.com/Jurredr/github-widgetbox) 61 | 62 | ```md 63 | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/skills?software=linux,windows,vscode)](https://github.com/Jurredr/github-widgetbox) 64 | ``` 65 | 66 |

67 | ### Profile 68 | 69 | Show off your profile with some interesting statistics. Perfect for profile READMEs. 70 | 71 | 72 | `&data=followers,repositories,stars,commits` 73 | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/profile?username=Jurredr&data=followers,repositories,stars,commits)](https://github.com/Jurredr/github-widgetbox) 74 | 75 | ```md 76 | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/profile?username=Jurredr&data=followers,repositories,stars,commits)](https://github.com/Jurredr/github-widgetbox) 77 | ``` 78 |

79 | ### Themes 80 | 81 | GitHub WidgetBox supports a great variety of different themes for all widgets, like the ones below. 82 | You can check out more examples in [themes.md](https://github.com/Jurredr/github-widgetbox/blob/master/THEMES.md), or have a look at all themes in the [themes.ts](https://github.com/Jurredr/github-widgetbox/blob/9bd0e12a8a79b44b1e714f0c74aa3704091a0360/src/data/themes.ts) file. Feel free to create your own theme(s) and add them to that `themes.ts` file. Make sure to create a PR afterwards to share it with everyone else! 83 | 84 | 85 | `&theme=darkmode` 86 | 87 | darkmode | default 88 | :-------------------------:|:-------------------------: 89 | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/profile?username=Jurredr&data=followers,repositories,stars,commits&theme=darkmode)](https://github.com/Jurredr/github-widgetbox) | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/profile?username=Jurredr&data=followers,repositories,stars,commits&theme=default)](https://github.com/Jurredr/github-widgetbox)
90 | 91 | 92 | viridescent | carbon 93 | :-------------------------:|:-------------------------: 94 | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/profile?username=Jurredr&data=followers,repositories,stars,commits&theme=viridescent)](https://github.com/Jurredr/github-widgetbox) | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/profile?username=Jurredr&data=followers,repositories,stars,commits&theme=carbon)](https://github.com/Jurredr/github-widgetbox)
95 | 96 | 97 | nautilus | serika 98 | :-------------------------:|:-------------------------: 99 | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/profile?username=Jurredr&data=followers,repositories,stars,commits&theme=nautilus)](https://github.com/Jurredr/github-widgetbox) | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/profile?username=Jurredr&data=followers,repositories,stars,commits&theme=serika)](https://github.com/Jurredr/github-widgetbox) 100 | 101 | ```md 102 | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/profile?username=Jurredr&data=followers,repositories,stars,commits&theme=nautilus)](https://github.com/Jurredr/github-widgetbox) 103 | ``` 104 | 105 |

106 | ## TO-DO 107 | 108 | * [x] Fix skills text being off-center 109 | * [x] Add themes (dark mode) 110 | * [x] Add Skills: Tools & Frameworks widget 111 | * [x] Add Skills: Software & IDEs widget 112 | * [ ] Make autobuilder instead of manual build and push 113 | * [ ] Count organization repositories (+ their stars) 114 | * [ ] Truncate name if too long on profile widget 115 | * [ ] Make all widgets a modular size 116 | * [ ] Add Profile Tag widget 117 | * [ ] Add Skill Tag widget 118 | * [ ] Add Commit Streak widget 119 | * [ ] Add Twitter widget 120 | * [ ] Add LinkedIn widget 121 | * [ ] Add Instagram widget 122 | * [ ] Add YouTube widget 123 | * [ ] Add Portfolio website widget 124 | * [ ] Add Project link widget 125 | * [ ] Add Profile banner widget 126 | * [ ] Add Stats widget 127 | -------------------------------------------------------------------------------- /THEMES.md: -------------------------------------------------------------------------------- 1 | 2 | darkmode | default 3 | :-------------------------:|:-------------------------: 4 | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/profile?username=Jurredr&data=followers,repositories,stars,commits&theme=darkmode)](https://github.com/Jurredr/github-widgetbox) | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/profile?username=Jurredr&data=followers,repositories,stars,commits&theme=default)](https://github.com/Jurredr/github-widgetbox)
5 | 6 | viridescent | dark 7 | :-------------------------:|:-------------------------: 8 | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/profile?username=Jurredr&data=followers,repositories,stars,commits&theme=viridescent)](https://github.com/Jurredr/github-widgetbox) | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/profile?username=Jurredr&data=followers,repositories,stars,commits&theme=dark)](https://github.com/Jurredr/github-widgetbox)
9 | 10 | muted | dark_magic_girl 11 | :-------------------------:|:-------------------------: 12 | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/profile?username=Jurredr&data=followers,repositories,stars,commits&theme=muted)](https://github.com/Jurredr/github-widgetbox) | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/profile?username=Jurredr&data=followers,repositories,stars,commits&theme=dark_magic_girl)](https://github.com/Jurredr/github-widgetbox)
13 | 14 | 8008 | carbon 15 | :-------------------------:|:-------------------------: 16 | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/profile?username=Jurredr&data=followers,repositories,stars,commits&theme=8008)](https://github.com/Jurredr/github-widgetbox) | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/profile?username=Jurredr&data=followers,repositories,stars,commits&theme=carbon)](https://github.com/Jurredr/github-widgetbox)
17 | 18 | our_theme | cheesecake 19 | :-------------------------:|:-------------------------: 20 | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/profile?username=Jurredr&data=followers,repositories,stars,commits&theme=our_theme)](https://github.com/Jurredr/github-widgetbox) | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/profile?username=Jurredr&data=followers,repositories,stars,commits&theme=cheesecake)](https://github.com/Jurredr/github-widgetbox)
21 | 22 | nautilus | serika 23 | :-------------------------:|:-------------------------: 24 | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/profile?username=Jurredr&data=followers,repositories,stars,commits&theme=nautilus)](https://github.com/Jurredr/github-widgetbox) | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/profile?username=Jurredr&data=followers,repositories,stars,commits&theme=serika)](https://github.com/Jurredr/github-widgetbox)
25 | 26 | serika_dark | bushido 27 | :-------------------------:|:-------------------------: 28 | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/profile?username=Jurredr&data=followers,repositories,stars,commits&theme=serika_dark)](https://github.com/Jurredr/github-widgetbox) | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/profile?username=Jurredr&data=followers,repositories,stars,commits&theme=bushido)](https://github.com/Jurredr/github-widgetbox)
29 | 30 | red_samurai | rgb 31 | :-------------------------:|:-------------------------: 32 | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/profile?username=Jurredr&data=followers,repositories,stars,commits&theme=red_samurai)](https://github.com/Jurredr/github-widgetbox) | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/profile?username=Jurredr&data=followers,repositories,stars,commits&theme=rgb)](https://github.com/Jurredr/github-widgetbox)
33 | 34 | oblivion | magic_girl 35 | :-------------------------:|:-------------------------: 36 | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/profile?username=Jurredr&data=followers,repositories,stars,commits&theme=oblivion)](https://github.com/Jurredr/github-widgetbox) | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/profile?username=Jurredr&data=followers,repositories,stars,commits&theme=magic_girl)](https://github.com/Jurredr/github-widgetbox)
37 | 38 | metropolis | mountain 39 | :-------------------------:|:-------------------------: 40 | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/profile?username=Jurredr&data=followers,repositories,stars,commits&theme=metropolis)](https://github.com/Jurredr/github-widgetbox) | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/profile?username=Jurredr&data=followers,repositories,stars,commits&theme=mountain)](https://github.com/Jurredr/github-widgetbox)
41 | 42 | laser | retro 43 | :-------------------------:|:-------------------------: 44 | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/profile?username=Jurredr&data=followers,repositories,stars,commits&theme=laser)](https://github.com/Jurredr/github-widgetbox) | [![GitHub WidgetBox](https://github-widgetbox.vercel.app/api/profile?username=Jurredr&data=followers,repositories,stars,commits&theme=retro)](https://github.com/Jurredr/github-widgetbox)
45 | -------------------------------------------------------------------------------- /api/index.ts: -------------------------------------------------------------------------------- 1 | require('dotenv').config() 2 | 3 | import { Request, Response } from 'express' 4 | import errorWidget from '../src/widgets/error' 5 | import routes from './routes' 6 | 7 | // Setup express 8 | import express from 'express' 9 | const app = express() 10 | 11 | // Use routing on the /api prefix 12 | app.use('/api', routes) 13 | 14 | // Send error widget for incorrect request URL 15 | app.use('*', (req: Request, res: Response) => { 16 | res.setHeader('Content-Type', 'image/svg+xml') 17 | res.send(errorWidget('Unknown', '-28%', 'Invalid API URL!', '-19%')) 18 | }) 19 | 20 | // Start listening on defined port 21 | app.listen(process.env.PORT, () => { 22 | console.log( 23 | `Github-WidgetBox listening at http://localhost:${process.env.PORT}` 24 | ) 25 | }) 26 | -------------------------------------------------------------------------------- /api/routes.ts: -------------------------------------------------------------------------------- 1 | import express from 'express' 2 | const router = express.Router() 3 | 4 | import skillsRoute from './routes/skills-route' 5 | import profileRoute from './routes/profile-route' 6 | 7 | // Skills widget 8 | router.use('/skills', skillsRoute) 9 | 10 | // Profile widget 11 | router.use('/profile', profileRoute) 12 | 13 | export default router 14 | -------------------------------------------------------------------------------- /api/routes/profile-route.ts: -------------------------------------------------------------------------------- 1 | import { Request, Response } from 'express' 2 | 3 | import express from 'express' 4 | const router = express.Router() 5 | 6 | import profileWidget from '../../src/widgets/profile' 7 | import errorWidget from '../../src/widgets/error' 8 | const githubUsernameRegex = require("github-username-regex") 9 | 10 | // Primary profile route 11 | router.get('/', function (req: Request, res: Response) { 12 | const { username, data, theme } = req.query 13 | 14 | // Set the header's type to svg/xml 15 | res.setHeader('Content-Type', 'image/svg+xml') 16 | 17 | // Check if username argument is not present 18 | if (username === undefined || username === null) { 19 | res.send( 20 | errorWidget('Profile', '-25%', 'Username is undefined!', '-26%') 21 | ) 22 | return 23 | } 24 | 25 | // Check validity based on GitHub's username rules 26 | if (!githubUsernameRegex.test(username)) { 27 | res.send( 28 | errorWidget('Profile', '-25%', 'Username is invalid!', '-22%') 29 | ) 30 | return 31 | } 32 | 33 | // Check if data argument is not present 34 | if (data === undefined || data === null) { 35 | res.send( 36 | errorWidget('Profile', '-25%', 'Data option is missing!', '-25%') 37 | ) 38 | return 39 | } 40 | 41 | // Grab the Profile widget 42 | profileWidget(String(username), String(data), String(theme)).then((response) => { 43 | if (response === undefined || response === null) { 44 | res.send( 45 | errorWidget('Profile', '-25%', 'GitHub API-call error!', '-24%') 46 | ) 47 | } else { 48 | res.send(response) 49 | } 50 | }) 51 | }) 52 | 53 | export default router 54 | -------------------------------------------------------------------------------- /api/routes/skills-route.ts: -------------------------------------------------------------------------------- 1 | import { Request, Response } from 'express' 2 | 3 | import express from 'express' 4 | const router = express.Router() 5 | 6 | import skillsWidget from '../../src/widgets/skills' 7 | import { getBoolean, getTheme } from '../../src/utils' 8 | import errorWidget from '../../src/widgets/error' 9 | /** 10 | * Primary skill path. 11 | * 12 | * This path is for the primary skill screen. It has the following possible queries 13 | * @param languages the list of languages to show. 14 | * @param frameworks the list of frameworks to show. 15 | * @param libraries the list of libraries to show. 16 | * @param tools the list of tools to show. 17 | * @param software the list of software to show 18 | * @param includeNames the option if it has to include names. 19 | * @param theme the theme of the widget. 20 | * @param names @deprecated the full list of all skills it needs to show. deprecated from version 1.1.0 onwards. 21 | */ 22 | router.get('/', function (req: Request, res: Response) { 23 | const { names, languages, frameworks, libraries, tools, software, includeNames, theme} = req.query 24 | 25 | // Set the header's type to svg/xml 26 | res.setHeader('Content-Type', 'image/svg+xml') 27 | 28 | // Check if languages argument is not present 29 | if (!languages && !frameworks && !libraries && !names && !tools && !software 30 | ) { 31 | res.send( 32 | errorWidget('Skills', '-24%', 'Languages are undefined!', '-28%') 33 | ) 34 | return 35 | } 36 | 37 | if (names) { 38 | res.send(skillsWidget(String(names), undefined, undefined, undefined, undefined, getBoolean(String(includeNames)), String(theme))) 39 | } else { 40 | res.send(skillsWidget(String(languages), String(frameworks), String(libraries), String(tools), String(software), getBoolean(String(includeNames)), String(theme))) 41 | } 42 | 43 | // Grab the Skills widget 44 | }) 45 | 46 | export default router 47 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "github-widgetbox", 3 | "version": "1.0.0", 4 | "description": "[✨] Beautiful, dynamic widgets for GitHub Readme pages. (Statistics, Languages, etc.)", 5 | "main": "public/api/index.js", 6 | "scripts": { 7 | "dev": "nodemon api/index.ts", 8 | "build": "rm -rf ./public && tsc", 9 | "start": "npm run build && node public/api/index.js" 10 | }, 11 | "repository": { 12 | "type": "git", 13 | "url": "https://github.com/Jurredr/github-widgetbox/" 14 | }, 15 | "keywords": [ 16 | "GitHub", 17 | "Readme", 18 | "Widget", 19 | "Utility", 20 | "Skills", 21 | "Languages", 22 | "Statistics" 23 | ], 24 | "author": "Jurredr", 25 | "license": "MIT", 26 | "devDependencies": { 27 | "@babel/core": "^7.14.3", 28 | "@babel/eslint-parser": "^7.14.4", 29 | "@types/express": "^4.17.12", 30 | "@types/node": "^15.12.1", 31 | "@types/node-fetch": "^2.5.10", 32 | "@typescript-eslint/eslint-plugin": "^4.26.0", 33 | "@typescript-eslint/parser": "^4.26.0", 34 | "babel-jest": "^27.0.2", 35 | "eslint": "^7.28.0", 36 | "eslint-config-prettier": "^8.3.0", 37 | "eslint-plugin-prettier": "^3.4.0", 38 | "jest": "^27.0.4", 39 | "nodemon": "^2.0.7", 40 | "prettier": "^2.3.1", 41 | "sass": "^1.34.1", 42 | "sass-loader": "^12.0.0", 43 | "ts-jest": "^27.0.2", 44 | "ts-node": "^10.0.0", 45 | "typescript": "^4.3.2", 46 | "webpack": "^5.38.1" 47 | }, 48 | "dependencies": { 49 | "axios": "^0.21.1", 50 | "dotenv": "^10.0.0", 51 | "express": "^4.17.1", 52 | "github-username-regex": "^1.0.0", 53 | "node-fetch": "^2.6.1" 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /public/api/index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | require('dotenv').config(); 7 | const error_1 = __importDefault(require("../src/widgets/error")); 8 | const routes_1 = __importDefault(require("./routes")); 9 | // Setup express 10 | const express_1 = __importDefault(require("express")); 11 | const app = express_1.default(); 12 | // Use routing on the /api prefix 13 | app.use('/api', routes_1.default); 14 | // Send error widget for incorrect request URL 15 | app.use('*', (req, res) => { 16 | res.setHeader('Content-Type', 'image/svg+xml'); 17 | res.send(error_1.default('Unknown', '-28%', 'Invalid API URL!', '-19%')); 18 | }); 19 | // Start listening on defined port 20 | app.listen(process.env.PORT, () => { 21 | console.log(`Github-WidgetBox listening at http://localhost:${process.env.PORT}`); 22 | }); 23 | //# sourceMappingURL=index.js.map -------------------------------------------------------------------------------- /public/api/index.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"index.js","sourceRoot":"","sources":["../../api/index.ts"],"names":[],"mappings":";;;;;AAAA,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAA;AAG1B,iEAA8C;AAC9C,sDAA6B;AAE7B,gBAAgB;AAChB,sDAA6B;AAC7B,MAAM,GAAG,GAAG,iBAAO,EAAE,CAAA;AAErB,iCAAiC;AACjC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,gBAAM,CAAC,CAAA;AAEvB,8CAA8C;AAC9C,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;IACzC,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,eAAe,CAAC,CAAA;IAC9C,GAAG,CAAC,IAAI,CAAC,eAAW,CAAC,SAAS,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,CAAC,CAAC,CAAA;AACxE,CAAC,CAAC,CAAA;AAEF,kCAAkC;AAClC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE;IAC9B,OAAO,CAAC,GAAG,CACP,kDAAkD,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CACvE,CAAA;AACL,CAAC,CAAC,CAAA"} -------------------------------------------------------------------------------- /public/api/routes.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | const express_1 = __importDefault(require("express")); 7 | const router = express_1.default.Router(); 8 | const skills_route_1 = __importDefault(require("./routes/skills-route")); 9 | const profile_route_1 = __importDefault(require("./routes/profile-route")); 10 | // Skills widget 11 | router.use('/skills', skills_route_1.default); 12 | // Profile widget 13 | router.use('/profile', profile_route_1.default); 14 | exports.default = router; 15 | //# sourceMappingURL=routes.js.map -------------------------------------------------------------------------------- /public/api/routes.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../api/routes.ts"],"names":[],"mappings":";;;;;AAAA,sDAA6B;AAC7B,MAAM,MAAM,GAAG,iBAAO,CAAC,MAAM,EAAE,CAAA;AAE/B,yEAA+C;AAC/C,2EAAiD;AAEjD,gBAAgB;AAChB,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,sBAAW,CAAC,CAAA;AAElC,iBAAiB;AACjB,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,uBAAY,CAAC,CAAA;AAEpC,kBAAe,MAAM,CAAA"} -------------------------------------------------------------------------------- /public/api/routes/profile-route.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | const express_1 = __importDefault(require("express")); 7 | const router = express_1.default.Router(); 8 | const profile_1 = __importDefault(require("../../src/widgets/profile")); 9 | const error_1 = __importDefault(require("../../src/widgets/error")); 10 | const githubUsernameRegex = require("github-username-regex"); 11 | // Primary profile route 12 | router.get('/', function (req, res) { 13 | const { username, data, theme } = req.query; 14 | // Set the header's type to svg/xml 15 | res.setHeader('Content-Type', 'image/svg+xml'); 16 | // Check if username argument is not present 17 | if (username === undefined || username === null) { 18 | res.send(error_1.default('Profile', '-25%', 'Username is undefined!', '-26%')); 19 | return; 20 | } 21 | // Check validity based on GitHub's username rules 22 | if (!githubUsernameRegex.test(username)) { 23 | res.send(error_1.default('Profile', '-25%', 'Username is invalid!', '-22%')); 24 | return; 25 | } 26 | // Check if data argument is not present 27 | if (data === undefined || data === null) { 28 | res.send(error_1.default('Profile', '-25%', 'Data option is missing!', '-25%')); 29 | return; 30 | } 31 | // Grab the Profile widget 32 | profile_1.default(String(username), String(data), String(theme)).then((response) => { 33 | if (response === undefined || response === null) { 34 | res.send(error_1.default('Profile', '-25%', 'GitHub API-call error!', '-24%')); 35 | } 36 | else { 37 | res.send(response); 38 | } 39 | }); 40 | }); 41 | exports.default = router; 42 | //# sourceMappingURL=profile-route.js.map -------------------------------------------------------------------------------- /public/api/routes/profile-route.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"profile-route.js","sourceRoot":"","sources":["../../../api/routes/profile-route.ts"],"names":[],"mappings":";;;;;AAEA,sDAA6B;AAC7B,MAAM,MAAM,GAAG,iBAAO,CAAC,MAAM,EAAE,CAAA;AAE/B,wEAAqD;AACrD,oEAAiD;AACjD,MAAM,mBAAmB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAA;AAE5D,wBAAwB;AACxB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,GAAY,EAAE,GAAa;IACjD,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,KAAK,CAAA;IAE3C,mCAAmC;IACnC,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,eAAe,CAAC,CAAA;IAE9C,4CAA4C;IAC5C,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI,EAAE;QAC7C,GAAG,CAAC,IAAI,CACJ,eAAW,CAAC,SAAS,EAAE,MAAM,EAAE,wBAAwB,EAAE,MAAM,CAAC,CACnE,CAAA;QACD,OAAM;KACT;IAED,kDAAkD;IAClD,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;QACrC,GAAG,CAAC,IAAI,CACJ,eAAW,CAAC,SAAS,EAAE,MAAM,EAAE,sBAAsB,EAAE,MAAM,CAAC,CACjE,CAAA;QACD,OAAM;KACT;IAED,wCAAwC;IACxC,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI,EAAE;QACrC,GAAG,CAAC,IAAI,CACJ,eAAW,CAAC,SAAS,EAAE,MAAM,EAAE,yBAAyB,EAAE,MAAM,CAAC,CACpE,CAAA;QACD,OAAM;KACT;IAED,0BAA0B;IAC1B,iBAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;QAC3E,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI,EAAE;YAC7C,GAAG,CAAC,IAAI,CACJ,eAAW,CAAC,SAAS,EAAE,MAAM,EAAE,wBAAwB,EAAE,MAAM,CAAC,CACnE,CAAA;SACJ;aAAM;YACH,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;SACrB;IACL,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA;AAEF,kBAAe,MAAM,CAAA"} -------------------------------------------------------------------------------- /public/api/routes/skills-route.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | const express_1 = __importDefault(require("express")); 7 | const router = express_1.default.Router(); 8 | const skills_1 = __importDefault(require("../../src/widgets/skills")); 9 | const utils_1 = require("../../src/utils"); 10 | const error_1 = __importDefault(require("../../src/widgets/error")); 11 | /** 12 | * Primary skill path. 13 | * 14 | * This path is for the primary skill screen. It has the following possible queries 15 | * @param languages the list of languages to show. 16 | * @param frameworks the list of frameworks to show. 17 | * @param libraries the list of libraries to show. 18 | * @param tools the list of tools to show. 19 | * @param software the list of software to show 20 | * @param includeNames the option if it has to include names. 21 | * @param theme the theme of the widget. 22 | * @param names @deprecated the full list of all skills it needs to show. deprecated from version 1.1.0 onwards. 23 | */ 24 | router.get('/', function (req, res) { 25 | const { names, languages, frameworks, libraries, tools, software, includeNames, theme } = req.query; 26 | // Set the header's type to svg/xml 27 | res.setHeader('Content-Type', 'image/svg+xml'); 28 | // Check if languages argument is not present 29 | if (!languages && !frameworks && !libraries && !names && !tools && !software) { 30 | res.send(error_1.default('Skills', '-24%', 'Languages are undefined!', '-28%')); 31 | return; 32 | } 33 | if (names) { 34 | res.send(skills_1.default(String(names), undefined, undefined, undefined, undefined, utils_1.getBoolean(String(includeNames)), String(theme))); 35 | } 36 | else { 37 | res.send(skills_1.default(String(languages), String(frameworks), String(libraries), String(tools), String(software), utils_1.getBoolean(String(includeNames)), String(theme))); 38 | } 39 | // Grab the Skills widget 40 | }); 41 | exports.default = router; 42 | //# sourceMappingURL=skills-route.js.map -------------------------------------------------------------------------------- /public/api/routes/skills-route.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"skills-route.js","sourceRoot":"","sources":["../../../api/routes/skills-route.ts"],"names":[],"mappings":";;;;;AAEA,sDAA6B;AAC7B,MAAM,MAAM,GAAG,iBAAO,CAAC,MAAM,EAAE,CAAA;AAE/B,sEAAmD;AACnD,2CAAsD;AACtD,oEAAiD;AACjD;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,GAAY,EAAE,GAAa;IACjD,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAC,GAAG,GAAG,CAAC,KAAK,CAAA;IAElG,mCAAmC;IACnC,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,eAAe,CAAC,CAAA;IAE9C,6CAA6C;IAC7C,IAAI,CAAC,SAAS,IAAI,CAAC,UAAU,IAAI,CAAC,SAAS,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,EAC1E;QACE,GAAG,CAAC,IAAI,CACJ,eAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,0BAA0B,EAAE,MAAM,CAAC,CACpE,CAAA;QACD,OAAM;KACT;IAED,IAAI,KAAK,EAAE;QACP,GAAG,CAAC,IAAI,CAAC,gBAAY,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,kBAAU,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;KACrI;SAAM;QACH,GAAG,CAAC,IAAI,CAAC,gBAAY,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,kBAAU,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;KACrK;IAED,yBAAyB;AAC7B,CAAC,CAAC,CAAA;AAEF,kBAAe,MAAM,CAAA"} -------------------------------------------------------------------------------- /public/src/components/card.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | function buildCard(width, height, bg) { 4 | return ` 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | `; 16 | } 17 | exports.default = buildCard; 18 | //# sourceMappingURL=card.js.map -------------------------------------------------------------------------------- /public/src/components/card.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"card.js","sourceRoot":"","sources":["../../../src/components/card.ts"],"names":[],"mappings":";;AAAA,SAAwB,SAAS,CAC7B,KAAa,EACb,MAAc,EACd,EAAU;IAEV,OAAO;uDAC4C,KAAK,aAAa,MAAM;;;;;;;;;0DASrB,KAAK,GAAC,EAAE,aAAa,MAAM,GAAC,EAAE,gDAAgD,EAAE;iBACzH,CAAA;AACjB,CAAC;AAjBD,4BAiBC"} -------------------------------------------------------------------------------- /public/src/components/gradient-box.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | /** 4 | * Creates a gradient box. 5 | * 6 | * This method creates a box that has a gradient colour. The box contains the 7 | * logo of the framework, language, library, tool or IDE. 8 | * 9 | * It is important that the ID is not shared in the SVG between other gradient boxes 10 | * because if they share an ID they will use the same colour. 11 | * 12 | * @param id The id of the gradient box 13 | * @param fromColor The starting color in hexcode 14 | * @param toColor The final color of the gradient in hexcode 15 | * @param transX The x coordinate of the box 16 | * @param transY The y coordinate of the box 17 | * @returns A gradient box 18 | */ 19 | function buildGradientBox(id, fromColor, toColor, transX, transY) { 20 | return ` 21 | 22 | 23 | 24 | 25 | 26 | 27 | `; 28 | } 29 | exports.default = buildGradientBox; 30 | //# sourceMappingURL=gradient-box.js.map -------------------------------------------------------------------------------- /public/src/components/gradient-box.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"gradient-box.js","sourceRoot":"","sources":["../../../src/components/gradient-box.ts"],"names":[],"mappings":";;AAAA;;;;;;;;;;;;;;;GAeG;AACH,SAAwB,gBAAgB,CACpC,EAAU,EACV,SAAiB,EACjB,OAAe,EACf,MAAc,EACd,MAAc;IAEd,OAAO;qDAC0C,EAAE;mDACJ,SAAS;mDACT,OAAO;;;oCAGtB,EAAE,0BAA0B,MAAM,IAAI,MAAM,6BAA6B,EAAE,8DAA8D,EAAE;CAC9K,CAAA;AACD,CAAC;AAfD,mCAeC"} -------------------------------------------------------------------------------- /public/src/data/frameworks.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"frameworks.js","sourceRoot":"","sources":["../../../src/data/frameworks.ts"],"names":[],"mappings":"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"} -------------------------------------------------------------------------------- /public/src/data/languages.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"languages.js","sourceRoot":"","sources":["../../../src/data/languages.ts"],"names":[],"mappings":"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"} -------------------------------------------------------------------------------- /public/src/data/libraries.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | const libraries = [ 4 | { 5 | name: ['Babel', 'BabelJS'], 6 | colorFrom: '#FFF1AB', 7 | colorTo: '#FFD100', 8 | icon: ` 9 | 10 | 11 | `, 12 | width: 45.287, 13 | height: 17.427, 14 | xOffset: 0, 15 | }, 16 | { 17 | name: ['P5', 'P5js'], 18 | colorFrom: '#FFC7D6', 19 | colorTo: '#EE1F5E', 20 | icon: ` 21 | 22 | 23 | `, 24 | width: 36, 25 | height: 16.64, 26 | xOffset: 0, 27 | }, 28 | { 29 | name: ['Tensorflow'], 30 | colorFrom: '#FFCA57', 31 | colorTo: '#F06335', 32 | icon: ` 33 | 34 | 35 | `, 36 | width: 36, 37 | height: 40.287, 38 | xOffset: 0, 39 | }, 40 | { 41 | name: ['jQuery'], 42 | colorFrom: '#91DDEB', 43 | colorTo: '#0A67AC', 44 | icon: ` 45 | 46 | 47 | `, 48 | width: 35.955, 49 | height: 34.631, 50 | xOffset: 0, 51 | }, 52 | ]; 53 | exports.default = libraries; 54 | //# sourceMappingURL=libraries.js.map -------------------------------------------------------------------------------- /public/src/data/libraries.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"libraries.js","sourceRoot":"","sources":["../../../src/data/libraries.ts"],"names":[],"mappings":";;AAEA,MAAM,SAAS,GAAe;IAC1B;QACI,IAAI,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC;QAC1B,SAAS,EAAE,SAAS;QACpB,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE;;;SAGL;QACD,KAAK,EAAE,MAAM;QACb,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,CAAC;KACb;IACD;QACI,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,SAAS;QACpB,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE;;;SAGL;QACD,KAAK,EAAE,EAAE;QACT,MAAM,EAAE,KAAK;QACb,OAAO,EAAE,CAAC;KACb;IACD;QACI,IAAI,EAAE,CAAC,YAAY,CAAC;QACpB,SAAS,EAAE,SAAS;QACpB,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE;;;SAGL;QACD,KAAK,EAAE,EAAE;QACT,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,CAAC;KACb;IACD;QACI,IAAI,EAAE,CAAC,QAAQ,CAAC;QAChB,SAAS,EAAE,SAAS;QACpB,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE;;;SAGL;QACD,KAAK,EAAE,MAAM;QACb,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,CAAC;KACb;CACJ,CAAA;AAED,kBAAe,SAAS,CAAA"} -------------------------------------------------------------------------------- /public/src/data/software-ides.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | const softwareIDEs = [ 4 | { 5 | name: ['Linux', 'Tux'], 6 | colorFrom: '#FFF1AB', 7 | colorTo: '#FFD100', 8 | icon: ` 9 | 10 | 11 | `, 12 | width: 30.857, 13 | height: 36, 14 | xOffset: 0, 15 | }, 16 | { 17 | name: ['Windows'], 18 | colorFrom: '#0067b8', 19 | colorTo: '#006cac', 20 | icon: ` 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | `, 30 | width: 30.857, 31 | height: 36, 32 | xOffset: -2, 33 | }, 34 | { 35 | name: ['VSCode'], 36 | colorFrom: '#1F9CF0', 37 | colorTo: '#0065A9', 38 | icon: ` 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | `, 96 | width: 35.995, 97 | height: 25.89, 98 | xOffset: 0, 99 | }, 100 | ]; 101 | exports.default = softwareIDEs; 102 | //# sourceMappingURL=software-ides.js.map -------------------------------------------------------------------------------- /public/src/data/software-ides.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"software-ides.js","sourceRoot":"","sources":["../../../src/data/software-ides.ts"],"names":[],"mappings":";;AAEA,MAAM,YAAY,GAAe;IAC7B;QACI,IAAI,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC;QACtB,SAAS,EAAE,SAAS;QACpB,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE;;;SAGL;QACD,KAAK,EAAE,MAAM;QACb,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,CAAC;KACb;IACD;QACI,IAAI,EAAE,CAAC,SAAS,CAAC;QACjB,SAAS,EAAE,SAAS;QACpB,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE;;;;;;;;;SASL;QACD,KAAK,EAAE,MAAM;QACb,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,CAAC,CAAC;KACd;IAED;QACI,IAAI,EAAE,CAAC,QAAQ,CAAC;QAChB,SAAS,EAAE,SAAS;QACpB,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAyDL;QACD,KAAK,EAAE,MAAM;QACb,MAAM,EAAE,KAAK;QACb,OAAO,EAAE,CAAC;KACb;CACJ,CAAA;AAED,kBAAe,YAAY,CAAA"} -------------------------------------------------------------------------------- /public/src/data/themes.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"themes.js","sourceRoot":"","sources":["../../../src/data/themes.ts"],"names":[],"mappings":"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"} -------------------------------------------------------------------------------- /public/src/data/tools.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/data/tools.ts"],"names":[],"mappings":"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"} -------------------------------------------------------------------------------- /public/src/fetchers/user-stats-fetcher.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | const node_fetch_1 = __importDefault(require("node-fetch")); 7 | async function getGithubUserStats(token, username) { 8 | const headers = { 9 | Authorization: `bearer ${token}`, 10 | }; 11 | const body = { 12 | query: ` 13 | query { 14 | user(login: "${username}") { 15 | name 16 | login 17 | contributionsCollection { 18 | totalCommitContributions 19 | restrictedContributionsCount 20 | contributionCalendar { 21 | totalContributions 22 | } 23 | } 24 | repositoriesContributedTo(first: 1, contributionTypes: [COMMIT, ISSUE, PULL_REQUEST, REPOSITORY]) { 25 | totalCount 26 | } 27 | followers { 28 | totalCount 29 | } 30 | repositories(first: 100, ownerAffiliations: OWNER, orderBy: {direction: DESC, field: STARGAZERS}) { 31 | totalCount 32 | nodes { 33 | stargazers { 34 | totalCount 35 | } 36 | } 37 | } 38 | } 39 | } 40 | `, 41 | }; 42 | const response = await node_fetch_1.default('https://api.github.com/graphql', { 43 | method: 'POST', 44 | body: JSON.stringify(body), 45 | headers: headers, 46 | }); 47 | return await response.json(); 48 | } 49 | exports.default = getGithubUserStats; 50 | //# sourceMappingURL=user-stats-fetcher.js.map -------------------------------------------------------------------------------- /public/src/fetchers/user-stats-fetcher.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"user-stats-fetcher.js","sourceRoot":"","sources":["../../../src/fetchers/user-stats-fetcher.ts"],"names":[],"mappings":";;;;;AAAA,4DAA8B;AAGf,KAAK,UAAU,kBAAkB,CAC5C,KAAyB,EACzB,QAAgB;IAGhB,MAAM,OAAO,GAAG;QACZ,aAAa,EAAE,UAAU,KAAK,EAAE;KACnC,CAAA;IAED,MAAM,IAAI,GAAG;QACT,KAAK,EAAE;;2BAEY,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;WA0BxB;KACN,CAAA;IAED,MAAM,QAAQ,GAAG,MAAM,oBAAK,CAAC,gCAAgC,EAAE;QAC3D,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;QAC1B,OAAO,EAAE,OAAO;KACnB,CAAC,CAAA;IAEF,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;AAChC,CAAC;AAhDD,qCAgDC"} -------------------------------------------------------------------------------- /public/src/interfaces/Contributions.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | //# sourceMappingURL=Contributions.js.map -------------------------------------------------------------------------------- /public/src/interfaces/Contributions.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"Contributions.js","sourceRoot":"","sources":["../../../src/interfaces/Contributions.ts"],"names":[],"mappings":""} -------------------------------------------------------------------------------- /public/src/interfaces/GithubUser.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | //# sourceMappingURL=GithubUser.js.map -------------------------------------------------------------------------------- /public/src/interfaces/GithubUser.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"GithubUser.js","sourceRoot":"","sources":["../../../src/interfaces/GithubUser.ts"],"names":[],"mappings":""} -------------------------------------------------------------------------------- /public/src/interfaces/IconData.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | //# sourceMappingURL=IconData.js.map -------------------------------------------------------------------------------- /public/src/interfaces/IconData.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"IconData.js","sourceRoot":"","sources":["../../../src/interfaces/IconData.ts"],"names":[],"mappings":""} -------------------------------------------------------------------------------- /public/src/interfaces/Repositories.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | //# sourceMappingURL=Repositories.js.map -------------------------------------------------------------------------------- /public/src/interfaces/Repositories.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"Repositories.js","sourceRoot":"","sources":["../../../src/interfaces/Repositories.ts"],"names":[],"mappings":""} -------------------------------------------------------------------------------- /public/src/interfaces/Theme.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | //# sourceMappingURL=Theme.js.map -------------------------------------------------------------------------------- /public/src/interfaces/Theme.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"Theme.js","sourceRoot":"","sources":["../../../src/interfaces/Theme.ts"],"names":[],"mappings":""} -------------------------------------------------------------------------------- /public/src/utils.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | exports.getTheme = exports.findData = exports.requestInBase64 = exports.getBoolean = exports.isValidHexColor = void 0; 7 | const axios_1 = __importDefault(require("axios")); 8 | function isValidHexColor(hexColor) { 9 | return new RegExp(/^([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{4})$/).test(hexColor); 10 | } 11 | exports.isValidHexColor = isValidHexColor; 12 | function getBoolean(str) { 13 | return str.toLowerCase() === 'true'; 14 | } 15 | exports.getBoolean = getBoolean; 16 | async function requestInBase64(url) { 17 | const response = await axios_1.default.get(url, { 18 | responseType: 'arraybuffer', 19 | }); 20 | return Buffer.from(response.data, 'binary').toString('base64'); 21 | } 22 | exports.requestInBase64 = requestInBase64; 23 | function findData(data, name) { 24 | return data.filter(function (data) { 25 | return data.name 26 | .map((data) => data.toUpperCase()) 27 | .includes(name.toUpperCase()); 28 | })[0]; 29 | } 30 | exports.findData = findData; 31 | function getTheme(themes, themeName) { 32 | return themes.filter(function (themes) { 33 | return themes.name 34 | .map((theme) => theme.toUpperCase()) 35 | .includes(themeName.toUpperCase()); 36 | })[0]; 37 | } 38 | exports.getTheme = getTheme; 39 | //# sourceMappingURL=utils.js.map -------------------------------------------------------------------------------- /public/src/utils.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":";;;;;;AAAA,kDAAyB;AAIzB,SAAgB,eAAe,CAAC,QAAgB;IAC5C,OAAO,IAAI,MAAM,CACb,iEAAiE,CACpE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;AACpB,CAAC;AAJD,0CAIC;AAED,SAAgB,UAAU,CAAC,GAAW;IAClC,OAAO,GAAG,CAAC,WAAW,EAAE,KAAK,MAAM,CAAA;AACvC,CAAC;AAFD,gCAEC;AAEM,KAAK,UAAU,eAAe,CAAC,GAAW;IAC7C,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,GAAG,CAAC,GAAG,EAAE;QAClC,YAAY,EAAE,aAAa;KAC9B,CAAC,CAAA;IACF,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;AAClE,CAAC;AALD,0CAKC;AAED,SAAgB,QAAQ,CAAC,IAAgB,EAAE,IAAY;IACnD,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI;QAC7B,OAAO,IAAI,CAAC,IAAI;aACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;aACjC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;IACrC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AACT,CAAC;AAND,4BAMC;AAED,SAAgB,QAAQ,CAAC,MAAe,EAAE,SAAiB;IACvD,OAAO,MAAM,CAAC,MAAM,CAAC,UAAU,MAAM;QACjC,OAAO,MAAM,CAAC,IAAI;aACb,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;aACnC,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAA;IAC1C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AACT,CAAC;AAND,4BAMC"} -------------------------------------------------------------------------------- /public/src/widgets/error.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | function errorWidget(widgetName, nameX, reason, reasonX) { 4 | return ` 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | Error… Oops! 31 | 32 | 34 | There was an error trying to 35 | load the 36 | ${widgetName} 37 | widget. 38 | 39 | 40 | ${reason} 41 | 42 | 43 | 44 | `; 45 | } 46 | exports.default = errorWidget; 47 | //# sourceMappingURL=error.js.map -------------------------------------------------------------------------------- /public/src/widgets/error.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"error.js","sourceRoot":"","sources":["../../../src/widgets/error.ts"],"names":[],"mappings":";;AAAA,SAAwB,WAAW,CAC/B,UAAkB,EAClB,KAAa,EACb,MAAc,EACd,OAAe;IAEf,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBA+Ba,KAAK;4FAC+D,UAAU;;;;wBAI9E,OAAO,WAAW,MAAM;;;;WAIrC,CAAA;AACX,CAAC;AA/CD,8BA+CC"} -------------------------------------------------------------------------------- /public/src/widgets/profile.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | require('dotenv').config(); 7 | const axios_1 = __importDefault(require("axios")); 8 | const utils_1 = require("../utils"); 9 | const error_1 = __importDefault(require("./error")); 10 | const card_1 = __importDefault(require("../components/card")); 11 | const user_stats_fetcher_1 = __importDefault(require("../fetchers/user-stats-fetcher")); 12 | const themes_1 = __importDefault(require("../data/themes")); 13 | async function profileWidget(username, data, themeString) { 14 | // Set the theme 15 | let theme = utils_1.getTheme(themes_1.default, 'default'); 16 | if (themeString) { 17 | theme = utils_1.getTheme(themes_1.default, themeString); 18 | } 19 | if (!theme) { 20 | theme = utils_1.getTheme(themes_1.default, 'default'); 21 | } 22 | const dataOptions = data.split(','); 23 | // Return error if dataOptions argument is undefined 24 | if (dataOptions === undefined) { 25 | return new Promise((res) => { 26 | res(error_1.default('Profile', '-25%', 'Data option is missing!', '-25%')); 27 | }); 28 | } 29 | // Return error if more than 4 dataOptions were supplied 30 | if (dataOptions.length > 4) { 31 | return new Promise((res) => { 32 | res(error_1.default('Profile', '-25%', `Can't have more than 4 data-options!`, '-40%')); 33 | }); 34 | } 35 | const width = 842; 36 | const height = 165; 37 | async function getDataOptions() { 38 | let dataBoxes = ''; 39 | const profile = await user_stats_fetcher_1.default(process.env.GITHUB_TOKEN, username); 40 | const stargazers = []; 41 | profile.data.user.repositories.nodes.forEach((repo, index) => { 42 | stargazers[index] = repo.stargazers.totalCount; 43 | }); 44 | for (let i = 0; i < dataOptions.length; i++) { 45 | switch (dataOptions[i].toLowerCase()) { 46 | case 'followers': 47 | addDataBox('followers', i, profile.data.user.followers.totalCount, '#CAF0FF', '#00C6FF', 'M3.625,9.5A2.417,2.417,0,1,0,1.208,7.084,2.419,2.419,0,0,0,3.625,9.5Zm16.919,0a2.417,2.417,0,1,0-2.417-2.417A2.419,2.419,0,0,0,20.544,9.5Zm1.208,1.208H19.336a2.41,2.41,0,0,0-1.7.7,5.524,5.524,0,0,1,2.836,4.132h2.493a1.207,1.207,0,0,0,1.208-1.208V13.126A2.419,2.419,0,0,0,21.753,10.709Zm-9.668,0a4.23,4.23,0,1,0-4.23-4.23A4.228,4.228,0,0,0,12.085,10.709Zm2.9,1.208h-.313a5.84,5.84,0,0,1-5.174,0H9.185a4.352,4.352,0,0,0-4.351,4.351v1.088a1.813,1.813,0,0,0,1.813,1.813H17.523a1.813,1.813,0,0,0,1.813-1.813V16.269A4.352,4.352,0,0,0,14.985,11.918Zm-8.448-.506a2.41,2.41,0,0,0-1.7-.7H2.417A2.419,2.419,0,0,0,0,13.126v1.208a1.207,1.207,0,0,0,1.208,1.208H3.7A5.538,5.538,0,0,1,6.537,11.412Z'); 48 | break; 49 | case 'repositories': 50 | addDataBox('repositories', i, profile.data.user.repositories.totalCount, '#FFCEE4', '#FF0774', 'M7.106,3A2.106,2.106,0,0,0,5,5.106V17.74a.7.7,0,0,0,.207.5,2.026,2.026,0,0,0,1.9,1.608h.7v-1.4h-.7a.7.7,0,0,1,0-1.4H17.634a1.4,1.4,0,0,0,1.4-1.4V4.4a1.4,1.4,0,0,0-1.4-1.4Zm.7,2.106h.7a.7.7,0,0,1,.7.7v.7a.7.7,0,0,1-.7.7h-.7a.7.7,0,0,1-.7-.7v-.7A.7.7,0,0,1,7.808,5.106Zm0,3.51h.7a.7.7,0,0,1,.7.7v.7a.7.7,0,0,1-.7.7h-.7a.7.7,0,0,1-.7-.7v-.7A.7.7,0,0,1,7.808,8.615Zm0,3.51h.7a.7.7,0,0,1,.7.7v.7a.7.7,0,0,1-.7.7h-.7a.7.7,0,0,1-.7-.7v-.7A.7.7,0,0,1,7.808,12.125Zm1.4,6.317v3.51l2.106-1.4,2.106,1.4v-3.51Zm5.615,0v1.4h3.51a.7.7,0,0,0,0-1.4Z'); 51 | break; 52 | case 'stars': 53 | addDataBox('stars', i, stargazers.reduce((a, b) => a + b, 0), '#FFEFCD', '#FFA100', 'M9.6.608,7.369,5.131l-4.992.728a1.094,1.094,0,0,0-.6,1.865l3.611,3.519L4.53,16.215a1.093,1.093,0,0,0,1.585,1.151l4.465-2.347,4.465,2.347a1.094,1.094,0,0,0,1.585-1.151l-.854-4.971,3.611-3.519a1.094,1.094,0,0,0-.6-1.865l-4.992-.728L11.561.608A1.094,1.094,0,0,0,9.6.608Z'); 54 | break; 55 | case 'contributions': 56 | case 'commits': 57 | addDataBox('contributions', i, profile.data.user.contributionsCollection 58 | .contributionCalendar.totalContributions, '#C5FFD9', '#00F14F', ` 59 | 60 | 61 | `); 62 | break; 63 | // Incorrect data item found 64 | default: 65 | return new Promise((res) => { 66 | res(error_1.default('Profile', '-25%', `Invalid data item found!`, '-26%')); 67 | }); 68 | } 69 | } 70 | // Add a box with a data counter 71 | function addDataBox(name, index, count, color1, color2, svg) { 72 | dataBoxes += ` 73 | 74 | 75 | ${count} 76 | 77 | ${name !== 'commits' && name !== 'contributions' 78 | ? `` 79 | : svg} 80 | `; 81 | } 82 | return dataBoxes; 83 | } 84 | try { 85 | const dataBoxes = await getDataOptions(); 86 | // If we receive a Promise, we return that 87 | if (typeof dataBoxes != 'string') { 88 | return dataBoxes; 89 | } 90 | // Create the request 91 | const response = await axios_1.default.get(`https://api.github.com/users/${username}`); 92 | // Grab the avatar 93 | const avatar = await utils_1.requestInBase64(response.data.avatar_url); 94 | return ` 95 | 96 | 97 | 98 | 99 | 100 | ${card_1.default(width, height, theme.background)} 101 | 102 | 103 | ${response.data.name === null 104 | ? response.data.login 105 | : response.data.name} 106 | GitHub.com/${response.data.login} 107 | 108 | ${dataBoxes} 109 | 110 | 111 | `; 112 | } 113 | catch (error) { 114 | return new Promise((res) => { 115 | res(error_1.default('Profile', '-25%', 'GitHub API-call error!', '-24%')); 116 | }); 117 | } 118 | } 119 | exports.default = profileWidget; 120 | //# sourceMappingURL=profile.js.map -------------------------------------------------------------------------------- /public/src/widgets/profile.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"profile.js","sourceRoot":"","sources":["../../../src/widgets/profile.ts"],"names":[],"mappings":"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"} -------------------------------------------------------------------------------- /public/src/widgets/skills.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | const card_1 = __importDefault(require("../components/card")); 7 | const gradient_box_1 = __importDefault(require("../components/gradient-box")); 8 | const utils_1 = require("../utils"); 9 | const languages_1 = __importDefault(require("../data/languages")); 10 | const frameworks_1 = __importDefault(require("../data/frameworks")); 11 | const libraries_1 = __importDefault(require("../data/libraries")); 12 | const tools_1 = __importDefault(require("../data/tools")); 13 | const software_ides_1 = __importDefault(require("../data/software-ides")); 14 | const themes_1 = __importDefault(require("../data/themes")); 15 | /** 16 | * Builds the skill widget page 17 | * 18 | * This method builds a SVG file that contains all the languages, frameworks, 19 | * libraries, tools and other software that can be found in the data folder and 20 | * are passed by the calling method. 21 | * 22 | * @param languagesString The string with all the languages 23 | * @param frameworksString The string with all the frameworks 24 | * @param librariesString The string with all the libraries 25 | * @param toolsString The string with all the tools 26 | * @param softwareString The string with all the software 27 | * @param includeNames The boolean that determines whether or not to include names 28 | * @returns The SVG with all the skills that were passed. 29 | */ 30 | function skillsWidget(languagesString, frameworksString, librariesString, toolsString, softwareString, includeNames, themeString) { 31 | const BASE_HEIGHT = 125; 32 | const BASE_WIDTH = 812; 33 | const FIRST_ROW = 90; 34 | const ROW = 114; 35 | const PAD = 60; 36 | if (!languagesString) { 37 | languagesString = 'undefined'; 38 | } 39 | if (!frameworksString) { 40 | frameworksString = 'undefined'; 41 | } 42 | if (!librariesString) { 43 | librariesString = 'undefined'; 44 | } 45 | if (!toolsString) { 46 | toolsString = 'undefined'; 47 | } 48 | if (!softwareString) { 49 | softwareString = 'undefined'; 50 | } 51 | // Set the theme 52 | let theme = utils_1.getTheme(themes_1.default, 'default'); 53 | if (themeString) { 54 | theme = utils_1.getTheme(themes_1.default, themeString); 55 | } 56 | if (!theme) { 57 | theme = utils_1.getTheme(themes_1.default, 'default'); 58 | } 59 | const languageList = languagesString.split(','); 60 | const frameworkList = frameworksString.split(','); 61 | const libraryList = librariesString.split(','); 62 | const toolsList = toolsString.split(','); 63 | const softwareList = softwareString.split(','); 64 | const rowHeightLanguages = Math.round((languageList.length - 0.1) / 7) > 1 ? Math.round((languageList.length - 0.1) / 7) : 1; 65 | const languagesTitleHeight = FIRST_ROW; 66 | const rowHeightFrameworks = Math.round((frameworkList.length - 0.1) / 7) > 1 ? Math.round((frameworkList.length - 0.1) / 7) : 1; 67 | const frameworkTitleHeight = languagesTitleHeight 68 | + ((languageList.length > 1 || languageList[0] !== 'undefined' ? 1 : 0) * PAD) 69 | + ((languageList.length > 1 || languageList[0] !== 'undefined' ? rowHeightLanguages : 0) * ROW) 70 | + (includeNames && (languageList.length > 1 || languageList[0] !== 'undefined') ? (rowHeightFrameworks) * 25 : 0); 71 | const rowHeightLibraries = Math.round((libraryList.length - 0.1) / 7) > 1 ? Math.round((libraryList.length - 0.1) / 7) : 1; 72 | const libraryTitleHeight = frameworkTitleHeight 73 | + ((frameworkList.length > 1 || frameworkList[0] !== 'undefined' ? 1 : 0) * PAD) 74 | + ((frameworkList.length > 1 || frameworkList[0] !== 'undefined' ? rowHeightFrameworks : 0) * ROW) 75 | + (includeNames && (frameworkList.length > 1 || frameworkList[0] !== 'undefined') ? (rowHeightLibraries) * 25 : 0); 76 | const rowHeightTools = Math.round((toolsList.length - 0.1) / 7) > 1 ? Math.round((toolsList.length - 0.1) / 7) : 1; 77 | const toolsTitleHeight = libraryTitleHeight 78 | + ((libraryList.length > 1 || libraryList[0] !== 'undefined' ? 1 : 0) * PAD) 79 | + ((libraryList.length > 1 || libraryList[0] !== 'undefined' ? rowHeightLibraries : 0) * ROW) 80 | + (includeNames && (libraryList.length > 1 || libraryList[0] !== 'undefined') ? (rowHeightTools) * 25 : 0); 81 | const rowHeightSoftware = Math.round((softwareList.length - 0.1) / 7) > 1 ? Math.round((softwareList.length - 0.1) / 7) : 1; 82 | const softwareTitleHeight = toolsTitleHeight 83 | + ((toolsList.length > 1 || toolsList[0] !== 'undefined' ? 1 : 0) * PAD) 84 | + ((toolsList.length > 1 || toolsList[0] !== 'undefined' ? rowHeightTools : 0) * ROW) 85 | + (includeNames && (toolsList.length > 1 || toolsList[0] !== 'undefined') ? (rowHeightSoftware) * 25 : 0); 86 | // Set the size of the main SVG container 87 | const width = BASE_WIDTH; 88 | const height = BASE_HEIGHT + 89 | (ROW * ((languageList.length > 1 || languageList[0] !== 'undefined' ? rowHeightLanguages : 0) + 90 | (frameworkList.length > 1 || frameworkList[0] !== 'undefined' ? rowHeightFrameworks : 0) + 91 | (libraryList.length > 1 || libraryList[0] !== 'undefined' ? rowHeightLibraries : 0) + 92 | (toolsList.length > 1 || toolsList[0] !== 'undefined' ? rowHeightTools : 0) + 93 | (softwareList.length > 1 || softwareList[0] !== 'undefined' ? rowHeightSoftware : 0))) 94 | + (PAD * (1 + 95 | (languageList.length > 1 || languageList[0] !== 'undefined' ? 1 : 0) + 96 | (frameworkList.length > 1 || frameworkList[0] !== 'undefined' ? 1 : 0) + 97 | (libraryList.length > 1 || libraryList[0] !== 'undefined' ? 1 : 0) + 98 | (toolsList.length > 1 || toolsList[0] !== 'undefined' ? 1 : 0) + 99 | (softwareList.length > 1 || softwareList[0] !== 'undefined' ? 1 : 0))) 100 | // Add space for the names if true. 101 | + (includeNames ? (Math.round(((languageList.length + libraryList.length + frameworkList.length + toolsList.length + softwareList.length) - 0.1) / 7) + 1) * 25 : 0); 102 | /** 103 | * Builds the gradient boxes and sets the names. 104 | * @param listToBuild The list of items to build the boxes with 105 | * @param type Indicates which type of list it is (languages, frameworks, libraries, tools, etc.). It is important that the type is not used twice. 106 | * @returns The gradient boxes with the icons 107 | */ 108 | function getBoxes(listToBuild, type) { 109 | let boxes = ''; 110 | for (let i = 0; i < listToBuild.length; i++) { 111 | // Check the data and add the first result that isn't defined. 112 | // It checks the languages first, then the frameworks, and then the libraries. 113 | let foundData = utils_1.findData(languages_1.default, listToBuild[i]) || utils_1.findData(frameworks_1.default, listToBuild[i]) || utils_1.findData(libraries_1.default, listToBuild[i]) || utils_1.findData(tools_1.default, listToBuild[i]) || utils_1.findData(software_ides_1.default, listToBuild[i]); 114 | if (foundData === undefined) { 115 | foundData = { 116 | name: [''], 117 | colorFrom: '#FFFFFF', 118 | colorTo: '#808080', 119 | icon: 'undefined', 120 | width: -1, 121 | height: -1, 122 | xOffset: 0, 123 | }; 124 | } 125 | const row = Math.floor(i / 7); 126 | const transX = 102 * (i - row * 7); 127 | const transY = ROW * row + (includeNames && row > 0 ? 25 * row : 0); 128 | boxes += gradient_box_1.default( 129 | // Combine the index and the type number. 130 | (i * Math.pow(10, Math.floor(Math.log10(type)) + 1) + type), foundData.colorFrom, foundData.colorTo, transX, transY); 131 | boxes += 132 | foundData.icon != 'Undefined' 133 | ? `` + 134 | foundData.icon + 135 | '' 136 | : ''; 137 | if (includeNames) { 138 | boxes += ` 141 | 142 | ${foundData.name[0]} 143 | 144 | `; 145 | } 146 | } 147 | return boxes; 148 | } 149 | return ` 150 | 152 | ${card_1.default(width, height, theme.background)} 153 | 154 | 155 | Skills 156 | 157 | 158 | Languages 159 | 160 | 161 | Frameworks 162 | 163 | 164 | Libraries 165 | 166 | 167 | Tools 168 | 169 | 170 | Software 171 | 172 | 173 | 174 | ${getBoxes(languageList, 1)} 175 | 176 | 177 | ${getBoxes(frameworkList, 2)} 178 | 179 | 180 | ${getBoxes(libraryList, 3)} 181 | 182 | 183 | ${getBoxes(toolsList, 4)} 184 | 185 | 186 | ${getBoxes(softwareList, 5)} 187 | 188 | 189 | 190 | `; 191 | } 192 | exports.default = skillsWidget; 193 | //# sourceMappingURL=skills.js.map -------------------------------------------------------------------------------- /public/src/widgets/skills.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../src/widgets/skills.ts"],"names":[],"mappings":"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"} -------------------------------------------------------------------------------- /src/components/card.ts: -------------------------------------------------------------------------------- 1 | export default function buildCard( 2 | width: number, 3 | height: number, 4 | bg: string 5 | ): string { 6 | return ` 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | ` 18 | } 19 | -------------------------------------------------------------------------------- /src/components/gradient-box.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Creates a gradient box. 3 | * 4 | * This method creates a box that has a gradient colour. The box contains the 5 | * logo of the framework, language, library, tool or IDE. 6 | * 7 | * It is important that the ID is not shared in the SVG between other gradient boxes 8 | * because if they share an ID they will use the same colour. 9 | * 10 | * @param id The id of the gradient box 11 | * @param fromColor The starting color in hexcode 12 | * @param toColor The final color of the gradient in hexcode 13 | * @param transX The x coordinate of the box 14 | * @param transY The y coordinate of the box 15 | * @returns A gradient box 16 | */ 17 | export default function buildGradientBox( 18 | id: number, 19 | fromColor: string, 20 | toColor: string, 21 | transX: number, 22 | transY: number 23 | ): string { 24 | return ` 25 | 26 | 27 | 28 | 29 | 30 | 31 | ` 32 | } 33 | -------------------------------------------------------------------------------- /src/data/libraries.ts: -------------------------------------------------------------------------------- 1 | import { IconData } from '../interfaces/IconData' 2 | 3 | const libraries: IconData[] = [ 4 | { 5 | name: ['Babel', 'BabelJS'], 6 | colorFrom: '#FFF1AB', 7 | colorTo: '#FFD100', 8 | icon: ` 9 | 10 | 11 | `, 12 | width: 45.287, 13 | height: 17.427, 14 | xOffset: 0, 15 | }, 16 | { 17 | name: ['P5', 'P5js'], 18 | colorFrom: '#FFC7D6', 19 | colorTo: '#EE1F5E', 20 | icon: ` 21 | 22 | 23 | `, 24 | width: 36, 25 | height: 16.64, 26 | xOffset: 0, 27 | }, 28 | { 29 | name: ['Tensorflow'], 30 | colorFrom: '#FFCA57', 31 | colorTo: '#F06335', 32 | icon: ` 33 | 34 | 35 | `, 36 | width: 36, 37 | height: 40.287, 38 | xOffset: 0, 39 | }, 40 | { 41 | name: ['jQuery'], 42 | colorFrom: '#91DDEB', 43 | colorTo: '#0A67AC', 44 | icon: ` 45 | 46 | 47 | `, 48 | width: 35.955, 49 | height: 34.631, 50 | xOffset: 0, 51 | }, 52 | ] 53 | 54 | export default libraries 55 | -------------------------------------------------------------------------------- /src/data/software-ides.ts: -------------------------------------------------------------------------------- 1 | import { IconData } from '../interfaces/IconData' 2 | 3 | const softwareIDEs: IconData[] = [ 4 | { 5 | name: ['Linux', 'Tux'], 6 | colorFrom: '#FFF1AB', 7 | colorTo: '#FFD100', 8 | icon: ` 9 | 10 | 11 | `, 12 | width: 30.857, 13 | height: 36, 14 | xOffset: 0, 15 | }, 16 | { 17 | name: ['Windows'], 18 | colorFrom: '#0067b8', 19 | colorTo: '#006cac', 20 | icon: ` 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | `, 30 | width: 30.857, 31 | height: 36, 32 | xOffset: -2, 33 | }, 34 | 35 | { 36 | name: ['VSCode'], 37 | colorFrom: '#1F9CF0', 38 | colorTo: '#0065A9', 39 | icon: ` 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | `, 97 | width: 35.995, 98 | height: 25.89, 99 | xOffset: 0, 100 | }, 101 | ] 102 | 103 | export default softwareIDEs 104 | -------------------------------------------------------------------------------- /src/fetchers/user-stats-fetcher.ts: -------------------------------------------------------------------------------- 1 | import fetch from 'node-fetch' 2 | import GithubUserRequest from '../interfaces/GithubUser' 3 | 4 | export default async function getGithubUserStats( 5 | token: string | undefined, 6 | username: string 7 | ): Promise { 8 | 9 | const headers = { 10 | Authorization: `bearer ${token}`, 11 | } 12 | 13 | const body = { 14 | query: ` 15 | query { 16 | user(login: "${username}") { 17 | name 18 | login 19 | contributionsCollection { 20 | totalCommitContributions 21 | restrictedContributionsCount 22 | contributionCalendar { 23 | totalContributions 24 | } 25 | } 26 | repositoriesContributedTo(first: 1, contributionTypes: [COMMIT, ISSUE, PULL_REQUEST, REPOSITORY]) { 27 | totalCount 28 | } 29 | followers { 30 | totalCount 31 | } 32 | repositories(first: 100, ownerAffiliations: OWNER, orderBy: {direction: DESC, field: STARGAZERS}) { 33 | totalCount 34 | nodes { 35 | stargazers { 36 | totalCount 37 | } 38 | } 39 | } 40 | } 41 | } 42 | `, 43 | } 44 | 45 | const response = await fetch('https://api.github.com/graphql', { 46 | method: 'POST', 47 | body: JSON.stringify(body), 48 | headers: headers, 49 | }) 50 | 51 | return await response.json() 52 | } 53 | -------------------------------------------------------------------------------- /src/interfaces/Contributions.ts: -------------------------------------------------------------------------------- 1 | export interface ContributionsCollection { 2 | totalCommitContributions: number 3 | restrictedContributionsCount: number 4 | contributionCalendar: ContributionCalendar 5 | } 6 | 7 | export interface ContributionCalendar { 8 | totalContributions: number 9 | } 10 | 11 | export interface ContributedRepositories { 12 | repositoriesContributedTo: number 13 | } 14 | -------------------------------------------------------------------------------- /src/interfaces/GithubUser.ts: -------------------------------------------------------------------------------- 1 | import { ContributionsCollection, ContributedRepositories } from './Contributions' 2 | import { Repositories } from './Repositories' 3 | 4 | export default interface GithubUserRequest { 5 | data: GithubUserData 6 | } 7 | 8 | export interface GithubUserData { 9 | user: GithubUser 10 | } 11 | 12 | export interface GithubUser { 13 | name: string 14 | login: string 15 | contributionsCollection: ContributionsCollection 16 | repositoriesContributedTo: ContributedRepositories 17 | followers: Followers 18 | repositories: Repositories 19 | } 20 | 21 | export interface Followers { 22 | totalCount: number 23 | } 24 | -------------------------------------------------------------------------------- /src/interfaces/IconData.ts: -------------------------------------------------------------------------------- 1 | export interface IconData { 2 | name: Array 3 | colorFrom: string 4 | colorTo: string 5 | icon: string 6 | width: number 7 | height: number 8 | xOffset: number 9 | } 10 | -------------------------------------------------------------------------------- /src/interfaces/Repositories.ts: -------------------------------------------------------------------------------- 1 | export interface Repositories { 2 | totalCount: number 3 | nodes: Repository[] 4 | } 5 | 6 | export interface Repository { 7 | stargazers: Stargazers 8 | } 9 | 10 | export interface Stargazers { 11 | totalCount: number 12 | } 13 | -------------------------------------------------------------------------------- /src/interfaces/Theme.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * The theme interface. 3 | * 4 | * The interface for defining the themes. Currently it only holds the name of the theme and 5 | * the background color of the SVG. Later this will be expanded to support the title text 6 | * colors as well. 7 | */ 8 | export interface Theme { 9 | name: Array 10 | background: string 11 | title: string, 12 | subtitle: string 13 | } -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | import axios from 'axios' 2 | import { IconData } from './interfaces/IconData' 3 | import { Theme } from './interfaces/Theme' 4 | 5 | export function isValidHexColor(hexColor: string): boolean { 6 | return new RegExp( 7 | /^([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{4})$/ 8 | ).test(hexColor) 9 | } 10 | 11 | export function getBoolean(str: string): boolean { 12 | return str.toLowerCase() === 'true' 13 | } 14 | 15 | export async function requestInBase64(url: string): Promise { 16 | const response = await axios.get(url, { 17 | responseType: 'arraybuffer', 18 | }) 19 | return Buffer.from(response.data, 'binary').toString('base64') 20 | } 21 | 22 | export function findData(data: IconData[], name: string): IconData { 23 | return data.filter(function (data) { 24 | return data.name 25 | .map((data) => data.toUpperCase()) 26 | .includes(name.toUpperCase()) 27 | })[0] 28 | } 29 | 30 | export function getTheme(themes: Theme[], themeName: string): Theme { 31 | return themes.filter(function (themes) { 32 | return themes.name 33 | .map((theme) => theme.toUpperCase()) 34 | .includes(themeName.toUpperCase()) 35 | })[0] 36 | } -------------------------------------------------------------------------------- /src/widgets/error.ts: -------------------------------------------------------------------------------- 1 | export default function errorWidget( 2 | widgetName: string, 3 | nameX: string, 4 | reason: string, 5 | reasonX: string 6 | ): string { 7 | return ` 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | Error… Oops! 34 | 35 | 37 | There was an error trying to 38 | load the 39 | ${widgetName} 40 | widget. 41 | 42 | 43 | ${reason} 44 | 45 | 46 | 47 | ` 48 | } 49 | -------------------------------------------------------------------------------- /src/widgets/profile.ts: -------------------------------------------------------------------------------- 1 | require('dotenv').config() 2 | 3 | import axios from 'axios' 4 | import { getTheme, requestInBase64 } from '../utils' 5 | import errorWidget from './error' 6 | import buildCard from '../components/card' 7 | import GithubUserRequest from '../interfaces/GithubUser' 8 | import getGithubUserStats from '../fetchers/user-stats-fetcher' 9 | import { Repository } from '../interfaces/Repositories' 10 | import { Theme } from "../interfaces/Theme"; 11 | import themes from '../data/themes' 12 | 13 | export default async function profileWidget( 14 | username: string, 15 | data: string, 16 | themeString?: string 17 | ): Promise { 18 | 19 | 20 | // Set the theme 21 | let theme: Theme = getTheme(themes, 'default') 22 | if (themeString) { 23 | theme = getTheme(themes, themeString) 24 | } 25 | if (!theme) { 26 | theme = getTheme(themes, 'default') 27 | } 28 | 29 | const dataOptions: Array = data.split(',') 30 | 31 | // Return error if dataOptions argument is undefined 32 | if (dataOptions === undefined) { 33 | return new Promise((res) => { 34 | res( 35 | errorWidget( 36 | 'Profile', 37 | '-25%', 38 | 'Data option is missing!', 39 | '-25%' 40 | ) 41 | ) 42 | }) 43 | } 44 | 45 | // Return error if more than 4 dataOptions were supplied 46 | if (dataOptions.length > 4) { 47 | return new Promise((res) => { 48 | res( 49 | errorWidget( 50 | 'Profile', 51 | '-25%', 52 | `Can't have more than 4 data-options!`, 53 | '-40%' 54 | ) 55 | ) 56 | }) 57 | } 58 | 59 | const width = 842 60 | const height = 165 61 | 62 | async function getDataOptions(): Promise { 63 | let dataBoxes = '' 64 | 65 | const profile: GithubUserRequest = await getGithubUserStats( 66 | process.env.GITHUB_TOKEN, 67 | username 68 | ) 69 | 70 | const stargazers: number[] = [] 71 | profile.data.user.repositories.nodes.forEach( 72 | (repo: Repository, index) => { 73 | stargazers[index] = repo.stargazers.totalCount 74 | } 75 | ) 76 | 77 | for (let i = 0; i < dataOptions.length; i++) { 78 | switch (dataOptions[i].toLowerCase()) { 79 | case 'followers': 80 | addDataBox( 81 | 'followers', 82 | i, 83 | profile.data.user.followers.totalCount, 84 | '#CAF0FF', 85 | '#00C6FF', 86 | 'M3.625,9.5A2.417,2.417,0,1,0,1.208,7.084,2.419,2.419,0,0,0,3.625,9.5Zm16.919,0a2.417,2.417,0,1,0-2.417-2.417A2.419,2.419,0,0,0,20.544,9.5Zm1.208,1.208H19.336a2.41,2.41,0,0,0-1.7.7,5.524,5.524,0,0,1,2.836,4.132h2.493a1.207,1.207,0,0,0,1.208-1.208V13.126A2.419,2.419,0,0,0,21.753,10.709Zm-9.668,0a4.23,4.23,0,1,0-4.23-4.23A4.228,4.228,0,0,0,12.085,10.709Zm2.9,1.208h-.313a5.84,5.84,0,0,1-5.174,0H9.185a4.352,4.352,0,0,0-4.351,4.351v1.088a1.813,1.813,0,0,0,1.813,1.813H17.523a1.813,1.813,0,0,0,1.813-1.813V16.269A4.352,4.352,0,0,0,14.985,11.918Zm-8.448-.506a2.41,2.41,0,0,0-1.7-.7H2.417A2.419,2.419,0,0,0,0,13.126v1.208a1.207,1.207,0,0,0,1.208,1.208H3.7A5.538,5.538,0,0,1,6.537,11.412Z' 87 | ) 88 | break 89 | case 'repositories': 90 | addDataBox( 91 | 'repositories', 92 | i, 93 | profile.data.user.repositories.totalCount, 94 | '#FFCEE4', 95 | '#FF0774', 96 | 'M7.106,3A2.106,2.106,0,0,0,5,5.106V17.74a.7.7,0,0,0,.207.5,2.026,2.026,0,0,0,1.9,1.608h.7v-1.4h-.7a.7.7,0,0,1,0-1.4H17.634a1.4,1.4,0,0,0,1.4-1.4V4.4a1.4,1.4,0,0,0-1.4-1.4Zm.7,2.106h.7a.7.7,0,0,1,.7.7v.7a.7.7,0,0,1-.7.7h-.7a.7.7,0,0,1-.7-.7v-.7A.7.7,0,0,1,7.808,5.106Zm0,3.51h.7a.7.7,0,0,1,.7.7v.7a.7.7,0,0,1-.7.7h-.7a.7.7,0,0,1-.7-.7v-.7A.7.7,0,0,1,7.808,8.615Zm0,3.51h.7a.7.7,0,0,1,.7.7v.7a.7.7,0,0,1-.7.7h-.7a.7.7,0,0,1-.7-.7v-.7A.7.7,0,0,1,7.808,12.125Zm1.4,6.317v3.51l2.106-1.4,2.106,1.4v-3.51Zm5.615,0v1.4h3.51a.7.7,0,0,0,0-1.4Z' 97 | ) 98 | break 99 | case 'stars': 100 | addDataBox( 101 | 'stars', 102 | i, 103 | stargazers.reduce((a, b) => a + b, 0), 104 | '#FFEFCD', 105 | '#FFA100', 106 | 'M9.6.608,7.369,5.131l-4.992.728a1.094,1.094,0,0,0-.6,1.865l3.611,3.519L4.53,16.215a1.093,1.093,0,0,0,1.585,1.151l4.465-2.347,4.465,2.347a1.094,1.094,0,0,0,1.585-1.151l-.854-4.971,3.611-3.519a1.094,1.094,0,0,0-.6-1.865l-4.992-.728L11.561.608A1.094,1.094,0,0,0,9.6.608Z' 107 | ) 108 | break 109 | case 'contributions': 110 | case 'commits': 111 | addDataBox( 112 | 'contributions', 113 | i, 114 | profile.data.user.contributionsCollection 115 | .contributionCalendar.totalContributions, 116 | '#C5FFD9', 117 | '#00F14F', 118 | ` 119 | 120 | 121 | ` 122 | ) 123 | break 124 | 125 | // Incorrect data item found 126 | default: 127 | return new Promise((res) => { 128 | res( 129 | errorWidget( 130 | 'Profile', 131 | '-25%', 132 | `Invalid data item found!`, 133 | '-26%' 134 | ) 135 | ) 136 | }) 137 | } 138 | } 139 | 140 | // Add a box with a data counter 141 | function addDataBox( 142 | name: string, 143 | index: number, 144 | count: number, 145 | color1: string, 146 | color2: string, 147 | svg: string 148 | ) { 149 | dataBoxes += ` 151 | 152 | 154 | ${count} 155 | 156 | ${name !== 'commits' && name !== 'contributions' 157 | ? `` 159 | : svg 160 | } 161 | ` 162 | } 163 | return dataBoxes 164 | } 165 | 166 | try { 167 | const dataBoxes = await getDataOptions() 168 | 169 | // If we receive a Promise, we return that 170 | if (typeof dataBoxes != 'string') { 171 | return dataBoxes 172 | } 173 | 174 | // Create the request 175 | const response = await axios.get( 176 | `https://api.github.com/users/${username}` 177 | ) 178 | 179 | // Grab the avatar 180 | const avatar = await requestInBase64(response.data.avatar_url) 181 | return ` 182 | 183 | 184 | 185 | 186 | 187 | ${buildCard(width, height, theme.background)} 188 | 189 | 190 | ${response.data.name === null 191 | ? response.data.login 192 | : response.data.name 193 | } 194 | GitHub.com/${response.data.login 195 | } 196 | 198 | ${dataBoxes} 199 | 200 | 201 | ` 202 | } catch (error) { 203 | return new Promise((res) => { 204 | res( 205 | errorWidget('Profile', '-25%', 'GitHub API-call error!', '-24%') 206 | ) 207 | }) 208 | } 209 | } 210 | -------------------------------------------------------------------------------- /src/widgets/skills.ts: -------------------------------------------------------------------------------- 1 | import buildCard from '../components/card' 2 | import buildGradientBox from '../components/gradient-box' 3 | import { findData, getTheme } from '../utils' 4 | import languageData from '../data/languages' 5 | import frameworks from '../data/frameworks' 6 | import libraries from '../data/libraries' 7 | import tools from '../data/tools' 8 | import softwareIDEs from '../data/software-ides' 9 | import { Theme } from "../interfaces/Theme"; 10 | import themes from '../data/themes' 11 | /** 12 | * Builds the skill widget page 13 | * 14 | * This method builds a SVG file that contains all the languages, frameworks, 15 | * libraries, tools and other software that can be found in the data folder and 16 | * are passed by the calling method. 17 | * 18 | * @param languagesString The string with all the languages 19 | * @param frameworksString The string with all the frameworks 20 | * @param librariesString The string with all the libraries 21 | * @param toolsString The string with all the tools 22 | * @param softwareString The string with all the software 23 | * @param includeNames The boolean that determines whether or not to include names 24 | * @returns The SVG with all the skills that were passed. 25 | */ 26 | export default function skillsWidget( 27 | languagesString?: string, 28 | frameworksString?: string, 29 | librariesString?: string, 30 | toolsString?: string, 31 | softwareString?: string, 32 | includeNames?: boolean, 33 | themeString?: string 34 | 35 | ): string { 36 | 37 | const BASE_HEIGHT = 125 38 | const BASE_WIDTH = 812 39 | const FIRST_ROW = 90 40 | const ROW = 114 41 | const PAD = 60 42 | 43 | if (!languagesString) { 44 | languagesString = 'undefined' 45 | } 46 | if (!frameworksString) { 47 | frameworksString = 'undefined' 48 | } 49 | if (!librariesString) { 50 | librariesString = 'undefined' 51 | } 52 | if (!toolsString) { 53 | toolsString = 'undefined' 54 | } 55 | if (!softwareString) { 56 | softwareString = 'undefined' 57 | } 58 | 59 | // Set the theme 60 | let theme : Theme = getTheme(themes, 'default') 61 | if (themeString) { 62 | theme = getTheme(themes, themeString) 63 | } 64 | if (!theme) { 65 | theme = getTheme(themes, 'default') 66 | } 67 | 68 | const languageList: string[] = languagesString.split(',') 69 | const frameworkList: string[] = frameworksString.split(',') 70 | const libraryList: string[] = librariesString.split(',') 71 | const toolsList: string[] = toolsString.split(',') 72 | const softwareList: string[] = softwareString.split(',') 73 | 74 | const rowHeightLanguages = Math.round((languageList.length - 0.1) / 7) > 1 ? Math.round((languageList.length - 0.1) / 7) : 1 75 | const languagesTitleHeight = FIRST_ROW 76 | 77 | const rowHeightFrameworks = Math.round((frameworkList.length - 0.1) / 7) > 1 ? Math.round((frameworkList.length - 0.1) / 7) : 1 78 | const frameworkTitleHeight = languagesTitleHeight 79 | + ((languageList.length > 1 || languageList[0] !== 'undefined' ? 1 : 0) * PAD) 80 | + ((languageList.length > 1 || languageList[0] !== 'undefined' ? rowHeightLanguages : 0) * ROW) 81 | + (includeNames && (languageList.length > 1 || languageList[0] !== 'undefined') ? (rowHeightFrameworks) * 25 : 0) 82 | 83 | const rowHeightLibraries = Math.round((libraryList.length - 0.1) / 7) > 1 ? Math.round((libraryList.length - 0.1) / 7) : 1 84 | const libraryTitleHeight = frameworkTitleHeight 85 | + ((frameworkList.length > 1 || frameworkList[0] !== 'undefined' ? 1 : 0) * PAD) 86 | + ((frameworkList.length > 1 || frameworkList[0] !== 'undefined' ? rowHeightFrameworks : 0) * ROW) 87 | + (includeNames && (frameworkList.length > 1 || frameworkList[0] !== 'undefined') ? (rowHeightLibraries) * 25 : 0) 88 | 89 | const rowHeightTools = Math.round((toolsList.length - 0.1) / 7) > 1 ? Math.round((toolsList.length - 0.1) / 7) : 1 90 | const toolsTitleHeight = libraryTitleHeight 91 | + ((libraryList.length > 1 || libraryList[0] !== 'undefined' ? 1 : 0) * PAD) 92 | + ((libraryList.length > 1 || libraryList[0] !== 'undefined' ? rowHeightLibraries : 0) * ROW) 93 | + (includeNames && (libraryList.length > 1 || libraryList[0] !== 'undefined') ? (rowHeightTools) * 25 : 0) 94 | 95 | const rowHeightSoftware = Math.round((softwareList.length - 0.1) / 7) > 1 ? Math.round((softwareList.length - 0.1) / 7) : 1 96 | const softwareTitleHeight = toolsTitleHeight 97 | + ((toolsList.length > 1 || toolsList[0] !== 'undefined' ? 1 : 0) * PAD) 98 | + ((toolsList.length > 1 || toolsList[0] !== 'undefined' ? rowHeightTools : 0) * ROW) 99 | + (includeNames && (toolsList.length > 1 || toolsList[0] !== 'undefined') ? (rowHeightSoftware) * 25 : 0) 100 | 101 | // Set the size of the main SVG container 102 | const width = BASE_WIDTH 103 | const height = 104 | BASE_HEIGHT + 105 | (ROW * ( 106 | (languageList.length > 1 || languageList[0] !== 'undefined' ? rowHeightLanguages : 0) + 107 | (frameworkList.length > 1 || frameworkList[0] !== 'undefined' ? rowHeightFrameworks : 0) + 108 | (libraryList.length > 1 || libraryList[0] !== 'undefined' ? rowHeightLibraries : 0) + 109 | (toolsList.length > 1 || toolsList[0] !== 'undefined' ? rowHeightTools : 0) + 110 | (softwareList.length > 1 || softwareList[0] !== 'undefined' ? rowHeightSoftware : 0) 111 | )) 112 | + (PAD * ( 1 + 113 | (languageList.length > 1 || languageList[0] !== 'undefined' ? 1 : 0) + 114 | (frameworkList.length > 1 || frameworkList[0] !== 'undefined' ? 1 : 0) + 115 | (libraryList.length > 1 || libraryList[0] !== 'undefined' ? 1 : 0) + 116 | (toolsList.length > 1 || toolsList[0] !== 'undefined' ? 1 : 0) + 117 | (softwareList.length > 1 || softwareList[0] !== 'undefined' ? 1 : 0) 118 | )) 119 | // Add space for the names if true. 120 | + (includeNames ? (Math.round(((languageList.length + libraryList.length + frameworkList.length + toolsList.length+ softwareList.length) - 0.1) / 7) + 1) * 25 : 0) 121 | 122 | /** 123 | * Builds the gradient boxes and sets the names. 124 | * @param listToBuild The list of items to build the boxes with 125 | * @param type Indicates which type of list it is (languages, frameworks, libraries, tools, etc.). It is important that the type is not used twice. 126 | * @returns The gradient boxes with the icons 127 | */ 128 | function getBoxes(listToBuild:Array, type:number) { 129 | let boxes = '' 130 | for (let i = 0; i < listToBuild.length; i++) { 131 | // Check the data and add the first result that isn't defined. 132 | // It checks the languages first, then the frameworks, and then the libraries. 133 | let foundData = findData(languageData, listToBuild[i]) || findData(frameworks, listToBuild[i]) || findData(libraries, listToBuild[i]) || findData(tools, listToBuild[i]) || findData(softwareIDEs, listToBuild[i]) 134 | if (foundData === undefined) { 135 | foundData = { 136 | name: [''], 137 | colorFrom: '#FFFFFF', 138 | colorTo: '#808080', 139 | icon: 'undefined', 140 | width: -1, 141 | height: -1, 142 | xOffset: 0, 143 | } 144 | } 145 | 146 | const row = Math.floor(i / 7) 147 | const transX = 102 * (i - row * 7) 148 | const transY = ROW * row + (includeNames && row > 0 ? 25 * row : 0) 149 | 150 | boxes += buildGradientBox( 151 | // Combine the index and the type number. 152 | (i * Math.pow(10, Math.floor(Math.log10(type)) + 1) + type), 153 | foundData.colorFrom, 154 | foundData.colorTo, 155 | transX, 156 | transY 157 | ) 158 | 159 | boxes += 160 | foundData.icon != 'Undefined' 161 | ? `` + 164 | foundData.icon + 165 | '' 166 | : '' 167 | 168 | if (includeNames) { 169 | boxes += ` 174 | 177 | ${foundData.name[0]} 178 | 179 | ` 180 | } 181 | } 182 | return boxes 183 | } 184 | 185 | return ` 186 | 188 | ${buildCard(width, height, theme.background)} 189 | 190 | 191 | Skills 192 | 193 | 194 | Languages 195 | 196 | 197 | Frameworks 198 | 199 | 200 | Libraries 201 | 202 | 203 | Tools 204 | 205 | 206 | Software 207 | 208 | 209 | 210 | ${getBoxes(languageList, 1)} 211 | 212 | 213 | ${getBoxes(frameworkList, 2)} 214 | 215 | 216 | ${getBoxes(libraryList, 3)} 217 | 218 | 219 | ${getBoxes(toolsList, 4)} 220 | 221 | 222 | ${getBoxes(softwareList, 5)} 223 | 224 | 225 | 226 | ` 227 | } 228 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2018", 4 | "module": "None", 5 | "moduleResolution": "Node", 6 | "lib": ["ESNext", "ESNext.AsyncIterable", "DOM"], 7 | "esModuleInterop": true, 8 | "allowJs": true, 9 | "outDir": "public", 10 | "sourceMap": true, 11 | "strict": true, 12 | "experimentalDecorators": true, 13 | "baseUrl": ".", 14 | "paths": { 15 | "~/*": ["./*"], 16 | "@/*": ["./*"] 17 | }, 18 | "types": ["dotenv", "express", "node"] 19 | }, 20 | "exclude": ["node_modules", "./public/**/*"], 21 | "include": ["api/**/*", "public/**/*"] 22 | } 23 | -------------------------------------------------------------------------------- /vercel.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 2, 3 | "builds": [ 4 | { 5 | "src": "public/api/index.js", 6 | "use": "@vercel/node" 7 | } 8 | ], 9 | "rewrites": [ 10 | { 11 | "source": "/api/(.*)", 12 | "destination": "public/api/index.js" 13 | }, 14 | { 15 | "source": "/(.+)", 16 | "destination": "public/api/index.js" 17 | } 18 | ], 19 | "redirects": [ 20 | { 21 | "source": "/", 22 | "destination": "https://github.com/Jurredr/github-widgetbox" 23 | } 24 | ], 25 | "cleanUrls": true 26 | } 27 | --------------------------------------------------------------------------------