q=d$SD6r_m9NmaxRQdJQb0J4cqq-x?esk%rC1i6WABvr`GK<;7$sfO4^
z@(^lskf%roiR5N*9c+$l)e>GUAhbcE1V
zT%>S@LTm(t7*Q4hVM#{_Hz{-%-6J7HML^gR38AOBLE$omp>_zdVv`-hW04SSQ4sow
zq$mh|?GW}*h!b)r2)8I?cY@GQ?4qzW3PSzP5E4XsX9&riARMGHKzKz%aO(`ABpO1J
zI6z?^g%({P3>Fi+K*))PaEiiE5zrNaPZtOayFwT)$|)SC5aEC@Ld7b
zECxa=2ZS{-5JroO6wXkH?FM0tDC-7cNeqOW6w*ca?hvB7LDmNgz3pDiv@I71;8
zZ6Z5G87pl`Jj+U9uIS#MW$nkZ_J=TE+@Nro!q5Z=3&o}c2#@uLU`vFsSR^Gv=$imx
z4~3;d9suDMh3o+k9ud1JY)ynve;|bAB7Go)aL?CeeL3gs5Q!WmZU+rN#TI#o&g~$9m19j2=9s;
z6fRR3nhD{c*pvz3u?z^dEC`20QWk{1nGp6+I3nb12)8I?XG1t9c2U@x1)=^}2q#4P
zSP0445DrrKPf5Ss_#f+)*_uw(*+n-ngJ
z?)ea+@*r%fv{5`
zRS`Ex*eOg0*~BIib_%5GB54MTIi1Cvfnusco(UbB1yYT@yJkX^>xe&Q$wJ*&-T3Pd
z+xM=YEo+LrR)o3ar{q9U?vgWYW9#GZBnWvn{@4HhfU0|Q=E@yqx#8aR^W>h2?O*`@
zFvZ?Yv*kjCzN+;HHoEOiUo791#i}Qf!55dxp|->*{JvfpQY0^v4|`gFG^qoAM)Kf2
z1~V0R>u)6e&_}FTE>E$A<5wg-ZgpAr&o3#SoSvDJ-6nBwD@(Ol@wEPo%e#0N(n|!alz-d%=#%pAvhD7o
z2k+!&{Sgz9woJ~`^V5|1G4dFu$xq7NMEM5!kgWz@RjkQU%~!Nl0j>0){Wl}%5
zTYTW+wwQz>Pk^m;1wZK>
zGDUPd=@)?U595P3<*%&2nc7h^95ZLVMQMHg$DhH284;KD%1sTp^Pw?QeC>wbd?~5W
z4EF(8|7o5jn`nw3ftkCSz+_YVCzwvYg2kU^dGWOzYPA9DHMBFP##b)7Blo-+U(;c@
zIzTK-gp04@P~*?OeVwNGsVVX|-~>}UZ)zBF74L9-W@`MM*c0KHdA`%bc-}xwGwx4j
zI3H;BP3>oBY&JHBYHH43A=2Ft;0<}*GBrQAJL!rf-GN4Lf1tCe-8HpFup848*YBp*
z8154DCV!Y(6KK|J821d#DK&*S#teAh3>W|{&D5AX$WkD{FT7bBGBlQ?8Sn%>aq+z&
zI-3J7Q?o(CKdA-q4K$X#x*0AA?l1Vl8B6X4kyY3dxQKw%{LRR%;0`boY-~nm?_C8q
zFTMvvZ}yEDaI@r1O|325FPd=!OsyTXm!JiL1KIxc4+i*}981&;8arVKu+fZcy%W?P
z+GbO;-U|wawg4JS&Ub_89R|b$yxKv-KmPv#{K51$lOf3=`U#a8O5gPvSH*$%u=`r(>5SSh&d;Lv%W~!4Jm;GuWf6`|LI-4Rp
z7A9|9i#D}r*qn5Dvo5CA1#V6{ytus^c1b6ER`v$d6GHujF@LiSR;
zyYlVhUx8b|ZQw5OJMaf^54aC7%QBzmReOU
zM;!Yy`y>Yt2TUT;9{>ylk^nbA1>AuefCu0S)C6i_&(+gQ@fuMdMgzbb@Bw^*hJZiN
z2aW@S_1sh)&^7qzCs2*2lfH40k4a=x=O$9U&Hwg@GWo|_zw6Um<_B2
zdLe2o&;#fUL;`#bi(R`L&_g8ESDHBc!Py_+I+6$s00sg{z#xF5gZ-FmMJ<5qgE!y<
z_yT?aC%;AjCp@kdTpB(DmLMBTff)eyK>B}VNdt4#aYSJ}IrTMzLzzRDW1bTahdI}X
zGvKqpKY<^CIY4jdeE>VK5I0){EC!YUOMz105nvgx99RL&1?BkcP2PGsExzHm4Vm<~LLFwPzL;9HBuz(imIFcugI3es99(D;fJC4-&7HX<#*w4{ZUMOLJ|w{eT4E66~JfHONGFARh1pY6D(C9iSf20N@@v
z9pSqm{G)JB28w`GV3iZ%b>If@6Yw+e3vd(o75ELf1>6Si0C$1kfj@wIz$UA
z_VfM5
zT=e~5bK!3Y_yQbfje$mhKhP8i0a%zp;3R-E-$3vHAc3<|A{_mJ=0G!mfn&ivfe0WN
zU3+zp5U0%1GA?qJ5H&HYF}fHlU|DISOedINm`Y8IytK!gMc
zg8^1ItA98!6c`3f1u}p!Kq|m?O9n;(BLJ()Q{Wy6qywzpG!p|wQh?IaITmI%kOgD{
z)~#4kbhGuDEN{-X1>OPJt=<4$2VMpC0WSkPfaieiz&79?z*E3xU?Z>zcm{YH
z*aAEYYz1}$yMPyfoxqE%8cyZxMij`F=Sy&_$muKKJ*ImvnEmrLfZgS7;7#By-~g~6
zV9gu^-UChm$AP23`@j)^-S;rSu+BsHI0lph1A&iB{uF!;I18KxY9k{t;C}+AfKPyr
zfx6JofH`oO(euDXXq?u*f%|LV67Vf>5BLN49k>hJ!E-{b=1PR)2N+j??}6_C&aK>W
zy93-!y8+b!?jvjfzq=UN6d$-6juVrbD?wG@+$)+Zsw_Tfp@iaH1Y3~Op}|{_QHQSI
zB0^Twbbft8Q8Kb8r;Alxm3khEoEp|CBs3%xi-#x(QhfYBLg<TA2Pth-Rso9adJ;eLDhc>Kq*+U)1Af8Sl%UkB)*%Ed#9LxwOC>=$B8&Yk
z6`x4Y*Fp?F==1uxejB&M~T^p?Pnd#vat53yu1bSIs^y{3By0BNbF+r
zE^&+$F1qG`x{CX4kg@kfLR(nAVq9A#w%KSm{VS!4!(FbwH@j%v>EjwK3D+gD#{Q2*pY_(Y+0kxxI-sGZ^)X&vzLN1ps*
zQDCog2oMpX7vw1F7~S1<>(0!acak67qR6|UctbhoF7n!;A#TIwZL>za`_6`18*PgG
zHI({Ls*9(PctrCW`d5vvF!vi*+VrkhRgr5$sfPgO`7y4<_U~-=J^F4v+?M?TIeu1L
zMN~iQAeu&j7n|)@17AgeNF%^YA|P1tRgj4;!N`PlkjxKRBZq$0Wq&WTgh;8UC`3TH
zop`e|60{DeDNo-1QQR+2T~g#ZXpNALc+e4VBAow2Ya$d4CYj~MV5$*f+?mCfqeKkM
z2t`KcGc@go`*&8Q|ElM)15=C<
z&M?%Jb&^fh#XmbJ;gOdc>;Lc3m9^}ZVY%lw{HSMN?~)HKnBIG(Z3k
zB-(rX{cZlcdeq`w!$P=+4>Wy_4O@HS;@&BuEy!;of^jZ5J+Hwo_2YI`t5)25i5Pk)h^z-@Jl>w|XfZn;)?$!&3uWqjNc~&Guq10~#8O=EJ
zhm7kU^S3<^;H2qu=aKHs=6w8kNoCZ_L1JALI+1k{k-y*VM=o`!_0P%>-r_?fj`xcS
zIg?oj8J&75XVqIze&;~_p{HOXlX69)P6)S11awv!i6Nbo26#E}DkQ&)EhVWbYAB#;
zt&JCk?E11Yjx3&H9E1K%I3pqX8Ie?R3tzk*!yEpa92r^0ODIb_V-%ZHv2_&EYqm|#
zR6X+SE{wFW5cGCDg^3#|p>n^y@QB6?ngh@46J8pnC$A5s?c&pDWt^XN@=?oaYa`!S(58tVKp)RhVl>8@
zpLJBy703RkTF!YDQ+j9!=UP0Wi82Jhn?uhr-2XIaG1J`cqQqj@#&lHz>Xj5^7feAS
zJ2SKNuzRykA8IXXUf%z!PeVO~J{{Jxi>BR>x^+TDjVa@t
zr!L%Uix80^*mR+K?RYRn>bE{{Z}WKKEC1A|DZOjO*+l{3Dus5jq#I_-%?QasT>AE_
zwLd-o)xvu68YrGntkaTKY3DK+4U_(RQEw=<&)B)&UcTs}B^tFXz8g>C>r`sM!N?twX8a
zk$&tG^qtbJGDLbOV{7y2{IR{m)}F(wz*ebBI*Cz;>u()&mC@jLwN{gQzgC7=-$|@u
z>ekU%hktc7nf1(2tulmlc-98L(APfxE^}n1&$&+GbH=sK+w%18_1%V@Qw~*zu#Ve!
zu6OR}Nii+gRr>gM7VUZ>XVw{B<(q0Zdau=Y11dvY>n73=B64tdqjleLCSEMO@Omm*
zm16?^E)72HnQLF^_q3b+z29`7@CYn3dELcMrvB$~6MBd*dt&SD6)Qq}p?3wwiuhjG
zdVCWr=JZl_a9p&DRhlZU-Xbv;xv&nrY8H4gTMo^74)-!w0_$k3fH&%WJK&p`jqr&w
z_WbL5i*<ZBztr{~?h_T_VKeon;8?u&CF41{Tg)
zJkytPv1^0R=HbG>KdQkxU+VR*+jN-n{3qY@zM&zQnWO{5#XyFz&gkmV%)iOi5fLg=
z$6!T}%frQj{uq3HlEua}gtQJed*R`tRnuEJHI1WK@1oM^6yZq39FmhFk`s}+;89{3Y=83rH&=?^p;x9w+(VV<
zV+A|w0i(qJM8)NA9cNayb>p^Ps~+dm2Oe8kuXw^3H2`V!O2s!Z7>7~uM}G`|vLWt@
zkrB>%9gr$kA;d%GM^+YYB3Xy1HT!4jflbfMnrg;{S8l5KoT*zU#m(v%{B=&ZP6rTz
zt%eQhs#H;Dpz?vAb!ObEU$<<0tx=VE2oa9i7b~v5wQXQS@5mb?8YH3IhsKC_a$K62
zlY}{AWtupigt2QKh}T55blpOZ>5WMgA|vt
zHd8bnj8a;s(TzLV{*|v6dX?z;&_i11)vbKi*>OSm%*%Qi*aM_-St1W{m7*-MXfWok
zgZR3h&q}YK{3c^-@ymUD`hG1^DPPcpZ
zH92#AwH+^*`9jRDqHqYd^bdKsX9HrUw+_lX<2i4m_DJSQGdpM={R^Oa9rTXy(BkO@
z|L-YBjT2ReDw}b}p4d86aYg>g<0J0ykcCm7#_?0c1d%!njcANCAH^?E>==fwVx6q#
z47%%f?@H%Sjqx4Eu9_#l7^aN%w~owfvR?V3W1W}3jiz`D|=jBcA@836FtFgP%=W>zoAA!`ZqqlznW!x6c)(x=-*v4L@|bN=#5
zyrfH0UcOiv!a51CIJf1HM}Cn$uJoBYQT)K1nTH3uI<{MTw`==t#^zMN?}mw@=}4q*
z9XI$<_n#W~v(2hsnMTEdgr9b{+?_PNmOh6GZ{y`deqBdEP8;k?2+URAq?jlf>qc
zm3>0|I8y0oP1Y5SYIYb=l%mX2GRBBsQqaQYjIQjME=G;QJ*>A(KN>u{X7K
z8KQbu&kLo`bg>pra=`EIo**H6axmYkJXujoLZq+u_0dA{h9uC!5p
znJ;qEm8OyZeSI>QCrMdg)W^W%ja=_fyb{ljgo;F39t*@<>DWA2=PKS_U(%^(&g=Mg
z8=DOMZcP^mj|^0F*aFcl1Kp$Z0x^;kcZ_Min~EA34S#Ch2M)=7~+9&5CD##?nT
zIqEAtGG4M!)XqeVISWObOvISFNTg;eFZ(ynF;>1SSH+_fe#=wz8V_fUW5o%{LP&5%
zmNGWdI=6kxuhX&y*L>eo|N2<;*)bF`Azn_j*VuyUN1T}yW!s<7sdDK9exQ^*Q!a5i7i<`~g_MLfrTxIQACrGxs
z@%go4@9TTv!|!#GM#ZliScDriK{vGyojm6DT~K`D(c_hg#FU9;IcUUwWyUUi%i0Y;
z*qWwwM+jCYI&yNE*q?*Ww|%K-m8*OZ`Ox(T+uE019taQ%RhhS_hZ*9Q}>@Jb~5fm*B?Eub*}779xu#DE7Nhr
zefY|xhp5(hZ65k37N~}K7&D7Dh(y?t)*+WW&NYZQ@M~f@pUFDuW8XRkv)0dIZ4<|b
zcs#azj%*O?5ZB*2IkP-+caOI}_$jqA#O)2@BZP2RXKlXrM7B?#N5{Wg8Nxb^bLh%$
z^LEC6*{sqhXPkmjf#=!rA}C+!Q5WxErRU~N#WBWxQcec_*mhUTL1KEo(nKC49tQ>R
z9Z2r`KOH*rnc>eh_2s*8{H|lJ_t2X6>vjBmtT>Bcf&K7(KrP71ojI>GJXZVtk+AuF
zwDVWB%EGCq^ZP}Lh6Rd4iAoY93zWu+?{F~#T*r5~(brox9MNt1walR@sbV|yaCyA(
z<@)B+dus3c*nf@>Y-XeE(^sGHU$?YgGuX(x>*{lEbtdLtx*IuO+%ePdT&Og5zKGxR
z8Gg+xjb3c9_{A2l!)AVlj2$w{eZkA`ya&4xZ0D1mPhWl~;U5>x@Y7#?rB%}L>t}v|
z&GIDn82-VecRH=SYx+m2oi=ZNE;gi^%kY2kv#E8v_wqYZA2ye^yueir<{X$1y}22L
zIuOL-{aX(23i}`eb_3YkPyV>!`7v$w_k@_VMp7yfbs0b~I|d(JqRIs8giu7jyri
e_;}=%WaegN2kYn9?+u%%ERWbbdaL4{_x}MX-C{!k
diff --git a/components/ui/button.tsx b/components/ui/button.tsx
new file mode 100644
index 0000000..d18eb21
--- /dev/null
+++ b/components/ui/button.tsx
@@ -0,0 +1,57 @@
+import { Slot } from "@radix-ui/react-slot";
+import { type VariantProps, cva } from "class-variance-authority";
+import * as React from "react";
+
+import { cn } from "@/lib/utils";
+
+const buttonVariants = cva(
+ "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
+ {
+ variants: {
+ variant: {
+ default:
+ "bg-primary text-primary-foreground shadow hover:bg-primary/90",
+ destructive:
+ "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",
+ outline:
+ "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",
+ secondary:
+ "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",
+ ghost: "hover:bg-accent hover:text-accent-foreground",
+ link: "text-primary underline-offset-4 hover:underline",
+ },
+ size: {
+ default: "h-9 px-4 py-2",
+ sm: "h-8 rounded-md px-3 text-xs",
+ lg: "h-10 rounded-md px-8",
+ icon: "h-9 w-9",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ size: "default",
+ },
+ },
+);
+
+export interface ButtonProps
+ extends React.ButtonHTMLAttributes,
+ VariantProps {
+ asChild?: boolean;
+}
+
+const Button = React.forwardRef(
+ ({ className, variant, size, asChild = false, ...props }, ref) => {
+ const Comp = asChild ? Slot : "button";
+ return (
+
+ );
+ },
+);
+Button.displayName = "Button";
+
+export { Button, buttonVariants };
diff --git a/components/ui/separator.tsx b/components/ui/separator.tsx
new file mode 100644
index 0000000..d750f7f
--- /dev/null
+++ b/components/ui/separator.tsx
@@ -0,0 +1,31 @@
+"use client";
+
+import * as SeparatorPrimitive from "@radix-ui/react-separator";
+import * as React from "react";
+
+import { cn } from "@/lib/utils";
+
+const Separator = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(
+ (
+ { className, orientation = "horizontal", decorative = true, ...props },
+ ref,
+ ) => (
+
+ ),
+);
+Separator.displayName = SeparatorPrimitive.Root.displayName;
+
+export { Separator };
diff --git a/package.json b/package.json
index b715f3b..3e88d47 100644
--- a/package.json
+++ b/package.json
@@ -18,6 +18,8 @@
"deploy": "bun pages:build && wrangler pages deploy"
},
"dependencies": {
+ "@radix-ui/react-separator": "^1.1.1",
+ "@radix-ui/react-slot": "^1.1.1",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"lucide-react": "^0.469.0",
From 4030f11e30b56b3d90f9c7b2c8c6ad57efe9e3bc Mon Sep 17 00:00:00 2001
From: namidapoo <83203852+ve1997@users.noreply.github.com>
Date: Thu, 26 Dec 2024 09:46:54 +0900
Subject: [PATCH 3/4] =?UTF-8?q?feat:=20=E3=83=88=E3=83=83=E3=83=97?=
=?UTF-8?q?=E3=83=9A=E3=83=BC=E3=82=B8=E4=BD=9C=E6=88=90?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/page.tsx | 125 +++++++++--------------------------
public/github-mark-white.svg | 1 +
2 files changed, 33 insertions(+), 93 deletions(-)
create mode 100644 public/github-mark-white.svg
diff --git a/app/page.tsx b/app/page.tsx
index 0604b54..9aaeda4 100644
--- a/app/page.tsx
+++ b/app/page.tsx
@@ -1,103 +1,42 @@
+import { Button } from "@/components/ui/button";
+import { auth } from "@/lib/auth";
+import GitHub from "@/public/github-mark-white.svg";
import Image from "next/image";
+import Link from "next/link";
export const runtime = "edge";
-export default function Home() {
+export default async function Home() {
+ const session = await auth();
+ if (!session?.user) return null;
+
return (
-
-
-
-
- -
- Get started by editing{" "}
-
- app/page.tsx
-
- .
-
- - Save and see your changes instantly.
-
+
+
);
}
diff --git a/public/github-mark-white.svg b/public/github-mark-white.svg
new file mode 100644
index 0000000..d5e6491
--- /dev/null
+++ b/public/github-mark-white.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
From 017cd39fefe6b6e6d0ca1bd868290846c829b9b5 Mon Sep 17 00:00:00 2001
From: namidapoo <83203852+ve1997@users.noreply.github.com>
Date: Thu, 26 Dec 2024 09:49:35 +0900
Subject: [PATCH 4/4] =?UTF-8?q?feat:=20Session=E3=82=92=E6=8B=A1=E5=BC=B5?=
=?UTF-8?q?=E3=81=97=E3=81=A6github=E3=81=AE=E3=83=A6=E3=83=BC=E3=82=B6?=
=?UTF-8?q?=E3=83=BC=E5=90=8D=E3=82=92=E5=8F=96=E5=BE=97=E3=83=BB=E8=A1=A8?=
=?UTF-8?q?=E7=A4=BA?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/page.tsx | 2 +-
lib/auth.ts | 38 +++++++++++++++++++++++++++++++++++++-
2 files changed, 38 insertions(+), 2 deletions(-)
diff --git a/app/page.tsx b/app/page.tsx
index 9aaeda4..55854de 100644
--- a/app/page.tsx
+++ b/app/page.tsx
@@ -18,7 +18,7 @@ export default async function Home() {
-
Hi, {session.user.name} !
+
Hi, @{session.user.login} !
1年間おつかれさまでした。
diff --git a/lib/auth.ts b/lib/auth.ts
index e8e42a1..85c62c5 100644
--- a/lib/auth.ts
+++ b/lib/auth.ts
@@ -1,5 +1,41 @@
-import NextAuth from "next-auth";
+import NextAuth, { type DefaultSession } from "next-auth";
import GitHub from "next-auth/providers/github";
+import "next-auth/jwt";
+
export const { handlers, auth, signIn, signOut } = NextAuth({
providers: [GitHub],
+ callbacks: {
+ async jwt({ token, profile }) {
+ if (profile) {
+ const { login } = profile;
+ token.user = { ...token.user, login };
+ }
+ return token;
+ },
+ async session({ session, token }) {
+ const { login } = token.user;
+ session.user = { ...session.user, login };
+ return session;
+ },
+ },
});
+declare module "next-auth" {
+ interface Session {
+ user: {
+ login: string;
+ } & DefaultSession["user"];
+ }
+ interface User {
+ login: string;
+ }
+ interface Profile {
+ login: string;
+ }
+}
+declare module "next-auth/jwt" {
+ interface JWT {
+ user: {
+ login: string;
+ };
+ }
+}