@weekend-studio/easyblog-next 0.0.18 → 0.0.20
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.
- package/dist/app-index.mjs +4 -3
- package/dist/app-index.mjs.map +1 -1
- package/dist/index.mjs +7 -7
- package/dist/index.mjs.map +1 -1
- package/dist/page-index.d.mts +1 -0
- package/dist/page-index.mjs +3 -4
- package/dist/page-index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/app-index.mjs
CHANGED
|
@@ -139,7 +139,7 @@ async function generateMetadata(config, slug) {
|
|
|
139
139
|
// src/NextBlogPage.tsx
|
|
140
140
|
import React from "react";
|
|
141
141
|
import { notFound as notFound2 } from "next/navigation";
|
|
142
|
-
import { Article } from "@weekend-studio/easyblog-components";
|
|
142
|
+
import { Article, PoweredBy } from "@weekend-studio/easyblog-components";
|
|
143
143
|
async function NextBlogPage(props) {
|
|
144
144
|
try {
|
|
145
145
|
const response = await getBlogPost({
|
|
@@ -150,14 +150,15 @@ async function NextBlogPage(props) {
|
|
|
150
150
|
if (!response.blog) return notFound2();
|
|
151
151
|
const post = response.blog;
|
|
152
152
|
const htmlContent = response.html_content;
|
|
153
|
-
|
|
153
|
+
const price_id = response.price_id;
|
|
154
|
+
return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(
|
|
154
155
|
Article,
|
|
155
156
|
{
|
|
156
157
|
post,
|
|
157
158
|
content: htmlContent,
|
|
158
159
|
style: props.style
|
|
159
160
|
}
|
|
160
|
-
);
|
|
161
|
+
), price_id == null && /* @__PURE__ */ React.createElement("div", { className: "flex w-full p-10 justify-center items-center" }, /* @__PURE__ */ React.createElement(PoweredBy, null)));
|
|
161
162
|
} catch (error) {
|
|
162
163
|
console.error("Error fetching blog post:", error);
|
|
163
164
|
return notFound2();
|
package/dist/app-index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/NextAppRouterUtils.ts","../src/BaseUtils.ts","../src/utils.ts","../src/NextBlogPage.tsx","../src/NextBlogListPage.tsx","../src/pagination.tsx","../../easyblog-components/src/ui/button.tsx","../../easyblog-components/src/utils.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: { revalidate: 3600 }\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) {\n const token = await getAuthToken(config);\n\n const response = await fetch(`${config.apiUrl}/sdk/blogs/${slug}`, {\n headers: { \n 'Authorization': `Bearer ${token}`,\n 'x-project-id': config.projectId\n },\n next: { revalidate: 3600 }\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) {\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): Promise<Metadata> {\n if (slug) {\n const post = await getBlogPost(config, slug);\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) {\n const token = await exchangeToken(config);\n const url = `${config.apiUrl}/sdk/blogs/${slug}`;\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 { Article } from '@weekend-studio/easyblog-components';\nimport { EasyBlogConfig } from './models';\nimport { getBlogPost } from './NextAppRouterUtils';\n\ninterface NextBlogPageProps {\n config: EasyBlogConfig;\n slug: string;\n style?: React.CSSProperties;\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);\n if (!response.blog) return notFound();\n const post = response.blog;\n const htmlContent = response.html_content;\n\n return (\n <Article \n post={post} \n content={htmlContent}\n style={props.style}\n />\n );\n } catch (error) {\n console.error('Error fetching blog post:', error);\n return notFound();\n }\n}\n","import React from 'react';\nimport { getBlogPosts } from './NextAppRouterUtils';\nimport { ArticleGroup } from '@weekend-studio/easyblog-components';\nimport { EasyBlogConfig, IQueryParams } from './models';\nimport {\n Pagination,\n PaginationContent,\n PaginationEllipsis,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n} from \"./pagination\"\nimport { getVisiblePages } from './utils';\n\nconst DEFAULT_BLOG_PER_PAGE = 9;\ninterface NextBlogListPageProps {\n config: EasyBlogConfig;\n type: 'grid' | 'list';\n searchParams?: {\n page?: string;\n category?: string;\n tags?: string;\n };\n displayOptions?: {\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 }\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 queryParams: IQueryParams = {\n index: (currentPage - 1) * postsPerPage,\n limit: postsPerPage,\n category: searchParams.category || '',\n tags: searchParams.tags?.split(',') || []\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\n const visiblePages = getVisiblePages(currentPage, totalPages);\n\n return (\n <div>\n <ArticleGroup \n blogs={blogs} \n type={props.type} \n {...props.displayOptions}\n />\n\n {totalPages > 1 && (\n <Pagination className=\"mt-8\">\n <PaginationContent>\n {currentPage > 1 && (\n <PaginationItem>\n <PaginationPrevious href={`/blogs?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={`/blogs?page=${pageNum}`}\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}`} />\n </PaginationItem>\n )}\n </PaginationContent>\n </Pagination>\n )}\n </div>\n );\n}\n","import * as React from \"react\"\nimport { ChevronLeft, ChevronRight, MoreHorizontal } from \"lucide-react\"\nimport { ButtonProps, buttonVariants } from \"../../easyblog-components/src/ui/button\"\nimport { cn } from \"../../easyblog-components/src/utils\"\n\nconst Pagination = ({ className, ...props }: React.ComponentProps<\"nav\">) => (\n <nav\n role=\"navigation\"\n aria-label=\"pagination\"\n className={cn(\"mx-auto flex w-full justify-center\", className)}\n {...props}\n />\n)\nPagination.displayName = \"Pagination\"\n\nconst PaginationContent = React.forwardRef<\n HTMLUListElement,\n React.ComponentProps<\"ul\">\n>(({ className, ...props }, ref) => (\n <ul\n ref={ref}\n className={cn(\"flex flex-row items-center gap-1\", className)}\n {...props}\n />\n))\nPaginationContent.displayName = \"PaginationContent\"\n\nconst PaginationItem = React.forwardRef<\n HTMLLIElement,\n React.ComponentProps<\"li\">\n>(({ className, ...props }, ref) => (\n <li ref={ref} className={cn(\"\", className)} {...props} />\n))\nPaginationItem.displayName = \"PaginationItem\"\n\ntype PaginationLinkProps = {\n isActive?: boolean\n} & Pick<ButtonProps, \"size\"> &\n React.ComponentProps<any>\n\nconst PaginationLink = ({\n className,\n isActive,\n size = \"icon\",\n ...props\n}: PaginationLinkProps) => (\n <a\n aria-current={isActive ? \"page\" : undefined}\n className={cn(\n buttonVariants({\n variant: isActive ? \"outline\" : \"ghost\",\n size,\n }),\n className\n )}\n {...props}\n />\n)\nPaginationLink.displayName = \"PaginationLink\"\n\nconst PaginationPrevious = ({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) => (\n <PaginationLink\n aria-label=\"Go to previous page\"\n size=\"default\"\n className={cn(\"gap-1 pl-2.5\", className)}\n {...props}\n >\n <ChevronLeft className=\"h-4 w-4\" />\n <span>Previous</span>\n </PaginationLink>\n)\nPaginationPrevious.displayName = \"PaginationPrevious\"\n\nconst PaginationNext = ({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) => (\n <PaginationLink\n aria-label=\"Go to next page\"\n size=\"default\"\n className={cn(\"gap-1 pr-2.5\", className)}\n {...props}\n >\n <span>Next</span>\n <ChevronRight className=\"h-4 w-4\" />\n </PaginationLink>\n)\nPaginationNext.displayName = \"PaginationNext\"\n\nconst PaginationEllipsis = ({\n className,\n ...props\n}: React.ComponentProps<\"span\">) => (\n <span\n aria-hidden\n className={cn(\"flex h-9 w-9 items-center justify-center\", className)}\n {...props}\n >\n <MoreHorizontal className=\"h-4 w-4\" />\n <span className=\"sr-only\">More pages</span>\n </span>\n)\nPaginationEllipsis.displayName = \"PaginationEllipsis\"\n\nexport {\n Pagination,\n PaginationContent,\n PaginationLink,\n PaginationItem,\n PaginationPrevious,\n PaginationNext,\n PaginationEllipsis,\n}\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"../utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground shadow hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2\",\n sm: \"h-8 rounded-md px-3 text-xs\",\n lg: \"h-10 rounded-md px-8\",\n icon: \"h-9 w-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\"\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n )\n }\n)\nButton.displayName = \"Button\"\n\nexport { Button, buttonVariants }\n","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\nexport const getFormattedDate = (date: Date) => {\n if (!date) return '';\n return new Date(date).toISOString().split('T')[0];\n}"],"mappings":"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","names":["notFound","notFound","React","React","React","React"]}
|
|
1
|
+
{"version":3,"sources":["../src/NextAppRouterUtils.ts","../src/BaseUtils.ts","../src/utils.ts","../src/NextBlogPage.tsx","../src/NextBlogListPage.tsx","../src/pagination.tsx","../../easyblog-components/src/ui/button.tsx","../../easyblog-components/src/utils.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: { revalidate: 3600 }\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) {\n const token = await getAuthToken(config);\n\n const response = await fetch(`${config.apiUrl}/sdk/blogs/${slug}`, {\n headers: { \n 'Authorization': `Bearer ${token}`,\n 'x-project-id': config.projectId\n },\n next: { revalidate: 3600 }\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) {\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): Promise<Metadata> {\n if (slug) {\n const post = await getBlogPost(config, slug);\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) {\n const token = await exchangeToken(config);\n const url = `${config.apiUrl}/sdk/blogs/${slug}`;\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 { Article, PoweredBy } from '@weekend-studio/easyblog-components';\nimport { EasyBlogConfig } from './models';\nimport { getBlogPost } from './NextAppRouterUtils';\n\ninterface NextBlogPageProps {\n config: EasyBlogConfig;\n slug: string;\n style?: React.CSSProperties;\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);\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 <>\n <Article \n post={post} \n content={htmlContent}\n style={props.style}\n />\n {price_id == null && \n <div className=\"flex w-full p-10 justify-center items-center\">\n <PoweredBy />\n </div>\n }\n </>\n );\n } catch (error) {\n console.error('Error fetching blog post:', error);\n return notFound();\n }\n}\n","import React from 'react';\nimport { getBlogPosts } from './NextAppRouterUtils';\nimport { ArticleGroup } from '@weekend-studio/easyblog-components';\nimport { EasyBlogConfig, IQueryParams } from './models';\nimport {\n Pagination,\n PaginationContent,\n PaginationEllipsis,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n} from \"./pagination\"\nimport { getVisiblePages } from './utils';\n\nconst DEFAULT_BLOG_PER_PAGE = 9;\ninterface NextBlogListPageProps {\n config: EasyBlogConfig;\n type: 'grid' | 'list';\n searchParams?: {\n page?: string;\n category?: string;\n tags?: string;\n };\n displayOptions?: {\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 }\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 queryParams: IQueryParams = {\n index: (currentPage - 1) * postsPerPage,\n limit: postsPerPage,\n category: searchParams.category || '',\n tags: searchParams.tags?.split(',') || []\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\n const visiblePages = getVisiblePages(currentPage, totalPages);\n\n return (\n <div>\n <ArticleGroup \n blogs={blogs} \n type={props.type} \n {...props.displayOptions}\n />\n\n {totalPages > 1 && (\n <Pagination className=\"mt-8\">\n <PaginationContent>\n {currentPage > 1 && (\n <PaginationItem>\n <PaginationPrevious href={`/blogs?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={`/blogs?page=${pageNum}`}\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}`} />\n </PaginationItem>\n )}\n </PaginationContent>\n </Pagination>\n )}\n </div>\n );\n}\n","import * as React from \"react\"\nimport { ChevronLeft, ChevronRight, MoreHorizontal } from \"lucide-react\"\nimport { ButtonProps, buttonVariants } from \"../../easyblog-components/src/ui/button\"\nimport { cn } from \"../../easyblog-components/src/utils\"\n\nconst Pagination = ({ className, ...props }: React.ComponentProps<\"nav\">) => (\n <nav\n role=\"navigation\"\n aria-label=\"pagination\"\n className={cn(\"mx-auto flex w-full justify-center\", className)}\n {...props}\n />\n)\nPagination.displayName = \"Pagination\"\n\nconst PaginationContent = React.forwardRef<\n HTMLUListElement,\n React.ComponentProps<\"ul\">\n>(({ className, ...props }, ref) => (\n <ul\n ref={ref}\n className={cn(\"flex flex-row items-center gap-1\", className)}\n {...props}\n />\n))\nPaginationContent.displayName = \"PaginationContent\"\n\nconst PaginationItem = React.forwardRef<\n HTMLLIElement,\n React.ComponentProps<\"li\">\n>(({ className, ...props }, ref) => (\n <li ref={ref} className={cn(\"\", className)} {...props} />\n))\nPaginationItem.displayName = \"PaginationItem\"\n\ntype PaginationLinkProps = {\n isActive?: boolean\n} & Pick<ButtonProps, \"size\"> &\n React.ComponentProps<any>\n\nconst PaginationLink = ({\n className,\n isActive,\n size = \"icon\",\n ...props\n}: PaginationLinkProps) => (\n <a\n aria-current={isActive ? \"page\" : undefined}\n className={cn(\n buttonVariants({\n variant: isActive ? \"outline\" : \"ghost\",\n size,\n }),\n className\n )}\n {...props}\n />\n)\nPaginationLink.displayName = \"PaginationLink\"\n\nconst PaginationPrevious = ({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) => (\n <PaginationLink\n aria-label=\"Go to previous page\"\n size=\"default\"\n className={cn(\"gap-1 pl-2.5\", className)}\n {...props}\n >\n <ChevronLeft className=\"h-4 w-4\" />\n <span>Previous</span>\n </PaginationLink>\n)\nPaginationPrevious.displayName = \"PaginationPrevious\"\n\nconst PaginationNext = ({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) => (\n <PaginationLink\n aria-label=\"Go to next page\"\n size=\"default\"\n className={cn(\"gap-1 pr-2.5\", className)}\n {...props}\n >\n <span>Next</span>\n <ChevronRight className=\"h-4 w-4\" />\n </PaginationLink>\n)\nPaginationNext.displayName = \"PaginationNext\"\n\nconst PaginationEllipsis = ({\n className,\n ...props\n}: React.ComponentProps<\"span\">) => (\n <span\n aria-hidden\n className={cn(\"flex h-9 w-9 items-center justify-center\", className)}\n {...props}\n >\n <MoreHorizontal className=\"h-4 w-4\" />\n <span className=\"sr-only\">More pages</span>\n </span>\n)\nPaginationEllipsis.displayName = \"PaginationEllipsis\"\n\nexport {\n Pagination,\n PaginationContent,\n PaginationLink,\n PaginationItem,\n PaginationPrevious,\n PaginationNext,\n PaginationEllipsis,\n}\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"../utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground shadow hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2\",\n sm: \"h-8 rounded-md px-3 text-xs\",\n lg: \"h-10 rounded-md px-8\",\n icon: \"h-9 w-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\"\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n )\n }\n)\nButton.displayName = \"Button\"\n\nexport { Button, buttonVariants }\n","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\nexport const getFormattedDate = (date: Date) => {\n if (!date) return '';\n return new Date(date).toISOString().split('T')[0];\n}"],"mappings":"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","names":["notFound","notFound","React","React","React","React"]}
|
package/dist/index.mjs
CHANGED
|
@@ -139,7 +139,7 @@ async function generateMetadata(config, slug) {
|
|
|
139
139
|
// src/NextBlogPage.tsx
|
|
140
140
|
import React from "react";
|
|
141
141
|
import { notFound as notFound2 } from "next/navigation";
|
|
142
|
-
import { Article } from "@weekend-studio/easyblog-components";
|
|
142
|
+
import { Article, PoweredBy } from "@weekend-studio/easyblog-components";
|
|
143
143
|
async function NextBlogPage(props) {
|
|
144
144
|
try {
|
|
145
145
|
const response = await getBlogPost({
|
|
@@ -150,14 +150,15 @@ async function NextBlogPage(props) {
|
|
|
150
150
|
if (!response.blog) return notFound2();
|
|
151
151
|
const post = response.blog;
|
|
152
152
|
const htmlContent = response.html_content;
|
|
153
|
-
|
|
153
|
+
const price_id = response.price_id;
|
|
154
|
+
return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(
|
|
154
155
|
Article,
|
|
155
156
|
{
|
|
156
157
|
post,
|
|
157
158
|
content: htmlContent,
|
|
158
159
|
style: props.style
|
|
159
160
|
}
|
|
160
|
-
);
|
|
161
|
+
), price_id == null && /* @__PURE__ */ React.createElement("div", { className: "flex w-full p-10 justify-center items-center" }, /* @__PURE__ */ React.createElement(PoweredBy, null)));
|
|
161
162
|
} catch (error) {
|
|
162
163
|
console.error("Error fetching blog post:", error);
|
|
163
164
|
return notFound2();
|
|
@@ -398,7 +399,6 @@ async function getBlogPostsPageRouter(config, params = {}) {
|
|
|
398
399
|
}
|
|
399
400
|
});
|
|
400
401
|
if (!response.ok) {
|
|
401
|
-
console.error("Failed to fetch blog posts:", response);
|
|
402
402
|
throw new Error(`Failed to fetch blog posts: ${response.status} ${response.statusText}`);
|
|
403
403
|
}
|
|
404
404
|
const data = await response.json();
|
|
@@ -510,20 +510,20 @@ function withServerSideProps(pageConfig) {
|
|
|
510
510
|
}
|
|
511
511
|
|
|
512
512
|
// src/NextBlogPageForPageRouter.tsx
|
|
513
|
-
import { Article as Article2 } from "@weekend-studio/easyblog-components";
|
|
513
|
+
import { Article as Article2, PoweredBy as PoweredBy2 } from "@weekend-studio/easyblog-components";
|
|
514
514
|
import React6 from "react";
|
|
515
515
|
function NextBlogPageForPageRouter(props) {
|
|
516
516
|
if (!props.post) {
|
|
517
517
|
return null;
|
|
518
518
|
}
|
|
519
|
-
return /* @__PURE__ */ React6.createElement(
|
|
519
|
+
return /* @__PURE__ */ React6.createElement(React6.Fragment, null, /* @__PURE__ */ React6.createElement(
|
|
520
520
|
Article2,
|
|
521
521
|
{
|
|
522
522
|
post: props.post,
|
|
523
523
|
content: props.htmlContent,
|
|
524
524
|
style: props.style
|
|
525
525
|
}
|
|
526
|
-
);
|
|
526
|
+
), props.price_id == null && /* @__PURE__ */ React6.createElement("div", { className: "flex w-full p-10 justify-center items-center" }, /* @__PURE__ */ React6.createElement(PoweredBy2, null)));
|
|
527
527
|
}
|
|
528
528
|
function withStaticProps(pageConfig) {
|
|
529
529
|
return {
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/NextAppRouterUtils.ts","../src/BaseUtils.ts","../src/utils.ts","../src/NextBlogPage.tsx","../src/NextBlogListPage.tsx","../src/pagination.tsx","../../easyblog-components/src/ui/button.tsx","../../easyblog-components/src/utils.ts","../src/NextPageRouterUtils.ts","../src/NextBlogListPageForPageRouter.tsx","../src/NextBlogPageForPageRouter.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: { revalidate: 3600 }\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) {\n const token = await getAuthToken(config);\n\n const response = await fetch(`${config.apiUrl}/sdk/blogs/${slug}`, {\n headers: { \n 'Authorization': `Bearer ${token}`,\n 'x-project-id': config.projectId\n },\n next: { revalidate: 3600 }\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) {\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): Promise<Metadata> {\n if (slug) {\n const post = await getBlogPost(config, slug);\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) {\n const token = await exchangeToken(config);\n const url = `${config.apiUrl}/sdk/blogs/${slug}`;\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 { Article } from '@weekend-studio/easyblog-components';\nimport { EasyBlogConfig } from './models';\nimport { getBlogPost } from './NextAppRouterUtils';\n\ninterface NextBlogPageProps {\n config: EasyBlogConfig;\n slug: string;\n style?: React.CSSProperties;\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);\n if (!response.blog) return notFound();\n const post = response.blog;\n const htmlContent = response.html_content;\n\n return (\n <Article \n post={post} \n content={htmlContent}\n style={props.style}\n />\n );\n } catch (error) {\n console.error('Error fetching blog post:', error);\n return notFound();\n }\n}\n","import React from 'react';\nimport { getBlogPosts } from './NextAppRouterUtils';\nimport { ArticleGroup } from '@weekend-studio/easyblog-components';\nimport { EasyBlogConfig, IQueryParams } from './models';\nimport {\n Pagination,\n PaginationContent,\n PaginationEllipsis,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n} from \"./pagination\"\nimport { getVisiblePages } from './utils';\n\nconst DEFAULT_BLOG_PER_PAGE = 9;\ninterface NextBlogListPageProps {\n config: EasyBlogConfig;\n type: 'grid' | 'list';\n searchParams?: {\n page?: string;\n category?: string;\n tags?: string;\n };\n displayOptions?: {\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 }\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 queryParams: IQueryParams = {\n index: (currentPage - 1) * postsPerPage,\n limit: postsPerPage,\n category: searchParams.category || '',\n tags: searchParams.tags?.split(',') || []\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\n const visiblePages = getVisiblePages(currentPage, totalPages);\n\n return (\n <div>\n <ArticleGroup \n blogs={blogs} \n type={props.type} \n {...props.displayOptions}\n />\n\n {totalPages > 1 && (\n <Pagination className=\"mt-8\">\n <PaginationContent>\n {currentPage > 1 && (\n <PaginationItem>\n <PaginationPrevious href={`/blogs?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={`/blogs?page=${pageNum}`}\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}`} />\n </PaginationItem>\n )}\n </PaginationContent>\n </Pagination>\n )}\n </div>\n );\n}\n","import * as React from \"react\"\nimport { ChevronLeft, ChevronRight, MoreHorizontal } from \"lucide-react\"\nimport { ButtonProps, buttonVariants } from \"../../easyblog-components/src/ui/button\"\nimport { cn } from \"../../easyblog-components/src/utils\"\n\nconst Pagination = ({ className, ...props }: React.ComponentProps<\"nav\">) => (\n <nav\n role=\"navigation\"\n aria-label=\"pagination\"\n className={cn(\"mx-auto flex w-full justify-center\", className)}\n {...props}\n />\n)\nPagination.displayName = \"Pagination\"\n\nconst PaginationContent = React.forwardRef<\n HTMLUListElement,\n React.ComponentProps<\"ul\">\n>(({ className, ...props }, ref) => (\n <ul\n ref={ref}\n className={cn(\"flex flex-row items-center gap-1\", className)}\n {...props}\n />\n))\nPaginationContent.displayName = \"PaginationContent\"\n\nconst PaginationItem = React.forwardRef<\n HTMLLIElement,\n React.ComponentProps<\"li\">\n>(({ className, ...props }, ref) => (\n <li ref={ref} className={cn(\"\", className)} {...props} />\n))\nPaginationItem.displayName = \"PaginationItem\"\n\ntype PaginationLinkProps = {\n isActive?: boolean\n} & Pick<ButtonProps, \"size\"> &\n React.ComponentProps<any>\n\nconst PaginationLink = ({\n className,\n isActive,\n size = \"icon\",\n ...props\n}: PaginationLinkProps) => (\n <a\n aria-current={isActive ? \"page\" : undefined}\n className={cn(\n buttonVariants({\n variant: isActive ? \"outline\" : \"ghost\",\n size,\n }),\n className\n )}\n {...props}\n />\n)\nPaginationLink.displayName = \"PaginationLink\"\n\nconst PaginationPrevious = ({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) => (\n <PaginationLink\n aria-label=\"Go to previous page\"\n size=\"default\"\n className={cn(\"gap-1 pl-2.5\", className)}\n {...props}\n >\n <ChevronLeft className=\"h-4 w-4\" />\n <span>Previous</span>\n </PaginationLink>\n)\nPaginationPrevious.displayName = \"PaginationPrevious\"\n\nconst PaginationNext = ({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) => (\n <PaginationLink\n aria-label=\"Go to next page\"\n size=\"default\"\n className={cn(\"gap-1 pr-2.5\", className)}\n {...props}\n >\n <span>Next</span>\n <ChevronRight className=\"h-4 w-4\" />\n </PaginationLink>\n)\nPaginationNext.displayName = \"PaginationNext\"\n\nconst PaginationEllipsis = ({\n className,\n ...props\n}: React.ComponentProps<\"span\">) => (\n <span\n aria-hidden\n className={cn(\"flex h-9 w-9 items-center justify-center\", className)}\n {...props}\n >\n <MoreHorizontal className=\"h-4 w-4\" />\n <span className=\"sr-only\">More pages</span>\n </span>\n)\nPaginationEllipsis.displayName = \"PaginationEllipsis\"\n\nexport {\n Pagination,\n PaginationContent,\n PaginationLink,\n PaginationItem,\n PaginationPrevious,\n PaginationNext,\n PaginationEllipsis,\n}\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"../utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground shadow hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2\",\n sm: \"h-8 rounded-md px-3 text-xs\",\n lg: \"h-10 rounded-md px-8\",\n icon: \"h-9 w-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\"\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n )\n }\n)\nButton.displayName = \"Button\"\n\nexport { Button, buttonVariants }\n","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\nexport const getFormattedDate = (date: Date) => {\n if (!date) return '';\n return new Date(date).toISOString().split('T')[0];\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 });\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\nexport async function getBlogPostPageRouter(config: EasyBlogConfig, slug: string) {\n const token = await getAuthToken(config);\n\n const response = await fetch(`${config.apiUrl}/sdk/blogs/${slug}`, {\n headers: { \n 'Authorization': `Bearer ${token}`,\n 'x-project-id': config.projectId\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) {\n const { blogs } = await getBlogPostsPageRouter(config, { index: 0, limit: 10000 });\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","'use client';\n\nimport { getBlogPostsPageRouter } from './NextPageRouterUtils';\nimport { ArticleGroup } 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 \"./pagination\"\nimport { getVisiblePages } from './utils';\n\nconst DEFAULT_BLOG_PER_PAGE = 9;\n\ninterface NextBlogListPageForPageRouterProps {\n blogs: any[];\n type: 'grid' | 'list';\n currentPage: number;\n totalPages: number;\n displayOptions?: {\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 }\n}\n\ninterface GetStaticPropsParams {\n config: EasyBlogConfig;\n type: 'grid' | 'list';\n displayOptions?: NextBlogListPageForPageRouterProps['displayOptions'];\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\n return (\n <div>\n <ArticleGroup \n blogs={props.blogs} \n type={props.type} \n {...props.displayOptions}\n />\n\n {props.totalPages > 1 && (\n <Pagination className=\"mt-8\">\n <PaginationContent>\n {props.currentPage > 1 && (\n <PaginationItem>\n <PaginationPrevious href={`/blogs?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={`/blogs?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={`/blogs?page=${props.currentPage + 1}`} />\n </PaginationItem>\n )}\n </PaginationContent>\n </Pagination>\n )}\n </div>\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 } }) {\n try {\n const currentPage = query.page ? parseInt(query.page as string) : 1;\n const postsPerPage = pageConfig.displayOptions?.blogPerPage || DEFAULT_BLOG_PER_PAGE;\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 });\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 type: pageConfig.type,\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 type: pageConfig.type,\n displayOptions: pageConfig.displayOptions || {},\n currentPage,\n totalPages\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 type: pageConfig.type,\n displayOptions: pageConfig.displayOptions || {},\n currentPage: 1,\n totalPages: 0\n }\n };\n }\n }\n };\n}","'use client';\n\nimport { Article } 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 style?: React.CSSProperties;\n}\n\ninterface GetStaticPropsParams {\n config: EasyBlogConfig;\n}\n\nexport function NextBlogPageForPageRouter(props: NextBlogPageForPageRouterProps) {\n if (!props.post) {\n return null; // Or your custom 404 component\n }\n\n return (\n <Article \n post={props.post} \n content={props.htmlContent}\n style={props.style}\n />\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);\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 },\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);\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,aAAa;AAGtB,SAAS,gBAAgB;;;ACAzB,eAAsB,cAAc,QAAgD;AAClF,MAAI;AACF,UAAM,WAAW,MAAM,MAAM,GAAG,OAAO,MAAM,mBAAmB;AAAA,MAC9D,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,iBAAiB,UAAU,OAAO,MAAM;AAAA,QACxC,gBAAgB,OAAO;AAAA,MACzB;AAAA,IACF,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,cAAQ,MAAM,6BAA6B,QAAQ;AACnD,YAAM,IAAI,MAAM,wBAAwB;AAAA,IAC1C;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,WAAO,KAAK;AAAA,EACd,SAAS,OAAO;AACd,YAAQ,MAAM,6BAA6B,KAAK;AAChD,WAAO;AAAA,EACT;AACF;;;ACbO,IAAM,mBAAmB,CAAC,SAAe;AAC9C,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,IAAI,KAAK,IAAI,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AAClD;AAGO,IAAM,kBAAkB,CAAC,SAAiB,UAAkB;AACjE,MAAI,SAAS,EAAG,QAAO,MAAM,KAAK,EAAE,QAAQ,MAAM,GAAG,CAAC,GAAG,MAAM,IAAI,CAAC;AAEpE,MAAI,WAAW,EAAG,QAAO,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,MAAM,KAAK;AACpD,MAAI,WAAW,QAAQ,EAAG,QAAO,CAAC,GAAG,MAAM,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,KAAK;AAE5F,SAAO,CAAC,GAAG,MAAM,UAAU,GAAG,SAAS,UAAU,GAAG,MAAM,KAAK;AACjE;;;AFhBA,IAAM,eAAe,MAAM,OAAO,WAAmD;AACnF,SAAO,cAAc,MAAM;AAC7B,CAAC;AAGD,eAAe,aAAa,QAAwB,SAAuB,CAAC,GAAG;AAC7E,QAAM,QAAQ,MAAM,aAAa,MAAM;AAEvC,QAAM,cAAc,IAAI;AAAA,IACtB,OAAO,QAAQ,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,OAAO,KAAK,CAAC,CAAC;AAAA,EACnE,EAAE,SAAS;AAEX,QAAM,MAAM,GAAG,OAAO,MAAM,aAAa,cAAc,IAAI,WAAW,KAAK,EAAE;AAE7E,QAAM,WAAW,MAAM,MAAM,KAAK;AAAA,IAChC,SAAS;AAAA,MACP,iBAAiB,UAAU,KAAK;AAAA,MAChC,gBAAgB,OAAO;AAAA,IACzB;AAAA,IACA,MAAM,EAAE,YAAY,KAAK;AAAA,EAC3B,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,YAAQ,MAAM,+BAA+B,QAAQ;AACrD,UAAM,IAAI,MAAM,+BAA+B,SAAS,MAAM,IAAI,SAAS,UAAU,EAAE;AAAA,EACzF;AAEA,QAAM,OAAO,MAAM,SAAS,KAAK;AACjC,SAAO;AACT;AAEA,eAAe,YAAY,QAAwB,MAAc;AAC/D,QAAM,QAAQ,MAAM,aAAa,MAAM;AAEvC,QAAM,WAAW,MAAM,MAAM,GAAG,OAAO,MAAM,cAAc,IAAI,IAAI;AAAA,IACjE,SAAS;AAAA,MACP,iBAAiB,UAAU,KAAK;AAAA,MAChC,gBAAgB,OAAO;AAAA,IACzB;AAAA,IACA,MAAM,EAAE,YAAY,KAAK;AAAA,EAC3B,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,MAAM,8BAA8B,SAAS,MAAM,IAAI,SAAS,UAAU,EAAE;AAAA,EACxF;AAEA,SAAO,SAAS,KAAK;AACvB;AAEA,eAAe,aAAa,QAAwB;AAClD,QAAM,MAAM,MAAM,aAAa,QAAQ,EAAE,OAAO,GAAG,OAAO,IAAM,CAAC;AACjE,MAAI,CAAC,IAAI,MAAO,QAAO,CAAC;AACxB,SAAO,IAAI,MAAM,IAAI,CAAC,UAAe,EAAE,MAAM,KAAK,KAAK,EAAE;AAC3D;AAEA,eAAe,iBAAiB,QAAwB,MAAkC;AA/D1F;AAgEE,MAAI,MAAM;AACR,UAAM,OAAO,MAAM,YAAY,QAAQ,IAAI;AAC3C,QAAI,CAAC,KAAM,QAAO,SAAS;AAE3B,WAAO;AAAA,MACL,OAAO,KAAK;AAAA,MACZ,cAAa,UAAK,YAAL,mBAAc,UAAU,GAAG;AAAA,MACxC,WAAW;AAAA,QACT,OAAO,KAAK;AAAA,QACZ,cAAa,UAAK,YAAL,mBAAc,UAAU,GAAG;AAAA,QACxC,MAAM;AAAA,QACN,eAAe,iBAAiB,KAAK,UAAU;AAAA,QAC/C,MAAM,KAAK;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO;AAAA,IACP,aAAa;AAAA,IACb,WAAW;AAAA,MACT,OAAO;AAAA,MACP,aAAa;AAAA,MACb,MAAM;AAAA,IACR;AAAA,EACF;AACF;;;AG1FA,OAAO,WAAW;AAClB,SAAS,YAAAA,iBAAgB;AACzB,SAAS,eAAe;AAUxB,eAAsB,aAAa,OAA0B;AAC3D,MAAI;AACF,UAAM,WAAW,MAAM,YAAY;AAAA,MACjC,QAAQ,MAAM,OAAO;AAAA,MACrB,WAAW,MAAM,OAAO;AAAA,MACxB,QAAQ,MAAM,OAAO;AAAA,IACvB,GAAG,MAAM,IAAI;AACb,QAAI,CAAC,SAAS,KAAM,QAAOC,UAAS;AACpC,UAAM,OAAO,SAAS;AACtB,UAAM,cAAc,SAAS;AAE/B,WACI;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,SAAS;AAAA,QACT,OAAO,MAAM;AAAA;AAAA,IACf;AAAA,EAEJ,SAAS,OAAO;AACd,YAAQ,MAAM,6BAA6B,KAAK;AAChD,WAAOA,UAAS;AAAA,EAClB;AACF;;;AClCA,OAAOC,YAAW;AAElB,SAAS,oBAAoB;;;ACF7B,YAAYC,YAAW;AACvB,SAAS,aAAa,cAAc,sBAAsB;;;ACD1D,YAAYC,YAAW;AACvB,SAAS,YAAY;AACrB,SAAS,WAA8B;;;ACFvC,SAAS,YAA6B;AACtC,SAAS,eAAe;AAEjB,SAAS,MAAM,QAAsB;AAC1C,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B;;;ADAA,IAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SACE;AAAA,QACF,aACE;AAAA,QACF,SACE;AAAA,QACF,WACE;AAAA,QACF,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,MACA,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAQA,IAAM,SAAe;AAAA,EACnB,CAAC,IAAyD,QAAQ;AAAjE,iBAAE,aAAW,SAAS,MAAM,UAAU,MA1CzC,IA0CG,IAAgD,kBAAhD,IAAgD,CAA9C,aAAW,WAAS,QAAM;AAC3B,UAAM,OAAO,UAAU,OAAO;AAC9B,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,GAAG,eAAe,EAAE,SAAS,MAAM,UAAU,CAAC,CAAC;AAAA,QAC1D;AAAA,SACI;AAAA,IACN;AAAA,EAEJ;AACF;AACA,OAAO,cAAc;;;ADhDrB,IAAM,aAAa,CAAC,OAAsD;AAAtD,eAAE,YALtB,IAKoB,IAAgB,kBAAhB,IAAgB,CAAd;AACpB;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,cAAW;AAAA,MACX,WAAW,GAAG,sCAAsC,SAAS;AAAA,OACzD;AAAA,EACN;AAAA;AAEF,WAAW,cAAc;AAEzB,IAAM,oBAA0B,kBAG9B,CAAC,IAAyB,QAAK;AAA9B,eAAE,YAlBL,IAkBG,IAAgB,kBAAhB,IAAgB,CAAd;AACH;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW,GAAG,oCAAoC,SAAS;AAAA,OACvD;AAAA,EACN;AAAA,CACD;AACD,kBAAkB,cAAc;AAEhC,IAAM,iBAAuB,kBAG3B,CAAC,IAAyB,QAAK;AAA9B,eAAE,YA9BL,IA8BG,IAAgB,kBAAhB,IAAgB,CAAd;AACH,8CAAC,uBAAG,KAAU,WAAW,GAAG,IAAI,SAAS,KAAO,MAAO;AAAA,CACxD;AACD,eAAe,cAAc;AAO7B,IAAM,iBAAiB,CAAC,OAKA;AALA,eACtB;AAAA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,EA3CT,IAwCwB,IAInB,kBAJmB,IAInB;AAAA,IAHH;AAAA,IACA;AAAA,IACA;AAAA;AAGA;AAAA,IAAC;AAAA;AAAA,MACC,gBAAc,WAAW,SAAS;AAAA,MAClC,WAAW;AAAA,QACT,eAAe;AAAA,UACb,SAAS,WAAW,YAAY;AAAA,UAChC;AAAA,QACF,CAAC;AAAA,QACD;AAAA,MACF;AAAA,OACI;AAAA,EACN;AAAA;AAEF,eAAe,cAAc;AAE7B,IAAM,qBAAqB,CAAC,OAGoB;AAHpB,eAC1B;AAAA;AAAA,EA7DF,IA4D4B,IAEvB,kBAFuB,IAEvB;AAAA,IADH;AAAA;AAGA;AAAA,IAAC;AAAA;AAAA,MACC,cAAW;AAAA,MACX,MAAK;AAAA,MACL,WAAW,GAAG,gBAAgB,SAAS;AAAA,OACnC;AAAA,IAEJ,qCAAC,eAAY,WAAU,WAAU;AAAA,IACjC,qCAAC,cAAK,UAAQ;AAAA,EAChB;AAAA;AAEF,mBAAmB,cAAc;AAEjC,IAAM,iBAAiB,CAAC,OAGwB;AAHxB,eACtB;AAAA;AAAA,EA7EF,IA4EwB,IAEnB,kBAFmB,IAEnB;AAAA,IADH;AAAA;AAGA;AAAA,IAAC;AAAA;AAAA,MACC,cAAW;AAAA,MACX,MAAK;AAAA,MACL,WAAW,GAAG,gBAAgB,SAAS;AAAA,OACnC;AAAA,IAEJ,qCAAC,cAAK,MAAI;AAAA,IACV,qCAAC,gBAAa,WAAU,WAAU;AAAA,EACpC;AAAA;AAEF,eAAe,cAAc;AAE7B,IAAM,qBAAqB,CAAC,OAGK;AAHL,eAC1B;AAAA;AAAA,EA7FF,IA4F4B,IAEvB,kBAFuB,IAEvB;AAAA,IADH;AAAA;AAGA;AAAA,IAAC;AAAA;AAAA,MACC,eAAW;AAAA,MACX,WAAW,GAAG,4CAA4C,SAAS;AAAA,OAC/D;AAAA,IAEJ,qCAAC,kBAAe,WAAU,WAAU;AAAA,IACpC,qCAAC,UAAK,WAAU,aAAU,YAAU;AAAA,EACtC;AAAA;AAEF,mBAAmB,cAAc;;;AD1FjC,IAAM,wBAAwB;AAsB9B,eAAsB,iBAAiB,OAA8B;AArCrE;AAsCE,QAAM,iBAAe,WAAM,mBAAN,mBAAsB,gBAAe;AAC1D,QAAM,eAAe,MAAM,MAAM,gBAAgB,CAAC;AAClD,QAAM,cAAc,OAAO,aAAa,IAAI,KAAK;AAEjD,QAAM,cAA4B;AAAA,IAChC,QAAQ,cAAc,KAAK;AAAA,IAC3B,OAAO;AAAA,IACP,UAAU,aAAa,YAAY;AAAA,IACnC,QAAM,kBAAa,SAAb,mBAAmB,MAAM,SAAQ,CAAC;AAAA,EAC1C;AAEA,QAAM,MAAM,MAAM;AAAA,IAChB,MAAM;AAAA,IACN;AAAA,EACF;AAEA,QAAM,EAAE,OAAO,MAAM,IAAI;AAEzB,QAAM,aAAa,KAAK,KAAK,QAAQ,YAAY,KAAM;AAEvD,QAAM,eAAe,gBAAgB,aAAa,UAAU;AAE5D,SACE,gBAAAC,OAAA,cAAC,aACC,gBAAAA,OAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,MAAM,MAAM;AAAA,OACR,MAAM;AAAA,EACZ,GAEC,aAAa,KACZ,gBAAAA,OAAA,cAAC,cAAW,WAAU,UACpB,gBAAAA,OAAA,cAAC,yBACE,cAAc,KACb,gBAAAA,OAAA,cAAC,sBACC,gBAAAA,OAAA,cAAC,sBAAmB,MAAM,eAAe,cAAc,CAAC,IAAI,CAC9D,GAGD,aAAa,IAAI,CAAC,SAAS,QAC1B,YAAY,OACV,gBAAAA,OAAA,cAAC,kBAAe,KAAK,YAAY,GAAG,MAClC,gBAAAA,OAAA,cAAC,wBAAmB,CACtB,IAEA,gBAAAA,OAAA,cAAC,kBAAe,KAAK,WACnB,gBAAAA,OAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAM,eAAe,OAAO;AAAA,MAC5B,UAAU,YAAY;AAAA;AAAA,IAErB;AAAA,EACH,CACF,CAEH,GAEA,cAAc,cACb,gBAAAA,OAAA,cAAC,sBACC,gBAAAA,OAAA,cAAC,kBAAe,MAAM,eAAe,cAAc,CAAC,IAAI,CAC1D,CAEJ,CACF,CAEJ;AAEJ;;;AIpGA,IAAI,aAA2E,CAAC;AAChF,IAAM,iBAAiB;AAEvB,eAAeC,cAAa,QAAgD;AAC1E,QAAM,WAAW,GAAG,OAAO,SAAS,IAAI,OAAO,MAAM;AACrD,QAAM,MAAM,KAAK,IAAI;AAGrB,MAAI,WAAW,QAAQ,KAAK,WAAW,QAAQ,EAAE,UAAU,KAAK;AAC9D,WAAO,WAAW,QAAQ,EAAE;AAAA,EAC9B;AAGA,QAAM,QAAQ,MAAM,cAAc,MAAM;AAGxC,aAAW,QAAQ,IAAI;AAAA,IACrB;AAAA,IACA,SAAS,MAAM;AAAA,EACjB;AAEA,SAAO;AACT;AAEA,eAAsB,uBAAuB,QAAwB,SAAuB,CAAC,GAAG;AAC9F,QAAM,QAAQ,MAAMA,cAAa,MAAM;AAEvC,QAAM,cAAc,IAAI;AAAA,IACtB,OAAO,QAAQ,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,OAAO,KAAK,CAAC,CAAC;AAAA,EACnE,EAAE,SAAS;AAEX,QAAM,MAAM,GAAG,OAAO,MAAM,aAAa,cAAc,IAAI,WAAW,KAAK,EAAE;AAE7E,QAAM,WAAW,MAAM,MAAM,KAAK;AAAA,IAChC,SAAS;AAAA,MACP,iBAAiB,UAAU,KAAK;AAAA,MAChC,gBAAgB,OAAO;AAAA,IACzB;AAAA,EACF,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,YAAQ,MAAM,+BAA+B,QAAQ;AACrD,UAAM,IAAI,MAAM,+BAA+B,SAAS,MAAM,IAAI,SAAS,UAAU,EAAE;AAAA,EACzF;AAEA,QAAM,OAAO,MAAM,SAAS,KAAK;AACjC,SAAO;AACT;AAEA,eAAsB,sBAAsB,QAAwB,MAAc;AAChF,QAAM,QAAQ,MAAMA,cAAa,MAAM;AAEvC,QAAM,WAAW,MAAM,MAAM,GAAG,OAAO,MAAM,cAAc,IAAI,IAAI;AAAA,IACjE,SAAS;AAAA,MACP,iBAAiB,UAAU,KAAK;AAAA,MAChC,gBAAgB,OAAO;AAAA,IACzB;AAAA,EACF,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,eAAe,8BAA8B,SAAS,MAAM,IAAI,SAAS,UAAU;AACzF,UAAM,IAAI,MAAM,YAAY;AAAA,EAC9B;AAEA,SAAO,SAAS,KAAK;AACvB;AAEA,eAAsB,uBAAuB,QAAwB;AACnE,QAAM,EAAE,MAAM,IAAI,MAAM,uBAAuB,QAAQ,EAAE,OAAO,GAAG,OAAO,IAAM,CAAC;AACjF,SAAO,MAAM,IAAI,CAAC,UAAe;AAAA,IAC/B,QAAQ,EAAE,MAAM,KAAK,KAAK;AAAA,EAC5B,EAAE;AACJ;AAGA,YAAY,MAAM;AAChB,QAAM,MAAM,KAAK,IAAI;AACrB,SAAO,KAAK,UAAU,EAAE,QAAQ,SAAO;AACrC,QAAI,WAAW,GAAG,EAAE,WAAW,KAAK;AAClC,aAAO,WAAW,GAAG;AAAA,IACvB;AAAA,EACF,CAAC;AACH,GAAG,cAAc;;;ACnFjB,SAAS,gBAAAC,qBAAoB;AAE7B,OAAOC,YAAW;AAYlB,IAAMC,yBAAwB;AA0BvB,SAAS,8BAA8B,OAA2C;AACvF,MAAI,CAAC,MAAM,OAAO;AAChB,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,gBAAgB,MAAM,aAAa,MAAM,UAAU;AAExE,SACE,gBAAAC,OAAA,cAAC,aACC,gBAAAA,OAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,OAAO,MAAM;AAAA,MACb,MAAM,MAAM;AAAA,OACR,MAAM;AAAA,EACZ,GAEC,MAAM,aAAa,KAClB,gBAAAD,OAAA,cAAC,cAAW,WAAU,UACpB,gBAAAA,OAAA,cAAC,yBACE,MAAM,cAAc,KACnB,gBAAAA,OAAA,cAAC,sBACC,gBAAAA,OAAA,cAAC,sBAAmB,MAAM,eAAe,MAAM,cAAc,CAAC,IAAI,CACpE,GAGD,aAAa,IAAI,CAAC,SAAS,QAC1B,YAAY,OACV,gBAAAA,OAAA,cAAC,kBAAe,KAAK,YAAY,GAAG,MAClC,gBAAAA,OAAA,cAAC,wBAAmB,CACtB,IAEA,gBAAAA,OAAA,cAAC,kBAAe,KAAK,WACnB,gBAAAA,OAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAM,eAAe,OAAO;AAAA,MAC5B,UAAU,YAAY,MAAM;AAAA;AAAA,IAE3B;AAAA,EACH,CACF,CAEH,GAEA,MAAM,cAAc,MAAM,cACzB,gBAAAA,OAAA,cAAC,sBACC,gBAAAA,OAAA,cAAC,kBAAe,MAAM,eAAe,MAAM,cAAc,CAAC,IAAI,CAChE,CAEJ,CACF,CAEJ;AAEJ;AAEO,SAAS,oBAAoB,YAAkC;AACpE,SAAO;AAAA,IACL,MAAM,mBAAmB,EAAE,MAAM,GAI5B;AAtGT;AAuGM,UAAI;AACF,cAAM,cAAc,MAAM,OAAO,SAAS,MAAM,IAAc,IAAI;AAClE,cAAM,iBAAe,gBAAW,mBAAX,mBAA2B,gBAAeD;AAE/D,cAAM,WAAW,MAAM,uBAAuB,WAAW,QAAQ;AAAA,UAC/D,QAAQ,cAAc,KAAK;AAAA,UAC3B,OAAO;AAAA,UACP,UAAU,MAAM,YAAY;AAAA,UAC5B,QAAM,WAAM,SAAN,mBAAY,MAAM,SAAQ,CAAC;AAAA,QACnC,CAAC;AAGD,YAAI,CAAC,YAAY,OAAO,aAAa,UAAU;AAC7C,kBAAQ,MAAM,6BAA6B;AAC3C,iBAAO;AAAA,YACL,OAAO;AAAA,cACL,OAAO,CAAC;AAAA,cACR,MAAM,WAAW;AAAA,cACjB,gBAAgB,WAAW,kBAAkB,CAAC;AAAA,cAC9C,aAAa;AAAA,cACb,YAAY;AAAA,YACd;AAAA,UACF;AAAA,QACF;AAEA,cAAM,EAAE,QAAQ,CAAC,GAAG,QAAQ,EAAE,IAAI;AAClC,cAAM,aAAa,KAAK,KAAK,QAAQ,YAAY;AAEjD,eAAO;AAAA,UACL,OAAO;AAAA,YACL;AAAA,YACA,MAAM,WAAW;AAAA,YACjB,gBAAgB,WAAW,kBAAkB,CAAC;AAAA,YAC9C;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,MAAM,8BAA8B,KAAK;AAEjD,eAAO;AAAA,UACL,OAAO;AAAA,YACL,OAAO,CAAC;AAAA,YACR,MAAM,WAAW;AAAA,YACjB,gBAAgB,WAAW,kBAAkB,CAAC;AAAA,YAC9C,aAAa;AAAA,YACb,YAAY;AAAA,UACd;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACzJA,SAAS,WAAAG,gBAAe;AAGxB,OAAOC,YAAW;AAaX,SAAS,0BAA0B,OAAuC;AAC/E,MAAI,CAAC,MAAM,MAAM;AACf,WAAO;AAAA,EACT;AAEA,SACE,gBAAAA,OAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,MAAM,MAAM;AAAA,MACZ,SAAS,MAAM;AAAA,MACf,OAAO,MAAM;AAAA;AAAA,EACf;AAEJ;AAEO,SAAS,gBAAgB,YAAkC;AAChE,SAAO;AAAA,IACL,MAAM,eAAe,EAAE,OAAO,GAAiC;AAC7D,UAAI;AACF,cAAM,WAAW,MAAM,sBAAsB;AAAA,UAC3C,QAAQ,WAAW,OAAO;AAAA,UAC1B,WAAW,WAAW,OAAO;AAAA,UAC7B,QAAQ,WAAW,OAAO;AAAA,QAC5B,GAAG,OAAO,IAAI;AAEd,YAAI,CAAC,SAAS,MAAM;AAClB,iBAAO;AAAA,YACL,UAAU;AAAA,UACZ;AAAA,QACF;AAEA,eAAO;AAAA,UACL,OAAO;AAAA,YACL,MAAM,SAAS;AAAA,YACf,aAAa,SAAS;AAAA,UACxB;AAAA,UACA,YAAY;AAAA,QACd;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,MAAM,6BAA6B,KAAK;AAChD,eAAO;AAAA,UACL,UAAU;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAAA,IAEA,MAAM,iBAAiB;AACrB,UAAI;AACF,cAAM,QAAQ,MAAM,uBAAuB,WAAW,MAAM;AAE5D,eAAO;AAAA,UACL;AAAA,UACA,UAAU;AAAA,QACZ;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,MAAM,8BAA8B,KAAK;AACjD,eAAO;AAAA,UACL,OAAO,CAAC;AAAA,UACR,UAAU;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;","names":["notFound","notFound","React","React","React","React","getAuthToken","ArticleGroup","React","DEFAULT_BLOG_PER_PAGE","React","ArticleGroup","Article","React","Article"]}
|
|
1
|
+
{"version":3,"sources":["../src/NextAppRouterUtils.ts","../src/BaseUtils.ts","../src/utils.ts","../src/NextBlogPage.tsx","../src/NextBlogListPage.tsx","../src/pagination.tsx","../../easyblog-components/src/ui/button.tsx","../../easyblog-components/src/utils.ts","../src/NextPageRouterUtils.ts","../src/NextBlogListPageForPageRouter.tsx","../src/NextBlogPageForPageRouter.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: { revalidate: 3600 }\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) {\n const token = await getAuthToken(config);\n\n const response = await fetch(`${config.apiUrl}/sdk/blogs/${slug}`, {\n headers: { \n 'Authorization': `Bearer ${token}`,\n 'x-project-id': config.projectId\n },\n next: { revalidate: 3600 }\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) {\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): Promise<Metadata> {\n if (slug) {\n const post = await getBlogPost(config, slug);\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) {\n const token = await exchangeToken(config);\n const url = `${config.apiUrl}/sdk/blogs/${slug}`;\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 { Article, PoweredBy } from '@weekend-studio/easyblog-components';\nimport { EasyBlogConfig } from './models';\nimport { getBlogPost } from './NextAppRouterUtils';\n\ninterface NextBlogPageProps {\n config: EasyBlogConfig;\n slug: string;\n style?: React.CSSProperties;\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);\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 <>\n <Article \n post={post} \n content={htmlContent}\n style={props.style}\n />\n {price_id == null && \n <div className=\"flex w-full p-10 justify-center items-center\">\n <PoweredBy />\n </div>\n }\n </>\n );\n } catch (error) {\n console.error('Error fetching blog post:', error);\n return notFound();\n }\n}\n","import React from 'react';\nimport { getBlogPosts } from './NextAppRouterUtils';\nimport { ArticleGroup } from '@weekend-studio/easyblog-components';\nimport { EasyBlogConfig, IQueryParams } from './models';\nimport {\n Pagination,\n PaginationContent,\n PaginationEllipsis,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n} from \"./pagination\"\nimport { getVisiblePages } from './utils';\n\nconst DEFAULT_BLOG_PER_PAGE = 9;\ninterface NextBlogListPageProps {\n config: EasyBlogConfig;\n type: 'grid' | 'list';\n searchParams?: {\n page?: string;\n category?: string;\n tags?: string;\n };\n displayOptions?: {\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 }\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 queryParams: IQueryParams = {\n index: (currentPage - 1) * postsPerPage,\n limit: postsPerPage,\n category: searchParams.category || '',\n tags: searchParams.tags?.split(',') || []\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\n const visiblePages = getVisiblePages(currentPage, totalPages);\n\n return (\n <div>\n <ArticleGroup \n blogs={blogs} \n type={props.type} \n {...props.displayOptions}\n />\n\n {totalPages > 1 && (\n <Pagination className=\"mt-8\">\n <PaginationContent>\n {currentPage > 1 && (\n <PaginationItem>\n <PaginationPrevious href={`/blogs?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={`/blogs?page=${pageNum}`}\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}`} />\n </PaginationItem>\n )}\n </PaginationContent>\n </Pagination>\n )}\n </div>\n );\n}\n","import * as React from \"react\"\nimport { ChevronLeft, ChevronRight, MoreHorizontal } from \"lucide-react\"\nimport { ButtonProps, buttonVariants } from \"../../easyblog-components/src/ui/button\"\nimport { cn } from \"../../easyblog-components/src/utils\"\n\nconst Pagination = ({ className, ...props }: React.ComponentProps<\"nav\">) => (\n <nav\n role=\"navigation\"\n aria-label=\"pagination\"\n className={cn(\"mx-auto flex w-full justify-center\", className)}\n {...props}\n />\n)\nPagination.displayName = \"Pagination\"\n\nconst PaginationContent = React.forwardRef<\n HTMLUListElement,\n React.ComponentProps<\"ul\">\n>(({ className, ...props }, ref) => (\n <ul\n ref={ref}\n className={cn(\"flex flex-row items-center gap-1\", className)}\n {...props}\n />\n))\nPaginationContent.displayName = \"PaginationContent\"\n\nconst PaginationItem = React.forwardRef<\n HTMLLIElement,\n React.ComponentProps<\"li\">\n>(({ className, ...props }, ref) => (\n <li ref={ref} className={cn(\"\", className)} {...props} />\n))\nPaginationItem.displayName = \"PaginationItem\"\n\ntype PaginationLinkProps = {\n isActive?: boolean\n} & Pick<ButtonProps, \"size\"> &\n React.ComponentProps<any>\n\nconst PaginationLink = ({\n className,\n isActive,\n size = \"icon\",\n ...props\n}: PaginationLinkProps) => (\n <a\n aria-current={isActive ? \"page\" : undefined}\n className={cn(\n buttonVariants({\n variant: isActive ? \"outline\" : \"ghost\",\n size,\n }),\n className\n )}\n {...props}\n />\n)\nPaginationLink.displayName = \"PaginationLink\"\n\nconst PaginationPrevious = ({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) => (\n <PaginationLink\n aria-label=\"Go to previous page\"\n size=\"default\"\n className={cn(\"gap-1 pl-2.5\", className)}\n {...props}\n >\n <ChevronLeft className=\"h-4 w-4\" />\n <span>Previous</span>\n </PaginationLink>\n)\nPaginationPrevious.displayName = \"PaginationPrevious\"\n\nconst PaginationNext = ({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) => (\n <PaginationLink\n aria-label=\"Go to next page\"\n size=\"default\"\n className={cn(\"gap-1 pr-2.5\", className)}\n {...props}\n >\n <span>Next</span>\n <ChevronRight className=\"h-4 w-4\" />\n </PaginationLink>\n)\nPaginationNext.displayName = \"PaginationNext\"\n\nconst PaginationEllipsis = ({\n className,\n ...props\n}: React.ComponentProps<\"span\">) => (\n <span\n aria-hidden\n className={cn(\"flex h-9 w-9 items-center justify-center\", className)}\n {...props}\n >\n <MoreHorizontal className=\"h-4 w-4\" />\n <span className=\"sr-only\">More pages</span>\n </span>\n)\nPaginationEllipsis.displayName = \"PaginationEllipsis\"\n\nexport {\n Pagination,\n PaginationContent,\n PaginationLink,\n PaginationItem,\n PaginationPrevious,\n PaginationNext,\n PaginationEllipsis,\n}\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"../utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground shadow hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2\",\n sm: \"h-8 rounded-md px-3 text-xs\",\n lg: \"h-10 rounded-md px-8\",\n icon: \"h-9 w-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\"\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n )\n }\n)\nButton.displayName = \"Button\"\n\nexport { Button, buttonVariants }\n","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\nexport const getFormattedDate = (date: Date) => {\n if (!date) return '';\n return new Date(date).toISOString().split('T')[0];\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 });\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) {\n const token = await getAuthToken(config);\n\n const response = await fetch(`${config.apiUrl}/sdk/blogs/${slug}`, {\n headers: { \n 'Authorization': `Bearer ${token}`,\n 'x-project-id': config.projectId\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) {\n const { blogs } = await getBlogPostsPageRouter(config, { index: 0, limit: 10000 });\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","'use client';\n\nimport { getBlogPostsPageRouter } from './NextPageRouterUtils';\nimport { ArticleGroup } 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 \"./pagination\"\nimport { getVisiblePages } from './utils';\n\nconst DEFAULT_BLOG_PER_PAGE = 9;\n\ninterface NextBlogListPageForPageRouterProps {\n blogs: any[];\n type: 'grid' | 'list';\n currentPage: number;\n totalPages: number;\n displayOptions?: {\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 }\n}\n\ninterface GetStaticPropsParams {\n config: EasyBlogConfig;\n type: 'grid' | 'list';\n displayOptions?: NextBlogListPageForPageRouterProps['displayOptions'];\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\n return (\n <div>\n <ArticleGroup \n blogs={props.blogs} \n type={props.type} \n {...props.displayOptions}\n />\n\n {props.totalPages > 1 && (\n <Pagination className=\"mt-8\">\n <PaginationContent>\n {props.currentPage > 1 && (\n <PaginationItem>\n <PaginationPrevious href={`/blogs?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={`/blogs?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={`/blogs?page=${props.currentPage + 1}`} />\n </PaginationItem>\n )}\n </PaginationContent>\n </Pagination>\n )}\n </div>\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 } }) {\n try {\n const currentPage = query.page ? parseInt(query.page as string) : 1;\n const postsPerPage = pageConfig.displayOptions?.blogPerPage || DEFAULT_BLOG_PER_PAGE;\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 });\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 type: pageConfig.type,\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 type: pageConfig.type,\n displayOptions: pageConfig.displayOptions || {},\n currentPage,\n totalPages\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 type: pageConfig.type,\n displayOptions: pageConfig.displayOptions || {},\n currentPage: 1,\n totalPages: 0\n }\n };\n }\n }\n };\n}","'use client';\n\nimport { Article, PoweredBy } 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 style?: React.CSSProperties;\n}\n\ninterface GetStaticPropsParams {\n config: EasyBlogConfig;\n}\n\nexport function NextBlogPageForPageRouter(props: NextBlogPageForPageRouterProps) {\n if (!props.post) {\n return null; // Or your custom 404 component\n }\n\n return (\n <>\n <Article \n post={props.post} \n content={props.htmlContent}\n style={props.style}\n />\n {props.price_id == null && \n <div className=\"flex w-full p-10 justify-center items-center\">\n <PoweredBy />\n </div>\n }\n </>\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);\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 },\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);\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":["notFound","notFound","React","React","React","React","getAuthToken","ArticleGroup","React","DEFAULT_BLOG_PER_PAGE","React","ArticleGroup","Article","PoweredBy","React","Article","PoweredBy"]}
|
package/dist/page-index.d.mts
CHANGED
package/dist/page-index.mjs
CHANGED
|
@@ -78,7 +78,6 @@ async function getBlogPostsPageRouter(config, params = {}) {
|
|
|
78
78
|
}
|
|
79
79
|
});
|
|
80
80
|
if (!response.ok) {
|
|
81
|
-
console.error("Failed to fetch blog posts:", response);
|
|
82
81
|
throw new Error(`Failed to fetch blog posts: ${response.status} ${response.statusText}`);
|
|
83
82
|
}
|
|
84
83
|
const data = await response.json();
|
|
@@ -365,20 +364,20 @@ function withServerSideProps(pageConfig) {
|
|
|
365
364
|
}
|
|
366
365
|
|
|
367
366
|
// src/NextBlogPageForPageRouter.tsx
|
|
368
|
-
import { Article } from "@weekend-studio/easyblog-components";
|
|
367
|
+
import { Article, PoweredBy } from "@weekend-studio/easyblog-components";
|
|
369
368
|
import React4 from "react";
|
|
370
369
|
function NextBlogPageForPageRouter(props) {
|
|
371
370
|
if (!props.post) {
|
|
372
371
|
return null;
|
|
373
372
|
}
|
|
374
|
-
return /* @__PURE__ */ React4.createElement(
|
|
373
|
+
return /* @__PURE__ */ React4.createElement(React4.Fragment, null, /* @__PURE__ */ React4.createElement(
|
|
375
374
|
Article,
|
|
376
375
|
{
|
|
377
376
|
post: props.post,
|
|
378
377
|
content: props.htmlContent,
|
|
379
378
|
style: props.style
|
|
380
379
|
}
|
|
381
|
-
);
|
|
380
|
+
), props.price_id == null && /* @__PURE__ */ React4.createElement("div", { className: "flex w-full p-10 justify-center items-center" }, /* @__PURE__ */ React4.createElement(PoweredBy, null)));
|
|
382
381
|
}
|
|
383
382
|
function withStaticProps(pageConfig) {
|
|
384
383
|
return {
|
package/dist/page-index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/BaseUtils.ts","../src/NextPageRouterUtils.ts","../src/NextBlogListPageForPageRouter.tsx","../src/pagination.tsx","../../easyblog-components/src/ui/button.tsx","../../easyblog-components/src/utils.ts","../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) {\n const token = await exchangeToken(config);\n const url = `${config.apiUrl}/sdk/blogs/${slug}`;\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 });\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\nexport async function getBlogPostPageRouter(config: EasyBlogConfig, slug: string) {\n const token = await getAuthToken(config);\n\n const response = await fetch(`${config.apiUrl}/sdk/blogs/${slug}`, {\n headers: { \n 'Authorization': `Bearer ${token}`,\n 'x-project-id': config.projectId\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) {\n const { blogs } = await getBlogPostsPageRouter(config, { index: 0, limit: 10000 });\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","'use client';\n\nimport { getBlogPostsPageRouter } from './NextPageRouterUtils';\nimport { ArticleGroup } 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 \"./pagination\"\nimport { getVisiblePages } from './utils';\n\nconst DEFAULT_BLOG_PER_PAGE = 9;\n\ninterface NextBlogListPageForPageRouterProps {\n blogs: any[];\n type: 'grid' | 'list';\n currentPage: number;\n totalPages: number;\n displayOptions?: {\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 }\n}\n\ninterface GetStaticPropsParams {\n config: EasyBlogConfig;\n type: 'grid' | 'list';\n displayOptions?: NextBlogListPageForPageRouterProps['displayOptions'];\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\n return (\n <div>\n <ArticleGroup \n blogs={props.blogs} \n type={props.type} \n {...props.displayOptions}\n />\n\n {props.totalPages > 1 && (\n <Pagination className=\"mt-8\">\n <PaginationContent>\n {props.currentPage > 1 && (\n <PaginationItem>\n <PaginationPrevious href={`/blogs?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={`/blogs?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={`/blogs?page=${props.currentPage + 1}`} />\n </PaginationItem>\n )}\n </PaginationContent>\n </Pagination>\n )}\n </div>\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 } }) {\n try {\n const currentPage = query.page ? parseInt(query.page as string) : 1;\n const postsPerPage = pageConfig.displayOptions?.blogPerPage || DEFAULT_BLOG_PER_PAGE;\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 });\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 type: pageConfig.type,\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 type: pageConfig.type,\n displayOptions: pageConfig.displayOptions || {},\n currentPage,\n totalPages\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 type: pageConfig.type,\n displayOptions: pageConfig.displayOptions || {},\n currentPage: 1,\n totalPages: 0\n }\n };\n }\n }\n };\n}","import * as React from \"react\"\nimport { ChevronLeft, ChevronRight, MoreHorizontal } from \"lucide-react\"\nimport { ButtonProps, buttonVariants } from \"../../easyblog-components/src/ui/button\"\nimport { cn } from \"../../easyblog-components/src/utils\"\n\nconst Pagination = ({ className, ...props }: React.ComponentProps<\"nav\">) => (\n <nav\n role=\"navigation\"\n aria-label=\"pagination\"\n className={cn(\"mx-auto flex w-full justify-center\", className)}\n {...props}\n />\n)\nPagination.displayName = \"Pagination\"\n\nconst PaginationContent = React.forwardRef<\n HTMLUListElement,\n React.ComponentProps<\"ul\">\n>(({ className, ...props }, ref) => (\n <ul\n ref={ref}\n className={cn(\"flex flex-row items-center gap-1\", className)}\n {...props}\n />\n))\nPaginationContent.displayName = \"PaginationContent\"\n\nconst PaginationItem = React.forwardRef<\n HTMLLIElement,\n React.ComponentProps<\"li\">\n>(({ className, ...props }, ref) => (\n <li ref={ref} className={cn(\"\", className)} {...props} />\n))\nPaginationItem.displayName = \"PaginationItem\"\n\ntype PaginationLinkProps = {\n isActive?: boolean\n} & Pick<ButtonProps, \"size\"> &\n React.ComponentProps<any>\n\nconst PaginationLink = ({\n className,\n isActive,\n size = \"icon\",\n ...props\n}: PaginationLinkProps) => (\n <a\n aria-current={isActive ? \"page\" : undefined}\n className={cn(\n buttonVariants({\n variant: isActive ? \"outline\" : \"ghost\",\n size,\n }),\n className\n )}\n {...props}\n />\n)\nPaginationLink.displayName = \"PaginationLink\"\n\nconst PaginationPrevious = ({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) => (\n <PaginationLink\n aria-label=\"Go to previous page\"\n size=\"default\"\n className={cn(\"gap-1 pl-2.5\", className)}\n {...props}\n >\n <ChevronLeft className=\"h-4 w-4\" />\n <span>Previous</span>\n </PaginationLink>\n)\nPaginationPrevious.displayName = \"PaginationPrevious\"\n\nconst PaginationNext = ({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) => (\n <PaginationLink\n aria-label=\"Go to next page\"\n size=\"default\"\n className={cn(\"gap-1 pr-2.5\", className)}\n {...props}\n >\n <span>Next</span>\n <ChevronRight className=\"h-4 w-4\" />\n </PaginationLink>\n)\nPaginationNext.displayName = \"PaginationNext\"\n\nconst PaginationEllipsis = ({\n className,\n ...props\n}: React.ComponentProps<\"span\">) => (\n <span\n aria-hidden\n className={cn(\"flex h-9 w-9 items-center justify-center\", className)}\n {...props}\n >\n <MoreHorizontal className=\"h-4 w-4\" />\n <span className=\"sr-only\">More pages</span>\n </span>\n)\nPaginationEllipsis.displayName = \"PaginationEllipsis\"\n\nexport {\n Pagination,\n PaginationContent,\n PaginationLink,\n PaginationItem,\n PaginationPrevious,\n PaginationNext,\n PaginationEllipsis,\n}\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"../utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground shadow hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2\",\n sm: \"h-8 rounded-md px-3 text-xs\",\n lg: \"h-10 rounded-md px-8\",\n icon: \"h-9 w-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\"\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n )\n }\n)\nButton.displayName = \"Button\"\n\nexport { Button, buttonVariants }\n","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\nexport const getFormattedDate = (date: Date) => {\n if (!date) return '';\n return new Date(date).toISOString().split('T')[0];\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 { Article } 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 style?: React.CSSProperties;\n}\n\ninterface GetStaticPropsParams {\n config: EasyBlogConfig;\n}\n\nexport function NextBlogPageForPageRouter(props: NextBlogPageForPageRouterProps) {\n if (!props.post) {\n return null; // Or your custom 404 component\n }\n\n return (\n <Article \n post={props.post} \n content={props.htmlContent}\n style={props.style}\n />\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);\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 },\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);\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":["React","React","React","React"]}
|
|
1
|
+
{"version":3,"sources":["../src/BaseUtils.ts","../src/NextPageRouterUtils.ts","../src/NextBlogListPageForPageRouter.tsx","../src/pagination.tsx","../../easyblog-components/src/ui/button.tsx","../../easyblog-components/src/utils.ts","../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) {\n const token = await exchangeToken(config);\n const url = `${config.apiUrl}/sdk/blogs/${slug}`;\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 });\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) {\n const token = await getAuthToken(config);\n\n const response = await fetch(`${config.apiUrl}/sdk/blogs/${slug}`, {\n headers: { \n 'Authorization': `Bearer ${token}`,\n 'x-project-id': config.projectId\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) {\n const { blogs } = await getBlogPostsPageRouter(config, { index: 0, limit: 10000 });\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","'use client';\n\nimport { getBlogPostsPageRouter } from './NextPageRouterUtils';\nimport { ArticleGroup } 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 \"./pagination\"\nimport { getVisiblePages } from './utils';\n\nconst DEFAULT_BLOG_PER_PAGE = 9;\n\ninterface NextBlogListPageForPageRouterProps {\n blogs: any[];\n type: 'grid' | 'list';\n currentPage: number;\n totalPages: number;\n displayOptions?: {\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 }\n}\n\ninterface GetStaticPropsParams {\n config: EasyBlogConfig;\n type: 'grid' | 'list';\n displayOptions?: NextBlogListPageForPageRouterProps['displayOptions'];\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\n return (\n <div>\n <ArticleGroup \n blogs={props.blogs} \n type={props.type} \n {...props.displayOptions}\n />\n\n {props.totalPages > 1 && (\n <Pagination className=\"mt-8\">\n <PaginationContent>\n {props.currentPage > 1 && (\n <PaginationItem>\n <PaginationPrevious href={`/blogs?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={`/blogs?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={`/blogs?page=${props.currentPage + 1}`} />\n </PaginationItem>\n )}\n </PaginationContent>\n </Pagination>\n )}\n </div>\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 } }) {\n try {\n const currentPage = query.page ? parseInt(query.page as string) : 1;\n const postsPerPage = pageConfig.displayOptions?.blogPerPage || DEFAULT_BLOG_PER_PAGE;\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 });\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 type: pageConfig.type,\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 type: pageConfig.type,\n displayOptions: pageConfig.displayOptions || {},\n currentPage,\n totalPages\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 type: pageConfig.type,\n displayOptions: pageConfig.displayOptions || {},\n currentPage: 1,\n totalPages: 0\n }\n };\n }\n }\n };\n}","import * as React from \"react\"\nimport { ChevronLeft, ChevronRight, MoreHorizontal } from \"lucide-react\"\nimport { ButtonProps, buttonVariants } from \"../../easyblog-components/src/ui/button\"\nimport { cn } from \"../../easyblog-components/src/utils\"\n\nconst Pagination = ({ className, ...props }: React.ComponentProps<\"nav\">) => (\n <nav\n role=\"navigation\"\n aria-label=\"pagination\"\n className={cn(\"mx-auto flex w-full justify-center\", className)}\n {...props}\n />\n)\nPagination.displayName = \"Pagination\"\n\nconst PaginationContent = React.forwardRef<\n HTMLUListElement,\n React.ComponentProps<\"ul\">\n>(({ className, ...props }, ref) => (\n <ul\n ref={ref}\n className={cn(\"flex flex-row items-center gap-1\", className)}\n {...props}\n />\n))\nPaginationContent.displayName = \"PaginationContent\"\n\nconst PaginationItem = React.forwardRef<\n HTMLLIElement,\n React.ComponentProps<\"li\">\n>(({ className, ...props }, ref) => (\n <li ref={ref} className={cn(\"\", className)} {...props} />\n))\nPaginationItem.displayName = \"PaginationItem\"\n\ntype PaginationLinkProps = {\n isActive?: boolean\n} & Pick<ButtonProps, \"size\"> &\n React.ComponentProps<any>\n\nconst PaginationLink = ({\n className,\n isActive,\n size = \"icon\",\n ...props\n}: PaginationLinkProps) => (\n <a\n aria-current={isActive ? \"page\" : undefined}\n className={cn(\n buttonVariants({\n variant: isActive ? \"outline\" : \"ghost\",\n size,\n }),\n className\n )}\n {...props}\n />\n)\nPaginationLink.displayName = \"PaginationLink\"\n\nconst PaginationPrevious = ({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) => (\n <PaginationLink\n aria-label=\"Go to previous page\"\n size=\"default\"\n className={cn(\"gap-1 pl-2.5\", className)}\n {...props}\n >\n <ChevronLeft className=\"h-4 w-4\" />\n <span>Previous</span>\n </PaginationLink>\n)\nPaginationPrevious.displayName = \"PaginationPrevious\"\n\nconst PaginationNext = ({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) => (\n <PaginationLink\n aria-label=\"Go to next page\"\n size=\"default\"\n className={cn(\"gap-1 pr-2.5\", className)}\n {...props}\n >\n <span>Next</span>\n <ChevronRight className=\"h-4 w-4\" />\n </PaginationLink>\n)\nPaginationNext.displayName = \"PaginationNext\"\n\nconst PaginationEllipsis = ({\n className,\n ...props\n}: React.ComponentProps<\"span\">) => (\n <span\n aria-hidden\n className={cn(\"flex h-9 w-9 items-center justify-center\", className)}\n {...props}\n >\n <MoreHorizontal className=\"h-4 w-4\" />\n <span className=\"sr-only\">More pages</span>\n </span>\n)\nPaginationEllipsis.displayName = \"PaginationEllipsis\"\n\nexport {\n Pagination,\n PaginationContent,\n PaginationLink,\n PaginationItem,\n PaginationPrevious,\n PaginationNext,\n PaginationEllipsis,\n}\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"../utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground shadow hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2\",\n sm: \"h-8 rounded-md px-3 text-xs\",\n lg: \"h-10 rounded-md px-8\",\n icon: \"h-9 w-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\"\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n )\n }\n)\nButton.displayName = \"Button\"\n\nexport { Button, buttonVariants }\n","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\nexport const getFormattedDate = (date: Date) => {\n if (!date) return '';\n return new Date(date).toISOString().split('T')[0];\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 { Article, PoweredBy } 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 style?: React.CSSProperties;\n}\n\ninterface GetStaticPropsParams {\n config: EasyBlogConfig;\n}\n\nexport function NextBlogPageForPageRouter(props: NextBlogPageForPageRouterProps) {\n if (!props.post) {\n return null; // Or your custom 404 component\n }\n\n return (\n <>\n <Article \n post={props.post} \n content={props.htmlContent}\n style={props.style}\n />\n {props.price_id == null && \n <div className=\"flex w-full p-10 justify-center items-center\">\n <PoweredBy />\n </div>\n }\n </>\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);\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 },\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);\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,eAAsB,cAAc,QAAgD;AAClF,MAAI;AACF,UAAM,WAAW,MAAM,MAAM,GAAG,OAAO,MAAM,mBAAmB;AAAA,MAC9D,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,iBAAiB,UAAU,OAAO,MAAM;AAAA,QACxC,gBAAgB,OAAO;AAAA,MACzB;AAAA,IACF,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,cAAQ,MAAM,6BAA6B,QAAQ;AACnD,YAAM,IAAI,MAAM,wBAAwB;AAAA,IAC1C;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,WAAO,KAAK;AAAA,EACd,SAAS,OAAO;AACd,YAAQ,MAAM,6BAA6B,KAAK;AAChD,WAAO;AAAA,EACT;AACF;;;ACpBA,IAAI,aAA2E,CAAC;AAChF,IAAM,iBAAiB;AAEvB,eAAe,aAAa,QAAgD;AAC1E,QAAM,WAAW,GAAG,OAAO,SAAS,IAAI,OAAO,MAAM;AACrD,QAAM,MAAM,KAAK,IAAI;AAGrB,MAAI,WAAW,QAAQ,KAAK,WAAW,QAAQ,EAAE,UAAU,KAAK;AAC9D,WAAO,WAAW,QAAQ,EAAE;AAAA,EAC9B;AAGA,QAAM,QAAQ,MAAM,cAAc,MAAM;AAGxC,aAAW,QAAQ,IAAI;AAAA,IACrB;AAAA,IACA,SAAS,MAAM;AAAA,EACjB;AAEA,SAAO;AACT;AAEA,eAAsB,uBAAuB,QAAwB,SAAuB,CAAC,GAAG;AAC9F,QAAM,QAAQ,MAAM,aAAa,MAAM;AAEvC,QAAM,cAAc,IAAI;AAAA,IACtB,OAAO,QAAQ,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,OAAO,KAAK,CAAC,CAAC;AAAA,EACnE,EAAE,SAAS;AAEX,QAAM,MAAM,GAAG,OAAO,MAAM,aAAa,cAAc,IAAI,WAAW,KAAK,EAAE;AAE7E,QAAM,WAAW,MAAM,MAAM,KAAK;AAAA,IAChC,SAAS;AAAA,MACP,iBAAiB,UAAU,KAAK;AAAA,MAChC,gBAAgB,OAAO;AAAA,IACzB;AAAA,EACF,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,MAAM,+BAA+B,SAAS,MAAM,IAAI,SAAS,UAAU,EAAE;AAAA,EACzF;AAEA,QAAM,OAAO,MAAM,SAAS,KAAK;AACjC,SAAO;AACT;AAEA,eAAsB,sBAAsB,QAAwB,MAAc;AAChF,QAAM,QAAQ,MAAM,aAAa,MAAM;AAEvC,QAAM,WAAW,MAAM,MAAM,GAAG,OAAO,MAAM,cAAc,IAAI,IAAI;AAAA,IACjE,SAAS;AAAA,MACP,iBAAiB,UAAU,KAAK;AAAA,MAChC,gBAAgB,OAAO;AAAA,IACzB;AAAA,EACF,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,eAAe,8BAA8B,SAAS,MAAM,IAAI,SAAS,UAAU;AACzF,UAAM,IAAI,MAAM,YAAY;AAAA,EAC9B;AAEA,SAAO,SAAS,KAAK;AACvB;AAEA,eAAsB,uBAAuB,QAAwB;AACnE,QAAM,EAAE,MAAM,IAAI,MAAM,uBAAuB,QAAQ,EAAE,OAAO,GAAG,OAAO,IAAM,CAAC;AACjF,SAAO,MAAM,IAAI,CAAC,UAAe;AAAA,IAC/B,QAAQ,EAAE,MAAM,KAAK,KAAK;AAAA,EAC5B,EAAE;AACJ;AAGA,YAAY,MAAM;AAChB,QAAM,MAAM,KAAK,IAAI;AACrB,SAAO,KAAK,UAAU,EAAE,QAAQ,SAAO;AACrC,QAAI,WAAW,GAAG,EAAE,WAAW,KAAK;AAClC,aAAO,WAAW,GAAG;AAAA,IACvB;AAAA,EACF,CAAC;AACH,GAAG,cAAc;;;AClFjB,SAAS,oBAAoB;AAE7B,OAAOA,YAAW;;;ACLlB,YAAYC,YAAW;AACvB,SAAS,aAAa,cAAc,sBAAsB;;;ACD1D,YAAY,WAAW;AACvB,SAAS,YAAY;AACrB,SAAS,WAA8B;;;ACFvC,SAAS,YAA6B;AACtC,SAAS,eAAe;AAEjB,SAAS,MAAM,QAAsB;AAC1C,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B;;;ADAA,IAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SACE;AAAA,QACF,aACE;AAAA,QACF,SACE;AAAA,QACF,WACE;AAAA,QACF,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,MACA,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAQA,IAAM,SAAe;AAAA,EACnB,CAAC,IAAyD,QAAQ;AAAjE,iBAAE,aAAW,SAAS,MAAM,UAAU,MA1CzC,IA0CG,IAAgD,kBAAhD,IAAgD,CAA9C,aAAW,WAAS,QAAM;AAC3B,UAAM,OAAO,UAAU,OAAO;AAC9B,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,GAAG,eAAe,EAAE,SAAS,MAAM,UAAU,CAAC,CAAC;AAAA,QAC1D;AAAA,SACI;AAAA,IACN;AAAA,EAEJ;AACF;AACA,OAAO,cAAc;;;ADhDrB,IAAM,aAAa,CAAC,OAAsD;AAAtD,eAAE,YALtB,IAKoB,IAAgB,kBAAhB,IAAgB,CAAd;AACpB;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,cAAW;AAAA,MACX,WAAW,GAAG,sCAAsC,SAAS;AAAA,OACzD;AAAA,EACN;AAAA;AAEF,WAAW,cAAc;AAEzB,IAAM,oBAA0B,kBAG9B,CAAC,IAAyB,QAAK;AAA9B,eAAE,YAlBL,IAkBG,IAAgB,kBAAhB,IAAgB,CAAd;AACH;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW,GAAG,oCAAoC,SAAS;AAAA,OACvD;AAAA,EACN;AAAA,CACD;AACD,kBAAkB,cAAc;AAEhC,IAAM,iBAAuB,kBAG3B,CAAC,IAAyB,QAAK;AAA9B,eAAE,YA9BL,IA8BG,IAAgB,kBAAhB,IAAgB,CAAd;AACH,8CAAC,uBAAG,KAAU,WAAW,GAAG,IAAI,SAAS,KAAO,MAAO;AAAA,CACxD;AACD,eAAe,cAAc;AAO7B,IAAM,iBAAiB,CAAC,OAKA;AALA,eACtB;AAAA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,EA3CT,IAwCwB,IAInB,kBAJmB,IAInB;AAAA,IAHH;AAAA,IACA;AAAA,IACA;AAAA;AAGA;AAAA,IAAC;AAAA;AAAA,MACC,gBAAc,WAAW,SAAS;AAAA,MAClC,WAAW;AAAA,QACT,eAAe;AAAA,UACb,SAAS,WAAW,YAAY;AAAA,UAChC;AAAA,QACF,CAAC;AAAA,QACD;AAAA,MACF;AAAA,OACI;AAAA,EACN;AAAA;AAEF,eAAe,cAAc;AAE7B,IAAM,qBAAqB,CAAC,OAGoB;AAHpB,eAC1B;AAAA;AAAA,EA7DF,IA4D4B,IAEvB,kBAFuB,IAEvB;AAAA,IADH;AAAA;AAGA;AAAA,IAAC;AAAA;AAAA,MACC,cAAW;AAAA,MACX,MAAK;AAAA,MACL,WAAW,GAAG,gBAAgB,SAAS;AAAA,OACnC;AAAA,IAEJ,qCAAC,eAAY,WAAU,WAAU;AAAA,IACjC,qCAAC,cAAK,UAAQ;AAAA,EAChB;AAAA;AAEF,mBAAmB,cAAc;AAEjC,IAAM,iBAAiB,CAAC,OAGwB;AAHxB,eACtB;AAAA;AAAA,EA7EF,IA4EwB,IAEnB,kBAFmB,IAEnB;AAAA,IADH;AAAA;AAGA;AAAA,IAAC;AAAA;AAAA,MACC,cAAW;AAAA,MACX,MAAK;AAAA,MACL,WAAW,GAAG,gBAAgB,SAAS;AAAA,OACnC;AAAA,IAEJ,qCAAC,cAAK,MAAI;AAAA,IACV,qCAAC,gBAAa,WAAU,WAAU;AAAA,EACpC;AAAA;AAEF,eAAe,cAAc;AAE7B,IAAM,qBAAqB,CAAC,OAGK;AAHL,eAC1B;AAAA;AAAA,EA7FF,IA4F4B,IAEvB,kBAFuB,IAEvB;AAAA,IADH;AAAA;AAGA;AAAA,IAAC;AAAA;AAAA,MACC,eAAW;AAAA,MACX,WAAW,GAAG,4CAA4C,SAAS;AAAA,OAC/D;AAAA,IAEJ,qCAAC,kBAAe,WAAU,WAAU;AAAA,IACpC,qCAAC,UAAK,WAAU,aAAU,YAAU;AAAA,EACtC;AAAA;AAEF,mBAAmB,cAAc;;;AGxF1B,IAAM,kBAAkB,CAAC,SAAiB,UAAkB;AACjE,MAAI,SAAS,EAAG,QAAO,MAAM,KAAK,EAAE,QAAQ,MAAM,GAAG,CAAC,GAAG,MAAM,IAAI,CAAC;AAEpE,MAAI,WAAW,EAAG,QAAO,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,MAAM,KAAK;AACpD,MAAI,WAAW,QAAQ,EAAG,QAAO,CAAC,GAAG,MAAM,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,KAAK;AAE5F,SAAO,CAAC,GAAG,MAAM,UAAU,GAAG,SAAS,UAAU,GAAG,MAAM,KAAK;AACjE;;;AJPA,IAAM,wBAAwB;AA0BvB,SAAS,8BAA8B,OAA2C;AACvF,MAAI,CAAC,MAAM,OAAO;AAChB,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,gBAAgB,MAAM,aAAa,MAAM,UAAU;AAExE,SACE,gBAAAC,OAAA,cAAC,aACC,gBAAAA,OAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,MAAM;AAAA,MACb,MAAM,MAAM;AAAA,OACR,MAAM;AAAA,EACZ,GAEC,MAAM,aAAa,KAClB,gBAAAA,OAAA,cAAC,cAAW,WAAU,UACpB,gBAAAA,OAAA,cAAC,yBACE,MAAM,cAAc,KACnB,gBAAAA,OAAA,cAAC,sBACC,gBAAAA,OAAA,cAAC,sBAAmB,MAAM,eAAe,MAAM,cAAc,CAAC,IAAI,CACpE,GAGD,aAAa,IAAI,CAAC,SAAS,QAC1B,YAAY,OACV,gBAAAA,OAAA,cAAC,kBAAe,KAAK,YAAY,GAAG,MAClC,gBAAAA,OAAA,cAAC,wBAAmB,CACtB,IAEA,gBAAAA,OAAA,cAAC,kBAAe,KAAK,WACnB,gBAAAA,OAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAM,eAAe,OAAO;AAAA,MAC5B,UAAU,YAAY,MAAM;AAAA;AAAA,IAE3B;AAAA,EACH,CACF,CAEH,GAEA,MAAM,cAAc,MAAM,cACzB,gBAAAA,OAAA,cAAC,sBACC,gBAAAA,OAAA,cAAC,kBAAe,MAAM,eAAe,MAAM,cAAc,CAAC,IAAI,CAChE,CAEJ,CACF,CAEJ;AAEJ;AAEO,SAAS,oBAAoB,YAAkC;AACpE,SAAO;AAAA,IACL,MAAM,mBAAmB,EAAE,MAAM,GAI5B;AAtGT;AAuGM,UAAI;AACF,cAAM,cAAc,MAAM,OAAO,SAAS,MAAM,IAAc,IAAI;AAClE,cAAM,iBAAe,gBAAW,mBAAX,mBAA2B,gBAAe;AAE/D,cAAM,WAAW,MAAM,uBAAuB,WAAW,QAAQ;AAAA,UAC/D,QAAQ,cAAc,KAAK;AAAA,UAC3B,OAAO;AAAA,UACP,UAAU,MAAM,YAAY;AAAA,UAC5B,QAAM,WAAM,SAAN,mBAAY,MAAM,SAAQ,CAAC;AAAA,QACnC,CAAC;AAGD,YAAI,CAAC,YAAY,OAAO,aAAa,UAAU;AAC7C,kBAAQ,MAAM,6BAA6B;AAC3C,iBAAO;AAAA,YACL,OAAO;AAAA,cACL,OAAO,CAAC;AAAA,cACR,MAAM,WAAW;AAAA,cACjB,gBAAgB,WAAW,kBAAkB,CAAC;AAAA,cAC9C,aAAa;AAAA,cACb,YAAY;AAAA,YACd;AAAA,UACF;AAAA,QACF;AAEA,cAAM,EAAE,QAAQ,CAAC,GAAG,QAAQ,EAAE,IAAI;AAClC,cAAM,aAAa,KAAK,KAAK,QAAQ,YAAY;AAEjD,eAAO;AAAA,UACL,OAAO;AAAA,YACL;AAAA,YACA,MAAM,WAAW;AAAA,YACjB,gBAAgB,WAAW,kBAAkB,CAAC;AAAA,YAC9C;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,MAAM,8BAA8B,KAAK;AAEjD,eAAO;AAAA,UACL,OAAO;AAAA,YACL,OAAO,CAAC;AAAA,YACR,MAAM,WAAW;AAAA,YACjB,gBAAgB,WAAW,kBAAkB,CAAC;AAAA,YAC9C,aAAa;AAAA,YACb,YAAY;AAAA,UACd;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AKzJA,SAAS,SAAS,iBAAiB;AAGnC,OAAOC,YAAW;AAcX,SAAS,0BAA0B,OAAuC;AAC/E,MAAI,CAAC,MAAM,MAAM;AACf,WAAO;AAAA,EACT;AAEA,SACE,gBAAAA,OAAA,cAAAA,OAAA,gBACE,gBAAAA,OAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAM,MAAM;AAAA,MACZ,SAAS,MAAM;AAAA,MACf,OAAO,MAAM;AAAA;AAAA,EACf,GACC,MAAM,YAAY,QACjB,gBAAAA,OAAA,cAAC,SAAI,WAAU,kDACb,gBAAAA,OAAA,cAAC,eAAU,CACb,CAEJ;AAEJ;AAEO,SAAS,gBAAgB,YAAkC;AAChE,SAAO;AAAA,IACL,MAAM,eAAe,EAAE,OAAO,GAAiC;AAC7D,UAAI;AACF,cAAM,WAAW,MAAM,sBAAsB;AAAA,UAC3C,QAAQ,WAAW,OAAO;AAAA,UAC1B,WAAW,WAAW,OAAO;AAAA,UAC7B,QAAQ,WAAW,OAAO;AAAA,QAC5B,GAAG,OAAO,IAAI;AAEd,YAAI,CAAC,SAAS,MAAM;AAClB,iBAAO;AAAA,YACL,UAAU;AAAA,UACZ;AAAA,QACF;AAEA,eAAO;AAAA,UACL,OAAO;AAAA,YACL,MAAM,SAAS;AAAA,YACf,aAAa,SAAS;AAAA,UACxB;AAAA,UACA,YAAY;AAAA,QACd;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,MAAM,6BAA6B,KAAK;AAChD,eAAO;AAAA,UACL,UAAU;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAAA,IAEA,MAAM,iBAAiB;AACrB,UAAI;AACF,cAAM,QAAQ,MAAM,uBAAuB,WAAW,MAAM;AAE5D,eAAO;AAAA,UACL;AAAA,UACA,UAAU;AAAA,QACZ;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,MAAM,8BAA8B,KAAK;AACjD,eAAO;AAAA,UACL,OAAO,CAAC;AAAA,UACR,UAAU;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;","names":["React","React","React","React"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@weekend-studio/easyblog-next",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.20",
|
|
4
4
|
"private": false,
|
|
5
5
|
"scripts": {
|
|
6
6
|
"dev": "next dev",
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"build": "tsup"
|
|
10
10
|
},
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"@weekend-studio/easyblog-components": "^0.0.
|
|
12
|
+
"@weekend-studio/easyblog-components": "^0.0.22",
|
|
13
13
|
"jsonwebtoken": "^9.0.2"
|
|
14
14
|
},
|
|
15
15
|
"devDependencies": {
|