@weekend-studio/easyblog-next 0.1.1-beta.1 → 0.1.1-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -25,11 +25,11 @@ declare function NextBlogPage(props: NextBlogPageProps): Promise<React.JSX.Eleme
25
25
 
26
26
  interface NextBlogListPageProps {
27
27
  config: EasyBlogConfig;
28
+ locale?: string;
28
29
  searchParams?: {
29
30
  page?: string;
30
31
  category?: string;
31
32
  tags?: string;
32
- locale?: string;
33
33
  };
34
34
  displayOptions?: {
35
35
  type?: 'grid' | 'list';
@@ -1,2 +1,2 @@
1
- var F=Object.defineProperty;var T=Object.getOwnPropertySymbols;var M=Object.prototype.hasOwnProperty,O=Object.prototype.propertyIsEnumerable;var $=(t,e,o)=>e in t?F(t,e,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[e]=o,k=(t,e)=>{for(var o in e||(e={}))M.call(e,o)&&$(t,o,e[o]);if(T)for(var o of T(e))O.call(e,o)&&$(t,o,e[o]);return t};import{cache as U}from"react";import{notFound as v}from"next/navigation";async function C(t){try{let e=await fetch(`${t.apiUrl}/exchange-token`,{method:"POST",headers:{Authorization:`Bearer ${t.apiKey}`,"x-project-id":t.projectId}});if(!e.ok)throw console.error("Failed to exchange token:",e),new Error("Failed to authenticate");return(await e.json()).token}catch(e){return console.error("Failed to exchange token:",e),null}}var E=t=>t?new Date(t).toISOString().split("T")[0]:"",I=(t,e)=>e<=7?Array.from({length:e},(o,n)=>n+1):t<=3?[1,2,3,4,5,null,e]:t>=e-2?[1,null,e-4,e-3,e-2,e-1,e]:[1,null,t-1,t,t+1,null,e];var S=U(async t=>C(t));async function m(t,e={}){let o=await S(t),n=new URLSearchParams(Object.entries(e).map(([d,y])=>[d,String(y)])).toString(),a=`${t.apiUrl}/sdk/blogs${n?`?${n}`:""}`,r=await fetch(a,{headers:{Authorization:`Bearer ${o}`,"x-project-id":t.projectId},next:{revalidate:60}});if(!r.ok)throw console.error("Failed to fetch blog posts:",r),new Error(`Failed to fetch blog posts: ${r.status} ${r.statusText}`);return await r.json()}async function u(t,e,o){let n=await S(t),a=`${t.apiUrl}/sdk/blogs/${e}${o?`?locale=${o}`:""}`,r=await fetch(a,{headers:{Authorization:`Bearer ${n}`,"x-project-id":t.projectId},next:{revalidate:60}});if(!r.ok)throw new Error(`Failed to fetch blog post: ${r.status} ${r.statusText}`);return r.json()}async function Q(t,e){let o=await m(t,{index:0,limit:1e4,locale:e});return o.blogs?o.blogs.map(n=>({slug:n.slug})):[]}async function _(t,e,o){var n,a;if(e){let r=await u(t,e,o);return r?{title:r.title,description:(n=r.excerpt)==null?void 0:n.substring(0,160),openGraph:{title:r.title,description:(a=r.excerpt)==null?void 0:a.substring(0,160),type:"article",publishedTime:E(r.created_at),tags:r.tags}}:v()}return{title:"Blog",description:"Read our latest blog posts",openGraph:{title:"Blog",description:"Read our latest blog posts",type:"website"}}}import c from"react";import{notFound as j}from"next/navigation";import{ArticleV2 as N,PoweredByV2 as G,ThemeWrapper as V}from"@weekend-studio/easyblog-components";async function W(t){try{let e=await u({apiKey:t.config.apiKey,projectId:t.config.projectId,apiUrl:t.config.apiUrl},t.slug,t.locale);if(!e.blog)return j();let o=e.blog,n=e.html_content,a=e.price_id;return c.createElement(V,{initialMode:t.darkMode?"dark":"light",customTheme:t.customTheme},c.createElement("div",{style:{display:"flex",maxWidth:"1200px",marginLeft:"auto",marginRight:"auto"}},c.createElement(N,{post:o,content:n,showAuthor:t.showAuthor,showDate:t.showDate,showCategory:t.showCategory,showTags:t.showTags,showToc:t.showToc})),a==null&&c.createElement("div",{style:{position:"fixed",bottom:"1rem",right:"1rem",display:"flex",justifyContent:"center",alignItems:"center"}},c.createElement(G,null)))}catch(e){return j()}}import i from"react";import{ArticleGroupV2 as q,ThemeWrapper as z,Pagination as K,PaginationContent as H,PaginationEllipsis as J,PaginationItem as h,PaginationLink as X,PaginationNext as Y,PaginationPrevious as Z}from"@weekend-studio/easyblog-components";var R=9;async function tt(t){var f,b,w,x,B;let e=((f=t.displayOptions)==null?void 0:f.blogPerPage)||R,o=await t.searchParams||{},n=Number(o.page)||1,a=o.locale,r=a?`&locale=${a}`:"",p={index:(n-1)*e,limit:e,category:o.category||"",tags:((b=o.tags)==null?void 0:b.split(","))||[],locale:a},d=await m(t.config,p),{blogs:y,total:A}=d,P=Math.ceil(A/p.limit),L=I(n,P);return i.createElement(z,{initialMode:(w=t.displayOptions)!=null&&w.isDarkMode?"dark":"light",customTheme:(x=t.displayOptions)==null?void 0:x.customTheme},i.createElement(q,k({blogs:y,type:(B=t.displayOptions)==null?void 0:B.type},t.displayOptions)),P>1&&i.createElement(K,{style:{marginTop:"2rem"}},i.createElement(H,null,n>1&&i.createElement(h,null,i.createElement(Z,{href:`/blogs?page=${n-1}${r}`})),L.map((s,D)=>s===null?i.createElement(h,{key:`ellipsis-${D}`},i.createElement(J,null)):i.createElement(h,{key:s},i.createElement(X,{href:`/blogs?page=${s}${r}`,isActive:s===n},s))),n<P&&i.createElement(h,null,i.createElement(Y,{href:`/blogs?page=${n+1}${r}`})))))}export{tt as NextBlogListPage,W as NextBlogPage,_ as generateMetadata,Q as getBlogPaths,u as getBlogPost,m as getBlogPosts};
1
+ var F=Object.defineProperty;var T=Object.getOwnPropertySymbols;var M=Object.prototype.hasOwnProperty,O=Object.prototype.propertyIsEnumerable;var $=(t,e,o)=>e in t?F(t,e,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[e]=o,k=(t,e)=>{for(var o in e||(e={}))M.call(e,o)&&$(t,o,e[o]);if(T)for(var o of T(e))O.call(e,o)&&$(t,o,e[o]);return t};import{cache as U}from"react";import{notFound as v}from"next/navigation";async function C(t){try{let e=await fetch(`${t.apiUrl}/exchange-token`,{method:"POST",headers:{Authorization:`Bearer ${t.apiKey}`,"x-project-id":t.projectId}});if(!e.ok)throw console.error("Failed to exchange token:",e),new Error("Failed to authenticate");return(await e.json()).token}catch(e){return console.error("Failed to exchange token:",e),null}}var E=t=>t?new Date(t).toISOString().split("T")[0]:"",I=(t,e)=>e<=7?Array.from({length:e},(o,n)=>n+1):t<=3?[1,2,3,4,5,null,e]:t>=e-2?[1,null,e-4,e-3,e-2,e-1,e]:[1,null,t-1,t,t+1,null,e];var S=U(async t=>C(t));async function m(t,e={}){let o=await S(t),n=new URLSearchParams(Object.entries(e).map(([p,y])=>[p,String(y)])).toString(),a=`${t.apiUrl}/sdk/blogs${n?`?${n}`:""}`,r=await fetch(a,{headers:{Authorization:`Bearer ${o}`,"x-project-id":t.projectId},next:{revalidate:60}});if(!r.ok)throw console.error("Failed to fetch blog posts:",r),new Error(`Failed to fetch blog posts: ${r.status} ${r.statusText}`);return await r.json()}async function u(t,e,o){let n=await S(t),a=`${t.apiUrl}/sdk/blogs/${e}${o?`?locale=${o}`:""}`,r=await fetch(a,{headers:{Authorization:`Bearer ${n}`,"x-project-id":t.projectId},next:{revalidate:60}});if(!r.ok)throw new Error(`Failed to fetch blog post: ${r.status} ${r.statusText}`);return r.json()}async function Q(t,e){let o=await m(t,{index:0,limit:1e4});return o.blogs?o.blogs.map(n=>({slug:n.slug})):[]}async function _(t,e,o){var n,a;if(e){let r=await u(t,e,o);return r?{title:r.title,description:(n=r.excerpt)==null?void 0:n.substring(0,160),openGraph:{title:r.title,description:(a=r.excerpt)==null?void 0:a.substring(0,160),type:"article",publishedTime:E(r.created_at),tags:r.tags}}:v()}return{title:"Blog",description:"Read our latest blog posts",openGraph:{title:"Blog",description:"Read our latest blog posts",type:"website"}}}import c from"react";import{notFound as j}from"next/navigation";import{ArticleV2 as N,PoweredByV2 as G,ThemeWrapper as V}from"@weekend-studio/easyblog-components";async function W(t){try{let e=await u({apiKey:t.config.apiKey,projectId:t.config.projectId,apiUrl:t.config.apiUrl},t.slug,t.locale);if(!e.blog)return j();let o=e.blog,n=e.html_content,a=e.price_id;return c.createElement(V,{initialMode:t.darkMode?"dark":"light",customTheme:t.customTheme},c.createElement("div",{style:{display:"flex",maxWidth:"1200px",marginLeft:"auto",marginRight:"auto"}},c.createElement(N,{post:o,content:n,showAuthor:t.showAuthor,showDate:t.showDate,showCategory:t.showCategory,showTags:t.showTags,showToc:t.showToc})),a==null&&c.createElement("div",{style:{position:"fixed",bottom:"1rem",right:"1rem",display:"flex",justifyContent:"center",alignItems:"center"}},c.createElement(G,null)))}catch(e){return j()}}import i from"react";import{ArticleGroupV2 as q,ThemeWrapper as z,Pagination as K,PaginationContent as H,PaginationEllipsis as J,PaginationItem as h,PaginationLink as X,PaginationNext as Y,PaginationPrevious as Z}from"@weekend-studio/easyblog-components";var R=9;async function tt(t){var f,b,w,x,B;let e=((f=t.displayOptions)==null?void 0:f.blogPerPage)||R,o=await t.searchParams||{},n=Number(o.page)||1,a=t.locale,r=a?`/${a}/blogs`:"/blogs",d={index:(n-1)*e,limit:e,category:o.category||"",tags:((b=o.tags)==null?void 0:b.split(","))||[],locale:a},p=await m(t.config,d),{blogs:y,total:A}=p,P=Math.ceil(A/d.limit),L=I(n,P);return i.createElement(z,{initialMode:(w=t.displayOptions)!=null&&w.isDarkMode?"dark":"light",customTheme:(x=t.displayOptions)==null?void 0:x.customTheme},i.createElement(q,k({blogs:y,type:(B=t.displayOptions)==null?void 0:B.type},t.displayOptions)),P>1&&i.createElement(K,{style:{marginTop:"2rem"}},i.createElement(H,null,n>1&&i.createElement(h,null,i.createElement(Z,{href:`${r}?page=${n-1}`})),L.map((s,D)=>s===null?i.createElement(h,{key:`ellipsis-${D}`},i.createElement(J,null)):i.createElement(h,{key:s},i.createElement(X,{href:`${r}?page=${s}`,isActive:s===n},s))),n<P&&i.createElement(h,null,i.createElement(Y,{href:`${r}?page=${n+1}`})))))}export{tt as NextBlogListPage,W as NextBlogPage,_ as generateMetadata,Q as getBlogPaths,u as getBlogPost,m as getBlogPosts};
2
2
  //# sourceMappingURL=app-index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/NextAppRouterUtils.ts","../src/BaseUtils.ts","../src/utils.ts","../src/NextBlogPage.tsx","../src/NextBlogListPage.tsx"],"sourcesContent":["import { cache } from \"react\";\nimport { EasyBlogConfig, IQueryParams } from \"./models\";\nimport { Metadata } from \"next\";\nimport { notFound } from \"next/navigation\";\nimport { exchangeToken } from './BaseUtils';\nimport { getFormattedDate } from \"./utils\";\n\n// Cached token getter\nconst getAuthToken = cache(async (config: EasyBlogConfig): Promise<string | null> => {\n return exchangeToken(config);\n});\n \n// Server-side data fetching functions\nasync function getBlogPosts(config: EasyBlogConfig, params: IQueryParams = {}) {\n const token = await getAuthToken(config);\n\n const queryString = new URLSearchParams(\n Object.entries(params).map(([key, value]) => [key, String(value)])\n ).toString();\n\n const url = `${config.apiUrl}/sdk/blogs${queryString ? `?${queryString}` : ''}`;\n\n const response = await fetch(url, {\n headers: { \n 'Authorization': `Bearer ${token}`,\n 'x-project-id': config.projectId\n },\n next: { \n revalidate: 60,\n }\n });\n\n if (!response.ok) {\n console.error('Failed to fetch blog posts:', response);\n throw new Error(`Failed to fetch blog posts: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json();\n return data;\n}\n\nasync function getBlogPost(config: EasyBlogConfig, slug: string, locale?: string) {\n const token = await getAuthToken(config);\n\n const url = `${config.apiUrl}/sdk/blogs/${slug}${locale ? `?locale=${locale}` : ''}`;\n const response = await fetch(url, {\n headers: { \n 'Authorization': `Bearer ${token}`,\n 'x-project-id': config.projectId\n },\n next: { \n revalidate: 60,\n }\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch blog post: ${response.status} ${response.statusText}`);\n }\n\n return response.json();\n}\n\nasync function getBlogPaths(config: EasyBlogConfig, locale?: string) {\n const res = await getBlogPosts(config, { index: 0, limit: 10000, locale });\n if (!res.blogs) return [];\n return res.blogs.map((blog: any) => ({ slug: blog.slug }));\n}\n\nasync function generateMetadata(config: EasyBlogConfig, slug?: string, locale?: string): Promise<Metadata> {\n if (slug) {\n const post = await getBlogPost(config, slug, locale);\n if (!post) return notFound();\n\n return {\n title: post.title,\n description: post.excerpt?.substring(0, 160),\n openGraph: {\n title: post.title,\n description: post.excerpt?.substring(0, 160),\n type: 'article',\n publishedTime: getFormattedDate(post.created_at),\n tags: post.tags,\n },\n };\n }\n\n return {\n title: 'Blog',\n description: 'Read our latest blog posts',\n openGraph: {\n title: 'Blog',\n description: 'Read our latest blog posts',\n type: 'website',\n },\n };\n}\n\n// Server exports\nexport {\n generateMetadata,\n getBlogPost,\n getBlogPosts,\n getBlogPaths,\n};\n","// Base functionality shared between both routers\nimport { EasyBlogConfig, IQueryParams } from \"./models\";\n\nexport async function exchangeToken(config: EasyBlogConfig): Promise<string | null> {\n try {\n const response = await fetch(`${config.apiUrl}/exchange-token`, {\n method: 'POST',\n headers: { \n 'Authorization': `Bearer ${config.apiKey}`,\n 'x-project-id': config.projectId\n }\n });\n\n if (!response.ok) {\n console.error('Failed to exchange token:', response);\n throw new Error('Failed to authenticate');\n }\n\n const data = await response.json();\n return data.token;\n } catch (error) {\n console.error('Failed to exchange token:', error);\n return null;\n }\n}\n\n\nexport async function getBlogPostsBase(config: EasyBlogConfig, params: IQueryParams = {}) {\n const token = await exchangeToken(config);\n\n const queryString = new URLSearchParams(\n Object.entries(params).map(([key, value]) => [key, String(value)])\n ).toString();\n\n const url = `${config.apiUrl}/sdk/blogs${queryString ? `?${queryString}` : ''}`;\n\n return { url, token };\n}\n\nexport async function getBlogPostBase(config: EasyBlogConfig, slug: string, locale?: string) {\n const token = await exchangeToken(config);\n const url = `${config.apiUrl}/sdk/blogs/${slug}${locale ? `?locale=${locale}` : ''}`;\n return { url, token };\n}","import { IQueryParams } from \"./models\";\n\nexport function buildQueryParams(params: IQueryParams): string {\n const queryParams = new URLSearchParams();\n params.index && queryParams.set('index', params.index.toString());\n params.limit && queryParams.set('limit', params.limit.toString());\n if (params.category) queryParams.set('category', params.category);\n if (params.tags) queryParams.set('tags', [params.tags].join(','));\n return queryParams.toString();\n}\n\nexport const getFormattedDate = (date: Date) => {\n if (!date) return '';\n return new Date(date).toISOString().split('T')[0];\n}\n\n// Helper function to generate visible page numbers\nexport const getVisiblePages = (current: number, total: number) => {\n if (total <= 7) return Array.from({ length: total }, (_, i) => i + 1);\n \n if (current <= 3) return [1, 2, 3, 4, 5, null, total];\n if (current >= total - 2) return [1, null, total - 4, total - 3, total - 2, total - 1, total];\n \n return [1, null, current - 1, current, current + 1, null, total];\n};","import React from 'react';\nimport { notFound } from 'next/navigation'\nimport { ArticleV2, PoweredByV2, Theme, ThemeWrapper } from '@weekend-studio/easyblog-components';\nimport { EasyBlogConfig } from './models';\nimport { getBlogPost } from './NextAppRouterUtils';\n\ninterface NextBlogPageProps {\n config: EasyBlogConfig;\n darkMode?: boolean;\n showAuthor?: boolean;\n showDate?: boolean;\n showCategory?: boolean;\n showTags?: boolean;\n slug: string;\n locale?: string;\n style?: React.CSSProperties;\n showToc?: boolean;\n customTheme?: Theme;\n}\n\nexport async function NextBlogPage(props: NextBlogPageProps) {\n try {\n const response = await getBlogPost({\n apiKey: props.config.apiKey,\n projectId: props.config.projectId,\n apiUrl: props.config.apiUrl\n }, props.slug, props.locale);\n if (!response.blog) return notFound();\n const post = response.blog;\n const htmlContent = response.html_content;\n const price_id = response.price_id;\n\n return (\n <ThemeWrapper \n initialMode={props.darkMode ? 'dark' : 'light'} \n customTheme={props.customTheme}>\n <div style={{ display: 'flex', maxWidth: '1200px', marginLeft: 'auto', marginRight: 'auto' }}>\n <ArticleV2 \n post={post} \n content={htmlContent}\n showAuthor={props.showAuthor}\n showDate={props.showDate}\n showCategory={props.showCategory}\n showTags={props.showTags}\n showToc={props.showToc}\n />\n </div>\n {price_id == null && \n <div style={{ position: 'fixed', bottom: '1rem', right: '1rem', display: 'flex', justifyContent: 'center', alignItems: 'center' }}>\n <PoweredByV2 />\n </div>\n }\n </ThemeWrapper>\n );\n } catch (error) {\n return notFound();\n }\n}\n","import React from 'react';\nimport { getBlogPosts } from './NextAppRouterUtils';\nimport { \n ArticleGroupV2, \n ThemeWrapper,\n Pagination,\n PaginationContent,\n PaginationEllipsis,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n Theme,\n} from '@weekend-studio/easyblog-components';\nimport { EasyBlogConfig, IQueryParams } from './models';\nimport { getVisiblePages } from './utils';\n\nconst DEFAULT_BLOG_PER_PAGE = 9;\n\ninterface NextBlogListPageProps {\n config: EasyBlogConfig;\n searchParams?: {\n page?: string;\n category?: string;\n tags?: string;\n locale?: string;\n };\n displayOptions?: {\n type?: 'grid' | 'list';\n isDarkMode?: boolean;\n showThumbnail?: boolean;\n showReadingTime?: boolean;\n showExcerpt?: boolean;\n showTags?: boolean;\n showDate?: boolean;\n showAuthor?: boolean;\n showCategory?: boolean;\n isNextPage?: boolean;\n blogPerPage?: number;\n customTheme?: Theme;\n }\n}\n\nexport async function NextBlogListPage(props: NextBlogListPageProps) {\n const postsPerPage = props.displayOptions?.blogPerPage || DEFAULT_BLOG_PER_PAGE;\n const searchParams = await props.searchParams || {};\n const currentPage = Number(searchParams.page) || 1;\n\n const locale = searchParams.locale;\n const localeParam = locale ? `&locale=${locale}` : '';\n\n const queryParams: IQueryParams = {\n index: (currentPage - 1) * postsPerPage,\n limit: postsPerPage,\n category: searchParams.category || '',\n tags: searchParams.tags?.split(',') || [],\n locale,\n }\n\n const res = await getBlogPosts(\n props.config, \n queryParams\n );\n\n const { blogs, total } = res;\n\n const totalPages = Math.ceil(total / queryParams.limit!);\n const visiblePages = getVisiblePages(currentPage, totalPages);\n\n return (\n <ThemeWrapper \n initialMode={props.displayOptions?.isDarkMode ? 'dark': 'light'}\n customTheme={props.displayOptions?.customTheme} \n >\n <ArticleGroupV2\n blogs={blogs} \n type={props.displayOptions?.type}\n {...props.displayOptions}\n />\n {totalPages > 1 && (\n <Pagination style={{ marginTop: '2rem' }}>\n <PaginationContent>\n {currentPage > 1 && (\n <PaginationItem>\n <PaginationPrevious href={`/blogs?page=${currentPage - 1}${localeParam}`} />\n </PaginationItem>\n )}\n\n {visiblePages.map((pageNum, idx) => (\n pageNum === null ? (\n <PaginationItem key={`ellipsis-${idx}`}>\n <PaginationEllipsis />\n </PaginationItem>\n ) : (\n <PaginationItem key={pageNum}>\n <PaginationLink\n href={`/blogs?page=${pageNum}${localeParam}`}\n isActive={pageNum === currentPage}\n >\n {pageNum}\n </PaginationLink>\n </PaginationItem>\n )\n ))}\n\n {currentPage < totalPages && (\n <PaginationItem>\n <PaginationNext href={`/blogs?page=${currentPage + 1}${localeParam}`} />\n </PaginationItem>\n )}\n </PaginationContent>\n </Pagination>\n )}\n </ThemeWrapper>\n );\n}\n"],"mappings":"yVAAA,OAAS,SAAAA,MAAa,QAGtB,OAAS,YAAAC,MAAgB,kBCAzB,eAAsBC,EAAcC,EAAgD,CAClF,GAAI,CACF,IAAMC,EAAW,MAAM,MAAM,GAAGD,EAAO,MAAM,kBAAmB,CAC9D,OAAQ,OACR,QAAS,CACP,cAAiB,UAAUA,EAAO,MAAM,GACxC,eAAgBA,EAAO,SACzB,CACF,CAAC,EAED,GAAI,CAACC,EAAS,GACZ,cAAQ,MAAM,4BAA6BA,CAAQ,EAC7C,IAAI,MAAM,wBAAwB,EAI1C,OADa,MAAMA,EAAS,KAAK,GACrB,KACd,OAASC,EAAO,CACd,eAAQ,MAAM,4BAA6BA,CAAK,EACzC,IACT,CACF,CCbO,IAAMC,EAAoBC,GAC1BA,EACE,IAAI,KAAKA,CAAI,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC,EAD9B,GAKPC,EAAkB,CAACC,EAAiBC,IAC3CA,GAAS,EAAU,MAAM,KAAK,CAAE,OAAQA,CAAM,EAAG,CAACC,EAAGC,IAAMA,EAAI,CAAC,EAEhEH,GAAW,EAAU,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,KAAMC,CAAK,EAChDD,GAAWC,EAAQ,EAAU,CAAC,EAAG,KAAMA,EAAQ,EAAGA,EAAQ,EAAGA,EAAQ,EAAGA,EAAQ,EAAGA,CAAK,EAErF,CAAC,EAAG,KAAMD,EAAU,EAAGA,EAASA,EAAU,EAAG,KAAMC,CAAK,EFfjE,IAAMG,EAAeC,EAAM,MAAOC,GACzBC,EAAcD,CAAM,CAC5B,EAGD,eAAeE,EAAaF,EAAwBG,EAAuB,CAAC,EAAG,CAC7E,IAAMC,EAAQ,MAAMN,EAAaE,CAAM,EAEjCK,EAAc,IAAI,gBACtB,OAAO,QAAQF,CAAM,EAAE,IAAI,CAAC,CAACG,EAAKC,CAAK,IAAM,CAACD,EAAK,OAAOC,CAAK,CAAC,CAAC,CACnE,EAAE,SAAS,EAELC,EAAM,GAAGR,EAAO,MAAM,aAAaK,EAAc,IAAIA,CAAW,GAAK,EAAE,GAEvEI,EAAW,MAAM,MAAMD,EAAK,CAChC,QAAS,CACP,cAAiB,UAAUJ,CAAK,GAChC,eAAgBJ,EAAO,SACzB,EACA,KAAM,CACF,WAAY,EAChB,CACF,CAAC,EAED,GAAI,CAACS,EAAS,GACZ,cAAQ,MAAM,8BAA+BA,CAAQ,EAC/C,IAAI,MAAM,+BAA+BA,EAAS,MAAM,IAAIA,EAAS,UAAU,EAAE,EAIzF,OADa,MAAMA,EAAS,KAAK,CAEnC,CAEA,eAAeC,EAAYV,EAAwBW,EAAcC,EAAiB,CAChF,IAAMR,EAAQ,MAAMN,EAAaE,CAAM,EAEjCQ,EAAM,GAAGR,EAAO,MAAM,cAAcW,CAAI,GAAGC,EAAS,WAAWA,CAAM,GAAK,EAAE,GAC5EH,EAAW,MAAM,MAAMD,EAAK,CAChC,QAAS,CACP,cAAiB,UAAUJ,CAAK,GAChC,eAAgBJ,EAAO,SACzB,EACA,KAAM,CACJ,WAAY,EACd,CACF,CAAC,EAED,GAAI,CAACS,EAAS,GACZ,MAAM,IAAI,MAAM,8BAA8BA,EAAS,MAAM,IAAIA,EAAS,UAAU,EAAE,EAGxF,OAAOA,EAAS,KAAK,CACvB,CAEA,eAAeI,EAAab,EAAwBY,EAAiB,CACnE,IAAME,EAAM,MAAMZ,EAAaF,EAAQ,CAAE,MAAO,EAAG,MAAO,IAAO,OAAAY,CAAO,CAAC,EACzE,OAAKE,EAAI,MACFA,EAAI,MAAM,IAAKC,IAAe,CAAE,KAAMA,EAAK,IAAK,EAAE,EADlC,CAAC,CAE1B,CAEA,eAAeC,EAAiBhB,EAAwBW,EAAeC,EAAoC,CApE3G,IAAAK,EAAAC,EAqEE,GAAIP,EAAM,CACR,IAAMQ,EAAO,MAAMT,EAAYV,EAAQW,EAAMC,CAAM,EACnD,OAAKO,EAEE,CACL,MAAOA,EAAK,MACZ,aAAaF,EAAAE,EAAK,UAAL,YAAAF,EAAc,UAAU,EAAG,KACxC,UAAW,CACT,MAAOE,EAAK,MACZ,aAAaD,EAAAC,EAAK,UAAL,YAAAD,EAAc,UAAU,EAAG,KACxC,KAAM,UACN,cAAeE,EAAiBD,EAAK,UAAU,EAC/C,KAAMA,EAAK,IACb,CACF,EAZkBE,EAAS,CAa7B,CAEA,MAAO,CACL,MAAO,OACP,YAAa,6BACb,UAAW,CACT,MAAO,OACP,YAAa,6BACb,KAAM,SACR,CACF,CACF,CG/FA,OAAOC,MAAW,QAClB,OAAS,YAAAC,MAAgB,kBACzB,OAAS,aAAAC,EAAW,eAAAC,EAAoB,gBAAAC,MAAoB,sCAkB5D,eAAsBC,EAAaC,EAA0B,CAC3D,GAAI,CACF,IAAMC,EAAW,MAAMC,EAAY,CACjC,OAAQF,EAAM,OAAO,OACrB,UAAWA,EAAM,OAAO,UACxB,OAAQA,EAAM,OAAO,MACvB,EAAGA,EAAM,KAAMA,EAAM,MAAM,EAC3B,GAAI,CAACC,EAAS,KAAM,OAAOE,EAAS,EACpC,IAAMC,EAAOH,EAAS,KAChBI,EAAcJ,EAAS,aACvBK,EAAWL,EAAS,SAE1B,OACEM,EAAA,cAACC,EAAA,CACC,YAAaR,EAAM,SAAW,OAAS,QACvC,YAAaA,EAAM,aACnBO,EAAA,cAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,SAAU,SAAU,WAAY,OAAQ,YAAa,MAAO,GACvFA,EAAA,cAACE,EAAA,CACC,KAAML,EACN,QAASC,EACT,WAAYL,EAAM,WAClB,SAAUA,EAAM,SAChB,aAAcA,EAAM,aACpB,SAAUA,EAAM,SAChB,QAASA,EAAM,QACjB,CACJ,EACCM,GAAY,MACXC,EAAA,cAAC,OAAI,MAAO,CAAE,SAAU,QAAS,OAAQ,OAAQ,MAAO,OAAQ,QAAS,OAAQ,eAAgB,SAAU,WAAY,QAAS,GAC9HA,EAAA,cAACG,EAAA,IAAY,CACf,CAEJ,CAEJ,OAASC,EAAO,CACd,OAAOR,EAAS,CAClB,CACF,CCzDA,OAAOS,MAAW,QAElB,OACE,kBAAAC,EACA,gBAAAC,EACA,cAAAC,EACA,qBAAAC,EACA,sBAAAC,EACA,kBAAAC,EACA,kBAAAC,EACA,kBAAAC,EACA,sBAAAC,MAEK,sCAIP,IAAMC,EAAwB,EA0B9B,eAAsBC,GAAiBC,EAA8B,CA3CrE,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EA4CE,IAAMC,IAAeL,EAAAD,EAAM,iBAAN,YAAAC,EAAsB,cAAeH,EACpDS,EAAe,MAAMP,EAAM,cAAgB,CAAC,EAC5CQ,EAAc,OAAOD,EAAa,IAAI,GAAK,EAE3CE,EAASF,EAAa,OACtBG,EAAcD,EAAS,WAAWA,CAAM,GAAK,GAE7CE,EAA4B,CAChC,OAAQH,EAAc,GAAKF,EAC3B,MAAOA,EACP,SAAUC,EAAa,UAAY,GACnC,OAAML,EAAAK,EAAa,OAAb,YAAAL,EAAmB,MAAM,OAAQ,CAAC,EACxC,OAAAO,CACF,EAEMG,EAAM,MAAMC,EAChBb,EAAM,OACNW,CACF,EAEM,CAAE,MAAAG,EAAO,MAAAC,CAAM,EAAIH,EAEnBI,EAAa,KAAK,KAAKD,EAAQJ,EAAY,KAAM,EACjDM,EAAeC,EAAgBV,EAAaQ,CAAU,EAE5D,OACEG,EAAA,cAACC,EAAA,CACC,aAAajB,EAAAH,EAAM,iBAAN,MAAAG,EAAsB,WAAa,OAAQ,QACxD,aAAaC,EAAAJ,EAAM,iBAAN,YAAAI,EAAsB,aAEnCe,EAAA,cAACE,EAAAC,EAAA,CACC,MAAOR,EACP,MAAMT,EAAAL,EAAM,iBAAN,YAAAK,EAAsB,MACxBL,EAAM,eACZ,EACCgB,EAAa,GACZG,EAAA,cAACI,EAAA,CAAW,MAAO,CAAE,UAAW,MAAO,GACrCJ,EAAA,cAACK,EAAA,KACEhB,EAAc,GACbW,EAAA,cAACM,EAAA,KACCN,EAAA,cAACO,EAAA,CAAmB,KAAM,eAAelB,EAAc,CAAC,GAAGE,CAAW,GAAI,CAC5E,EAGDO,EAAa,IAAI,CAACU,EAASC,IAC1BD,IAAY,KACVR,EAAA,cAACM,EAAA,CAAe,IAAK,YAAYG,CAAG,IAClCT,EAAA,cAACU,EAAA,IAAmB,CACtB,EAEAV,EAAA,cAACM,EAAA,CAAe,IAAKE,GACnBR,EAAA,cAACW,EAAA,CACC,KAAM,eAAeH,CAAO,GAAGjB,CAAW,GAC1C,SAAUiB,IAAYnB,GAErBmB,CACH,CACF,CAEH,EAEAnB,EAAcQ,GACbG,EAAA,cAACM,EAAA,KACCN,EAAA,cAACY,EAAA,CAAe,KAAM,eAAevB,EAAc,CAAC,GAAGE,CAAW,GAAI,CACxE,CAEF,CACF,CAEN,CAEJ","names":["cache","notFound","exchangeToken","config","response","error","getFormattedDate","date","getVisiblePages","current","total","_","i","getAuthToken","cache","config","exchangeToken","getBlogPosts","params","token","queryString","key","value","url","response","getBlogPost","slug","locale","getBlogPaths","res","blog","generateMetadata","_a","_b","post","getFormattedDate","notFound","React","notFound","ArticleV2","PoweredByV2","ThemeWrapper","NextBlogPage","props","response","getBlogPost","notFound","post","htmlContent","price_id","React","ThemeWrapper","ArticleV2","PoweredByV2","error","React","ArticleGroupV2","ThemeWrapper","Pagination","PaginationContent","PaginationEllipsis","PaginationItem","PaginationLink","PaginationNext","PaginationPrevious","DEFAULT_BLOG_PER_PAGE","NextBlogListPage","props","_a","_b","_c","_d","_e","postsPerPage","searchParams","currentPage","locale","localeParam","queryParams","res","getBlogPosts","blogs","total","totalPages","visiblePages","getVisiblePages","React","ThemeWrapper","ArticleGroupV2","__spreadValues","Pagination","PaginationContent","PaginationItem","PaginationPrevious","pageNum","idx","PaginationEllipsis","PaginationLink","PaginationNext"]}
1
+ {"version":3,"sources":["../src/NextAppRouterUtils.ts","../src/BaseUtils.ts","../src/utils.ts","../src/NextBlogPage.tsx","../src/NextBlogListPage.tsx"],"sourcesContent":["import { cache } from \"react\";\nimport { EasyBlogConfig, IQueryParams } from \"./models\";\nimport { Metadata } from \"next\";\nimport { notFound } from \"next/navigation\";\nimport { exchangeToken } from './BaseUtils';\nimport { getFormattedDate } from \"./utils\";\n\n// Cached token getter\nconst getAuthToken = cache(async (config: EasyBlogConfig): Promise<string | null> => {\n return exchangeToken(config);\n});\n \n// Server-side data fetching functions\nasync function getBlogPosts(config: EasyBlogConfig, params: IQueryParams = {}) {\n const token = await getAuthToken(config);\n\n const queryString = new URLSearchParams(\n Object.entries(params).map(([key, value]) => [key, String(value)])\n ).toString();\n\n const url = `${config.apiUrl}/sdk/blogs${queryString ? `?${queryString}` : ''}`;\n\n const response = await fetch(url, {\n headers: { \n 'Authorization': `Bearer ${token}`,\n 'x-project-id': config.projectId\n },\n next: { \n revalidate: 60,\n }\n });\n\n if (!response.ok) {\n console.error('Failed to fetch blog posts:', response);\n throw new Error(`Failed to fetch blog posts: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json();\n return data;\n}\n\nasync function getBlogPost(config: EasyBlogConfig, slug: string, locale?: string) {\n const token = await getAuthToken(config);\n\n const url = `${config.apiUrl}/sdk/blogs/${slug}${locale ? `?locale=${locale}` : ''}`;\n const response = await fetch(url, {\n headers: { \n 'Authorization': `Bearer ${token}`,\n 'x-project-id': config.projectId\n },\n next: { \n revalidate: 60,\n }\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch blog post: ${response.status} ${response.statusText}`);\n }\n\n return response.json();\n}\n\nasync function getBlogPaths(config: EasyBlogConfig, locale?: string) {\n const res = await getBlogPosts(config, { index: 0, limit: 10000});\n if (!res.blogs) return [];\n return res.blogs.map((blog: any) => ({ slug: blog.slug }));\n}\n\nasync function generateMetadata(config: EasyBlogConfig, slug?: string, locale?: string): Promise<Metadata> {\n if (slug) {\n const post = await getBlogPost(config, slug, locale);\n if (!post) return notFound();\n\n return {\n title: post.title,\n description: post.excerpt?.substring(0, 160),\n openGraph: {\n title: post.title,\n description: post.excerpt?.substring(0, 160),\n type: 'article',\n publishedTime: getFormattedDate(post.created_at),\n tags: post.tags,\n },\n };\n }\n\n return {\n title: 'Blog',\n description: 'Read our latest blog posts',\n openGraph: {\n title: 'Blog',\n description: 'Read our latest blog posts',\n type: 'website',\n },\n };\n}\n\n// Server exports\nexport {\n generateMetadata,\n getBlogPost,\n getBlogPosts,\n getBlogPaths,\n};\n","// Base functionality shared between both routers\nimport { EasyBlogConfig, IQueryParams } from \"./models\";\n\nexport async function exchangeToken(config: EasyBlogConfig): Promise<string | null> {\n try {\n const response = await fetch(`${config.apiUrl}/exchange-token`, {\n method: 'POST',\n headers: { \n 'Authorization': `Bearer ${config.apiKey}`,\n 'x-project-id': config.projectId\n }\n });\n\n if (!response.ok) {\n console.error('Failed to exchange token:', response);\n throw new Error('Failed to authenticate');\n }\n\n const data = await response.json();\n return data.token;\n } catch (error) {\n console.error('Failed to exchange token:', error);\n return null;\n }\n}\n\n\nexport async function getBlogPostsBase(config: EasyBlogConfig, params: IQueryParams = {}) {\n const token = await exchangeToken(config);\n\n const queryString = new URLSearchParams(\n Object.entries(params).map(([key, value]) => [key, String(value)])\n ).toString();\n\n const url = `${config.apiUrl}/sdk/blogs${queryString ? `?${queryString}` : ''}`;\n\n return { url, token };\n}\n\nexport async function getBlogPostBase(config: EasyBlogConfig, slug: string, locale?: string) {\n const token = await exchangeToken(config);\n const url = `${config.apiUrl}/sdk/blogs/${slug}${locale ? `?locale=${locale}` : ''}`;\n return { url, token };\n}","import { IQueryParams } from \"./models\";\n\nexport function buildQueryParams(params: IQueryParams): string {\n const queryParams = new URLSearchParams();\n params.index && queryParams.set('index', params.index.toString());\n params.limit && queryParams.set('limit', params.limit.toString());\n if (params.category) queryParams.set('category', params.category);\n if (params.tags) queryParams.set('tags', [params.tags].join(','));\n return queryParams.toString();\n}\n\nexport const getFormattedDate = (date: Date) => {\n if (!date) return '';\n return new Date(date).toISOString().split('T')[0];\n}\n\n// Helper function to generate visible page numbers\nexport const getVisiblePages = (current: number, total: number) => {\n if (total <= 7) return Array.from({ length: total }, (_, i) => i + 1);\n \n if (current <= 3) return [1, 2, 3, 4, 5, null, total];\n if (current >= total - 2) return [1, null, total - 4, total - 3, total - 2, total - 1, total];\n \n return [1, null, current - 1, current, current + 1, null, total];\n};","import React from 'react';\nimport { notFound } from 'next/navigation'\nimport { ArticleV2, PoweredByV2, Theme, ThemeWrapper } from '@weekend-studio/easyblog-components';\nimport { EasyBlogConfig } from './models';\nimport { getBlogPost } from './NextAppRouterUtils';\n\ninterface NextBlogPageProps {\n config: EasyBlogConfig;\n darkMode?: boolean;\n showAuthor?: boolean;\n showDate?: boolean;\n showCategory?: boolean;\n showTags?: boolean;\n slug: string;\n locale?: string;\n style?: React.CSSProperties;\n showToc?: boolean;\n customTheme?: Theme;\n}\n\nexport async function NextBlogPage(props: NextBlogPageProps) {\n try {\n const response = await getBlogPost({\n apiKey: props.config.apiKey,\n projectId: props.config.projectId,\n apiUrl: props.config.apiUrl\n }, props.slug, props.locale);\n if (!response.blog) return notFound();\n const post = response.blog;\n const htmlContent = response.html_content;\n const price_id = response.price_id;\n\n return (\n <ThemeWrapper \n initialMode={props.darkMode ? 'dark' : 'light'} \n customTheme={props.customTheme}>\n <div style={{ display: 'flex', maxWidth: '1200px', marginLeft: 'auto', marginRight: 'auto' }}>\n <ArticleV2 \n post={post} \n content={htmlContent}\n showAuthor={props.showAuthor}\n showDate={props.showDate}\n showCategory={props.showCategory}\n showTags={props.showTags}\n showToc={props.showToc}\n />\n </div>\n {price_id == null && \n <div style={{ position: 'fixed', bottom: '1rem', right: '1rem', display: 'flex', justifyContent: 'center', alignItems: 'center' }}>\n <PoweredByV2 />\n </div>\n }\n </ThemeWrapper>\n );\n } catch (error) {\n return notFound();\n }\n}\n","import React from 'react';\nimport { getBlogPosts } from './NextAppRouterUtils';\nimport { \n ArticleGroupV2, \n ThemeWrapper,\n Pagination,\n PaginationContent,\n PaginationEllipsis,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n Theme,\n} from '@weekend-studio/easyblog-components';\nimport { EasyBlogConfig, IQueryParams } from './models';\nimport { getVisiblePages } from './utils';\n\nconst DEFAULT_BLOG_PER_PAGE = 9;\n\ninterface NextBlogListPageProps {\n config: EasyBlogConfig;\n locale?: string;\n searchParams?: {\n page?: string;\n category?: string;\n tags?: string;\n };\n displayOptions?: {\n type?: 'grid' | 'list';\n isDarkMode?: boolean;\n showThumbnail?: boolean;\n showReadingTime?: boolean;\n showExcerpt?: boolean;\n showTags?: boolean;\n showDate?: boolean;\n showAuthor?: boolean;\n showCategory?: boolean;\n isNextPage?: boolean;\n blogPerPage?: number;\n customTheme?: Theme;\n }\n}\n\nexport async function NextBlogListPage(props: NextBlogListPageProps) {\n const postsPerPage = props.displayOptions?.blogPerPage || DEFAULT_BLOG_PER_PAGE;\n const searchParams = await props.searchParams || {};\n const currentPage = Number(searchParams.page) || 1;\n\n const locale = props.locale;\n const basePath = locale ? `/${locale}/blogs` : '/blogs';\n\n const queryParams: IQueryParams = {\n index: (currentPage - 1) * postsPerPage,\n limit: postsPerPage,\n category: searchParams.category || '',\n tags: searchParams.tags?.split(',') || [],\n locale,\n }\n\n const res = await getBlogPosts(\n props.config, \n queryParams\n );\n\n const { blogs, total } = res;\n\n const totalPages = Math.ceil(total / queryParams.limit!);\n const visiblePages = getVisiblePages(currentPage, totalPages);\n\n return (\n <ThemeWrapper \n initialMode={props.displayOptions?.isDarkMode ? 'dark': 'light'}\n customTheme={props.displayOptions?.customTheme} \n >\n <ArticleGroupV2\n blogs={blogs} \n type={props.displayOptions?.type}\n {...props.displayOptions}\n />\n {totalPages > 1 && (\n <Pagination style={{ marginTop: '2rem' }}>\n <PaginationContent>\n {currentPage > 1 && (\n <PaginationItem>\n <PaginationPrevious href={`${basePath}?page=${currentPage - 1}`} />\n </PaginationItem>\n )}\n\n {visiblePages.map((pageNum, idx) => (\n pageNum === null ? (\n <PaginationItem key={`ellipsis-${idx}`}>\n <PaginationEllipsis />\n </PaginationItem>\n ) : (\n <PaginationItem key={pageNum}>\n <PaginationLink\n href={`${basePath}?page=${pageNum}`}\n isActive={pageNum === currentPage}\n >\n {pageNum}\n </PaginationLink>\n </PaginationItem>\n )\n ))}\n\n {currentPage < totalPages && (\n <PaginationItem>\n <PaginationNext href={`${basePath}?page=${currentPage + 1}`} />\n </PaginationItem>\n )}\n </PaginationContent>\n </Pagination>\n )}\n </ThemeWrapper>\n );\n}\n"],"mappings":"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","names":["cache","notFound","exchangeToken","config","response","error","getFormattedDate","date","getVisiblePages","current","total","_","i","getAuthToken","cache","config","exchangeToken","getBlogPosts","params","token","queryString","key","value","url","response","getBlogPost","slug","locale","getBlogPaths","res","blog","generateMetadata","_a","_b","post","getFormattedDate","notFound","React","notFound","ArticleV2","PoweredByV2","ThemeWrapper","NextBlogPage","props","response","getBlogPost","notFound","post","htmlContent","price_id","React","ThemeWrapper","ArticleV2","PoweredByV2","error","React","ArticleGroupV2","ThemeWrapper","Pagination","PaginationContent","PaginationEllipsis","PaginationItem","PaginationLink","PaginationNext","PaginationPrevious","DEFAULT_BLOG_PER_PAGE","NextBlogListPage","props","_a","_b","_c","_d","_e","postsPerPage","searchParams","currentPage","locale","basePath","queryParams","res","getBlogPosts","blogs","total","totalPages","visiblePages","getVisiblePages","React","ThemeWrapper","ArticleGroupV2","__spreadValues","Pagination","PaginationContent","PaginationItem","PaginationPrevious","pageNum","idx","PaginationEllipsis","PaginationLink","PaginationNext"]}
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- var V=Object.defineProperty;var F=Object.getOwnPropertySymbols;var K=Object.prototype.hasOwnProperty,z=Object.prototype.propertyIsEnumerable;var L=(t,e,r)=>e in t?V(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r,P=(t,e)=>{for(var r in e||(e={}))K.call(e,r)&&L(t,r,e[r]);if(F)for(var r of F(e))z.call(e,r)&&L(t,r,e[r]);return t};import{cache as R}from"react";import{notFound as q}from"next/navigation";async function w(t){try{let e=await fetch(`${t.apiUrl}/exchange-token`,{method:"POST",headers:{Authorization:`Bearer ${t.apiKey}`,"x-project-id":t.projectId}});if(!e.ok)throw console.error("Failed to exchange token:",e),new Error("Failed to authenticate");return(await e.json()).token}catch(e){return console.error("Failed to exchange token:",e),null}}var M=t=>t?new Date(t).toISOString().split("T")[0]:"",x=(t,e)=>e<=7?Array.from({length:e},(r,o)=>o+1):t<=3?[1,2,3,4,5,null,e]:t>=e-2?[1,null,e-4,e-3,e-2,e-1,e]:[1,null,t-1,t,t+1,null,e];var _=R(async t=>w(t));async function B(t,e={}){let r=await _(t),o=new URLSearchParams(Object.entries(e).map(([n,u])=>[n,String(u)])).toString(),s=`${t.apiUrl}/sdk/blogs${o?`?${o}`:""}`,a=await fetch(s,{headers:{Authorization:`Bearer ${r}`,"x-project-id":t.projectId},next:{revalidate:60}});if(!a.ok)throw console.error("Failed to fetch blog posts:",a),new Error(`Failed to fetch blog posts: ${a.status} ${a.statusText}`);return await a.json()}async function T(t,e,r){let o=await _(t),s=`${t.apiUrl}/sdk/blogs/${e}${r?`?locale=${r}`:""}`,a=await fetch(s,{headers:{Authorization:`Bearer ${o}`,"x-project-id":t.projectId},next:{revalidate:60}});if(!a.ok)throw new Error(`Failed to fetch blog post: ${a.status} ${a.statusText}`);return a.json()}async function H(t,e){let r=await B(t,{index:0,limit:1e4,locale:e});return r.blogs?r.blogs.map(o=>({slug:o.slug})):[]}async function J(t,e,r){var o,s;if(e){let a=await T(t,e,r);return a?{title:a.title,description:(o=a.excerpt)==null?void 0:o.substring(0,160),openGraph:{title:a.title,description:(s=a.excerpt)==null?void 0:s.substring(0,160),type:"article",publishedTime:M(a.created_at),tags:a.tags}}:q()}return{title:"Blog",description:"Read our latest blog posts",openGraph:{title:"Blog",description:"Read our latest blog posts",type:"website"}}}import p from"react";import{notFound as U}from"next/navigation";import{ArticleV2 as X,PoweredByV2 as Y,ThemeWrapper as Z}from"@weekend-studio/easyblog-components";async function G(t){try{let e=await T({apiKey:t.config.apiKey,projectId:t.config.projectId,apiUrl:t.config.apiUrl},t.slug,t.locale);if(!e.blog)return U();let r=e.blog,o=e.html_content,s=e.price_id;return p.createElement(Z,{initialMode:t.darkMode?"dark":"light",customTheme:t.customTheme},p.createElement("div",{style:{display:"flex",maxWidth:"1200px",marginLeft:"auto",marginRight:"auto"}},p.createElement(X,{post:r,content:o,showAuthor:t.showAuthor,showDate:t.showDate,showCategory:t.showCategory,showTags:t.showTags,showToc:t.showToc})),s==null&&p.createElement("div",{style:{position:"fixed",bottom:"1rem",right:"1rem",display:"flex",justifyContent:"center",alignItems:"center"}},p.createElement(Y,null)))}catch(e){return U()}}import g from"react";import{ArticleGroupV2 as tt,ThemeWrapper as et,Pagination as ot,PaginationContent as rt,PaginationEllipsis as at,PaginationItem as k,PaginationLink as st,PaginationNext as it,PaginationPrevious as nt}from"@weekend-studio/easyblog-components";var gt=9;async function lt(t){var C,O,A,j,v;let e=((C=t.displayOptions)==null?void 0:C.blogPerPage)||gt,r=await t.searchParams||{},o=Number(r.page)||1,s=r.locale,a=s?`&locale=${s}`:"",i={index:(o-1)*e,limit:e,category:r.category||"",tags:((O=r.tags)==null?void 0:O.split(","))||[],locale:s},n=await B(t.config,i),{blogs:u,total:h}=n,y=Math.ceil(h/i.limit),Q=x(o,y);return g.createElement(et,{initialMode:(A=t.displayOptions)!=null&&A.isDarkMode?"dark":"light",customTheme:(j=t.displayOptions)==null?void 0:j.customTheme},g.createElement(tt,P({blogs:u,type:(v=t.displayOptions)==null?void 0:v.type},t.displayOptions)),y>1&&g.createElement(ot,{style:{marginTop:"2rem"}},g.createElement(rt,null,o>1&&g.createElement(k,null,g.createElement(nt,{href:`/blogs?page=${o-1}${a}`})),Q.map((f,W)=>f===null?g.createElement(k,{key:`ellipsis-${W}`},g.createElement(at,null)):g.createElement(k,{key:f},g.createElement(st,{href:`/blogs?page=${f}${a}`,isActive:f===o},f))),o<y&&g.createElement(k,null,g.createElement(it,{href:`/blogs?page=${o+1}${a}`})))))}var d={},D=36e5;async function N(t){let e=`${t.projectId}-${t.apiKey}`,r=Date.now();if(d[e]&&d[e].expires>r)return d[e].token;let o=await w(t);return d[e]={token:o,expires:r+D},o}async function $(t,e={}){let r=await N(t),o=new URLSearchParams(Object.entries(e).map(([n,u])=>[n,String(u)])).toString(),s=`${t.apiUrl}/sdk/blogs${o?`?${o}`:""}`,a=await fetch(s,{headers:{Authorization:`Bearer ${r}`,"x-project-id":t.projectId},next:{revalidate:60}});if(!a.ok)throw new Error(`Failed to fetch blog posts: ${a.status} ${a.statusText}`);return await a.json()}async function S(t,e,r){let o=await N(t),s=`${t.apiUrl}/sdk/blogs/${e}${r?`?locale=${r}`:""}`,a=await fetch(s,{headers:{Authorization:`Bearer ${o}`,"x-project-id":t.projectId},next:{revalidate:60}});if(!a.ok){let i=`Failed to fetch blog post: ${a.status} ${a.statusText}`;throw new Error(i)}return a.json()}async function I(t,e){let{blogs:r}=await $(t,{index:0,limit:1e4,locale:e});return r.map(o=>({params:{slug:o.slug}}))}setInterval(()=>{let t=Date.now();Object.keys(d).forEach(e=>{d[e].expires<=t&&delete d[e]})},D);import{ArticleGroupV2 as ct,ThemeWrapper as mt}from"@weekend-studio/easyblog-components";import l from"react";import{Pagination as ut,PaginationContent as Pt,PaginationEllipsis as dt,PaginationItem as E,PaginationLink as ht,PaginationNext as yt,PaginationPrevious as ft}from"@weekend-studio/easyblog-components";var pt=9;function bt(t){var o,s,a;if(!t.blogs)return null;let e=x(t.currentPage,t.totalPages),r=t.locale?`&locale=${t.locale}`:"";return l.createElement(mt,{initialMode:(o=t.displayOptions)!=null&&o.darkMode?"dark":"light",customTheme:(s=t.displayOptions)==null?void 0:s.customTheme},l.createElement(ct,P({blogs:t.blogs,type:(a=t.displayOptions)==null?void 0:a.type},t.displayOptions)),t.totalPages>1&&l.createElement(ut,{style:{marginTop:"2rem"}},l.createElement(Pt,null,t.currentPage>1&&l.createElement(E,null,l.createElement(ft,{href:`/blogs?page=${t.currentPage-1}${r}`})),e.map((i,n)=>i===null?l.createElement(E,{key:`ellipsis-${n}`},l.createElement(dt,null)):l.createElement(E,{key:i},l.createElement(ht,{href:`/blogs?page=${i}${r}`,isActive:i===t.currentPage},i))),t.currentPage<t.totalPages&&l.createElement(E,null,l.createElement(yt,{href:`/blogs?page=${t.currentPage+1}${r}`})))))}function wt(t){return{async getServerSideProps({query:e}){var r,o;try{let s=e.page?parseInt(e.page):1,a=((r=t.displayOptions)==null?void 0:r.blogPerPage)||pt,i=e.locale||t.locale||"en",n=await $(t.config,{index:(s-1)*a,limit:a,category:e.category||"",tags:((o=e.tags)==null?void 0:o.split(","))||[],locale:i});if(!n||typeof n!="object")return console.error("Invalid API response format"),{props:{blogs:[],displayOptions:t.displayOptions||{},currentPage:1,totalPages:0}};let{blogs:u=[],total:h=0}=n,y=Math.ceil(h/a);return{props:{blogs:u,displayOptions:t.displayOptions||{},currentPage:s,totalPages:y,locale:i}}}catch(s){return console.error("Error fetching blog posts:",s),{props:{blogs:[],displayOptions:t.displayOptions||{},currentPage:1,totalPages:0}}}}}}import{ArticleV2 as xt,PoweredByV2 as Bt,ThemeWrapper as Tt}from"@weekend-studio/easyblog-components";import b from"react";function kt(t){return t.post?b.createElement(Tt,{initialMode:t.darkMode?"dark":"light",customTheme:t.customTheme},b.createElement("div",{style:{display:"flex",maxWidth:"1200px",marginLeft:"auto",marginRight:"auto"}},b.createElement(xt,{post:t.post,content:t.htmlContent,showAuthor:t.showAuthor,showDate:t.showDate,showCategory:t.showCategory,showTags:t.showTags,showToc:t.showToc})),t.price_id==null&&b.createElement("div",{style:{position:"fixed",bottom:"1rem",right:"1rem",display:"flex",justifyContent:"center",alignItems:"center"}},b.createElement(Bt,null))):null}function $t(t){return{async getStaticProps({params:e}){try{let r=await S({apiKey:t.config.apiKey,projectId:t.config.projectId,apiUrl:t.config.apiUrl},e.slug,t.locale);return r.blog?{props:{post:r.blog,htmlContent:r.html_content,price_id:r.price_id},revalidate:60}:{notFound:!0}}catch(r){return console.error("Error fetching blog post:",r),{notFound:!0}}},async getStaticPaths(){try{return{paths:await I(t.config,t.locale),fallback:"blocking"}}catch(e){return console.error("Error fetching blog slugs:",e),{paths:[],fallback:"blocking"}}}}}var Ee=({title:t,description:e,keywords:r,openGraph:o,canonicalUrlRelative:s,extraTags:a,applicationName:i,domainName:n,x_handle:u,locale:h="en_US"})=>P(P({title:t,description:e,keywords:r,applicationName:i,metadataBase:new URL(`https://${n}/`),openGraph:{title:(o==null?void 0:o.title)||i,description:(o==null?void 0:o.description)||e,url:(o==null?void 0:o.url)||`https://${n}/`,siteName:(o==null?void 0:o.title)||i,locale:h,type:"website"},twitter:{title:(o==null?void 0:o.title)||i,description:(o==null?void 0:o.description)||e,card:"summary_large_image",creator:u}},s&&{alternates:{canonical:s}}),a);export{lt as NextBlogListPage,bt as NextBlogListPageForPageRouter,G as NextBlogPage,kt as NextBlogPageForPageRouter,J as generateMetadata,H as getBlogPaths,I as getBlogPathsPageRouter,T as getBlogPost,S as getBlogPostPageRouter,B as getBlogPosts,$ as getBlogPostsPageRouter,Ee as getSEOTags,wt as withListServerSideProps,$t as withPageStaticProps};
1
+ var V=Object.defineProperty;var L=Object.getOwnPropertySymbols;var K=Object.prototype.hasOwnProperty,z=Object.prototype.propertyIsEnumerable;var M=(t,e,r)=>e in t?V(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r,P=(t,e)=>{for(var r in e||(e={}))K.call(e,r)&&M(t,r,e[r]);if(L)for(var r of L(e))z.call(e,r)&&M(t,r,e[r]);return t};import{cache as R}from"react";import{notFound as q}from"next/navigation";async function w(t){try{let e=await fetch(`${t.apiUrl}/exchange-token`,{method:"POST",headers:{Authorization:`Bearer ${t.apiKey}`,"x-project-id":t.projectId}});if(!e.ok)throw console.error("Failed to exchange token:",e),new Error("Failed to authenticate");return(await e.json()).token}catch(e){return console.error("Failed to exchange token:",e),null}}var _=t=>t?new Date(t).toISOString().split("T")[0]:"",x=(t,e)=>e<=7?Array.from({length:e},(r,o)=>o+1):t<=3?[1,2,3,4,5,null,e]:t>=e-2?[1,null,e-4,e-3,e-2,e-1,e]:[1,null,t-1,t,t+1,null,e];var U=R(async t=>w(t));async function B(t,e={}){let r=await U(t),o=new URLSearchParams(Object.entries(e).map(([n,c])=>[n,String(c)])).toString(),s=`${t.apiUrl}/sdk/blogs${o?`?${o}`:""}`,a=await fetch(s,{headers:{Authorization:`Bearer ${r}`,"x-project-id":t.projectId},next:{revalidate:60}});if(!a.ok)throw console.error("Failed to fetch blog posts:",a),new Error(`Failed to fetch blog posts: ${a.status} ${a.statusText}`);return await a.json()}async function T(t,e,r){let o=await U(t),s=`${t.apiUrl}/sdk/blogs/${e}${r?`?locale=${r}`:""}`,a=await fetch(s,{headers:{Authorization:`Bearer ${o}`,"x-project-id":t.projectId},next:{revalidate:60}});if(!a.ok)throw new Error(`Failed to fetch blog post: ${a.status} ${a.statusText}`);return a.json()}async function H(t,e){let r=await B(t,{index:0,limit:1e4});return r.blogs?r.blogs.map(o=>({slug:o.slug})):[]}async function J(t,e,r){var o,s;if(e){let a=await T(t,e,r);return a?{title:a.title,description:(o=a.excerpt)==null?void 0:o.substring(0,160),openGraph:{title:a.title,description:(s=a.excerpt)==null?void 0:s.substring(0,160),type:"article",publishedTime:_(a.created_at),tags:a.tags}}:q()}return{title:"Blog",description:"Read our latest blog posts",openGraph:{title:"Blog",description:"Read our latest blog posts",type:"website"}}}import p from"react";import{notFound as D}from"next/navigation";import{ArticleV2 as X,PoweredByV2 as Y,ThemeWrapper as Z}from"@weekend-studio/easyblog-components";async function G(t){try{let e=await T({apiKey:t.config.apiKey,projectId:t.config.projectId,apiUrl:t.config.apiUrl},t.slug,t.locale);if(!e.blog)return D();let r=e.blog,o=e.html_content,s=e.price_id;return p.createElement(Z,{initialMode:t.darkMode?"dark":"light",customTheme:t.customTheme},p.createElement("div",{style:{display:"flex",maxWidth:"1200px",marginLeft:"auto",marginRight:"auto"}},p.createElement(X,{post:r,content:o,showAuthor:t.showAuthor,showDate:t.showDate,showCategory:t.showCategory,showTags:t.showTags,showToc:t.showToc})),s==null&&p.createElement("div",{style:{position:"fixed",bottom:"1rem",right:"1rem",display:"flex",justifyContent:"center",alignItems:"center"}},p.createElement(Y,null)))}catch(e){return D()}}import g from"react";import{ArticleGroupV2 as tt,ThemeWrapper as et,Pagination as ot,PaginationContent as rt,PaginationEllipsis as at,PaginationItem as k,PaginationLink as st,PaginationNext as it,PaginationPrevious as nt}from"@weekend-studio/easyblog-components";var gt=9;async function lt(t){var O,A,j,v,F;let e=((O=t.displayOptions)==null?void 0:O.blogPerPage)||gt,r=await t.searchParams||{},o=Number(r.page)||1,s=t.locale,a=s?`/${s}/blogs`:"/blogs",i={index:(o-1)*e,limit:e,category:r.category||"",tags:((A=r.tags)==null?void 0:A.split(","))||[],locale:s},n=await B(t.config,i),{blogs:c,total:h}=n,y=Math.ceil(h/i.limit),S=x(o,y);return g.createElement(et,{initialMode:(j=t.displayOptions)!=null&&j.isDarkMode?"dark":"light",customTheme:(v=t.displayOptions)==null?void 0:v.customTheme},g.createElement(tt,P({blogs:c,type:(F=t.displayOptions)==null?void 0:F.type},t.displayOptions)),y>1&&g.createElement(ot,{style:{marginTop:"2rem"}},g.createElement(rt,null,o>1&&g.createElement(k,null,g.createElement(nt,{href:`${a}?page=${o-1}`})),S.map((f,W)=>f===null?g.createElement(k,{key:`ellipsis-${W}`},g.createElement(at,null)):g.createElement(k,{key:f},g.createElement(st,{href:`${a}?page=${f}`,isActive:f===o},f))),o<y&&g.createElement(k,null,g.createElement(it,{href:`${a}?page=${o+1}`})))))}var d={},N=36e5;async function Q(t){let e=`${t.projectId}-${t.apiKey}`,r=Date.now();if(d[e]&&d[e].expires>r)return d[e].token;let o=await w(t);return d[e]={token:o,expires:r+N},o}async function $(t,e={}){let r=await Q(t),o=new URLSearchParams(Object.entries(e).map(([n,c])=>[n,String(c)])).toString(),s=`${t.apiUrl}/sdk/blogs${o?`?${o}`:""}`,a=await fetch(s,{headers:{Authorization:`Bearer ${r}`,"x-project-id":t.projectId},next:{revalidate:60}});if(!a.ok)throw new Error(`Failed to fetch blog posts: ${a.status} ${a.statusText}`);return await a.json()}async function I(t,e,r){let o=await Q(t),s=`${t.apiUrl}/sdk/blogs/${e}${r?`?locale=${r}`:""}`,a=await fetch(s,{headers:{Authorization:`Bearer ${o}`,"x-project-id":t.projectId},next:{revalidate:60}});if(!a.ok){let i=`Failed to fetch blog post: ${a.status} ${a.statusText}`;throw new Error(i)}return a.json()}async function C(t,e){let{blogs:r}=await $(t,{index:0,limit:1e4,locale:e});return r.map(o=>({params:{slug:o.slug}}))}setInterval(()=>{let t=Date.now();Object.keys(d).forEach(e=>{d[e].expires<=t&&delete d[e]})},N);import{ArticleGroupV2 as ct,ThemeWrapper as ut}from"@weekend-studio/easyblog-components";import l from"react";import{Pagination as mt,PaginationContent as Pt,PaginationEllipsis as dt,PaginationItem as E,PaginationLink as ht,PaginationNext as yt,PaginationPrevious as ft}from"@weekend-studio/easyblog-components";var pt=9;function bt(t){var o,s,a;if(!t.blogs)return null;let e=x(t.currentPage,t.totalPages),r=t.locale?`/${t.locale}/blogs`:"/blogs";return l.createElement(ut,{initialMode:(o=t.displayOptions)!=null&&o.darkMode?"dark":"light",customTheme:(s=t.displayOptions)==null?void 0:s.customTheme},l.createElement(ct,P({blogs:t.blogs,type:(a=t.displayOptions)==null?void 0:a.type},t.displayOptions)),t.totalPages>1&&l.createElement(mt,{style:{marginTop:"2rem"}},l.createElement(Pt,null,t.currentPage>1&&l.createElement(E,null,l.createElement(ft,{href:`${r}?page=${t.currentPage-1}`})),e.map((i,n)=>i===null?l.createElement(E,{key:`ellipsis-${n}`},l.createElement(dt,null)):l.createElement(E,{key:i},l.createElement(ht,{href:`${r}?page=${i}`,isActive:i===t.currentPage},i))),t.currentPage<t.totalPages&&l.createElement(E,null,l.createElement(yt,{href:`${r}?page=${t.currentPage+1}`})))))}function wt(t){return{async getServerSideProps({query:e,params:r}){var o,s;try{let a=e.page?parseInt(e.page):1,i=((o=t.displayOptions)==null?void 0:o.blogPerPage)||pt,n=(r==null?void 0:r.locale)||t.locale,c=await $(t.config,{index:(a-1)*i,limit:i,category:e.category||"",tags:((s=e.tags)==null?void 0:s.split(","))||[],locale:n});if(!c||typeof c!="object")return console.error("Invalid API response format"),{props:{blogs:[],displayOptions:t.displayOptions||{},currentPage:1,totalPages:0}};let{blogs:h=[],total:y=0}=c,S=Math.ceil(y/i);return{props:{blogs:h,displayOptions:t.displayOptions||{},currentPage:a,totalPages:S,locale:n}}}catch(a){return console.error("Error fetching blog posts:",a),{props:{blogs:[],displayOptions:t.displayOptions||{},currentPage:1,totalPages:0}}}}}}import{ArticleV2 as xt,PoweredByV2 as Bt,ThemeWrapper as Tt}from"@weekend-studio/easyblog-components";import b from"react";function kt(t){return t.post?b.createElement(Tt,{initialMode:t.darkMode?"dark":"light",customTheme:t.customTheme},b.createElement("div",{style:{display:"flex",maxWidth:"1200px",marginLeft:"auto",marginRight:"auto"}},b.createElement(xt,{post:t.post,content:t.htmlContent,showAuthor:t.showAuthor,showDate:t.showDate,showCategory:t.showCategory,showTags:t.showTags,showToc:t.showToc})),t.price_id==null&&b.createElement("div",{style:{position:"fixed",bottom:"1rem",right:"1rem",display:"flex",justifyContent:"center",alignItems:"center"}},b.createElement(Bt,null))):null}function $t(t){return{async getStaticProps({params:e}){try{let r=e.locale||t.locale,o=await I({apiKey:t.config.apiKey,projectId:t.config.projectId,apiUrl:t.config.apiUrl},e.slug,r);return o.blog?{props:{post:o.blog,htmlContent:o.html_content,price_id:o.price_id},revalidate:60}:{notFound:!0}}catch(r){return console.error("Error fetching blog post:",r),{notFound:!0}}},async getStaticPaths(){try{return{paths:await C(t.config,t.locale),fallback:"blocking"}}catch(e){return console.error("Error fetching blog slugs:",e),{paths:[],fallback:"blocking"}}}}}var Ee=({title:t,description:e,keywords:r,openGraph:o,canonicalUrlRelative:s,extraTags:a,applicationName:i,domainName:n,x_handle:c,locale:h="en_US"})=>P(P({title:t,description:e,keywords:r,applicationName:i,metadataBase:new URL(`https://${n}/`),openGraph:{title:(o==null?void 0:o.title)||i,description:(o==null?void 0:o.description)||e,url:(o==null?void 0:o.url)||`https://${n}/`,siteName:(o==null?void 0:o.title)||i,locale:h,type:"website"},twitter:{title:(o==null?void 0:o.title)||i,description:(o==null?void 0:o.description)||e,card:"summary_large_image",creator:c}},s&&{alternates:{canonical:s}}),a);export{lt as NextBlogListPage,bt as NextBlogListPageForPageRouter,G as NextBlogPage,kt as NextBlogPageForPageRouter,J as generateMetadata,H as getBlogPaths,C as getBlogPathsPageRouter,T as getBlogPost,I as getBlogPostPageRouter,B as getBlogPosts,$ as getBlogPostsPageRouter,Ee as getSEOTags,wt as withListServerSideProps,$t as withPageStaticProps};
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/NextAppRouterUtils.ts","../src/BaseUtils.ts","../src/utils.ts","../src/NextBlogPage.tsx","../src/NextBlogListPage.tsx","../src/NextPageRouterUtils.ts","../src/NextBlogListPageForPageRouter.tsx","../src/NextBlogPageForPageRouter.tsx","../src/seo.ts"],"sourcesContent":["import { cache } from \"react\";\nimport { EasyBlogConfig, IQueryParams } from \"./models\";\nimport { Metadata } from \"next\";\nimport { notFound } from \"next/navigation\";\nimport { exchangeToken } from './BaseUtils';\nimport { getFormattedDate } from \"./utils\";\n\n// Cached token getter\nconst getAuthToken = cache(async (config: EasyBlogConfig): Promise<string | null> => {\n return exchangeToken(config);\n});\n \n// Server-side data fetching functions\nasync function getBlogPosts(config: EasyBlogConfig, params: IQueryParams = {}) {\n const token = await getAuthToken(config);\n\n const queryString = new URLSearchParams(\n Object.entries(params).map(([key, value]) => [key, String(value)])\n ).toString();\n\n const url = `${config.apiUrl}/sdk/blogs${queryString ? `?${queryString}` : ''}`;\n\n const response = await fetch(url, {\n headers: { \n 'Authorization': `Bearer ${token}`,\n 'x-project-id': config.projectId\n },\n next: { \n revalidate: 60,\n }\n });\n\n if (!response.ok) {\n console.error('Failed to fetch blog posts:', response);\n throw new Error(`Failed to fetch blog posts: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json();\n return data;\n}\n\nasync function getBlogPost(config: EasyBlogConfig, slug: string, locale?: string) {\n const token = await getAuthToken(config);\n\n const url = `${config.apiUrl}/sdk/blogs/${slug}${locale ? `?locale=${locale}` : ''}`;\n const response = await fetch(url, {\n headers: { \n 'Authorization': `Bearer ${token}`,\n 'x-project-id': config.projectId\n },\n next: { \n revalidate: 60,\n }\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch blog post: ${response.status} ${response.statusText}`);\n }\n\n return response.json();\n}\n\nasync function getBlogPaths(config: EasyBlogConfig, locale?: string) {\n const res = await getBlogPosts(config, { index: 0, limit: 10000, locale });\n if (!res.blogs) return [];\n return res.blogs.map((blog: any) => ({ slug: blog.slug }));\n}\n\nasync function generateMetadata(config: EasyBlogConfig, slug?: string, locale?: string): Promise<Metadata> {\n if (slug) {\n const post = await getBlogPost(config, slug, locale);\n if (!post) return notFound();\n\n return {\n title: post.title,\n description: post.excerpt?.substring(0, 160),\n openGraph: {\n title: post.title,\n description: post.excerpt?.substring(0, 160),\n type: 'article',\n publishedTime: getFormattedDate(post.created_at),\n tags: post.tags,\n },\n };\n }\n\n return {\n title: 'Blog',\n description: 'Read our latest blog posts',\n openGraph: {\n title: 'Blog',\n description: 'Read our latest blog posts',\n type: 'website',\n },\n };\n}\n\n// Server exports\nexport {\n generateMetadata,\n getBlogPost,\n getBlogPosts,\n getBlogPaths,\n};\n","// Base functionality shared between both routers\nimport { EasyBlogConfig, IQueryParams } from \"./models\";\n\nexport async function exchangeToken(config: EasyBlogConfig): Promise<string | null> {\n try {\n const response = await fetch(`${config.apiUrl}/exchange-token`, {\n method: 'POST',\n headers: { \n 'Authorization': `Bearer ${config.apiKey}`,\n 'x-project-id': config.projectId\n }\n });\n\n if (!response.ok) {\n console.error('Failed to exchange token:', response);\n throw new Error('Failed to authenticate');\n }\n\n const data = await response.json();\n return data.token;\n } catch (error) {\n console.error('Failed to exchange token:', error);\n return null;\n }\n}\n\n\nexport async function getBlogPostsBase(config: EasyBlogConfig, params: IQueryParams = {}) {\n const token = await exchangeToken(config);\n\n const queryString = new URLSearchParams(\n Object.entries(params).map(([key, value]) => [key, String(value)])\n ).toString();\n\n const url = `${config.apiUrl}/sdk/blogs${queryString ? `?${queryString}` : ''}`;\n\n return { url, token };\n}\n\nexport async function getBlogPostBase(config: EasyBlogConfig, slug: string, locale?: string) {\n const token = await exchangeToken(config);\n const url = `${config.apiUrl}/sdk/blogs/${slug}${locale ? `?locale=${locale}` : ''}`;\n return { url, token };\n}","import { IQueryParams } from \"./models\";\n\nexport function buildQueryParams(params: IQueryParams): string {\n const queryParams = new URLSearchParams();\n params.index && queryParams.set('index', params.index.toString());\n params.limit && queryParams.set('limit', params.limit.toString());\n if (params.category) queryParams.set('category', params.category);\n if (params.tags) queryParams.set('tags', [params.tags].join(','));\n return queryParams.toString();\n}\n\nexport const getFormattedDate = (date: Date) => {\n if (!date) return '';\n return new Date(date).toISOString().split('T')[0];\n}\n\n// Helper function to generate visible page numbers\nexport const getVisiblePages = (current: number, total: number) => {\n if (total <= 7) return Array.from({ length: total }, (_, i) => i + 1);\n \n if (current <= 3) return [1, 2, 3, 4, 5, null, total];\n if (current >= total - 2) return [1, null, total - 4, total - 3, total - 2, total - 1, total];\n \n return [1, null, current - 1, current, current + 1, null, total];\n};","import React from 'react';\nimport { notFound } from 'next/navigation'\nimport { ArticleV2, PoweredByV2, Theme, ThemeWrapper } from '@weekend-studio/easyblog-components';\nimport { EasyBlogConfig } from './models';\nimport { getBlogPost } from './NextAppRouterUtils';\n\ninterface NextBlogPageProps {\n config: EasyBlogConfig;\n darkMode?: boolean;\n showAuthor?: boolean;\n showDate?: boolean;\n showCategory?: boolean;\n showTags?: boolean;\n slug: string;\n locale?: string;\n style?: React.CSSProperties;\n showToc?: boolean;\n customTheme?: Theme;\n}\n\nexport async function NextBlogPage(props: NextBlogPageProps) {\n try {\n const response = await getBlogPost({\n apiKey: props.config.apiKey,\n projectId: props.config.projectId,\n apiUrl: props.config.apiUrl\n }, props.slug, props.locale);\n if (!response.blog) return notFound();\n const post = response.blog;\n const htmlContent = response.html_content;\n const price_id = response.price_id;\n\n return (\n <ThemeWrapper \n initialMode={props.darkMode ? 'dark' : 'light'} \n customTheme={props.customTheme}>\n <div style={{ display: 'flex', maxWidth: '1200px', marginLeft: 'auto', marginRight: 'auto' }}>\n <ArticleV2 \n post={post} \n content={htmlContent}\n showAuthor={props.showAuthor}\n showDate={props.showDate}\n showCategory={props.showCategory}\n showTags={props.showTags}\n showToc={props.showToc}\n />\n </div>\n {price_id == null && \n <div style={{ position: 'fixed', bottom: '1rem', right: '1rem', display: 'flex', justifyContent: 'center', alignItems: 'center' }}>\n <PoweredByV2 />\n </div>\n }\n </ThemeWrapper>\n );\n } catch (error) {\n return notFound();\n }\n}\n","import React from 'react';\nimport { getBlogPosts } from './NextAppRouterUtils';\nimport { \n ArticleGroupV2, \n ThemeWrapper,\n Pagination,\n PaginationContent,\n PaginationEllipsis,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n Theme,\n} from '@weekend-studio/easyblog-components';\nimport { EasyBlogConfig, IQueryParams } from './models';\nimport { getVisiblePages } from './utils';\n\nconst DEFAULT_BLOG_PER_PAGE = 9;\n\ninterface NextBlogListPageProps {\n config: EasyBlogConfig;\n searchParams?: {\n page?: string;\n category?: string;\n tags?: string;\n locale?: string;\n };\n displayOptions?: {\n type?: 'grid' | 'list';\n isDarkMode?: boolean;\n showThumbnail?: boolean;\n showReadingTime?: boolean;\n showExcerpt?: boolean;\n showTags?: boolean;\n showDate?: boolean;\n showAuthor?: boolean;\n showCategory?: boolean;\n isNextPage?: boolean;\n blogPerPage?: number;\n customTheme?: Theme;\n }\n}\n\nexport async function NextBlogListPage(props: NextBlogListPageProps) {\n const postsPerPage = props.displayOptions?.blogPerPage || DEFAULT_BLOG_PER_PAGE;\n const searchParams = await props.searchParams || {};\n const currentPage = Number(searchParams.page) || 1;\n\n const locale = searchParams.locale;\n const localeParam = locale ? `&locale=${locale}` : '';\n\n const queryParams: IQueryParams = {\n index: (currentPage - 1) * postsPerPage,\n limit: postsPerPage,\n category: searchParams.category || '',\n tags: searchParams.tags?.split(',') || [],\n locale,\n }\n\n const res = await getBlogPosts(\n props.config, \n queryParams\n );\n\n const { blogs, total } = res;\n\n const totalPages = Math.ceil(total / queryParams.limit!);\n const visiblePages = getVisiblePages(currentPage, totalPages);\n\n return (\n <ThemeWrapper \n initialMode={props.displayOptions?.isDarkMode ? 'dark': 'light'}\n customTheme={props.displayOptions?.customTheme} \n >\n <ArticleGroupV2\n blogs={blogs} \n type={props.displayOptions?.type}\n {...props.displayOptions}\n />\n {totalPages > 1 && (\n <Pagination style={{ marginTop: '2rem' }}>\n <PaginationContent>\n {currentPage > 1 && (\n <PaginationItem>\n <PaginationPrevious href={`/blogs?page=${currentPage - 1}${localeParam}`} />\n </PaginationItem>\n )}\n\n {visiblePages.map((pageNum, idx) => (\n pageNum === null ? (\n <PaginationItem key={`ellipsis-${idx}`}>\n <PaginationEllipsis />\n </PaginationItem>\n ) : (\n <PaginationItem key={pageNum}>\n <PaginationLink\n href={`/blogs?page=${pageNum}${localeParam}`}\n isActive={pageNum === currentPage}\n >\n {pageNum}\n </PaginationLink>\n </PaginationItem>\n )\n ))}\n\n {currentPage < totalPages && (\n <PaginationItem>\n <PaginationNext href={`/blogs?page=${currentPage + 1}${localeParam}`} />\n </PaginationItem>\n )}\n </PaginationContent>\n </Pagination>\n )}\n </ThemeWrapper>\n );\n}\n","import { EasyBlogConfig, IQueryParams } from \"./models\";\nimport { exchangeToken } from './BaseUtils';\n\n// For Pages Router: Use in-memory cache with expiration\nlet tokenCache: { [key: string]: { token: string | null; expires: number } } = {};\nconst CACHE_DURATION = 3600000; // 1 hour in milliseconds\n\nasync function getAuthToken(config: EasyBlogConfig): Promise<string | null> {\n const cacheKey = `${config.projectId}-${config.apiKey}`;\n const now = Date.now();\n\n // Check cache\n if (tokenCache[cacheKey] && tokenCache[cacheKey].expires > now) {\n return tokenCache[cacheKey].token;\n }\n\n // Get new token\n const token = await exchangeToken(config);\n \n // Update cache\n tokenCache[cacheKey] = {\n token,\n expires: now + CACHE_DURATION\n };\n\n return token;\n}\n\nexport async function getBlogPostsPageRouter(config: EasyBlogConfig, params: IQueryParams = {}) {\n const token = await getAuthToken(config);\n\n const queryString = new URLSearchParams(\n Object.entries(params).map(([key, value]) => [key, String(value)])\n ).toString();\n\n const url = `${config.apiUrl}/sdk/blogs${queryString ? `?${queryString}` : ''}`;\n\n const response = await fetch(url, {\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'x-project-id': config.projectId\n },\n next: {\n revalidate: 60,\n }\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch blog posts: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json();\n return data;\n}\n\nexport async function getBlogPostPageRouter(config: EasyBlogConfig, slug: string, locale?: string) {\n const token = await getAuthToken(config);\n\n const url = `${config.apiUrl}/sdk/blogs/${slug}${locale ? `?locale=${locale}` : ''}`;\n const response = await fetch(url, {\n headers: { \n 'Authorization': `Bearer ${token}`,\n 'x-project-id': config.projectId\n },\n next: {\n revalidate: 60,\n }\n });\n\n if (!response.ok) {\n const errorMessage = `Failed to fetch blog post: ${response.status} ${response.statusText}`;\n throw new Error(errorMessage);\n }\n\n return response.json();\n}\n\nexport async function getBlogPathsPageRouter(config: EasyBlogConfig, locale?: string) {\n const { blogs } = await getBlogPostsPageRouter(config, { index: 0, limit: 10000, locale });\n return blogs.map((blog: any) => ({ \n params: { slug: blog.slug } \n }));\n}\n\n// Optional: Cache cleanup\nsetInterval(() => {\n const now = Date.now();\n Object.keys(tokenCache).forEach(key => {\n if (tokenCache[key].expires <= now) {\n delete tokenCache[key];\n }\n });\n}, CACHE_DURATION);\n","import { getBlogPostsPageRouter } from './NextPageRouterUtils';\nimport { ArticleGroupV2, Theme, ThemeWrapper } from '@weekend-studio/easyblog-components';\nimport { EasyBlogConfig } from './models';\nimport React from 'react';\nimport {\n Pagination,\n PaginationContent,\n PaginationEllipsis,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n} from \"@weekend-studio/easyblog-components\"\nimport { getVisiblePages } from './utils';\n\nconst DEFAULT_BLOG_PER_PAGE = 9;\n\ninterface NextBlogListPageForPageRouterProps {\n blogs: any[];\n currentPage: number;\n totalPages: number;\n locale?: string;\n displayOptions?: {\n type?: 'grid' | 'list';\n darkMode?: boolean;\n showThumbnail?: boolean;\n showReadingTime?: boolean;\n showExcerpt?: boolean;\n showTags?: boolean;\n showDate?: boolean;\n showAuthor?: boolean;\n showCategory?: boolean;\n isNextPage?: boolean;\n blogPerPage?: number;\n customTheme?: Theme;\n }\n}\n\ninterface GetStaticPropsParams {\n config: EasyBlogConfig;\n displayOptions?: NextBlogListPageForPageRouterProps['displayOptions'];\n locale?: string;\n}\n\nexport function NextBlogListPageForPageRouter(props: NextBlogListPageForPageRouterProps) {\n if (!props.blogs) {\n return null;\n }\n\n const visiblePages = getVisiblePages(props.currentPage, props.totalPages);\n const localeParam = props.locale ? `&locale=${props.locale}` : '';\n\n return (\n <ThemeWrapper \n initialMode={props.displayOptions?.darkMode ? 'dark' : 'light'}\n customTheme={props.displayOptions?.customTheme}\n >\n <ArticleGroupV2 \n blogs={props.blogs} \n type={props.displayOptions?.type}\n {...props.displayOptions}\n />\n \n {props.totalPages > 1 && (\n <Pagination style={{ marginTop: '2rem' }}>\n <PaginationContent>\n {props.currentPage > 1 && (\n <PaginationItem>\n <PaginationPrevious href={`/blogs?page=${props.currentPage - 1}${localeParam}`} />\n </PaginationItem>\n )}\n\n {visiblePages.map((pageNum, idx) => (\n pageNum === null ? (\n <PaginationItem key={`ellipsis-${idx}`}>\n <PaginationEllipsis />\n </PaginationItem>\n ) : (\n <PaginationItem key={pageNum}>\n <PaginationLink\n href={`/blogs?page=${pageNum}${localeParam}`}\n isActive={pageNum === props.currentPage}\n >\n {pageNum}\n </PaginationLink>\n </PaginationItem>\n )\n ))}\n\n {props.currentPage < props.totalPages && (\n <PaginationItem>\n <PaginationNext href={`/blogs?page=${props.currentPage + 1}${localeParam}`} />\n </PaginationItem>\n )}\n </PaginationContent>\n </Pagination>\n )}\n </ThemeWrapper>\n );\n}\n\nexport function withServerSideProps(pageConfig: GetStaticPropsParams) {\n return {\n async getServerSideProps({ query }: { query: {\n page?: string,\n category?: string,\n tags?: string,\n locale?: string\n } }) {\n try {\n const currentPage = query.page ? parseInt(query.page as string) : 1;\n const postsPerPage = pageConfig.displayOptions?.blogPerPage || DEFAULT_BLOG_PER_PAGE;\n const locale = query.locale || pageConfig.locale || 'en';\n\n const response = await getBlogPostsPageRouter(pageConfig.config, {\n index: (currentPage - 1) * postsPerPage,\n limit: postsPerPage,\n category: query.category || '',\n tags: query.tags?.split(',') || [],\n locale,\n });\n\n // Add defensive checks\n if (!response || typeof response !== 'object') {\n console.error('Invalid API response format');\n return {\n props: {\n blogs: [],\n displayOptions: pageConfig.displayOptions || {},\n currentPage: 1,\n totalPages: 0\n }\n };\n }\n\n const { blogs = [], total = 0 } = response;\n const totalPages = Math.ceil(total / postsPerPage);\n\n return {\n props: {\n blogs,\n displayOptions: pageConfig.displayOptions || {},\n currentPage,\n totalPages,\n locale,\n }\n };\n } catch (error) {\n console.error('Error fetching blog posts:', error);\n // Return empty props instead of notFound\n return {\n props: {\n blogs: [],\n displayOptions: pageConfig.displayOptions || {},\n currentPage: 1,\n totalPages: 0\n }\n };\n }\n }\n };\n}","'use client';\n\nimport { ArticleV2, PoweredByV2, Theme, ThemeWrapper } from '@weekend-studio/easyblog-components';\nimport { EasyBlogConfig } from './models';\nimport { getBlogPathsPageRouter, getBlogPostPageRouter } from './NextPageRouterUtils';\nimport React from 'react';\n\ninterface NextBlogPageForPageRouterProps {\n post: any;\n htmlContent: string;\n config: EasyBlogConfig;\n price_id: string | null;\n darkMode?: boolean;\n showAuthor?: boolean;\n showDate?: boolean;\n showCategory?: boolean;\n showTags?: boolean;\n showToc?: boolean;\n customTheme?: Theme;\n}\n\ninterface GetStaticPropsParams {\n config: EasyBlogConfig;\n locale?: string;\n}\n\nexport function NextBlogPageForPageRouter(props: NextBlogPageForPageRouterProps) {\n if (!props.post) {\n return null; // Or your custom 404 component\n }\n\n return (\n <ThemeWrapper \n initialMode={props.darkMode ? 'dark' : 'light'} \n customTheme={props.customTheme}\n >\n <div style={{ \n display: 'flex', \n maxWidth: '1200px', \n marginLeft: 'auto', \n marginRight: 'auto' }}\n >\n <ArticleV2\n post={props.post} \n content={props.htmlContent}\n showAuthor={props.showAuthor}\n showDate={props.showDate}\n showCategory={props.showCategory}\n showTags={props.showTags}\n showToc={props.showToc}\n />\n </div>\n {props.price_id == null && \n <div style={{ position: 'fixed', bottom: '1rem', right: '1rem', display: 'flex', justifyContent: 'center', alignItems: 'center' }}>\n <PoweredByV2 />\n </div>\n }\n </ThemeWrapper>\n );\n}\n\nexport function withStaticProps(pageConfig: GetStaticPropsParams) {\n return {\n async getStaticProps({ params }: { params: { slug: string } }) {\n try {\n const response = await getBlogPostPageRouter({\n apiKey: pageConfig.config.apiKey,\n projectId: pageConfig.config.projectId,\n apiUrl: pageConfig.config.apiUrl\n }, params.slug, pageConfig.locale);\n\n if (!response.blog) {\n return {\n notFound: true\n };\n }\n\n return {\n props: {\n post: response.blog,\n htmlContent: response.html_content,\n price_id: response.price_id\n },\n revalidate: 60\n };\n } catch (error) {\n console.error('Error fetching blog post:', error);\n return {\n notFound: true\n };\n }\n },\n\n async getStaticPaths() {\n try {\n const paths = await getBlogPathsPageRouter(pageConfig.config, pageConfig.locale);\n \n return {\n paths,\n fallback: 'blocking'\n };\n } catch (error) {\n console.error('Error fetching blog slugs:', error);\n return {\n paths: [],\n fallback: 'blocking'\n };\n }\n }\n }\n}\n","// See https://shipfa.st/docs/features/seo\n\nimport type { Metadata } from \"next\";\n\nexport interface GetSEOTagsParams extends Metadata {\n canonicalUrlRelative: string;\n extraTags: Record<string, any>;\n applicationName: string;\n description: string;\n domainName: string;\n x_handle: string;\n locale?: string;\n}\n\nexport const getSEOTags = ({\n title,\n description,\n keywords,\n openGraph,\n canonicalUrlRelative,\n extraTags,\n applicationName,\n domainName,\n x_handle,\n locale = \"en_US\",\n}: GetSEOTagsParams) => {\n return {\n // up to 50 characters (what does your app do for the user?) > your main should be here\n title,\n // up to 160 characters (how does your app help the user?)\n description,\n // some keywords separated by commas. by default it will be your app name\n keywords,\n applicationName,\n // set a base URL prefix for other fields that require a fully qualified URL (.e.g og:image: og:image: 'https://yourdomain.com/share.png' => '/share.png')\n metadataBase: new URL(`https://${domainName}/`),\n\n openGraph: {\n title: openGraph?.title || applicationName,\n description: openGraph?.description || description,\n url: openGraph?.url || `https://${domainName}/`,\n siteName: openGraph?.title || applicationName,\n // If you add an opengraph-image.(jpg|jpeg|png|gif) image to the /app folder, you don't need the code below\n // images: [\n // {\n // url: `https://${config.domainName}/share.png`,\n // width: 1200,\n // height: 660,\n // },\n // ],\n locale,\n type: \"website\",\n },\n\n twitter: {\n title: openGraph?.title || applicationName,\n description: openGraph?.description || description,\n // If you add an twitter-image.(jpg|jpeg|png|gif) image to the /app folder, you don't need the code below\n // images: [openGraph?.image || defaults.og.image],\n card: \"summary_large_image\",\n creator: x_handle,\n },\n\n // If a canonical URL is given, we add it. The metadataBase will turn the relative URL into a fully qualified URL\n ...(canonicalUrlRelative && {\n alternates: { canonical: canonicalUrlRelative },\n }),\n\n // If you want to add extra tags, you can pass them here\n ...extraTags,\n };\n};"],"mappings":"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","names":["cache","notFound","exchangeToken","config","response","error","getFormattedDate","date","getVisiblePages","current","total","_","i","getAuthToken","cache","config","exchangeToken","getBlogPosts","params","token","queryString","key","value","url","response","getBlogPost","slug","locale","getBlogPaths","res","blog","generateMetadata","_a","_b","post","getFormattedDate","notFound","React","notFound","ArticleV2","PoweredByV2","ThemeWrapper","NextBlogPage","props","response","getBlogPost","notFound","post","htmlContent","price_id","React","ThemeWrapper","ArticleV2","PoweredByV2","error","React","ArticleGroupV2","ThemeWrapper","Pagination","PaginationContent","PaginationEllipsis","PaginationItem","PaginationLink","PaginationNext","PaginationPrevious","DEFAULT_BLOG_PER_PAGE","NextBlogListPage","props","_a","_b","_c","_d","_e","postsPerPage","searchParams","currentPage","locale","localeParam","queryParams","res","getBlogPosts","blogs","total","totalPages","visiblePages","getVisiblePages","React","ThemeWrapper","ArticleGroupV2","__spreadValues","Pagination","PaginationContent","PaginationItem","PaginationPrevious","pageNum","idx","PaginationEllipsis","PaginationLink","PaginationNext","tokenCache","CACHE_DURATION","getAuthToken","config","cacheKey","now","token","exchangeToken","getBlogPostsPageRouter","params","queryString","key","value","url","response","getBlogPostPageRouter","slug","locale","errorMessage","getBlogPathsPageRouter","blogs","blog","ArticleGroupV2","ThemeWrapper","React","Pagination","PaginationContent","PaginationEllipsis","PaginationItem","PaginationLink","PaginationNext","PaginationPrevious","DEFAULT_BLOG_PER_PAGE","NextBlogListPageForPageRouter","props","_a","_b","_c","visiblePages","getVisiblePages","localeParam","React","ThemeWrapper","ArticleGroupV2","__spreadValues","Pagination","PaginationContent","PaginationItem","PaginationPrevious","pageNum","idx","PaginationEllipsis","PaginationLink","PaginationNext","withServerSideProps","pageConfig","query","currentPage","postsPerPage","locale","response","getBlogPostsPageRouter","blogs","total","totalPages","error","ArticleV2","PoweredByV2","ThemeWrapper","React","NextBlogPageForPageRouter","props","ThemeWrapper","ArticleV2","PoweredByV2","withStaticProps","pageConfig","params","response","getBlogPostPageRouter","error","getBlogPathsPageRouter","getSEOTags","title","description","keywords","openGraph","canonicalUrlRelative","extraTags","applicationName","domainName","x_handle","locale","__spreadValues"]}
1
+ {"version":3,"sources":["../src/NextAppRouterUtils.ts","../src/BaseUtils.ts","../src/utils.ts","../src/NextBlogPage.tsx","../src/NextBlogListPage.tsx","../src/NextPageRouterUtils.ts","../src/NextBlogListPageForPageRouter.tsx","../src/NextBlogPageForPageRouter.tsx","../src/seo.ts"],"sourcesContent":["import { cache } from \"react\";\nimport { EasyBlogConfig, IQueryParams } from \"./models\";\nimport { Metadata } from \"next\";\nimport { notFound } from \"next/navigation\";\nimport { exchangeToken } from './BaseUtils';\nimport { getFormattedDate } from \"./utils\";\n\n// Cached token getter\nconst getAuthToken = cache(async (config: EasyBlogConfig): Promise<string | null> => {\n return exchangeToken(config);\n});\n \n// Server-side data fetching functions\nasync function getBlogPosts(config: EasyBlogConfig, params: IQueryParams = {}) {\n const token = await getAuthToken(config);\n\n const queryString = new URLSearchParams(\n Object.entries(params).map(([key, value]) => [key, String(value)])\n ).toString();\n\n const url = `${config.apiUrl}/sdk/blogs${queryString ? `?${queryString}` : ''}`;\n\n const response = await fetch(url, {\n headers: { \n 'Authorization': `Bearer ${token}`,\n 'x-project-id': config.projectId\n },\n next: { \n revalidate: 60,\n }\n });\n\n if (!response.ok) {\n console.error('Failed to fetch blog posts:', response);\n throw new Error(`Failed to fetch blog posts: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json();\n return data;\n}\n\nasync function getBlogPost(config: EasyBlogConfig, slug: string, locale?: string) {\n const token = await getAuthToken(config);\n\n const url = `${config.apiUrl}/sdk/blogs/${slug}${locale ? `?locale=${locale}` : ''}`;\n const response = await fetch(url, {\n headers: { \n 'Authorization': `Bearer ${token}`,\n 'x-project-id': config.projectId\n },\n next: { \n revalidate: 60,\n }\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch blog post: ${response.status} ${response.statusText}`);\n }\n\n return response.json();\n}\n\nasync function getBlogPaths(config: EasyBlogConfig, locale?: string) {\n const res = await getBlogPosts(config, { index: 0, limit: 10000});\n if (!res.blogs) return [];\n return res.blogs.map((blog: any) => ({ slug: blog.slug }));\n}\n\nasync function generateMetadata(config: EasyBlogConfig, slug?: string, locale?: string): Promise<Metadata> {\n if (slug) {\n const post = await getBlogPost(config, slug, locale);\n if (!post) return notFound();\n\n return {\n title: post.title,\n description: post.excerpt?.substring(0, 160),\n openGraph: {\n title: post.title,\n description: post.excerpt?.substring(0, 160),\n type: 'article',\n publishedTime: getFormattedDate(post.created_at),\n tags: post.tags,\n },\n };\n }\n\n return {\n title: 'Blog',\n description: 'Read our latest blog posts',\n openGraph: {\n title: 'Blog',\n description: 'Read our latest blog posts',\n type: 'website',\n },\n };\n}\n\n// Server exports\nexport {\n generateMetadata,\n getBlogPost,\n getBlogPosts,\n getBlogPaths,\n};\n","// Base functionality shared between both routers\nimport { EasyBlogConfig, IQueryParams } from \"./models\";\n\nexport async function exchangeToken(config: EasyBlogConfig): Promise<string | null> {\n try {\n const response = await fetch(`${config.apiUrl}/exchange-token`, {\n method: 'POST',\n headers: { \n 'Authorization': `Bearer ${config.apiKey}`,\n 'x-project-id': config.projectId\n }\n });\n\n if (!response.ok) {\n console.error('Failed to exchange token:', response);\n throw new Error('Failed to authenticate');\n }\n\n const data = await response.json();\n return data.token;\n } catch (error) {\n console.error('Failed to exchange token:', error);\n return null;\n }\n}\n\n\nexport async function getBlogPostsBase(config: EasyBlogConfig, params: IQueryParams = {}) {\n const token = await exchangeToken(config);\n\n const queryString = new URLSearchParams(\n Object.entries(params).map(([key, value]) => [key, String(value)])\n ).toString();\n\n const url = `${config.apiUrl}/sdk/blogs${queryString ? `?${queryString}` : ''}`;\n\n return { url, token };\n}\n\nexport async function getBlogPostBase(config: EasyBlogConfig, slug: string, locale?: string) {\n const token = await exchangeToken(config);\n const url = `${config.apiUrl}/sdk/blogs/${slug}${locale ? `?locale=${locale}` : ''}`;\n return { url, token };\n}","import { IQueryParams } from \"./models\";\n\nexport function buildQueryParams(params: IQueryParams): string {\n const queryParams = new URLSearchParams();\n params.index && queryParams.set('index', params.index.toString());\n params.limit && queryParams.set('limit', params.limit.toString());\n if (params.category) queryParams.set('category', params.category);\n if (params.tags) queryParams.set('tags', [params.tags].join(','));\n return queryParams.toString();\n}\n\nexport const getFormattedDate = (date: Date) => {\n if (!date) return '';\n return new Date(date).toISOString().split('T')[0];\n}\n\n// Helper function to generate visible page numbers\nexport const getVisiblePages = (current: number, total: number) => {\n if (total <= 7) return Array.from({ length: total }, (_, i) => i + 1);\n \n if (current <= 3) return [1, 2, 3, 4, 5, null, total];\n if (current >= total - 2) return [1, null, total - 4, total - 3, total - 2, total - 1, total];\n \n return [1, null, current - 1, current, current + 1, null, total];\n};","import React from 'react';\nimport { notFound } from 'next/navigation'\nimport { ArticleV2, PoweredByV2, Theme, ThemeWrapper } from '@weekend-studio/easyblog-components';\nimport { EasyBlogConfig } from './models';\nimport { getBlogPost } from './NextAppRouterUtils';\n\ninterface NextBlogPageProps {\n config: EasyBlogConfig;\n darkMode?: boolean;\n showAuthor?: boolean;\n showDate?: boolean;\n showCategory?: boolean;\n showTags?: boolean;\n slug: string;\n locale?: string;\n style?: React.CSSProperties;\n showToc?: boolean;\n customTheme?: Theme;\n}\n\nexport async function NextBlogPage(props: NextBlogPageProps) {\n try {\n const response = await getBlogPost({\n apiKey: props.config.apiKey,\n projectId: props.config.projectId,\n apiUrl: props.config.apiUrl\n }, props.slug, props.locale);\n if (!response.blog) return notFound();\n const post = response.blog;\n const htmlContent = response.html_content;\n const price_id = response.price_id;\n\n return (\n <ThemeWrapper \n initialMode={props.darkMode ? 'dark' : 'light'} \n customTheme={props.customTheme}>\n <div style={{ display: 'flex', maxWidth: '1200px', marginLeft: 'auto', marginRight: 'auto' }}>\n <ArticleV2 \n post={post} \n content={htmlContent}\n showAuthor={props.showAuthor}\n showDate={props.showDate}\n showCategory={props.showCategory}\n showTags={props.showTags}\n showToc={props.showToc}\n />\n </div>\n {price_id == null && \n <div style={{ position: 'fixed', bottom: '1rem', right: '1rem', display: 'flex', justifyContent: 'center', alignItems: 'center' }}>\n <PoweredByV2 />\n </div>\n }\n </ThemeWrapper>\n );\n } catch (error) {\n return notFound();\n }\n}\n","import React from 'react';\nimport { getBlogPosts } from './NextAppRouterUtils';\nimport { \n ArticleGroupV2, \n ThemeWrapper,\n Pagination,\n PaginationContent,\n PaginationEllipsis,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n Theme,\n} from '@weekend-studio/easyblog-components';\nimport { EasyBlogConfig, IQueryParams } from './models';\nimport { getVisiblePages } from './utils';\n\nconst DEFAULT_BLOG_PER_PAGE = 9;\n\ninterface NextBlogListPageProps {\n config: EasyBlogConfig;\n locale?: string;\n searchParams?: {\n page?: string;\n category?: string;\n tags?: string;\n };\n displayOptions?: {\n type?: 'grid' | 'list';\n isDarkMode?: boolean;\n showThumbnail?: boolean;\n showReadingTime?: boolean;\n showExcerpt?: boolean;\n showTags?: boolean;\n showDate?: boolean;\n showAuthor?: boolean;\n showCategory?: boolean;\n isNextPage?: boolean;\n blogPerPage?: number;\n customTheme?: Theme;\n }\n}\n\nexport async function NextBlogListPage(props: NextBlogListPageProps) {\n const postsPerPage = props.displayOptions?.blogPerPage || DEFAULT_BLOG_PER_PAGE;\n const searchParams = await props.searchParams || {};\n const currentPage = Number(searchParams.page) || 1;\n\n const locale = props.locale;\n const basePath = locale ? `/${locale}/blogs` : '/blogs';\n\n const queryParams: IQueryParams = {\n index: (currentPage - 1) * postsPerPage,\n limit: postsPerPage,\n category: searchParams.category || '',\n tags: searchParams.tags?.split(',') || [],\n locale,\n }\n\n const res = await getBlogPosts(\n props.config, \n queryParams\n );\n\n const { blogs, total } = res;\n\n const totalPages = Math.ceil(total / queryParams.limit!);\n const visiblePages = getVisiblePages(currentPage, totalPages);\n\n return (\n <ThemeWrapper \n initialMode={props.displayOptions?.isDarkMode ? 'dark': 'light'}\n customTheme={props.displayOptions?.customTheme} \n >\n <ArticleGroupV2\n blogs={blogs} \n type={props.displayOptions?.type}\n {...props.displayOptions}\n />\n {totalPages > 1 && (\n <Pagination style={{ marginTop: '2rem' }}>\n <PaginationContent>\n {currentPage > 1 && (\n <PaginationItem>\n <PaginationPrevious href={`${basePath}?page=${currentPage - 1}`} />\n </PaginationItem>\n )}\n\n {visiblePages.map((pageNum, idx) => (\n pageNum === null ? (\n <PaginationItem key={`ellipsis-${idx}`}>\n <PaginationEllipsis />\n </PaginationItem>\n ) : (\n <PaginationItem key={pageNum}>\n <PaginationLink\n href={`${basePath}?page=${pageNum}`}\n isActive={pageNum === currentPage}\n >\n {pageNum}\n </PaginationLink>\n </PaginationItem>\n )\n ))}\n\n {currentPage < totalPages && (\n <PaginationItem>\n <PaginationNext href={`${basePath}?page=${currentPage + 1}`} />\n </PaginationItem>\n )}\n </PaginationContent>\n </Pagination>\n )}\n </ThemeWrapper>\n );\n}\n","import { EasyBlogConfig, IQueryParams } from \"./models\";\nimport { exchangeToken } from './BaseUtils';\n\n// For Pages Router: Use in-memory cache with expiration\nlet tokenCache: { [key: string]: { token: string | null; expires: number } } = {};\nconst CACHE_DURATION = 3600000; // 1 hour in milliseconds\n\nasync function getAuthToken(config: EasyBlogConfig): Promise<string | null> {\n const cacheKey = `${config.projectId}-${config.apiKey}`;\n const now = Date.now();\n\n // Check cache\n if (tokenCache[cacheKey] && tokenCache[cacheKey].expires > now) {\n return tokenCache[cacheKey].token;\n }\n\n // Get new token\n const token = await exchangeToken(config);\n \n // Update cache\n tokenCache[cacheKey] = {\n token,\n expires: now + CACHE_DURATION\n };\n\n return token;\n}\n\nexport async function getBlogPostsPageRouter(config: EasyBlogConfig, params: IQueryParams = {}) {\n const token = await getAuthToken(config);\n\n const queryString = new URLSearchParams(\n Object.entries(params).map(([key, value]) => [key, String(value)])\n ).toString();\n\n const url = `${config.apiUrl}/sdk/blogs${queryString ? `?${queryString}` : ''}`;\n\n const response = await fetch(url, {\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'x-project-id': config.projectId\n },\n next: {\n revalidate: 60,\n }\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch blog posts: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json();\n return data;\n}\n\nexport async function getBlogPostPageRouter(config: EasyBlogConfig, slug: string, locale?: string) {\n const token = await getAuthToken(config);\n\n const url = `${config.apiUrl}/sdk/blogs/${slug}${locale ? `?locale=${locale}` : ''}`;\n const response = await fetch(url, {\n headers: { \n 'Authorization': `Bearer ${token}`,\n 'x-project-id': config.projectId\n },\n next: {\n revalidate: 60,\n }\n });\n\n if (!response.ok) {\n const errorMessage = `Failed to fetch blog post: ${response.status} ${response.statusText}`;\n throw new Error(errorMessage);\n }\n\n return response.json();\n}\n\nexport async function getBlogPathsPageRouter(config: EasyBlogConfig, locale?: string) {\n const { blogs } = await getBlogPostsPageRouter(config, { index: 0, limit: 10000, locale });\n return blogs.map((blog: any) => ({ \n params: { slug: blog.slug } \n }));\n}\n\n// Optional: Cache cleanup\nsetInterval(() => {\n const now = Date.now();\n Object.keys(tokenCache).forEach(key => {\n if (tokenCache[key].expires <= now) {\n delete tokenCache[key];\n }\n });\n}, CACHE_DURATION);\n","import { getBlogPostsPageRouter } from './NextPageRouterUtils';\nimport { ArticleGroupV2, Theme, ThemeWrapper } from '@weekend-studio/easyblog-components';\nimport { EasyBlogConfig } from './models';\nimport React from 'react';\nimport {\n Pagination,\n PaginationContent,\n PaginationEllipsis,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n} from \"@weekend-studio/easyblog-components\"\nimport { getVisiblePages } from './utils';\n\nconst DEFAULT_BLOG_PER_PAGE = 9;\n\ninterface NextBlogListPageForPageRouterProps {\n blogs: any[];\n currentPage: number;\n totalPages: number;\n locale?: string;\n displayOptions?: {\n type?: 'grid' | 'list';\n darkMode?: boolean;\n showThumbnail?: boolean;\n showReadingTime?: boolean;\n showExcerpt?: boolean;\n showTags?: boolean;\n showDate?: boolean;\n showAuthor?: boolean;\n showCategory?: boolean;\n isNextPage?: boolean;\n blogPerPage?: number;\n customTheme?: Theme;\n }\n}\n\ninterface GetStaticPropsParams {\n config: EasyBlogConfig;\n displayOptions?: NextBlogListPageForPageRouterProps['displayOptions'];\n locale?: string;\n}\n\nexport function NextBlogListPageForPageRouter(props: NextBlogListPageForPageRouterProps) {\n if (!props.blogs) {\n return null;\n }\n\n const visiblePages = getVisiblePages(props.currentPage, props.totalPages);\n const basePath = props.locale ? `/${props.locale}/blogs` : '/blogs';\n\n return (\n <ThemeWrapper \n initialMode={props.displayOptions?.darkMode ? 'dark' : 'light'}\n customTheme={props.displayOptions?.customTheme}\n >\n <ArticleGroupV2 \n blogs={props.blogs} \n type={props.displayOptions?.type}\n {...props.displayOptions}\n />\n \n {props.totalPages > 1 && (\n <Pagination style={{ marginTop: '2rem' }}>\n <PaginationContent>\n {props.currentPage > 1 && (\n <PaginationItem>\n <PaginationPrevious href={`${basePath}?page=${props.currentPage - 1}`} />\n </PaginationItem>\n )}\n\n {visiblePages.map((pageNum, idx) => (\n pageNum === null ? (\n <PaginationItem key={`ellipsis-${idx}`}>\n <PaginationEllipsis />\n </PaginationItem>\n ) : (\n <PaginationItem key={pageNum}>\n <PaginationLink\n href={`${basePath}?page=${pageNum}`}\n isActive={pageNum === props.currentPage}\n >\n {pageNum}\n </PaginationLink>\n </PaginationItem>\n )\n ))}\n\n {props.currentPage < props.totalPages && (\n <PaginationItem>\n <PaginationNext href={`${basePath}?page=${props.currentPage + 1}`} />\n </PaginationItem>\n )}\n </PaginationContent>\n </Pagination>\n )}\n </ThemeWrapper>\n );\n}\n\nexport function withServerSideProps(pageConfig: GetStaticPropsParams) {\n return {\n async getServerSideProps({ query, params }: { query: {\n page?: string,\n category?: string,\n tags?: string,\n }, params?: { locale?: string } }) {\n try {\n const currentPage = query.page ? parseInt(query.page as string) : 1;\n const postsPerPage = pageConfig.displayOptions?.blogPerPage || DEFAULT_BLOG_PER_PAGE;\n const locale = params?.locale || pageConfig.locale;\n\n const response = await getBlogPostsPageRouter(pageConfig.config, {\n index: (currentPage - 1) * postsPerPage,\n limit: postsPerPage,\n category: query.category || '',\n tags: query.tags?.split(',') || [],\n locale,\n });\n\n // Add defensive checks\n if (!response || typeof response !== 'object') {\n console.error('Invalid API response format');\n return {\n props: {\n blogs: [],\n displayOptions: pageConfig.displayOptions || {},\n currentPage: 1,\n totalPages: 0\n }\n };\n }\n\n const { blogs = [], total = 0 } = response;\n const totalPages = Math.ceil(total / postsPerPage);\n\n return {\n props: {\n blogs,\n displayOptions: pageConfig.displayOptions || {},\n currentPage,\n totalPages,\n locale,\n }\n };\n } catch (error) {\n console.error('Error fetching blog posts:', error);\n // Return empty props instead of notFound\n return {\n props: {\n blogs: [],\n displayOptions: pageConfig.displayOptions || {},\n currentPage: 1,\n totalPages: 0\n }\n };\n }\n }\n };\n}","'use client';\n\nimport { ArticleV2, PoweredByV2, Theme, ThemeWrapper } from '@weekend-studio/easyblog-components';\nimport { EasyBlogConfig } from './models';\nimport { getBlogPathsPageRouter, getBlogPostPageRouter } from './NextPageRouterUtils';\nimport React from 'react';\n\ninterface NextBlogPageForPageRouterProps {\n post: any;\n htmlContent: string;\n config: EasyBlogConfig;\n price_id: string | null;\n darkMode?: boolean;\n showAuthor?: boolean;\n showDate?: boolean;\n showCategory?: boolean;\n showTags?: boolean;\n showToc?: boolean;\n customTheme?: Theme;\n}\n\ninterface GetStaticPropsParams {\n config: EasyBlogConfig;\n locale?: string;\n}\n\nexport function NextBlogPageForPageRouter(props: NextBlogPageForPageRouterProps) {\n if (!props.post) {\n return null; // Or your custom 404 component\n }\n\n return (\n <ThemeWrapper \n initialMode={props.darkMode ? 'dark' : 'light'} \n customTheme={props.customTheme}\n >\n <div style={{ \n display: 'flex', \n maxWidth: '1200px', \n marginLeft: 'auto', \n marginRight: 'auto' }}\n >\n <ArticleV2\n post={props.post} \n content={props.htmlContent}\n showAuthor={props.showAuthor}\n showDate={props.showDate}\n showCategory={props.showCategory}\n showTags={props.showTags}\n showToc={props.showToc}\n />\n </div>\n {props.price_id == null && \n <div style={{ position: 'fixed', bottom: '1rem', right: '1rem', display: 'flex', justifyContent: 'center', alignItems: 'center' }}>\n <PoweredByV2 />\n </div>\n }\n </ThemeWrapper>\n );\n}\n\nexport function withStaticProps(pageConfig: GetStaticPropsParams) {\n return {\n async getStaticProps({ params }: { params: { slug: string, locale?: string } }) {\n try {\n const locale = params.locale || pageConfig.locale;\n const response = await getBlogPostPageRouter({\n apiKey: pageConfig.config.apiKey,\n projectId: pageConfig.config.projectId,\n apiUrl: pageConfig.config.apiUrl\n }, params.slug, locale);\n\n if (!response.blog) {\n return {\n notFound: true\n };\n }\n\n return {\n props: {\n post: response.blog,\n htmlContent: response.html_content,\n price_id: response.price_id\n },\n revalidate: 60\n };\n } catch (error) {\n console.error('Error fetching blog post:', error);\n return {\n notFound: true\n };\n }\n },\n\n async getStaticPaths() {\n try {\n const paths = await getBlogPathsPageRouter(pageConfig.config, pageConfig.locale);\n \n return {\n paths,\n fallback: 'blocking'\n };\n } catch (error) {\n console.error('Error fetching blog slugs:', error);\n return {\n paths: [],\n fallback: 'blocking'\n };\n }\n }\n }\n}\n","// See https://shipfa.st/docs/features/seo\n\nimport type { Metadata } from \"next\";\n\nexport interface GetSEOTagsParams extends Metadata {\n canonicalUrlRelative: string;\n extraTags: Record<string, any>;\n applicationName: string;\n description: string;\n domainName: string;\n x_handle: string;\n locale?: string;\n}\n\nexport const getSEOTags = ({\n title,\n description,\n keywords,\n openGraph,\n canonicalUrlRelative,\n extraTags,\n applicationName,\n domainName,\n x_handle,\n locale = \"en_US\",\n}: GetSEOTagsParams) => {\n return {\n // up to 50 characters (what does your app do for the user?) > your main should be here\n title,\n // up to 160 characters (how does your app help the user?)\n description,\n // some keywords separated by commas. by default it will be your app name\n keywords,\n applicationName,\n // set a base URL prefix for other fields that require a fully qualified URL (.e.g og:image: og:image: 'https://yourdomain.com/share.png' => '/share.png')\n metadataBase: new URL(`https://${domainName}/`),\n\n openGraph: {\n title: openGraph?.title || applicationName,\n description: openGraph?.description || description,\n url: openGraph?.url || `https://${domainName}/`,\n siteName: openGraph?.title || applicationName,\n // If you add an opengraph-image.(jpg|jpeg|png|gif) image to the /app folder, you don't need the code below\n // images: [\n // {\n // url: `https://${config.domainName}/share.png`,\n // width: 1200,\n // height: 660,\n // },\n // ],\n locale,\n type: \"website\",\n },\n\n twitter: {\n title: openGraph?.title || applicationName,\n description: openGraph?.description || description,\n // If you add an twitter-image.(jpg|jpeg|png|gif) image to the /app folder, you don't need the code below\n // images: [openGraph?.image || defaults.og.image],\n card: \"summary_large_image\",\n creator: x_handle,\n },\n\n // If a canonical URL is given, we add it. The metadataBase will turn the relative URL into a fully qualified URL\n ...(canonicalUrlRelative && {\n alternates: { canonical: canonicalUrlRelative },\n }),\n\n // If you want to add extra tags, you can pass them here\n ...extraTags,\n };\n};"],"mappings":"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","names":["cache","notFound","exchangeToken","config","response","error","getFormattedDate","date","getVisiblePages","current","total","_","i","getAuthToken","cache","config","exchangeToken","getBlogPosts","params","token","queryString","key","value","url","response","getBlogPost","slug","locale","getBlogPaths","res","blog","generateMetadata","_a","_b","post","getFormattedDate","notFound","React","notFound","ArticleV2","PoweredByV2","ThemeWrapper","NextBlogPage","props","response","getBlogPost","notFound","post","htmlContent","price_id","React","ThemeWrapper","ArticleV2","PoweredByV2","error","React","ArticleGroupV2","ThemeWrapper","Pagination","PaginationContent","PaginationEllipsis","PaginationItem","PaginationLink","PaginationNext","PaginationPrevious","DEFAULT_BLOG_PER_PAGE","NextBlogListPage","props","_a","_b","_c","_d","_e","postsPerPage","searchParams","currentPage","locale","basePath","queryParams","res","getBlogPosts","blogs","total","totalPages","visiblePages","getVisiblePages","React","ThemeWrapper","ArticleGroupV2","__spreadValues","Pagination","PaginationContent","PaginationItem","PaginationPrevious","pageNum","idx","PaginationEllipsis","PaginationLink","PaginationNext","tokenCache","CACHE_DURATION","getAuthToken","config","cacheKey","now","token","exchangeToken","getBlogPostsPageRouter","params","queryString","key","value","url","response","getBlogPostPageRouter","slug","locale","errorMessage","getBlogPathsPageRouter","blogs","blog","ArticleGroupV2","ThemeWrapper","React","Pagination","PaginationContent","PaginationEllipsis","PaginationItem","PaginationLink","PaginationNext","PaginationPrevious","DEFAULT_BLOG_PER_PAGE","NextBlogListPageForPageRouter","props","_a","_b","_c","visiblePages","getVisiblePages","basePath","React","ThemeWrapper","ArticleGroupV2","__spreadValues","Pagination","PaginationContent","PaginationItem","PaginationPrevious","pageNum","idx","PaginationEllipsis","PaginationLink","PaginationNext","withServerSideProps","pageConfig","query","params","currentPage","postsPerPage","locale","response","getBlogPostsPageRouter","blogs","total","totalPages","error","ArticleV2","PoweredByV2","ThemeWrapper","React","NextBlogPageForPageRouter","props","ThemeWrapper","ArticleV2","PoweredByV2","withStaticProps","pageConfig","params","locale","response","getBlogPostPageRouter","error","getBlogPathsPageRouter","getSEOTags","title","description","keywords","openGraph","canonicalUrlRelative","extraTags","applicationName","domainName","x_handle","locale","__spreadValues"]}
@@ -29,11 +29,13 @@ interface GetStaticPropsParams$1 {
29
29
  }
30
30
  declare function NextBlogListPageForPageRouter(props: NextBlogListPageForPageRouterProps): React.JSX.Element | null;
31
31
  declare function withServerSideProps(pageConfig: GetStaticPropsParams$1): {
32
- getServerSideProps({ query }: {
32
+ getServerSideProps({ query, params }: {
33
33
  query: {
34
34
  page?: string;
35
35
  category?: string;
36
36
  tags?: string;
37
+ };
38
+ params?: {
37
39
  locale?: string;
38
40
  };
39
41
  }): Promise<{
@@ -76,7 +78,7 @@ declare function withServerSideProps(pageConfig: GetStaticPropsParams$1): {
76
78
  };
77
79
  currentPage: number;
78
80
  totalPages: number;
79
- locale: string;
81
+ locale: string | undefined;
80
82
  };
81
83
  }>;
82
84
  };
@@ -103,6 +105,7 @@ declare function withStaticProps(pageConfig: GetStaticPropsParams): {
103
105
  getStaticProps({ params }: {
104
106
  params: {
105
107
  slug: string;
108
+ locale?: string;
106
109
  };
107
110
  }): Promise<{
108
111
  notFound: boolean;
@@ -1,2 +1,2 @@
1
- var E=Object.defineProperty;var f=Object.getOwnPropertySymbols;var I=Object.prototype.hasOwnProperty,O=Object.prototype.propertyIsEnumerable;var b=(t,e,o)=>e in t?E(t,e,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[e]=o,w=(t,e)=>{for(var o in e||(e={}))I.call(e,o)&&b(t,o,e[o]);if(f)for(var o of f(e))O.call(e,o)&&b(t,o,e[o]);return t};async function x(t){try{let e=await fetch(`${t.apiUrl}/exchange-token`,{method:"POST",headers:{Authorization:`Bearer ${t.apiKey}`,"x-project-id":t.projectId}});if(!e.ok)throw console.error("Failed to exchange token:",e),new Error("Failed to authenticate");return(await e.json()).token}catch(e){return console.error("Failed to exchange token:",e),null}}var g={},B=36e5;async function k(t){let e=`${t.projectId}-${t.apiKey}`,o=Date.now();if(g[e]&&g[e].expires>o)return g[e].token;let r=await x(t);return g[e]={token:r,expires:o+B},r}async function h(t,e={}){let o=await k(t),r=new URLSearchParams(Object.entries(e).map(([l,p])=>[l,String(p)])).toString(),s=`${t.apiUrl}/sdk/blogs${r?`?${r}`:""}`,a=await fetch(s,{headers:{Authorization:`Bearer ${o}`,"x-project-id":t.projectId},next:{revalidate:60}});if(!a.ok)throw new Error(`Failed to fetch blog posts: ${a.status} ${a.statusText}`);return await a.json()}async function d(t,e,o){let r=await k(t),s=`${t.apiUrl}/sdk/blogs/${e}${o?`?locale=${o}`:""}`,a=await fetch(s,{headers:{Authorization:`Bearer ${r}`,"x-project-id":t.projectId},next:{revalidate:60}});if(!a.ok){let i=`Failed to fetch blog post: ${a.status} ${a.statusText}`;throw new Error(i)}return a.json()}async function y(t,e){let{blogs:o}=await h(t,{index:0,limit:1e4,locale:e});return o.map(r=>({params:{slug:r.slug}}))}setInterval(()=>{let t=Date.now();Object.keys(g).forEach(e=>{g[e].expires<=t&&delete g[e]})},B);import{ArticleGroupV2 as j,ThemeWrapper as F}from"@weekend-studio/easyblog-components";import n from"react";import{Pagination as A,PaginationContent as C,PaginationEllipsis as v,PaginationItem as m,PaginationLink as L,PaginationNext as U,PaginationPrevious as D}from"@weekend-studio/easyblog-components";var T=(t,e)=>e<=7?Array.from({length:e},(o,r)=>r+1):t<=3?[1,2,3,4,5,null,e]:t>=e-2?[1,null,e-4,e-3,e-2,e-1,e]:[1,null,t-1,t,t+1,null,e];var R=9;function _(t){var r,s,a;if(!t.blogs)return null;let e=T(t.currentPage,t.totalPages),o=t.locale?`&locale=${t.locale}`:"";return n.createElement(F,{initialMode:(r=t.displayOptions)!=null&&r.darkMode?"dark":"light",customTheme:(s=t.displayOptions)==null?void 0:s.customTheme},n.createElement(j,w({blogs:t.blogs,type:(a=t.displayOptions)==null?void 0:a.type},t.displayOptions)),t.totalPages>1&&n.createElement(A,{style:{marginTop:"2rem"}},n.createElement(C,null,t.currentPage>1&&n.createElement(m,null,n.createElement(D,{href:`/blogs?page=${t.currentPage-1}${o}`})),e.map((i,l)=>i===null?n.createElement(m,{key:`ellipsis-${l}`},n.createElement(v,null)):n.createElement(m,{key:i},n.createElement(L,{href:`/blogs?page=${i}${o}`,isActive:i===t.currentPage},i))),t.currentPage<t.totalPages&&n.createElement(m,null,n.createElement(U,{href:`/blogs?page=${t.currentPage+1}${o}`})))))}function M(t){return{async getServerSideProps({query:e}){var o,r;try{let s=e.page?parseInt(e.page):1,a=((o=t.displayOptions)==null?void 0:o.blogPerPage)||R,i=e.locale||t.locale||"en",l=await h(t.config,{index:(s-1)*a,limit:a,category:e.category||"",tags:((r=e.tags)==null?void 0:r.split(","))||[],locale:i});if(!l||typeof l!="object")return console.error("Invalid API response format"),{props:{blogs:[],displayOptions:t.displayOptions||{},currentPage:1,totalPages:0}};let{blogs:p=[],total:S=0}=l,$=Math.ceil(S/a);return{props:{blogs:p,displayOptions:t.displayOptions||{},currentPage:s,totalPages:$,locale:i}}}catch(s){return console.error("Error fetching blog posts:",s),{props:{blogs:[],displayOptions:t.displayOptions||{},currentPage:1,totalPages:0}}}}}}import{ArticleV2 as N,PoweredByV2 as G,ThemeWrapper as Q}from"@weekend-studio/easyblog-components";import P from"react";function K(t){return t.post?P.createElement(Q,{initialMode:t.darkMode?"dark":"light",customTheme:t.customTheme},P.createElement("div",{style:{display:"flex",maxWidth:"1200px",marginLeft:"auto",marginRight:"auto"}},P.createElement(N,{post:t.post,content:t.htmlContent,showAuthor:t.showAuthor,showDate:t.showDate,showCategory:t.showCategory,showTags:t.showTags,showToc:t.showToc})),t.price_id==null&&P.createElement("div",{style:{position:"fixed",bottom:"1rem",right:"1rem",display:"flex",justifyContent:"center",alignItems:"center"}},P.createElement(G,null))):null}function V(t){return{async getStaticProps({params:e}){try{let o=await d({apiKey:t.config.apiKey,projectId:t.config.projectId,apiUrl:t.config.apiUrl},e.slug,t.locale);return o.blog?{props:{post:o.blog,htmlContent:o.html_content,price_id:o.price_id},revalidate:60}:{notFound:!0}}catch(o){return console.error("Error fetching blog post:",o),{notFound:!0}}},async getStaticPaths(){try{return{paths:await y(t.config,t.locale),fallback:"blocking"}}catch(e){return console.error("Error fetching blog slugs:",e),{paths:[],fallback:"blocking"}}}}}export{_ as NextBlogListPageForPageRouter,K as NextBlogPageForPageRouter,y as getBlogPathsPageRouter,d as getBlogPostPageRouter,h as getBlogPostsPageRouter,M as withListServerSideProps,V as withPageStaticProps};
1
+ var I=Object.defineProperty;var f=Object.getOwnPropertySymbols;var O=Object.prototype.hasOwnProperty,j=Object.prototype.propertyIsEnumerable;var b=(t,e,o)=>e in t?I(t,e,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[e]=o,w=(t,e)=>{for(var o in e||(e={}))O.call(e,o)&&b(t,o,e[o]);if(f)for(var o of f(e))j.call(e,o)&&b(t,o,e[o]);return t};async function x(t){try{let e=await fetch(`${t.apiUrl}/exchange-token`,{method:"POST",headers:{Authorization:`Bearer ${t.apiKey}`,"x-project-id":t.projectId}});if(!e.ok)throw console.error("Failed to exchange token:",e),new Error("Failed to authenticate");return(await e.json()).token}catch(e){return console.error("Failed to exchange token:",e),null}}var l={},B=36e5;async function k(t){let e=`${t.projectId}-${t.apiKey}`,o=Date.now();if(l[e]&&l[e].expires>o)return l[e].token;let r=await x(t);return l[e]={token:r,expires:o+B},r}async function m(t,e={}){let o=await k(t),r=new URLSearchParams(Object.entries(e).map(([g,c])=>[g,String(c)])).toString(),i=`${t.apiUrl}/sdk/blogs${r?`?${r}`:""}`,n=await fetch(i,{headers:{Authorization:`Bearer ${o}`,"x-project-id":t.projectId},next:{revalidate:60}});if(!n.ok)throw new Error(`Failed to fetch blog posts: ${n.status} ${n.statusText}`);return await n.json()}async function d(t,e,o){let r=await k(t),i=`${t.apiUrl}/sdk/blogs/${e}${o?`?locale=${o}`:""}`,n=await fetch(i,{headers:{Authorization:`Bearer ${r}`,"x-project-id":t.projectId},next:{revalidate:60}});if(!n.ok){let a=`Failed to fetch blog post: ${n.status} ${n.statusText}`;throw new Error(a)}return n.json()}async function y(t,e){let{blogs:o}=await m(t,{index:0,limit:1e4,locale:e});return o.map(r=>({params:{slug:r.slug}}))}setInterval(()=>{let t=Date.now();Object.keys(l).forEach(e=>{l[e].expires<=t&&delete l[e]})},B);import{ArticleGroupV2 as F,ThemeWrapper as A}from"@weekend-studio/easyblog-components";import s from"react";import{Pagination as C,PaginationContent as v,PaginationEllipsis as L,PaginationItem as p,PaginationLink as U,PaginationNext as D,PaginationPrevious as R}from"@weekend-studio/easyblog-components";var T=(t,e)=>e<=7?Array.from({length:e},(o,r)=>r+1):t<=3?[1,2,3,4,5,null,e]:t>=e-2?[1,null,e-4,e-3,e-2,e-1,e]:[1,null,t-1,t,t+1,null,e];var _=9;function M(t){var r,i,n;if(!t.blogs)return null;let e=T(t.currentPage,t.totalPages),o=t.locale?`/${t.locale}/blogs`:"/blogs";return s.createElement(A,{initialMode:(r=t.displayOptions)!=null&&r.darkMode?"dark":"light",customTheme:(i=t.displayOptions)==null?void 0:i.customTheme},s.createElement(F,w({blogs:t.blogs,type:(n=t.displayOptions)==null?void 0:n.type},t.displayOptions)),t.totalPages>1&&s.createElement(C,{style:{marginTop:"2rem"}},s.createElement(v,null,t.currentPage>1&&s.createElement(p,null,s.createElement(R,{href:`${o}?page=${t.currentPage-1}`})),e.map((a,g)=>a===null?s.createElement(p,{key:`ellipsis-${g}`},s.createElement(L,null)):s.createElement(p,{key:a},s.createElement(U,{href:`${o}?page=${a}`,isActive:a===t.currentPage},a))),t.currentPage<t.totalPages&&s.createElement(p,null,s.createElement(D,{href:`${o}?page=${t.currentPage+1}`})))))}function N(t){return{async getServerSideProps({query:e,params:o}){var r,i;try{let n=e.page?parseInt(e.page):1,a=((r=t.displayOptions)==null?void 0:r.blogPerPage)||_,g=(o==null?void 0:o.locale)||t.locale,c=await m(t.config,{index:(n-1)*a,limit:a,category:e.category||"",tags:((i=e.tags)==null?void 0:i.split(","))||[],locale:g});if(!c||typeof c!="object")return console.error("Invalid API response format"),{props:{blogs:[],displayOptions:t.displayOptions||{},currentPage:1,totalPages:0}};let{blogs:S=[],total:$=0}=c,E=Math.ceil($/a);return{props:{blogs:S,displayOptions:t.displayOptions||{},currentPage:n,totalPages:E,locale:g}}}catch(n){return console.error("Error fetching blog posts:",n),{props:{blogs:[],displayOptions:t.displayOptions||{},currentPage:1,totalPages:0}}}}}}import{ArticleV2 as G,PoweredByV2 as Q,ThemeWrapper as K}from"@weekend-studio/easyblog-components";import h from"react";function V(t){return t.post?h.createElement(K,{initialMode:t.darkMode?"dark":"light",customTheme:t.customTheme},h.createElement("div",{style:{display:"flex",maxWidth:"1200px",marginLeft:"auto",marginRight:"auto"}},h.createElement(G,{post:t.post,content:t.htmlContent,showAuthor:t.showAuthor,showDate:t.showDate,showCategory:t.showCategory,showTags:t.showTags,showToc:t.showToc})),t.price_id==null&&h.createElement("div",{style:{position:"fixed",bottom:"1rem",right:"1rem",display:"flex",justifyContent:"center",alignItems:"center"}},h.createElement(Q,null))):null}function W(t){return{async getStaticProps({params:e}){try{let o=e.locale||t.locale,r=await d({apiKey:t.config.apiKey,projectId:t.config.projectId,apiUrl:t.config.apiUrl},e.slug,o);return r.blog?{props:{post:r.blog,htmlContent:r.html_content,price_id:r.price_id},revalidate:60}:{notFound:!0}}catch(o){return console.error("Error fetching blog post:",o),{notFound:!0}}},async getStaticPaths(){try{return{paths:await y(t.config,t.locale),fallback:"blocking"}}catch(e){return console.error("Error fetching blog slugs:",e),{paths:[],fallback:"blocking"}}}}}export{M as NextBlogListPageForPageRouter,V as NextBlogPageForPageRouter,y as getBlogPathsPageRouter,d as getBlogPostPageRouter,m as getBlogPostsPageRouter,N as withListServerSideProps,W as withPageStaticProps};
2
2
  //# sourceMappingURL=page-index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/BaseUtils.ts","../src/NextPageRouterUtils.ts","../src/NextBlogListPageForPageRouter.tsx","../src/utils.ts","../src/NextBlogPageForPageRouter.tsx"],"sourcesContent":["// Base functionality shared between both routers\nimport { EasyBlogConfig, IQueryParams } from \"./models\";\n\nexport async function exchangeToken(config: EasyBlogConfig): Promise<string | null> {\n try {\n const response = await fetch(`${config.apiUrl}/exchange-token`, {\n method: 'POST',\n headers: { \n 'Authorization': `Bearer ${config.apiKey}`,\n 'x-project-id': config.projectId\n }\n });\n\n if (!response.ok) {\n console.error('Failed to exchange token:', response);\n throw new Error('Failed to authenticate');\n }\n\n const data = await response.json();\n return data.token;\n } catch (error) {\n console.error('Failed to exchange token:', error);\n return null;\n }\n}\n\n\nexport async function getBlogPostsBase(config: EasyBlogConfig, params: IQueryParams = {}) {\n const token = await exchangeToken(config);\n\n const queryString = new URLSearchParams(\n Object.entries(params).map(([key, value]) => [key, String(value)])\n ).toString();\n\n const url = `${config.apiUrl}/sdk/blogs${queryString ? `?${queryString}` : ''}`;\n\n return { url, token };\n}\n\nexport async function getBlogPostBase(config: EasyBlogConfig, slug: string, locale?: string) {\n const token = await exchangeToken(config);\n const url = `${config.apiUrl}/sdk/blogs/${slug}${locale ? `?locale=${locale}` : ''}`;\n return { url, token };\n}","import { EasyBlogConfig, IQueryParams } from \"./models\";\nimport { exchangeToken } from './BaseUtils';\n\n// For Pages Router: Use in-memory cache with expiration\nlet tokenCache: { [key: string]: { token: string | null; expires: number } } = {};\nconst CACHE_DURATION = 3600000; // 1 hour in milliseconds\n\nasync function getAuthToken(config: EasyBlogConfig): Promise<string | null> {\n const cacheKey = `${config.projectId}-${config.apiKey}`;\n const now = Date.now();\n\n // Check cache\n if (tokenCache[cacheKey] && tokenCache[cacheKey].expires > now) {\n return tokenCache[cacheKey].token;\n }\n\n // Get new token\n const token = await exchangeToken(config);\n \n // Update cache\n tokenCache[cacheKey] = {\n token,\n expires: now + CACHE_DURATION\n };\n\n return token;\n}\n\nexport async function getBlogPostsPageRouter(config: EasyBlogConfig, params: IQueryParams = {}) {\n const token = await getAuthToken(config);\n\n const queryString = new URLSearchParams(\n Object.entries(params).map(([key, value]) => [key, String(value)])\n ).toString();\n\n const url = `${config.apiUrl}/sdk/blogs${queryString ? `?${queryString}` : ''}`;\n\n const response = await fetch(url, {\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'x-project-id': config.projectId\n },\n next: {\n revalidate: 60,\n }\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch blog posts: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json();\n return data;\n}\n\nexport async function getBlogPostPageRouter(config: EasyBlogConfig, slug: string, locale?: string) {\n const token = await getAuthToken(config);\n\n const url = `${config.apiUrl}/sdk/blogs/${slug}${locale ? `?locale=${locale}` : ''}`;\n const response = await fetch(url, {\n headers: { \n 'Authorization': `Bearer ${token}`,\n 'x-project-id': config.projectId\n },\n next: {\n revalidate: 60,\n }\n });\n\n if (!response.ok) {\n const errorMessage = `Failed to fetch blog post: ${response.status} ${response.statusText}`;\n throw new Error(errorMessage);\n }\n\n return response.json();\n}\n\nexport async function getBlogPathsPageRouter(config: EasyBlogConfig, locale?: string) {\n const { blogs } = await getBlogPostsPageRouter(config, { index: 0, limit: 10000, locale });\n return blogs.map((blog: any) => ({ \n params: { slug: blog.slug } \n }));\n}\n\n// Optional: Cache cleanup\nsetInterval(() => {\n const now = Date.now();\n Object.keys(tokenCache).forEach(key => {\n if (tokenCache[key].expires <= now) {\n delete tokenCache[key];\n }\n });\n}, CACHE_DURATION);\n","import { getBlogPostsPageRouter } from './NextPageRouterUtils';\nimport { ArticleGroupV2, Theme, ThemeWrapper } from '@weekend-studio/easyblog-components';\nimport { EasyBlogConfig } from './models';\nimport React from 'react';\nimport {\n Pagination,\n PaginationContent,\n PaginationEllipsis,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n} from \"@weekend-studio/easyblog-components\"\nimport { getVisiblePages } from './utils';\n\nconst DEFAULT_BLOG_PER_PAGE = 9;\n\ninterface NextBlogListPageForPageRouterProps {\n blogs: any[];\n currentPage: number;\n totalPages: number;\n locale?: string;\n displayOptions?: {\n type?: 'grid' | 'list';\n darkMode?: boolean;\n showThumbnail?: boolean;\n showReadingTime?: boolean;\n showExcerpt?: boolean;\n showTags?: boolean;\n showDate?: boolean;\n showAuthor?: boolean;\n showCategory?: boolean;\n isNextPage?: boolean;\n blogPerPage?: number;\n customTheme?: Theme;\n }\n}\n\ninterface GetStaticPropsParams {\n config: EasyBlogConfig;\n displayOptions?: NextBlogListPageForPageRouterProps['displayOptions'];\n locale?: string;\n}\n\nexport function NextBlogListPageForPageRouter(props: NextBlogListPageForPageRouterProps) {\n if (!props.blogs) {\n return null;\n }\n\n const visiblePages = getVisiblePages(props.currentPage, props.totalPages);\n const localeParam = props.locale ? `&locale=${props.locale}` : '';\n\n return (\n <ThemeWrapper \n initialMode={props.displayOptions?.darkMode ? 'dark' : 'light'}\n customTheme={props.displayOptions?.customTheme}\n >\n <ArticleGroupV2 \n blogs={props.blogs} \n type={props.displayOptions?.type}\n {...props.displayOptions}\n />\n \n {props.totalPages > 1 && (\n <Pagination style={{ marginTop: '2rem' }}>\n <PaginationContent>\n {props.currentPage > 1 && (\n <PaginationItem>\n <PaginationPrevious href={`/blogs?page=${props.currentPage - 1}${localeParam}`} />\n </PaginationItem>\n )}\n\n {visiblePages.map((pageNum, idx) => (\n pageNum === null ? (\n <PaginationItem key={`ellipsis-${idx}`}>\n <PaginationEllipsis />\n </PaginationItem>\n ) : (\n <PaginationItem key={pageNum}>\n <PaginationLink\n href={`/blogs?page=${pageNum}${localeParam}`}\n isActive={pageNum === props.currentPage}\n >\n {pageNum}\n </PaginationLink>\n </PaginationItem>\n )\n ))}\n\n {props.currentPage < props.totalPages && (\n <PaginationItem>\n <PaginationNext href={`/blogs?page=${props.currentPage + 1}${localeParam}`} />\n </PaginationItem>\n )}\n </PaginationContent>\n </Pagination>\n )}\n </ThemeWrapper>\n );\n}\n\nexport function withServerSideProps(pageConfig: GetStaticPropsParams) {\n return {\n async getServerSideProps({ query }: { query: {\n page?: string,\n category?: string,\n tags?: string,\n locale?: string\n } }) {\n try {\n const currentPage = query.page ? parseInt(query.page as string) : 1;\n const postsPerPage = pageConfig.displayOptions?.blogPerPage || DEFAULT_BLOG_PER_PAGE;\n const locale = query.locale || pageConfig.locale || 'en';\n\n const response = await getBlogPostsPageRouter(pageConfig.config, {\n index: (currentPage - 1) * postsPerPage,\n limit: postsPerPage,\n category: query.category || '',\n tags: query.tags?.split(',') || [],\n locale,\n });\n\n // Add defensive checks\n if (!response || typeof response !== 'object') {\n console.error('Invalid API response format');\n return {\n props: {\n blogs: [],\n displayOptions: pageConfig.displayOptions || {},\n currentPage: 1,\n totalPages: 0\n }\n };\n }\n\n const { blogs = [], total = 0 } = response;\n const totalPages = Math.ceil(total / postsPerPage);\n\n return {\n props: {\n blogs,\n displayOptions: pageConfig.displayOptions || {},\n currentPage,\n totalPages,\n locale,\n }\n };\n } catch (error) {\n console.error('Error fetching blog posts:', error);\n // Return empty props instead of notFound\n return {\n props: {\n blogs: [],\n displayOptions: pageConfig.displayOptions || {},\n currentPage: 1,\n totalPages: 0\n }\n };\n }\n }\n };\n}","import { IQueryParams } from \"./models\";\n\nexport function buildQueryParams(params: IQueryParams): string {\n const queryParams = new URLSearchParams();\n params.index && queryParams.set('index', params.index.toString());\n params.limit && queryParams.set('limit', params.limit.toString());\n if (params.category) queryParams.set('category', params.category);\n if (params.tags) queryParams.set('tags', [params.tags].join(','));\n return queryParams.toString();\n}\n\nexport const getFormattedDate = (date: Date) => {\n if (!date) return '';\n return new Date(date).toISOString().split('T')[0];\n}\n\n// Helper function to generate visible page numbers\nexport const getVisiblePages = (current: number, total: number) => {\n if (total <= 7) return Array.from({ length: total }, (_, i) => i + 1);\n \n if (current <= 3) return [1, 2, 3, 4, 5, null, total];\n if (current >= total - 2) return [1, null, total - 4, total - 3, total - 2, total - 1, total];\n \n return [1, null, current - 1, current, current + 1, null, total];\n};","'use client';\n\nimport { ArticleV2, PoweredByV2, Theme, ThemeWrapper } from '@weekend-studio/easyblog-components';\nimport { EasyBlogConfig } from './models';\nimport { getBlogPathsPageRouter, getBlogPostPageRouter } from './NextPageRouterUtils';\nimport React from 'react';\n\ninterface NextBlogPageForPageRouterProps {\n post: any;\n htmlContent: string;\n config: EasyBlogConfig;\n price_id: string | null;\n darkMode?: boolean;\n showAuthor?: boolean;\n showDate?: boolean;\n showCategory?: boolean;\n showTags?: boolean;\n showToc?: boolean;\n customTheme?: Theme;\n}\n\ninterface GetStaticPropsParams {\n config: EasyBlogConfig;\n locale?: string;\n}\n\nexport function NextBlogPageForPageRouter(props: NextBlogPageForPageRouterProps) {\n if (!props.post) {\n return null; // Or your custom 404 component\n }\n\n return (\n <ThemeWrapper \n initialMode={props.darkMode ? 'dark' : 'light'} \n customTheme={props.customTheme}\n >\n <div style={{ \n display: 'flex', \n maxWidth: '1200px', \n marginLeft: 'auto', \n marginRight: 'auto' }}\n >\n <ArticleV2\n post={props.post} \n content={props.htmlContent}\n showAuthor={props.showAuthor}\n showDate={props.showDate}\n showCategory={props.showCategory}\n showTags={props.showTags}\n showToc={props.showToc}\n />\n </div>\n {props.price_id == null && \n <div style={{ position: 'fixed', bottom: '1rem', right: '1rem', display: 'flex', justifyContent: 'center', alignItems: 'center' }}>\n <PoweredByV2 />\n </div>\n }\n </ThemeWrapper>\n );\n}\n\nexport function withStaticProps(pageConfig: GetStaticPropsParams) {\n return {\n async getStaticProps({ params }: { params: { slug: string } }) {\n try {\n const response = await getBlogPostPageRouter({\n apiKey: pageConfig.config.apiKey,\n projectId: pageConfig.config.projectId,\n apiUrl: pageConfig.config.apiUrl\n }, params.slug, pageConfig.locale);\n\n if (!response.blog) {\n return {\n notFound: true\n };\n }\n\n return {\n props: {\n post: response.blog,\n htmlContent: response.html_content,\n price_id: response.price_id\n },\n revalidate: 60\n };\n } catch (error) {\n console.error('Error fetching blog post:', error);\n return {\n notFound: true\n };\n }\n },\n\n async getStaticPaths() {\n try {\n const paths = await getBlogPathsPageRouter(pageConfig.config, pageConfig.locale);\n \n return {\n paths,\n fallback: 'blocking'\n };\n } catch (error) {\n console.error('Error fetching blog slugs:', error);\n return {\n paths: [],\n fallback: 'blocking'\n };\n }\n }\n }\n}\n"],"mappings":"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","names":["exchangeToken","config","response","error","tokenCache","CACHE_DURATION","getAuthToken","config","cacheKey","now","token","exchangeToken","getBlogPostsPageRouter","params","queryString","key","value","url","response","getBlogPostPageRouter","slug","locale","errorMessage","getBlogPathsPageRouter","blogs","blog","ArticleGroupV2","ThemeWrapper","React","Pagination","PaginationContent","PaginationEllipsis","PaginationItem","PaginationLink","PaginationNext","PaginationPrevious","getVisiblePages","current","total","_","i","DEFAULT_BLOG_PER_PAGE","NextBlogListPageForPageRouter","props","_a","_b","_c","visiblePages","getVisiblePages","localeParam","React","ThemeWrapper","ArticleGroupV2","__spreadValues","Pagination","PaginationContent","PaginationItem","PaginationPrevious","pageNum","idx","PaginationEllipsis","PaginationLink","PaginationNext","withServerSideProps","pageConfig","query","currentPage","postsPerPage","locale","response","getBlogPostsPageRouter","blogs","total","totalPages","error","ArticleV2","PoweredByV2","ThemeWrapper","React","NextBlogPageForPageRouter","props","ThemeWrapper","ArticleV2","PoweredByV2","withStaticProps","pageConfig","params","response","getBlogPostPageRouter","error","getBlogPathsPageRouter"]}
1
+ {"version":3,"sources":["../src/BaseUtils.ts","../src/NextPageRouterUtils.ts","../src/NextBlogListPageForPageRouter.tsx","../src/utils.ts","../src/NextBlogPageForPageRouter.tsx"],"sourcesContent":["// Base functionality shared between both routers\nimport { EasyBlogConfig, IQueryParams } from \"./models\";\n\nexport async function exchangeToken(config: EasyBlogConfig): Promise<string | null> {\n try {\n const response = await fetch(`${config.apiUrl}/exchange-token`, {\n method: 'POST',\n headers: { \n 'Authorization': `Bearer ${config.apiKey}`,\n 'x-project-id': config.projectId\n }\n });\n\n if (!response.ok) {\n console.error('Failed to exchange token:', response);\n throw new Error('Failed to authenticate');\n }\n\n const data = await response.json();\n return data.token;\n } catch (error) {\n console.error('Failed to exchange token:', error);\n return null;\n }\n}\n\n\nexport async function getBlogPostsBase(config: EasyBlogConfig, params: IQueryParams = {}) {\n const token = await exchangeToken(config);\n\n const queryString = new URLSearchParams(\n Object.entries(params).map(([key, value]) => [key, String(value)])\n ).toString();\n\n const url = `${config.apiUrl}/sdk/blogs${queryString ? `?${queryString}` : ''}`;\n\n return { url, token };\n}\n\nexport async function getBlogPostBase(config: EasyBlogConfig, slug: string, locale?: string) {\n const token = await exchangeToken(config);\n const url = `${config.apiUrl}/sdk/blogs/${slug}${locale ? `?locale=${locale}` : ''}`;\n return { url, token };\n}","import { EasyBlogConfig, IQueryParams } from \"./models\";\nimport { exchangeToken } from './BaseUtils';\n\n// For Pages Router: Use in-memory cache with expiration\nlet tokenCache: { [key: string]: { token: string | null; expires: number } } = {};\nconst CACHE_DURATION = 3600000; // 1 hour in milliseconds\n\nasync function getAuthToken(config: EasyBlogConfig): Promise<string | null> {\n const cacheKey = `${config.projectId}-${config.apiKey}`;\n const now = Date.now();\n\n // Check cache\n if (tokenCache[cacheKey] && tokenCache[cacheKey].expires > now) {\n return tokenCache[cacheKey].token;\n }\n\n // Get new token\n const token = await exchangeToken(config);\n \n // Update cache\n tokenCache[cacheKey] = {\n token,\n expires: now + CACHE_DURATION\n };\n\n return token;\n}\n\nexport async function getBlogPostsPageRouter(config: EasyBlogConfig, params: IQueryParams = {}) {\n const token = await getAuthToken(config);\n\n const queryString = new URLSearchParams(\n Object.entries(params).map(([key, value]) => [key, String(value)])\n ).toString();\n\n const url = `${config.apiUrl}/sdk/blogs${queryString ? `?${queryString}` : ''}`;\n\n const response = await fetch(url, {\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'x-project-id': config.projectId\n },\n next: {\n revalidate: 60,\n }\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch blog posts: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json();\n return data;\n}\n\nexport async function getBlogPostPageRouter(config: EasyBlogConfig, slug: string, locale?: string) {\n const token = await getAuthToken(config);\n\n const url = `${config.apiUrl}/sdk/blogs/${slug}${locale ? `?locale=${locale}` : ''}`;\n const response = await fetch(url, {\n headers: { \n 'Authorization': `Bearer ${token}`,\n 'x-project-id': config.projectId\n },\n next: {\n revalidate: 60,\n }\n });\n\n if (!response.ok) {\n const errorMessage = `Failed to fetch blog post: ${response.status} ${response.statusText}`;\n throw new Error(errorMessage);\n }\n\n return response.json();\n}\n\nexport async function getBlogPathsPageRouter(config: EasyBlogConfig, locale?: string) {\n const { blogs } = await getBlogPostsPageRouter(config, { index: 0, limit: 10000, locale });\n return blogs.map((blog: any) => ({ \n params: { slug: blog.slug } \n }));\n}\n\n// Optional: Cache cleanup\nsetInterval(() => {\n const now = Date.now();\n Object.keys(tokenCache).forEach(key => {\n if (tokenCache[key].expires <= now) {\n delete tokenCache[key];\n }\n });\n}, CACHE_DURATION);\n","import { getBlogPostsPageRouter } from './NextPageRouterUtils';\nimport { ArticleGroupV2, Theme, ThemeWrapper } from '@weekend-studio/easyblog-components';\nimport { EasyBlogConfig } from './models';\nimport React from 'react';\nimport {\n Pagination,\n PaginationContent,\n PaginationEllipsis,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n} from \"@weekend-studio/easyblog-components\"\nimport { getVisiblePages } from './utils';\n\nconst DEFAULT_BLOG_PER_PAGE = 9;\n\ninterface NextBlogListPageForPageRouterProps {\n blogs: any[];\n currentPage: number;\n totalPages: number;\n locale?: string;\n displayOptions?: {\n type?: 'grid' | 'list';\n darkMode?: boolean;\n showThumbnail?: boolean;\n showReadingTime?: boolean;\n showExcerpt?: boolean;\n showTags?: boolean;\n showDate?: boolean;\n showAuthor?: boolean;\n showCategory?: boolean;\n isNextPage?: boolean;\n blogPerPage?: number;\n customTheme?: Theme;\n }\n}\n\ninterface GetStaticPropsParams {\n config: EasyBlogConfig;\n displayOptions?: NextBlogListPageForPageRouterProps['displayOptions'];\n locale?: string;\n}\n\nexport function NextBlogListPageForPageRouter(props: NextBlogListPageForPageRouterProps) {\n if (!props.blogs) {\n return null;\n }\n\n const visiblePages = getVisiblePages(props.currentPage, props.totalPages);\n const basePath = props.locale ? `/${props.locale}/blogs` : '/blogs';\n\n return (\n <ThemeWrapper \n initialMode={props.displayOptions?.darkMode ? 'dark' : 'light'}\n customTheme={props.displayOptions?.customTheme}\n >\n <ArticleGroupV2 \n blogs={props.blogs} \n type={props.displayOptions?.type}\n {...props.displayOptions}\n />\n \n {props.totalPages > 1 && (\n <Pagination style={{ marginTop: '2rem' }}>\n <PaginationContent>\n {props.currentPage > 1 && (\n <PaginationItem>\n <PaginationPrevious href={`${basePath}?page=${props.currentPage - 1}`} />\n </PaginationItem>\n )}\n\n {visiblePages.map((pageNum, idx) => (\n pageNum === null ? (\n <PaginationItem key={`ellipsis-${idx}`}>\n <PaginationEllipsis />\n </PaginationItem>\n ) : (\n <PaginationItem key={pageNum}>\n <PaginationLink\n href={`${basePath}?page=${pageNum}`}\n isActive={pageNum === props.currentPage}\n >\n {pageNum}\n </PaginationLink>\n </PaginationItem>\n )\n ))}\n\n {props.currentPage < props.totalPages && (\n <PaginationItem>\n <PaginationNext href={`${basePath}?page=${props.currentPage + 1}`} />\n </PaginationItem>\n )}\n </PaginationContent>\n </Pagination>\n )}\n </ThemeWrapper>\n );\n}\n\nexport function withServerSideProps(pageConfig: GetStaticPropsParams) {\n return {\n async getServerSideProps({ query, params }: { query: {\n page?: string,\n category?: string,\n tags?: string,\n }, params?: { locale?: string } }) {\n try {\n const currentPage = query.page ? parseInt(query.page as string) : 1;\n const postsPerPage = pageConfig.displayOptions?.blogPerPage || DEFAULT_BLOG_PER_PAGE;\n const locale = params?.locale || pageConfig.locale;\n\n const response = await getBlogPostsPageRouter(pageConfig.config, {\n index: (currentPage - 1) * postsPerPage,\n limit: postsPerPage,\n category: query.category || '',\n tags: query.tags?.split(',') || [],\n locale,\n });\n\n // Add defensive checks\n if (!response || typeof response !== 'object') {\n console.error('Invalid API response format');\n return {\n props: {\n blogs: [],\n displayOptions: pageConfig.displayOptions || {},\n currentPage: 1,\n totalPages: 0\n }\n };\n }\n\n const { blogs = [], total = 0 } = response;\n const totalPages = Math.ceil(total / postsPerPage);\n\n return {\n props: {\n blogs,\n displayOptions: pageConfig.displayOptions || {},\n currentPage,\n totalPages,\n locale,\n }\n };\n } catch (error) {\n console.error('Error fetching blog posts:', error);\n // Return empty props instead of notFound\n return {\n props: {\n blogs: [],\n displayOptions: pageConfig.displayOptions || {},\n currentPage: 1,\n totalPages: 0\n }\n };\n }\n }\n };\n}","import { IQueryParams } from \"./models\";\n\nexport function buildQueryParams(params: IQueryParams): string {\n const queryParams = new URLSearchParams();\n params.index && queryParams.set('index', params.index.toString());\n params.limit && queryParams.set('limit', params.limit.toString());\n if (params.category) queryParams.set('category', params.category);\n if (params.tags) queryParams.set('tags', [params.tags].join(','));\n return queryParams.toString();\n}\n\nexport const getFormattedDate = (date: Date) => {\n if (!date) return '';\n return new Date(date).toISOString().split('T')[0];\n}\n\n// Helper function to generate visible page numbers\nexport const getVisiblePages = (current: number, total: number) => {\n if (total <= 7) return Array.from({ length: total }, (_, i) => i + 1);\n \n if (current <= 3) return [1, 2, 3, 4, 5, null, total];\n if (current >= total - 2) return [1, null, total - 4, total - 3, total - 2, total - 1, total];\n \n return [1, null, current - 1, current, current + 1, null, total];\n};","'use client';\n\nimport { ArticleV2, PoweredByV2, Theme, ThemeWrapper } from '@weekend-studio/easyblog-components';\nimport { EasyBlogConfig } from './models';\nimport { getBlogPathsPageRouter, getBlogPostPageRouter } from './NextPageRouterUtils';\nimport React from 'react';\n\ninterface NextBlogPageForPageRouterProps {\n post: any;\n htmlContent: string;\n config: EasyBlogConfig;\n price_id: string | null;\n darkMode?: boolean;\n showAuthor?: boolean;\n showDate?: boolean;\n showCategory?: boolean;\n showTags?: boolean;\n showToc?: boolean;\n customTheme?: Theme;\n}\n\ninterface GetStaticPropsParams {\n config: EasyBlogConfig;\n locale?: string;\n}\n\nexport function NextBlogPageForPageRouter(props: NextBlogPageForPageRouterProps) {\n if (!props.post) {\n return null; // Or your custom 404 component\n }\n\n return (\n <ThemeWrapper \n initialMode={props.darkMode ? 'dark' : 'light'} \n customTheme={props.customTheme}\n >\n <div style={{ \n display: 'flex', \n maxWidth: '1200px', \n marginLeft: 'auto', \n marginRight: 'auto' }}\n >\n <ArticleV2\n post={props.post} \n content={props.htmlContent}\n showAuthor={props.showAuthor}\n showDate={props.showDate}\n showCategory={props.showCategory}\n showTags={props.showTags}\n showToc={props.showToc}\n />\n </div>\n {props.price_id == null && \n <div style={{ position: 'fixed', bottom: '1rem', right: '1rem', display: 'flex', justifyContent: 'center', alignItems: 'center' }}>\n <PoweredByV2 />\n </div>\n }\n </ThemeWrapper>\n );\n}\n\nexport function withStaticProps(pageConfig: GetStaticPropsParams) {\n return {\n async getStaticProps({ params }: { params: { slug: string, locale?: string } }) {\n try {\n const locale = params.locale || pageConfig.locale;\n const response = await getBlogPostPageRouter({\n apiKey: pageConfig.config.apiKey,\n projectId: pageConfig.config.projectId,\n apiUrl: pageConfig.config.apiUrl\n }, params.slug, locale);\n\n if (!response.blog) {\n return {\n notFound: true\n };\n }\n\n return {\n props: {\n post: response.blog,\n htmlContent: response.html_content,\n price_id: response.price_id\n },\n revalidate: 60\n };\n } catch (error) {\n console.error('Error fetching blog post:', error);\n return {\n notFound: true\n };\n }\n },\n\n async getStaticPaths() {\n try {\n const paths = await getBlogPathsPageRouter(pageConfig.config, pageConfig.locale);\n \n return {\n paths,\n fallback: 'blocking'\n };\n } catch (error) {\n console.error('Error fetching blog slugs:', error);\n return {\n paths: [],\n fallback: 'blocking'\n };\n }\n }\n }\n}\n"],"mappings":"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","names":["exchangeToken","config","response","error","tokenCache","CACHE_DURATION","getAuthToken","config","cacheKey","now","token","exchangeToken","getBlogPostsPageRouter","params","queryString","key","value","url","response","getBlogPostPageRouter","slug","locale","errorMessage","getBlogPathsPageRouter","blogs","blog","ArticleGroupV2","ThemeWrapper","React","Pagination","PaginationContent","PaginationEllipsis","PaginationItem","PaginationLink","PaginationNext","PaginationPrevious","getVisiblePages","current","total","_","i","DEFAULT_BLOG_PER_PAGE","NextBlogListPageForPageRouter","props","_a","_b","_c","visiblePages","getVisiblePages","basePath","React","ThemeWrapper","ArticleGroupV2","__spreadValues","Pagination","PaginationContent","PaginationItem","PaginationPrevious","pageNum","idx","PaginationEllipsis","PaginationLink","PaginationNext","withServerSideProps","pageConfig","query","params","currentPage","postsPerPage","locale","response","getBlogPostsPageRouter","blogs","total","totalPages","error","ArticleV2","PoweredByV2","ThemeWrapper","React","NextBlogPageForPageRouter","props","ThemeWrapper","ArticleV2","PoweredByV2","withStaticProps","pageConfig","params","locale","response","getBlogPostPageRouter","error","getBlogPathsPageRouter"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@weekend-studio/easyblog-next",
3
- "version": "0.1.1-beta.1",
3
+ "version": "0.1.1-beta.3",
4
4
  "private": false,
5
5
  "dependencies": {
6
6
  "@weekend-studio/easyblog-components": "^0.1.0",