From b0ee510624731fac45e625e03f7865eb2301e243 Mon Sep 17 00:00:00 2001 From: "tangly1024.com" Date: Mon, 17 Jun 2024 17:03:42 +0800 Subject: [PATCH 01/21] =?UTF-8?q?=E7=99=BB=E5=BD=95-clerk=E6=96=B9?= =?UTF-8?q?=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- blog.config.js | 4 +- lib/global.js | 2 +- middleware.ts | 40 ++++ next-env.d.ts | 5 + package.json | 3 + pages/_app.js | 17 +- pages/api/user.ts | 18 ++ pages/{signin.js => sign-in/[[...index]].js} | 13 ++ pages/{signup.js => sign-up/[[...index]].js} | 11 + themes/starter/components/NavBar.js | 112 ++++++----- themes/starter/config.js | 4 +- themes/starter/index.js | 47 +++-- tsconfig.json | 39 ++++ yarn.lock | 199 +++++++++++++++++-- 14 files changed, 421 insertions(+), 93 deletions(-) create mode 100644 middleware.ts create mode 100644 next-env.d.ts create mode 100644 pages/api/user.ts rename pages/{signin.js => sign-in/[[...index]].js} (79%) rename pages/{signup.js => sign-up/[[...index]].js} (86%) create mode 100644 tsconfig.json diff --git a/blog.config.js b/blog.config.js index bd1bb579..f234bd56 100644 --- a/blog.config.js +++ b/blog.config.js @@ -125,8 +125,8 @@ const BLOG = { '/[prefix]': 'LayoutSlug', '/[prefix]/[slug]': 'LayoutSlug', '/[prefix]/[slug]/[...suffix]': 'LayoutSlug', - '/signin': 'LayoutSignIn', - '/signup': 'LayoutSignUp' + '/sign-in/[[...index]]': 'LayoutSignIn', + '/sign-up/[[...index]]': 'LayoutSignUp' }, CAN_COPY: process.env.NEXT_PUBLIC_CAN_COPY || true, // 是否允许复制页面内容 默认允许,如果设置为false、则全栈禁止复制内容。 diff --git a/lib/global.js b/lib/global.js index 71f2a74f..728414a8 100644 --- a/lib/global.js +++ b/lib/global.js @@ -1,9 +1,9 @@ +import { APPEARANCE, LANG, NOTION_PAGE_ID, THEME } from '@/blog.config' import { THEMES, initDarkMode, saveDarkModeToLocalStorage } from '@/themes/theme' -import { APPEARANCE, LANG, NOTION_PAGE_ID, THEME } from 'blog.config' import { useRouter } from 'next/router' import { createContext, useContext, useEffect, useState } from 'react' import { diff --git a/middleware.ts b/middleware.ts new file mode 100644 index 00000000..f01d943c --- /dev/null +++ b/middleware.ts @@ -0,0 +1,40 @@ +import { clerkMiddleware, createRouteMatcher } from '@clerk/nextjs/server' + +/** + * clerk 身份验证中间件 + */ +export const config = { + // 这里设置白名单,防止静态资源被拦截 + matcher: ['/((?!.*\\..*|_next|/sign-in).*)', '/', '/(api|trpc)(.*)'] +} + +// 被保护的路由 + +const isTenantRoute = createRouteMatcher([ + '/user/organization-selector(.*)', + '/user/orgid/(.*)' +]) + +// 被限制权限的路由 +const isTenantAdminRoute = createRouteMatcher([ + '/admin/(.*)/memberships', + '/admin/(.*)/domain' +]) + +// 路由登录及权限检查 +export default clerkMiddleware( + (auth, req) => { + // Restrict admin routes to users with specific permissions + if (isTenantAdminRoute(req)) { + auth().protect(has => { + return ( + has({ permission: 'org:sys_memberships:manage' }) || + has({ permission: 'org:sys_domains_manage' }) + ) + }) + } + // Restrict organization routes to signed in users + if (isTenantRoute(req)) auth().protect() + } + // { debug: process.env.npm_lifecycle_event === 'dev' } // 开发调试模式打印日志 +) diff --git a/next-env.d.ts b/next-env.d.ts new file mode 100644 index 00000000..4f11a03d --- /dev/null +++ b/next-env.d.ts @@ -0,0 +1,5 @@ +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/package.json b/package.json index 69523c55..05e9096a 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "build-all-in-dev": "cross-env VERCEL_ENV=production next build" }, "dependencies": { + "@clerk/nextjs": "^5.1.5", "@headlessui/react": "^1.7.15", "@next/bundle-analyzer": "^12.1.1", "@vercel/analytics": "^1.0.0", @@ -42,6 +43,7 @@ "react-tweet-embed": "~2.0.0" }, "devDependencies": { + "@types/react": "^18.3.3", "@waline/client": "^2.5.1", "autoprefixer": "^10.4.13", "cross-env": "^7.0.3", @@ -59,6 +61,7 @@ "postcss": "^8.4.31", "prettier": "3.2.5", "tailwindcss": "^3.3.2", + "typescript": "^5.4.5", "webpack-bundle-analyzer": "^4.5.0" }, "resolutions": { diff --git a/pages/_app.js b/pages/_app.js index f2fe635a..e052af34 100644 --- a/pages/_app.js +++ b/pages/_app.js @@ -17,6 +17,7 @@ import { getQueryParam } from '../lib/utils' import BLOG from '@/blog.config' import ExternalPlugins from '@/components/ExternalPlugins' import GlobalHead from '@/components/GlobalHead' +import { ClerkProvider } from '@clerk/nextjs' /** * App挂载DOM 入口文件 @@ -47,13 +48,15 @@ const MyApp = ({ Component, pageProps }) => { ) return ( - - - - - - - + + + + + + + + + ) } diff --git a/pages/api/user.ts b/pages/api/user.ts new file mode 100644 index 00000000..f60905c0 --- /dev/null +++ b/pages/api/user.ts @@ -0,0 +1,18 @@ +import { getAuth } from '@clerk/nextjs/server' +import type { NextApiRequest, NextApiResponse } from 'next' +/** + * clerk身份测试 + * @param req + * @param res + * @returns + */ +export default function handler(req: NextApiRequest, res: NextApiResponse) { + const user = getAuth(req) + const { userId } = user + if (!userId) { + return res.status(401).json({ error: 'Unauthorized' }) + } + + // retrieve data from your database + res.status(200).json({ userId }) +} diff --git a/pages/signin.js b/pages/sign-in/[[...index]].js similarity index 79% rename from pages/signin.js rename to pages/sign-in/[[...index]].js index fbf618a4..de668283 100644 --- a/pages/signin.js +++ b/pages/sign-in/[[...index]].js @@ -1,6 +1,8 @@ +// import BLOG from '@/blog.config' import BLOG from '@/blog.config' import { siteConfig } from '@/lib/config' import { getGlobalData } from '@/lib/db/getSiteData' +// import { getGlobalData } from '@/lib/db/getSiteData' import { getLayoutByTheme } from '@/themes/theme' import { useRouter } from 'next/router' @@ -37,4 +39,15 @@ export async function getStaticProps(req) { } } +/** + * catch-all route for clerk + * @returns + */ +export async function getStaticPaths() { + return { + paths: [], + fallback: true + } +} + export default SignIn diff --git a/pages/signup.js b/pages/sign-up/[[...index]].js similarity index 86% rename from pages/signup.js rename to pages/sign-up/[[...index]].js index bbe38129..f2dc9281 100644 --- a/pages/signup.js +++ b/pages/sign-up/[[...index]].js @@ -37,4 +37,15 @@ export async function getStaticProps(req) { } } +/** + * catch-all route for clerk + * @returns + */ +export async function getStaticPaths() { + return { + paths: [], + fallback: true + } +} + export default SignUp diff --git a/themes/starter/components/NavBar.js b/themes/starter/components/NavBar.js index 2d4fda41..f5b1d7af 100644 --- a/themes/starter/components/NavBar.js +++ b/themes/starter/components/NavBar.js @@ -1,21 +1,24 @@ /* eslint-disable no-unreachable */ -import throttle from 'lodash.throttle'; +import { siteConfig } from '@/lib/config' +import { useGlobal } from '@/lib/global' +import { SignedIn, SignedOut, UserButton } from '@clerk/nextjs' +import throttle from 'lodash.throttle' +import { useRouter } from 'next/router' import { useCallback, useEffect, useState } from 'react' -import { MenuList } from './MenuList'; -import { DarkModeButton } from './DarkModeButton'; -import { Logo } from './Logo'; -import { useRouter } from 'next/router'; -import { siteConfig } from '@/lib/config'; -import CONFIG from '../config'; -import { useGlobal } from '@/lib/global'; +import CONFIG from '../config' +import { DarkModeButton } from './DarkModeButton' +import { Logo } from './Logo' +import { MenuList } from './MenuList' /** * 顶部导航栏 */ -export const NavBar = (props) => { +export const NavBar = props => { const router = useRouter() const { isDarkMode } = useGlobal() - const [buttonTextColor, setColor] = useState(router.route === '/' ? 'text-white' : '') + const [buttonTextColor, setColor] = useState( + router.route === '/' ? 'text-white' : '' + ) useEffect(() => { if (isDarkMode || router.route === '/') { setColor('text-white') @@ -33,59 +36,70 @@ export const NavBar = (props) => { const throttleMs = 200 const navBarScollListener = useCallback( throttle(() => { - // eslint-disable-next-line camelcase - const ud_header = document.querySelector('.ud-header'); - const scrollY = window.scrollY; + // eslint-disable-next-line camelcase + const ud_header = document.querySelector('.ud-header') + const scrollY = window.scrollY // 控制台输出当前滚动位置和 sticky 值 if (scrollY > 0) { - ud_header?.classList?.add('sticky'); + ud_header?.classList?.add('sticky') } else { - ud_header?.classList?.remove('sticky'); + ud_header?.classList?.remove('sticky') } }, throttleMs) ) - return <> - {/* */} -
+ return ( + <> + {/* */} +
+
+
+ {/* Logo */} + -
+
+ {/* 中间菜单 */} + -
+ {/* 右侧功能 */} +
+ {/* 深色模式切换 */} + - {/* Logo */} - + {/* 注册登录功能 */} +
+ + + {siteConfig('STARTER_NAV_BUTTON_1_TEXT', null, CONFIG)} + + {/* */} + -
- - {/* 中间菜单 */} - - - {/* 右侧功能 */} - + + + + {/* + {siteConfig('STARTER_NAV_BUTTON_2_TEXT', null, CONFIG)} + */}
+
+
-
- {/* */} +
+ {/* */} + ) } diff --git a/themes/starter/config.js b/themes/starter/config.js index 09321df1..7501141a 100644 --- a/themes/starter/config.js +++ b/themes/starter/config.js @@ -24,10 +24,10 @@ const CONFIG = { // 顶部右侧导航暗流 STARTER_NAV_BUTTON_1_TEXT: 'Sign In', - STARTER_NAV_BUTTON_1_URL: '/signin', + STARTER_NAV_BUTTON_1_URL: '/sign-in', STARTER_NAV_BUTTON_2_TEXT: 'Sign Up', - STARTER_NAV_BUTTON_2_URL: '/signup', + STARTER_NAV_BUTTON_2_URL: '/sign-up', // 特性区块 STARTER_FEATURE_ENABLE: true, // 特性区块开关 diff --git a/themes/starter/index.js b/themes/starter/index.js index 195b7d0f..25c9222d 100644 --- a/themes/starter/index.js +++ b/themes/starter/index.js @@ -33,12 +33,12 @@ import { Style } from './style' // import { MadeWithButton } from './components/MadeWithButton' import BLOG from '@/blog.config' import { loadWowJS } from '@/lib/plugins/wow' +import { SignIn, SignUp } from '@clerk/nextjs' import Link from 'next/link' import { Banner } from './components/Banner' import { SignInForm } from './components/SignInForm' import { SignUpForm } from './components/SignUpForm' import { SVG404 } from './components/svg/SVG404' - /** * 布局框架 * Landing-2 主题用作产品落地页展示 @@ -225,6 +225,7 @@ const LayoutTagIndex = props => <> * @returns */ const LayoutSignIn = props => { + const enableClerk = process.env.NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY return ( <>
@@ -232,7 +233,15 @@ const LayoutSignIn = props => { title='登录' description='这里是演示页面,NotionNext目前不提供会员登录功能' /> - + {/* clerk预置表单 */} + {enableClerk && ( +
+ +
+ )} + + {/* 自定义登录表单 */} + {!enableClerk && }
) @@ -243,17 +252,29 @@ const LayoutSignIn = props => { * @param {*} props * @returns */ -const LayoutSignUp = props => ( - <> -
- - -
- -) +const LayoutSignUp = props => { + const enableClerk = process.env.NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY + return ( + <> +
+ + + {/* clerk预置表单 */} + {enableClerk && ( +
+ +
+ )} + + {/* 自定义登录表单 */} + {!enableClerk && } +
+ + ) +} export { Layout404, diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..89d479ab --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,39 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@/*": ["./*"], + "@/components/*": ["components/*"], + "@/theme/*": ["theme/*"], + "@/data/*": ["data/*"], + "@/lib/*": ["lib/*"], + "@/styles/*": ["styles/*"] + }, + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], + "allowJs": true, + "skipLibCheck": true, + "strict": false, + "noEmit": true, + "incremental": true, + "module": "esnext", + "esModuleInterop": true, + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve" + }, + "include": [ + "next-env.d.ts", + "**/*.js", + "**/*.ts", + "**/*.tsx", + "**/*.jsx" + ], + "exclude": [ + "node_modules" + ] +} diff --git a/yarn.lock b/yarn.lock index c3b330c4..da84d3ac 100644 --- a/yarn.lock +++ b/yarn.lock @@ -149,6 +149,57 @@ dependencies: regenerator-runtime "^0.14.0" +"@clerk/backend@1.2.3": + version "1.2.3" + resolved "https://r.cnpmjs.org/@clerk/backend/-/backend-1.2.3.tgz#b943c3a986da763342eba157469b11bf0ef83c41" + integrity sha512-tj812eTTn2ewXMgr4jwFjpqoXZRF2LMw9UBT+Nat0lmXw55sDA5ou2McLZ67e62WNZwbrCUa51MGKSBhrWnZcA== + dependencies: + "@clerk/shared" "2.3.0" + "@clerk/types" "4.6.0" + cookie "0.5.0" + snakecase-keys "5.4.4" + tslib "2.4.1" + +"@clerk/clerk-react@5.2.4": + version "5.2.4" + resolved "https://r.cnpmjs.org/@clerk/clerk-react/-/clerk-react-5.2.4.tgz#e3b45af2eb5c9650d21522cef2fb132f4e71ee4f" + integrity sha512-TaSjf3pdxUKQIDmwi6JkJDVGwHbs7pTeiwEr2/JksMrQnW6zMIutsEhJfW10dY1hOwJeDoSxGCkHw+7Br2rktw== + dependencies: + "@clerk/shared" "2.3.0" + "@clerk/types" "4.6.0" + tslib "2.4.1" + +"@clerk/nextjs@^5.1.5": + version "5.1.5" + resolved "https://r.cnpmjs.org/@clerk/nextjs/-/nextjs-5.1.5.tgz#559473a0e61af61d43e4e4a3242794db65b0ebfc" + integrity sha512-q/4PvWrIt4cO9dwgUyJ/gN/fWbS2GnfKK7j32cn6LBObVqUIiQ+J5Q+lp75q+tzIHyxFJx+MNNTnFif2OrvV6A== + dependencies: + "@clerk/backend" "1.2.3" + "@clerk/clerk-react" "5.2.4" + "@clerk/shared" "2.3.0" + "@clerk/types" "4.6.0" + crypto-js "4.2.0" + path-to-regexp "6.2.2" + tslib "2.4.1" + +"@clerk/shared@2.3.0": + version "2.3.0" + resolved "https://r.cnpmjs.org/@clerk/shared/-/shared-2.3.0.tgz#5340503948d4e770ef170e64488c1613441fc1d5" + integrity sha512-V/49MoOrALzpu0BbhYDCcKQYIjrHnhRa7QFho9+4wm94oCJgc9j3N5wxndJwj3Ur/fmIyBnjwMzDAT2nZZj47g== + dependencies: + "@clerk/types" "4.6.0" + glob-to-regexp "0.4.1" + js-cookie "3.0.5" + std-env "^3.7.0" + swr "^2.2.0" + +"@clerk/types@4.6.0": + version "4.6.0" + resolved "https://r.cnpmjs.org/@clerk/types/-/types-4.6.0.tgz#2dd88a3ee603f4577606ad8ad1a46ae8c70401ec" + integrity sha512-kowqVGqLfu0Zl2Pteum70MfkGHqBUoHHeR+u2+yWVl1lKHLCiyY1u8ntYBEIolAylBaQNDuRzxyMIDPSxjPE8g== + dependencies: + csstype "3.1.1" + "@corex/deepmerge@^2.6.148": version "2.6.148" resolved "https://registry.yarnpkg.com/@corex/deepmerge/-/deepmerge-2.6.148.tgz#8fa825d53ffd1cbcafce1b6a830eefd3dcc09dd5" @@ -436,6 +487,19 @@ dependencies: undici-types "~5.26.4" +"@types/prop-types@*": + version "15.7.12" + resolved "https://r.cnpmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" + integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== + +"@types/react@^18.3.3": + version "18.3.3" + resolved "https://r.cnpmjs.org/@types/react/-/react-18.3.3.tgz#9679020895318b0915d7a3ab004d92d33375c45f" + integrity sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw== + dependencies: + "@types/prop-types" "*" + csstype "^3.0.2" + "@types/responselike@^1.0.0": version "1.0.3" resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.3.tgz#cc29706f0a397cfe6df89debfe4bf5cea159db50" @@ -1118,6 +1182,11 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== +cookie@0.5.0: + version "0.5.0" + resolved "https://r.cnpmjs.org/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + copy-to-clipboard@^3.3.1: version "3.3.3" resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz#55ac43a1db8ae639a4bd99511c148cdd1b83a1b0" @@ -1141,6 +1210,11 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2: shebang-command "^2.0.0" which "^2.0.1" +crypto-js@4.2.0: + version "4.2.0" + resolved "https://r.cnpmjs.org/crypto-js/-/crypto-js-4.2.0.tgz#4d931639ecdfd12ff80e8186dba6af2c2e856631" + integrity sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q== + css-in-js-utils@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/css-in-js-utils/-/css-in-js-utils-3.1.0.tgz#640ae6a33646d401fc720c54fc61c42cd76ae2bb" @@ -1161,7 +1235,12 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -csstype@^3.1.2, csstype@^3.1.3: +csstype@3.1.1: + version "3.1.1" + resolved "https://r.cnpmjs.org/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" + integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== + +csstype@^3.0.2, csstype@^3.1.2, csstype@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== @@ -1273,6 +1352,14 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" +dot-case@^3.0.4: + version "3.0.4" + resolved "https://r2.cnpmjs.org/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + duplexer@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" @@ -1952,6 +2039,11 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" +glob-to-regexp@0.4.1: + version "0.4.1" + resolved "https://r2.cnpmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + glob@7.1.7: version "7.1.7" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" @@ -2404,6 +2496,11 @@ jiti@^1.19.1: resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== +js-cookie@3.0.5: + version "3.0.5" + resolved "https://r.cnpmjs.org/js-cookie/-/js-cookie-3.0.5.tgz#0b7e2fd0c01552c58ba86e0841f94dc2557dcdbc" + integrity sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw== + js-cookie@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8" @@ -2561,6 +2658,13 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" +lower-case@^2.0.2: + version "2.0.2" + resolved "https://r2.cnpmjs.org/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + lowercase-keys@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" @@ -2602,6 +2706,11 @@ map-age-cleaner@^0.1.3: dependencies: p-defer "^1.0.0" +map-obj@^4.1.0: + version "4.3.0" + resolved "https://r2.cnpmjs.org/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" + integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== + marked@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3" @@ -2788,6 +2897,14 @@ next@14.2.4: "@next/swc-win32-ia32-msvc" "14.2.4" "@next/swc-win32-x64-msvc" "14.2.4" +no-case@^3.0.4: + version "3.0.4" + resolved "https://r2.cnpmjs.org/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + node-releases@^2.0.14: version "2.0.14" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" @@ -3009,6 +3126,11 @@ path-scurry@^1.10.1: lru-cache "^9.1.1 || ^10.0.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" +path-to-regexp@6.2.2: + version "6.2.2" + resolved "https://r.cnpmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz#324377a83e5049cbecadc5554d6a63a9a4866b36" + integrity sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw== + path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" @@ -3594,6 +3716,23 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" +snake-case@^3.0.4: + version "3.0.4" + resolved "https://r2.cnpmjs.org/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" + integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +snakecase-keys@5.4.4: + version "5.4.4" + resolved "https://r.cnpmjs.org/snakecase-keys/-/snakecase-keys-5.4.4.tgz#28745b0175863ffc292ad97d96fe4e8e288a87a2" + integrity sha512-YTywJG93yxwHLgrYLZjlC75moVEX04LZM4FHfihjHe1FCXm+QaLOFfSf535aXOAd0ArVQMWUAe8ZPm4VtWyXaA== + dependencies: + map-obj "^4.1.0" + snake-case "^3.0.4" + type-fest "^2.5.2" + source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" @@ -3648,21 +3787,17 @@ stacktrace-js@^2.0.2: stack-generator "^2.0.5" stacktrace-gps "^3.0.4" +std-env@^3.7.0: + version "3.7.0" + resolved "https://r.cnpmjs.org/std-env/-/std-env-3.7.0.tgz#c9f7386ced6ecf13360b6c6c55b8aaa4ef7481d2" + integrity sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg== + streamsearch@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.1.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -3722,14 +3857,7 @@ string.prototype.trimstart@^1.0.7: define-properties "^1.2.0" es-abstract "^1.22.1" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -3797,6 +3925,14 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +swr@^2.2.0: + version "2.2.5" + resolved "https://r.cnpmjs.org/swr/-/swr-2.2.5.tgz#063eea0e9939f947227d5ca760cc53696f46446b" + integrity sha512-QtxqyclFeAsxEUeZIYmsaQ0UjimSq1RZ9Un7I68/0ClKK/U3LoyQunwkQfJZr2fc22DfIXLNDc2wFyTEikCUpg== + dependencies: + client-only "^0.0.1" + use-sync-external-store "^1.2.0" + synckit@^0.8.6: version "0.8.8" resolved "https://r.cnpmjs.org/synckit/-/synckit-0.8.8.tgz#fe7fe446518e3d3d49f5e429f443cf08b6edfcd7" @@ -3930,6 +4066,16 @@ tsconfig-paths@^3.15.0: minimist "^1.2.6" strip-bom "^3.0.0" +tslib@2.4.1: + version "2.4.1" + resolved "https://r.cnpmjs.org/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" + integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== + +tslib@^2.0.3: + version "2.6.3" + resolved "https://r.cnpmjs.org/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" + integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== + tslib@^2.1.0, tslib@^2.4.0, tslib@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" @@ -3947,6 +4093,11 @@ type-fest@^0.20.2: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== +type-fest@^2.5.2: + version "2.19.0" + resolved "https://r.cnpmjs.org/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" + integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== + typed-array-buffer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" @@ -3986,6 +4137,11 @@ typed-array-length@^1.0.4: for-each "^0.3.3" is-typed-array "^1.1.9" +typescript@^5.4.5: + version "5.4.5" + resolved "https://r.cnpmjs.org/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" + integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== + unbox-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" @@ -4021,6 +4177,11 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +use-sync-external-store@^1.2.0: + version "1.2.2" + resolved "https://r.cnpmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz#c3b6390f3a30eba13200d2302dcdf1e7b57b2ef9" + integrity sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw== + util-deprecate@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" From 55ee4325924378a34fe68526aa15b43ad6ac2f29 Mon Sep 17 00:00:00 2001 From: "tangly1024.com" Date: Mon, 17 Jun 2024 17:39:04 +0800 Subject: [PATCH 02/21] fix build --- next.config.js | 3 +++ pages/api/user.ts | 22 ++++++++++++++-------- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/next.config.js b/next.config.js index ce46d750..b586de22 100644 --- a/next.config.js +++ b/next.config.js @@ -58,6 +58,9 @@ function scanSubdirectories(directory) { */ const nextConfig = { + eslint: { + ignoreDuringBuilds: true + }, output: process.env.EXPORT ? 'export' : undefined, // 多语言, 在export时禁用 i18n: process.env.EXPORT diff --git a/pages/api/user.ts b/pages/api/user.ts index f60905c0..13fb3026 100644 --- a/pages/api/user.ts +++ b/pages/api/user.ts @@ -1,18 +1,24 @@ import { getAuth } from '@clerk/nextjs/server' import type { NextApiRequest, NextApiResponse } from 'next' + /** - * clerk身份测试 + * Clerk 身份测试 * @param req * @param res * @returns */ export default function handler(req: NextApiRequest, res: NextApiResponse) { - const user = getAuth(req) - const { userId } = user - if (!userId) { - return res.status(401).json({ error: 'Unauthorized' }) - } + try { + const { userId } = getAuth(req) - // retrieve data from your database - res.status(200).json({ userId }) + if (!userId) { + return res.status(401).json({ error: 'Unauthorized' }) + } + + // Retrieve data from your database + res.status(200).json({ userId }) + } catch (error) { + console.error(error) + res.status(500).json({ error: 'Internal Server Error' }) + } } From af32458a55683d12ac48c88ccc8c66218b1ce424 Mon Sep 17 00:00:00 2001 From: "tangly1024.com" Date: Mon, 17 Jun 2024 17:54:36 +0800 Subject: [PATCH 03/21] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=B8=BAmodal=E7=99=BB?= =?UTF-8?q?=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/_app.js | 20 ++++++++++---------- themes/starter/components/NavBar.js | 11 ++++++----- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/pages/_app.js b/pages/_app.js index e052af34..b29b8022 100644 --- a/pages/_app.js +++ b/pages/_app.js @@ -47,17 +47,17 @@ const MyApp = ({ Component, pageProps }) => { [queryParam] ) - return ( - - - - - - - - - + const enableClerk = process.env.NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY + const content = ( + + + + + + + ) + return <>{enableClerk ? {content} : content} } export default MyApp diff --git a/themes/starter/components/NavBar.js b/themes/starter/components/NavBar.js index f5b1d7af..52425829 100644 --- a/themes/starter/components/NavBar.js +++ b/themes/starter/components/NavBar.js @@ -1,11 +1,9 @@ /* eslint-disable no-unreachable */ -import { siteConfig } from '@/lib/config' import { useGlobal } from '@/lib/global' -import { SignedIn, SignedOut, UserButton } from '@clerk/nextjs' +import { SignInButton, SignedIn, SignedOut, UserButton } from '@clerk/nextjs' import throttle from 'lodash.throttle' import { useRouter } from 'next/router' import { useCallback, useEffect, useState } from 'react' -import CONFIG from '../config' import { DarkModeButton } from './DarkModeButton' import { Logo } from './Logo' import { MenuList } from './MenuList' @@ -69,7 +67,7 @@ export const NavBar = props => { {/* 注册登录功能 */}
- { )} className={`loginBtn ${buttonTextColor} px-[22px] py-2 text-base font-medium hover:opacity-70`}> {siteConfig('STARTER_NAV_BUTTON_1_TEXT', null, CONFIG)} - + */} + + + {/*