Finalising content

This commit is contained in:
Markus Thielker 2024-12-22 02:57:08 +01:00
parent 8ce56cf7cf
commit e2ba6e0029
No known key found for this signature in database
11 changed files with 667 additions and 162 deletions

BIN
bun.lockb

Binary file not shown.

View file

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<svg width="600" height="535" version="1.1" xmlns="http://www.w3.org/2000/svg"> <svg width="800" height="735" class="flex" version="1.1" xmlns="http://www.w3.org/2000/svg">
<path d="m299.75 238.48c-26.326-51.007-97.736-146.28-164.21-193.17-63.677-44.919-88.028-37.186-103.82-29.946-18.428 8.3915-21.719 36.692-21.719 53.311s9.0496 136.57 15.138 156.48c19.745 66.145 89.674 88.522 154.17 81.282 3.2908-0.49362 6.5816-0.98723 10.037-1.3163-3.2908 0.49362-6.7461 0.98723-10.037 1.3163-94.445 13.986-178.52 48.374-68.284 170.96 121.1 125.38 166.02-26.82 189.06-104.15 23.035 77.169 49.526 223.94 186.75 104.15 103.17-104.15 28.301-156.97-66.145-170.96-3.2908-0.32908-6.7461-0.82269-10.037-1.3163 3.4553 0.49362 6.7461 0.82269 10.037 1.3163 64.499 7.2397 134.59-15.138 154.17-81.282 5.9234-20.074 15.138-139.86 15.138-156.48s-3.2908-44.919-21.719-53.311c-15.96-7.2397-40.148-14.973-103.82 29.946-66.967 47.058-138.38 142.16-164.7 193.17z" fill="#1185fe"/> <path d="m399.75 338.48c-26.326-51.007-97.736-146.28-164.21-193.17-63.677-44.919-88.028-37.186-103.82-29.946-18.428 8.3915-21.719 36.692-21.719 53.311s9.0496 136.57 15.138 156.48c19.745 66.145 89.674 88.522 154.17 81.282 3.2908-0.49362 6.5816-0.98723 10.037-1.3163-3.2908 0.49362-6.7461 0.98723-10.037 1.3163-94.445 13.986-178.52 48.374-68.284 170.96 121.1 125.38 166.02-26.82 189.06-104.15 23.035 77.169 49.526 223.94 186.75 104.15 103.17-104.15 28.301-156.97-66.145-170.96-3.2908-0.32908-6.7461-0.82269-10.037-1.3163 3.4553 0.49362 6.7461 0.82269 10.037 1.3163 64.499 7.2397 134.59-15.138 154.17-81.282 5.9234-20.074 15.138-139.86 15.138-156.48s-3.2908-44.919-21.719-53.311c-15.96-7.2397-40.148-14.973-103.82 29.946-66.967 47.058-138.38 142.16-164.7 193.17z" fill="#1185fe"/>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 905 B

After

Width:  |  Height:  |  Size: 918 B

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Before After
Before After

BIN
public/portrait-one.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 344 KiB

BIN
public/portrait-three.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

View file

Before

Width:  |  Height:  |  Size: 4.5 MiB

After

Width:  |  Height:  |  Size: 4.5 MiB

Before After
Before After

View file

