@xexr/blog-platform 1.0.2 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,14 +1,42 @@
1
1
  import { PublishedArticle, PublishedSite, PublishResult, PublishedAuthor } from './types/index.js';
2
2
  export { PublishPayload } from './types/index.js';
3
3
  import * as react_jsx_runtime from 'react/jsx-runtime';
4
- import * as class_variance_authority_types from 'class-variance-authority/types';
5
4
  import * as React from 'react';
5
+ import { CSSProperties } from 'react';
6
+ import * as class_variance_authority_types from 'class-variance-authority/types';
6
7
  import { VariantProps } from 'class-variance-authority';
7
8
  import { ClassValue } from 'clsx';
8
9
  import { NextRequest, NextResponse } from 'next/server';
9
10
  import * as drizzle_orm_sqlite_core from 'drizzle-orm/sqlite-core';
10
11
  import { LibSQLDatabase } from 'drizzle-orm/libsql';
11
12
 
13
+ interface BlogTheme {
14
+ accentColor?: string;
15
+ accentHoverColor?: string;
16
+ accentBackgroundColor?: string;
17
+ accentBorderColor?: string;
18
+ }
19
+ interface TocItem {
20
+ id: string;
21
+ text: string;
22
+ level: 2 | 3;
23
+ }
24
+ interface ArticleDateMeta {
25
+ publishedDateLabel: string;
26
+ publishedRelativeLabel: string;
27
+ updatedDateLabel: string;
28
+ isUpdated: boolean;
29
+ }
30
+ type BlogThemeStyle = CSSProperties & {
31
+ "--blog-accent": string;
32
+ "--blog-accent-hover": string;
33
+ "--blog-accent-bg": string;
34
+ "--blog-accent-border": string;
35
+ };
36
+ declare function getBlogThemeStyle(theme?: BlogTheme): BlogThemeStyle;
37
+ declare function formatArticleDateMeta(publishedAt: string, updatedAt: string): ArticleDateMeta;
38
+ declare function extractTableOfContents(markdown: string): TocItem[];
39
+
12
40
  interface BlogHomePageProps {
13
41
  articles: PublishedArticle[];
14
42
  siteName?: string;
@@ -26,6 +54,8 @@ interface BlogHomePageProps {
26
54
  totalPages: number;
27
55
  baseUrl?: string;
28
56
  };
57
+ /** Optional theme values for host-site brand integration. */
58
+ theme?: BlogTheme;
29
59
  }
30
60
  /**
31
61
  * Blog home page component that displays a list of published articles.
@@ -34,7 +64,7 @@ interface BlogHomePageProps {
34
64
  * @xexr/blog-platform package. It provides a clean, SEO-friendly
35
65
  * article listing with proper metadata.
36
66
  */
37
- declare function BlogHomePage({ articles, siteName, siteTagline, className, site, includeStructuredData, basePath, pagination, }: BlogHomePageProps): react_jsx_runtime.JSX.Element;
67
+ declare function BlogHomePage({ articles, siteName, siteTagline, className, site, includeStructuredData, basePath, pagination, theme, }: BlogHomePageProps): react_jsx_runtime.JSX.Element;
38
68
  /**
39
69
  * Generate metadata for the blog home page for SEO optimization.
40
70
  * This function should be used in the Next.js metadata API.
@@ -85,8 +115,21 @@ interface ArticlePageProps {
85
115
  };
86
116
  /** Public path where this blog is mounted, e.g. "/blog" or "/new-blog". */
87
117
  basePath?: string;
118
+ /** Optional theme values for host-site brand integration. */
119
+ theme?: BlogTheme;
120
+ /** Optional post-article CTA supplied by the host site. */
121
+ postArticleCta?: {
122
+ title: string;
123
+ description?: string;
124
+ href: string;
125
+ label: string;
126
+ };
127
+ /** Optional related articles supplied by the host site. */
128
+ relatedArticles?: PublishedArticle[];
129
+ /** Whether to render static article share links. */
130
+ showShareLinks?: boolean;
88
131
  }
