@xexr/blog-platform 1.0.7 → 1.0.8

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.
Files changed (42) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/app/blog/[slug]/page.d.ts +68 -0
  3. package/dist/app/blog/[slug]/page.tsx +155 -113
  4. package/dist/components/ArticleReadingProgress.tsx +208 -0
  5. package/dist/components/ArticleTopActions.tsx +179 -0
  6. package/dist/components/AuthorByline.tsx +569 -0
  7. package/dist/components/ExpandableArticleImage.tsx +79 -0
  8. package/dist/components/Pagination.tsx +236 -0
  9. package/dist/components/TopicArchivePages.tsx +204 -0
  10. package/dist/components/ui/badge.tsx +36 -0
  11. package/dist/components/ui/button.tsx +59 -0
  12. package/dist/components/ui/card.tsx +92 -0
  13. package/dist/components/ui/pagination.tsx +127 -0
  14. package/dist/components/ui/separator.tsx +29 -0
  15. package/dist/index.d.mts +59 -69
  16. package/dist/index.d.ts +59 -69
  17. package/dist/index.js +83 -8
  18. package/dist/index.js.map +1 -1
  19. package/dist/index.mjs +83 -8
  20. package/dist/index.mjs.map +1 -1
  21. package/dist/lib/article-ui.ts +158 -0
  22. package/dist/lib/auth.ts +354 -0
  23. package/dist/lib/cors.ts +243 -0
  24. package/dist/lib/database.ts +277 -0
  25. package/dist/lib/init.ts +186 -0
  26. package/dist/lib/mdx.ts +73 -0
  27. package/dist/lib/metadata.ts +558 -0
  28. package/dist/lib/ratelimit.ts +224 -0
  29. package/dist/lib/security-headers.ts +322 -0
  30. package/dist/lib/seo.ts +295 -0
  31. package/dist/lib/sitemap.ts +719 -0
  32. package/dist/lib/storage/drizzle.ts +400 -0
  33. package/dist/lib/structured-data.ts +608 -0
  34. package/dist/lib/topics.ts +56 -0
  35. package/dist/lib/urls.ts +29 -0
  36. package/dist/lib/utils.ts +6 -0
  37. package/dist/lib/version.ts +154 -0
  38. package/dist/types/contracts.ts +256 -0
  39. package/dist/types/index.d.mts +18 -1
  40. package/dist/types/index.d.ts +18 -1
  41. package/dist/types/index.ts +16 -0
  42. package/package.json +14 -9