@ -24,7 +24,7 @@ body {
--accent-foreground: 60 9.1% 97.8%; --accent-foreground: 60 9.1% 97.8%;
--destructive: 0 72.2% 50.6%; --destructive: 0 72.2% 50.6%;
--destructive-foreground: 60 9.1% 97.8%; --destructive-foreground: 60 9.1% 97.8%;
--border: 12 6.5% 15.1%; --border: 180 0% 20%;
--input: 12 6.5% 15.1%; --input: 12 6.5% 15.1%;
--ring: 20.5 90.2% 48.2%; --ring: 20.5 90.2% 48.2%;
--chart-1: 220 70% 50%; --chart-1: 220 70% 50%;

View file

@ -2,10 +2,11 @@ import React from 'react';
import Image from 'next/image'; import Image from 'next/image';
import { Input } from '@/components/ui/input'; import { Input } from '@/components/ui/input';
import { Separator } from '@/components/ui/separator'; import { Separator } from '@/components/ui/separator';
import { Skeleton } from '@/components/ui/skeleton';
import { Card, CardContent, CardDescription, CardHeader } from '@/components/ui/card'; import { Card, CardContent, CardDescription, CardHeader } from '@/components/ui/card';
import Link from 'next/link'; import Link from 'next/link';
import { SearchResult } from '@/components/search-result'; import { SearchResult } from '@/components/search-result';
import { PublicUser } from '@/lib/github-user'; import { PublicUser, Repository } from '@/lib/github';
const calculateAge = (birthdate: Date): number => { const calculateAge = (birthdate: Date): number => {
const today = new Date(); const today = new Date();
@ -21,7 +22,7 @@ const calculateAge = (birthdate: Date): number => {
}; };
const getRepos = async (username: string) => { const getRepos = async (username: string) => {
let repos: any[] = []; let repos: Repository[] = [];
let page = 1; let page = 1;
let hasNextPage = true; let hasNextPage = true;
@ -45,7 +46,7 @@ const getRepos = async (username: string) => {
return repos; return repos;
}; };
const getLanguages = async (repo: any) => { const getLanguages = async (repo: Repository) => {
const response = await fetch(repo.languages_url, { const response = await fetch(repo.languages_url, {
headers: { headers: {
Accept: 'application/vnd.github+json', Accept: 'application/vnd.github+json',
@ -54,7 +55,7 @@ const getLanguages = async (repo: any) => {
return await response.json(); return await response.json();
}; };
const accumulateLanguages = async (repos: any[]) => { const accumulateLanguages = async (repos: Repository[]) => {
const languages: { [key: string]: number } = {}; const languages: { [key: string]: number } = {};
for (const repo of repos) { for (const repo of repos) {
@ -67,6 +68,16 @@ const accumulateLanguages = async (repos: any[]) => {
return languages; return languages;
}; };
const accumulateStars = (repos: Repository[]) => {
let stars = 0;
for (const repo of repos) {
stars = stars + repo.stargazers_count;
}
return stars;
};
export default async function Home() { export default async function Home() {
const profileResponse = await fetch('https://api.github.com/users/markusthielker'); const profileResponse = await fetch('https://api.github.com/users/markusthielker');
@ -75,15 +86,16 @@ export default async function Home() {
const username = 'markusthielker'; const username = 'markusthielker';
const repos = await getRepos(username); const repos = await getRepos(username);
const languages = await accumulateLanguages(repos); const languages = await accumulateLanguages(repos);
const stars = accumulateStars(repos);
const totalBytes = Object.values(languages).reduce((sum, bytes) => sum + bytes, 0); const totalBytes = Object.values(languages).reduce((sum, bytes) => sum + bytes, 0);
const languagePercentages = Object.entries(languages) const languagePercentages = Object.entries(languages)
.map(([lang, bytes]) => ({ .map(([lang, bytes]) => ({
lang, name: lang,
percent: (bytes / totalBytes) * 100, percent: (bytes / totalBytes) * 100,
})) }))
.sort((a, b) => b.percent - a.percent) .sort((a, b) => b.percent - a.percent)
.slice(0, 5); .slice(0, 3);
const age = calculateAge(new Date('2001-03-04')); const age = calculateAge(new Date('2001-03-04'));
@ -93,12 +105,12 @@ export default async function Home() {
{ /* search header */} { /* search header */}
<header className="relative p-4 pb-0 lg:p-8 lg:pb-0"> <header className="relative p-4 pb-0 lg:p-8 lg:pb-0">
<Image <div className="hidden lg:block absolute top-10 cursor-pointer text-3xl">
height="35" <span className="text-blue-500">T</span>
width="35" <span className="text-yellow-500">L</span>
src="/portrait.png" <span className="text-green-500">K</span>
className="hidden lg:block absolute rounded cursor-pointer" <span className="text-red-500">R</span>
alt="Portrait of Markus Thielker"/> </div>
{ /* header content (centered) */} { /* header content (centered) */}
<div className="flex items-center justify-center"> <div className="flex items-center justify-center">
@ -106,12 +118,12 @@ export default async function Home() {
{ /* input */} { /* input */}
<Input <Input
className="w-full" className="w-full bg-neutral-700 p-6 rounded-full"
value="Who the fuck is Markus Thielker?" value="Who the fuck is Markus Thielker?"
readOnly/> readOnly/>
{ /* tab navigation */} { /* tab navigation */}
<div className="flex flex-row w-full mt-8 text-sm text-white/50 cursor-pointer"> <div className="flex flex-row w-full mt-6 text-sm text-white/50 cursor-pointer">
<span className="font-semibold text-white/90 border-white border-b-2 px-3 pb-2">All</span> <span className="font-semibold text-white/90 border-white border-b-2 px-3 pb-2">All</span>
<span className="px-3 pb-2">News</span> <span className="px-3 pb-2">News</span>
<span className="px-3 pb-2">Images</span> <span className="px-3 pb-2">Images</span>
@ -144,28 +156,31 @@ export default async function Home() {
className="grid grid-cols-2 md:grid-cols-4 lg:grid-cols-8 grid-rows-3 lg:grid-rows-2 gap-4 max-h-92 lg:max-h-72"> className="grid grid-cols-2 md:grid-cols-4 lg:grid-cols-8 grid-rows-3 lg:grid-rows-2 gap-4 max-h-92 lg:max-h-72">
{ /* images */} { /* images */}
<Card className="col-span-4 row-span-2 grid grid-cols-2 md:grid-cols-3 lg:grid-cols-5 grid-rows-1 lg:grid-rows-2 overflow-hidden"> <Card
<div className="flex col-span-1 lg:col-span-3 row-span-1 lg:row-span-2 items-center overflow-hidden"> className="col-span-4 row-span-2 grid grid-cols-2 md:grid-cols-3 lg:grid-cols-5 grid-rows-1 lg:grid-rows-2 overflow-hidden gap-0.5">
<div
className="flex col-span-1 lg:col-span-3 row-span-1 lg:row-span-2 items-center overflow-hidden">
<Image <Image
height="500" height="500"
width="500" width="500"
src="/portrait.png" src="/portrait-two.png"
className="aspect-square overflow-hidden" className="aspect-square overflow-hidden"
alt="Portrait of Markus Thielker"/> alt="Portrait of Markus Thielker"/>
</div> </div>
<div className="flex col-span-1 lg:col-span-2 row-span-1 items-center overflow-hidden"> <div className="flex col-span-1 lg:col-span-2 row-span-1 items-center overflow-hidden">
<Image <Image
height="500" height="1200"
width="500" width="1600"
src="/portrait.png" src="/portrait-one.jpg"
className="aspect-square overflow-hidden" className="overflow-hidden"
alt="Portrait of Markus Thielker"/> alt="Portrait of Markus Thielker"/>
</div> </div>
<div className="hidden md:flex col-span-1 lg:col-span-2 row-span-1 items-center overflow-hidden"> <div
className="hidden md:flex col-span-1 lg:col-span-2 row-span-1 items-center overflow-hidden">
<Image <Image
height="500" height="500"
width="500" width="500"
src="/portrait.png" src="/portrait-three.png"
className="aspect-square overflow-hidden" className="aspect-square overflow-hidden"
alt="Portrait of Markus Thielker"/> alt="Portrait of Markus Thielker"/>
</div> </div>
@ -187,10 +202,21 @@ export default async function Home() {
</div> </div>
<div className="flex flex-col mt-2 space-y-4"> <div className="flex flex-col mt-2 space-y-4">
<div className="flex flex-col text-white/80 -space-y-1"> <div className="flex flex-col text-white/80 -space-y-1">
<span className="text-lg">{profile.name}</span> <span className="text-lg">MarkusThielker</span>
<span className="text-lg">{profile.followers} Followers</span> {
stars > 0 ?
<span className="text-lg">{stars} total stars</span>
:
<Skeleton className="w-16"/>
}
{
profile.followers ?
<span className="text-lg">{profile.followers} followers</span>
:
<Skeleton className="w-12"/>
}
</div> </div>
<span className="text-sm text-white/50">{profile.bio}</span> <span className="text-sm text-white/50">Full stack developer of Kotlin and Java backends with experience in Android, React and Angular frontend development.</span>
</div> </div>
</CardContent> </CardContent>
</Card> </Card>
@ -204,8 +230,8 @@ export default async function Home() {
</CardDescription> </CardDescription>
</CardHeader> </CardHeader>
<CardContent className="flex flex-col"> <CardContent className="flex flex-col">
<span className="text-lg text-white/80">23 Jahre</span> <span className="text-lg text-white/80">{age} years</span>
<span className="text-sm text-white/80">04. März 2001</span> <span className="text-sm text-white/80">March 2001</span>
</CardContent> </CardContent>
</Card> </Card>
@ -226,19 +252,23 @@ export default async function Home() {
<Card className="hidden lg:block col-span-2 row-span-1"> <Card className="hidden lg:block col-span-2 row-span-1">
<CardHeader> <CardHeader>
<CardDescription> <CardDescription>
Employer Languages
</CardDescription> </CardDescription>
</CardHeader> </CardHeader>
<CardContent> <CardContent>
{ {
languagePercentages && languagePercentages ?
<ul> <ul>
{Object.entries(languagePercentages).map(([lang, percent]) => ( {Object.entries(languagePercentages).map(([index, language]) => (
<li key={lang}> <li key={index} className="text-sm text-white/80">
{lang}: {percent as unknown as string} % {language.name}: {Math.round(language.percent)} %
</li> </li>
))} ))}
</ul> </ul>
:
<div>
</div>
} }
</CardContent> </CardContent>
</Card> </Card>
@ -256,7 +286,7 @@ export default async function Home() {
website_icon_uri="/linkedin-logo.png" website_icon_uri="/linkedin-logo.png"
href="https://linkedin.com/in/markusthielker" href="https://linkedin.com/in/markusthielker"
title="LinkedIn" title="LinkedIn"
description="Als erfahrener Softwareentwickler bin ich stolz darauf, innovative Software Lösungen zu schaffen. Neben meiner beruflichen Tätigkeit engagiere ich mich auch in persönlichen Projekten, insbesondere in den Bereichen Web- und Android Full Stack Entwicklung."/> description="As an experienced software developer, I take pride in crafting innovative software solutions. Beyond my professional role, I'm actively involved in personal projects, especially in the areas of web and Android full stack development."/>
<SearchResult <SearchResult
website="GitHub" website="GitHub"
@ -277,7 +307,7 @@ export default async function Home() {
website_icon_uri="/github-logo.png" website_icon_uri="/github-logo.png"
href="https://github.com/markusthielker/next-ory" href="https://github.com/markusthielker/next-ory"
title="MarkusThielker/next-ory" title="MarkusThielker/next-ory"
description="An easy-to-use starting point to self-host Ory Kratos with OAuth2 and description="An easy-to-use starting point to self-host the Ory stack with OAuth2 and
OIDC, NextJS authentication UI and admin dashboard (work in progress) styled with OIDC, NextJS authentication UI and admin dashboard (work in progress) styled with
TailwindCSS and shadcn/ui" TailwindCSS and shadcn/ui"
links={[ links={[
@ -294,25 +324,32 @@ export default async function Home() {
</div> </div>
{ /* person info column */} { /* person info column */}
<div <div className="hidden lg:flex flex-row col-span-1 space-x-4">
className="hidden lg:flex flex-col p-4 col-span-1 text-sm space-y-2 border-l border-white/15">
<Separator orientation="vertical" className="h-52"/>
<div className="flex flex-col text-sm space-y-2">
<span className="text-xl">Info</span> <span className="text-xl">Info</span>
<span className="text-md text-white/60 leading-5"> <span className="text-md text-white/60 leading-5">
Markus Thielker ist ein {age} Jahre alter Software Engineer aus Neu-Ulm, Deutschland. Markus Thielker is a {age} year old software engineer from Neu-Ulm, Germany.
Er entwickelt, nach einiger Jahre Android App Entwicklung, webbasierte Sofwtare. Dabei After several years of Android app development, he now develops web-based software.
verwendet er vorranig Next.js und Angular. In doing so he primarily uses Next.js and Angular.
</span> </span>
<div className="flex flex-col"> <div className="flex flex-col">
<span><strong>Degree:</strong> None</span> <span><strong>Degree:</strong> None</span>
<span><strong>Experience:</strong> 2.5 years</span> <span><strong>Work Experience:</strong> 2.5 years</span>
<span><strong>Pets:</strong> One dog</span> <span><strong>Pets:</strong> The cutest dog in the world</span>
<span><strong>Favorite Tech:</strong> Next.js & Kotlin</span> <span><strong>Favorite Tech:</strong> Next.js & Kotlin</span>
</div> </div>
</div> </div>
</div>
</section> </section>
</div> </div>
</main> </main>
<footer className="flex items-center justify-center mt-8 h-16 bg-neutral-900">
<span className="text-white/45">Markus Thielker &copy; 2024</span>
</footer>
</div> </div>
); );
} }

View file

@ -0,0 +1,15 @@
import { cn } from "@/lib/utils"
function Skeleton({
className,
...props
}: React.HTMLAttributes<HTMLDivElement>) {
return (
<div
className={cn("animate-pulse rounded-md bg-muted", className)}
{...props}
/>
)
}
export { Skeleton }

View file

@ -1,108 +0,0 @@
export type GithubUser = PrivateUser | PublicUser
/**
* Private User
*/
export interface PrivateUser {
login: string
id: number
user_view_type?: string
node_id: string
avatar_url: string
gravatar_id: string | null
url: string
html_url: string
followers_url: string
following_url: string
gists_url: string
starred_url: string
subscriptions_url: string
organizations_url: string
repos_url: string
events_url: string
received_events_url: string
type: string
site_admin: boolean
name: string | null
company: string | null
blog: string | null
location: string | null
email: string | null
notification_email?: string | null
hireable: boolean | null
bio: string | null
twitter_username?: string | null
public_repos: number
public_gists: number
followers: number
following: number
created_at: string
updated_at: string
private_gists: number
total_private_repos: number
owned_private_repos: number
disk_usage: number
collaborators: number
two_factor_authentication: boolean
plan?: {
collaborators: number
name: string
space: number
private_repos: number
[k: string]: unknown
}
business_plus?: boolean
ldap_dn?: string
[k: string]: unknown
}
/**
* Public User
*/
export interface PublicUser {
login: string
id: number
user_view_type?: string
node_id: string
avatar_url: string
gravatar_id: string | null
url: string
html_url: string
followers_url: string
following_url: string
gists_url: string
starred_url: string
subscriptions_url: string
organizations_url: string
repos_url: string
events_url: string
received_events_url: string
type: string
site_admin: boolean
name: string | null
company: string | null
blog: string | null
location: string | null
email: string | null
notification_email?: string | null
hireable: boolean | null
bio: string | null
twitter_username?: string | null
public_repos: number
public_gists: number
followers: number
following: number
created_at: string
updated_at: string
plan?: {
collaborators: number
name: string
space: number
private_repos: number
[k: string]: unknown
}
private_gists?: number
total_private_repos?: number
owned_private_repos?: number
disk_usage?: number
collaborators?: number
}

561
src/lib/github.ts Normal file
View file

@ -0,0 +1,561 @@
export type Github = PrivateUser | PublicUser
/**
* Private User
*/
export interface PrivateUser {
login: string
id: number
user_view_type?: string
node_id: string
avatar_url: string
gravatar_id: string | null
url: string
html_url: string
followers_url: string
following_url: string
gists_url: string
starred_url: string
subscriptions_url: string
organizations_url: string
repos_url: string
events_url: string
received_events_url: string
type: string
site_admin: boolean
name: string | null
company: string | null
blog: string | null
location: string | null
email: string | null
notification_email?: string | null
hireable: boolean | null
bio: string | null
twitter_username?: string | null
public_repos: number
public_gists: number
followers: number
following: number
created_at: string
updated_at: string
private_gists: number
total_private_repos: number
owned_private_repos: number
disk_usage: number
collaborators: number
two_factor_authentication: boolean
plan?: {
collaborators: number
name: string
space: number
private_repos: number
[k: string]: unknown
}
business_plus?: boolean
ldap_dn?: string
[k: string]: unknown
}
/**
* Public User
*/
export interface PublicUser {
login: string
id: number
user_view_type?: string
node_id: string
avatar_url: string
gravatar_id: string | null
url: string
html_url: string
followers_url: string
following_url: string
gists_url: string
starred_url: string
subscriptions_url: string
organizations_url: string
repos_url: string
events_url: string
received_events_url: string
type: string
site_admin: boolean
name: string | null
company: string | null
blog: string | null
location: string | null
email: string | null
notification_email?: string | null
hireable: boolean | null
bio: string | null
twitter_username?: string | null
public_repos: number
public_gists: number
followers: number
following: number
created_at: string
updated_at: string
plan?: {
collaborators: number
name: string
space: number
private_repos: number
[k: string]: unknown
}
private_gists?: number
total_private_repos?: number
owned_private_repos?: number
disk_usage?: number
collaborators?: number
}
/**
* Full Repository
*/
export interface FullRepository {
id: number
node_id: string
name: string
full_name: string
owner: SimpleUser
private: boolean
html_url: string
description: string | null
fork: boolean
url: string
archive_url: string
assignees_url: string
blobs_url: string
branches_url: string
collaborators_url: string
comments_url: string
commits_url: string
compare_url: string
contents_url: string
contributors_url: string
deployments_url: string
downloads_url: string
events_url: string
forks_url: string
git_commits_url: string
git_refs_url: string
git_tags_url: string
git_url: string
issue_comment_url: string
issue_events_url: string
issues_url: string
keys_url: string
labels_url: string
languages_url: string
merges_url: string
milestones_url: string
notifications_url: string
pulls_url: string
releases_url: string
ssh_url: string
stargazers_url: string
statuses_url: string
subscribers_url: string
subscription_url: string
tags_url: string
teams_url: string
trees_url: string
clone_url: string
mirror_url: string | null
hooks_url: string
svn_url: string
homepage: string | null
language: string | null
forks_count: number
stargazers_count: number
watchers_count: number
/**
* The size of the repository, in kilobytes. Size is calculated hourly. When a repository is initially created, the size is 0.
*/
size: number
default_branch: string
open_issues_count: number
is_template?: boolean
topics?: string[]
has_issues: boolean
has_projects: boolean
has_wiki: boolean
has_pages: boolean
has_downloads?: boolean
has_discussions: boolean
archived: boolean
/**
* Returns whether or not this repository disabled.
*/
disabled: boolean
/**
* The repository visibility: public, private, or internal.
*/
visibility?: string
pushed_at: string
created_at: string
updated_at: string
permissions?: {
admin: boolean
maintain?: boolean
push: boolean
triage?: boolean
pull: boolean
[k: string]: unknown
}
allow_rebase_merge?: boolean
template_repository?: null | Repository
temp_clone_token?: string | null
allow_squash_merge?: boolean
allow_auto_merge?: boolean
delete_branch_on_merge?: boolean
allow_merge_commit?: boolean
allow_update_branch?: boolean
use_squash_pr_title_as_default?: boolean
/**
* The default value for a squash merge commit title:
*
* - `PR_TITLE` - default to the pull request's title.
* - `COMMIT_OR_PR_TITLE` - default to the commit's title (if only one commit) or the pull request's title (when more than one commit).
*/
squash_merge_commit_title?: "PR_TITLE" | "COMMIT_OR_PR_TITLE"
/**
* The default value for a squash merge commit message:
*
* - `PR_BODY` - default to the pull request's body.
* - `COMMIT_MESSAGES` - default to the branch's commit messages.
* - `BLANK` - default to a blank commit message.
*/
squash_merge_commit_message?: "PR_BODY" | "COMMIT_MESSAGES" | "BLANK"
/**
* The default value for a merge commit title.
*
* - `PR_TITLE` - default to the pull request's title.
* - `MERGE_MESSAGE` - default to the classic title for a merge message (e.g., Merge pull request #123 from branch-name).
*/
merge_commit_title?: "PR_TITLE" | "MERGE_MESSAGE"
/**
* The default value for a merge commit message.
*
* - `PR_TITLE` - default to the pull request's title.
* - `PR_BODY` - default to the pull request's body.
* - `BLANK` - default to a blank commit message.
*/
merge_commit_message?: "PR_BODY" | "PR_TITLE" | "BLANK"
allow_forking?: boolean
web_commit_signoff_required?: boolean
subscribers_count: number
network_count: number
license: null | LicenseSimple
organization?: null | SimpleUser
parent?: Repository
source?: Repository
forks: number
master_branch?: string
open_issues: number
watchers: number
/**
* Whether anonymous git access is allowed.
*/
anonymous_access_enabled?: boolean
code_of_conduct?: CodeOfConductSimple
security_and_analysis?: {
advanced_security?: {
status?: "enabled" | "disabled"
[k: string]: unknown
}
/**
* Enable or disable Dependabot security updates for the repository.
*/
dependabot_security_updates?: {
/**
* The enablement status of Dependabot security updates for the repository.
*/
status?: "enabled" | "disabled"
[k: string]: unknown
}
secret_scanning?: {
status?: "enabled" | "disabled"
[k: string]: unknown
}
secret_scanning_push_protection?: {
status?: "enabled" | "disabled"
[k: string]: unknown
}
secret_scanning_non_provider_patterns?: {
status?: "enabled" | "disabled"
[k: string]: unknown
}
secret_scanning_ai_detection?: {
status?: "enabled" | "disabled"
[k: string]: unknown
}
[k: string]: unknown
} | null
/**
* The custom properties that were defined for the repository. The keys are the custom property names, and the values are the corresponding custom property values.
*/
custom_properties?: {
[k: string]: unknown
}
[k: string]: unknown
}
/**
* A GitHub user.
*/
export interface SimpleUser {
name?: string | null
email?: string | null
login: string
id: number
node_id: string
avatar_url: string
gravatar_id: string | null
url: string
html_url: string
followers_url: string
following_url: string
gists_url: string
starred_url: string
subscriptions_url: string
organizations_url: string
repos_url: string
events_url: string
received_events_url: string
type: string
site_admin: boolean
starred_at?: string
user_view_type?: string
[k: string]: unknown
}
/**
* A repository on GitHub.
*/
export interface Repository {
/**
* Unique identifier of the repository
*/
id: number
node_id: string
/**
* The name of the repository.
*/
name: string
full_name: string
license: null | LicenseSimple
forks: number
permissions?: {
admin: boolean
pull: boolean
triage?: boolean
push: boolean
maintain?: boolean
[k: string]: unknown
}
owner: SimpleUser
/**
* Whether the repository is private or public.
*/
private: boolean
html_url: string
description: string | null
fork: boolean
url: string
archive_url: string
assignees_url: string
blobs_url: string
branches_url: string
collaborators_url: string
comments_url: string
commits_url: string
compare_url: string
contents_url: string
contributors_url: string
deployments_url: string
downloads_url: string
events_url: string
forks_url: string
git_commits_url: string
git_refs_url: string
git_tags_url: string
git_url: string
issue_comment_url: string
issue_events_url: string
issues_url: string
keys_url: string
labels_url: string
languages_url: string
merges_url: string
milestones_url: string
notifications_url: string
pulls_url: string
releases_url: string
ssh_url: string
stargazers_url: string
statuses_url: string
subscribers_url: string
subscription_url: string
tags_url: string
teams_url: string
trees_url: string
clone_url: string
mirror_url: string | null
hooks_url: string
svn_url: string
homepage: string | null
language: string | null
forks_count: number
stargazers_count: number
watchers_count: number
/**
* The size of the repository, in kilobytes. Size is calculated hourly. When a repository is initially created, the size is 0.
*/
size: number
/**
* The default branch of the repository.
*/
default_branch: string
open_issues_count: number
/**
* Whether this repository acts as a template that can be used to generate new repositories.
*/
is_template?: boolean
topics?: string[]
/**
* Whether issues are enabled.
*/
has_issues: boolean
/**
* Whether projects are enabled.
*/
has_projects: boolean
/**
* Whether the wiki is enabled.
*/
has_wiki: boolean
has_pages: boolean
/**
* Whether downloads are enabled.
*/
has_downloads: boolean
/**
* Whether discussions are enabled.
*/
has_discussions?: boolean
/**
* Whether the repository is archived.
*/
archived: boolean
/**
* Returns whether or not this repository disabled.
*/
disabled: boolean
/**
* The repository visibility: public, private, or internal.
*/
visibility?: string
pushed_at: string | null
created_at: string | null
updated_at: string | null
/**
* Whether to allow rebase merges for pull requests.
*/
allow_rebase_merge?: boolean
temp_clone_token?: string
/**
* Whether to allow squash merges for pull requests.
*/
allow_squash_merge?: boolean
/**
* Whether to allow Auto-merge to be used on pull requests.
*/
allow_auto_merge?: boolean
/**
* Whether to delete head branches when pull requests are merged
*/
delete_branch_on_merge?: boolean
/**
* Whether or not a pull request head branch that is behind its base branch can always be updated even if it is not required to be up to date before merging.
*/
allow_update_branch?: boolean
/**
* Whether a squash merge commit can use the pull request title as default. **This property is closing down. Please use `squash_merge_commit_title` instead.
*/
use_squash_pr_title_as_default?: boolean
/**
* The default value for a squash merge commit title:
*
* - `PR_TITLE` - default to the pull request's title.
* - `COMMIT_OR_PR_TITLE` - default to the commit's title (if only one commit) or the pull request's title (when more than one commit).
*/
squash_merge_commit_title?: "PR_TITLE" | "COMMIT_OR_PR_TITLE"
/**
* The default value for a squash merge commit message:
*
* - `PR_BODY` - default to the pull request's body.
* - `COMMIT_MESSAGES` - default to the branch's commit messages.
* - `BLANK` - default to a blank commit message.
*/
squash_merge_commit_message?: "PR_BODY" | "COMMIT_MESSAGES" | "BLANK"
/**
* The default value for a merge commit title.
*
* - `PR_TITLE` - default to the pull request's title.
* - `MERGE_MESSAGE` - default to the classic title for a merge message (e.g., Merge pull request #123 from branch-name).
*/
merge_commit_title?: "PR_TITLE" | "MERGE_MESSAGE"
/**
* The default value for a merge commit message.
*
* - `PR_TITLE` - default to the pull request's title.
* - `PR_BODY` - default to the pull request's body.
* - `BLANK` - default to a blank commit message.
*/
merge_commit_message?: "PR_BODY" | "PR_TITLE" | "BLANK"
/**
* Whether to allow merge commits for pull requests.
*/
allow_merge_commit?: boolean
/**
* Whether to allow forking this repo
*/
allow_forking?: boolean
/**
* Whether to require contributors to sign off on web-based commits
*/
web_commit_signoff_required?: boolean
open_issues: number
watchers: number
master_branch?: string
starred_at?: string
/**
* Whether anonymous git access is enabled for this repository
*/
anonymous_access_enabled?: boolean
[k: string]: unknown
}
/**
* License Simple
*/
export interface LicenseSimple {
key: string
name: string
url: string | null
spdx_id: string | null
node_id: string
html_url?: string
[k: string]: unknown
}
/**
* Code of Conduct Simple
*/
export interface CodeOfConductSimple {
url: string
key: string
name: string
html_url: string | null
[k: string]: unknown
}