89
- declare function ArticlePage({ article, className, navigation, basePath, }: ArticlePageProps): react_jsx_runtime.JSX.Element;
132
+ declare function ArticlePage({ article, className, navigation, basePath, theme, postArticleCta, relatedArticles, showShareLinks, }: ArticlePageProps): react_jsx_runtime.JSX.Element;
90
133
  /**
91
134
  * Generate metadata for the article page for SEO optimization.
92
135
  * This function should be used in the Next.js metadata API.
@@ -1807,4 +1850,4 @@ declare function OPTIONS(request: NextRequest): Promise<NextResponse>;
1807
1850
 
1808
1851
  declare const PACKAGE_VERSION: string;
1809
1852
 
1810
- export { ApiKeyAuth, type AuthConfig, type AuthResult, ArticlePage as BlogArticlePage, BlogHomePage, type BlogPlatformConfig, type BlogPlatformStorage, type BlogPostingSchema, type BlogSitemapConfig, type BreadcrumbListSchema, Button, type CanonicalUrlOptions, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, DrizzleStorage, EnvAuth, type GeneratedMetadata, InMemoryStorage, type LinkTag, type MetaTag, type MetadataOptions, type NextjsSitemapEntry, NoAuth, type OrganizationSchema, PACKAGE_VERSION, Pagination$1 as Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, type PersonSchema, PublishResult, PublishedArticle, PublishedAuthor, PublishedSite, type RateLimitConfig, type RateLimitResult, Pagination as ShadcnPagination, type SitemapChangeFreq, type SitemapData, type SitemapEntry, type SitemapOptions, StructuredDataError, type StructuredDataOptions, UninitializedAuth, type WebSiteSchema, autoConfigureRateLimit, bpArticles, bpOperations, buildBlogPath, buttonVariants, checkRateLimit, cn, configureRateLimit, createBlogSitemapRoute, createDynamicBlogSitemap, createRateLimitErrorResponse, createStructuredDataScript, enforceRateLimit, extractKeywordsFromArticle, extractTokenFromHeader, generateArticleMetadata, generateArticleStructuredData, generateAuthorStructuredData, generateBlogHomeMetadata, generateBlogHomeStructuredData, generateBlogSitemapEntries, generateBreadcrumbStructuredData, generateCanonicalUrl, generateCanonicalUrlFromSlug, generateCompleteArticleStructuredData, generateOrganizationStructuredData, generatePaginationMetadata, generateSiteMetadata, generateSitemap, generateSitemapIndex, generateWebSiteStructuredData, getAuthConfig, getBaseUrl, getDrizzleAdapterSql, getPathPrefixFromBlogUrl, getRateLimitHeaders, getStorage, initBlogPlatform, initBlogPlatformDev, initBlogPlatformOnce, initBlogPlatformProd, initEnvAuth, isValidCanonicalUrl, metadataToHtml, normalizeBlogBasePath, normalizeDomain, normalizeSlug, POST$1 as publishHandler, safeGenerateArticleStructuredData, setAuthConfig, setStorage, shouldSkipAuth, sitemapToXml, GET as slugExistsHandler, OPTIONS as slugExistsOptionsHandler, structuredDataToJsonLd, POST as unpublishHandler, updateArticleCanonicalUrl, usePagination, validateMetadata, validateSitemap, validateStructuredData, GET$1 as versionHandler };
1853
+ export { ApiKeyAuth, type AuthConfig, type AuthResult, ArticlePage as BlogArticlePage, BlogHomePage, type BlogPlatformConfig, type BlogPlatformStorage, type BlogPostingSchema, type BlogSitemapConfig, type BlogTheme, type BreadcrumbListSchema, Button, type CanonicalUrlOptions, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, DrizzleStorage, EnvAuth, type GeneratedMetadata, InMemoryStorage, type LinkTag, type MetaTag, type MetadataOptions, type NextjsSitemapEntry, NoAuth, type OrganizationSchema, PACKAGE_VERSION, Pagination$1 as Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, type PersonSchema, PublishResult, PublishedArticle, PublishedAuthor, PublishedSite, type RateLimitConfig, type RateLimitResult, Pagination as ShadcnPagination, type SitemapChangeFreq, type SitemapData, type SitemapEntry, type SitemapOptions, StructuredDataError, type StructuredDataOptions, UninitializedAuth, type WebSiteSchema, autoConfigureRateLimit, bpArticles, bpOperations, buildBlogPath, buttonVariants, checkRateLimit, cn, configureRateLimit, createBlogSitemapRoute, createDynamicBlogSitemap, createRateLimitErrorResponse, createStructuredDataScript, enforceRateLimit, extractKeywordsFromArticle, extractTableOfContents, extractTokenFromHeader, formatArticleDateMeta, generateArticleMetadata, generateArticleStructuredData, generateAuthorStructuredData, generateBlogHomeMetadata, generateBlogHomeStructuredData, generateBlogSitemapEntries, generateBreadcrumbStructuredData, generateCanonicalUrl, generateCanonicalUrlFromSlug, generateCompleteArticleStructuredData, generateOrganizationStructuredData, generatePaginationMetadata, generateSiteMetadata, generateSitemap, generateSitemapIndex, generateWebSiteStructuredData, getAuthConfig, getBaseUrl, getBlogThemeStyle, getDrizzleAdapterSql, getPathPrefixFromBlogUrl, getRateLimitHeaders, getStorage, initBlogPlatform, initBlogPlatformDev, initBlogPlatformOnce, initBlogPlatformProd, initEnvAuth, isValidCanonicalUrl, metadataToHtml, normalizeBlogBasePath, normalizeDomain, normalizeSlug, POST$1 as publishHandler, safeGenerateArticleStructuredData, setAuthConfig, setStorage, shouldSkipAuth, sitemapToXml, GET as slugExistsHandler, OPTIONS as slugExistsOptionsHandler, structuredDataToJsonLd, POST as unpublishHandler, updateArticleCanonicalUrl, usePagination, validateMetadata, validateSitemap, validateStructuredData, GET$1 as versionHandler };
package/dist/index.js CHANGED
@@ -1,6 +1,7 @@
1
- 'use strict';var Ce=require('next/link'),He=require('next/image'),clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),lucideReact=require('lucide-react'),reactSlot=require('@radix-ui/react-slot'),classVarianceAuthority=require('class-variance-authority'),jsxRuntime=require('react/jsx-runtime'),dateFns=require('date-fns'),rsc=require('next-mdx-remote-client/rsc'),qe=require('react'),Te=require('@radix-ui/react-separator'),$t=require('remark-gfm'),Ut=require('remark-toc'),ratelimit=require('@upstash/ratelimit'),redis=require('@upstash/redis'),drizzleOrm=require('drizzle-orm'),sqliteCore=require('drizzle-orm/sqlite-core'),server=require('next/server');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var Ce__default=/*#__PURE__*/_interopDefault(Ce);var He__default=/*#__PURE__*/_interopDefault(He);var qe__namespace=/*#__PURE__*/_interopNamespace(qe);var Te__namespace=/*#__PURE__*/_interopNamespace(Te);var $t__default=/*#__PURE__*/_interopDefault($t);var Ut__default=/*#__PURE__*/_interopDefault(Ut);function x(...e){return tailwindMerge.twMerge(clsx.clsx(e))}var ne=classVarianceAuthority.cva("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",{variants:{variant:{default:"bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",destructive:"bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",outline:"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2 has-[>svg]:px-3",sm:"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",lg:"h-10 rounded-md px-6 has-[>svg]:px-4",icon:"size-9"}},defaultVariants:{variant:"default",size:"default"}});function ft({className:e,variant:t,size:r,asChild:n=false,...o}){return jsxRuntime.jsx(n?reactSlot.Slot:"button",{"data-slot":"button",className:x(ne({variant:t,size:r,className:e})),...o})}function fe({className:e,...t}){return jsxRuntime.jsx("nav",{role:"navigation","aria-label":"pagination","data-slot":"pagination",className:x("mx-auto flex w-full justify-center",e),...t})}function he({className:e,...t}){return jsxRuntime.jsx("ul",{"data-slot":"pagination-content",className:x("flex flex-row items-center gap-1",e),...t})}function B({...e}){return jsxRuntime.jsx("li",{"data-slot":"pagination-item",...e})}function U({className:e,isActive:t,size:r="icon",...n}){return jsxRuntime.jsx("a",{"aria-current":t?"page":void 0,"data-slot":"pagination-link","data-active":t,className:x(ne({variant:t?"outline":"ghost",size:r}),e),...n})}function be({className:e,...t}){return jsxRuntime.jsxs(U,{"aria-label":"Go to previous page",size:"default",className:x("gap-1 px-2.5 sm:pl-2.5",e),...t,children:[jsxRuntime.jsx(lucideReact.ChevronLeftIcon,{}),jsxRuntime.jsx("span",{className:"hidden sm:block",children:"Previous"})]})}function ye({className:e,...t}){return jsxRuntime.jsxs(U,{"aria-label":"Go to next page",size:"default",className:x("gap-1 px-2.5 sm:pr-2.5",e),...t,children:[jsxRuntime.jsx("span",{className:"hidden sm:block",children:"Next"}),jsxRuntime.jsx(lucideReact.ChevronRightIcon,{})]})}function ie({className:e,...t}){return jsxRuntime.jsxs("span",{"aria-hidden":true,"data-slot":"pagination-ellipsis",className:x("flex size-9 items-center justify-center",e),...t,children:[jsxRuntime.jsx(lucideReact.MoreHorizontalIcon,{className:"size-4"}),jsxRuntime.jsx("span",{className:"sr-only",children:"More pages"})]})}function oe({currentPage:e,totalPages:t,baseUrl:r,className:n,maxVisiblePages:o=5,showPrevNext:i=true,showFirstLast:s=true}){if(t<=1)return null;let a=()=>{let m=Math.floor(o/2),d=Math.max(1,e-m),b=Math.min(t,d+o-1);return b-d+1<o&&(d=Math.max(1,b-o+1)),{start:d,end:b}},{start:c,end:l}=a(),p=Array.from({length:l-c+1},(m,d)=>c+d),u=m=>m===1?r:`${r}?page=${m}`,P=e>1,h=e<t;return jsxRuntime.jsxs(fe,{className:n,children:[jsxRuntime.jsxs(he,{children:[s&&e>2&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(B,{children:jsxRuntime.jsx(U,{href:u(1),"aria-label":"Go to first page",children:jsxRuntime.jsx(lucideReact.ChevronsLeft,{className:"h-4 w-4"})})}),c>2&&jsxRuntime.jsx(B,{children:jsxRuntime.jsx(ie,{})})]}),i&&jsxRuntime.jsx(B,{children:P?jsxRuntime.jsx(be,{href:u(e-1)}):jsxRuntime.jsx("span",{className:"flex h-9 items-center justify-center gap-1 px-2.5 text-muted-foreground sm:pl-2.5",children:jsxRuntime.jsx("span",{className:"hidden sm:block",children:"Previous"})})}),p.map(m=>jsxRuntime.jsx(B,{children:jsxRuntime.jsx(U,{href:u(m),isActive:m===e,children:m})},m)),i&&jsxRuntime.jsx(B,{children:h?jsxRuntime.jsx(ye,{href:u(e+1)}):jsxRuntime.jsx("span",{className:"flex h-9 items-center justify-center gap-1 px-2.5 text-muted-foreground sm:pr-2.5",children:jsxRuntime.jsx("span",{className:"hidden sm:block",children:"Next"})})}),s&&e<t-1&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[l<t-1&&jsxRuntime.jsx(B,{children:jsxRuntime.jsx(ie,{})}),jsxRuntime.jsx(B,{children:jsxRuntime.jsx(U,{href:u(t),"aria-label":"Go to last page",children:jsxRuntime.jsx(lucideReact.ChevronsRight,{className:"h-4 w-4"})})})]})]}),jsxRuntime.jsxs("div",{className:"sr-only","aria-live":"polite",children:["Page ",e," of ",t]})]})}function Rt(e,t=10){let r=e.page,n=Array.isArray(r)?r[0]:r,o=Math.max(1,parseInt(n??"1",10)),i=(o-1)*t;return {currentPage:o,itemsPerPage:t,offset:i,calculateTotalPages:a=>Math.ceil(a/t)}}function At(e,t,r,n){let o=n?`${n}${e===1?r:`${r}?page=${e}`}`:void 0,i=e>1&&n?`${n}${e===2?r:`${r}?page=${e-1}`}`:void 0,s=e<t&&n?`${n}${r}?page=${e+1}`:void 0;return {alternates:{...o&&{canonical:o}},other:{...i&&{prev:i},...s&&{next:s}}}}function se(e,t={}){let{customDomain:r,pathPrefix:n="/blog",language:o,isAccessibleForFree:i=true,includeOptionalProperties:s=true}=t,a=r??e.site.domain,c=r?`https://${a}${n}/${e.slug}`:e.meta.canonicalUrl??`https://${a}${n}/${e.slug}`,l=e.author?$e(e.author,{customDomain:r,pathPrefix:n}):void 0,p=Pe(e.site,{customDomain:r,pathPrefix:n}),P=`PT${Math.max(1,Math.ceil(e.readingSeconds/60))}M`,h={"@context":"https://schema.org","@type":"BlogPosting","@id":`${c}#article`,headline:e.title,description:e.excerpt,datePublished:e.publishedAt,dateModified:e.updatedAt,author:l,publisher:p,mainEntityOfPage:{"@type":"WebPage","@id":c},wordCount:e.wordCount,timeRequired:P,isAccessibleForFree:i};return s&&(e.featuredImage&&(h.image=e.featuredImage),e.meta.keywords.length>0&&(h.keywords=[...e.meta.keywords]),(o??e.site.locale)&&(h.inLanguage=o??e.site.locale),e.site.toneAdjectives.length>0&&(h.about=e.site.toneAdjectives.map(m=>({"@type":"Thing",name:m}))),e.site.toneAdjectives.length>0&&(h.genre=[...e.site.toneAdjectives])),h}function $e(e,t={}){let{customDomain:r,pathPrefix:n="/blog"}=t,o={"@context":"https://schema.org","@type":"Person","@id":`#author-${e.id}`,name:e.name,identifier:e.id};if(e.bio&&(o.description=e.bio),e.slug?.trim()){let i=r?`https://${r}${n}/authors/${e.slug}`:`${n}/authors/${e.slug}`;o.url=i;}return e.isGuest&&(o.additionalType="GuestAuthor"),e.toneAdjectives&&e.toneAdjectives.length>0&&(o.knowsAbout=[...e.toneAdjectives]),o}function Pe(e,t={}){let{customDomain:r,pathPrefix:n="/blog"}=t,i=`https://${r??e.domain}${n}`,s={"@context":"https://schema.org","@type":"Organization","@id":`${i}#organization`,name:e.name,url:i};return e.description?.trim()&&(s.description=e.description),e.tagline?.trim()&&(s.description=s.description?`${s.description}. ${e.tagline}`:e.tagline),s}function Se(e,t={}){let{customDomain:r,pathPrefix:n="/blog",language:o,includeSearchAction:i=true}=t,a=`https://${r??e.domain}${n}`,c=Pe(e,t),l={"@context":"https://schema.org","@type":"WebSite","@id":`${a}#website`,name:e.name,url:a,publisher:c};return e.description?.trim()&&(l.description=e.description),(o??e.locale)&&(l.inLanguage=o??e.locale),i&&(l.potentialAction={"@type":"SearchAction",target:{"@type":"EntryPoint",urlTemplate:`${a}?search={search_term_string}`},"query-input":"required name=search_term_string"}),l}function Ue(e,t={}){let{customDomain:r}=t;return {"@context":"https://schema.org","@type":"BreadcrumbList",itemListElement:e.map((n,o)=>({"@type":"ListItem",position:o+1,name:n.name,item:r&&!n.url.startsWith("http")?`https://${r}${n.url}`:n.url}))}}function Re(e,t={}){let r=[];r.push(se(e,t)),r.push(Se(e.site,t));let n=t.pathPrefix??"/blog",o=[{name:"Home",url:"/"},{name:e.site.name,url:n},{name:e.title,url:`${n}/${e.slug}`}];return r.push(Ue(o,t)),r}function Ae(e,t=[],r={}){let n=[];if(n.push(Se(e,r)),t.length>0){let o=t.slice(0,5).map(i=>se(i,r));n.push(...o);}return n}function Ve(e){let t=[];if(e["@context"]?e["@context"]!=="https://schema.org"&&t.push("@context must be 'https://schema.org'"):t.push("Missing required @context property"),e["@type"]||t.push("Missing required @type property"),e["@type"]==="BlogPosting"){let r=e;r.headline||t.push("BlogPosting: Missing required headline"),r.datePublished||t.push("BlogPosting: Missing required datePublished"),r.author||t.push("BlogPosting: Missing required author"),r.publisher||t.push("BlogPosting: Missing required publisher");}return e["@type"]==="Person"&&(e.name||t.push("Person: Missing required name")),e["@type"]==="Organization"&&(e.name||t.push("Organization: Missing required name")),{isValid:t.length===0,errors:t}}function Ge(e){return JSON.stringify(e,null,0)}function K(e){return {type:"application/ld+json",dangerouslySetInnerHTML:{__html:Ge(e)}}}function vt(e){let t=new Set;return e.meta.keywords.forEach(r=>t.add(r)),e.site.toneAdjectives.forEach(r=>t.add(r)),e.author&&e.author.toneAdjectives.forEach(r=>t.add(r)),Array.from(t)}var X=class extends Error{constructor(r,n,o){super(r);this.code=n;this.details=o;this.name="StructuredDataError";}code;details};function wt(e,t={}){try{let r=se(e,t),n=Ve(r);return n.isValid?{schema:r}:{error:new X("Generated schema validation failed","VALIDATION_FAILED",n.errors)}}catch(r){return {error:new X("Failed to generate structured data","GENERATION_FAILED",r)}}}function k(e="/blog"){let t=e.trim();return !t||t==="/"?"":t.replace(/^(?!\/)/,"/").replace(/\/+$/,"")}function J(e,t){let r=k(e),n=t?.replace(/^\/+/,"").replace(/\/+$/,"");return n?`${r}/${n}`.replace(/\/+/g,"/"):r||"/"}function Nt(e){let t=new URL(e);return k(t.pathname)}function Fe({articles:e,siteName:t,siteTagline:r,className:n,site:o,includeStructuredData:i=false,basePath:s="/blog",pagination:a}){let c=k(s)||"/";return jsxRuntime.jsxs("div",{className:x("blog-home-page container mx-auto max-w-5xl px-4 py-8 sm:px-6 sm:py-12 lg:px-8 lg:py-16",n),children:[t&&jsxRuntime.jsxs("header",{className:"blog-header mb-8 text-center sm:mb-12 lg:mb-16",children:[jsxRuntime.jsx("h1",{className:"blog-title text-foreground mb-2 text-3xl font-light tracking-tight sm:text-4xl lg:text-5xl",children:t}),r&&jsxRuntime.jsx("p",{className:"blog-tagline text-muted-foreground text-base sm:text-lg",children:r})]}),jsxRuntime.jsxs("main",{className:"articles-list",children:[e.length===0?jsxRuntime.jsxs("div",{className:"no-articles text-muted-foreground py-16 text-center sm:py-24 lg:py-32",children:[jsxRuntime.jsx("h2",{className:"mb-3 text-xl font-light sm:mb-4 sm:text-2xl lg:text-3xl",children:"No articles yet"}),jsxRuntime.jsx("p",{className:"text-muted-foreground/70 mx-auto max-w-md text-base sm:text-lg",children:"This blog doesn't have any published articles yet."})]}):jsxRuntime.jsx("div",{className:"space-y-0",children:e.map(l=>jsxRuntime.jsx(Lt,{article:l,basePath:c},l.id))}),a&&a.totalPages>1&&jsxRuntime.jsx("div",{className:"pagination-wrapper mt-12",children:jsxRuntime.jsx(oe,{currentPage:a.currentPage,totalPages:a.totalPages,baseUrl:a.baseUrl??c,className:"justify-center"})})]}),i&&o&&(()=>{let l=K(Ae(o,e.slice(0,5),{pathPrefix:c}));return jsxRuntime.jsx("script",{type:l.type,dangerouslySetInnerHTML:l.dangerouslySetInnerHTML})})()]})}function Ot(e){return `${Math.ceil(e/60)} min read`}function Lt({article:e,basePath:t}){let r=J(t,e.slug),n=dateFns.formatDistanceToNow(new Date(e.publishedAt),{addSuffix:true}),o=Ot(e.readingSeconds),i=e.featuredImage;return jsxRuntime.jsx("article",{className:"group border-border mb-6 block border-b pb-6 last:mb-0 last:border-b-0 last:pb-0 sm:mb-8 sm:pb-8",children:jsxRuntime.jsxs(Ce__default.default,{href:r,className:"focus-visible:ring-ring block rounded-lg hover:no-underline focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none","aria-label":`Read article: ${e.title}`,children:[jsxRuntime.jsxs("div",{className:"space-y-4 lg:hidden",children:[i&&jsxRuntime.jsx("div",{className:"relative aspect-[16/10] w-full overflow-hidden rounded-lg",children:jsxRuntime.jsx(He__default.default,{src:i,alt:e.featuredImageAlt??`Featured image for ${e.title}`,width:400,height:250,className:"h-full w-full object-cover transition-transform duration-300 group-hover:scale-105"})}),jsxRuntime.jsxs("div",{className:"space-y-3",children:[jsxRuntime.jsx("h2",{className:"group-hover:text-primary text-lg leading-tight font-bold transition-colors sm:text-xl md:text-2xl",children:e.title}),jsxRuntime.jsxs("div",{className:"text-muted-foreground flex flex-wrap items-center gap-x-3 gap-y-1 text-sm",children:[e.author&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("span",{className:"font-medium",children:e.author.name}),jsxRuntime.jsx("span",{className:"text-border",children:"\u2022"})]}),jsxRuntime.jsx("time",{dateTime:e.publishedAt,className:"font-medium","aria-label":`Published ${n}`,children:n}),jsxRuntime.jsx("span",{className:"text-border",children:"\u2022"}),jsxRuntime.jsx("span",{className:"font-medium",children:o})]}),e.excerpt&&jsxRuntime.jsx("p",{className:"text-muted-foreground line-clamp-3 text-sm leading-relaxed sm:text-base",children:e.excerpt})]})]}),jsxRuntime.jsxs("div",{className:"hidden items-start gap-6 lg:flex xl:gap-8",children:[i&&jsxRuntime.jsx("div",{className:"relative aspect-[16/10] w-64 shrink-0 overflow-hidden rounded-lg xl:w-72",children:jsxRuntime.jsx(He__default.default,{src:i,alt:e.featuredImageAlt??`Featured image for ${e.title}`,width:288,height:180,className:"h-full w-full object-cover transition-transform duration-300 group-hover:scale-105"})}),jsxRuntime.jsxs("div",{className:"flex min-h-[180px] flex-1 flex-col justify-between space-y-4 xl:min-h-[200px]",children:[jsxRuntime.jsxs("div",{className:"space-y-4",children:[jsxRuntime.jsx("h2",{className:"group-hover:text-primary text-2xl leading-tight font-bold transition-colors xl:text-3xl",children:e.title}),e.excerpt&&jsxRuntime.jsx("p",{className:"text-muted-foreground line-clamp-3 text-base leading-relaxed xl:text-lg",children:e.excerpt})]}),jsxRuntime.jsxs("div",{className:"text-muted-foreground flex flex-wrap items-center gap-x-3 gap-y-1 text-sm",children:[e.author&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("span",{className:"font-medium",children:e.author.name}),jsxRuntime.jsx("span",{className:"text-border",children:"\u2022"})]}),jsxRuntime.jsx("time",{dateTime:e.publishedAt,className:"font-medium","aria-label":`Published ${n}`,children:n}),jsxRuntime.jsx("span",{className:"text-border",children:"\u2022"}),jsxRuntime.jsx("span",{className:"font-medium",children:o})]})]})]})]})})}function _t(e,t,r,n,o="/blog"){let i=e?`${e} - Blog`:"Blog",s=n&&n.currentPage>1?`${i} - Page ${n.currentPage}`:i,a=t??"Read our latest articles and insights.",c=k(o)||"/",l=r?`${r}${n&&n.currentPage>1?`${c}?page=${n.currentPage}`:c}`:void 0,p=n&&n.currentPage>1&&r?`${r}${n.currentPage===2?c:`${c}?page=${n.currentPage-1}`}`:void 0,u=n&&n.currentPage<n.totalPages&&r?`${r}${c}?page=${n.currentPage+1}`:void 0;return {title:s,description:a,openGraph:{title:s,description:a,type:"website",...r&&{url:l}},twitter:{card:"summary_large_image",title:s,description:a},alternates:{...l&&{canonical:l}},other:{...p&&{prev:p},...u&&{next:u}}}}var Et=classVarianceAuthority.cva("inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",{variants:{variant:{default:"border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80",secondary:"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",destructive:"border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80",outline:"text-foreground"}},defaultVariants:{variant:"default"}});function ve({className:e,variant:t,...r}){return jsxRuntime.jsx("div",{className:x(Et({variant:t}),e),...r})}function Y({className:e,...t}){return jsxRuntime.jsx("div",{"data-slot":"card",className:x("bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm",e),...t})}function we({className:e,...t}){return jsxRuntime.jsx("div",{"data-slot":"card-header",className:x("@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-1.5 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6",e),...t})}function Ne({className:e,...t}){return jsxRuntime.jsx("div",{"data-slot":"card-title",className:x("leading-none font-semibold",e),...t})}function kt({className:e,...t}){return jsxRuntime.jsx("div",{"data-slot":"card-description",className:x("text-muted-foreground text-sm",e),...t})}function Q({className:e,...t}){return jsxRuntime.jsx("div",{"data-slot":"card-content",className:x("px-6",e),...t})}function Mt({className:e,...t}){return jsxRuntime.jsx("div",{"data-slot":"card-footer",className:x("flex items-center px-6 [.border-t]:pt-6",e),...t})}var ae=qe__namespace.forwardRef(({className:e,orientation:t="horizontal",decorative:r=true,...n},o)=>jsxRuntime.jsx(Te__namespace.Root,{ref:o,decorative:r,orientation:t,className:x("shrink-0 bg-border",t==="horizontal"?"h-[1px] w-full":"h-full w-[1px]",e),...n}));ae.displayName=Te__namespace.Root.displayName;var ze={mdxOptions:{remarkPlugins:[Ut__default.default,$t__default.default]}};function qt(e){return `${Math.ceil(e/60)} min read`}function We({article:e,className:t,navigation:r,basePath:n="/blog"}){let o=k(n)||"/",i=new Date(e.publishedAt),s=new Date(e.updatedAt),a=s.getTime()!==i.getTime(),c=dateFns.formatDistanceToNow(i,{addSuffix:true}),l=qt(e.readingSeconds),p=e.featuredImage;return jsxRuntime.jsxs("article",{className:x("article-page mx-auto max-w-4xl px-4 py-6 pb-12 sm:px-6 sm:py-8 sm:pb-16 lg:px-8 lg:py-12 lg:pb-24",t),children:[r?.backToHome&&jsxRuntime.jsx("header",{className:"mb-8 sm:mb-12 lg:mb-16",children:jsxRuntime.jsxs(Ce__default.default,{href:r.backToHome.url,className:"text-muted-foreground hover:text-foreground group focus-visible:ring-ring inline-flex touch-manipulation items-center space-x-2 rounded-md px-2 py-1 transition-colors focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none sm:space-x-3","aria-label":r.backToHome.label??"Return to blog",children:[jsxRuntime.jsx(lucideReact.ArrowLeft,{className:"h-4 w-4 transition-transform group-hover:-translate-x-1 sm:h-5 sm:w-5","aria-hidden":"true"}),jsxRuntime.jsxs("span",{className:"text-sm font-medium sm:text-base",children:[jsxRuntime.jsx("span",{className:"hidden sm:inline",children:r.backToHome.label??"Back to all articles"}),jsxRuntime.jsx("span",{className:"sm:hidden",children:"Back"})]})]})}),jsxRuntime.jsxs("header",{className:"article-header mb-6 space-y-4 text-center sm:mb-8 sm:space-y-6 lg:mb-12 lg:space-y-8",children:[jsxRuntime.jsx("h1",{className:"article-title text-foreground px-4 text-2xl leading-tight font-light tracking-tight sm:px-0 sm:text-3xl md:text-4xl lg:text-5xl xl:text-6xl",children:e.title}),e.excerpt&&jsxRuntime.jsx("p",{className:"article-excerpt text-muted-foreground mx-auto mt-6 max-w-xs px-4 text-base leading-relaxed sm:mt-8 sm:max-w-lg sm:px-0 sm:text-lg md:max-w-2xl md:text-xl lg:max-w-4xl lg:text-2xl",children:e.excerpt}),jsxRuntime.jsxs("div",{className:"article-meta text-muted-foreground flex flex-col items-center gap-2 text-sm sm:gap-3 sm:text-base",children:[e.author&&jsxRuntime.jsxs("div",{className:"flex items-center gap-2",children:[jsxRuntime.jsx("span",{className:"sr-only",children:"Author"}),jsxRuntime.jsx("span",{className:"font-medium",children:e.author.name}),e.author.isGuest&&jsxRuntime.jsx(ve,{variant:"outline",className:"text-xs",children:"Guest Author"})]}),jsxRuntime.jsxs("div",{className:"flex flex-wrap items-center justify-center gap-x-3 gap-y-1",children:[jsxRuntime.jsxs("time",{dateTime:e.publishedAt,className:"font-medium","aria-label":`Published ${c}`,children:["Published ",c]}),jsxRuntime.jsx("span",{className:"text-border",children:"\u2022"}),jsxRuntime.jsx("span",{className:"font-medium",children:l})]}),a&&jsxRuntime.jsxs("time",{dateTime:e.updatedAt,className:"text-xs",children:["Updated ",dateFns.format(s,"MMMM d, yyyy")]}),jsxRuntime.jsx("div",{className:"bg-border h-px w-6 sm:w-8","aria-hidden":"true"}),jsxRuntime.jsxs("span",{className:"text-xs tracking-wider uppercase sm:text-sm",role:"text",children:["From ",e.site.name]})]})]}),p&&jsxRuntime.jsx("div",{className:"article-featured-image relative my-8 aspect-[16/9] w-full overflow-hidden rounded-lg sm:my-12 lg:my-16",children:jsxRuntime.jsx(He__default.default,{src:p,alt:e.featuredImageAlt??`Featured image for ${e.title}`,className:"h-full w-full object-cover",width:800,height:450,priority:true})}),jsxRuntime.jsx("div",{className:"article-content",children:jsxRuntime.jsx("div",{className:"prose prose-sm sm:prose-base lg:prose-lg xl:prose-xl prose-gray dark:prose-invert prose-headings:scroll-mt-20 prose-headings:font-light prose-h1:text-2xl sm:prose-h1:text-3xl lg:prose-h1:text-4xl prose-h2:text-xl sm:prose-h2:text-2xl lg:prose-h2:text-3xl prose-h3:text-lg sm:prose-h3:text-xl lg:prose-h3:text-2xl prose-p:leading-relaxed prose-img:mx-auto prose-img:rounded-lg prose-a:transition-colors max-w-none",children:jsxRuntime.jsx(rsc.MDXRemote,{source:e.content,options:ze})})}),e.author?.bio&&jsxRuntime.jsxs("div",{className:"author-bio mt-12",children:[jsxRuntime.jsx(ae,{className:"mb-8"}),jsxRuntime.jsxs(Y,{children:[jsxRuntime.jsx(we,{children:jsxRuntime.jsxs(Ne,{className:"flex items-center gap-2",children:["About ",e.author.name,e.author.isGuest&&jsxRuntime.jsx(ve,{variant:"outline",className:"text-xs",children:"Guest Author"})]})}),jsxRuntime.jsx(Q,{children:jsxRuntime.jsx("div",{className:"prose dark:prose-invert",children:jsxRuntime.jsx("p",{className:"text-muted-foreground",children:e.author.bio})})})]})]}),(!!r?.previousArticle||!!r?.nextArticle)&&jsxRuntime.jsxs("nav",{className:"article-nav mt-12",children:[jsxRuntime.jsx(ae,{className:"mb-8"}),jsxRuntime.jsxs("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-2",children:[r?.previousArticle&&jsxRuntime.jsx(Y,{className:"group hover:bg-accent/50 cursor-pointer transition-colors",children:jsxRuntime.jsx(Ce__default.default,{href:r.previousArticle.url,className:"block",children:jsxRuntime.jsxs(Q,{className:"p-4",children:[jsxRuntime.jsx("div",{className:"text-muted-foreground mb-2 text-sm font-medium",children:"\u2190 Previous Article"}),jsxRuntime.jsx("div",{className:"text-foreground group-hover:text-primary transition-colors",children:r.previousArticle.title})]})})}),r?.nextArticle&&jsxRuntime.jsx(Y,{className:x("group hover:bg-accent/50 cursor-pointer transition-colors",!r?.previousArticle&&"md:col-start-2"),children:jsxRuntime.jsx(Ce__default.default,{href:r.nextArticle.url,className:"block",children:jsxRuntime.jsxs(Q,{className:"p-4 md:text-right",children:[jsxRuntime.jsx("div",{className:"text-muted-foreground mb-2 text-sm font-medium",children:"Next Article \u2192"}),jsxRuntime.jsx("div",{className:"text-foreground group-hover:text-primary transition-colors",children:r.nextArticle.title})]})})})]})]}),(()=>{let u=K(Re(e,{pathPrefix:o}));return jsxRuntime.jsx("script",{type:u.type,dangerouslySetInnerHTML:u.dangerouslySetInnerHTML})})()]})}function zt(e,t="/blog"){let r=e.meta.title??e.title,n=e.meta.description??e.excerpt,o=e.meta.canonicalUrl??`${e.site.domain}${J(t,e.slug)}`,i=e.meta.ogImage??e.featuredImage;return {title:r,description:n,keywords:e.meta.keywords.join(", "),authors:e.author?[{name:e.author.name}]:void 0,openGraph:{title:r,description:n,type:"article",url:o,images:i?[{url:i,alt:e.featuredImageAlt??r}]:void 0,publishedTime:e.publishedAt,modifiedTime:e.updatedAt,authors:e.author?[e.author.name]:void 0,siteName:e.site.name},twitter:{card:"summary_large_image",title:r,description:n,images:i?[i]:void 0},alternates:{canonical:o}}}function Oe(e){let t=e.headers.get("Authorization");if(!t)return null;let n=/^Bearer\s+(.+)$/i.exec(t);if(n?.[1])return n[1];let i=/^Token\s+(.+)$/i.exec(t);return i?.[1]?i[1]:null}var le=class{validApiKeys;constructor(t){this.validApiKeys=new Set(t);}async validateToken(t){return t?.trim()?this.validApiKeys.has(t)?{valid:true,context:{tokenHash:this.hashToken(t)}}:{valid:false,errorCode:"invalid"}:{valid:false,errorCode:"missing"}}extractToken=t=>Oe(t);hashToken(t){return t.substring(0,8)+"..."}},H=class extends le{constructor(t="BLOG_PLATFORM_API_KEYS"){let r=process.env[t];!r&&t==="BLOG_PLATFORM_API_KEYS"&&(r=process.env.BLOG_AUTH_TOKEN);let n=r?r.split(",").map(o=>o.trim()).filter(Boolean):[];n.length===0&&console.warn(`\u26A0\uFE0F No API keys found in environment variable ${t}${t==="BLOG_PLATFORM_API_KEYS"?" (set BLOG_PLATFORM_API_KEYS or BLOG_AUTH_TOKEN)":""}. Authentication will fail for all requests.`),super(n);}},Z=class{async validateToken(){return {valid:true,context:{development:true}}}extractToken(){return "development-mode"}},ce=class{hasWarned=false;async validateToken(t){return this.hasWarned||(console.error("\u274C SECURITY WARNING: Blog platform authentication not initialized! All requests will be rejected. Call initBlogPlatform() to configure authentication."),this.hasWarned=true),{valid:false,errorCode:"invalid"}}};function Wt(){return globalThis.__BLOG_PLATFORM_AUTH_CONFIG__??=new ce,globalThis.__BLOG_PLATFORM_AUTH_CONFIG__}function ue(e){globalThis.__BLOG_PLATFORM_AUTH_CONFIG__=e;}function Le(){return globalThis.__BLOG_PLATFORM_AUTH_CONFIG__??Wt()}function Xt(e){ue(new H(e));}async function E(e){let t=Le(),r=t.extractToken?t.extractToken(e):Oe(e);if(!r)return {authenticated:false,result:{valid:false,errorCode:"missing"},token:null};let n=await t.validateToken(r);return {authenticated:n.valid,result:n,token:r}}function Kt(e,t=""){let n=Le().errorMessages??{},o,i;switch(e.errorCode){case "missing":o=n.missing??"Authentication token is required",i="PUB005";break;case "expired":o=n.expired??"Authentication token has expired",i="PUB005";break;default:o=n.invalid??"Invalid authentication credentials",i="PUB005";break}return {success:false,error:{code:i,message:o,details:{authError:e.errorCode??"invalid"}},idempotencyKey:t}}async function M(e){let t=await E(e);return t.authenticated?{authenticated:true,context:t.result.context}:{authenticated:false,error:Kt(t.result)}}function Jt(){let e=process.env.SKIP_BLOG_PLATFORM_AUTH;return e==="true"||e==="1"||process.env.NODE_ENV==="test"}var me=class{articles=new Map;operations=new Map;async saveArticle(t,r){let n=await this.checkIdempotency(r);if(n)if(n.success){if(Array.from(this.articles.values()).some(s=>s.id===t.id))return n}else return n;if(this.articles.has(t.slug)){let i={success:false,error:{code:"PUB003",message:"This URL is already in use. Please choose another."},idempotencyKey:r};return await this.storeOperationResult(r,i),i}this.articles.set(t.slug,t);let o={success:true,url:`/${t.slug}`,platformPostId:t.id,publishedAt:t.publishedAt,idempotencyKey:r};return await this.storeOperationResult(r,o),o}async getArticle(t){return this.articles.get(t)??null}async listArticles(t={}){let{limit:r=10,offset:n=0,sortBy:o="publishedAt",order:i="desc"}=t,s=Array.from(this.articles.values());return s.sort((c,l)=>{let p=new Date(c[o]).getTime(),u=new Date(l[o]).getTime();return i==="desc"?u-p:p-u}),{articles:s.slice(n,n+r),total:s.length}}async removeArticle(t,r){let n=await this.checkIdempotency(r);if(n)if(n.success){if(!this.articles.has(t))return n}else return n;if(!this.articles.has(t)){let i={success:false,error:{code:"PUB007",message:"Article not found"},idempotencyKey:r};return await this.storeOperationResult(r,i),i}this.articles.delete(t);let o={success:true,idempotencyKey:r};return await this.storeOperationResult(r,o),o}async checkIdempotency(t){return this.operations.get(t)??null}async storeOperationResult(t,r){this.operations.set(t,r);}};function Yt(){let e=globalThis;if(e.__BLOG_PLATFORM_STORAGE_WARNED__)return;e.__BLOG_PLATFORM_STORAGE_WARNED__=true;let t="Blog platform: No storage provider configured. Falling back to in-memory storage (data is not persisted).";process.env.NODE_ENV==="production"?console.error(`${t} Call initBlogPlatform({ storage: /* your persistent adapter */ }) to avoid data loss.`):console.warn(t);}function Qt(){let e=globalThis;e.__BLOG_PLATFORM_STORAGE__||(Yt(),e.__BLOG_PLATFORM_STORAGE__=new me);let t=e.__BLOG_PLATFORM_STORAGE__;if(!t)throw new Error("Blog platform storage not initialized");return t}function D(){return Qt()}function _e(e){let t=globalThis;t.__BLOG_PLATFORM_STORAGE__=e;}function er(){return globalThis.__BLOG_PLATFORM_RATE_LIMITER__??null}function tr(e){let t=globalThis;t.__BLOG_PLATFORM_RATE_LIMITER__=e;}function pe(e){let{redisUrl:t,redisToken:r,requestsPerMinute:n=5,keyPrefix:o="blog-platform-ratelimit",analytics:i=true}=e,s=new redis.Redis({url:t,token:r}),a=new ratelimit.Ratelimit({redis:s,analytics:i,prefix:o,limiter:ratelimit.Ratelimit.slidingWindow(n,"1m")});tr(a);}function Be(){let e=process.env.UPSTASH_REDIS_REST_URL,t=process.env.UPSTASH_REDIS_REST_TOKEN;if(!e||!t){console.warn("Blog platform: No Upstash Redis configuration found. Rate limiting disabled.");return}pe({redisUrl:e,redisToken:t}),console.log("Blog platform: Rate limiting configured (5 requests per minute per token)");}async function Ke(e){let t=er();if(!t)return console.warn("Blog platform: Rate limiter not configured. All requests allowed."),{success:true,remaining:999,reset:Date.now()+6e4,limit:5,count:0};try{let r=await t.limit(e);return {success:r.success,remaining:r.remaining,reset:r.reset,limit:r.limit,count:r.limit-r.remaining}}catch(r){return console.error("Blog platform: Rate limit check failed:",r),{success:true,remaining:0,reset:Date.now()+6e4,limit:5,count:0}}}function Je(e,t=""){let r=Math.ceil((e.reset-Date.now())/6e4);return {success:false,error:{code:"PUB011",message:`Rate limit exceeded. You can make ${e.limit} requests per minute. Try again in ${r} minute(s).`,details:{rateLimit:e}},idempotencyKey:t}}async function I(e,t=""){let r=await Ke(e);return r.success?{allowed:true,rateLimitResult:r}:{allowed:false,errorResponse:Je(r,t)}}function N(e){return {"X-RateLimit-Limit":e.limit.toString(),"X-RateLimit-Remaining":e.remaining.toString(),"X-RateLimit-Reset":e.reset.toString(),"Retry-After":Math.ceil((e.reset-Date.now())/1e3).toString()}}function de(e){let{auth:t,storage:r,rateLimit:n,autoRateLimit:o=true}=e;if(!t)throw new Error(`Blog platform initialization failed: 'auth' is required.
1
+ 'use strict';var te=require('next/link'),qe=require('next/image'),clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),lucideReact=require('lucide-react'),reactSlot=require('@radix-ui/react-slot'),classVarianceAuthority=require('class-variance-authority'),jsxRuntime=require('react/jsx-runtime'),dateFns=require('date-fns'),rsc=require('next-mdx-remote-client/rsc'),Xe=require('react'),Oe=require('@radix-ui/react-separator'),Wt=require('remark-gfm'),Xt=require('remark-toc'),Kt=require('rehype-slug'),ratelimit=require('@upstash/ratelimit'),redis=require('@upstash/redis'),drizzleOrm=require('drizzle-orm'),sqliteCore=require('drizzle-orm/sqlite-core'),server=require('next/server');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var te__default=/*#__PURE__*/_interopDefault(te);var qe__default=/*#__PURE__*/_interopDefault(qe);var Xe__namespace=/*#__PURE__*/_interopNamespace(Xe);var Oe__namespace=/*#__PURE__*/_interopNamespace(Oe);var Wt__default=/*#__PURE__*/_interopDefault(Wt);var Xt__default=/*#__PURE__*/_interopDefault(Xt);var Kt__default=/*#__PURE__*/_interopDefault(Kt);function v(...e){return tailwindMerge.twMerge(clsx.clsx(e))}var se=classVarianceAuthority.cva("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",{variants:{variant:{default:"bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",destructive:"bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",outline:"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2 has-[>svg]:px-3",sm:"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",lg:"h-10 rounded-md px-6 has-[>svg]:px-4",icon:"size-9"}},defaultVariants:{variant:"default",size:"default"}});function yt({className:e,variant:t,size:r,asChild:n=false,...i}){return jsxRuntime.jsx(n?reactSlot.Slot:"button",{"data-slot":"button",className:v(se({variant:t,size:r,className:e})),...i})}function xe({className:e,...t}){return jsxRuntime.jsx("nav",{role:"navigation","aria-label":"pagination","data-slot":"pagination",className:v("mx-auto flex w-full justify-center",e),...t})}function ye({className:e,...t}){return jsxRuntime.jsx("ul",{"data-slot":"pagination-content",className:v("flex flex-row items-center gap-1",e),...t})}function B({...e}){return jsxRuntime.jsx("li",{"data-slot":"pagination-item",...e})}function U({className:e,isActive:t,size:r="icon",...n}){return jsxRuntime.jsx("a",{"aria-current":t?"page":void 0,"data-slot":"pagination-link","data-active":t,className:v(se({variant:t?"outline":"ghost",size:r}),e),...n})}function Pe({className:e,...t}){return jsxRuntime.jsxs(U,{"aria-label":"Go to previous page",size:"default",className:v("gap-1 px-2.5 sm:pl-2.5",e),...t,children:[jsxRuntime.jsx(lucideReact.ChevronLeftIcon,{}),jsxRuntime.jsx("span",{className:"hidden sm:block",children:"Previous"})]})}function ve({className:e,...t}){return jsxRuntime.jsxs(U,{"aria-label":"Go to next page",size:"default",className:v("gap-1 px-2.5 sm:pr-2.5",e),...t,children:[jsxRuntime.jsx("span",{className:"hidden sm:block",children:"Next"}),jsxRuntime.jsx(lucideReact.ChevronRightIcon,{})]})}function ae({className:e,...t}){return jsxRuntime.jsxs("span",{"aria-hidden":true,"data-slot":"pagination-ellipsis",className:v("flex size-9 items-center justify-center",e),...t,children:[jsxRuntime.jsx(lucideReact.MoreHorizontalIcon,{className:"size-4"}),jsxRuntime.jsx("span",{className:"sr-only",children:"More pages"})]})}function le({currentPage:e,totalPages:t,baseUrl:r,className:n,maxVisiblePages:i=5,showPrevNext:o=true,showFirstLast:s=true}){if(t<=1)return null;let a=()=>{let m=Math.floor(i/2),g=Math.max(1,e-m),x=Math.min(t,g+i-1);return x-g+1<i&&(g=Math.max(1,x-i+1)),{start:g,end:x}},{start:c,end:l}=a(),d=Array.from({length:l-c+1},(m,g)=>c+g),p=m=>m===1?r:`${r}?page=${m}`,P=e>1,f=e<t;return jsxRuntime.jsxs(xe,{className:n,children:[jsxRuntime.jsxs(ye,{children:[s&&e>2&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(B,{children:jsxRuntime.jsx(U,{href:p(1),"aria-label":"Go to first page",children:jsxRuntime.jsx(lucideReact.ChevronsLeft,{className:"h-4 w-4"})})}),c>2&&jsxRuntime.jsx(B,{children:jsxRuntime.jsx(ae,{})})]}),o&&jsxRuntime.jsx(B,{children:P?jsxRuntime.jsx(Pe,{href:p(e-1)}):jsxRuntime.jsx("span",{className:"flex h-9 items-center justify-center gap-1 px-2.5 text-muted-foreground sm:pl-2.5",children:jsxRuntime.jsx("span",{className:"hidden sm:block",children:"Previous"})})}),d.map(m=>jsxRuntime.jsx(B,{children:jsxRuntime.jsx(U,{href:p(m),isActive:m===e,children:m})},m)),o&&jsxRuntime.jsx(B,{children:f?jsxRuntime.jsx(ve,{href:p(e+1)}):jsxRuntime.jsx("span",{className:"flex h-9 items-center justify-center gap-1 px-2.5 text-muted-foreground sm:pr-2.5",children:jsxRuntime.jsx("span",{className:"hidden sm:block",children:"Next"})})}),s&&e<t-1&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[l<t-1&&jsxRuntime.jsx(B,{children:jsxRuntime.jsx(ae,{})}),jsxRuntime.jsx(B,{children:jsxRuntime.jsx(U,{href:p(t),"aria-label":"Go to last page",children:jsxRuntime.jsx(lucideReact.ChevronsRight,{className:"h-4 w-4"})})})]})]}),jsxRuntime.jsxs("div",{className:"sr-only","aria-live":"polite",children:["Page ",e," of ",t]})]})}function Nt(e,t=10){let r=e.page,n=Array.isArray(r)?r[0]:r,i=Math.max(1,parseInt(n??"1",10)),o=(i-1)*t;return {currentPage:i,itemsPerPage:t,offset:o,calculateTotalPages:a=>Math.ceil(a/t)}}function Tt(e,t,r,n){let i=n?`${n}${e===1?r:`${r}?page=${e}`}`:void 0,o=e>1&&n?`${n}${e===2?r:`${r}?page=${e-1}`}`:void 0,s=e<t&&n?`${n}${r}?page=${e+1}`:void 0;return {alternates:{...i&&{canonical:i}},other:{...o&&{prev:o},...s&&{next:s}}}}function ce(e,t={}){let{customDomain:r,pathPrefix:n="/blog",language:i,isAccessibleForFree:o=true,includeOptionalProperties:s=true}=t,a=r??e.site.domain,c=r?`https://${a}${n}/${e.slug}`:e.meta.canonicalUrl??`https://${a}${n}/${e.slug}`,l=e.author?Ve(e.author,{customDomain:r,pathPrefix:n}):void 0,d=Re(e.site,{customDomain:r,pathPrefix:n}),P=`PT${Math.max(1,Math.ceil(e.readingSeconds/60))}M`,f={"@context":"https://schema.org","@type":"BlogPosting","@id":`${c}#article`,headline:e.title,description:e.excerpt,datePublished:e.publishedAt,dateModified:e.updatedAt,author:l,publisher:d,mainEntityOfPage:{"@type":"WebPage","@id":c},wordCount:e.wordCount,timeRequired:P,isAccessibleForFree:o};return s&&(e.featuredImage&&(f.image=e.featuredImage),e.meta.keywords.length>0&&(f.keywords=[...e.meta.keywords]),(i??e.site.locale)&&(f.inLanguage=i??e.site.locale),e.site.toneAdjectives.length>0&&(f.about=e.site.toneAdjectives.map(m=>({"@type":"Thing",name:m}))),e.site.toneAdjectives.length>0&&(f.genre=[...e.site.toneAdjectives])),f}function Ve(e,t={}){let{customDomain:r,pathPrefix:n="/blog"}=t,i={"@context":"https://schema.org","@type":"Person","@id":`#author-${e.id}`,name:e.name,identifier:e.id};if(e.bio&&(i.description=e.bio),e.slug?.trim()){let o=r?`https://${r}${n}/authors/${e.slug}`:`${n}/authors/${e.slug}`;i.url=o;}return e.isGuest&&(i.additionalType="GuestAuthor"),e.toneAdjectives&&e.toneAdjectives.length>0&&(i.knowsAbout=[...e.toneAdjectives]),i}function Re(e,t={}){let{customDomain:r,pathPrefix:n="/blog"}=t,o=`https://${r??e.domain}${n}`,s={"@context":"https://schema.org","@type":"Organization","@id":`${o}#organization`,name:e.name,url:o};return e.description?.trim()&&(s.description=e.description),e.tagline?.trim()&&(s.description=s.description?`${s.description}. ${e.tagline}`:e.tagline),s}function Ae(e,t={}){let{customDomain:r,pathPrefix:n="/blog",language:i,includeSearchAction:o=true}=t,a=`https://${r??e.domain}${n}`,c=Re(e,t),l={"@context":"https://schema.org","@type":"WebSite","@id":`${a}#website`,name:e.name,url:a,publisher:c};return e.description?.trim()&&(l.description=e.description),(i??e.locale)&&(l.inLanguage=i??e.locale),o&&(l.potentialAction={"@type":"SearchAction",target:{"@type":"EntryPoint",urlTemplate:`${a}?search={search_term_string}`},"query-input":"required name=search_term_string"}),l}function He(e,t={}){let{customDomain:r}=t;return {"@context":"https://schema.org","@type":"BreadcrumbList",itemListElement:e.map((n,i)=>({"@type":"ListItem",position:i+1,name:n.name,item:r&&!n.url.startsWith("http")?`https://${r}${n.url}`:n.url}))}}function we(e,t={}){let r=[];r.push(ce(e,t)),r.push(Ae(e.site,t));let n=t.pathPrefix??"/blog",i=[{name:"Home",url:"/"},{name:e.site.name,url:n},{name:e.title,url:`${n}/${e.slug}`}];return r.push(He(i,t)),r}function Ne(e,t=[],r={}){let n=[];if(n.push(Ae(e,r)),t.length>0){let i=t.slice(0,5).map(o=>ce(o,r));n.push(...i);}return n}function Ge(e){let t=[];if(e["@context"]?e["@context"]!=="https://schema.org"&&t.push("@context must be 'https://schema.org'"):t.push("Missing required @context property"),e["@type"]||t.push("Missing required @type property"),e["@type"]==="BlogPosting"){let r=e;r.headline||t.push("BlogPosting: Missing required headline"),r.datePublished||t.push("BlogPosting: Missing required datePublished"),r.author||t.push("BlogPosting: Missing required author"),r.publisher||t.push("BlogPosting: Missing required publisher");}return e["@type"]==="Person"&&(e.name||t.push("Person: Missing required name")),e["@type"]==="Organization"&&(e.name||t.push("Organization: Missing required name")),{isValid:t.length===0,errors:t}}function je(e){return JSON.stringify(e,null,0)}function J(e){return {type:"application/ld+json",dangerouslySetInnerHTML:{__html:je(e)}}}function Ct(e){let t=new Set;return e.meta.keywords.forEach(r=>t.add(r)),e.site.toneAdjectives.forEach(r=>t.add(r)),e.author&&e.author.toneAdjectives.forEach(r=>t.add(r)),Array.from(t)}var K=class extends Error{constructor(r,n,i){super(r);this.code=n;this.details=i;this.name="StructuredDataError";}code;details};function Lt(e,t={}){try{let r=ce(e,t),n=Ge(r);return n.isValid?{schema:r}:{error:new K("Generated schema validation failed","VALIDATION_FAILED",n.errors)}}catch(r){return {error:new K("Failed to generate structured data","GENERATION_FAILED",r)}}}function I(e="/blog"){let t=e.trim();return !t||t==="/"?"":t.replace(/^(?!\/)/,"/").replace(/\/+$/,"")}function V(e,t){let r=I(e),n=t?.replace(/^\/+/,"").replace(/\/+$/,"");return n?`${r}/${n}`.replace(/\/+/g,"/"):r||"/"}function Ot(e){let t=new URL(e);return I(t.pathname)}var ue={accentColor:"hsl(var(--primary))",accentHoverColor:"hsl(var(--primary))",accentBackgroundColor:"hsl(var(--primary) / 0.08)",accentBorderColor:"hsl(var(--primary) / 0.25)"};function Y(e={}){return {"--blog-accent":e.accentColor??ue.accentColor,"--blog-accent-hover":e.accentHoverColor??ue.accentHoverColor,"--blog-accent-bg":e.accentBackgroundColor??ue.accentBackgroundColor,"--blog-accent-border":e.accentBorderColor??ue.accentBorderColor}}function Te(e,t){let r=new Date(e),n=new Date(t);return {publishedDateLabel:dateFns.format(r,"d MMMM yyyy"),publishedRelativeLabel:dateFns.formatDistanceToNow(r,{addSuffix:true}),updatedDateLabel:dateFns.format(n,"d MMMM yyyy"),isUpdated:n.getTime()!==r.getTime()}}function Ce(e){let t=[],r=false;for(let n of e.split(`
2
+ `)){if(/^\s*```/.test(n)){r=!r;continue}if(r)continue;let i=/^(#{2,3})\s+(.+?)\s*#*\s*$/.exec(n);if(!i?.[1]||!i[2])continue;let o=Bt(i[2]);o&&t.push({id:kt(o),text:o,level:i[1].length});}return t}function Bt(e){return e.replace(/\[([^\]]+)\]\([^)]+\)/g,"$1").replace(/[*_`~]/g,"").replace(/<[^>]+>/g,"").replace(/\s+/g," ").trim()}function kt(e){return e.toLowerCase().replace(/[^a-z0-9\s-]/g,"").trim().replace(/\s+/g,"-").replace(/-+/g,"-")}function We({articles:e,siteName:t,siteTagline:r,className:n,site:i,includeStructuredData:o=false,basePath:s="/blog",pagination:a,theme:c}){let l=I(s)||"/";return jsxRuntime.jsxs("div",{style:Y(c),className:v("blog-home-page container mx-auto max-w-5xl px-4 py-8 sm:px-6 sm:py-12 lg:px-8 lg:py-16",n),children:[t&&jsxRuntime.jsxs("header",{className:"blog-header mb-8 text-center sm:mb-12 lg:mb-16",children:[jsxRuntime.jsx("h1",{className:"blog-title mb-2 bg-linear-to-r from-[var(--blog-accent-hover)] to-[var(--blog-accent)] bg-clip-text text-3xl font-semibold tracking-tight text-balance text-transparent sm:text-4xl lg:text-5xl",children:t}),r&&jsxRuntime.jsx("p",{className:"blog-tagline text-muted-foreground text-base sm:text-lg",children:r})]}),jsxRuntime.jsxs("main",{className:"articles-list",children:[e.length===0?jsxRuntime.jsxs("div",{className:"no-articles text-muted-foreground py-16 text-center sm:py-24 lg:py-32",children:[jsxRuntime.jsx("h2",{className:"mb-3 text-xl font-light sm:mb-4 sm:text-2xl lg:text-3xl",children:"No articles yet"}),jsxRuntime.jsx("p",{className:"text-muted-foreground/70 mx-auto max-w-md text-base sm:text-lg",children:"This blog doesn't have any published articles yet."})]}):jsxRuntime.jsx("div",{className:"space-y-0",children:e.map(d=>jsxRuntime.jsx(Dt,{article:d,basePath:l},d.id))}),a&&a.totalPages>1&&jsxRuntime.jsx("div",{className:"pagination-wrapper mt-12",children:jsxRuntime.jsx(le,{currentPage:a.currentPage,totalPages:a.totalPages,baseUrl:a.baseUrl??l,className:"justify-center"})})]}),o&&i&&(()=>{let d=J(Ne(i,e.slice(0,5),{pathPrefix:l}));return jsxRuntime.jsx("script",{type:d.type,dangerouslySetInnerHTML:d.dangerouslySetInnerHTML})})()]})}function Mt(e){return `${Math.ceil(e/60)} min read`}function Dt({article:e,basePath:t}){let r=V(t,e.slug),n=dateFns.formatDistanceToNow(new Date(e.publishedAt),{addSuffix:true}),i=Mt(e.readingSeconds),o=e.featuredImage;return jsxRuntime.jsx("article",{className:"group border-border mb-6 block border-b pb-6 last:mb-0 last:border-b-0 last:pb-0 sm:mb-8 sm:pb-8",children:jsxRuntime.jsxs(te__default.default,{href:r,className:"focus-visible:ring-ring block rounded-2xl hover:no-underline focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none","aria-label":`Read article: ${e.title}`,children:[jsxRuntime.jsxs("div",{className:"space-y-4 lg:hidden",children:[o&&jsxRuntime.jsx("div",{className:"relative aspect-[16/10] w-full overflow-hidden rounded-2xl",children:jsxRuntime.jsx(qe__default.default,{src:o,alt:e.featuredImageAlt??`Featured image for ${e.title}`,width:400,height:250,className:"h-full w-full object-cover transition-transform duration-300 group-hover:scale-105"})}),jsxRuntime.jsxs("div",{className:"space-y-3",children:[jsxRuntime.jsx("h2",{className:"group-hover:text-[var(--blog-accent)] text-lg leading-tight font-bold text-balance transition-colors sm:text-xl md:text-2xl",children:e.title}),jsxRuntime.jsxs("div",{className:"text-muted-foreground flex flex-wrap items-center gap-x-3 gap-y-1 text-sm",children:[e.author&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("span",{className:"font-medium",children:e.author.name}),jsxRuntime.jsx("span",{className:"text-border",children:"\u2022"})]}),jsxRuntime.jsx("time",{dateTime:e.publishedAt,className:"font-medium","aria-label":`Published ${n}`,children:n}),jsxRuntime.jsx("span",{className:"text-border",children:"\u2022"}),jsxRuntime.jsx("span",{className:"font-medium",children:i})]}),e.excerpt&&jsxRuntime.jsx("p",{className:"text-muted-foreground line-clamp-3 text-sm leading-relaxed sm:text-base",children:e.excerpt})]})]}),jsxRuntime.jsxs("div",{className:"hidden items-start gap-6 lg:flex xl:gap-8",children:[o&&jsxRuntime.jsx("div",{className:"relative aspect-[16/10] w-64 shrink-0 overflow-hidden rounded-2xl xl:w-72",children:jsxRuntime.jsx(qe__default.default,{src:o,alt:e.featuredImageAlt??`Featured image for ${e.title}`,width:288,height:180,className:"h-full w-full object-cover transition-transform duration-300 group-hover:scale-105"})}),jsxRuntime.jsxs("div",{className:"flex min-h-[180px] flex-1 flex-col justify-between space-y-4 xl:min-h-[200px]",children:[jsxRuntime.jsxs("div",{className:"space-y-4",children:[jsxRuntime.jsx("h2",{className:"group-hover:text-[var(--blog-accent)] text-2xl leading-tight font-bold text-balance transition-colors xl:text-3xl",children:e.title}),e.excerpt&&jsxRuntime.jsx("p",{className:"text-muted-foreground line-clamp-3 text-base leading-relaxed xl:text-lg",children:e.excerpt})]}),jsxRuntime.jsxs("div",{className:"text-muted-foreground flex flex-wrap items-center gap-x-3 gap-y-1 text-sm",children:[e.author&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("span",{className:"font-medium",children:e.author.name}),jsxRuntime.jsx("span",{className:"text-border",children:"\u2022"})]}),jsxRuntime.jsx("time",{dateTime:e.publishedAt,className:"font-medium","aria-label":`Published ${n}`,children:n}),jsxRuntime.jsx("span",{className:"text-border",children:"\u2022"}),jsxRuntime.jsx("span",{className:"font-medium",children:i})]})]})]})]})})}function $t(e,t,r,n,i="/blog"){let o=e?`${e} - Blog`:"Blog",s=n&&n.currentPage>1?`${o} - Page ${n.currentPage}`:o,a=t??"Read our latest articles and insights.",c=I(i)||"/",l=r?`${r}${n&&n.currentPage>1?`${c}?page=${n.currentPage}`:c}`:void 0,d=n&&n.currentPage>1&&r?`${r}${n.currentPage===2?c:`${c}?page=${n.currentPage-1}`}`:void 0,p=n&&n.currentPage<n.totalPages&&r?`${r}${c}?page=${n.currentPage+1}`:void 0;return {title:s,description:a,openGraph:{title:s,description:a,type:"website",...r&&{url:l}},twitter:{card:"summary_large_image",title:s,description:a},alternates:{...l&&{canonical:l}},other:{...d&&{prev:d},...p&&{next:p}}}}var Vt=classVarianceAuthority.cva("inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",{variants:{variant:{default:"border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80",secondary:"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",destructive:"border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80",outline:"text-foreground"}},defaultVariants:{variant:"default"}});function Le({className:e,variant:t,...r}){return jsxRuntime.jsx("div",{className:v(Vt({variant:t}),e),...r})}function Q({className:e,...t}){return jsxRuntime.jsx("div",{"data-slot":"card",className:v("bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm",e),...t})}function Gt({className:e,...t}){return jsxRuntime.jsx("div",{"data-slot":"card-header",className:v("@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-1.5 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6",e),...t})}function jt({className:e,...t}){return jsxRuntime.jsx("div",{"data-slot":"card-title",className:v("leading-none font-semibold",e),...t})}function Ft({className:e,...t}){return jsxRuntime.jsx("div",{"data-slot":"card-description",className:v("text-muted-foreground text-sm",e),...t})}function Z({className:e,...t}){return jsxRuntime.jsx("div",{"data-slot":"card-content",className:v("px-6",e),...t})}function qt({className:e,...t}){return jsxRuntime.jsx("div",{"data-slot":"card-footer",className:v("flex items-center px-6 [.border-t]:pt-6",e),...t})}var ee=Xe__namespace.forwardRef(({className:e,orientation:t="horizontal",decorative:r=true,...n},i)=>jsxRuntime.jsx(Oe__namespace.Root,{ref:i,decorative:r,orientation:t,className:v("shrink-0 bg-border",t==="horizontal"?"h-[1px] w-full":"h-full w-[1px]",e),...n}));ee.displayName=Oe__namespace.Root.displayName;var Ke={mdxOptions:{remarkPlugins:[Xt__default.default,Wt__default.default],rehypePlugins:[Kt__default.default]}};function rr(e){return `${Math.ceil(e/60)} min read`}function Ye({article:e,className:t,navigation:r,basePath:n="/blog",theme:i,postArticleCta:o,relatedArticles:s=[],showShareLinks:a=true}){let c=I(n)||"/",l=Te(e.publishedAt,e.updatedAt),d=rr(e.readingSeconds),p=Ce(e.content),P=e.meta.canonicalUrl??V(c,e.slug),f=e.featuredImage;return jsxRuntime.jsxs("article",{style:Y(i),className:v("article-page mx-auto max-w-6xl px-4 py-6 pb-12 sm:px-6 sm:py-8 sm:pb-16 lg:px-8 lg:py-12 lg:pb-24",t),children:[r?.backToHome&&jsxRuntime.jsx("header",{className:"mx-auto mb-8 max-w-4xl sm:mb-12 lg:mb-16",children:jsxRuntime.jsxs(te__default.default,{href:r.backToHome.url,className:"text-muted-foreground hover:text-[var(--blog-accent)] group focus-visible:ring-ring inline-flex touch-manipulation items-center space-x-2 rounded-md px-2 py-1 transition-colors focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none sm:space-x-3","aria-label":r.backToHome.label??"Return to blog",children:[jsxRuntime.jsx(lucideReact.ArrowLeft,{className:"h-4 w-4 transition-transform group-hover:-translate-x-1 sm:h-5 sm:w-5","aria-hidden":"true"}),jsxRuntime.jsxs("span",{className:"text-sm font-medium sm:text-base",children:[jsxRuntime.jsx("span",{className:"hidden sm:inline",children:r.backToHome.label??"Back to all articles"}),jsxRuntime.jsx("span",{className:"sm:hidden",children:"Back"})]})]})}),jsxRuntime.jsxs("header",{className:"article-header mx-auto mb-6 max-w-4xl space-y-4 text-center sm:mb-8 sm:space-y-6 lg:mb-12 lg:space-y-8",children:[jsxRuntime.jsx("h1",{className:"article-title text-foreground px-4 text-2xl leading-tight font-light tracking-tight text-balance sm:px-0 sm:text-3xl md:text-4xl lg:text-5xl xl:text-6xl",children:e.title}),e.excerpt&&jsxRuntime.jsx("p",{className:"article-excerpt text-muted-foreground mx-auto mt-6 max-w-xs px-4 text-base leading-relaxed text-balance sm:mt-8 sm:max-w-lg sm:px-0 sm:text-lg md:max-w-2xl md:text-xl lg:max-w-4xl lg:text-2xl",children:e.excerpt}),jsxRuntime.jsxs("div",{className:"article-meta text-muted-foreground flex flex-col items-center gap-2 text-sm sm:gap-3 sm:text-base",children:[e.author&&jsxRuntime.jsxs("div",{className:"flex items-center gap-2",children:[jsxRuntime.jsx("span",{className:"sr-only",children:"Author"}),jsxRuntime.jsx("span",{className:"font-medium",children:e.author.name}),e.author.isGuest&&jsxRuntime.jsx(Le,{variant:"outline",className:"text-xs",children:"Guest Author"})]}),jsxRuntime.jsxs("div",{className:"flex flex-wrap items-center justify-center gap-x-3 gap-y-1",children:[jsxRuntime.jsxs("time",{dateTime:e.publishedAt,className:"font-medium","aria-label":`Published ${l.publishedDateLabel}`,children:["Published ",l.publishedDateLabel]}),jsxRuntime.jsx("span",{className:"text-border",children:"\u2022"}),jsxRuntime.jsx("span",{className:"font-medium",children:l.publishedRelativeLabel}),jsxRuntime.jsx("span",{className:"text-border",children:"\u2022"}),jsxRuntime.jsx("span",{className:"font-medium",children:d})]}),l.isUpdated&&jsxRuntime.jsxs("time",{dateTime:e.updatedAt,className:"text-xs",children:["Updated ",l.updatedDateLabel]}),jsxRuntime.jsx("div",{className:"bg-border h-px w-6 sm:w-8","aria-hidden":"true"}),jsxRuntime.jsxs("span",{className:"text-xs tracking-wider uppercase sm:text-sm",role:"text",children:["From ",e.site.name]})]})]}),f&&jsxRuntime.jsx("div",{className:"article-featured-image mx-auto my-8 aspect-[16/9] w-full max-w-4xl overflow-hidden rounded-2xl sm:my-12 lg:my-16",children:jsxRuntime.jsx(qe__default.default,{src:f,alt:e.featuredImageAlt??`Featured image for ${e.title}`,className:"h-full w-full object-cover",width:800,height:450,priority:true})}),jsxRuntime.jsxs("div",{className:"article-content mx-auto grid max-w-6xl grid-cols-1 gap-8 lg:grid-cols-[minmax(0,1fr)_14rem] lg:gap-12",children:[jsxRuntime.jsxs("div",{className:"min-w-0",children:[jsxRuntime.jsx(Je,{items:p,variant:"mobile"}),jsxRuntime.jsx("div",{className:"prose prose-sm sm:prose-base lg:prose-lg xl:prose-xl prose-gray dark:prose-invert prose-headings:scroll-mt-20 prose-headings:font-light prose-headings:text-balance prose-headings:text-[var(--blog-accent)] prose-h1:text-2xl sm:prose-h1:text-3xl lg:prose-h1:text-4xl prose-h2:text-xl sm:prose-h2:text-2xl lg:prose-h2:text-3xl prose-h3:text-lg sm:prose-h3:text-xl lg:prose-h3:text-2xl prose-p:leading-relaxed prose-p:text-pretty prose-img:mx-auto prose-img:rounded-2xl prose-a:text-[var(--blog-accent)] prose-a:transition-colors hover:prose-a:text-[var(--blog-accent-hover)] max-w-none",children:jsxRuntime.jsx(rsc.MDXRemote,{source:e.content,options:Ke})})]}),jsxRuntime.jsx(Je,{items:p,variant:"desktop"})]}),e.author?.bio&&jsxRuntime.jsxs("div",{className:"author-bio mx-auto mt-12 max-w-4xl",children:[jsxRuntime.jsx(ee,{className:"mb-8"}),jsxRuntime.jsx(Q,{className:"border-[var(--blog-accent-border)] bg-[var(--blog-accent-bg)]",children:jsxRuntime.jsxs(Z,{className:"flex flex-col gap-4 p-5 sm:flex-row sm:items-start sm:p-6",children:[jsxRuntime.jsx("div",{className:"flex size-12 shrink-0 items-center justify-center rounded-full bg-[var(--blog-accent)] text-lg font-semibold text-white","aria-hidden":"true",children:e.author.name.slice(0,1)}),jsxRuntime.jsxs("div",{className:"min-w-0 space-y-2",children:[jsxRuntime.jsxs("div",{children:[jsxRuntime.jsx("p",{className:"text-muted-foreground text-sm font-medium",children:"Written by"}),jsxRuntime.jsxs("h2",{className:"text-foreground flex flex-wrap items-center gap-2 text-xl font-semibold",children:[e.author.name,e.author.isGuest&&jsxRuntime.jsx(Le,{variant:"outline",className:"text-xs",children:"Guest Author"})]})]}),jsxRuntime.jsx("p",{className:"text-muted-foreground leading-relaxed",children:e.author.bio})]})]})})]}),((o??false)||a||s.length>0)&&jsxRuntime.jsxs("div",{className:"mx-auto mt-12 max-w-4xl space-y-8",children:[jsxRuntime.jsx(ee,{}),o&&jsxRuntime.jsx(nr,{cta:o}),a&&jsxRuntime.jsx(or,{title:e.title,url:P}),s.length>0&&jsxRuntime.jsx(ir,{articles:s.slice(0,3),basePath:c})]}),(!!r?.previousArticle||!!r?.nextArticle)&&jsxRuntime.jsxs("nav",{className:"article-nav mx-auto mt-12 max-w-4xl",children:[jsxRuntime.jsx(ee,{className:"mb-8"}),jsxRuntime.jsxs("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-2",children:[r?.previousArticle&&jsxRuntime.jsx(Q,{className:"group hover:border-[var(--blog-accent-border)] hover:bg-[var(--blog-accent-bg)] cursor-pointer transition-colors",children:jsxRuntime.jsx(te__default.default,{href:r.previousArticle.url,className:"block",children:jsxRuntime.jsxs(Z,{className:"p-4",children:[jsxRuntime.jsx("div",{className:"text-muted-foreground mb-2 text-sm font-medium",children:"\u2190 Previous Article"}),jsxRuntime.jsx("div",{className:"text-foreground group-hover:text-[var(--blog-accent)] transition-colors",children:r.previousArticle.title})]})})}),r?.nextArticle&&jsxRuntime.jsx(Q,{className:v("group hover:border-[var(--blog-accent-border)] hover:bg-[var(--blog-accent-bg)] cursor-pointer transition-colors",!r?.previousArticle&&"md:col-start-2"),children:jsxRuntime.jsx(te__default.default,{href:r.nextArticle.url,className:"block",children:jsxRuntime.jsxs(Z,{className:"p-4 md:text-right",children:[jsxRuntime.jsx("div",{className:"text-muted-foreground mb-2 text-sm font-medium",children:"Next Article \u2192"}),jsxRuntime.jsx("div",{className:"text-foreground group-hover:text-[var(--blog-accent)] transition-colors",children:r.nextArticle.title})]})})})]})]}),(()=>{let m=J(we(e,{pathPrefix:c}));return jsxRuntime.jsx("script",{type:m.type,dangerouslySetInnerHTML:m.dangerouslySetInnerHTML})})()]})}function Je({items:e,variant:t}){if(e.length===0)return null;let r=jsxRuntime.jsx("ul",{className:"space-y-2 text-sm",children:e.map(n=>jsxRuntime.jsx("li",{className:n.level===3?"pl-4":void 0,children:jsxRuntime.jsx("a",{href:`#${n.id}`,className:"text-muted-foreground hover:text-[var(--blog-accent)] block leading-snug transition-colors",children:n.text})},n.id))});return t==="mobile"?jsxRuntime.jsxs("nav",{"aria-label":"Table of contents",className:"mb-8 rounded-2xl border border-[var(--blog-accent-border)] bg-[var(--blog-accent-bg)] p-4 lg:hidden",children:[jsxRuntime.jsx("p",{className:"text-foreground mb-3 text-sm font-semibold",children:"On this page"}),r]}):jsxRuntime.jsx("aside",{className:"hidden lg:block",children:jsxRuntime.jsxs("nav",{"aria-label":"Table of contents",className:"sticky top-24 max-h-[calc(100vh-8rem)] overflow-y-auto border-l border-border pl-5",children:[jsxRuntime.jsx("p",{className:"text-muted-foreground mb-3 text-xs font-semibold tracking-wider uppercase",children:"On this page"}),r]})})}function nr({cta:e}){return jsxRuntime.jsx("div",{className:"rounded-2xl border border-[var(--blog-accent-border)] bg-[var(--blog-accent-bg)] p-5 sm:p-6",children:jsxRuntime.jsxs("div",{className:"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",children:[jsxRuntime.jsxs("div",{className:"space-y-1",children:[jsxRuntime.jsx("h2",{className:"text-foreground text-xl font-semibold",children:e.title}),e.description&&jsxRuntime.jsx("p",{className:"text-muted-foreground leading-relaxed",children:e.description})]}),jsxRuntime.jsxs(te__default.default,{href:e.href,className:"inline-flex shrink-0 items-center justify-center gap-2 rounded-full bg-[var(--blog-accent)] px-4 py-2 text-sm font-semibold text-white transition-opacity hover:opacity-90",children:[e.label,jsxRuntime.jsx(lucideReact.ArrowUpRight,{className:"size-4","aria-hidden":"true"})]})]})})}function or({title:e,url:t}){let r=encodeURIComponent(e),n=encodeURIComponent(t);return jsxRuntime.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[jsxRuntime.jsxs("span",{className:"text-muted-foreground inline-flex items-center gap-2 text-sm font-medium",children:[jsxRuntime.jsx(lucideReact.Share2,{className:"size-4","aria-hidden":"true"}),"Share"]}),jsxRuntime.jsx("a",{href:`https://x.com/intent/tweet?text=${r}&url=${n}`,target:"_blank",rel:"noopener noreferrer",className:"text-muted-foreground hover:border-[var(--blog-accent-border)] hover:text-[var(--blog-accent)] rounded-full border border-border px-3 py-1.5 text-sm transition-colors",children:"X"}),jsxRuntime.jsx("a",{href:`https://www.linkedin.com/sharing/share-offsite/?url=${n}`,target:"_blank",rel:"noopener noreferrer",className:"text-muted-foreground hover:border-[var(--blog-accent-border)] hover:text-[var(--blog-accent)] rounded-full border border-border px-3 py-1.5 text-sm transition-colors",children:"LinkedIn"}),jsxRuntime.jsxs("a",{href:`mailto:?subject=${r}&body=${n}`,className:"text-muted-foreground hover:border-[var(--blog-accent-border)] hover:text-[var(--blog-accent)] inline-flex items-center gap-1.5 rounded-full border border-border px-3 py-1.5 text-sm transition-colors",children:[jsxRuntime.jsx(lucideReact.Mail,{className:"size-3.5","aria-hidden":"true"}),"Email"]})]})}function ir({articles:e,basePath:t}){return jsxRuntime.jsxs("section",{className:"space-y-4","aria-labelledby":"related-articles-title",children:[jsxRuntime.jsx("h2",{id:"related-articles-title",className:"text-xl font-semibold",children:"You might also like"}),jsxRuntime.jsx("div",{className:"grid gap-4 md:grid-cols-3",children:e.map(r=>jsxRuntime.jsxs(te__default.default,{href:V(t,r.slug),className:"group rounded-2xl border border-border p-4 transition-colors hover:border-[var(--blog-accent-border)] hover:bg-[var(--blog-accent-bg)] hover:no-underline",children:[jsxRuntime.jsx("h3",{className:"text-foreground group-hover:text-[var(--blog-accent)] line-clamp-3 font-semibold transition-colors",children:r.title}),r.excerpt&&jsxRuntime.jsx("p",{className:"text-muted-foreground mt-2 line-clamp-3 text-sm leading-relaxed",children:r.excerpt})]},r.id))})]})}function sr(e,t="/blog"){let r=e.meta.title??e.title,n=e.meta.description??e.excerpt,i=e.meta.canonicalUrl??`${e.site.domain}${V(t,e.slug)}`,o=e.meta.ogImage??e.featuredImage;return {title:r,description:n,keywords:e.meta.keywords.join(", "),authors:e.author?[{name:e.author.name}]:void 0,openGraph:{title:r,description:n,type:"article",url:i,images:o?[{url:o,alt:e.featuredImageAlt??r}]:void 0,publishedTime:e.publishedAt,modifiedTime:e.updatedAt,authors:e.author?[e.author.name]:void 0,siteName:e.site.name},twitter:{card:"summary_large_image",title:r,description:n,images:o?[o]:void 0},alternates:{canonical:i}}}function _e(e){let t=e.headers.get("Authorization");if(!t)return null;let n=/^Bearer\s+(.+)$/i.exec(t);if(n?.[1])return n[1];let o=/^Token\s+(.+)$/i.exec(t);return o?.[1]?o[1]:null}var me=class{validApiKeys;constructor(t){this.validApiKeys=new Set(t);}async validateToken(t){return t?.trim()?this.validApiKeys.has(t)?{valid:true,context:{tokenHash:this.hashToken(t)}}:{valid:false,errorCode:"invalid"}:{valid:false,errorCode:"missing"}}extractToken=t=>_e(t);hashToken(t){return t.substring(0,8)+"..."}},j=class extends me{constructor(t="BLOG_PLATFORM_API_KEYS"){let r=process.env[t];!r&&t==="BLOG_PLATFORM_API_KEYS"&&(r=process.env.BLOG_AUTH_TOKEN);let n=r?r.split(",").map(i=>i.trim()).filter(Boolean):[];n.length===0&&console.warn(`\u26A0\uFE0F No API keys found in environment variable ${t}${t==="BLOG_PLATFORM_API_KEYS"?" (set BLOG_PLATFORM_API_KEYS or BLOG_AUTH_TOKEN)":""}. Authentication will fail for all requests.`),super(n);}},re=class{async validateToken(){return {valid:true,context:{development:true}}}extractToken(){return "development-mode"}},de=class{hasWarned=false;async validateToken(t){return this.hasWarned||(console.error("\u274C SECURITY WARNING: Blog platform authentication not initialized! All requests will be rejected. Call initBlogPlatform() to configure authentication."),this.hasWarned=true),{valid:false,errorCode:"invalid"}}};function ar(){return globalThis.__BLOG_PLATFORM_AUTH_CONFIG__??=new de,globalThis.__BLOG_PLATFORM_AUTH_CONFIG__}function pe(e){globalThis.__BLOG_PLATFORM_AUTH_CONFIG__=e;}function Be(){return globalThis.__BLOG_PLATFORM_AUTH_CONFIG__??ar()}function lr(e){pe(new j(e));}async function k(e){let t=Be(),r=t.extractToken?t.extractToken(e):_e(e);if(!r)return {authenticated:false,result:{valid:false,errorCode:"missing"},token:null};let n=await t.validateToken(r);return {authenticated:n.valid,result:n,token:r}}function cr(e,t=""){let n=Be().errorMessages??{},i,o;switch(e.errorCode){case "missing":i=n.missing??"Authentication token is required",o="PUB005";break;case "expired":i=n.expired??"Authentication token has expired",o="PUB005";break;default:i=n.invalid??"Invalid authentication credentials",o="PUB005";break}return {success:false,error:{code:o,message:i,details:{authError:e.errorCode??"invalid"}},idempotencyKey:t}}async function M(e){let t=await k(e);return t.authenticated?{authenticated:true,context:t.result.context}:{authenticated:false,error:cr(t.result)}}function ur(){let e=process.env.SKIP_BLOG_PLATFORM_AUTH;return e==="true"||e==="1"||process.env.NODE_ENV==="test"}var ge=class{articles=new Map;operations=new Map;async saveArticle(t,r){let n=await this.checkIdempotency(r);if(n)if(n.success){if(Array.from(this.articles.values()).some(s=>s.id===t.id))return n}else return n;if(this.articles.has(t.slug)){let o={success:false,error:{code:"PUB003",message:"This URL is already in use. Please choose another."},idempotencyKey:r};return await this.storeOperationResult(r,o),o}this.articles.set(t.slug,t);let i={success:true,url:`/${t.slug}`,platformPostId:t.id,publishedAt:t.publishedAt,idempotencyKey:r};return await this.storeOperationResult(r,i),i}async getArticle(t){return this.articles.get(t)??null}async listArticles(t={}){let{limit:r=10,offset:n=0,sortBy:i="publishedAt",order:o="desc"}=t,s=Array.from(this.articles.values());return s.sort((c,l)=>{let d=new Date(c[i]).getTime(),p=new Date(l[i]).getTime();return o==="desc"?p-d:d-p}),{articles:s.slice(n,n+r),total:s.length}}async removeArticle(t,r){let n=await this.checkIdempotency(r);if(n)if(n.success){if(!this.articles.has(t))return n}else return n;if(!this.articles.has(t)){let o={success:false,error:{code:"PUB007",message:"Article not found"},idempotencyKey:r};return await this.storeOperationResult(r,o),o}this.articles.delete(t);let i={success:true,idempotencyKey:r};return await this.storeOperationResult(r,i),i}async checkIdempotency(t){return this.operations.get(t)??null}async storeOperationResult(t,r){this.operations.set(t,r);}};function mr(){let e=globalThis;if(e.__BLOG_PLATFORM_STORAGE_WARNED__)return;e.__BLOG_PLATFORM_STORAGE_WARNED__=true;let t="Blog platform: No storage provider configured. Falling back to in-memory storage (data is not persisted).";process.env.NODE_ENV==="production"?console.error(`${t} Call initBlogPlatform({ storage: /* your persistent adapter */ }) to avoid data loss.`):console.warn(t);}function dr(){let e=globalThis;e.__BLOG_PLATFORM_STORAGE__||(mr(),e.__BLOG_PLATFORM_STORAGE__=new ge);let t=e.__BLOG_PLATFORM_STORAGE__;if(!t)throw new Error("Blog platform storage not initialized");return t}function D(){return dr()}function ke(e){let t=globalThis;t.__BLOG_PLATFORM_STORAGE__=e;}function gr(){return globalThis.__BLOG_PLATFORM_RATE_LIMITER__??null}function fr(e){let t=globalThis;t.__BLOG_PLATFORM_RATE_LIMITER__=e;}function fe(e){let{redisUrl:t,redisToken:r,requestsPerMinute:n=5,keyPrefix:i="blog-platform-ratelimit",analytics:o=true}=e,s=new redis.Redis({url:t,token:r}),a=new ratelimit.Ratelimit({redis:s,analytics:o,prefix:i,limiter:ratelimit.Ratelimit.slidingWindow(n,"1m")});fr(a);}function Ee(){let e=process.env.UPSTASH_REDIS_REST_URL,t=process.env.UPSTASH_REDIS_REST_TOKEN;if(!e||!t){console.warn("Blog platform: No Upstash Redis configuration found. Rate limiting disabled.");return}fe({redisUrl:e,redisToken:t}),console.log("Blog platform: Rate limiting configured (5 requests per minute per token)");}async function Ze(e){let t=gr();if(!t)return console.warn("Blog platform: Rate limiter not configured. All requests allowed."),{success:true,remaining:999,reset:Date.now()+6e4,limit:5,count:0};try{let r=await t.limit(e);return {success:r.success,remaining:r.remaining,reset:r.reset,limit:r.limit,count:r.limit-r.remaining}}catch(r){return console.error("Blog platform: Rate limit check failed:",r),{success:true,remaining:0,reset:Date.now()+6e4,limit:5,count:0}}}function et(e,t=""){let r=Math.ceil((e.reset-Date.now())/6e4);return {success:false,error:{code:"PUB011",message:`Rate limit exceeded. You can make ${e.limit} requests per minute. Try again in ${r} minute(s).`,details:{rateLimit:e}},idempotencyKey:t}}async function E(e,t=""){let r=await Ze(e);return r.success?{allowed:true,rateLimitResult:r}:{allowed:false,errorResponse:et(r,t)}}function N(e){return {"X-RateLimit-Limit":e.limit.toString(),"X-RateLimit-Remaining":e.remaining.toString(),"X-RateLimit-Reset":e.reset.toString(),"Retry-After":Math.ceil((e.reset-Date.now())/1e3).toString()}}function he(e){let{auth:t,storage:r,rateLimit:n,autoRateLimit:i=true}=e;if(!t)throw new Error(`Blog platform initialization failed: 'auth' is required.
2
3
  Example: initBlogPlatform({ auth: new EnvAuth() })
3
- See https://github.com/xexr/blog-platform#authentication for more details.`);console.log("Blog platform: Setting up authentication"),ue(t),n?(console.log("Blog platform: Using custom rate limiting configuration"),pe(n)):o?(console.log("Blog platform: Auto-configuring rate limiting from environment"),Be()):console.log("Blog platform: Rate limiting disabled"),r?(console.log("Blog platform: Using custom storage provider"),_e(r)):console.log("Blog platform: Using default in-memory storage (not suitable for production)"),console.log("Blog platform initialized successfully"),globalThis.__BLOG_PLATFORM_INITIALISED__=true;}function rr(e){if(globalThis.__BLOG_PLATFORM_INITIALISED__){console.log("Blog platform: Already initialized, skipping");return}console.log("Blog platform: Initializing blog platform once"),de(e);}function nr(){de({auth:new Z,autoRateLimit:false}),console.log("Blog platform: Development mode enabled (no auth, in-memory storage, no rate limiting)");}function ir(e){let t=e??"BLOG_PLATFORM_API_KEYS";if(!process.env[t])throw new Error(`Missing required environment variable: ${t}. Set this to a comma-separated list of API keys for blog platform authentication.`);de({auth:new H(t),autoRateLimit:true}),console.log("Blog platform: Production mode enabled (environment-based auth, rate limiting)");}var S=sqliteCore.sqliteTable("bp_articles",{id:sqliteCore.text("id").primaryKey(),slug:sqliteCore.text("slug").notNull(),title:sqliteCore.text("title").notNull(),excerpt:sqliteCore.text("excerpt").notNull(),content:sqliteCore.text("content").notNull(),readingSeconds:sqliteCore.integer("reading_seconds").notNull(),wordCount:sqliteCore.integer("word_count").notNull(),publishedAt:sqliteCore.text("published_at").notNull(),updatedAt:sqliteCore.text("updated_at").notNull(),featuredImage:sqliteCore.text("featured_image"),featuredImageAlt:sqliteCore.text("featured_image_alt"),authorJson:sqliteCore.text("author_json"),siteJson:sqliteCore.text("site_json").notNull(),metaJson:sqliteCore.text("meta_json").notNull(),version:sqliteCore.integer("version").notNull()},e=>({slugUniqueIdx:sqliteCore.uniqueIndex("bp_articles_slug_unique").on(e.slug)})),j=sqliteCore.sqliteTable("bp_operations",{key:sqliteCore.text("key").primaryKey(),resultJson:sqliteCore.text("result_json").notNull(),createdAt:sqliteCore.integer("created_at",{mode:"timestamp_ms"}).notNull(),expiresAt:sqliteCore.integer("expires_at",{mode:"timestamp_ms"})});function cr(e){return {id:e.id,slug:e.slug,title:e.title,excerpt:e.excerpt,content:e.content,readingSeconds:e.readingSeconds,wordCount:e.wordCount,publishedAt:e.publishedAt,updatedAt:e.updatedAt,featuredImage:e.featuredImage??null,featuredImageAlt:e.featuredImageAlt??null,authorJson:e.author?JSON.stringify(e.author):null,siteJson:JSON.stringify(e.site),metaJson:JSON.stringify(e.meta),version:e.version}}function Ye(e){return {id:e.id,slug:e.slug,title:e.title,excerpt:e.excerpt,content:e.content,readingSeconds:e.readingSeconds,wordCount:e.wordCount,publishedAt:e.publishedAt,updatedAt:e.updatedAt,featuredImage:e.featuredImage??void 0,featuredImageAlt:e.featuredImageAlt??void 0,author:e.authorJson?JSON.parse(e.authorJson):null,site:JSON.parse(e.siteJson),meta:JSON.parse(e.metaJson),version:e.version}}var Ee=class{db;options;constructor(t,r={}){this.db=t,this.options=r;}async saveArticle(t,r){let n=await this.checkIdempotency(r);if(n)if(n.success){if((await this.db.select({id:S.id}).from(S).where(drizzleOrm.eq(S.id,t.id)).limit(1)).length!==0)return n}else return n;let o=await this.db.select().from(S).where(drizzleOrm.eq(S.slug,t.slug)).limit(1),i=o[0];if(i&&i.id!==t.id){let c={success:false,error:{code:"PUB003",message:"This URL is already in use. Please choose another."},idempotencyKey:r};return await this.storeOperationResult(r,c),c}let s=cr(t);o.length===0?await this.db.insert(S).values(s).run():await this.db.update(S).set({title:s.title,excerpt:s.excerpt,content:s.content,readingSeconds:s.readingSeconds,wordCount:s.wordCount,updatedAt:s.updatedAt,featuredImage:s.featuredImage,featuredImageAlt:s.featuredImageAlt,authorJson:s.authorJson,siteJson:s.siteJson,metaJson:s.metaJson,version:s.version}).where(drizzleOrm.and(drizzleOrm.eq(S.id,s.id),drizzleOrm.eq(S.slug,s.slug))).run();let a={success:true,url:`/${t.slug}`,platformPostId:t.id,publishedAt:t.publishedAt,idempotencyKey:r};return await this.storeOperationResult(r,a),a}async getArticle(t){let r=await this.db.select().from(S).where(drizzleOrm.eq(S.slug,t)).limit(1);return r[0]?Ye(r[0]):null}async listArticles(t={}){let{limit:r=10,offset:n=0,sortBy:o="publishedAt",order:i="desc"}=t,s=o==="publishedAt"?S.publishedAt:S.updatedAt,a=i==="desc"?drizzleOrm.desc(s):s,c=await this.db.select().from(S).orderBy(a).limit(r).offset(n),l=await this.db.select({c:drizzleOrm.sql`count(*)`}).from(S),p=Number(l?.[0]?.c??0);return {articles:c.map(Ye),total:p}}async removeArticle(t,r){let n=await this.checkIdempotency(r);if(n)if(n.success){if(!((await this.db.select({id:S.id}).from(S).where(drizzleOrm.eq(S.slug,t)).limit(1)).length>0))return n}else return n;if(!(await this.db.select().from(S).where(drizzleOrm.eq(S.slug,t)).limit(1))[0]){let s={success:false,error:{code:"PUB007",message:"Article not found"},idempotencyKey:r};return await this.storeOperationResult(r,s),s}await this.db.delete(S).where(drizzleOrm.eq(S.slug,t)).run();let i={success:true,idempotencyKey:r};return await this.storeOperationResult(r,i),i}async checkIdempotency(t){let r=await this.db.select().from(j).where(drizzleOrm.eq(j.key,t)).limit(1);if(!r[0])return null;try{return JSON.parse(r[0].resultJson)}catch{return null}}async storeOperationResult(t,r){let n=Date.now(),o=this.options.operationTtlMs?n+this.options.operationTtlMs:null;await this.db.delete(j).where(drizzleOrm.eq(j.key,t)).run(),await this.db.insert(j).values({key:t,resultJson:JSON.stringify(r),createdAt:new Date(n),expiresAt:o?new Date(o):null}).run();}};function ur(){return {createArticles:`CREATE TABLE IF NOT EXISTS bp_articles (
4
+ See https://github.com/xexr/blog-platform#authentication for more details.`);console.log("Blog platform: Setting up authentication"),pe(t),n?(console.log("Blog platform: Using custom rate limiting configuration"),fe(n)):i?(console.log("Blog platform: Auto-configuring rate limiting from environment"),Ee()):console.log("Blog platform: Rate limiting disabled"),r?(console.log("Blog platform: Using custom storage provider"),ke(r)):console.log("Blog platform: Using default in-memory storage (not suitable for production)"),console.log("Blog platform initialized successfully"),globalThis.__BLOG_PLATFORM_INITIALISED__=true;}function hr(e){if(globalThis.__BLOG_PLATFORM_INITIALISED__){console.log("Blog platform: Already initialized, skipping");return}console.log("Blog platform: Initializing blog platform once"),he(e);}function br(){he({auth:new re,autoRateLimit:false}),console.log("Blog platform: Development mode enabled (no auth, in-memory storage, no rate limiting)");}function xr(e){let t=e??"BLOG_PLATFORM_API_KEYS";if(!process.env[t])throw new Error(`Missing required environment variable: ${t}. Set this to a comma-separated list of API keys for blog platform authentication.`);he({auth:new j(t),autoRateLimit:true}),console.log("Blog platform: Production mode enabled (environment-based auth, rate limiting)");}var S=sqliteCore.sqliteTable("bp_articles",{id:sqliteCore.text("id").primaryKey(),slug:sqliteCore.text("slug").notNull(),title:sqliteCore.text("title").notNull(),excerpt:sqliteCore.text("excerpt").notNull(),content:sqliteCore.text("content").notNull(),readingSeconds:sqliteCore.integer("reading_seconds").notNull(),wordCount:sqliteCore.integer("word_count").notNull(),publishedAt:sqliteCore.text("published_at").notNull(),updatedAt:sqliteCore.text("updated_at").notNull(),featuredImage:sqliteCore.text("featured_image"),featuredImageAlt:sqliteCore.text("featured_image_alt"),authorJson:sqliteCore.text("author_json"),siteJson:sqliteCore.text("site_json").notNull(),metaJson:sqliteCore.text("meta_json").notNull(),version:sqliteCore.integer("version").notNull()},e=>({slugUniqueIdx:sqliteCore.uniqueIndex("bp_articles_slug_unique").on(e.slug)})),F=sqliteCore.sqliteTable("bp_operations",{key:sqliteCore.text("key").primaryKey(),resultJson:sqliteCore.text("result_json").notNull(),createdAt:sqliteCore.integer("created_at",{mode:"timestamp_ms"}).notNull(),expiresAt:sqliteCore.integer("expires_at",{mode:"timestamp_ms"})});function Rr(e){return {id:e.id,slug:e.slug,title:e.title,excerpt:e.excerpt,content:e.content,readingSeconds:e.readingSeconds,wordCount:e.wordCount,publishedAt:e.publishedAt,updatedAt:e.updatedAt,featuredImage:e.featuredImage??null,featuredImageAlt:e.featuredImageAlt??null,authorJson:e.author?JSON.stringify(e.author):null,siteJson:JSON.stringify(e.site),metaJson:JSON.stringify(e.meta),version:e.version}}function tt(e){return {id:e.id,slug:e.slug,title:e.title,excerpt:e.excerpt,content:e.content,readingSeconds:e.readingSeconds,wordCount:e.wordCount,publishedAt:e.publishedAt,updatedAt:e.updatedAt,featuredImage:e.featuredImage??void 0,featuredImageAlt:e.featuredImageAlt??void 0,author:e.authorJson?JSON.parse(e.authorJson):null,site:JSON.parse(e.siteJson),meta:JSON.parse(e.metaJson),version:e.version}}var Ie=class{db;options;constructor(t,r={}){this.db=t,this.options=r;}async saveArticle(t,r){let n=await this.checkIdempotency(r);if(n)if(n.success){if((await this.db.select({id:S.id}).from(S).where(drizzleOrm.eq(S.id,t.id)).limit(1)).length!==0)return n}else return n;let i=await this.db.select().from(S).where(drizzleOrm.eq(S.slug,t.slug)).limit(1),o=i[0];if(o&&o.id!==t.id){let c={success:false,error:{code:"PUB003",message:"This URL is already in use. Please choose another."},idempotencyKey:r};return await this.storeOperationResult(r,c),c}let s=Rr(t);i.length===0?await this.db.insert(S).values(s).run():await this.db.update(S).set({title:s.title,excerpt:s.excerpt,content:s.content,readingSeconds:s.readingSeconds,wordCount:s.wordCount,updatedAt:s.updatedAt,featuredImage:s.featuredImage,featuredImageAlt:s.featuredImageAlt,authorJson:s.authorJson,siteJson:s.siteJson,metaJson:s.metaJson,version:s.version}).where(drizzleOrm.and(drizzleOrm.eq(S.id,s.id),drizzleOrm.eq(S.slug,s.slug))).run();let a={success:true,url:`/${t.slug}`,platformPostId:t.id,publishedAt:t.publishedAt,idempotencyKey:r};return await this.storeOperationResult(r,a),a}async getArticle(t){let r=await this.db.select().from(S).where(drizzleOrm.eq(S.slug,t)).limit(1);return r[0]?tt(r[0]):null}async listArticles(t={}){let{limit:r=10,offset:n=0,sortBy:i="publishedAt",order:o="desc"}=t,s=i==="publishedAt"?S.publishedAt:S.updatedAt,a=o==="desc"?drizzleOrm.desc(s):s,c=await this.db.select().from(S).orderBy(a).limit(r).offset(n),l=await this.db.select({c:drizzleOrm.sql`count(*)`}).from(S),d=Number(l?.[0]?.c??0);return {articles:c.map(tt),total:d}}async removeArticle(t,r){let n=await this.checkIdempotency(r);if(n)if(n.success){if(!((await this.db.select({id:S.id}).from(S).where(drizzleOrm.eq(S.slug,t)).limit(1)).length>0))return n}else return n;if(!(await this.db.select().from(S).where(drizzleOrm.eq(S.slug,t)).limit(1))[0]){let s={success:false,error:{code:"PUB007",message:"Article not found"},idempotencyKey:r};return await this.storeOperationResult(r,s),s}await this.db.delete(S).where(drizzleOrm.eq(S.slug,t)).run();let o={success:true,idempotencyKey:r};return await this.storeOperationResult(r,o),o}async checkIdempotency(t){let r=await this.db.select().from(F).where(drizzleOrm.eq(F.key,t)).limit(1);if(!r[0])return null;try{return JSON.parse(r[0].resultJson)}catch{return null}}async storeOperationResult(t,r){let n=Date.now(),i=this.options.operationTtlMs?n+this.options.operationTtlMs:null;await this.db.delete(F).where(drizzleOrm.eq(F.key,t)).run(),await this.db.insert(F).values({key:t,resultJson:JSON.stringify(r),createdAt:new Date(n),expiresAt:i?new Date(i):null}).run();}};function Ar(){return {createArticles:`CREATE TABLE IF NOT EXISTS bp_articles (
4
5
  id TEXT PRIMARY KEY,
5
6
  slug TEXT NOT NULL UNIQUE,
6
7
  title TEXT NOT NULL,
@@ -21,11 +22,11 @@ See https://github.com/xexr/blog-platform#authentication for more details.`);con
21
22
  result_json TEXT NOT NULL,
22
23
  created_at INTEGER NOT NULL,
23
24
  expires_at INTEGER
24
- );`}}function F(e,t=true){let r=e.trim();return r=r.replace(/\/+$/,""),/^https?:\/\//.exec(r)||(r=`${t?"https":"http"}://${r}`),t&&r.startsWith("http://")&&(r=r.replace("http://","https://")),r}function Ze(e){let t=e.trim();if(!t)throw new Error("Slug cannot be empty");if(!/^[a-z0-9-]+$/.test(t))throw new Error("Slug can only contain lowercase letters, numbers, and hyphens");let n=t.replace(/-+/g,"-").replace(/^-+|-+$/g,"");if(!n)throw new Error("Slug cannot consist only of hyphens");return n}function V(e,t={}){let{forceHttps:r=true,removeTrailingSlash:n=true,domain:o=e.site.domain,pathPrefix:i="/blog"}=t;if(!o)throw new Error("Domain is required for canonical URL generation");if(!e.slug)throw new Error("Article slug is required for canonical URL generation");let s=F(o,r),a=Ze(e.slug),c=i.replace(/^(?!\/)/,"/").replace(/\/+$/,""),l=`${s}${c}/${a}`;return n&&(l=l.replace(/\/+$/,"")),l}function mr(e,t,r={}){return V({slug:t,site:e},r)}function pr(e){try{let t=new URL(e);return !(!["http:","https:"].includes(t.protocol)||!t.hostname||t.hostname.length===0||/^https?:\/\/\//.exec(e)&&!/^https?:\/\/[^\/]/.exec(e)||e.includes(" "))}catch{return false}}function dr(e){try{let t=new URL(e);return `${t.protocol}//${t.host}`}catch{throw new Error("Invalid canonical URL provided")}}function gr(e,t={}){let r=V(e,t);return {...e,meta:{...e.meta,canonicalUrl:r}}}function fr(e,t={},r){let n=r?.path??"/blog",i=`https://${t.canonical?.domain??e.domain}${n}`,s=r?.title?`${r.title} | ${e.name}`:e.name,a=r?.description??e.description,c=t.openGraph?.siteName??e.name,l=[{name:"description",content:a},{name:"author",content:c}];r?.pageNumber&&r.pageNumber>1&&l.push({name:"page",content:r.pageNumber.toString()}),t.meta?.robots&&l.push({name:"robots",content:t.meta.robots}),t.meta?.viewport&&l.push({name:"viewport",content:t.meta.viewport}),t.meta?.themeColor&&l.push({name:"theme-color",content:t.meta.themeColor}),t.meta?.applicationName&&l.push({name:"application-name",content:t.meta.applicationName});let p=[{property:"og:title",content:s},{property:"og:description",content:a},{property:"og:url",content:i},{property:"og:site_name",content:c},{property:"og:locale",content:t.openGraph?.locale??e.locale},{property:"og:type",content:t.openGraph?.type??"website"}];t.openGraph?.defaultImage&&p.push({property:"og:image",content:t.openGraph.defaultImage},{property:"og:image:alt",content:`${c} - ${e.tagline}`});let u=hr(null,{site:t.twitter?.site,creator:t.twitter?.creator,cardType:t.twitter?.cardType??"summary"},{title:s,description:a,image:t.openGraph?.defaultImage});return {meta:l,openGraph:p,twitter:u,links:[{rel:"canonical",href:i}],title:s,description:a,canonicalUrl:i}}function hr(e,t,r){let n=r?.title??e?.meta.title??e?.title??"",o=r?.description??e?.meta.description??e?.excerpt??"",i=r?.image??e?.meta.ogImage??e?.featuredImage,s=[{name:"twitter:card",content:t.cardType},{name:"twitter:title",content:n},{name:"twitter:description",content:o}];return t.site&&s.push({name:"twitter:site",content:t.site}),t.creator&&s.push({name:"twitter:creator",content:t.creator}),i&&(s.push({name:"twitter:image",content:i}),e?.featuredImageAlt),s}function br(e){let t=[];return t.push(`<title>${T(e.title)}</title>`),e.meta.forEach(r=>{let n=[];r.name&&n.push(`name="${T(r.name)}"`),r.property&&n.push(`property="${T(r.property)}"`),r.httpEquiv&&n.push(`http-equiv="${T(r.httpEquiv)}"`),n.push(`content="${T(r.content)}"`),t.push(`<meta ${n.join(" ")} />`);}),e.openGraph.forEach(r=>{t.push(`<meta property="${T(r.property)}" content="${T(r.content)}" />`);}),e.twitter.forEach(r=>{t.push(`<meta name="${T(r.name)}" content="${T(r.content)}" />`);}),e.links.forEach(r=>{let n=[];n.push(`rel="${T(r.rel)}"`),n.push(`href="${T(r.href)}"`),r.type&&n.push(`type="${T(r.type)}"`),r.title&&n.push(`title="${T(r.title)}"`),t.push(`<link ${n.join(" ")} />`);}),t.join(`
25
- `)}function T(e){let t={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;"};return e.replace(/[&<>"']/g,r=>t[r]??r)}function yr(e){let t=[],r=[];return e.title?e.title.length>60?r.push("Title longer than 60 characters may be truncated in search results"):e.title.length<30&&r.push("Title shorter than 30 characters may not be descriptive enough"):t.push("Title is required"),e.description?e.description.length>160?r.push("Meta description longer than 160 characters may be truncated"):e.description.length<120&&r.push("Meta description shorter than 120 characters may not be descriptive enough"):t.push("Meta description is required"),e.canonicalUrl?e.canonicalUrl.startsWith("https://")||r.push("Canonical URL should use HTTPS for better SEO"):t.push("Canonical URL is required"),e.openGraph.find(i=>i.property==="og:image")||r.push("OpenGraph image missing - social media sharing will not show image preview"),e.twitter.find(i=>i.name==="twitter:card")||r.push("Twitter Card type missing - Twitter sharing may not display properly"),{valid:t.length===0,errors:t,warnings:r}}async function Ie(e,t,r=[],n={}){let{includeAuthorPages:o=true,includePaginationPages:i=true,articlesPerPage:s=10,maxEntries:a=5e4,changeFrequency:c={},priority:l={}}=n,p=[],u=F(n.canonical?.domain??e.domain,n.canonical?.forceHttps??true),P=n.canonical?.pathPrefix??"/blog";if(p.push({url:`${u}${P}`,lastModified:q(t),changeFrequency:c.homePage??"daily",priority:l.homePage??1}),t.forEach(h=>{if(p.length>=a)return;let m=V(h,n.canonical);p.push({url:m,lastModified:h.updatedAt,changeFrequency:c.articles??"monthly",priority:l.articles??.8});}),o&&r.forEach(h=>{if(p.length>=a)return;let m=`${u}${P}/authors/${h.slug}`,d=t.filter(C=>C.author?.id===h.id),b=q(d);p.push({url:m,lastModified:b,changeFrequency:c.authorPages??"weekly",priority:l.authorPages??.6});}),i&&t.length>s){let h=Math.ceil(t.length/s);for(let m=2;m<=h&&!(p.length>=a);m++)p.push({url:`${u}${P}?page=${m}`,lastModified:q(t),changeFrequency:c.paginationPages??"daily",priority:l.paginationPages??.5});}return p}function xr(e,t,r=[],n={}){let{includeAuthorPages:o=true,includePaginationPages:i=true,articlesPerPage:s=10,maxEntries:a=5e4,changeFrequency:c={},priority:l={}}=n,p=[],u=F(n.canonical?.domain??e.domain,n.canonical?.forceHttps??true),P=n.canonical?.pathPrefix??"/blog",h=new Date().toISOString(),m=1;if(m+=t.length,o&&(m+=r.length),i&&t.length>s){let b=Math.ceil(t.length/s);m+=b-1;}let d=m>a;if(p.push({loc:`${u}${P}`,lastmod:q(t),changefreq:c.homePage??"daily",priority:l.homePage??1}),t.forEach(b=>{if(p.length>=a)return;let C=V(b,n.canonical);p.push({loc:C,lastmod:b.updatedAt,changefreq:c.articles??"monthly",priority:l.articles??.8});}),o&&r.forEach(b=>{if(p.length>=a)return;let C=`${u}${P}/authors/${b.slug}`,lt=t.filter(ut=>ut.author?.id===b.id),ct=q(lt);p.push({loc:C,lastmod:ct,changefreq:c.authorPages??"weekly",priority:l.authorPages??.6});}),i&&t.length>s){let b=Math.ceil(t.length/s);for(let C=2;C<=b&&!(p.length>=a);C++)p.push({loc:`${u}${P}?page=${C}`,lastmod:q(t),changefreq:c.paginationPages??"daily",priority:l.paginationPages??.5});}return {entries:p,totalEntries:p.length,truncated:d,generatedAt:h,baseUrl:u}}function et(e){let t='<?xml version="1.0" encoding="UTF-8"?>',r='<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">',n="</urlset>",o=e.entries.map(i=>{let s=[];return s.push(" <url>"),s.push(` <loc>${te(i.loc)}</loc>`),i.lastmod&&s.push(` <lastmod>${te(i.lastmod)}</lastmod>`),i.changefreq&&s.push(` <changefreq>${te(i.changefreq)}</changefreq>`),i.priority!==void 0&&s.push(` <priority>${i.priority.toFixed(1)}</priority>`),s.push(" </url>"),s.join(`
26
- `)});return [t,r,...o,n].join(`
27
- `)}function Pr(e,t){let r='<?xml version="1.0" encoding="UTF-8"?>',n='<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">',o="</sitemapindex>",i=e.map(s=>{let a=[];return a.push(" <sitemap>"),a.push(` <loc>${te(s.url)}</loc>`),s.lastmod&&a.push(` <lastmod>${te(s.lastmod)}</lastmod>`),a.push(" </sitemap>"),a.join(`
28
- `)});return [r,n,...i,o].join(`
29
- `)}function Sr(e){let t=[],r=[];e.entries.length===0?t.push("Sitemap must contain at least one URL"):e.entries.length>5e4&&t.push("Sitemap contains more than 50,000 URLs (Google limit)"),e.truncated&&r.push("Sitemap was truncated due to size limits"),e.entries.forEach((o,i)=>{try{new URL(o.loc);}catch{t.push(`Invalid URL at entry ${i+1}: ${o.loc}`);}o.priority!==void 0&&(o.priority<0||o.priority>1)&&t.push(`Invalid priority at entry ${i+1}: must be between 0.0 and 1.0`),o.lastmod&&!vr(o.lastmod)&&t.push(`Invalid lastmod date at entry ${i+1}: ${o.lastmod}`),o.loc.length>2048&&r.push(`URL at entry ${i+1} exceeds 2048 character limit`);});let n=new Map;return e.entries.forEach(o=>{let i=n.get(o.loc)??0;n.set(o.loc,i+1);}),n.forEach((o,i)=>{o>1&&t.push(`Duplicate URL found: ${i} (appears ${o} times)`);}),{valid:t.length===0,errors:t,warnings:r}}function q(e){return e.length===0?new Date().toISOString():e.reduce((r,n)=>{let o=new Date(n.updatedAt);return o>r?o:r},new Date(e[0].updatedAt)).toISOString()}function Rr(e,t,r=[],n={}){return async function(){let s=(await Ie(e,t,r,n)).map(l=>({loc:l.url,lastmod:typeof l.lastModified=="string"?l.lastModified:l.lastModified?.toISOString(),changefreq:l.changeFrequency,priority:l.priority})),a={entries:s,totalEntries:s.length,generatedAt:new Date().toISOString(),baseUrl:F(n.canonical?.domain??e.domain,n.canonical?.forceHttps??true)},c=et(a);return new Response(c,{headers:{"Content-Type":"application/xml","Cache-Control":"public, max-age=3600, s-maxage=3600"}})}}function Ar(e){return async function(){let r=await e.getSite(),n=await e.getArticles(),o=e.getAuthors?await e.getAuthors():[];return Ie(r,n,o,e.options)}}function te(e){let t={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;"};return e.replace(/[&<>"']/g,r=>t[r]??r)}function vr(e){try{let t=new Date(e),r=t.toISOString(),n=e.endsWith("Z")&&!e.includes(".")?e.replace("Z",".000Z"):e;return r===n&&!isNaN(t.getTime())}catch{return false}}var z={name:"@xexr/blog-platform",version:"1.0.2"};function tt(e){let r=e.replace(/^v/,"").split(".");if(r.length<3)throw new Error(`Invalid version format: ${e}`);let n=parseInt(r[0]??"0",10),o=parseInt(r[1]??"0",10),i=parseInt(r[2]?.split("-")[0]??"0",10);if(isNaN(n)||isNaN(o)||isNaN(i))throw new Error(`Invalid version format: ${e}`);return {major:n,minor:o,patch:i}}function O(){let e=tt(z.version);return {name:z.name,version:z.version,...e}}function $(e){try{let t=e.split(" "),r={};for(let n of t){let[o,i]=n.split("/");if(!o||!i)continue;let s=tt(i),a={name:o,version:i,...s};o==="bloggy"?r.bloggyVersion=a:o==="platform"&&(r.platformVersion=a);}return r}catch{return null}}function rt(e,t){try{return e.major!==t.major?{compatible:!1,errorCode:"PUB009",errorMessage:`Major version incompatibility: ${e.name} ${e.version} is not compatible with ${t.name} ${t.version}. Please upgrade.`}:e.minor!==t.minor?{compatible:!0,errorCode:"PUB010",warning:`Minor version difference: ${e.name} ${e.version} with ${t.name} ${t.version}. Some features may not be available.`}:{compatible:!0}}catch(r){return {compatible:false,errorMessage:`Failed to check version compatibility: ${r instanceof Error?r.message:"Unknown error"}`}}}var nt={enableCSP:true,cspDirectives:{"default-src":"'self'","script-src":"'self' 'unsafe-inline'","style-src":"'self' 'unsafe-inline'","img-src":"'self' data: https:","font-src":"'self' https:","connect-src":"'self'","media-src":"'self'","object-src":"'none'","base-uri":"'self'","form-action":"'self'","frame-ancestors":"'none'","upgrade-insecure-requests":""},enableFrameOptions:true,frameOptions:"DENY",enableContentTypeOptions:true,enableXSSProtection:true,enableReferrerPolicy:true,referrerPolicy:"strict-origin-when-cross-origin",enableHSTS:true,hstsMaxAge:31536e3,hstsIncludeSubdomains:true,enablePermissionsPolicy:true,permissionsPolicyDirectives:{camera:"()",microphone:"()",geolocation:"()",payment:"()",usb:"()",accelerometer:"()",gyroscope:"()",magnetometer:"()"}};function Nr(){let e=process.env.BLOG_PLATFORM_DISABLE_CSP==="true",t=process.env.BLOG_PLATFORM_FRAME_OPTIONS,r=process.env.BLOG_PLATFORM_DISABLE_HSTS==="true";return {...nt,enableCSP:!e,frameOptions:t??nt.frameOptions,enableHSTS:!r}}function Tr(e){return Object.entries(e).map(([t,r])=>r?`${t} ${r}`:t).join("; ")}function Cr(e){return Object.entries(e).map(([t,r])=>`${t}=${r}`).join(", ")}function Or(e,t={}){let r={...Nr(),...t},n={};if(r.enableCSP){let o={...r.cspDirectives,...t.cspDirectives??{}};n["Content-Security-Policy"]=Tr(o);}if(r.enableFrameOptions&&(n["X-Frame-Options"]=r.frameOptions),r.enableContentTypeOptions&&(n["X-Content-Type-Options"]="nosniff"),r.enableXSSProtection&&(n["X-XSS-Protection"]="1; mode=block"),r.enableReferrerPolicy&&(n["Referrer-Policy"]=r.referrerPolicy),r.enableHSTS&&Lr(e)){let o=[`max-age=${r.hstsMaxAge}`,r.hstsIncludeSubdomains?"includeSubDomains":""].filter(Boolean).join("; ");n["Strict-Transport-Security"]=o;}if(r.enablePermissionsPolicy){let o={...r.permissionsPolicyDirectives,...t.permissionsPolicyDirectives??{}};n["Permissions-Policy"]=Cr(o);}return n}function Lr(e){return !!(e.url.startsWith("https://")||e.headers.get("x-forwarded-proto")==="https"||e.headers.get("cf-visitor")?.includes('"scheme":"https"'))}function ge(e,t={}){return Or(e,{...t,cspDirectives:{...{"default-src":"'none'","frame-ancestors":"'none'","base-uri":"'none'"},...t.cspDirectives??{}}})}var it={allowedOrigins:["http://localhost:3000","https://localhost:3000","http://127.0.0.1:3000","https://127.0.0.1:3000"],allowWildcard:false,allowCredentials:false,maxAge:86400,securityConfig:{}};function ot(){let e=process.env.BLOG_PLATFORM_ALLOWED_ORIGINS,t=process.env.BLOG_PLATFORM_ALLOW_WILDCARD==="true",r=process.env.BLOG_PLATFORM_ALLOW_CREDENTIALS==="true";return {...it,allowedOrigins:e?e.split(",").map(n=>n.trim()):it.allowedOrigins,allowWildcard:t,allowCredentials:r}}function st(e,t){return e?t.allowWildcard?true:t.allowedOrigins.includes(e):false}function at(e,t){let r=e.headers.get("origin"),n={};return t.allowWildcard?n["Access-Control-Allow-Origin"]="*":r&&st(r,t)&&(n["Access-Control-Allow-Origin"]=r),t.allowCredentials&&!t.allowWildcard&&(n["Access-Control-Allow-Credentials"]="true"),t.allowWildcard||(n.Vary="Origin"),n}function _r(e,t,r,n){return {...at(e,t),"Access-Control-Allow-Methods":r.join(", "),"Access-Control-Allow-Headers":n.join(", "),"Access-Control-Max-Age":t.maxAge.toString()}}var Br=["Content-Type","X-Bloggy-Version","X-Idempotency-Key","Authorization","X-Requested-With"];function f(e,t,r={}){let{status:n=200,headers:o={},corsConfig:i={}}=r,s={...ot(),...i},a=at(e,s),c=ge(e,s.securityConfig),l={"Content-Type":"application/json",...a,...c,...o};return server.NextResponse.json(t,{status:n,headers:l})}function re(e,t,r={}){let{allowedHeaders:n=Br,corsConfig:o={}}=r,i={...ot(),...o},s=e.headers.get("origin");if(s&&!i.allowWildcard&&!st(s,i)){let l=ge(e,i.securityConfig);return new server.NextResponse(null,{status:403,headers:{"Content-Type":"text/plain",...l}})}let a=_r(e,i,[...t,"OPTIONS"],n),c=ge(e,i.securityConfig);return new server.NextResponse(null,{status:200,headers:{...a,...c}})}async function Er(e){try{let t=await E(e);if(!t.authenticated){let d=await M(e);return f(e,d.error,{status:401})}let r=t.token??"anonymous",n=await I(r);if(!n.allowed){let d=n.errorResponse.error?.details?.rateLimit,b=d&&typeof d=="object"&&"limit"in d&&"remaining"in d&&"reset"in d&&"count"in d&&"success"in d?d:{limit:10,remaining:0,reset:Date.now()+6e4,count:10,success:!1},C=N(b);return f(e,n.errorResponse,{status:429,headers:C})}if(!e.headers.get("content-type")?.includes("application/json"))return f(e,{success:!1,error:{code:"PUB001",message:"Content-Type must be application/json"},idempotencyKey:""},{status:400});let i;try{i=await e.json();}catch{return f(e,{success:!1,error:{code:"PUB001",message:"Invalid JSON in request body"},idempotencyKey:""},{status:400})}let s=Ir(i);if(s.length>0)return f(e,{success:!1,error:{code:"PUB001",message:"Missing required fields",details:{errors:s}},idempotencyKey:i.idempotencyKey??""},{status:400});let a=e.headers.get("X-Bloggy-Version");if(a){let d=$(a);if(d?.platformVersion){let b=O();if(d.platformVersion.major!==b.major)return f(e,{success:!1,error:{code:"PUB009",message:"Major version incompatibility. Please upgrade your blog platform package.",details:{clientVersion:d.platformVersion.version,serverVersion:b.version}},idempotencyKey:i.idempotencyKey},{status:409})}}if(i.dryRun){let d=[];return i.article.wordCount<50&&d.push("Article has fewer than 50 words, which may affect SEO"),(!i.article.excerpt||i.article.excerpt.length<120)&&d.push("Article excerpt is shorter than recommended 120 characters"),i.article.meta.keywords.length||d.push("No SEO keywords provided"),f(e,{success:!0,warnings:d,idempotencyKey:i.idempotencyKey},{status:200})}let c={...i.article,slug:i.slug??i.article.slug,meta:{...i.article.meta,description:i.metaDescription??i.article.meta.description}};if(!Me(c.slug))return f(e,{success:!1,error:{code:"PUB002",message:"Slug can only contain lowercase letters, numbers, and hyphens"},idempotencyKey:i.idempotencyKey},{status:400});let p=await D().saveArticle(c,i.idempotencyKey),u=O(),P=N(n.rateLimitResult),h={"X-Bloggy-Version":`platform/${u.version}`,"X-Idempotency-Key":i.idempotencyKey,...P};p.success&&(h.Location=p.url??`/${c.slug}`);let m=p.success?201:p.error?.code==="PUB003"?409:400;return f(e,p,{status:m,headers:h})}catch(t){return console.error("Publish endpoint error:",t),f(e,{success:false,error:{code:"PUB007",message:"Internal server error during publishing"},idempotencyKey:""},{status:500})}}function Ir(e){let t=[];if(!e||typeof e!="object")return t.push("Request body must be a valid object"),t;let r=e;if((!r.article||typeof r.article!="object")&&t.push("Missing required field: article"),(!r.idempotencyKey||typeof r.idempotencyKey!="string")&&t.push("Missing required field: idempotencyKey"),r.article&&typeof r.article=="object"){let n=r.article,o=["id","slug","title","content","publishedAt","site"];for(let i of o)n[i]||t.push(`Missing required article field: ${i}`);if(n.site&&typeof n.site=="object"){let i=n.site,s=["id","name","domain"];for(let a of s)i[a]||t.push(`Missing required site field: ${a}`);}if(n.meta&&typeof n.meta=="object"){let i=n.meta;Array.isArray(i.keywords)||t.push("Article meta.keywords must be an array");}}return t}function Me(e){return !e||typeof e!="string"?false:/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(e)&&e.length>=1&&e.length<=100}async function Mr(e){try{let t=await E(e);if(!t.authenticated){let m=await M(e);return server.NextResponse.json(m.error,{status:401})}let r=t.token??"anonymous",n=await I(r);if(!n.allowed){let m=n.errorResponse.error?.details?.rateLimit,d=m&&typeof m=="object"&&"limit"in m&&"remaining"in m&&"reset"in m&&"count"in m&&"success"in m?m:{limit:10,remaining:0,reset:Date.now()+6e4,count:10,success:!1},b=N(d);return f(e,n.errorResponse,{status:429,headers:b})}if(!e.headers.get("content-type")?.includes("application/json"))return f(e,{success:!1,error:{code:"PUB001",message:"Content-Type must be application/json"},idempotencyKey:""},{status:400});let i;try{i=await e.json();}catch{return f(e,{success:!1,error:{code:"PUB001",message:"Invalid JSON in request body"},idempotencyKey:""},{status:400})}let s=Dr(i);if(s.length>0)return f(e,{success:!1,error:{code:"PUB001",message:"Missing required fields",details:{errors:s}},idempotencyKey:i.idempotencyKey??""},{status:400});let a=e.headers.get("X-Bloggy-Version");if(a){let m=$(a);if(m?.platformVersion){let d=O();if(m.platformVersion.major!==d.major)return f(e,{success:!1,error:{code:"PUB009",message:"Major version incompatibility. Please upgrade your blog platform package.",details:{clientVersion:m.platformVersion.version,serverVersion:d.version}},idempotencyKey:i.idempotencyKey},{status:409})}}if(!$r(i.slug))return f(e,{success:!1,error:{code:"PUB002",message:"Slug can only contain lowercase letters, numbers, and hyphens"},idempotencyKey:i.idempotencyKey},{status:400});if(i.dryRun){let d=await D().getArticle(i.slug),b=[];return d||b.push("Article with this slug does not exist"),f(e,{success:!0,warnings:b,idempotencyKey:i.idempotencyKey},{status:200})}let l=await D().removeArticle(i.slug,i.idempotencyKey),p=O(),u=N(n.rateLimitResult),P={"X-Bloggy-Version":`platform/${p.version}`,"X-Idempotency-Key":i.idempotencyKey,...u},h=l.success?200:l.error?.code==="PUB007"?404:400;return f(e,l,{status:h,headers:P})}catch(t){return console.error("Unpublish endpoint error:",t),f(e,{success:false,error:{code:"PUB007",message:"Internal server error during unpublishing"},idempotencyKey:""},{status:500})}}function Dr(e){let t=[];if(!e||typeof e!="object")return t.push("Request body must be a valid object"),t;let r=e;return (!r.slug||typeof r.slug!="string")&&t.push("Missing required field: slug"),(!r.idempotencyKey||typeof r.idempotencyKey!="string")&&t.push("Missing required field: idempotencyKey"),r.slug&&typeof r.slug=="string"&&!r.slug.trim()&&t.push("Slug cannot be empty"),t}function $r(e){return !e||typeof e!="string"?false:/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(e)&&e.length>=1&&e.length<=100}async function Ur(e){try{let t=await E(e);if(!t.authenticated){let u=await M(e),P={success:!1,versions:{bloggy:{name:"unknown",version:"unknown",major:0,minor:0,patch:0},platform:{name:"unknown",version:"unknown",major:0,minor:0,patch:0}},compatibility:{compatible:!1,errorMessage:u.error?.error?.message??"Authentication required"}};return f(e,P,{status:401})}let r=t.token??"anonymous",n=await I(r);if(!n.allowed){let u=n.errorResponse.error?.details?.rateLimit,P=u&&typeof u=="object"&&"limit"in u&&"remaining"in u&&"reset"in u&&"count"in u&&"success"in u?u:{limit:10,remaining:0,reset:Date.now()+6e4,count:10,success:!1},h=N(P),m={success:!1,versions:{bloggy:{name:"unknown",version:"unknown",major:0,minor:0,patch:0},platform:{name:"unknown",version:"unknown",major:0,minor:0,patch:0}},compatibility:{compatible:!1,errorMessage:n.errorResponse.error?.message??"Rate limit exceeded"}};return f(e,m,{status:429,headers:h})}let o=O(),i=e.headers.get("X-Bloggy-Version"),s={name:"unknown",version:"unknown",major:0,minor:0,patch:0};if(i)try{if(/^\d+\.\d+\.\d+/.test(i)){let u=i.split("."),P=parseInt(u[0]??"0",10),h=parseInt(u[1]??"0",10),m=parseInt(u[2]?.split("-")[0]??"0",10);s={name:"bloggy",version:i,major:P,minor:h,patch:m};}else {let u=$(i);u?.bloggyVersion&&(s=u.bloggyVersion);}}catch(u){console.warn("Failed to parse X-Bloggy-Version header:",u);}let a={compatible:!0};s.version!=="unknown"&&(a=rt(s,o));let c={success:!0,versions:{bloggy:s,platform:o},compatibility:a},l=N(n.rateLimitResult),p={"X-Bloggy-Version":`platform/${o.version}`,"Cache-Control":"public, max-age=300, stale-while-revalidate=60",...l};return f(e,c,{status:200,headers:p})}catch(t){console.error("Version endpoint error:",t);let r={success:false,versions:{bloggy:{name:"unknown",version:"unknown",major:0,minor:0,patch:0},platform:{name:"unknown",version:"unknown",major:0,minor:0,patch:0}},compatibility:{compatible:false,errorMessage:"Internal server error while checking version compatibility"},error:t instanceof Error?t.message:"Unknown error"};return f(e,r,{status:500})}}async function Gr(e,{params:t}){try{let{slug:r}=await t,n=await E(e);if(!n.authenticated){let d=await M(e);return server.NextResponse.json(d.error,{status:401})}let o=n.token??"anonymous",i=await I(o);if(!i.allowed){let d=i.errorResponse.error?.details?.rateLimit||{limit:10,remaining:0,reset:Date.now()+6e4,count:10,success:!1},b=N(d);return f(e,i.errorResponse,{status:429,headers:b})}if(!r||!Me(r))return f(e,{exists:!1,error:{code:"PUB002",message:"Invalid slug format. Must be lowercase letters, numbers, and hyphens only."}},{status:400});let s=e.headers.get("X-Bloggy-Version");if(s){let d=$(s);if(d?.platformVersion){let b=O();if(d.platformVersion.major!==b.major)return f(e,{exists:!1,error:{code:"PUB009",message:"Major version incompatibility. Please upgrade your blog platform package.",details:{clientVersion:d.platformVersion.version,serverVersion:b.version}}},{status:409})}}let l=await D().getArticle(r)!==null,p={exists:l,...l&&{message:"Slug is already in use. Please choose another (e.g., append '-v2')."}},u=O(),P=N(i.rateLimitResult),h={"X-Bloggy-Version":`platform/${u.version}`,...P},m=e.headers.get("X-Idempotency-Key");return m&&(h["X-Idempotency-Key"]=m,console.log(`Slug check for idempotency: ${m}, exists: ${l}`)),f(e,p,{status:200,headers:h})}catch(r){return console.error("Slug existence check error:",r instanceof Error?r.message:String(r)),f(e,{exists:false,error:{code:"PUB007",message:"Internal server error during slug check"}},{status:500})}}async function Hr(e){return re(e,["GET"])}var Hi=z.version;
30
- exports.ApiKeyAuth=le;exports.BlogArticlePage=We;exports.BlogHomePage=Fe;exports.Button=ft;exports.Card=Y;exports.CardContent=Q;exports.CardDescription=kt;exports.CardFooter=Mt;exports.CardHeader=we;exports.CardTitle=Ne;exports.DrizzleStorage=Ee;exports.EnvAuth=H;exports.InMemoryStorage=me;exports.NoAuth=Z;exports.PACKAGE_VERSION=Hi;exports.Pagination=oe;exports.PaginationContent=he;exports.PaginationEllipsis=ie;exports.PaginationItem=B;exports.PaginationLink=U;exports.PaginationNext=ye;exports.PaginationPrevious=be;exports.ShadcnPagination=fe;exports.StructuredDataError=X;exports.UninitializedAuth=ce;exports.autoConfigureRateLimit=Be;exports.bpArticles=S;exports.bpOperations=j;exports.buildBlogPath=J;exports.buttonVariants=ne;exports.checkRateLimit=Ke;exports.cn=x;exports.configureRateLimit=pe;exports.createBlogSitemapRoute=Rr;exports.createDynamicBlogSitemap=Ar;exports.createRateLimitErrorResponse=Je;exports.createStructuredDataScript=K;exports.enforceRateLimit=I;exports.extractKeywordsFromArticle=vt;exports.extractTokenFromHeader=Oe;exports.generateArticleMetadata=zt;exports.generateArticleStructuredData=se;exports.generateAuthorStructuredData=$e;exports.generateBlogHomeMetadata=_t;exports.generateBlogHomeStructuredData=Ae;exports.generateBlogSitemapEntries=Ie;exports.generateBreadcrumbStructuredData=Ue;exports.generateCanonicalUrl=V;exports.generateCanonicalUrlFromSlug=mr;exports.generateCompleteArticleStructuredData=Re;exports.generateOrganizationStructuredData=Pe;exports.generatePaginationMetadata=At;exports.generateSiteMetadata=fr;exports.generateSitemap=xr;exports.generateSitemapIndex=Pr;exports.generateWebSiteStructuredData=Se;exports.getAuthConfig=Le;exports.getBaseUrl=dr;exports.getDrizzleAdapterSql=ur;exports.getPathPrefixFromBlogUrl=Nt;exports.getRateLimitHeaders=N;exports.getStorage=D;exports.initBlogPlatform=de;exports.initBlogPlatformDev=nr;exports.initBlogPlatformOnce=rr;exports.initBlogPlatformProd=ir;exports.initEnvAuth=Xt;exports.isValidCanonicalUrl=pr;exports.metadataToHtml=br;exports.normalizeBlogBasePath=k;exports.normalizeDomain=F;exports.normalizeSlug=Ze;exports.publishHandler=Er;exports.safeGenerateArticleStructuredData=wt;exports.setAuthConfig=ue;exports.setStorage=_e;exports.shouldSkipAuth=Jt;exports.sitemapToXml=et;exports.slugExistsHandler=Gr;exports.slugExistsOptionsHandler=Hr;exports.structuredDataToJsonLd=Ge;exports.unpublishHandler=Mr;exports.updateArticleCanonicalUrl=gr;exports.usePagination=Rt;exports.validateMetadata=yr;exports.validateSitemap=Sr;exports.validateStructuredData=Ve;exports.versionHandler=Ur;//# sourceMappingURL=index.js.map
25
+ );`}}function q(e,t=true){let r=e.trim();return r=r.replace(/\/+$/,""),/^https?:\/\//.exec(r)||(r=`${t?"https":"http"}://${r}`),t&&r.startsWith("http://")&&(r=r.replace("http://","https://")),r}function nt(e){let t=e.trim();if(!t)throw new Error("Slug cannot be empty");if(!/^[a-z0-9-]+$/.test(t))throw new Error("Slug can only contain lowercase letters, numbers, and hyphens");let n=t.replace(/-+/g,"-").replace(/^-+|-+$/g,"");if(!n)throw new Error("Slug cannot consist only of hyphens");return n}function H(e,t={}){let{forceHttps:r=true,removeTrailingSlash:n=true,domain:i=e.site.domain,pathPrefix:o="/blog"}=t;if(!i)throw new Error("Domain is required for canonical URL generation");if(!e.slug)throw new Error("Article slug is required for canonical URL generation");let s=q(i,r),a=nt(e.slug),c=o.replace(/^(?!\/)/,"/").replace(/\/+$/,""),l=`${s}${c}/${a}`;return n&&(l=l.replace(/\/+$/,"")),l}function wr(e,t,r={}){return H({slug:t,site:e},r)}function Nr(e){try{let t=new URL(e);return !(!["http:","https:"].includes(t.protocol)||!t.hostname||t.hostname.length===0||/^https?:\/\/\//.exec(e)&&!/^https?:\/\/[^\/]/.exec(e)||e.includes(" "))}catch{return false}}function Tr(e){try{let t=new URL(e);return `${t.protocol}//${t.host}`}catch{throw new Error("Invalid canonical URL provided")}}function Cr(e,t={}){let r=H(e,t);return {...e,meta:{...e.meta,canonicalUrl:r}}}function Lr(e,t={},r){let n=r?.path??"/blog",o=`https://${t.canonical?.domain??e.domain}${n}`,s=r?.title?`${r.title} | ${e.name}`:e.name,a=r?.description??e.description,c=t.openGraph?.siteName??e.name,l=[{name:"description",content:a},{name:"author",content:c}];r?.pageNumber&&r.pageNumber>1&&l.push({name:"page",content:r.pageNumber.toString()}),t.meta?.robots&&l.push({name:"robots",content:t.meta.robots}),t.meta?.viewport&&l.push({name:"viewport",content:t.meta.viewport}),t.meta?.themeColor&&l.push({name:"theme-color",content:t.meta.themeColor}),t.meta?.applicationName&&l.push({name:"application-name",content:t.meta.applicationName});let d=[{property:"og:title",content:s},{property:"og:description",content:a},{property:"og:url",content:o},{property:"og:site_name",content:c},{property:"og:locale",content:t.openGraph?.locale??e.locale},{property:"og:type",content:t.openGraph?.type??"website"}];t.openGraph?.defaultImage&&d.push({property:"og:image",content:t.openGraph.defaultImage},{property:"og:image:alt",content:`${c} - ${e.tagline}`});let p=Or(null,{site:t.twitter?.site,creator:t.twitter?.creator,cardType:t.twitter?.cardType??"summary"},{title:s,description:a,image:t.openGraph?.defaultImage});return {meta:l,openGraph:d,twitter:p,links:[{rel:"canonical",href:o}],title:s,description:a,canonicalUrl:o}}function Or(e,t,r){let n=r?.title??e?.meta.title??e?.title??"",i=r?.description??e?.meta.description??e?.excerpt??"",o=r?.image??e?.meta.ogImage??e?.featuredImage,s=[{name:"twitter:card",content:t.cardType},{name:"twitter:title",content:n},{name:"twitter:description",content:i}];return t.site&&s.push({name:"twitter:site",content:t.site}),t.creator&&s.push({name:"twitter:creator",content:t.creator}),o&&(s.push({name:"twitter:image",content:o}),e?.featuredImageAlt),s}function _r(e){let t=[];return t.push(`<title>${T(e.title)}</title>`),e.meta.forEach(r=>{let n=[];r.name&&n.push(`name="${T(r.name)}"`),r.property&&n.push(`property="${T(r.property)}"`),r.httpEquiv&&n.push(`http-equiv="${T(r.httpEquiv)}"`),n.push(`content="${T(r.content)}"`),t.push(`<meta ${n.join(" ")} />`);}),e.openGraph.forEach(r=>{t.push(`<meta property="${T(r.property)}" content="${T(r.content)}" />`);}),e.twitter.forEach(r=>{t.push(`<meta name="${T(r.name)}" content="${T(r.content)}" />`);}),e.links.forEach(r=>{let n=[];n.push(`rel="${T(r.rel)}"`),n.push(`href="${T(r.href)}"`),r.type&&n.push(`type="${T(r.type)}"`),r.title&&n.push(`title="${T(r.title)}"`),t.push(`<link ${n.join(" ")} />`);}),t.join(`
26
+ `)}function T(e){let t={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;"};return e.replace(/[&<>"']/g,r=>t[r]??r)}function Br(e){let t=[],r=[];return e.title?e.title.length>60?r.push("Title longer than 60 characters may be truncated in search results"):e.title.length<30&&r.push("Title shorter than 30 characters may not be descriptive enough"):t.push("Title is required"),e.description?e.description.length>160?r.push("Meta description longer than 160 characters may be truncated"):e.description.length<120&&r.push("Meta description shorter than 120 characters may not be descriptive enough"):t.push("Meta description is required"),e.canonicalUrl?e.canonicalUrl.startsWith("https://")||r.push("Canonical URL should use HTTPS for better SEO"):t.push("Canonical URL is required"),e.openGraph.find(o=>o.property==="og:image")||r.push("OpenGraph image missing - social media sharing will not show image preview"),e.twitter.find(o=>o.name==="twitter:card")||r.push("Twitter Card type missing - Twitter sharing may not display properly"),{valid:t.length===0,errors:t,warnings:r}}async function Me(e,t,r=[],n={}){let{includeAuthorPages:i=true,includePaginationPages:o=true,articlesPerPage:s=10,maxEntries:a=5e4,changeFrequency:c={},priority:l={}}=n,d=[],p=q(n.canonical?.domain??e.domain,n.canonical?.forceHttps??true),P=n.canonical?.pathPrefix??"/blog";if(d.push({url:`${p}${P}`,lastModified:z(t),changeFrequency:c.homePage??"daily",priority:l.homePage??1}),t.forEach(f=>{if(d.length>=a)return;let m=H(f,n.canonical);d.push({url:m,lastModified:f.updatedAt,changeFrequency:c.articles??"monthly",priority:l.articles??.8});}),i&&r.forEach(f=>{if(d.length>=a)return;let m=`${p}${P}/authors/${f.slug}`,g=t.filter(C=>C.author?.id===f.id),x=z(g);d.push({url:m,lastModified:x,changeFrequency:c.authorPages??"weekly",priority:l.authorPages??.6});}),o&&t.length>s){let f=Math.ceil(t.length/s);for(let m=2;m<=f&&!(d.length>=a);m++)d.push({url:`${p}${P}?page=${m}`,lastModified:z(t),changeFrequency:c.paginationPages??"daily",priority:l.paginationPages??.5});}return d}function kr(e,t,r=[],n={}){let{includeAuthorPages:i=true,includePaginationPages:o=true,articlesPerPage:s=10,maxEntries:a=5e4,changeFrequency:c={},priority:l={}}=n,d=[],p=q(n.canonical?.domain??e.domain,n.canonical?.forceHttps??true),P=n.canonical?.pathPrefix??"/blog",f=new Date().toISOString(),m=1;if(m+=t.length,i&&(m+=r.length),o&&t.length>s){let x=Math.ceil(t.length/s);m+=x-1;}let g=m>a;if(d.push({loc:`${p}${P}`,lastmod:z(t),changefreq:c.homePage??"daily",priority:l.homePage??1}),t.forEach(x=>{if(d.length>=a)return;let C=H(x,n.canonical);d.push({loc:C,lastmod:x.updatedAt,changefreq:c.articles??"monthly",priority:l.articles??.8});}),i&&r.forEach(x=>{if(d.length>=a)return;let C=`${p}${P}/authors/${x.slug}`,dt=t.filter(gt=>gt.author?.id===x.id),pt=z(dt);d.push({loc:C,lastmod:pt,changefreq:c.authorPages??"weekly",priority:l.authorPages??.6});}),o&&t.length>s){let x=Math.ceil(t.length/s);for(let C=2;C<=x&&!(d.length>=a);C++)d.push({loc:`${p}${P}?page=${C}`,lastmod:z(t),changefreq:c.paginationPages??"daily",priority:l.paginationPages??.5});}return {entries:d,totalEntries:d.length,truncated:g,generatedAt:f,baseUrl:p}}function ot(e){let t='<?xml version="1.0" encoding="UTF-8"?>',r='<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">',n="</urlset>",i=e.entries.map(o=>{let s=[];return s.push(" <url>"),s.push(` <loc>${oe(o.loc)}</loc>`),o.lastmod&&s.push(` <lastmod>${oe(o.lastmod)}</lastmod>`),o.changefreq&&s.push(` <changefreq>${oe(o.changefreq)}</changefreq>`),o.priority!==void 0&&s.push(` <priority>${o.priority.toFixed(1)}</priority>`),s.push(" </url>"),s.join(`
27
+ `)});return [t,r,...i,n].join(`
28
+ `)}function Er(e,t){let r='<?xml version="1.0" encoding="UTF-8"?>',n='<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">',i="</sitemapindex>",o=e.map(s=>{let a=[];return a.push(" <sitemap>"),a.push(` <loc>${oe(s.url)}</loc>`),s.lastmod&&a.push(` <lastmod>${oe(s.lastmod)}</lastmod>`),a.push(" </sitemap>"),a.join(`
29
+ `)});return [r,n,...o,i].join(`
30
+ `)}function Ir(e){let t=[],r=[];e.entries.length===0?t.push("Sitemap must contain at least one URL"):e.entries.length>5e4&&t.push("Sitemap contains more than 50,000 URLs (Google limit)"),e.truncated&&r.push("Sitemap was truncated due to size limits"),e.entries.forEach((i,o)=>{try{new URL(i.loc);}catch{t.push(`Invalid URL at entry ${o+1}: ${i.loc}`);}i.priority!==void 0&&(i.priority<0||i.priority>1)&&t.push(`Invalid priority at entry ${o+1}: must be between 0.0 and 1.0`),i.lastmod&&!$r(i.lastmod)&&t.push(`Invalid lastmod date at entry ${o+1}: ${i.lastmod}`),i.loc.length>2048&&r.push(`URL at entry ${o+1} exceeds 2048 character limit`);});let n=new Map;return e.entries.forEach(i=>{let o=n.get(i.loc)??0;n.set(i.loc,o+1);}),n.forEach((i,o)=>{i>1&&t.push(`Duplicate URL found: ${o} (appears ${i} times)`);}),{valid:t.length===0,errors:t,warnings:r}}function z(e){return e.length===0?new Date().toISOString():e.reduce((r,n)=>{let i=new Date(n.updatedAt);return i>r?i:r},new Date(e[0].updatedAt)).toISOString()}function Mr(e,t,r=[],n={}){return async function(){let s=(await Me(e,t,r,n)).map(l=>({loc:l.url,lastmod:typeof l.lastModified=="string"?l.lastModified:l.lastModified?.toISOString(),changefreq:l.changeFrequency,priority:l.priority})),a={entries:s,totalEntries:s.length,generatedAt:new Date().toISOString(),baseUrl:q(n.canonical?.domain??e.domain,n.canonical?.forceHttps??true)},c=ot(a);return new Response(c,{headers:{"Content-Type":"application/xml","Cache-Control":"public, max-age=3600, s-maxage=3600"}})}}function Dr(e){return async function(){let r=await e.getSite(),n=await e.getArticles(),i=e.getAuthors?await e.getAuthors():[];return Me(r,n,i,e.options)}}function oe(e){let t={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;"};return e.replace(/[&<>"']/g,r=>t[r]??r)}function $r(e){try{let t=new Date(e),r=t.toISOString(),n=e.endsWith("Z")&&!e.includes(".")?e.replace("Z",".000Z"):e;return r===n&&!isNaN(t.getTime())}catch{return false}}var W={name:"@xexr/blog-platform",version:"1.0.3"};function it(e){let r=e.replace(/^v/,"").split(".");if(r.length<3)throw new Error(`Invalid version format: ${e}`);let n=parseInt(r[0]??"0",10),i=parseInt(r[1]??"0",10),o=parseInt(r[2]?.split("-")[0]??"0",10);if(isNaN(n)||isNaN(i)||isNaN(o))throw new Error(`Invalid version format: ${e}`);return {major:n,minor:i,patch:o}}function L(){let e=it(W.version);return {name:W.name,version:W.version,...e}}function $(e){try{let t=e.split(" "),r={};for(let n of t){let[i,o]=n.split("/");if(!i||!o)continue;let s=it(o),a={name:i,version:o,...s};i==="bloggy"?r.bloggyVersion=a:i==="platform"&&(r.platformVersion=a);}return r}catch{return null}}function st(e,t){try{return e.major!==t.major?{compatible:!1,errorCode:"PUB009",errorMessage:`Major version incompatibility: ${e.name} ${e.version} is not compatible with ${t.name} ${t.version}. Please upgrade.`}:e.minor!==t.minor?{compatible:!0,errorCode:"PUB010",warning:`Minor version difference: ${e.name} ${e.version} with ${t.name} ${t.version}. Some features may not be available.`}:{compatible:!0}}catch(r){return {compatible:false,errorMessage:`Failed to check version compatibility: ${r instanceof Error?r.message:"Unknown error"}`}}}var at={enableCSP:true,cspDirectives:{"default-src":"'self'","script-src":"'self' 'unsafe-inline'","style-src":"'self' 'unsafe-inline'","img-src":"'self' data: https:","font-src":"'self' https:","connect-src":"'self'","media-src":"'self'","object-src":"'none'","base-uri":"'self'","form-action":"'self'","frame-ancestors":"'none'","upgrade-insecure-requests":""},enableFrameOptions:true,frameOptions:"DENY",enableContentTypeOptions:true,enableXSSProtection:true,enableReferrerPolicy:true,referrerPolicy:"strict-origin-when-cross-origin",enableHSTS:true,hstsMaxAge:31536e3,hstsIncludeSubdomains:true,enablePermissionsPolicy:true,permissionsPolicyDirectives:{camera:"()",microphone:"()",geolocation:"()",payment:"()",usb:"()",accelerometer:"()",gyroscope:"()",magnetometer:"()"}};function Vr(){let e=process.env.BLOG_PLATFORM_DISABLE_CSP==="true",t=process.env.BLOG_PLATFORM_FRAME_OPTIONS,r=process.env.BLOG_PLATFORM_DISABLE_HSTS==="true";return {...at,enableCSP:!e,frameOptions:t??at.frameOptions,enableHSTS:!r}}function Hr(e){return Object.entries(e).map(([t,r])=>r?`${t} ${r}`:t).join("; ")}function Gr(e){return Object.entries(e).map(([t,r])=>`${t}=${r}`).join(", ")}function jr(e,t={}){let r={...Vr(),...t},n={};if(r.enableCSP){let i={...r.cspDirectives,...t.cspDirectives??{}};n["Content-Security-Policy"]=Hr(i);}if(r.enableFrameOptions&&(n["X-Frame-Options"]=r.frameOptions),r.enableContentTypeOptions&&(n["X-Content-Type-Options"]="nosniff"),r.enableXSSProtection&&(n["X-XSS-Protection"]="1; mode=block"),r.enableReferrerPolicy&&(n["Referrer-Policy"]=r.referrerPolicy),r.enableHSTS&&Fr(e)){let i=[`max-age=${r.hstsMaxAge}`,r.hstsIncludeSubdomains?"includeSubDomains":""].filter(Boolean).join("; ");n["Strict-Transport-Security"]=i;}if(r.enablePermissionsPolicy){let i={...r.permissionsPolicyDirectives,...t.permissionsPolicyDirectives??{}};n["Permissions-Policy"]=Gr(i);}return n}function Fr(e){return !!(e.url.startsWith("https://")||e.headers.get("x-forwarded-proto")==="https"||e.headers.get("cf-visitor")?.includes('"scheme":"https"'))}function be(e,t={}){return jr(e,{...t,cspDirectives:{...{"default-src":"'none'","frame-ancestors":"'none'","base-uri":"'none'"},...t.cspDirectives??{}}})}var lt={allowedOrigins:["http://localhost:3000","https://localhost:3000","http://127.0.0.1:3000","https://127.0.0.1:3000"],allowWildcard:false,allowCredentials:false,maxAge:86400,securityConfig:{}};function ct(){let e=process.env.BLOG_PLATFORM_ALLOWED_ORIGINS,t=process.env.BLOG_PLATFORM_ALLOW_WILDCARD==="true",r=process.env.BLOG_PLATFORM_ALLOW_CREDENTIALS==="true";return {...lt,allowedOrigins:e?e.split(",").map(n=>n.trim()):lt.allowedOrigins,allowWildcard:t,allowCredentials:r}}function ut(e,t){return e?t.allowWildcard?true:t.allowedOrigins.includes(e):false}function mt(e,t){let r=e.headers.get("origin"),n={};return t.allowWildcard?n["Access-Control-Allow-Origin"]="*":r&&ut(r,t)&&(n["Access-Control-Allow-Origin"]=r),t.allowCredentials&&!t.allowWildcard&&(n["Access-Control-Allow-Credentials"]="true"),t.allowWildcard||(n.Vary="Origin"),n}function qr(e,t,r,n){return {...mt(e,t),"Access-Control-Allow-Methods":r.join(", "),"Access-Control-Allow-Headers":n.join(", "),"Access-Control-Max-Age":t.maxAge.toString()}}var zr=["Content-Type","X-Bloggy-Version","X-Idempotency-Key","Authorization","X-Requested-With"];function b(e,t,r={}){let{status:n=200,headers:i={},corsConfig:o={}}=r,s={...ct(),...o},a=mt(e,s),c=be(e,s.securityConfig),l={"Content-Type":"application/json",...a,...c,...i};return server.NextResponse.json(t,{status:n,headers:l})}function ie(e,t,r={}){let{allowedHeaders:n=zr,corsConfig:i={}}=r,o={...ct(),...i},s=e.headers.get("origin");if(s&&!o.allowWildcard&&!ut(s,o)){let l=be(e,o.securityConfig);return new server.NextResponse(null,{status:403,headers:{"Content-Type":"text/plain",...l}})}let a=qr(e,o,[...t,"OPTIONS"],n),c=be(e,o.securityConfig);return new server.NextResponse(null,{status:200,headers:{...a,...c}})}async function Wr(e){try{let t=await k(e);if(!t.authenticated){let g=await M(e);return b(e,g.error,{status:401})}let r=t.token??"anonymous",n=await E(r);if(!n.allowed){let g=n.errorResponse.error?.details?.rateLimit,x=g&&typeof g=="object"&&"limit"in g&&"remaining"in g&&"reset"in g&&"count"in g&&"success"in g?g:{limit:10,remaining:0,reset:Date.now()+6e4,count:10,success:!1},C=N(x);return b(e,n.errorResponse,{status:429,headers:C})}if(!e.headers.get("content-type")?.includes("application/json"))return b(e,{success:!1,error:{code:"PUB001",message:"Content-Type must be application/json"},idempotencyKey:""},{status:400});let o;try{o=await e.json();}catch{return b(e,{success:!1,error:{code:"PUB001",message:"Invalid JSON in request body"},idempotencyKey:""},{status:400})}let s=Xr(o);if(s.length>0)return b(e,{success:!1,error:{code:"PUB001",message:"Missing required fields",details:{errors:s}},idempotencyKey:o.idempotencyKey??""},{status:400});let a=e.headers.get("X-Bloggy-Version");if(a){let g=$(a);if(g?.platformVersion){let x=L();if(g.platformVersion.major!==x.major)return b(e,{success:!1,error:{code:"PUB009",message:"Major version incompatibility. Please upgrade your blog platform package.",details:{clientVersion:g.platformVersion.version,serverVersion:x.version}},idempotencyKey:o.idempotencyKey},{status:409})}}if(o.dryRun){let g=[];return o.article.wordCount<50&&g.push("Article has fewer than 50 words, which may affect SEO"),(!o.article.excerpt||o.article.excerpt.length<120)&&g.push("Article excerpt is shorter than recommended 120 characters"),o.article.meta.keywords.length||g.push("No SEO keywords provided"),b(e,{success:!0,warnings:g,idempotencyKey:o.idempotencyKey},{status:200})}let c={...o.article,slug:o.slug??o.article.slug,meta:{...o.article.meta,description:o.metaDescription??o.article.meta.description}};if(!$e(c.slug))return b(e,{success:!1,error:{code:"PUB002",message:"Slug can only contain lowercase letters, numbers, and hyphens"},idempotencyKey:o.idempotencyKey},{status:400});let d=await D().saveArticle(c,o.idempotencyKey),p=L(),P=N(n.rateLimitResult),f={"X-Bloggy-Version":`platform/${p.version}`,"X-Idempotency-Key":o.idempotencyKey,...P};d.success&&(f.Location=d.url??`/${c.slug}`);let m=d.success?201:d.error?.code==="PUB003"?409:400;return b(e,d,{status:m,headers:f})}catch(t){return console.error("Publish endpoint error:",t),b(e,{success:false,error:{code:"PUB007",message:"Internal server error during publishing"},idempotencyKey:""},{status:500})}}function Xr(e){let t=[];if(!e||typeof e!="object")return t.push("Request body must be a valid object"),t;let r=e;if((!r.article||typeof r.article!="object")&&t.push("Missing required field: article"),(!r.idempotencyKey||typeof r.idempotencyKey!="string")&&t.push("Missing required field: idempotencyKey"),r.article&&typeof r.article=="object"){let n=r.article,i=["id","slug","title","content","publishedAt","site"];for(let o of i)n[o]||t.push(`Missing required article field: ${o}`);if(n.site&&typeof n.site=="object"){let o=n.site,s=["id","name","domain"];for(let a of s)o[a]||t.push(`Missing required site field: ${a}`);}if(n.meta&&typeof n.meta=="object"){let o=n.meta;Array.isArray(o.keywords)||t.push("Article meta.keywords must be an array");}}return t}function $e(e){return !e||typeof e!="string"?false:/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(e)&&e.length>=1&&e.length<=100}async function Jr(e){try{let t=await k(e);if(!t.authenticated){let m=await M(e);return server.NextResponse.json(m.error,{status:401})}let r=t.token??"anonymous",n=await E(r);if(!n.allowed){let m=n.errorResponse.error?.details?.rateLimit,g=m&&typeof m=="object"&&"limit"in m&&"remaining"in m&&"reset"in m&&"count"in m&&"success"in m?m:{limit:10,remaining:0,reset:Date.now()+6e4,count:10,success:!1},x=N(g);return b(e,n.errorResponse,{status:429,headers:x})}if(!e.headers.get("content-type")?.includes("application/json"))return b(e,{success:!1,error:{code:"PUB001",message:"Content-Type must be application/json"},idempotencyKey:""},{status:400});let o;try{o=await e.json();}catch{return b(e,{success:!1,error:{code:"PUB001",message:"Invalid JSON in request body"},idempotencyKey:""},{status:400})}let s=Yr(o);if(s.length>0)return b(e,{success:!1,error:{code:"PUB001",message:"Missing required fields",details:{errors:s}},idempotencyKey:o.idempotencyKey??""},{status:400});let a=e.headers.get("X-Bloggy-Version");if(a){let m=$(a);if(m?.platformVersion){let g=L();if(m.platformVersion.major!==g.major)return b(e,{success:!1,error:{code:"PUB009",message:"Major version incompatibility. Please upgrade your blog platform package.",details:{clientVersion:m.platformVersion.version,serverVersion:g.version}},idempotencyKey:o.idempotencyKey},{status:409})}}if(!Qr(o.slug))return b(e,{success:!1,error:{code:"PUB002",message:"Slug can only contain lowercase letters, numbers, and hyphens"},idempotencyKey:o.idempotencyKey},{status:400});if(o.dryRun){let g=await D().getArticle(o.slug),x=[];return g||x.push("Article with this slug does not exist"),b(e,{success:!0,warnings:x,idempotencyKey:o.idempotencyKey},{status:200})}let l=await D().removeArticle(o.slug,o.idempotencyKey),d=L(),p=N(n.rateLimitResult),P={"X-Bloggy-Version":`platform/${d.version}`,"X-Idempotency-Key":o.idempotencyKey,...p},f=l.success?200:l.error?.code==="PUB007"?404:400;return b(e,l,{status:f,headers:P})}catch(t){return console.error("Unpublish endpoint error:",t),b(e,{success:false,error:{code:"PUB007",message:"Internal server error during unpublishing"},idempotencyKey:""},{status:500})}}function Yr(e){let t=[];if(!e||typeof e!="object")return t.push("Request body must be a valid object"),t;let r=e;return (!r.slug||typeof r.slug!="string")&&t.push("Missing required field: slug"),(!r.idempotencyKey||typeof r.idempotencyKey!="string")&&t.push("Missing required field: idempotencyKey"),r.slug&&typeof r.slug=="string"&&!r.slug.trim()&&t.push("Slug cannot be empty"),t}function Qr(e){return !e||typeof e!="string"?false:/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(e)&&e.length>=1&&e.length<=100}async function Zr(e){try{let t=await k(e);if(!t.authenticated){let p=await M(e),P={success:!1,versions:{bloggy:{name:"unknown",version:"unknown",major:0,minor:0,patch:0},platform:{name:"unknown",version:"unknown",major:0,minor:0,patch:0}},compatibility:{compatible:!1,errorMessage:p.error?.error?.message??"Authentication required"}};return b(e,P,{status:401})}let r=t.token??"anonymous",n=await E(r);if(!n.allowed){let p=n.errorResponse.error?.details?.rateLimit,P=p&&typeof p=="object"&&"limit"in p&&"remaining"in p&&"reset"in p&&"count"in p&&"success"in p?p:{limit:10,remaining:0,reset:Date.now()+6e4,count:10,success:!1},f=N(P),m={success:!1,versions:{bloggy:{name:"unknown",version:"unknown",major:0,minor:0,patch:0},platform:{name:"unknown",version:"unknown",major:0,minor:0,patch:0}},compatibility:{compatible:!1,errorMessage:n.errorResponse.error?.message??"Rate limit exceeded"}};return b(e,m,{status:429,headers:f})}let i=L(),o=e.headers.get("X-Bloggy-Version"),s={name:"unknown",version:"unknown",major:0,minor:0,patch:0};if(o)try{if(/^\d+\.\d+\.\d+/.test(o)){let p=o.split("."),P=parseInt(p[0]??"0",10),f=parseInt(p[1]??"0",10),m=parseInt(p[2]?.split("-")[0]??"0",10);s={name:"bloggy",version:o,major:P,minor:f,patch:m};}else {let p=$(o);p?.bloggyVersion&&(s=p.bloggyVersion);}}catch(p){console.warn("Failed to parse X-Bloggy-Version header:",p);}let a={compatible:!0};s.version!=="unknown"&&(a=st(s,i));let c={success:!0,versions:{bloggy:s,platform:i},compatibility:a},l=N(n.rateLimitResult),d={"X-Bloggy-Version":`platform/${i.version}`,"Cache-Control":"public, max-age=300, stale-while-revalidate=60",...l};return b(e,c,{status:200,headers:d})}catch(t){console.error("Version endpoint error:",t);let r={success:false,versions:{bloggy:{name:"unknown",version:"unknown",major:0,minor:0,patch:0},platform:{name:"unknown",version:"unknown",major:0,minor:0,patch:0}},compatibility:{compatible:false,errorMessage:"Internal server error while checking version compatibility"},error:t instanceof Error?t.message:"Unknown error"};return b(e,r,{status:500})}}async function tn(e,{params:t}){try{let{slug:r}=await t,n=await k(e);if(!n.authenticated){let g=await M(e);return server.NextResponse.json(g.error,{status:401})}let i=n.token??"anonymous",o=await E(i);if(!o.allowed){let g=o.errorResponse.error?.details?.rateLimit||{limit:10,remaining:0,reset:Date.now()+6e4,count:10,success:!1},x=N(g);return b(e,o.errorResponse,{status:429,headers:x})}if(!r||!$e(r))return b(e,{exists:!1,error:{code:"PUB002",message:"Invalid slug format. Must be lowercase letters, numbers, and hyphens only."}},{status:400});let s=e.headers.get("X-Bloggy-Version");if(s){let g=$(s);if(g?.platformVersion){let x=L();if(g.platformVersion.major!==x.major)return b(e,{exists:!1,error:{code:"PUB009",message:"Major version incompatibility. Please upgrade your blog platform package.",details:{clientVersion:g.platformVersion.version,serverVersion:x.version}}},{status:409})}}let l=await D().getArticle(r)!==null,d={exists:l,...l&&{message:"Slug is already in use. Please choose another (e.g., append '-v2')."}},p=L(),P=N(o.rateLimitResult),f={"X-Bloggy-Version":`platform/${p.version}`,...P},m=e.headers.get("X-Idempotency-Key");return m&&(f["X-Idempotency-Key"]=m,console.log(`Slug check for idempotency: ${m}, exists: ${l}`)),b(e,d,{status:200,headers:f})}catch(r){return console.error("Slug existence check error:",r instanceof Error?r.message:String(r)),b(e,{exists:false,error:{code:"PUB007",message:"Internal server error during slug check"}},{status:500})}}async function rn(e){return ie(e,["GET"])}var ai=W.version;
31
+ exports.ApiKeyAuth=me;exports.BlogArticlePage=Ye;exports.BlogHomePage=We;exports.Button=yt;exports.Card=Q;exports.CardContent=Z;exports.CardDescription=Ft;exports.CardFooter=qt;exports.CardHeader=Gt;exports.CardTitle=jt;exports.DrizzleStorage=Ie;exports.EnvAuth=j;exports.InMemoryStorage=ge;exports.NoAuth=re;exports.PACKAGE_VERSION=ai;exports.Pagination=le;exports.PaginationContent=ye;exports.PaginationEllipsis=ae;exports.PaginationItem=B;exports.PaginationLink=U;exports.PaginationNext=ve;exports.PaginationPrevious=Pe;exports.ShadcnPagination=xe;exports.StructuredDataError=K;exports.UninitializedAuth=de;exports.autoConfigureRateLimit=Ee;exports.bpArticles=S;exports.bpOperations=F;exports.buildBlogPath=V;exports.buttonVariants=se;exports.checkRateLimit=Ze;exports.cn=v;exports.configureRateLimit=fe;exports.createBlogSitemapRoute=Mr;exports.createDynamicBlogSitemap=Dr;exports.createRateLimitErrorResponse=et;exports.createStructuredDataScript=J;exports.enforceRateLimit=E;exports.extractKeywordsFromArticle=Ct;exports.extractTableOfContents=Ce;exports.extractTokenFromHeader=_e;exports.formatArticleDateMeta=Te;exports.generateArticleMetadata=sr;exports.generateArticleStructuredData=ce;exports.generateAuthorStructuredData=Ve;exports.generateBlogHomeMetadata=$t;exports.generateBlogHomeStructuredData=Ne;exports.generateBlogSitemapEntries=Me;exports.generateBreadcrumbStructuredData=He;exports.generateCanonicalUrl=H;exports.generateCanonicalUrlFromSlug=wr;exports.generateCompleteArticleStructuredData=we;exports.generateOrganizationStructuredData=Re;exports.generatePaginationMetadata=Tt;exports.generateSiteMetadata=Lr;exports.generateSitemap=kr;exports.generateSitemapIndex=Er;exports.generateWebSiteStructuredData=Ae;exports.getAuthConfig=Be;exports.getBaseUrl=Tr;exports.getBlogThemeStyle=Y;exports.getDrizzleAdapterSql=Ar;exports.getPathPrefixFromBlogUrl=Ot;exports.getRateLimitHeaders=N;exports.getStorage=D;exports.initBlogPlatform=he;exports.initBlogPlatformDev=br;exports.initBlogPlatformOnce=hr;exports.initBlogPlatformProd=xr;exports.initEnvAuth=lr;exports.isValidCanonicalUrl=Nr;exports.metadataToHtml=_r;exports.normalizeBlogBasePath=I;exports.normalizeDomain=q;exports.normalizeSlug=nt;exports.publishHandler=Wr;exports.safeGenerateArticleStructuredData=Lt;exports.setAuthConfig=pe;exports.setStorage=ke;exports.shouldSkipAuth=ur;exports.sitemapToXml=ot;exports.slugExistsHandler=tn;exports.slugExistsOptionsHandler=rn;exports.structuredDataToJsonLd=je;exports.unpublishHandler=Jr;exports.updateArticleCanonicalUrl=Cr;exports.usePagination=Nt;exports.validateMetadata=Br;exports.validateSitemap=Ir;exports.validateStructuredData=Ge;exports.versionHandler=Zr;//# sourceMappingURL=index.js.map
31
32
  //# sourceMappingURL=index.js.map