package/dist/index.mjs CHANGED
@@ -1,7 +1,82 @@
1
- import W from'next/link';import ke from'next/image';import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import {ChevronLeftIcon,ChevronRightIcon,MoreHorizontalIcon,ChevronsLeft,ChevronsRight,ArrowLeft,ArrowUpRight,Share2,Mail}from'lucide-react';import {Slot}from'@radix-ui/react-slot';import {cva}from'class-variance-authority';import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {format,formatDistanceToNow}from'date-fns';import {MDXRemote}from'next-mdx-remote-client/rsc';import*as at from'react';import*as Ee from'@radix-ui/react-separator';import mr from'remark-gfm';import dr from'remark-toc';import pr from'rehype-slug';import {Ratelimit}from'@upstash/ratelimit';import {Redis}from'@upstash/redis';import {eq,and,desc,sql}from'drizzle-orm';import {sqliteTable,integer,text,uniqueIndex}from'drizzle-orm/sqlite-core';import {NextResponse}from'next/server';function h(...e){return twMerge(clsx(e))}var ue=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 It({className:e,variant:t,size:r,asChild:n=false,...i}){return jsx(n?Slot:"button",{"data-slot":"button",className:h(ue({variant:t,size:r,className:e})),...i})}function Ae({className:e,...t}){return jsx("nav",{role:"navigation","aria-label":"pagination","data-slot":"pagination",className:h("mx-auto flex w-full justify-center",e),...t})}function Se({className:e,...t}){return jsx("ul",{"data-slot":"pagination-content",className:h("flex flex-row items-center gap-1",e),...t})}function E({...e}){return jsx("li",{"data-slot":"pagination-item",...e})}function j({className:e,isActive:t,size:r="icon",...n}){return jsx("a",{"aria-current":t?"page":void 0,"data-slot":"pagination-link","data-active":t,className:h(ue({variant:t?"outline":"ghost",size:r}),e),...n})}function Re({className:e,...t}){return jsxs(j,{"aria-label":"Go to previous page",size:"default",className:h("gap-1 px-2.5 sm:pl-2.5",e),...t,children:[jsx(ChevronLeftIcon,{}),jsx("span",{className:"hidden sm:block",children:"Previous"})]})}function we({className:e,...t}){return jsxs(j,{"aria-label":"Go to next page",size:"default",className:h("gap-1 px-2.5 sm:pr-2.5",e),...t,children:[jsx("span",{className:"hidden sm:block",children:"Next"}),jsx(ChevronRightIcon,{})]})}function me({className:e,...t}){return jsxs("span",{"aria-hidden":true,"data-slot":"pagination-ellipsis",className:h("flex size-9 items-center justify-center",e),...t,children:[jsx(MoreHorizontalIcon,{className:"size-4"}),jsx("span",{className:"sr-only",children:"More pages"})]})}function de({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),v=Math.min(t,g+i-1);return v-g+1<i&&(g=Math.max(1,v-i+1)),{start:g,end:v}},{start:u,end:l}=a(),d=Array.from({length:l-u+1},(m,g)=>u+g),p=m=>m===1?r:`${r}?page=${m}`,P=e>1,x=e<t;return jsxs(Ae,{className:n,children:[jsxs(Se,{children:[s&&e>2&&jsxs(Fragment,{children:[jsx(E,{children:jsx(j,{href:p(1),"aria-label":"Go to first page",children:jsx(ChevronsLeft,{className:"h-4 w-4"})})}),u>2&&jsx(E,{children:jsx(me,{})})]}),o&&jsx(E,{children:P?jsx(Re,{href:p(e-1)}):jsx("span",{className:"flex h-9 items-center justify-center gap-1 px-2.5 text-muted-foreground sm:pl-2.5",children:jsx("span",{className:"hidden sm:block",children:"Previous"})})}),d.map(m=>jsx(E,{children:jsx(j,{href:p(m),isActive:m===e,children:m})},m)),o&&jsx(E,{children:x?jsx(we,{href:p(e+1)}):jsx("span",{className:"flex h-9 items-center justify-center gap-1 px-2.5 text-muted-foreground sm:pr-2.5",children:jsx("span",{className:"hidden sm:block",children:"Next"})})}),s&&e<t-1&&jsxs(Fragment,{children:[l<t-1&&jsx(E,{children:jsx(me,{})}),jsx(E,{children:jsx(j,{href:p(t),"aria-label":"Go to last page",children:jsx(ChevronsRight,{className:"h-4 w-4"})})})]})]}),jsxs("div",{className:"sr-only","aria-live":"polite",children:["Page ",e," of ",t]})]})}function Vt(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 Gt(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 pe(e,t={}){let{customDomain:r,pathPrefix:n="/blog",language:i,isAccessibleForFree:o=true,includeOptionalProperties:s=true}=t,a=r??e.site.domain,u=r?`https://${a}${n}/${e.slug}`:e.meta.canonicalUrl??`https://${a}${n}/${e.slug}`,l=e.author?Je(e.author,{customDomain:r,pathPrefix:n}):void 0,d=Te(e.site,{customDomain:r,pathPrefix:n}),P=`PT${Math.max(1,Math.ceil(e.readingSeconds/60))}M`,x={"@context":"https://schema.org","@type":"BlogPosting","@id":`${u}#article`,headline:e.title,description:e.excerpt,datePublished:e.publishedAt,dateModified:e.updatedAt,author:l,publisher:d,mainEntityOfPage:{"@type":"WebPage","@id":u},wordCount:e.wordCount,timeRequired:P,isAccessibleForFree:o};return s&&(e.featuredImage&&(x.image=e.featuredImage),e.meta.keywords.length>0&&(x.keywords=[...e.meta.keywords]),(i??e.site.locale)&&(x.inLanguage=i??e.site.locale),e.site.toneAdjectives.length>0&&(x.about=e.site.toneAdjectives.map(m=>({"@type":"Thing",name:m}))),e.site.toneAdjectives.length>0&&(x.genre=[...e.site.toneAdjectives])),x}function Je(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.avatarUrl&&(i.image=e.avatarUrl),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 Te(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 Ce(e,t={}){let{customDomain:r,pathPrefix:n="/blog",language:i,includeSearchAction:o=true}=t,a=`https://${r??e.domain}${n}`,u=Te(e,t),l={"@context":"https://schema.org","@type":"WebSite","@id":`${a}#website`,name:e.name,url:a,publisher:u};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 Ye(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 Le(e,t={}){let r=[];r.push(pe(e,t)),r.push(Ce(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(Ye(i,t)),r}function Oe(e,t=[],r={}){let n=[];if(n.push(Ce(e,r)),t.length>0){let i=t.slice(0,5).map(o=>pe(o,r));n.push(...i);}return n}function Qe(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 Ze(e){return JSON.stringify(e,null,0)}function re(e){return {type:"application/ld+json",dangerouslySetInnerHTML:{__html:Ze(e)}}}function jt(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 te=class extends Error{constructor(r,n,i){super(r);this.code=n;this.details=i;this.name="StructuredDataError";}code;details};function Ft(e,t={}){try{let r=pe(e,t),n=Qe(r);return n.isValid?{schema:r}:{error:new te("Generated schema validation failed","VALIDATION_FAILED",n.errors)}}catch(r){return {error:new te("Failed to generate structured data","GENERATION_FAILED",r)}}}function _(e="/blog"){let t=e.trim();return !t||t==="/"?"":t.replace(/^(?!\/)/,"/").replace(/\/+$/,"")}function L(e,t){let r=_(e),n=t?.replace(/^\/+/,"").replace(/\/+$/,"");return n?`${r}/${n}`.replace(/\/+/g,"/"):r||"/"}function zt(e){let t=new URL(e);return _(t.pathname)}var q={accentColor:"hsl(var(--primary))",accentHoverColor:"hsl(var(--primary))",textAccentColor:"hsl(var(--primary))",textAccentHoverColor:"hsl(var(--primary))",accentBackgroundColor:"hsl(var(--primary) / 0.08)",accentBorderColor:"hsl(var(--primary) / 0.25)"};function $(e={}){return {"--blog-accent":e.accentColor??q.accentColor,"--blog-accent-hover":e.accentHoverColor??q.accentHoverColor,"--blog-text-accent":e.textAccentColor??e.accentColor??q.textAccentColor,"--blog-text-accent-hover":e.textAccentHoverColor??e.accentHoverColor??q.textAccentHoverColor,"--blog-accent-bg":e.accentBackgroundColor??q.accentBackgroundColor,"--blog-accent-border":e.accentBorderColor??q.accentBorderColor}}function _e(e,t){let r=new Date(e),n=new Date(t);return {publishedDateLabel:format(r,"d MMMM yyyy"),publishedRelativeLabel:formatDistanceToNow(r,{addSuffix:true}),updatedDateLabel:format(n,"d MMMM yyyy"),isUpdated:n.getTime()!==r.getTime()}}function Be(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=Xt(i[2]);o&&t.push({id:Wt(o),text:o,level:i[1].length});}return t}function tt(e){return `${e} ${e===1?"section":"sections"}`}function Xt(e){return e.replace(/\[([^\]]+)\]\([^)]+\)/g,"$1").replace(/[*_`~]/g,"").replace(/<[^>]+>/g,"").replace(/\s+/g," ").trim()}function Wt(e){return e.toLowerCase().replace(/[^a-z0-9\s-]/g,"").trim().replace(/\s+/g,"-").replace(/-+/g,"-")}function ot({articles:e,siteName:t,siteTagline:r,className:n,site:i,includeStructuredData:o=false,basePath:s="/blog",pagination:a,theme:u}){let l=_(s)||"/";return jsxs("div",{style:$(u),className:h("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&&jsxs("header",{className:"blog-header mb-8 text-center sm:mb-12 lg:mb-16",children:[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&&jsx("p",{className:"blog-tagline text-muted-foreground text-base sm:text-lg",children:r})]}),jsxs("main",{className:"articles-list",children:[e.length===0?jsxs("div",{className:"no-articles text-muted-foreground py-16 text-center sm:py-24 lg:py-32",children:[jsx("h2",{className:"mb-3 text-xl font-light sm:mb-4 sm:text-2xl lg:text-3xl",children:"No articles yet"}),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."})]}):jsx("div",{className:"space-y-0",children:e.map(d=>jsx(Qt,{article:d,basePath:l},d.id))}),a&&a.totalPages>1&&jsx("div",{className:"pagination-wrapper mt-12",children:jsx(de,{currentPage:a.currentPage,totalPages:a.totalPages,baseUrl:a.baseUrl??l,className:"justify-center"})})]}),o&&i&&(()=>{let d=re(Oe(i,e.slice(0,5),{pathPrefix:l}));return jsx("script",{type:d.type,dangerouslySetInnerHTML:d.dangerouslySetInnerHTML})})()]})}function Yt(e){return `${Math.ceil(e/60)} min read`}function Qt({article:e,basePath:t}){let r=L(t,e.slug),n=formatDistanceToNow(new Date(e.publishedAt),{addSuffix:true}),i=Yt(e.readingSeconds),o=e.featuredImage;return 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:jsxs(W,{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:[jsxs("div",{className:"space-y-4 lg:hidden",children:[o&&jsx("div",{className:"relative aspect-[16/10] w-full overflow-hidden rounded-2xl",children:jsx(ke,{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"})}),jsxs("div",{className:"space-y-3",children:[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}),jsxs("div",{className:"text-muted-foreground flex flex-wrap items-center gap-x-3 gap-y-1 text-sm",children:[e.author&&jsxs(Fragment,{children:[jsxs("span",{className:"inline-flex items-center gap-2 font-medium",children:[jsx(rt,{author:e.author,size:"sm"}),e.author.name]}),jsx("span",{className:"text-border",children:"\u2022"})]}),jsx("time",{dateTime:e.publishedAt,className:"font-medium","aria-label":`Published ${n}`,children:n}),jsx("span",{className:"text-border",children:"\u2022"}),jsx("span",{className:"font-medium",children:i})]}),e.excerpt&&jsx("p",{className:"text-muted-foreground line-clamp-3 text-sm leading-relaxed sm:text-base",children:e.excerpt}),(e.topics??[]).length>0&&jsx("div",{className:"flex flex-wrap gap-2",children:(e.topics??[]).map(s=>jsx("span",{className:"rounded-full border border-[var(--blog-accent-border)] px-2.5 py-1 text-xs font-medium text-[var(--blog-text-accent)]",children:s.name},s.id))})]})]}),jsxs("div",{className:"hidden items-start gap-6 lg:flex xl:gap-8",children:[o&&jsx("div",{className:"relative aspect-[16/10] w-64 shrink-0 overflow-hidden rounded-2xl xl:w-72",children:jsx(ke,{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"})}),jsxs("div",{className:"flex min-h-[180px] flex-1 flex-col justify-between space-y-4 xl:min-h-[200px]",children:[jsxs("div",{className:"space-y-4",children:[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&&jsx("p",{className:"text-muted-foreground line-clamp-3 text-base leading-relaxed xl:text-lg",children:e.excerpt}),(e.topics??[]).length>0&&jsx("div",{className:"flex flex-wrap gap-2",children:(e.topics??[]).map(s=>jsx("span",{className:"rounded-full border border-[var(--blog-accent-border)] px-2.5 py-1 text-xs font-medium text-[var(--blog-text-accent)]",children:s.name},s.id))})]}),jsxs("div",{className:"text-muted-foreground flex flex-wrap items-center gap-x-3 gap-y-1 text-sm",children:[e.author&&jsxs(Fragment,{children:[jsxs("span",{className:"inline-flex items-center gap-2 font-medium",children:[jsx(rt,{author:e.author,size:"sm"}),e.author.name]}),jsx("span",{className:"text-border",children:"\u2022"})]}),jsx("time",{dateTime:e.publishedAt,className:"font-medium","aria-label":`Published ${n}`,children:n}),jsx("span",{className:"text-border",children:"\u2022"}),jsx("span",{className:"font-medium",children:i})]})]})]})]})})}function rt({author:e,size:t}){let r=t==="md"?"h-9 w-9 text-sm":"h-6 w-6 text-xs",n=Zt(e.name);return e.avatarUrl?jsx(ke,{src:e.avatarUrl,alt:e.name,width:t==="md"?36:24,height:t==="md"?36:24,className:h("shrink-0 rounded-full object-cover",r),loading:"lazy"}):jsx("span",{className:h("bg-muted inline-flex shrink-0 items-center justify-center rounded-full font-medium",r),"aria-hidden":"true",children:n})}function Zt(e){return e.trim().split(/\s+/).filter(Boolean).slice(0,2).map(r=>r[0]?.toUpperCase()).join("")||"?"}function er(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.",u=_(i)||"/",l=r?`${r}${n&&n.currentPage>1?`${u}?page=${n.currentPage}`:u}`:void 0,d=n&&n.currentPage>1&&r?`${r}${n.currentPage===2?u:`${u}?page=${n.currentPage-1}`}`:void 0,p=n&&n.currentPage<n.totalPages&&r?`${r}${u}?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 rr=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 Ie({className:e,variant:t,...r}){return jsx("div",{className:h(rr({variant:t}),e),...r})}function ne({className:e,...t}){return jsx("div",{"data-slot":"card",className:h("bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm",e),...t})}function or({className:e,...t}){return jsx("div",{"data-slot":"card-header",className:h("@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 ir({className:e,...t}){return jsx("div",{"data-slot":"card-title",className:h("leading-none font-semibold",e),...t})}function sr({className:e,...t}){return jsx("div",{"data-slot":"card-description",className:h("text-muted-foreground text-sm",e),...t})}function oe({className:e,...t}){return jsx("div",{"data-slot":"card-content",className:h("px-6",e),...t})}function ar({className:e,...t}){return jsx("div",{"data-slot":"card-footer",className:h("flex items-center px-6 [.border-t]:pt-6",e),...t})}function st({alt:e="",className:t,src:r,...n}){if(typeof r!="string"||r.length===0)return jsx("img",{alt:e,className:t,...n});let i=`blog-image-preview-${lr(r)}`;return jsxs(Fragment,{children:[jsx("a",{href:`#${i}`,className:"group mx-auto block cursor-zoom-in rounded-2xl focus-visible:ring-2 focus-visible:ring-[var(--blog-text-accent)] focus-visible:ring-offset-2 focus-visible:outline-none","aria-label":e?`Expand image: ${e}`:"Expand article image",children:jsx("img",{src:r,alt:e,className:h("mx-auto rounded-2xl border border-[var(--blog-accent-border)] shadow-[0_18px_60px_rgb(168_85_247_/_0.12)] transition-opacity group-hover:opacity-95",t),...n})}),jsxs("div",{id:i,className:"invisible fixed inset-0 z-50 flex opacity-0 transition-opacity target:visible target:opacity-100",role:"dialog","aria-modal":"true","aria-label":e?`Image preview: ${e}`:"Image preview",children:[jsx("a",{href:"#article-content",className:"absolute inset-0 bg-black/85 backdrop-blur-sm","aria-label":"Close image preview"}),jsx("div",{className:"pointer-events-none relative z-10 flex min-h-screen w-full items-center justify-center p-4 sm:p-6",children:jsx("img",{src:r,alt:e,className:"pointer-events-auto h-[88vh] w-[94vw] rounded-3xl object-contain shadow-2xl"})}),jsx("a",{href:"#article-content",className:"absolute top-4 right-4 z-20 inline-flex size-10 items-center justify-center rounded-full border border-white/20 bg-black/50 text-xl leading-none text-white no-underline transition-colors hover:bg-white/10 focus-visible:ring-2 focus-visible:ring-white focus-visible:outline-none","aria-label":"Close image preview",children:"\xD7"})]})]})}function lr(e){let t=0;for(let r=0;r<e.length;r+=1)t=(t<<5)-t+e.charCodeAt(r),t|=0;return Math.abs(t).toString(36)}var ie=at.forwardRef(({className:e,orientation:t="horizontal",decorative:r=true,...n},i)=>jsx(Ee.Root,{ref:i,decorative:r,orientation:t,className:h("shrink-0 bg-border",t==="horizontal"?"h-[1px] w-full":"h-full w-[1px]",e),...n}));ie.displayName=Ee.Root.displayName;var lt={mdxOptions:{remarkPlugins:[dr,mr],rehypePlugins:[gr,pr]}};function gr(){return e=>{ct(e);}}function ct(e){e.children&&(e.children=e.children.flatMap(t=>(ct(t),fr(t)?t.children?.filter(Me)??[t]:[t])));}function fr(e){if(e.type!=="element"||e.tagName!=="p"||!e.children)return false;let t=e.children.filter(Me);return t.length===1&&hr(t[0])}function hr(e){if(e?.type!=="element")return false;if(e.tagName==="img")return true;if(e.tagName!=="a"||!e.children)return false;let t=e.children.filter(Me);return t.length===1&&t[0]?.tagName==="img"}function Me(e){return e.type!=="text"||!!e.value?.trim()}function Ar(e){return `${Math.ceil(e/60)} min read`}function dt({article:e,className:t,navigation:r,basePath:n="/blog",theme:i,postArticleCta:o,relatedArticles:s=[],showShareLinks:a=true}){let u=_(n)||"/",l=_e(e.publishedAt,e.updatedAt),d=Ar(e.readingSeconds),p=Be(e.content),P=e.meta.canonicalUrl??L(u,e.slug),x=e.featuredImage;return jsxs("article",{style:$(i),className:h("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&&jsx("header",{className:"mx-auto mb-8 max-w-4xl sm:mb-12 lg:mb-16",children:jsxs(W,{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:[jsx(ArrowLeft,{className:"h-4 w-4 transition-transform group-hover:-translate-x-1 sm:h-5 sm:w-5","aria-hidden":"true"}),jsxs("span",{className:"text-sm font-medium sm:text-base",children:[jsx("span",{className:"hidden sm:inline",children:r.backToHome.label??"Back to all articles"}),jsx("span",{className:"sm:hidden",children:"Back"})]})]})}),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:[jsx("h1",{className:"article-title bg-linear-to-br from-[var(--blog-accent-hover)] via-[var(--blog-text-accent)] to-fuchsia-200 bg-clip-text px-4 text-2xl leading-tight font-light tracking-tight text-balance text-transparent sm:px-0 sm:text-3xl md:text-4xl lg:text-5xl xl:text-6xl",children:e.title}),e.excerpt&&jsx("p",{className:"article-excerpt text-muted-foreground mx-auto mt-6 max-w-[42rem] px-4 text-lg leading-relaxed text-balance sm:mt-8 sm:max-w-[46rem] sm:px-0 sm:text-xl md:max-w-[52rem] md:text-2xl lg:max-w-4xl lg:text-2xl",children:e.excerpt}),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&&jsxs("div",{className:"flex items-center gap-2",children:[jsx("span",{className:"sr-only",children:"Author"}),jsx(mt,{author:e.author,size:"md"}),jsx("span",{className:"font-medium",children:e.author.name}),e.author.isGuest&&jsx(Ie,{variant:"outline",className:"text-xs",children:"Guest Author"})]}),jsxs("div",{className:"flex flex-wrap items-center justify-center gap-x-3 gap-y-1",children:[jsxs("time",{dateTime:e.publishedAt,className:"font-medium","aria-label":`Published ${l.publishedDateLabel}`,children:["Published ",l.publishedDateLabel]}),jsx("span",{className:"text-border",children:"\u2022"}),jsx("span",{className:"font-medium",children:l.publishedRelativeLabel}),jsx("span",{className:"text-border",children:"\u2022"}),jsx("span",{className:"font-medium",children:d})]}),l.isUpdated&&jsxs("time",{dateTime:e.updatedAt,className:"text-xs",children:["Updated ",l.updatedDateLabel]}),jsx("div",{className:"bg-border h-px w-6 sm:w-8","aria-hidden":"true"}),(e.topics??[]).length>0?jsx("nav",{"aria-label":"Article topics",className:"flex flex-wrap justify-center gap-2",children:(e.topics??[]).map(m=>jsx(W,{href:L((r?.backToHome?.url??"/blog").replace(/\/$/,""),`topics/${m.slug}`),className:"rounded-full border border-[var(--blog-accent-border)] bg-[var(--blog-accent-bg)] px-3 py-1 text-xs font-medium text-[var(--blog-text-accent)] transition-colors hover:border-[var(--blog-text-accent)] hover:text-[var(--blog-text-accent-hover)]",children:m.name},m.id))}):jsxs("span",{className:"text-xs tracking-wider uppercase sm:text-sm",role:"text",children:["From ",e.site.name]})]})]}),x&&jsx("div",{className:"article-featured-image mx-auto my-8 aspect-[16/9] w-full max-w-4xl overflow-hidden rounded-3xl border border-[var(--blog-accent-border)] shadow-[0_24px_80px_rgb(168_85_247_/_0.14)] sm:my-12 lg:my-16",children:jsx(ke,{src:x,alt:e.featuredImageAlt??`Featured image for ${e.title}`,className:"h-full w-full object-cover",width:800,height:450,priority:true})}),jsxs("div",{id:"article-content",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:[jsxs("div",{className:"min-w-0",children:[jsx(ut,{items:p,variant:"mobile"}),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-text-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-a:text-[var(--blog-text-accent)] prose-a:transition-colors hover:prose-a:text-[var(--blog-text-accent-hover)] max-w-none",children:jsx(MDXRemote,{source:e.content,options:lt,components:{img:st}})})]}),jsx(ut,{items:p,variant:"desktop"})]}),e.author?.bio&&jsxs("div",{className:"author-bio mx-auto mt-12 max-w-4xl",children:[jsx(ie,{className:"mb-8"}),jsx(ne,{className:"border-[var(--blog-accent-border)] bg-[var(--blog-accent-bg)]",children:jsxs(oe,{className:"flex flex-col gap-4 p-5 sm:flex-row sm:items-start sm:p-6",children:[jsx("div",{className:"shrink-0",children:jsx(mt,{author:e.author,size:"lg"})}),jsxs("div",{className:"min-w-0 space-y-2",children:[jsxs("div",{children:[jsx("p",{className:"text-muted-foreground text-sm font-medium",children:"Written by"}),jsxs("h2",{className:"text-foreground flex flex-wrap items-center gap-2 text-xl font-semibold",children:[e.author.name,e.author.isGuest&&jsx(Ie,{variant:"outline",className:"text-xs",children:"Guest Author"})]})]}),jsx("p",{className:"text-muted-foreground leading-relaxed",children:e.author.bio})]})]})})]}),((o??false)||a||s.length>0)&&jsxs("div",{className:"mx-auto mt-12 max-w-4xl space-y-8",children:[jsx(ie,{}),o&&jsx(Rr,{cta:o}),a&&jsx(wr,{title:e.title,url:P}),s.length>0&&jsx(Nr,{articles:s.slice(0,3),basePath:u})]}),(!!r?.previousArticle||!!r?.nextArticle)&&jsxs("nav",{className:"article-nav mx-auto mt-12 max-w-4xl",children:[jsx(ie,{className:"mb-8"}),jsxs("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-2",children:[r?.previousArticle&&jsx(ne,{className:"group hover:border-[var(--blog-accent-border)] hover:bg-[var(--blog-accent-bg)] cursor-pointer transition-colors",children:jsxs(W,{href:r.previousArticle.url,className:"block",children:[r.previousArticle.featuredImage&&jsx(De,{src:r.previousArticle.featuredImage,alt:r.previousArticle.featuredImageAlt??`Featured image for ${r.previousArticle.title}`}),jsxs(oe,{className:"p-4",children:[jsx("div",{className:"text-muted-foreground mb-2 text-sm font-medium",children:"\u2190 Previous Article"}),jsx("div",{className:"text-foreground group-hover:text-[var(--blog-text-accent)] transition-colors",children:r.previousArticle.title})]})]})}),r?.nextArticle&&jsx(ne,{className:h("group hover:border-[var(--blog-accent-border)] hover:bg-[var(--blog-accent-bg)] cursor-pointer transition-colors",!r?.previousArticle&&"md:col-start-2"),children:jsxs(W,{href:r.nextArticle.url,className:"block",children:[r.nextArticle.featuredImage&&jsx(De,{src:r.nextArticle.featuredImage,alt:r.nextArticle.featuredImageAlt??`Featured image for ${r.nextArticle.title}`}),jsxs(oe,{className:"p-4 md:text-right",children:[jsx("div",{className:"text-muted-foreground mb-2 text-sm font-medium",children:"Next Article \u2192"}),jsx("div",{className:"text-foreground group-hover:text-[var(--blog-text-accent)] transition-colors",children:r.nextArticle.title})]})]})})]})]}),(()=>{let m=re(Le(e,{pathPrefix:u}));return jsx("script",{type:m.type,dangerouslySetInnerHTML:m.dangerouslySetInnerHTML})})()]})}function ut({items:e,variant:t}){if(e.length===0)return null;let r=jsx("ul",{className:"space-y-2 text-sm",children:e.map(n=>jsx("li",{className:n.level===3?"pl-4":void 0,children:jsx("a",{href:`#${n.id}`,className:"text-muted-foreground hover:text-[var(--blog-text-accent)] block leading-snug transition-colors",children:n.text})},n.id))});return t==="mobile"?jsxs("details",{className:"group mb-6 rounded-2xl border border-[var(--blog-accent-border)] bg-[var(--blog-accent-bg)] lg:hidden",children:[jsxs("summary",{className:"text-foreground flex cursor-pointer list-none items-center justify-between gap-3 px-4 py-3 text-sm font-semibold [&::-webkit-details-marker]:hidden",children:[jsx("span",{children:"On this page"}),jsxs("span",{className:"text-muted-foreground flex items-center gap-2 text-xs font-medium",children:[tt(e.length),jsx("span",{className:"text-[var(--blog-text-accent)] transition-transform group-open:rotate-180","aria-hidden":"true",children:"\u2193"})]})]}),jsx("nav",{"aria-label":"Table of contents",className:"border-t border-[var(--blog-accent-border)] px-4 py-4",children:r})]}):jsx("aside",{className:"hidden lg:block",children: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:[jsx("p",{className:"text-muted-foreground mb-3 text-xs font-semibold tracking-wider uppercase",children:"On this page"}),r]})})}function mt({author:e,size:t}){let r=t==="lg"?"h-12 w-12 text-base":"h-9 w-9 text-sm",n=Sr(e.name);return e.avatarUrl?jsx(ke,{src:e.avatarUrl,alt:e.name,width:t==="lg"?48:36,height:t==="lg"?48:36,className:h("shrink-0 rounded-full object-cover",r),loading:"lazy"}):jsx("span",{className:h("bg-muted text-muted-foreground inline-flex shrink-0 items-center justify-center rounded-full font-medium",r),"aria-hidden":"true",children:n})}function Sr(e){return e.trim().split(/\s+/).filter(Boolean).slice(0,2).map(r=>r[0]?.toUpperCase()).join("")||"?"}function Rr({cta:e}){return jsx("div",{className:"rounded-2xl border border-[var(--blog-accent-border)] bg-[var(--blog-accent-bg)] p-5 sm:p-6",children:jsxs("div",{className:"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",children:[jsxs("div",{className:"space-y-1",children:[jsx("h2",{className:"text-foreground text-xl font-semibold",children:e.title}),e.description&&jsx("p",{className:"text-muted-foreground leading-relaxed",children:e.description})]}),jsxs(W,{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,jsx(ArrowUpRight,{className:"size-4","aria-hidden":"true"})]})]})})}function wr({title:e,url:t}){let r=encodeURIComponent(e),n=encodeURIComponent(t);return jsxs("div",{className:"flex flex-wrap items-center justify-center gap-2 sm:gap-3",children:[jsxs("span",{className:"text-muted-foreground inline-flex basis-full items-center justify-center gap-2 text-sm font-medium sm:basis-auto",children:[jsx(Share2,{className:"size-4","aria-hidden":"true"}),"Share"]}),jsx("a",{href:`https://x.com/intent/tweet?text=${r}&url=${n}`,target:"_blank",rel:"noopener noreferrer","aria-label":"Share on X",className:"text-muted-foreground hover:border-[var(--blog-accent-border)] hover:bg-[var(--blog-accent-bg)] hover:text-foreground inline-flex size-9 items-center justify-center rounded-full border border-border grayscale transition-colors",children:jsx("span",{className:"text-sm font-semibold","aria-hidden":"true",children:"X"})}),jsx("a",{href:`https://www.linkedin.com/sharing/share-offsite/?url=${n}`,target:"_blank",rel:"noopener noreferrer","aria-label":"Share on LinkedIn",className:"text-muted-foreground hover:border-[var(--blog-accent-border)] hover:bg-[var(--blog-accent-bg)] hover:text-foreground inline-flex size-9 items-center justify-center rounded-full border border-border grayscale transition-colors",children:jsx("span",{className:"text-sm font-bold","aria-hidden":"true",children:"in"})}),jsx("a",{href:`mailto:?subject=${r}&body=${n}`,"aria-label":"Share by email",className:"text-muted-foreground hover:border-[var(--blog-accent-border)] hover:bg-[var(--blog-accent-bg)] hover:text-foreground inline-flex size-9 items-center justify-center rounded-full border border-border grayscale transition-colors",children:jsx(Mail,{className:"size-4","aria-hidden":"true"})})]})}function Nr({articles:e,basePath:t}){return jsxs("section",{className:"space-y-4","aria-labelledby":"related-articles-title",children:[jsx("h2",{id:"related-articles-title",className:"text-xl font-semibold",children:"You might also like"}),jsx("div",{className:"grid gap-4 md:grid-cols-3",children:e.map(r=>jsxs(W,{href:L(t,r.slug),className:"group overflow-hidden rounded-2xl border border-border transition-colors hover:border-[var(--blog-accent-border)] hover:bg-[var(--blog-accent-bg)] hover:no-underline",children:[r.featuredImage&&jsx(De,{src:r.featuredImage,alt:r.featuredImageAlt??`Featured image for ${r.title}`}),jsxs("div",{className:"p-4",children:[jsx("h3",{className:"text-foreground group-hover:text-[var(--blog-text-accent)] line-clamp-3 font-semibold transition-colors",children:r.title}),r.excerpt&&jsx("p",{className:"text-muted-foreground mt-2 line-clamp-3 text-sm leading-relaxed",children:r.excerpt})]})]},r.id))})]})}function De({src:e,alt:t}){return jsx("div",{className:"aspect-[16/9] overflow-hidden border-b border-border bg-[var(--blog-accent-bg)]",children:jsx(ke,{src:e,alt:t,width:480,height:270,className:"h-full w-full object-cover transition-transform duration-500 group-hover:scale-105"})})}function Tr(e,t="/blog"){let r=e.meta.title??e.title,n=e.meta.description??e.excerpt,i=e.meta.canonicalUrl??`${e.site.domain}${L(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 Cr(e){let t=e.topics??[];return t.find(r=>r.isPrimary)??t[0]??null}function Ue(e){let t=new Map;for(let r of e)for(let n of r.topics??[])t.has(n.slug)||t.set(n.slug,n);return Array.from(t.values()).sort((r,n)=>r.name.localeCompare(n.name))}function He(e,t){let r=e.filter(i=>(i.topics??[]).some(o=>o.slug===t));if(r.length===0)return null;let n=r.flatMap(i=>i.topics??[]).find(i=>i.slug===t)??null;return n?{topic:n,articles:r}:null}function _r({articles:e,basePath:t="/blog",title:r="Topics",description:n="Browse articles by topic.",className:i,theme:o}){let s=_(t)||"/",a=Ue(e);return jsxs("main",{style:$(o),className:h("blog-topics-page container mx-auto max-w-5xl px-4 py-8 sm:px-6 sm:py-12 lg:px-8 lg:py-16",i),children:[jsxs("header",{className:"mb-10 space-y-3 text-center",children:[jsx(W,{href:s,className:"text-muted-foreground hover:text-[var(--blog-accent)] text-sm font-medium transition-colors",children:"Back to all articles"}),jsx("h1",{className:"text-4xl font-semibold tracking-tight text-balance sm:text-5xl",children:r}),jsx("p",{className:"text-muted-foreground mx-auto max-w-2xl text-lg text-pretty",children:n})]}),a.length===0?jsx("p",{className:"text-muted-foreground rounded-2xl border p-8 text-center",children:"No topics have published articles yet."}):jsx("div",{className:"grid gap-4 sm:grid-cols-2 lg:grid-cols-3",children:a.map(u=>{let l=e.filter(d=>(d.topics??[]).some(p=>p.slug===u.slug)).length;return jsxs(W,{href:L(s,`topics/${u.slug}`),className:"group rounded-2xl border border-[var(--blog-accent-border)] bg-[var(--blog-card-bg)] p-5 transition hover:border-[var(--blog-accent)] hover:no-underline",children:[jsx("h2",{className:"group-hover:text-[var(--blog-accent)] text-xl font-semibold transition-colors",children:u.name}),u.description&&jsx("p",{className:"text-muted-foreground mt-2 line-clamp-3 text-sm leading-relaxed",children:u.description}),jsxs("p",{className:"text-muted-foreground mt-4 text-sm",children:[l," ",l===1?"article":"articles"]})]},u.slug)})})]})}function Br({articles:e,topicSlug:t,basePath:r="/blog",className:n,theme:i}){let o=_(r)||"/",s=He(e,t);return jsxs("main",{style:$(i),className:h("blog-topic-archive-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:[jsxs("header",{className:"mb-10 space-y-3 text-center",children:[jsx(W,{href:L(o,"topics"),className:"text-muted-foreground hover:text-[var(--blog-accent)] text-sm font-medium transition-colors",children:"Back to all topics"}),jsx("h1",{className:"text-4xl font-semibold tracking-tight text-balance sm:text-5xl",children:s?.topic.name??"Topic not found"}),s?.topic.description&&jsx("p",{className:"text-muted-foreground mx-auto max-w-2xl text-lg text-pretty",children:s.topic.description})]}),s?jsx("div",{className:"grid gap-5 md:grid-cols-2",children:s.articles.map(a=>jsx(kr,{article:a,topic:s.topic,basePath:o},a.id))}):jsx("p",{className:"text-muted-foreground rounded-2xl border p-8 text-center",children:"No published articles were found for this topic."})]})}function kr({article:e,topic:t,basePath:r}){let n=L(r,e.slug),i=formatDistanceToNow(new Date(e.publishedAt),{addSuffix:true});return jsxs(W,{href:n,className:"group overflow-hidden rounded-2xl border border-[var(--blog-accent-border)] bg-[var(--blog-card-bg)] transition hover:border-[var(--blog-accent)] hover:no-underline",children:[e.featuredImage&&jsx("div",{className:"relative aspect-[16/9] overflow-hidden",children:jsx(ke,{src:e.featuredImage,alt:e.featuredImageAlt??e.title,width:640,height:360,className:"h-full w-full object-cover transition-transform duration-300 group-hover:scale-105"})}),jsxs("div",{className:"space-y-3 p-5",children:[jsx("span",{className:"inline-flex rounded-full border border-[var(--blog-accent-border)] px-2.5 py-1 text-xs font-medium text-[var(--blog-text-accent)]",children:t.name}),jsx("h2",{className:"group-hover:text-[var(--blog-accent)] text-xl font-semibold text-balance transition-colors",children:e.title}),e.excerpt&&jsx("p",{className:"text-muted-foreground line-clamp-3 text-sm leading-relaxed",children:e.excerpt}),jsx("p",{className:"text-muted-foreground text-sm",children:i})]})]})}function Ve(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 fe=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=>Ve(t);hashToken(t){return t.substring(0,8)+"..."}},K=class extends fe{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);}},se=class{async validateToken(){return {valid:true,context:{development:true}}}extractToken(){return "development-mode"}},he=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 Ir(){return globalThis.__BLOG_PLATFORM_AUTH_CONFIG__??=new he,globalThis.__BLOG_PLATFORM_AUTH_CONFIG__}function be(e){globalThis.__BLOG_PLATFORM_AUTH_CONFIG__=e;}function Ge(){return globalThis.__BLOG_PLATFORM_AUTH_CONFIG__??Ir()}function Er(e){be(new K(e));}async function M(e){let t=Ge(),r=t.extractToken?t.extractToken(e):Ve(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 Mr(e,t=""){let n=Ge().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 H(e){let t=await M(e);return t.authenticated?{authenticated:true,context:t.result.context}:{authenticated:false,error:Mr(t.result)}}function Dr(){let e=process.env.SKIP_BLOG_PLATFORM_AUTH;return e==="true"||e==="1"||process.env.NODE_ENV==="test"}var xe=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((u,l)=>{let d=new Date(u[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 $r(){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 Ur(){let e=globalThis;e.__BLOG_PLATFORM_STORAGE__||($r(),e.__BLOG_PLATFORM_STORAGE__=new xe);let t=e.__BLOG_PLATFORM_STORAGE__;if(!t)throw new Error("Blog platform storage not initialized");return t}function V(){return Ur()}function je(e){let t=globalThis;t.__BLOG_PLATFORM_STORAGE__=e;}function Vr(){return globalThis.__BLOG_PLATFORM_RATE_LIMITER__??null}function Gr(e){let t=globalThis;t.__BLOG_PLATFORM_RATE_LIMITER__=e;}function ye(e){let{redisUrl:t,redisToken:r,requestsPerMinute:n=5,keyPrefix:i="blog-platform-ratelimit",analytics:o=true}=e,s=new Redis({url:t,token:r}),a=new Ratelimit({redis:s,analytics:o,prefix:i,limiter:Ratelimit.slidingWindow(n,"1m")});Gr(a);}function Fe(){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}ye({redisUrl:e,redisToken:t}),console.log("Blog platform: Rate limiting configured (5 requests per minute per token)");}async function gt(e){let t=Vr();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 ft(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 D(e,t=""){let r=await gt(e);return r.success?{allowed:true,rateLimitResult:r}:{allowed:false,errorResponse:ft(r,t)}}function T(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 ve(e){let{auth:t,storage:r,rateLimit:n,autoRateLimit:i=true}=e;if(!t)throw new Error(`Blog platform initialization failed: 'auth' is required.
1
+ import K from'next/link';import De from'next/image';import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import {ChevronLeftIcon,ChevronRightIcon,MoreHorizontalIcon,ChevronsLeft,ChevronsRight,ArrowLeft,Globe,Mail,ArrowUpRight,Check,Copy,Share2}from'lucide-react';import {Slot}from'@radix-ui/react-slot';import {cva}from'class-variance-authority';import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {format,formatDistanceToNow}from'date-fns';import {MDXRemote}from'next-mdx-remote-client/rsc';import {FaXTwitter,FaLinkedinIn,FaGithub}from'react-icons/fa6';import*as be from'react';import be__default from'react';import*as je from'@radix-ui/react-separator';import Ir from'remark-gfm';import kr from'remark-toc';import Or from'rehype-slug';import {Ratelimit}from'@upstash/ratelimit';import {Redis}from'@upstash/redis';import {eq,and,desc,sql}from'drizzle-orm';import {sqliteTable,integer,text,uniqueIndex}from'drizzle-orm/sqlite-core';import {NextResponse}from'next/server';function f(...e){return twMerge(clsx(e))}var pe=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,...i}){return jsx(n?Slot:"button",{"data-slot":"button",className:f(pe({variant:t,size:r,className:e})),...i})}function Te({className:e,...t}){return jsx("nav",{role:"navigation","aria-label":"pagination","data-slot":"pagination",className:f("mx-auto flex w-full justify-center",e),...t})}function Ce({className:e,...t}){return jsx("ul",{"data-slot":"pagination-content",className:f("flex flex-row items-center gap-1",e),...t})}function M({...e}){return jsx("li",{"data-slot":"pagination-item",...e})}function z({className:e,isActive:t,size:r="icon",...n}){return jsx("a",{"aria-current":t?"page":void 0,"data-slot":"pagination-link","data-active":t,className:f(pe({variant:t?"outline":"ghost",size:r}),e),...n})}function Le({className:e,...t}){return jsxs(z,{"aria-label":"Go to previous page",size:"default",className:f("gap-1 px-2.5 sm:pl-2.5",e),...t,children:[jsx(ChevronLeftIcon,{}),jsx("span",{className:"hidden sm:block",children:"Previous"})]})}function Ie({className:e,...t}){return jsxs(z,{"aria-label":"Go to next page",size:"default",className:f("gap-1 px-2.5 sm:pr-2.5",e),...t,children:[jsx("span",{className:"hidden sm:block",children:"Next"}),jsx(ChevronRightIcon,{})]})}function ge({className:e,...t}){return jsxs("span",{"aria-hidden":true,"data-slot":"pagination-ellipsis",className:f("flex size-9 items-center justify-center",e),...t,children:[jsx(MoreHorizontalIcon,{className:"size-4"}),jsx("span",{className:"sr-only",children:"More pages"})]})}function fe({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 d=Math.floor(i/2),g=Math.max(1,e-d),P=Math.min(t,g+i-1);return P-g+1<i&&(g=Math.max(1,P-i+1)),{start:g,end:P}},{start:u,end:l}=a(),m=Array.from({length:l-u+1},(d,g)=>u+g),p=d=>d===1?r:`${r}?page=${d}`,v=e>1,h=e<t;return jsxs(Te,{className:n,children:[jsxs(Ce,{children:[s&&e>2&&jsxs(Fragment,{children:[jsx(M,{children:jsx(z,{href:p(1),"aria-label":"Go to first page",children:jsx(ChevronsLeft,{className:"h-4 w-4"})})}),u>2&&jsx(M,{children:jsx(ge,{})})]}),o&&jsx(M,{children:v?jsx(Le,{href:p(e-1)}):jsx("span",{className:"flex h-9 items-center justify-center gap-1 px-2.5 text-muted-foreground sm:pl-2.5",children:jsx("span",{className:"hidden sm:block",children:"Previous"})})}),m.map(d=>jsx(M,{children:jsx(z,{href:p(d),isActive:d===e,children:d})},d)),o&&jsx(M,{children:h?jsx(Ie,{href:p(e+1)}):jsx("span",{className:"flex h-9 items-center justify-center gap-1 px-2.5 text-muted-foreground sm:pr-2.5",children:jsx("span",{className:"hidden sm:block",children:"Next"})})}),s&&e<t-1&&jsxs(Fragment,{children:[l<t-1&&jsx(M,{children:jsx(ge,{})}),jsx(M,{children:jsx(z,{href:p(t),"aria-label":"Go to last page",children:jsx(ChevronsRight,{className:"h-4 w-4"})})})]})]}),jsxs("div",{className:"sr-only","aria-live":"polite",children:["Page ",e," of ",t]})]})}function Qt(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 Zt(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 he(e,t={}){let{customDomain:r,pathPrefix:n="/blog",language:i,isAccessibleForFree:o=true,includeOptionalProperties:s=true}=t,a=r??e.site.domain,u=r?`https://${a}${n}/${e.slug}`:e.meta.canonicalUrl??`https://${a}${n}/${e.slug}`,l=e.author?nt(e.author,{customDomain:r,pathPrefix:n}):void 0,m=Oe(e.site,{customDomain:r,pathPrefix:n}),v=`PT${Math.max(1,Math.ceil(e.readingSeconds/60))}M`,h={"@context":"https://schema.org","@type":"BlogPosting","@id":`${u}#article`,headline:e.title,description:e.excerpt,datePublished:e.publishedAt,dateModified:e.updatedAt,author:l,publisher:m,mainEntityOfPage:{"@type":"WebPage","@id":u},wordCount:e.wordCount,timeRequired:v,isAccessibleForFree:o};return s&&(e.featuredImage&&(h.image=e.featuredImage),e.meta.keywords.length>0&&(h.keywords=[...e.meta.keywords]),(i??e.site.locale)&&(h.inLanguage=i??e.site.locale),e.site.toneAdjectives.length>0&&(h.about=e.site.toneAdjectives.map(d=>({"@type":"Thing",name:d}))),e.site.toneAdjectives.length>0&&(h.genre=[...e.site.toneAdjectives])),h}function nt(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};e.bio&&(i.description=e.bio),e.avatarUrl&&(i.image=e.avatarUrl);let o=[e.socialLinks?.website,e.socialLinks?.x,e.socialLinks?.linkedin,e.socialLinks?.github].filter(s=>!!s);if(o.length>0&&(i.sameAs=o),e.slug?.trim()){let s=r?`https://${r}${n}/authors/${e.slug}`:`${n}/authors/${e.slug}`;i.url=s;}return e.isGuest&&(i.additionalType="GuestAuthor"),e.toneAdjectives&&e.toneAdjectives.length>0&&(i.knowsAbout=[...e.toneAdjectives]),i}function Oe(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 Be(e,t={}){let{customDomain:r,pathPrefix:n="/blog",language:i,includeSearchAction:o=true}=t,a=`https://${r??e.domain}${n}`,u=Oe(e,t),l={"@context":"https://schema.org","@type":"WebSite","@id":`${a}#website`,name:e.name,url:a,publisher:u};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 ot(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 _e(e,t={}){let r=[];r.push(he(e,t)),r.push(Be(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(ot(i,t)),r}function Ee(e,t=[],r={}){let n=[];if(n.push(Be(e,r)),t.length>0){let i=t.slice(0,5).map(o=>he(o,r));n.push(...i);}return n}function it(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 st(e){return JSON.stringify(e,null,0)}function ne(e){return {type:"application/ld+json",dangerouslySetInnerHTML:{__html:st(e)}}}function er(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 re=class extends Error{constructor(r,n,i){super(r);this.code=n;this.details=i;this.name="StructuredDataError";}code;details};function tr(e,t={}){try{let r=he(e,t),n=it(r);return n.isValid?{schema:r}:{error:new re("Generated schema validation failed","VALIDATION_FAILED",n.errors)}}catch(r){return {error:new re("Failed to generate structured data","GENERATION_FAILED",r)}}}function k(e="/blog"){let t=e.trim();return !t||t==="/"?"":t.replace(/^(?!\/)/,"/").replace(/\/+$/,"")}function L(e,t){let r=k(e),n=t?.replace(/^\/+/,"").replace(/\/+$/,"");return n?`${r}/${n}`.replace(/\/+/g,"/"):r||"/"}function rr(e){let t=new URL(e);return k(t.pathname)}var X={accentColor:"hsl(var(--primary))",accentHoverColor:"hsl(var(--primary))",textAccentColor:"hsl(var(--primary))",textAccentHoverColor:"hsl(var(--primary))",accentBackgroundColor:"hsl(var(--primary) / 0.08)",accentBorderColor:"hsl(var(--primary) / 0.25)"};function U(e={}){return {"--blog-accent":e.accentColor??X.accentColor,"--blog-accent-hover":e.accentHoverColor??X.accentHoverColor,"--blog-text-accent":e.textAccentColor??e.accentColor??X.textAccentColor,"--blog-text-accent-hover":e.textAccentHoverColor??e.accentHoverColor??X.textAccentHoverColor,"--blog-accent-bg":e.accentBackgroundColor??X.accentBackgroundColor,"--blog-accent-border":e.accentBorderColor??X.accentBorderColor}}function Me(e,t){let r=new Date(e),n=new Date(t);return {publishedDateLabel:format(r,"d MMMM yyyy"),publishedRelativeLabel:formatDistanceToNow(r,{addSuffix:true}),updatedDateLabel:format(n,"d MMMM yyyy"),isUpdated:n.getTime()!==r.getTime()}}function $e(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=or(i[2]);o&&t.push({id:ir(o),text:o,level:i[1].length});}return t}function lt(e){return `${e} ${e===1?"section":"sections"}`}function ct(e,t){let r=e===t;return {isActive:r,ariaCurrent:r?"location":void 0}}function or(e){return e.replace(/\[([^\]]+)\]\([^)]+\)/g,"$1").replace(/[*_`~]/g,"").replace(/<[^>]+>/g,"").replace(/\s+/g," ").trim()}function ir(e){return e.toLowerCase().replace(/[^a-z0-9\s-]/g,"").trim().replace(/\s+/g,"-").replace(/-+/g,"-")}function mt({articles:e,siteName:t,siteTagline:r,className:n,site:i,includeStructuredData:o=false,basePath:s="/blog",pagination:a,theme:u}){let l=k(s)||"/";return jsxs("div",{style:U(u),className:f("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&&jsxs("header",{className:"blog-header mb-8 text-center sm:mb-12 lg:mb-16",children:[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&&jsx("p",{className:"blog-tagline text-muted-foreground text-base sm:text-lg",children:r})]}),jsxs("main",{className:"articles-list",children:[e.length===0?jsxs("div",{className:"no-articles text-muted-foreground py-16 text-center sm:py-24 lg:py-32",children:[jsx("h2",{className:"mb-3 text-xl font-light sm:mb-4 sm:text-2xl lg:text-3xl",children:"No articles yet"}),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."})]}):jsx("div",{className:"space-y-0",children:e.map(m=>jsx(cr,{article:m,basePath:l},m.id))}),a&&a.totalPages>1&&jsx("div",{className:"pagination-wrapper mt-12",children:jsx(fe,{currentPage:a.currentPage,totalPages:a.totalPages,baseUrl:a.baseUrl??l,className:"justify-center"})})]}),o&&i&&(()=>{let m=ne(Ee(i,e.slice(0,5),{pathPrefix:l}));return jsx("script",{type:m.type,dangerouslySetInnerHTML:m.dangerouslySetInnerHTML})})()]})}function lr(e){return `${Math.ceil(e/60)} min read`}function cr({article:e,basePath:t}){let r=L(t,e.slug),n=formatDistanceToNow(new Date(e.publishedAt),{addSuffix:true}),i=lr(e.readingSeconds),o=e.featuredImage;return 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:jsxs(K,{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:[jsxs("div",{className:"space-y-4 lg:hidden",children:[o&&jsx("div",{className:"relative aspect-[16/10] w-full overflow-hidden rounded-2xl",children:jsx(De,{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"})}),jsxs("div",{className:"space-y-3",children:[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}),jsxs("div",{className:"text-muted-foreground flex flex-wrap items-center gap-x-3 gap-y-1 text-sm",children:[e.author&&jsxs(Fragment,{children:[jsxs("span",{className:"inline-flex items-center gap-2 font-medium",children:[jsx(ut,{author:e.author,size:"sm"}),e.author.name]}),jsx("span",{className:"text-border",children:"\u2022"})]}),jsx("time",{dateTime:e.publishedAt,className:"font-medium","aria-label":`Published ${n}`,children:n}),jsx("span",{className:"text-border",children:"\u2022"}),jsx("span",{className:"font-medium",children:i})]}),e.excerpt&&jsx("p",{className:"text-muted-foreground line-clamp-3 text-sm leading-relaxed sm:text-base",children:e.excerpt}),(e.topics??[]).length>0&&jsx("div",{className:"flex flex-wrap gap-2",children:(e.topics??[]).map(s=>jsx("span",{className:"rounded-full border border-[var(--blog-accent-border)] px-2.5 py-1 text-xs font-medium text-[var(--blog-text-accent)]",children:s.name},s.id))})]})]}),jsxs("div",{className:"hidden items-start gap-6 lg:flex xl:gap-8",children:[o&&jsx("div",{className:"relative aspect-[16/10] w-64 shrink-0 overflow-hidden rounded-2xl xl:w-72",children:jsx(De,{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"})}),jsxs("div",{className:"flex min-h-[180px] flex-1 flex-col justify-between space-y-4 xl:min-h-[200px]",children:[jsxs("div",{className:"space-y-4",children:[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&&jsx("p",{className:"text-muted-foreground line-clamp-3 text-base leading-relaxed xl:text-lg",children:e.excerpt}),(e.topics??[]).length>0&&jsx("div",{className:"flex flex-wrap gap-2",children:(e.topics??[]).map(s=>jsx("span",{className:"rounded-full border border-[var(--blog-accent-border)] px-2.5 py-1 text-xs font-medium text-[var(--blog-text-accent)]",children:s.name},s.id))})]}),jsxs("div",{className:"text-muted-foreground flex flex-wrap items-center gap-x-3 gap-y-1 text-sm",children:[e.author&&jsxs(Fragment,{children:[jsxs("span",{className:"inline-flex items-center gap-2 font-medium",children:[jsx(ut,{author:e.author,size:"sm"}),e.author.name]}),jsx("span",{className:"text-border",children:"\u2022"})]}),jsx("time",{dateTime:e.publishedAt,className:"font-medium","aria-label":`Published ${n}`,children:n}),jsx("span",{className:"text-border",children:"\u2022"}),jsx("span",{className:"font-medium",children:i})]})]})]})]})})}function ut({author:e,size:t}){let r=t==="md"?"h-9 w-9 text-sm":"h-6 w-6 text-xs",n=ur(e.name);return e.avatarUrl?jsx(De,{src:e.avatarUrl,alt:e.name,width:t==="md"?36:24,height:t==="md"?36:24,className:f("shrink-0 rounded-full object-cover",r),loading:"lazy"}):jsx("span",{className:f("bg-muted inline-flex shrink-0 items-center justify-center rounded-full font-medium",r),"aria-hidden":"true",children:n})}function ur(e){return e.trim().split(/\s+/).filter(Boolean).slice(0,2).map(r=>r[0]?.toUpperCase()).join("")||"?"}function dr(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.",u=k(i)||"/",l=r?`${r}${n&&n.currentPage>1?`${u}?page=${n.currentPage}`:u}`:void 0,m=n&&n.currentPage>1&&r?`${r}${n.currentPage===2?u:`${u}?page=${n.currentPage-1}`}`:void 0,p=n&&n.currentPage<n.totalPages&&r?`${r}${u}?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:{...m&&{prev:m},...p&&{next:p}}}}var pr=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 Ue({className:e,variant:t,...r}){return jsx("div",{className:f(pr({variant:t}),e),...r})}function oe({className:e,...t}){return jsx("div",{"data-slot":"card",className:f("bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm",e),...t})}function fr({className:e,...t}){return jsx("div",{"data-slot":"card-header",className:f("@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 hr({className:e,...t}){return jsx("div",{"data-slot":"card-title",className:f("leading-none font-semibold",e),...t})}function br({className:e,...t}){return jsx("div",{"data-slot":"card-description",className:f("text-muted-foreground text-sm",e),...t})}function ie({className:e,...t}){return jsx("div",{"data-slot":"card-content",className:f("px-6",e),...t})}function xr({className:e,...t}){return jsx("div",{"data-slot":"card-footer",className:f("flex items-center px-6 [.border-t]:pt-6",e),...t})}function Ar(e,t){try{return new URL(e).href}catch{if(!t)return e}try{return new URL(e,t).href}catch{return e}}async function pt(e,t=globalThis.navigator?.clipboard,r=typeof document>"u"?void 0:document){if(t)try{await t.writeText(e);return}catch{}if(!r)throw new Error("Clipboard API is unavailable");let n=r.createElement("textarea");n.value=e,n.setAttribute("readonly",""),n.style.position="fixed",n.style.left="-9999px",r.body.appendChild(n),n.select();try{if(!r.execCommand("copy"))throw new Error("Copy command failed")}finally{n.remove();}}async function wr(e,t=globalThis.navigator){return t?.share?(await t.share({title:e.title,url:e.url}),"shared"):(await pt(e.url,t?.clipboard),"copied")}function xe({title:e,url:t,className:r,size:n="md"}){let[i,o]=be__default.useState(false),[s,a]=be__default.useState(false),u=be__default.useMemo(()=>Ar(t,typeof window>"u"?void 0:window.location.href),[t]);be__default.useEffect(()=>{if(!i)return;let h=window.setTimeout(()=>o(false),2e3);return ()=>window.clearTimeout(h)},[i]);async function l(){await pt(u),o(true);}async function m(){a(true);try{await wr({title:e,url:u})==="copied"&&o(!0);}finally{a(false);}}let p=n==="sm"?"h-8 gap-1.5 px-2.5 text-xs":"h-9 gap-2 px-3 text-sm",v=n==="sm"?"size-3.5":"size-4";return jsxs("div",{className:f("article-top-actions flex flex-wrap items-center justify-center gap-2",r),children:[jsxs("button",{type:"button","aria-label":"Copy article link",onClick:l,className:f("text-muted-foreground hover:text-foreground border-border inline-flex items-center justify-center rounded-full border font-medium transition-colors hover:border-[var(--blog-accent-border)] hover:bg-[var(--blog-accent-bg)]",p),children:[i?jsx(Check,{className:v,"aria-hidden":"true"}):jsx(Copy,{className:v,"aria-hidden":"true"}),jsx("span",{children:i?"Copied":"Copy link"})]}),jsxs("button",{type:"button","aria-label":"Share article",onClick:m,disabled:s,className:f("text-muted-foreground hover:text-foreground border-border inline-flex items-center justify-center rounded-full border font-medium transition-colors hover:border-[var(--blog-accent-border)] hover:bg-[var(--blog-accent-bg)] disabled:cursor-wait disabled:opacity-60",p),children:[jsx(Share2,{className:v,"aria-hidden":"true"}),jsx("span",{children:"Share"})]})]})}function ft({alt:e="",className:t,src:r,...n}){if(typeof r!="string"||r.length===0)return jsx("img",{alt:e,className:t,...n});let i=`blog-image-preview-${Sr(r)}`;return jsxs(Fragment,{children:[jsx("a",{href:`#${i}`,className:"group mx-auto block cursor-zoom-in rounded-2xl focus-visible:ring-2 focus-visible:ring-[var(--blog-text-accent)] focus-visible:ring-offset-2 focus-visible:outline-none","aria-label":e?`Expand image: ${e}`:"Expand article image",children:jsx("img",{src:r,alt:e,className:f("mx-auto rounded-2xl border border-[var(--blog-accent-border)] shadow-[0_18px_60px_rgb(168_85_247_/_0.12)] transition-opacity group-hover:opacity-95",t),...n})}),jsxs("div",{id:i,className:"invisible fixed inset-0 z-50 flex opacity-0 transition-opacity target:visible target:opacity-100",role:"dialog","aria-modal":"true","aria-label":e?`Image preview: ${e}`:"Image preview",children:[jsx("a",{href:"#article-content",className:"absolute inset-0 bg-black/85 backdrop-blur-sm","aria-label":"Close image preview"}),jsx("div",{className:"pointer-events-none relative z-10 flex min-h-screen w-full items-center justify-center p-4 sm:p-6",children:jsx("img",{src:r,alt:e,className:"pointer-events-auto h-[88vh] w-[94vw] rounded-3xl object-contain shadow-2xl"})}),jsx("a",{href:"#article-content",className:"absolute top-4 right-4 z-20 inline-flex size-10 items-center justify-center rounded-full border border-white/20 bg-black/50 text-xl leading-none text-white no-underline transition-colors hover:bg-white/10 focus-visible:ring-2 focus-visible:ring-white focus-visible:outline-none","aria-label":"Close image preview",children:"\xD7"})]})]})}function Sr(e){let t=0;for(let r=0;r<e.length;r+=1)t=(t<<5)-t+e.charCodeAt(r),t|=0;return Math.abs(t).toString(36)}function Ve({items:e,contentId:t,variant:r,showProgress:n=true}){let i=e[0]?.id??null;return jsxs(Fragment,{children:[n&&jsx("div",{"data-blog-reading-progress":t,className:"fixed inset-x-0 top-0 z-50 h-1 origin-left bg-[var(--blog-accent)] motion-safe:transition-transform",style:{transform:"scaleX(0)"},role:"progressbar","aria-label":"Reading progress","aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":0,suppressHydrationWarning:true}),jsx(Nr,{items:e,activeItemId:i,variant:r}),n&&jsx("script",{dangerouslySetInnerHTML:{__html:Tr(t,e)}})]})}function Nr({items:e,activeItemId:t,variant:r}){if(e.length===0)return null;let n=jsx("ul",{className:"space-y-2 text-sm",children:e.map(i=>{let o=ct(i.id,t);return jsx("li",{className:i.level===3?"pl-4":void 0,children:jsx("a",{href:`#${i.id}`,"aria-current":o.ariaCurrent,"data-blog-toc-link":i.id,"data-active":o.isActive?"true":"false",suppressHydrationWarning:true,className:"text-muted-foreground hover:text-[var(--blog-text-accent)] data-[active=true]:border-[var(--blog-accent)] data-[active=true]:text-[var(--blog-text-accent)] block border-l-2 border-transparent pl-3 leading-snug transition-colors",children:i.text})},i.id)})});return r==="mobile"?jsxs("details",{className:"group mb-6 rounded-2xl border border-[var(--blog-accent-border)] bg-[var(--blog-accent-bg)] lg:hidden",children:[jsxs("summary",{className:"text-foreground flex cursor-pointer list-none items-center justify-between gap-3 px-4 py-3 text-sm font-semibold [&::-webkit-details-marker]:hidden",children:[jsx("span",{children:"On this page"}),jsxs("span",{className:"text-muted-foreground flex items-center gap-2 text-xs font-medium",children:[lt(e.length),jsx("span",{className:"text-[var(--blog-text-accent)] transition-transform group-open:rotate-180","aria-hidden":"true",children:"\u2193"})]})]}),jsx("nav",{"aria-label":"Table of contents",className:"border-t border-[var(--blog-accent-border)] px-4 py-4",children:n})]}):jsx("aside",{className:"hidden lg:block",children: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:[jsx("p",{className:"text-muted-foreground mb-3 text-xs font-semibold tracking-wider uppercase",children:"On this page"}),n]})})}function Tr(e,t){return `
3
+ (() => {
4
+ const contentId = ${JSON.stringify(e)};
5
+ const itemIds = ${JSON.stringify(t.map(r=>r.id))};
6
+ const progressElement = document.querySelector('[data-blog-reading-progress="' + contentId + '"]');
7
+ let animationFrameId = 0;
8
+ let pendingHashItemId = decodeURIComponent(window.location.hash.replace(/^#/, ''));
9
+
10
+ const normalizeProgress = (value) => {
11
+ if (!Number.isFinite(value)) return 0;
12
+ return Math.min(100, Math.max(0, value));
13
+ };
14
+
15
+ const setActiveItem = (activeItemId) => {
16
+ const tocLinks = Array.from(document.querySelectorAll('[data-blog-toc-link]'));
17
+
18
+ for (const link of tocLinks) {
19
+ const isActive = link.getAttribute('data-blog-toc-link') === activeItemId;
20
+ link.setAttribute('data-active', isActive ? 'true' : 'false');
21
+ if (isActive) {
22
+ link.setAttribute('aria-current', 'location');
23
+ } else {
24
+ link.removeAttribute('aria-current');
25
+ }
26
+ }
27
+ };
28
+
29
+ const updateScrollState = () => {
30
+ const contentElement = document.getElementById(contentId);
31
+ if (!contentElement) return;
32
+
33
+ const contentRect = contentElement.getBoundingClientRect();
34
+ const scrollTop = window.scrollY;
35
+ const contentTop = contentRect.top + scrollTop;
36
+ const readableDistance = contentElement.offsetHeight - window.innerHeight;
37
+ const nextProgress = readableDistance <= 0
38
+ ? scrollTop >= contentTop ? 100 : 0
39
+ : ((scrollTop - contentTop) / readableDistance) * 100;
40
+ const progress = normalizeProgress(nextProgress);
41
+
42
+ if (progressElement) {
43
+ progressElement.style.transform = 'scaleX(' + progress / 100 + ')';
44
+ progressElement.setAttribute('aria-valuenow', String(Math.round(progress)));
45
+ }
46
+
47
+ const headings = itemIds
48
+ .map((id) => document.getElementById(id))
49
+ .filter(Boolean);
50
+ if (pendingHashItemId && itemIds.includes(pendingHashItemId)) {
51
+ setActiveItem(pendingHashItemId);
52
+ pendingHashItemId = '';
53
+ return;
54
+ }
55
+
56
+ const activeOffset = Math.max(160, Math.round(window.innerHeight * 0.33));
57
+ const activeHeading = headings
58
+ .filter((heading) => heading.getBoundingClientRect().top <= activeOffset)
59
+ .at(-1) || headings[0] || null;
60
+
61
+ setActiveItem(activeHeading ? activeHeading.id : null);
62
+ };
63
+
64
+ const scheduleUpdate = () => {
65
+ window.cancelAnimationFrame(animationFrameId);
66
+ animationFrameId = window.requestAnimationFrame(updateScrollState);
67
+ };
68
+
69
+ scheduleUpdate();
70
+ window.addEventListener('scroll', scheduleUpdate, { passive: true });
71
+ window.addEventListener('resize', scheduleUpdate);
72
+ window.addEventListener('hashchange', () => {
73
+ pendingHashItemId = decodeURIComponent(window.location.hash.replace(/^#/, ''));
74
+ scheduleUpdate();
75
+ });
76
+ })();
77
+ `}var le=be.forwardRef(({className:e,orientation:t="horizontal",decorative:r=true,...n},i)=>jsx(je.Root,{ref:i,decorative:r,orientation:t,className:f("shrink-0 bg-border",t==="horizontal"?"h-[1px] w-full":"h-full w-[1px]",e),...n}));le.displayName=je.Root.displayName;var bt={mdxOptions:{remarkPlugins:[kr,Ir],rehypePlugins:[Br,Or]}};function Br(){return e=>{xt(e);}}function xt(e){e.children&&(e.children=e.children.flatMap(t=>(xt(t),_r(t)?t.children?.filter(Ge)??[t]:[t])));}function _r(e){if(e.type!=="element"||e.tagName!=="p"||!e.children)return false;let t=e.children.filter(Ge);return t.length===1&&Er(t[0])}function Er(e){if(e?.type!=="element")return false;if(e.tagName==="img")return true;if(e.tagName!=="a"||!e.children)return false;let t=e.children.filter(Ge);return t.length===1&&t[0]?.tagName==="img"}function Ge(e){return e.type!=="text"||!!e.value?.trim()}function Vr(e){return `${Math.ceil(e/60)} min read`}function wt({article:e,className:t,navigation:r,basePath:n="/blog",theme:i,postArticleCta:o,relatedArticles:s=[],showShareLinks:a=true}){let u=k(n)||"/",l=Me(e.publishedAt,e.updatedAt),m=Vr(e.readingSeconds),p=$e(e.content),v=e.meta.canonicalUrl??L(u,e.slug),h=e.featuredImage;return jsxs("article",{style:U(i),className:f("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&&jsx("header",{className:"mx-auto mb-8 max-w-4xl sm:mb-12 lg:mb-16",children:jsxs(K,{href:r.backToHome.url,className:"text-muted-foreground group focus-visible:ring-ring inline-flex touch-manipulation items-center space-x-2 rounded-md px-2 py-1 transition-colors hover:text-[var(--blog-accent)] 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:[jsx(ArrowLeft,{className:"h-4 w-4 transition-transform group-hover:-translate-x-1 sm:h-5 sm:w-5","aria-hidden":"true"}),jsxs("span",{className:"text-sm font-medium sm:text-base",children:[jsx("span",{className:"hidden sm:inline",children:r.backToHome.label??"Back to all articles"}),jsx("span",{className:"sm:hidden",children:"Back"})]})]})}),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:[jsx("h1",{className:"article-title bg-linear-to-br from-[var(--blog-accent-hover)] via-[var(--blog-text-accent)] to-fuchsia-200 bg-clip-text px-4 text-2xl leading-tight font-light tracking-tight text-balance text-transparent sm:px-0 sm:text-3xl md:text-4xl lg:text-5xl xl:text-6xl",children:e.title}),e.excerpt&&jsx("p",{className:"article-excerpt text-muted-foreground mx-auto mt-6 max-w-[42rem] px-4 text-lg leading-relaxed text-balance sm:mt-8 sm:max-w-[46rem] sm:px-0 sm:text-xl md:max-w-[52rem] md:text-2xl lg:max-w-4xl lg:text-2xl",children:e.excerpt}),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&&jsxs("div",{className:"flex items-center gap-2",children:[jsx("span",{className:"sr-only",children:"Author"}),jsx(yt,{author:e.author,size:"md"}),jsx("span",{className:"font-medium",children:e.author.name}),e.author.isGuest&&jsx(Ue,{variant:"outline",className:"text-xs",children:"Guest Author"})]}),jsxs("div",{className:"flex flex-wrap items-center justify-center gap-x-3 gap-y-1",children:[jsxs("time",{dateTime:e.publishedAt,className:"font-medium","aria-label":`Published ${l.publishedDateLabel}`,children:["Published ",l.publishedDateLabel]}),jsx("span",{className:"text-border",children:"\u2022"}),jsx("span",{className:"font-medium",children:l.publishedRelativeLabel}),jsx("span",{className:"text-border",children:"\u2022"}),jsx("span",{className:"font-medium",children:m})]}),l.isUpdated&&jsxs("time",{dateTime:e.updatedAt,className:"text-xs",children:["Updated ",l.updatedDateLabel]}),a&&jsx(xe,{title:e.title,url:v,size:"sm"}),jsx("div",{className:"bg-border h-px w-6 sm:w-8","aria-hidden":"true"}),(e.topics??[]).length>0?jsx("nav",{"aria-label":"Article topics",className:"flex flex-wrap justify-center gap-2",children:(e.topics??[]).map(d=>jsx(K,{href:L((r?.backToHome?.url??"/blog").replace(/\/$/,""),`topics/${d.slug}`),className:"rounded-full border border-[var(--blog-accent-border)] bg-[var(--blog-accent-bg)] px-3 py-1 text-xs font-medium text-[var(--blog-text-accent)] transition-colors hover:border-[var(--blog-text-accent)] hover:text-[var(--blog-text-accent-hover)]",children:d.name},d.id))}):jsxs("span",{className:"text-xs tracking-wider uppercase sm:text-sm",role:"text",children:["From ",e.site.name]})]})]}),h&&jsx("div",{className:"article-featured-image mx-auto my-8 aspect-[16/9] w-full max-w-4xl overflow-hidden rounded-3xl border border-[var(--blog-accent-border)] shadow-[0_24px_80px_rgb(168_85_247_/_0.14)] sm:my-12 lg:my-16",children:jsx(De,{src:h,alt:e.featuredImageAlt??`Featured image for ${e.title}`,className:"h-full w-full object-cover",width:800,height:450,priority:true})}),jsxs("div",{id:"article-content",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:[jsxs("div",{className:"min-w-0",children:[jsx(Ve,{items:p,contentId:"article-body",variant:"mobile"}),jsx("div",{id:"article-body",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-text-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-a:text-[var(--blog-text-accent)] prose-a:transition-colors hover:prose-a:text-[var(--blog-text-accent-hover)] max-w-none",children:jsx(MDXRemote,{source:e.content,options:bt,components:{img:ft}})})]}),jsx(Ve,{items:p,contentId:"article-body",variant:"desktop",showProgress:false})]}),e.author?.bio&&jsxs("div",{id:"about-author",className:"author-bio mx-auto mt-12 max-w-4xl",children:[jsx(le,{className:"mb-8"}),jsx(oe,{className:"border-[var(--blog-accent-border)] bg-[var(--blog-accent-bg)]",children:jsxs(ie,{className:"flex flex-col gap-4 p-5 sm:flex-row sm:items-start sm:p-6",children:[jsx("div",{className:"shrink-0",children:jsx(yt,{author:e.author,size:"lg"})}),jsxs("div",{className:"min-w-0 flex-1 space-y-2",children:[jsxs("div",{className:"flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between",children:[jsxs("div",{className:"min-w-0",children:[jsx("p",{className:"text-muted-foreground text-sm font-medium",children:"Written by"}),jsxs("h2",{className:"text-foreground flex flex-wrap items-center gap-2 text-xl font-semibold",children:[e.author.name,e.author.isGuest&&jsx(Ue,{variant:"outline",className:"text-xs",children:"Guest Author"})]})]}),jsx(jr,{author:e.author})]}),jsx("p",{className:"text-muted-foreground leading-relaxed",children:e.author.bio})]})]})})]}),((o??false)||a||s.length>0)&&jsxs("div",{className:"mx-auto mt-12 max-w-4xl space-y-8",children:[jsx(le,{}),o&&jsx(Fr,{cta:o}),a&&jsx(qr,{title:e.title,url:v}),s.length>0&&jsx(Xr,{articles:s.slice(0,3),basePath:u})]}),(!!r?.previousArticle||!!r?.nextArticle)&&jsxs("nav",{className:"article-nav mx-auto mt-12 max-w-4xl",children:[jsx(le,{className:"mb-8"}),jsxs("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-2",children:[r?.previousArticle&&jsx(oe,{className:"group cursor-pointer transition-colors hover:border-[var(--blog-accent-border)] hover:bg-[var(--blog-accent-bg)]",children:jsxs(K,{href:r.previousArticle.url,className:"block",children:[r.previousArticle.featuredImage&&jsx(ze,{src:r.previousArticle.featuredImage,alt:r.previousArticle.featuredImageAlt??`Featured image for ${r.previousArticle.title}`}),jsxs(ie,{className:"p-4",children:[jsx("div",{className:"text-muted-foreground mb-2 text-sm font-medium",children:"\u2190 Previous Article"}),jsx("div",{className:"text-foreground transition-colors group-hover:text-[var(--blog-text-accent)]",children:r.previousArticle.title})]})]})}),r?.nextArticle&&jsx(oe,{className:f("group cursor-pointer transition-colors hover:border-[var(--blog-accent-border)] hover:bg-[var(--blog-accent-bg)]",!r?.previousArticle&&"md:col-start-2"),children:jsxs(K,{href:r.nextArticle.url,className:"block",children:[r.nextArticle.featuredImage&&jsx(ze,{src:r.nextArticle.featuredImage,alt:r.nextArticle.featuredImageAlt??`Featured image for ${r.nextArticle.title}`}),jsxs(ie,{className:"p-4 md:text-right",children:[jsx("div",{className:"text-muted-foreground mb-2 text-sm font-medium",children:"Next Article \u2192"}),jsx("div",{className:"text-foreground transition-colors group-hover:text-[var(--blog-text-accent)]",children:r.nextArticle.title})]})]})})]})]}),(()=>{let d=ne(_e(e,{pathPrefix:u}));return jsx("script",{type:d.type,dangerouslySetInnerHTML:d.dangerouslySetInnerHTML})})()]})}function yt({author:e,size:t}){let r=t==="lg"?"h-12 w-12 text-base":"h-9 w-9 text-sm",n=zr(e.name);return e.avatarUrl?jsx(De,{src:e.avatarUrl,alt:e.name,width:t==="lg"?48:36,height:t==="lg"?48:36,className:f("shrink-0 rounded-full object-cover",r),loading:"lazy"}):jsx("span",{className:f("bg-muted text-muted-foreground inline-flex shrink-0 items-center justify-center rounded-full font-medium",r),"aria-hidden":"true",children:n})}function jr({author:e}){let t=Gr(e);return t.length===0?null:jsx("div",{className:"flex flex-wrap items-center gap-1 sm:justify-end",children:t.map(r=>jsx("a",{href:r.href,target:r.external?"_blank":void 0,rel:r.external?"noopener noreferrer":void 0,"aria-label":`${e.name} ${r.label}`,className:"text-muted-foreground hover:bg-background/60 hover:text-foreground inline-flex size-7 items-center justify-center rounded-full transition-colors",children:r.icon},r.key))})}function Gr(e){let t=e.socialLinks;return t?[t.website?{key:"website",href:t.website,label:"website",external:true,icon:jsx(Globe,{className:"size-4","aria-hidden":"true"})}:void 0,t.x?{key:"x",href:t.x,label:"on X",external:true,icon:jsx(FaXTwitter,{className:"size-4","aria-hidden":"true"})}:void 0,t.linkedin?{key:"linkedin",href:t.linkedin,label:"on LinkedIn",external:true,icon:jsx(FaLinkedinIn,{className:"size-4","aria-hidden":"true"})}:void 0,t.github?{key:"github",href:t.github,label:"on GitHub",external:true,icon:jsx(FaGithub,{className:"size-4","aria-hidden":"true"})}:void 0,t.email?{key:"email",href:`mailto:${t.email}`,label:"email",external:false,icon:jsx(Mail,{className:"size-4","aria-hidden":"true"})}:void 0].filter(n=>!!n):[]}function zr(e){return e.trim().split(/\s+/).filter(Boolean).slice(0,2).map(r=>r[0]?.toUpperCase()).join("")||"?"}function Fr({cta:e}){return jsx("div",{className:"rounded-2xl border border-[var(--blog-accent-border)] bg-[var(--blog-accent-bg)] p-5 sm:p-6",children:jsxs("div",{className:"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",children:[jsxs("div",{className:"space-y-1",children:[jsx("h2",{className:"text-foreground text-xl font-semibold",children:e.title}),e.description&&jsx("p",{className:"text-muted-foreground leading-relaxed",children:e.description})]}),jsxs(K,{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,jsx(ArrowUpRight,{className:"size-4","aria-hidden":"true"})]})]})})}function qr({title:e,url:t}){let r=encodeURIComponent(e),n=encodeURIComponent(t);return jsxs("div",{className:"flex flex-wrap items-center justify-center gap-2 sm:gap-3",children:[jsx(xe,{title:e,url:t,size:"sm"}),jsx("a",{href:`https://x.com/intent/tweet?text=${r}&url=${n}`,target:"_blank",rel:"noopener noreferrer","aria-label":"Share on X",className:"text-muted-foreground hover:text-foreground border-border inline-flex size-9 items-center justify-center rounded-full border grayscale transition-colors hover:border-[var(--blog-accent-border)] hover:bg-[var(--blog-accent-bg)]",children:jsx(FaXTwitter,{className:"size-4","aria-hidden":"true"})}),jsx("a",{href:`https://www.linkedin.com/sharing/share-offsite/?url=${n}`,target:"_blank",rel:"noopener noreferrer","aria-label":"Share on LinkedIn",className:"text-muted-foreground hover:text-foreground border-border inline-flex size-9 items-center justify-center rounded-full border grayscale transition-colors hover:border-[var(--blog-accent-border)] hover:bg-[var(--blog-accent-bg)]",children:jsx(FaLinkedinIn,{className:"size-4","aria-hidden":"true"})}),jsx("a",{href:`mailto:?subject=${r}&body=${n}`,"aria-label":"Share by email",className:"text-muted-foreground hover:text-foreground border-border inline-flex size-9 items-center justify-center rounded-full border grayscale transition-colors hover:border-[var(--blog-accent-border)] hover:bg-[var(--blog-accent-bg)]",children:jsx(Mail,{className:"size-4","aria-hidden":"true"})})]})}function Xr({articles:e,basePath:t}){return jsxs("section",{className:"space-y-4","aria-labelledby":"related-articles-title",children:[jsx("h2",{id:"related-articles-title",className:"text-xl font-semibold",children:"You might also like"}),jsx("div",{className:"grid gap-4 md:grid-cols-3",children:e.map(r=>jsxs(K,{href:L(t,r.slug),className:"group border-border overflow-hidden rounded-2xl border transition-colors hover:border-[var(--blog-accent-border)] hover:bg-[var(--blog-accent-bg)] hover:no-underline",children:[r.featuredImage&&jsx(ze,{src:r.featuredImage,alt:r.featuredImageAlt??`Featured image for ${r.title}`}),jsxs("div",{className:"p-4",children:[jsx("h3",{className:"text-foreground line-clamp-3 font-semibold transition-colors group-hover:text-[var(--blog-text-accent)]",children:r.title}),r.excerpt&&jsx("p",{className:"text-muted-foreground mt-2 line-clamp-3 text-sm leading-relaxed",children:r.excerpt})]})]},r.id))})]})}function ze({src:e,alt:t}){return jsx("div",{className:"border-border aspect-[16/9] overflow-hidden border-b bg-[var(--blog-accent-bg)]",children:jsx(De,{src:e,alt:t,width:480,height:270,className:"h-full w-full object-cover transition-transform duration-500 group-hover:scale-105"})})}function Wr(e,t="/blog"){let r=e.meta.title??e.title,n=e.meta.description??e.excerpt,i=e.meta.canonicalUrl??`${e.site.domain}${L(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 Kr(e){let t=e.topics??[];return t.find(r=>r.isPrimary)??t[0]??null}function qe(e){let t=new Map;for(let r of e)for(let n of r.topics??[])t.has(n.slug)||t.set(n.slug,n);return Array.from(t.values()).sort((r,n)=>r.name.localeCompare(n.name))}function Xe(e,t){let r=e.filter(i=>(i.topics??[]).some(o=>o.slug===t));if(r.length===0)return null;let n=r.flatMap(i=>i.topics??[]).find(i=>i.slug===t)??null;return n?{topic:n,articles:r}:null}function Qr({articles:e,basePath:t="/blog",title:r="Topics",description:n="Browse articles by topic.",className:i,theme:o}){let s=k(t)||"/",a=qe(e);return jsxs("main",{style:U(o),className:f("blog-topics-page container mx-auto max-w-5xl px-4 py-8 sm:px-6 sm:py-12 lg:px-8 lg:py-16",i),children:[jsxs("header",{className:"mb-10 space-y-3 text-center",children:[jsx(K,{href:s,className:"text-muted-foreground hover:text-[var(--blog-accent)] text-sm font-medium transition-colors",children:"Back to all articles"}),jsx("h1",{className:"text-4xl font-semibold tracking-tight text-balance sm:text-5xl",children:r}),jsx("p",{className:"text-muted-foreground mx-auto max-w-2xl text-lg text-pretty",children:n})]}),a.length===0?jsx("p",{className:"text-muted-foreground rounded-2xl border p-8 text-center",children:"No topics have published articles yet."}):jsx("div",{className:"grid gap-4 sm:grid-cols-2 lg:grid-cols-3",children:a.map(u=>{let l=e.filter(m=>(m.topics??[]).some(p=>p.slug===u.slug)).length;return jsxs(K,{href:L(s,`topics/${u.slug}`),className:"group rounded-2xl border border-[var(--blog-accent-border)] bg-[var(--blog-card-bg)] p-5 transition hover:border-[var(--blog-accent)] hover:no-underline",children:[jsx("h2",{className:"group-hover:text-[var(--blog-accent)] text-xl font-semibold transition-colors",children:u.name}),u.description&&jsx("p",{className:"text-muted-foreground mt-2 line-clamp-3 text-sm leading-relaxed",children:u.description}),jsxs("p",{className:"text-muted-foreground mt-4 text-sm",children:[l," ",l===1?"article":"articles"]})]},u.slug)})})]})}function Zr({articles:e,topicSlug:t,basePath:r="/blog",className:n,theme:i}){let o=k(r)||"/",s=Xe(e,t);return jsxs("main",{style:U(i),className:f("blog-topic-archive-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:[jsxs("header",{className:"mb-10 space-y-3 text-center",children:[jsx(K,{href:L(o,"topics"),className:"text-muted-foreground hover:text-[var(--blog-accent)] text-sm font-medium transition-colors",children:"Back to all topics"}),jsx("h1",{className:"text-4xl font-semibold tracking-tight text-balance sm:text-5xl",children:s?.topic.name??"Topic not found"}),s?.topic.description&&jsx("p",{className:"text-muted-foreground mx-auto max-w-2xl text-lg text-pretty",children:s.topic.description})]}),s?jsx("div",{className:"grid gap-5 md:grid-cols-2",children:s.articles.map(a=>jsx(en,{article:a,topic:s.topic,basePath:o},a.id))}):jsx("p",{className:"text-muted-foreground rounded-2xl border p-8 text-center",children:"No published articles were found for this topic."})]})}function en({article:e,topic:t,basePath:r}){let n=L(r,e.slug),i=formatDistanceToNow(new Date(e.publishedAt),{addSuffix:true});return jsxs(K,{href:n,className:"group overflow-hidden rounded-2xl border border-[var(--blog-accent-border)] bg-[var(--blog-card-bg)] transition hover:border-[var(--blog-accent)] hover:no-underline",children:[e.featuredImage&&jsx("div",{className:"relative aspect-[16/9] overflow-hidden",children:jsx(De,{src:e.featuredImage,alt:e.featuredImageAlt??e.title,width:640,height:360,className:"h-full w-full object-cover transition-transform duration-300 group-hover:scale-105"})}),jsxs("div",{className:"space-y-3 p-5",children:[jsx("span",{className:"inline-flex rounded-full border border-[var(--blog-accent-border)] px-2.5 py-1 text-xs font-medium text-[var(--blog-text-accent)]",children:t.name}),jsx("h2",{className:"group-hover:text-[var(--blog-accent)] text-xl font-semibold text-balance transition-colors",children:e.title}),e.excerpt&&jsx("p",{className:"text-muted-foreground line-clamp-3 text-sm leading-relaxed",children:e.excerpt}),jsx("p",{className:"text-muted-foreground text-sm",children:i})]})]})}function We(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 ve=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=>We(t);hashToken(t){return t.substring(0,8)+"..."}},J=class extends ve{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);}},ce=class{async validateToken(){return {valid:true,context:{development:true}}}extractToken(){return "development-mode"}},Pe=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 tn(){return globalThis.__BLOG_PLATFORM_AUTH_CONFIG__??=new Pe,globalThis.__BLOG_PLATFORM_AUTH_CONFIG__}function Ae(e){globalThis.__BLOG_PLATFORM_AUTH_CONFIG__=e;}function Ke(){return globalThis.__BLOG_PLATFORM_AUTH_CONFIG__??tn()}function rn(e){Ae(new J(e));}async function $(e){let t=Ke(),r=t.extractToken?t.extractToken(e):We(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 nn(e,t=""){let n=Ke().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 V(e){let t=await $(e);return t.authenticated?{authenticated:true,context:t.result.context}:{authenticated:false,error:nn(t.result)}}function on(){let e=process.env.SKIP_BLOG_PLATFORM_AUTH;return e==="true"||e==="1"||process.env.NODE_ENV==="test"}var we=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((u,l)=>{let m=new Date(u[i]).getTime(),p=new Date(l[i]).getTime();return o==="desc"?p-m:m-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 sn(){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 an(){let e=globalThis;e.__BLOG_PLATFORM_STORAGE__||(sn(),e.__BLOG_PLATFORM_STORAGE__=new we);let t=e.__BLOG_PLATFORM_STORAGE__;if(!t)throw new Error("Blog platform storage not initialized");return t}function j(){return an()}function Je(e){let t=globalThis;t.__BLOG_PLATFORM_STORAGE__=e;}function cn(){return globalThis.__BLOG_PLATFORM_RATE_LIMITER__??null}function un(e){let t=globalThis;t.__BLOG_PLATFORM_RATE_LIMITER__=e;}function Se(e){let{redisUrl:t,redisToken:r,requestsPerMinute:n=5,keyPrefix:i="blog-platform-ratelimit",analytics:o=true}=e,s=new Redis({url:t,token:r}),a=new Ratelimit({redis:s,analytics:o,prefix:i,limiter:Ratelimit.slidingWindow(n,"1m")});un(a);}function Ye(){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}Se({redisUrl:e,redisToken:t}),console.log("Blog platform: Rate limiting configured (5 requests per minute per token)");}async function Rt(e){let t=cn();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 Nt(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 D(e,t=""){let r=await Rt(e);return r.success?{allowed:true,rateLimitResult:r}:{allowed:false,errorResponse:Nt(r,t)}}function T(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 Re(e){let{auth:t,storage:r,rateLimit:n,autoRateLimit:i=true}=e;if(!t)throw new Error(`Blog platform initialization failed: 'auth' is required.
3
78
  Example: initBlogPlatform({ auth: new EnvAuth() })
4
- See https://github.com/xexr/blog-platform#authentication for more details.`);console.log("Blog platform: Setting up authentication"),be(t),n?(console.log("Blog platform: Using custom rate limiting configuration"),ye(n)):i?(console.log("Blog platform: Auto-configuring rate limiting from environment"),Fe()):console.log("Blog platform: Rate limiting disabled"),r?(console.log("Blog platform: Using custom storage provider"),je(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 jr(e){if(globalThis.__BLOG_PLATFORM_INITIALISED__){console.log("Blog platform: Already initialized, skipping");return}console.log("Blog platform: Initializing blog platform once"),ve(e);}function Fr(){ve({auth:new se,autoRateLimit:false}),console.log("Blog platform: Development mode enabled (no auth, in-memory storage, no rate limiting)");}function zr(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.`);ve({auth:new K(t),autoRateLimit:true}),console.log("Blog platform: Production mode enabled (environment-based auth, rate limiting)");}var A=sqliteTable("bp_articles",{id:text("id").primaryKey(),slug:text("slug").notNull(),title:text("title").notNull(),excerpt:text("excerpt").notNull(),content:text("content").notNull(),readingSeconds:integer("reading_seconds").notNull(),wordCount:integer("word_count").notNull(),publishedAt:text("published_at").notNull(),updatedAt:text("updated_at").notNull(),featuredImage:text("featured_image"),featuredImageAlt:text("featured_image_alt"),authorJson:text("author_json"),siteJson:text("site_json").notNull(),metaJson:text("meta_json").notNull(),version:integer("version").notNull()},e=>({slugUniqueIdx:uniqueIndex("bp_articles_slug_unique").on(e.slug)})),J=sqliteTable("bp_operations",{key:text("key").primaryKey(),resultJson:text("result_json").notNull(),createdAt:integer("created_at",{mode:"timestamp_ms"}).notNull(),expiresAt:integer("expires_at",{mode:"timestamp_ms"})});function Jr(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,__bloggyTopics:e.topics??[]}),version:e.version}}function ht(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),topics:Yr(e.metaJson),meta:Qr(e.metaJson),version:e.version}}function Yr(e){return JSON.parse(e).__bloggyTopics??[]}function Qr(e){let t=JSON.parse(e);return delete t.__bloggyTopics,t}var ze=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:A.id}).from(A).where(eq(A.id,t.id)).limit(1)).length!==0)return n}else return n;let i=await this.db.select().from(A).where(eq(A.slug,t.slug)).limit(1),o=i[0];if(o&&o.id!==t.id){let u={success:false,error:{code:"PUB003",message:"This URL is already in use. Please choose another."},idempotencyKey:r};return await this.storeOperationResult(r,u),u}let s=Jr(t);i.length===0?await this.db.insert(A).values(s).run():await this.db.update(A).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(and(eq(A.id,s.id),eq(A.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(A).where(eq(A.slug,t)).limit(1);return r[0]?ht(r[0]):null}async listArticles(t={}){let{limit:r=10,offset:n=0,sortBy:i="publishedAt",order:o="desc"}=t,s=i==="publishedAt"?A.publishedAt:A.updatedAt,a=o==="desc"?desc(s):s,u=await this.db.select().from(A).orderBy(a).limit(r).offset(n),l=await this.db.select({c:sql`count(*)`}).from(A),d=Number(l?.[0]?.c??0);return {articles:u.map(ht),total:d}}async removeArticle(t,r){let n=await this.checkIdempotency(r);if(n)if(n.success){if(!((await this.db.select({id:A.id}).from(A).where(eq(A.slug,t)).limit(1)).length>0))return n}else return n;if(!(await this.db.select().from(A).where(eq(A.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(A).where(eq(A.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(J).where(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(),i=this.options.operationTtlMs?n+this.options.operationTtlMs:null;await this.db.delete(J).where(eq(J.key,t)).run(),await this.db.insert(J).values({key:t,resultJson:JSON.stringify(r),createdAt:new Date(n),expiresAt:i?new Date(i):null}).run();}};function Zr(){return {createArticles:`CREATE TABLE IF NOT EXISTS bp_articles (
79
+ See https://github.com/xexr/blog-platform#authentication for more details.`);console.log("Blog platform: Setting up authentication"),Ae(t),n?(console.log("Blog platform: Using custom rate limiting configuration"),Se(n)):i?(console.log("Blog platform: Auto-configuring rate limiting from environment"),Ye()):console.log("Blog platform: Rate limiting disabled"),r?(console.log("Blog platform: Using custom storage provider"),Je(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 dn(e){if(globalThis.__BLOG_PLATFORM_INITIALISED__){console.log("Blog platform: Already initialized, skipping");return}console.log("Blog platform: Initializing blog platform once"),Re(e);}function mn(){Re({auth:new ce,autoRateLimit:false}),console.log("Blog platform: Development mode enabled (no auth, in-memory storage, no rate limiting)");}function pn(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.`);Re({auth:new J(t),autoRateLimit:true}),console.log("Blog platform: Production mode enabled (environment-based auth, rate limiting)");}var A=sqliteTable("bp_articles",{id:text("id").primaryKey(),slug:text("slug").notNull(),title:text("title").notNull(),excerpt:text("excerpt").notNull(),content:text("content").notNull(),readingSeconds:integer("reading_seconds").notNull(),wordCount:integer("word_count").notNull(),publishedAt:text("published_at").notNull(),updatedAt:text("updated_at").notNull(),featuredImage:text("featured_image"),featuredImageAlt:text("featured_image_alt"),authorJson:text("author_json"),siteJson:text("site_json").notNull(),metaJson:text("meta_json").notNull(),version:integer("version").notNull()},e=>({slugUniqueIdx:uniqueIndex("bp_articles_slug_unique").on(e.slug)})),Y=sqliteTable("bp_operations",{key:text("key").primaryKey(),resultJson:text("result_json").notNull(),createdAt:integer("created_at",{mode:"timestamp_ms"}).notNull(),expiresAt:integer("expires_at",{mode:"timestamp_ms"})});function xn(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,__bloggyTopics:e.topics??[]}),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),topics:yn(e.metaJson),meta:vn(e.metaJson),version:e.version}}function yn(e){return JSON.parse(e).__bloggyTopics??[]}function vn(e){let t=JSON.parse(e);return delete t.__bloggyTopics,t}var Qe=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:A.id}).from(A).where(eq(A.id,t.id)).limit(1)).length!==0)return n}else return n;let i=await this.db.select().from(A).where(eq(A.slug,t.slug)).limit(1),o=i[0];if(o&&o.id!==t.id){let u={success:false,error:{code:"PUB003",message:"This URL is already in use. Please choose another."},idempotencyKey:r};return await this.storeOperationResult(r,u),u}let s=xn(t);i.length===0?await this.db.insert(A).values(s).run():await this.db.update(A).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(and(eq(A.id,s.id),eq(A.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(A).where(eq(A.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"?A.publishedAt:A.updatedAt,a=o==="desc"?desc(s):s,u=await this.db.select().from(A).orderBy(a).limit(r).offset(n),l=await this.db.select({c:sql`count(*)`}).from(A),m=Number(l?.[0]?.c??0);return {articles:u.map(Tt),total:m}}async removeArticle(t,r){let n=await this.checkIdempotency(r);if(n)if(n.success){if(!((await this.db.select({id:A.id}).from(A).where(eq(A.slug,t)).limit(1)).length>0))return n}else return n;if(!(await this.db.select().from(A).where(eq(A.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(A).where(eq(A.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(Y).where(eq(Y.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(Y).where(eq(Y.key,t)).run(),await this.db.insert(Y).values({key:t,resultJson:JSON.stringify(r),createdAt:new Date(n),expiresAt:i?new Date(i):null}).run();}};function Pn(){return {createArticles:`CREATE TABLE IF NOT EXISTS bp_articles (
5
80
  id TEXT PRIMARY KEY,
6
81
  slug TEXT NOT NULL UNIQUE,
7
82
  title TEXT NOT NULL,
@@ -22,11 +97,11 @@ See https://github.com/xexr/blog-platform#authentication for more details.`);con
22
97
  result_json TEXT NOT NULL,
23
98
  created_at INTEGER NOT NULL,
24
99
  expires_at INTEGER
25
- );`}}function Y(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 xt(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 z(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=Y(i,r),a=xt(e.slug),u=o.replace(/^(?!\/)/,"/").replace(/\/+$/,""),l=`${s}${u}/${a}`;return n&&(l=l.replace(/\/+$/,"")),l}function en(e,t,r={}){return z({slug:t,site:e},r)}function tn(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 rn(e){try{let t=new URL(e);return `${t.protocol}//${t.host}`}catch{throw new Error("Invalid canonical URL provided")}}function nn(e,t={}){let r=z(e,t);return {...e,meta:{...e.meta,canonicalUrl:r}}}function on(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,u=t.openGraph?.siteName??e.name,l=[{name:"description",content:a},{name:"author",content:u}];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:u},{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:`${u} - ${e.tagline}`});let p=sn(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 sn(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 an(e){let t=[];return t.push(`<title>${C(e.title)}</title>`),e.meta.forEach(r=>{let n=[];r.name&&n.push(`name="${C(r.name)}"`),r.property&&n.push(`property="${C(r.property)}"`),r.httpEquiv&&n.push(`http-equiv="${C(r.httpEquiv)}"`),n.push(`content="${C(r.content)}"`),t.push(`<meta ${n.join(" ")} />`);}),e.openGraph.forEach(r=>{t.push(`<meta property="${C(r.property)}" content="${C(r.content)}" />`);}),e.twitter.forEach(r=>{t.push(`<meta name="${C(r.name)}" content="${C(r.content)}" />`);}),e.links.forEach(r=>{let n=[];n.push(`rel="${C(r.rel)}"`),n.push(`href="${C(r.href)}"`),r.type&&n.push(`type="${C(r.type)}"`),r.title&&n.push(`title="${C(r.title)}"`),t.push(`<link ${n.join(" ")} />`);}),t.join(`
26
- `)}function C(e){let t={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;"};return e.replace(/[&<>"']/g,r=>t[r]??r)}function ln(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 qe(e,t,r=[],n={}){let{includeAuthorPages:i=true,includePaginationPages:o=true,articlesPerPage:s=10,maxEntries:a=5e4,changeFrequency:u={},priority:l={}}=n,d=[],p=Y(n.canonical?.domain??e.domain,n.canonical?.forceHttps??true),P=n.canonical?.pathPrefix??"/blog";if(d.push({url:`${p}${P}`,lastModified:Q(t),changeFrequency:u.homePage??"daily",priority:l.homePage??1}),t.forEach(x=>{if(d.length>=a)return;let m=z(x,n.canonical);d.push({url:m,lastModified:x.updatedAt,changeFrequency:u.articles??"monthly",priority:l.articles??.8});}),i&&r.forEach(x=>{if(d.length>=a)return;let m=`${p}${P}/authors/${x.slug}`,g=t.filter(O=>O.author?.id===x.id),v=Q(g);d.push({url:m,lastModified:v,changeFrequency:u.authorPages??"weekly",priority:l.authorPages??.6});}),o&&t.length>s){let x=Math.ceil(t.length/s);for(let m=2;m<=x&&!(d.length>=a);m++)d.push({url:`${p}${P}?page=${m}`,lastModified:Q(t),changeFrequency:u.paginationPages??"daily",priority:l.paginationPages??.5});}return d}function cn(e,t,r=[],n={}){let{includeAuthorPages:i=true,includePaginationPages:o=true,articlesPerPage:s=10,maxEntries:a=5e4,changeFrequency:u={},priority:l={}}=n,d=[],p=Y(n.canonical?.domain??e.domain,n.canonical?.forceHttps??true),P=n.canonical?.pathPrefix??"/blog",x=new Date().toISOString(),m=1;if(m+=t.length,i&&(m+=r.length),o&&t.length>s){let v=Math.ceil(t.length/s);m+=v-1;}let g=m>a;if(d.push({loc:`${p}${P}`,lastmod:Q(t),changefreq:u.homePage??"daily",priority:l.homePage??1}),t.forEach(v=>{if(d.length>=a)return;let O=z(v,n.canonical);d.push({loc:O,lastmod:v.updatedAt,changefreq:u.articles??"monthly",priority:l.articles??.8});}),i&&r.forEach(v=>{if(d.length>=a)return;let O=`${p}${P}/authors/${v.slug}`,Tt=t.filter(Lt=>Lt.author?.id===v.id),Ct=Q(Tt);d.push({loc:O,lastmod:Ct,changefreq:u.authorPages??"weekly",priority:l.authorPages??.6});}),o&&t.length>s){let v=Math.ceil(t.length/s);for(let O=2;O<=v&&!(d.length>=a);O++)d.push({loc:`${p}${P}?page=${O}`,lastmod:Q(t),changefreq:u.paginationPages??"daily",priority:l.paginationPages??.5});}return {entries:d,totalEntries:d.length,truncated:g,generatedAt:x,baseUrl:p}}function yt(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>${le(o.loc)}</loc>`),o.lastmod&&s.push(` <lastmod>${le(o.lastmod)}</lastmod>`),o.changefreq&&s.push(` <changefreq>${le(o.changefreq)}</changefreq>`),o.priority!==void 0&&s.push(` <priority>${o.priority.toFixed(1)}</priority>`),s.push(" </url>"),s.join(`
100
+ );`}}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 Lt(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 q(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=Lt(e.slug),u=o.replace(/^(?!\/)/,"/").replace(/\/+$/,""),l=`${s}${u}/${a}`;return n&&(l=l.replace(/\/+$/,"")),l}function An(e,t,r={}){return q({slug:t,site:e},r)}function wn(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 Sn(e){try{let t=new URL(e);return `${t.protocol}//${t.host}`}catch{throw new Error("Invalid canonical URL provided")}}function Rn(e,t={}){let r=q(e,t);return {...e,meta:{...e.meta,canonicalUrl:r}}}function Nn(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,u=t.openGraph?.siteName??e.name,l=[{name:"description",content:a},{name:"author",content:u}];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 m=[{property:"og:title",content:s},{property:"og:description",content:a},{property:"og:url",content:o},{property:"og:site_name",content:u},{property:"og:locale",content:t.openGraph?.locale??e.locale},{property:"og:type",content:t.openGraph?.type??"website"}];t.openGraph?.defaultImage&&m.push({property:"og:image",content:t.openGraph.defaultImage},{property:"og:image:alt",content:`${u} - ${e.tagline}`});let p=Tn(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:m,twitter:p,links:[{rel:"canonical",href:o}],title:s,description:a,canonicalUrl:o}}function Tn(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 Cn(e){let t=[];return t.push(`<title>${C(e.title)}</title>`),e.meta.forEach(r=>{let n=[];r.name&&n.push(`name="${C(r.name)}"`),r.property&&n.push(`property="${C(r.property)}"`),r.httpEquiv&&n.push(`http-equiv="${C(r.httpEquiv)}"`),n.push(`content="${C(r.content)}"`),t.push(`<meta ${n.join(" ")} />`);}),e.openGraph.forEach(r=>{t.push(`<meta property="${C(r.property)}" content="${C(r.content)}" />`);}),e.twitter.forEach(r=>{t.push(`<meta name="${C(r.name)}" content="${C(r.content)}" />`);}),e.links.forEach(r=>{let n=[];n.push(`rel="${C(r.rel)}"`),n.push(`href="${C(r.href)}"`),r.type&&n.push(`type="${C(r.type)}"`),r.title&&n.push(`title="${C(r.title)}"`),t.push(`<link ${n.join(" ")} />`);}),t.join(`
101
+ `)}function C(e){let t={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;"};return e.replace(/[&<>"']/g,r=>t[r]??r)}function Ln(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 Ze(e,t,r=[],n={}){let{includeAuthorPages:i=true,includePaginationPages:o=true,articlesPerPage:s=10,maxEntries:a=5e4,changeFrequency:u={},priority:l={}}=n,m=[],p=Q(n.canonical?.domain??e.domain,n.canonical?.forceHttps??true),v=n.canonical?.pathPrefix??"/blog";if(m.push({url:`${p}${v}`,lastModified:Z(t),changeFrequency:u.homePage??"daily",priority:l.homePage??1}),t.forEach(h=>{if(m.length>=a)return;let d=q(h,n.canonical);m.push({url:d,lastModified:h.updatedAt,changeFrequency:u.articles??"monthly",priority:l.articles??.8});}),i&&r.forEach(h=>{if(m.length>=a)return;let d=`${p}${v}/authors/${h.slug}`,g=t.filter(I=>I.author?.id===h.id),P=Z(g);m.push({url:d,lastModified:P,changeFrequency:u.authorPages??"weekly",priority:l.authorPages??.6});}),o&&t.length>s){let h=Math.ceil(t.length/s);for(let d=2;d<=h&&!(m.length>=a);d++)m.push({url:`${p}${v}?page=${d}`,lastModified:Z(t),changeFrequency:u.paginationPages??"daily",priority:l.paginationPages??.5});}return m}function In(e,t,r=[],n={}){let{includeAuthorPages:i=true,includePaginationPages:o=true,articlesPerPage:s=10,maxEntries:a=5e4,changeFrequency:u={},priority:l={}}=n,m=[],p=Q(n.canonical?.domain??e.domain,n.canonical?.forceHttps??true),v=n.canonical?.pathPrefix??"/blog",h=new Date().toISOString(),d=1;if(d+=t.length,i&&(d+=r.length),o&&t.length>s){let P=Math.ceil(t.length/s);d+=P-1;}let g=d>a;if(m.push({loc:`${p}${v}`,lastmod:Z(t),changefreq:u.homePage??"daily",priority:l.homePage??1}),t.forEach(P=>{if(m.length>=a)return;let I=q(P,n.canonical);m.push({loc:I,lastmod:P.updatedAt,changefreq:u.articles??"monthly",priority:l.articles??.8});}),i&&r.forEach(P=>{if(m.length>=a)return;let I=`${p}${v}/authors/${P.slug}`,Dt=t.filter(Ht=>Ht.author?.id===P.id),Ut=Z(Dt);m.push({loc:I,lastmod:Ut,changefreq:u.authorPages??"weekly",priority:l.authorPages??.6});}),o&&t.length>s){let P=Math.ceil(t.length/s);for(let I=2;I<=P&&!(m.length>=a);I++)m.push({loc:`${p}${v}?page=${I}`,lastmod:Z(t),changefreq:u.paginationPages??"daily",priority:l.paginationPages??.5});}return {entries:m,totalEntries:m.length,truncated:g,generatedAt:h,baseUrl:p}}function It(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>${de(o.loc)}</loc>`),o.lastmod&&s.push(` <lastmod>${de(o.lastmod)}</lastmod>`),o.changefreq&&s.push(` <changefreq>${de(o.changefreq)}</changefreq>`),o.priority!==void 0&&s.push(` <priority>${o.priority.toFixed(1)}</priority>`),s.push(" </url>"),s.join(`
27
102
  `)});return [t,r,...i,n].join(`
28
- `)}function un(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>${le(s.url)}</loc>`),s.lastmod&&a.push(` <lastmod>${le(s.lastmod)}</lastmod>`),a.push(" </sitemap>"),a.join(`
103
+ `)}function kn(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>${de(s.url)}</loc>`),s.lastmod&&a.push(` <lastmod>${de(s.lastmod)}</lastmod>`),a.push(" </sitemap>"),a.join(`
29
104
  `)});return [r,n,...o,i].join(`
30
- `)}function mn(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&&!gn(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 Q(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 dn(e,t,r=[],n={}){return async function(){let s=(await qe(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:Y(n.canonical?.domain??e.domain,n.canonical?.forceHttps??true)},u=yt(a);return new Response(u,{headers:{"Content-Type":"application/xml","Cache-Control":"public, max-age=3600, s-maxage=3600"}})}}function pn(e){return async function(){let r=await e.getSite(),n=await e.getArticles(),i=e.getAuthors?await e.getAuthors():[];return qe(r,n,i,e.options)}}function le(e){let t={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;"};return e.replace(/[&<>"']/g,r=>t[r]??r)}function gn(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.7"};function vt(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 B(){let e=vt(Z.version);return {name:Z.name,version:Z.version,...e}}function G(e){try{let t=e.split(" "),r={};for(let n of t){let[i,o]=n.split("/");if(!i||!o)continue;let s=vt(o),a={name:i,version:o,...s};i==="bloggy"?r.bloggyVersion=a:i==="platform"&&(r.platformVersion=a);}return r}catch{return null}}function Pt(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 hn(){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 bn(e){return Object.entries(e).map(([t,r])=>r?`${t} ${r}`:t).join("; ")}function xn(e){return Object.entries(e).map(([t,r])=>`${t}=${r}`).join(", ")}function yn(e,t={}){let r={...hn(),...t},n={};if(r.enableCSP){let i={...r.cspDirectives,...t.cspDirectives??{}};n["Content-Security-Policy"]=bn(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&&vn(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"]=xn(i);}return n}function vn(e){return !!(e.url.startsWith("https://")||e.headers.get("x-forwarded-proto")==="https"||e.headers.get("cf-visitor")?.includes('"scheme":"https"'))}function Pe(e,t={}){return yn(e,{...t,cspDirectives:{...{"default-src":"'none'","frame-ancestors":"'none'","base-uri":"'none'"},...t.cspDirectives??{}}})}var St={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 Rt(){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 {...St,allowedOrigins:e?e.split(",").map(n=>n.trim()):St.allowedOrigins,allowWildcard:t,allowCredentials:r}}function wt(e,t){return e?t.allowWildcard?true:t.allowedOrigins.includes(e):false}function Nt(e,t){let r=e.headers.get("origin"),n={};return t.allowWildcard?n["Access-Control-Allow-Origin"]="*":r&&wt(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 Pn(e,t,r,n){return {...Nt(e,t),"Access-Control-Allow-Methods":r.join(", "),"Access-Control-Allow-Headers":n.join(", "),"Access-Control-Max-Age":t.maxAge.toString()}}var An=["Content-Type","X-Bloggy-Version","X-Idempotency-Key","Authorization","X-Requested-With"];function y(e,t,r={}){let{status:n=200,headers:i={},corsConfig:o={}}=r,s={...Rt(),...o},a=Nt(e,s),u=Pe(e,s.securityConfig),l={"Content-Type":"application/json",...a,...u,...i};return NextResponse.json(t,{status:n,headers:l})}function ce(e,t,r={}){let{allowedHeaders:n=An,corsConfig:i={}}=r,o={...Rt(),...i},s=e.headers.get("origin");if(s&&!o.allowWildcard&&!wt(s,o)){let l=Pe(e,o.securityConfig);return new NextResponse(null,{status:403,headers:{"Content-Type":"text/plain",...l}})}let a=Pn(e,o,[...t,"OPTIONS"],n),u=Pe(e,o.securityConfig);return new NextResponse(null,{status:200,headers:{...a,...u}})}async function Sn(e){try{let t=await M(e);if(!t.authenticated){let g=await H(e);return y(e,g.error,{status:401})}let r=t.token??"anonymous",n=await D(r);if(!n.allowed){let g=n.errorResponse.error?.details?.rateLimit,v=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},O=T(v);return y(e,n.errorResponse,{status:429,headers:O})}if(!e.headers.get("content-type")?.includes("application/json"))return y(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 y(e,{success:!1,error:{code:"PUB001",message:"Invalid JSON in request body"},idempotencyKey:""},{status:400})}let s=Rn(o);if(s.length>0)return y(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=G(a);if(g?.platformVersion){let v=B();if(g.platformVersion.major!==v.major)return y(e,{success:!1,error:{code:"PUB009",message:"Major version incompatibility. Please upgrade your blog platform package.",details:{clientVersion:g.platformVersion.version,serverVersion:v.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"),y(e,{success:!0,warnings:g,idempotencyKey:o.idempotencyKey},{status:200})}let u={...o.article,slug:o.slug??o.article.slug,meta:{...o.article.meta,description:o.metaDescription??o.article.meta.description}};if(!We(u.slug))return y(e,{success:!1,error:{code:"PUB002",message:"Slug can only contain lowercase letters, numbers, and hyphens"},idempotencyKey:o.idempotencyKey},{status:400});let d=await V().saveArticle(u,o.idempotencyKey),p=B(),P=T(n.rateLimitResult),x={"X-Bloggy-Version":`platform/${p.version}`,"X-Idempotency-Key":o.idempotencyKey,...P};d.success&&(x.Location=d.url??`/${u.slug}`);let m=d.success?201:d.error?.code==="PUB003"?409:400;return y(e,d,{status:m,headers:x})}catch(t){return console.error("Publish endpoint error:",t),y(e,{success:false,error:{code:"PUB007",message:"Internal server error during publishing"},idempotencyKey:""},{status:500})}}function Rn(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 We(e){return !e||typeof e!="string"?false:/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(e)&&e.length>=1&&e.length<=100}async function Nn(e){try{let t=await M(e);if(!t.authenticated){let m=await H(e);return NextResponse.json(m.error,{status:401})}let r=t.token??"anonymous",n=await D(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},v=T(g);return y(e,n.errorResponse,{status:429,headers:v})}if(!e.headers.get("content-type")?.includes("application/json"))return y(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 y(e,{success:!1,error:{code:"PUB001",message:"Invalid JSON in request body"},idempotencyKey:""},{status:400})}let s=Tn(o);if(s.length>0)return y(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=G(a);if(m?.platformVersion){let g=B();if(m.platformVersion.major!==g.major)return y(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(!Cn(o.slug))return y(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 V().getArticle(o.slug),v=[];return g||v.push("Article with this slug does not exist"),y(e,{success:!0,warnings:v,idempotencyKey:o.idempotencyKey},{status:200})}let l=await V().removeArticle(o.slug,o.idempotencyKey),d=B(),p=T(n.rateLimitResult),P={"X-Bloggy-Version":`platform/${d.version}`,"X-Idempotency-Key":o.idempotencyKey,...p},x=l.success?200:l.error?.code==="PUB007"?404:400;return y(e,l,{status:x,headers:P})}catch(t){return console.error("Unpublish endpoint error:",t),y(e,{success:false,error:{code:"PUB007",message:"Internal server error during unpublishing"},idempotencyKey:""},{status:500})}}function Tn(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 Cn(e){return !e||typeof e!="string"?false:/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(e)&&e.length>=1&&e.length<=100}async function Ln(e){try{let t=await M(e);if(!t.authenticated){let p=await H(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 y(e,P,{status:401})}let r=t.token??"anonymous",n=await D(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},x=T(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 y(e,m,{status:429,headers:x})}let i=B(),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),x=parseInt(p[1]??"0",10),m=parseInt(p[2]?.split("-")[0]??"0",10);s={name:"bloggy",version:o,major:P,minor:x,patch:m};}else {let p=G(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=Pt(s,i));let u={success:!0,versions:{bloggy:s,platform:i},compatibility:a},l=T(n.rateLimitResult),d={"X-Bloggy-Version":`platform/${i.version}`,"Cache-Control":"public, max-age=300, stale-while-revalidate=60",...l};return y(e,u,{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 y(e,r,{status:500})}}async function _n(e,{params:t}){try{let{slug:r}=await t,n=await M(e);if(!n.authenticated){let g=await H(e);return NextResponse.json(g.error,{status:401})}let i=n.token??"anonymous",o=await D(i);if(!o.allowed){let g=o.errorResponse.error?.details?.rateLimit||{limit:10,remaining:0,reset:Date.now()+6e4,count:10,success:!1},v=T(g);return y(e,o.errorResponse,{status:429,headers:v})}if(!r||!We(r))return y(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=G(s);if(g?.platformVersion){let v=B();if(g.platformVersion.major!==v.major)return y(e,{exists:!1,error:{code:"PUB009",message:"Major version incompatibility. Please upgrade your blog platform package.",details:{clientVersion:g.platformVersion.version,serverVersion:v.version}}},{status:409})}}let l=await V().getArticle(r)!==null,d={exists:l,...l&&{message:"Slug is already in use. Please choose another (e.g., append '-v2')."}},p=B(),P=T(o.rateLimitResult),x={"X-Bloggy-Version":`platform/${p.version}`,...P},m=e.headers.get("X-Idempotency-Key");return m&&(x["X-Idempotency-Key"]=m,console.log(`Slug check for idempotency: ${m}, exists: ${l}`)),y(e,d,{status:200,headers:x})}catch(r){return console.error("Slug existence check error:",r instanceof Error?r.message:String(r)),y(e,{exists:false,error:{code:"PUB007",message:"Internal server error during slug check"}},{status:500})}}async function Bn(e){return ce(e,["GET"])}var Ji=Z.version;
31
- export{fe as ApiKeyAuth,dt as BlogArticlePage,ot as BlogHomePage,Br as BlogTopicArchivePage,_r as BlogTopicsIndexPage,It as Button,ne as Card,oe as CardContent,sr as CardDescription,ar as CardFooter,or as CardHeader,ir as CardTitle,ze as DrizzleStorage,K as EnvAuth,xe as InMemoryStorage,se as NoAuth,Ji as PACKAGE_VERSION,de as Pagination,Se as PaginationContent,me as PaginationEllipsis,E as PaginationItem,j as PaginationLink,we as PaginationNext,Re as PaginationPrevious,Ae as ShadcnPagination,te as StructuredDataError,he as UninitializedAuth,Fe as autoConfigureRateLimit,A as bpArticles,J as bpOperations,L as buildBlogPath,ue as buttonVariants,gt as checkRateLimit,h as cn,ye as configureRateLimit,dn as createBlogSitemapRoute,pn as createDynamicBlogSitemap,ft as createRateLimitErrorResponse,re as createStructuredDataScript,D as enforceRateLimit,jt as extractKeywordsFromArticle,Be as extractTableOfContents,Ve as extractTokenFromHeader,_e as formatArticleDateMeta,Tr as generateArticleMetadata,pe as generateArticleStructuredData,Je as generateAuthorStructuredData,er as generateBlogHomeMetadata,Oe as generateBlogHomeStructuredData,qe as generateBlogSitemapEntries,Ye as generateBreadcrumbStructuredData,z as generateCanonicalUrl,en as generateCanonicalUrlFromSlug,Le as generateCompleteArticleStructuredData,Te as generateOrganizationStructuredData,Gt as generatePaginationMetadata,on as generateSiteMetadata,cn as generateSitemap,un as generateSitemapIndex,Ce as generateWebSiteStructuredData,Ue as getAllTopics,Cr as getArticlePrimaryTopic,Ge as getAuthConfig,rn as getBaseUrl,$ as getBlogThemeStyle,Zr as getDrizzleAdapterSql,zt as getPathPrefixFromBlogUrl,T as getRateLimitHeaders,V as getStorage,He as getTopicArchive,ve as initBlogPlatform,Fr as initBlogPlatformDev,jr as initBlogPlatformOnce,zr as initBlogPlatformProd,Er as initEnvAuth,tn as isValidCanonicalUrl,an as metadataToHtml,_ as normalizeBlogBasePath,Y as normalizeDomain,xt as normalizeSlug,Sn as publishHandler,Ft as safeGenerateArticleStructuredData,be as setAuthConfig,je as setStorage,Dr as shouldSkipAuth,yt as sitemapToXml,_n as slugExistsHandler,Bn as slugExistsOptionsHandler,Ze as structuredDataToJsonLd,Nn as unpublishHandler,nn as updateArticleCanonicalUrl,Vt as usePagination,ln as validateMetadata,mn as validateSitemap,Qe as validateStructuredData,Ln as versionHandler};//# sourceMappingURL=index.mjs.map
105
+ `)}function On(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&&!En(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 Bn(e,t,r=[],n={}){return async function(){let s=(await Ze(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)},u=It(a);return new Response(u,{headers:{"Content-Type":"application/xml","Cache-Control":"public, max-age=3600, s-maxage=3600"}})}}function _n(e){return async function(){let r=await e.getSite(),n=await e.getArticles(),i=e.getAuthors?await e.getAuthors():[];return Ze(r,n,i,e.options)}}function de(e){let t={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;"};return e.replace(/[&<>"']/g,r=>t[r]??r)}function En(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 ee={name:"@xexr/blog-platform",version:"1.0.8"};function kt(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 B(){let e=kt(ee.version);return {name:ee.name,version:ee.version,...e}}function G(e){try{let t=e.split(" "),r={};for(let n of t){let[i,o]=n.split("/");if(!i||!o)continue;let s=kt(o),a={name:i,version:o,...s};i==="bloggy"?r.bloggyVersion=a:i==="platform"&&(r.platformVersion=a);}return r}catch{return null}}function Ot(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 Bt={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 $n(){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 {...Bt,enableCSP:!e,frameOptions:t??Bt.frameOptions,enableHSTS:!r}}function Dn(e){return Object.entries(e).map(([t,r])=>r?`${t} ${r}`:t).join("; ")}function Un(e){return Object.entries(e).map(([t,r])=>`${t}=${r}`).join(", ")}function Hn(e,t={}){let r={...$n(),...t},n={};if(r.enableCSP){let i={...r.cspDirectives,...t.cspDirectives??{}};n["Content-Security-Policy"]=Dn(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&&Vn(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"]=Un(i);}return n}function Vn(e){return !!(e.url.startsWith("https://")||e.headers.get("x-forwarded-proto")==="https"||e.headers.get("cf-visitor")?.includes('"scheme":"https"'))}function Ne(e,t={}){return Hn(e,{...t,cspDirectives:{...{"default-src":"'none'","frame-ancestors":"'none'","base-uri":"'none'"},...t.cspDirectives??{}}})}var _t={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 Et(){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 {..._t,allowedOrigins:e?e.split(",").map(n=>n.trim()):_t.allowedOrigins,allowWildcard:t,allowCredentials:r}}function Mt(e,t){return e?t.allowWildcard?true:t.allowedOrigins.includes(e):false}function $t(e,t){let r=e.headers.get("origin"),n={};return t.allowWildcard?n["Access-Control-Allow-Origin"]="*":r&&Mt(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 jn(e,t,r,n){return {...$t(e,t),"Access-Control-Allow-Methods":r.join(", "),"Access-Control-Allow-Headers":n.join(", "),"Access-Control-Max-Age":t.maxAge.toString()}}var Gn=["Content-Type","X-Bloggy-Version","X-Idempotency-Key","Authorization","X-Requested-With"];function y(e,t,r={}){let{status:n=200,headers:i={},corsConfig:o={}}=r,s={...Et(),...o},a=$t(e,s),u=Ne(e,s.securityConfig),l={"Content-Type":"application/json",...a,...u,...i};return NextResponse.json(t,{status:n,headers:l})}function me(e,t,r={}){let{allowedHeaders:n=Gn,corsConfig:i={}}=r,o={...Et(),...i},s=e.headers.get("origin");if(s&&!o.allowWildcard&&!Mt(s,o)){let l=Ne(e,o.securityConfig);return new NextResponse(null,{status:403,headers:{"Content-Type":"text/plain",...l}})}let a=jn(e,o,[...t,"OPTIONS"],n),u=Ne(e,o.securityConfig);return new NextResponse(null,{status:200,headers:{...a,...u}})}async function zn(e){try{let t=await $(e);if(!t.authenticated){let g=await V(e);return y(e,g.error,{status:401})}let r=t.token??"anonymous",n=await D(r);if(!n.allowed){let g=n.errorResponse.error?.details?.rateLimit,P=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},I=T(P);return y(e,n.errorResponse,{status:429,headers:I})}if(!e.headers.get("content-type")?.includes("application/json"))return y(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 y(e,{success:!1,error:{code:"PUB001",message:"Invalid JSON in request body"},idempotencyKey:""},{status:400})}let s=Fn(o);if(s.length>0)return y(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=G(a);if(g?.platformVersion){let P=B();if(g.platformVersion.major!==P.major)return y(e,{success:!1,error:{code:"PUB009",message:"Major version incompatibility. Please upgrade your blog platform package.",details:{clientVersion:g.platformVersion.version,serverVersion:P.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"),y(e,{success:!0,warnings:g,idempotencyKey:o.idempotencyKey},{status:200})}let u={...o.article,slug:o.slug??o.article.slug,meta:{...o.article.meta,description:o.metaDescription??o.article.meta.description}};if(!tt(u.slug))return y(e,{success:!1,error:{code:"PUB002",message:"Slug can only contain lowercase letters, numbers, and hyphens"},idempotencyKey:o.idempotencyKey},{status:400});let m=await j().saveArticle(u,o.idempotencyKey),p=B(),v=T(n.rateLimitResult),h={"X-Bloggy-Version":`platform/${p.version}`,"X-Idempotency-Key":o.idempotencyKey,...v};m.success&&(h.Location=m.url??`/${u.slug}`);let d=m.success?201:m.error?.code==="PUB003"?409:400;return y(e,m,{status:d,headers:h})}catch(t){return console.error("Publish endpoint error:",t),y(e,{success:false,error:{code:"PUB007",message:"Internal server error during publishing"},idempotencyKey:""},{status:500})}}function Fn(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 tt(e){return !e||typeof e!="string"?false:/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(e)&&e.length>=1&&e.length<=100}async function Xn(e){try{let t=await $(e);if(!t.authenticated){let d=await V(e);return NextResponse.json(d.error,{status:401})}let r=t.token??"anonymous",n=await D(r);if(!n.allowed){let d=n.errorResponse.error?.details?.rateLimit,g=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},P=T(g);return y(e,n.errorResponse,{status:429,headers:P})}if(!e.headers.get("content-type")?.includes("application/json"))return y(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 y(e,{success:!1,error:{code:"PUB001",message:"Invalid JSON in request body"},idempotencyKey:""},{status:400})}let s=Wn(o);if(s.length>0)return y(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 d=G(a);if(d?.platformVersion){let g=B();if(d.platformVersion.major!==g.major)return y(e,{success:!1,error:{code:"PUB009",message:"Major version incompatibility. Please upgrade your blog platform package.",details:{clientVersion:d.platformVersion.version,serverVersion:g.version}},idempotencyKey:o.idempotencyKey},{status:409})}}if(!Kn(o.slug))return y(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 j().getArticle(o.slug),P=[];return g||P.push("Article with this slug does not exist"),y(e,{success:!0,warnings:P,idempotencyKey:o.idempotencyKey},{status:200})}let l=await j().removeArticle(o.slug,o.idempotencyKey),m=B(),p=T(n.rateLimitResult),v={"X-Bloggy-Version":`platform/${m.version}`,"X-Idempotency-Key":o.idempotencyKey,...p},h=l.success?200:l.error?.code==="PUB007"?404:400;return y(e,l,{status:h,headers:v})}catch(t){return console.error("Unpublish endpoint error:",t),y(e,{success:false,error:{code:"PUB007",message:"Internal server error during unpublishing"},idempotencyKey:""},{status:500})}}function Wn(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 Kn(e){return !e||typeof e!="string"?false:/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(e)&&e.length>=1&&e.length<=100}async function Jn(e){try{let t=await $(e);if(!t.authenticated){let p=await V(e),v={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 y(e,v,{status:401})}let r=t.token??"anonymous",n=await D(r);if(!n.allowed){let p=n.errorResponse.error?.details?.rateLimit,v=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},h=T(v),d={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 y(e,d,{status:429,headers:h})}let i=B(),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("."),v=parseInt(p[0]??"0",10),h=parseInt(p[1]??"0",10),d=parseInt(p[2]?.split("-")[0]??"0",10);s={name:"bloggy",version:o,major:v,minor:h,patch:d};}else {let p=G(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=Ot(s,i));let u={success:!0,versions:{bloggy:s,platform:i},compatibility:a},l=T(n.rateLimitResult),m={"X-Bloggy-Version":`platform/${i.version}`,"Cache-Control":"public, max-age=300, stale-while-revalidate=60",...l};return y(e,u,{status:200,headers:m})}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 y(e,r,{status:500})}}async function Qn(e,{params:t}){try{let{slug:r}=await t,n=await $(e);if(!n.authenticated){let g=await V(e);return NextResponse.json(g.error,{status:401})}let i=n.token??"anonymous",o=await D(i);if(!o.allowed){let g=o.errorResponse.error?.details?.rateLimit||{limit:10,remaining:0,reset:Date.now()+6e4,count:10,success:!1},P=T(g);return y(e,o.errorResponse,{status:429,headers:P})}if(!r||!tt(r))return y(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=G(s);if(g?.platformVersion){let P=B();if(g.platformVersion.major!==P.major)return y(e,{exists:!1,error:{code:"PUB009",message:"Major version incompatibility. Please upgrade your blog platform package.",details:{clientVersion:g.platformVersion.version,serverVersion:P.version}}},{status:409})}}let l=await j().getArticle(r)!==null,m={exists:l,...l&&{message:"Slug is already in use. Please choose another (e.g., append '-v2')."}},p=B(),v=T(o.rateLimitResult),h={"X-Bloggy-Version":`platform/${p.version}`,...v},d=e.headers.get("X-Idempotency-Key");return d&&(h["X-Idempotency-Key"]=d,console.log(`Slug check for idempotency: ${d}, exists: ${l}`)),y(e,m,{status:200,headers:h})}catch(r){return console.error("Slug existence check error:",r instanceof Error?r.message:String(r)),y(e,{exists:false,error:{code:"PUB007",message:"Internal server error during slug check"}},{status:500})}}async function Zn(e){return me(e,["GET"])}var Cs=ee.version;
106
+ export{ve as ApiKeyAuth,wt as BlogArticlePage,mt as BlogHomePage,Zr as BlogTopicArchivePage,Qr as BlogTopicsIndexPage,Ft as Button,oe as Card,ie as CardContent,br as CardDescription,xr as CardFooter,fr as CardHeader,hr as CardTitle,Qe as DrizzleStorage,J as EnvAuth,we as InMemoryStorage,ce as NoAuth,Cs as PACKAGE_VERSION,fe as Pagination,Ce as PaginationContent,ge as PaginationEllipsis,M as PaginationItem,z as PaginationLink,Ie as PaginationNext,Le as PaginationPrevious,Te as ShadcnPagination,re as StructuredDataError,Pe as UninitializedAuth,Ye as autoConfigureRateLimit,A as bpArticles,Y as bpOperations,L as buildBlogPath,pe as buttonVariants,Rt as checkRateLimit,f as cn,Se as configureRateLimit,Bn as createBlogSitemapRoute,_n as createDynamicBlogSitemap,Nt as createRateLimitErrorResponse,ne as createStructuredDataScript,D as enforceRateLimit,er as extractKeywordsFromArticle,$e as extractTableOfContents,We as extractTokenFromHeader,Me as formatArticleDateMeta,Wr as generateArticleMetadata,he as generateArticleStructuredData,nt as generateAuthorStructuredData,dr as generateBlogHomeMetadata,Ee as generateBlogHomeStructuredData,Ze as generateBlogSitemapEntries,ot as generateBreadcrumbStructuredData,q as generateCanonicalUrl,An as generateCanonicalUrlFromSlug,_e as generateCompleteArticleStructuredData,Oe as generateOrganizationStructuredData,Zt as generatePaginationMetadata,Nn as generateSiteMetadata,In as generateSitemap,kn as generateSitemapIndex,Be as generateWebSiteStructuredData,qe as getAllTopics,Kr as getArticlePrimaryTopic,Ke as getAuthConfig,Sn as getBaseUrl,U as getBlogThemeStyle,Pn as getDrizzleAdapterSql,rr as getPathPrefixFromBlogUrl,T as getRateLimitHeaders,j as getStorage,Xe as getTopicArchive,Re as initBlogPlatform,mn as initBlogPlatformDev,dn as initBlogPlatformOnce,pn as initBlogPlatformProd,rn as initEnvAuth,wn as isValidCanonicalUrl,Cn as metadataToHtml,k as normalizeBlogBasePath,Q as normalizeDomain,Lt as normalizeSlug,zn as publishHandler,tr as safeGenerateArticleStructuredData,Ae as setAuthConfig,Je as setStorage,on as shouldSkipAuth,It as sitemapToXml,Qn as slugExistsHandler,Zn as slugExistsOptionsHandler,st as structuredDataToJsonLd,Xn as unpublishHandler,Rn as updateArticleCanonicalUrl,Qt as usePagination,Ln as validateMetadata,On as validateSitemap,it as validateStructuredData,Jn as versionHandler};//# sourceMappingURL=index.mjs.map
32
107
  //# sourceMappingURL=index.mjs.map