├── .env.example
├── public
├── github-hero.png
├── vercel.svg
├── window.svg
├── file.svg
├── github-logo.svg
├── globe.svg
└── next.svg
├── src
├── assets
│ ├── cardExample.png
│ ├── github-hero.png
│ ├── github-logo.svg
│ └── Points_icon.svg
├── app
│ ├── not-found.tsx
│ ├── dashboard
│ │ ├── not-found.tsx
│ │ ├── components
│ │ │ ├── cardInfoUserSmall
│ │ │ │ └── index.tsx
│ │ │ ├── rateLimitModal
│ │ │ │ └── index.tsx
│ │ │ ├── charts
│ │ │ │ ├── cardPopularReposChart
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── wellStructuredRepoScoresChart
│ │ │ │ │ └── index.tsx
│ │ │ │ └── cardLanguageChart
│ │ │ │ │ └── index.tsx
│ │ │ ├── conquestCard
│ │ │ │ └── index.tsx
│ │ │ ├── cardInfoUserBigNumber
│ │ │ │ └── index.tsx
│ │ │ ├── modal
│ │ │ │ └── index.tsx
│ │ │ ├── modalShareCard
│ │ │ │ └── index.tsx
│ │ │ ├── stackAnalysisCard
│ │ │ │ └── index.tsx
│ │ │ └── footer
│ │ │ │ └── index.tsx
│ │ ├── layout.tsx
│ │ ├── [user]
│ │ │ └── page.tsx
│ │ └── utils
│ │ │ └── generateMetadata.ts
│ ├── loading.tsx
│ ├── page.tsx
│ ├── globals.css
│ ├── layout.tsx
│ └── about
│ │ └── page.tsx
├── lib
│ ├── utils.ts
│ ├── api
│ │ ├── graphqlClient.ts
│ │ └── queryGitHubData.ts
│ ├── calcs
│ │ ├── getPopularContributions.ts
│ │ ├── calculateValorAgregado.ts
│ │ ├── calcCommitStarsForks.ts
│ │ ├── calculatePontosTotais.ts
│ │ ├── calculateLanguageStats.ts
│ │ ├── identifyWellStructuredRepos.ts
│ │ ├── calcStructuredRepoScores.ts
│ │ ├── formatRateLimitInfo.ts
│ │ ├── calculateUnifiedCommitCount.ts
│ │ ├── calculateAchievements.ts
│ │ └── stackAnalysis.ts
│ ├── getGithubData.ts
│ └── types.ts
├── components
│ ├── container
│ │ └── index.tsx
│ ├── cardInfo
│ │ └── index.tsx
│ ├── logo
│ │ └── index.tsx
│ ├── gradientText
│ │ └── index.tsx
│ ├── ui
│ │ ├── tooltip.tsx
│ │ ├── card.tsx
│ │ └── chart.tsx
│ ├── inputForm
│ │ └── index.tsx
│ ├── header
│ │ └── index.tsx
│ ├── darkVeilBG
│ │ └── index.tsx
│ └── LightRaysBG
│ │ └── index.tsx
└── constants
│ └── valuesConfig.ts
├── postcss.config.mjs
├── .editorconfig
├── next.config.ts
├── components.json
├── .gitignore
├── tsconfig.json
├── package.json
├── LICENSE
└── README.md
/.env.example:
--------------------------------------------------------------------------------
1 | GITHUB_TOKEN_FOR_REQUESTS=
2 | NEXT_PUBLIC_HOST_URL=
--------------------------------------------------------------------------------
/public/github-hero.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreluizdasilvaa/CommitWorth/HEAD/public/github-hero.png
--------------------------------------------------------------------------------
/src/assets/cardExample.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreluizdasilvaa/CommitWorth/HEAD/src/assets/cardExample.png
--------------------------------------------------------------------------------
/src/assets/github-hero.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreluizdasilvaa/CommitWorth/HEAD/src/assets/github-hero.png
--------------------------------------------------------------------------------
/postcss.config.mjs:
--------------------------------------------------------------------------------
1 | const config = {
2 | plugins: ["@tailwindcss/postcss"],
3 | };
4 |
5 | export default config;
6 |
--------------------------------------------------------------------------------
/src/app/not-found.tsx:
--------------------------------------------------------------------------------
1 | import { redirect } from "next/navigation"
2 |
3 | export default function() {
4 | redirect('/')
5 | }
--------------------------------------------------------------------------------
/public/vercel.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/app/dashboard/not-found.tsx:
--------------------------------------------------------------------------------
1 | import { Modal } from "./components/modal"
2 | export default function NotFound() {
3 | return
{title}
15 |{description}
17 |CommitWorth
19 | 20 | ) 21 | } -------------------------------------------------------------------------------- /src/lib/calcs/calcStructuredRepoScores.ts: -------------------------------------------------------------------------------- 1 | import { SCORING_CONFIG } from "@/constants/valuesConfig" 2 | import { WellStructuredRepo } from "../types" 3 | 4 | interface RepoScore { 5 | name: string 6 | score: number 7 | } 8 | 9 | export function calcStructuredRepoScores(wellStructuredRepos: WellStructuredRepo[]): RepoScore[] { 10 | const { pontosPorStar, pontosPorFork, bonusRepoBemEstruturado } = SCORING_CONFIG 11 | 12 | return wellStructuredRepos 13 | .map(repo => ({ 14 | name: repo.name, 15 | score: 16 | repo.stars * pontosPorStar + 17 | repo.forks * pontosPorFork + 18 | bonusRepoBemEstruturado, 19 | })) 20 | .sort((a, b) => b.score - a.score) 21 | } -------------------------------------------------------------------------------- /src/constants/valuesConfig.ts: -------------------------------------------------------------------------------- 1 | export const SCORING_CONFIG = { 2 | valorPorCommit: 2, 3 | valorPorStar: 0.50, 4 | valorPorFork: 1, 5 | pontosPorCommit: 1, 6 | pontosPorStar: 5, 7 | pontosPorFork: 3, 8 | bonusRepoBemEstruturado: 10, 9 | } as const 10 | 11 | // Constantes para os thresholds dos achievements 12 | export const ACHIEVEMENT_THRESHOLDS = { 13 | CODE_WARRIOR_COMMITS: 1000, 14 | CODE_EMPIRE_REPOS: 50, 15 | GITHUB_ARCHITECT_LANGUAGES: 10, 16 | GITHUB_STAR_TOTAL: 100, 17 | GOLDEN_PROJECT_STARS: 500, 18 | CODE_VETERAN_YEARS: 10, 19 | GITHUB_OLD_SCHOOL_YEARS: 5, 20 | STACK_SPECIALIST_SCORE: 70, 21 | TECH_LEADER_LEVEL: 'Tech Lead', 22 | SENIOR_LEVEL: 'Senior', 23 | POLYGLOT_LANGUAGES: 15, 24 | } as const -------------------------------------------------------------------------------- /src/lib/calcs/formatRateLimitInfo.ts: -------------------------------------------------------------------------------- 1 | import { GitHubStatsResponse } from "../types" 2 | 3 | export interface RateLimitInfo { 4 | limit: number 5 | remaining: number 6 | resetAtRelative: string 7 | } 8 | 9 | export function formatRateLimitInfo(rateLimit: GitHubStatsResponse['rateLimit']): RateLimitInfo { 10 | const resetDate = new Date(rateLimit.resetAt) 11 | const now = new Date() 12 | 13 | const secondsUntilReset = Math.max(0, Math.floor((resetDate.getTime() - now.getTime()) / 1000)) 14 | 15 | return { 16 | limit: rateLimit.limit, 17 | remaining: rateLimit.remaining, 18 | resetAtRelative: secondsUntilReset > 0 19 | ? `${Math.floor(secondsUntilReset / 60)}min ${secondsUntilReset % 60}s` 20 | : 'agora' 21 | } 22 | } -------------------------------------------------------------------------------- /src/app/loading.tsx: -------------------------------------------------------------------------------- 1 | export default function Loading() { 2 | return ( 3 |{title}
15 | 16 |{value}
20 |Total de buscas: {totalLimit}
23 |Restantes: {remainder}
26 |Reseta em {reset}
27 |{title}
32 |{title}
15 |{description}
16 | 17 |{title}
40 | {about && ( 41 |{about}
49 |{title}
27 | {about && ( 28 |{about}
36 |56 | {!isPoints && !isFork && ( 57 | R$ 58 | )} 59 | {value && value.toLocaleString('pt-BR')} 60 |
61 |{title}
40 | {about && ( 41 |{about}
49 |Precisamos do seu nickname de usuário do github, para conseguimos calcular quanto você gerou de valor, digite ele no campo abaixo 👇
37 | 38 | 62 |Feito com ❤️ por André
73 |
25 | case 'Junior': return Análise de Stack & Senioridade
35 |
49 | Stack Principal
50 | {stackAnalysis.primaryStack}
52 |53 | {stackAnalysis.stackSummary.primaryLanguagePercentage}% dos seus repositórios 54 |
55 |64 | {stackAnalysis.seniorityLevel} 65 |
66 |67 | Score: {stackAnalysis.seniorityScore}/100 68 |
69 |
79 | Tempo de experiência:
80 |
81 | {stackAnalysis.stackSummary.experienceRange}
82 |
83 |
85 | Linguagens dominadas: 86 | 87 | {stackAnalysis.stackSummary.totalLanguages} 88 | 89 |
90 |109 | {exp.repositories} repos 110 |
111 |112 | {exp.yearsOfExperience} {exp.yearsOfExperience === 1 ? 'ano' : 'anos'} 113 |
114 |21 | O CommitWorth é uma plataforma gamificada que calcula o "valor agregado" e outras informações do trabalho de desenvolvedores a partir de dados públicos do GitHub. Basta informar um username válido para acessar um dashboard exclusivo com métricas, análise de stack, detecção de senioridade e conquistas. 22 |
23 |27 | O objetivo do CommitWorth é valorizar e dar visibilidade ao esforço de desenvolvedores, traduzindo sua atividade no GitHub em números, conquistas e um card compartilhável. A plataforma incentiva o crescimento técnico, a colaboração e a construção de um portfólio público relevante. 28 |
29 |78 | Top Linguagens (no card Análise de Stack & Senioridade) mostra as linguagens em que você possui mais experiência e tempo de uso, considerando: 79 |
80 |86 | Já Linguagens mais utilizadas exibe as linguagens mais frequentes nos seus repositórios públicos, baseada apenas na contagem de repositórios que usam cada linguagem. 87 |
88 |89 | Por isso, os resultados podem ser diferentes: você pode ter muitos repositórios em uma linguagem (mais utilizada), mas ter mais experiência e tempo em outra (top linguagens da stack/senioridade). 90 |
91 |96 | O sistema desbloqueia distintivos conforme critérios como número de commits, repositórios, linguagens, estrelas, tempo de conta, senioridade e stack. Exemplos: 97 |
98 |113 | O usuário pode gerar uma imagem personalizada com seu nome, foto, valor agregado, total de commits, pontos, distintivos, stack principal, nível de senioridade, tempo de experiência e número de linguagens. O card pode ser baixado ou compartilhado em suas redes sociais. 114 |
115 |137 | @{userData.login} 138 |
139 |