@xexr/blog-platform 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.2.1
4
+
5
+ ### Patch Changes
6
+
7
+ - adjust readme
8
+
3
9
  ## 0.2.0
4
10
 
5
11
  ### Minor Changes
package/README.md CHANGED
@@ -1132,39 +1132,23 @@ pnpm type
1132
1132
  pnpm lint
1133
1133
  ```
1134
1134
 
1135
- ## Changelog
1136
-
1137
- ### 0.1.2
1138
-
1139
- - **SECURITY**: Changed default authentication to fail-closed (was fail-open) - all requests now rejected until `initBlogPlatform()` called
1140
- - **SECURITY**: Added authentication requirement to `/api/blog/version` endpoint (was unprotected)
1141
- - **SECURITY**: Added comprehensive security headers to all API endpoints (CORS on 401/OPTIONS responses)
1142
- - **SECURITY**: Added page-level security headers via middleware (CSP, X-Frame-Options, X-Content-Type-Options, Referrer-Policy)
1143
- - **Enhancement**: Theme inheritance via semantic Tailwind classes - blog now automatically inherits consumer's colors, fonts, and dark mode
1144
- - **Enhancement**: Guest author badges and bio display on article pages
1145
- - **Enhancement**: Improved version compatibility checking with proper semantic versioning
1146
- - **Enhancement**: Author bio passthrough in publish payload for rich author cards
1147
- - **Fix**: Version endpoint now correctly reports both Bloggy and platform versions
1148
- - **Fix**: Incompatible versions now return HTTP 200 with compatibility details (was 409)
1149
- - **Fix**: Removed tone adjectives from UI and JSON-LD to avoid exposing writing style data
1150
- - **Docs**: Added comprehensive publishing workflow guide
1151
- - **Docs**: Added theme customization and styling documentation
1152
-
1153
- ### 0.1.1
1154
-
1155
- - **BREAKING**: Replaced `next-mdx-remote` with `next-mdx-remote-client` for React 19 compatibility
1156
- - Fixed property mangling issue in build configuration that was breaking `dangerouslySetInnerHTML`
1157
- - Improved React 19 fiber reconciliation compatibility
1158
- - Enhanced error handling for MDX rendering
1159
-
1160
- ### 0.1.0
1161
-
1162
- - Initial release
1163
- - Blog page components with MDX rendering
1164
- - Publishing API with idempotency support
1165
- - Rate limiting with Upstash Redis
1166
- - SEO optimization features
1167
- - TypeScript declarations
1135
+ ## Recent Changes
1136
+
1137
+ ### v0.2.0 - Latest (2025-01-06)
1138
+
1139
+ - 🚀 **Automated Versioning**: Set up semantic versioning with changesets
1140
+ - 🚀 **GitHub Actions**: Added automated publishing workflow
1141
+ - 📦 **NPM Package**: Published to public NPM registry
1142
+ - 📝 **Documentation**: Enhanced README with installation and setup guides
1143
+
1144
+ ### v0.1.2 (2025-01-06)
1145
+
1146
+ - 🔒 **Security**: Fail-closed authentication and comprehensive security headers
1147
+ - 🎨 **Enhancements**: Theme inheritance, guest author badges, version compatibility
1148
+ - 🐛 **Fixes**: Version endpoint, incompatible version handling, tone adjective removal
1149
+ - 📚 **Docs**: Publishing workflow and styling documentation
1150
+
1151
+ > **Full Changelog**: See [CHANGELOG.md](./CHANGELOG.md) for complete version history.
1168
1152
 
1169
1153
  ## License
1170
1154
 
@@ -1,4 +1,4 @@
1
- import { type NextRequest, NextResponse } from "next/server";
1
+ import type { NextRequest, NextResponse } from "next/server";
2
2
  import { getStorage } from "@/lib/database";
3
3
  import { getBlogPlatformVersion, parseVersionHeader } from "@/lib/version";
4
4
  import { requireAuth, authenticateRequest } from "@/lib/auth";
@@ -1,5 +1,4 @@
1
- import type { NextRequest } from "next/server";
2
- import { NextResponse } from "next/server";
1
+ import type { NextRequest, NextResponse } from "next/server";
3
2
  import {
4
3
  getBlogPlatformVersion,
5
4
  parseVersionHeader,
@@ -61,7 +60,8 @@ export async function GET(
61
60
  },
62
61
  compatibility: {
63
62
  compatible: false,
64
- errorMessage: authCheck.error?.error?.message ?? "Authentication required",
63
+ errorMessage:
64
+ authCheck.error?.error?.message ?? "Authentication required",
65
65
  },
66
66
  };
67
67
  return createCorsResponse(request, errorResponse, { status: 401 });
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- 'use strict';var m=require('react'),ve=require('next/link'),Me=require('next/image'),clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),lucideReact=require('lucide-react'),reactSlot=require('@radix-ui/react-slot'),classVarianceAuthority=require('class-variance-authority'),dateFns=require('date-fns'),rsc=require('next-mdx-remote-client/rsc'),Ae=require('@radix-ui/react-separator'),ratelimit=require('@upstash/ratelimit'),redis=require('@upstash/redis'),drizzleOrm=require('drizzle-orm'),sqliteCore=require('drizzle-orm/sqlite-core'),server=require('next/server');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var m__namespace=/*#__PURE__*/_interopNamespace(m);var ve__default=/*#__PURE__*/_interopDefault(ve);var Me__default=/*#__PURE__*/_interopDefault(Me);var Ae__namespace=/*#__PURE__*/_interopNamespace(Ae);function P(...e){return tailwindMerge.twMerge(clsx.clsx(e))}var Q=classVarianceAuthority.cva("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",{variants:{variant:{default:"bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",destructive:"bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",outline:"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2 has-[>svg]:px-3",sm:"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",lg:"h-10 rounded-md px-6 has-[>svg]:px-4",icon:"size-9"}},defaultVariants:{variant:"default",size:"default"}});function lt({className:e,variant:t,size:r,asChild:n=false,...s}){return m__namespace.createElement(n?reactSlot.Slot:"button",{"data-slot":"button",className:P(Q({variant:t,size:r,className:e})),...s})}function me({className:e,...t}){return m__namespace.createElement("nav",{role:"navigation","aria-label":"pagination","data-slot":"pagination",className:P("mx-auto flex w-full justify-center",e),...t})}function pe({className:e,...t}){return m__namespace.createElement("ul",{"data-slot":"pagination-content",className:P("flex flex-row items-center gap-1",e),...t})}function L({...e}){return m__namespace.createElement("li",{"data-slot":"pagination-item",...e})}function D({className:e,isActive:t,size:r="icon",...n}){return m__namespace.createElement("a",{"aria-current":t?"page":void 0,"data-slot":"pagination-link","data-active":t,className:P(Q({variant:t?"outline":"ghost",size:r}),e),...n})}function de({className:e,...t}){return m__namespace.createElement(D,{"aria-label":"Go to previous page",size:"default",className:P("gap-1 px-2.5 sm:pl-2.5",e),...t},m__namespace.createElement(lucideReact.ChevronLeftIcon,null),m__namespace.createElement("span",{className:"hidden sm:block"},"Previous"))}function ge({className:e,...t}){return m__namespace.createElement(D,{"aria-label":"Go to next page",size:"default",className:P("gap-1 px-2.5 sm:pr-2.5",e),...t},m__namespace.createElement("span",{className:"hidden sm:block"},"Next"),m__namespace.createElement(lucideReact.ChevronRightIcon,null))}function Z({className:e,...t}){return m__namespace.createElement("span",{"aria-hidden":true,"data-slot":"pagination-ellipsis",className:P("flex size-9 items-center justify-center",e),...t},m__namespace.createElement(lucideReact.MoreHorizontalIcon,{className:"size-4"}),m__namespace.createElement("span",{className:"sr-only"},"More pages"))}function ee({currentPage:e,totalPages:t,baseUrl:r,className:n,maxVisiblePages:s=5,showPrevNext:i=true,showFirstLast:o=true}){if(t<=1)return null;let a=()=>{let u=Math.floor(s/2),g=Math.max(1,e-u),y=Math.min(t,g+s-1);return y-g+1<s&&(g=Math.max(1,y-s+1)),{start:g,end:y}},{start:c,end:l}=a(),d=Array.from({length:l-c+1},(u,g)=>c+g),p=u=>u===1?r:`${r}?page=${u}`,S=e>1,b=e<t;return m__namespace.default.createElement(me,{className:n},m__namespace.default.createElement(pe,null,o&&e>2&&m__namespace.default.createElement(m__namespace.default.Fragment,null,m__namespace.default.createElement(L,null,m__namespace.default.createElement(D,{href:p(1),"aria-label":"Go to first page"},m__namespace.default.createElement(lucideReact.ChevronsLeft,{className:"h-4 w-4"}))),c>2&&m__namespace.default.createElement(L,null,m__namespace.default.createElement(Z,null))),i&&m__namespace.default.createElement(L,null,S?m__namespace.default.createElement(de,{href:p(e-1)}):m__namespace.default.createElement("span",{className:"flex h-9 items-center justify-center gap-1 px-2.5 text-muted-foreground sm:pl-2.5"},m__namespace.default.createElement("span",{className:"hidden sm:block"},"Previous"))),d.map(u=>m__namespace.default.createElement(L,{key:u},m__namespace.default.createElement(D,{href:p(u),isActive:u===e},u))),i&&m__namespace.default.createElement(L,null,b?m__namespace.default.createElement(ge,{href:p(e+1)}):m__namespace.default.createElement("span",{className:"flex h-9 items-center justify-center gap-1 px-2.5 text-muted-foreground sm:pr-2.5"},m__namespace.default.createElement("span",{className:"hidden sm:block"},"Next"))),o&&e<t-1&&m__namespace.default.createElement(m__namespace.default.Fragment,null,l<t-1&&m__namespace.default.createElement(L,null,m__namespace.default.createElement(Z,null)),m__namespace.default.createElement(L,null,m__namespace.default.createElement(D,{href:p(t),"aria-label":"Go to last page"},m__namespace.default.createElement(lucideReact.ChevronsRight,{className:"h-4 w-4"}))))),m__namespace.default.createElement("div",{className:"sr-only","aria-live":"polite"},"Page ",e," of ",t))}function gt(e,t=10){let r=e.page,n=Array.isArray(r)?r[0]:r,s=Math.max(1,parseInt(n??"1",10)),i=(s-1)*t;return {currentPage:s,itemsPerPage:t,offset:i,calculateTotalPages:a=>Math.ceil(a/t)}}function ft(e,t,r,n){let s=n?`${n}${e===1?r:`${r}?page=${e}`}`:void 0,i=e>1&&n?`${n}${e===2?r:`${r}?page=${e-1}`}`:void 0,o=e<t&&n?`${n}${r}?page=${e+1}`:void 0;return {alternates:{...s&&{canonical:s}},other:{...i&&{prev:i},...o&&{next:o}}}}function te(e,t={}){let{customDomain:r,pathPrefix:n="/blog",language:s,isAccessibleForFree:i=true,includeOptionalProperties:o=true}=t,a=r??e.site.domain,c=r?`https://${a}${n}/${e.slug}`:e.meta.canonicalUrl??`https://${a}${n}/${e.slug}`,l=e.author?Be(e.author,{customDomain:r,pathPrefix:n}):void 0,d=fe(e.site,{customDomain:r,pathPrefix:n}),S=`PT${Math.max(1,Math.ceil(e.readingSeconds/60))}M`,b={"@context":"https://schema.org","@type":"BlogPosting","@id":`${c}#article`,headline:e.title,description:e.excerpt,datePublished:e.publishedAt,dateModified:e.updatedAt,author:l,publisher:d,mainEntityOfPage:{"@type":"WebPage","@id":c},wordCount:e.wordCount,timeRequired:S,isAccessibleForFree:i};return o&&(e.featuredImage&&(b.image=e.featuredImage),e.meta.keywords.length>0&&(b.keywords=[...e.meta.keywords]),(s??e.site.locale)&&(b.inLanguage=s??e.site.locale),e.site.toneAdjectives.length>0&&(b.about=e.site.toneAdjectives.map(u=>({"@type":"Thing",name:u}))),e.site.toneAdjectives.length>0&&(b.genre=[...e.site.toneAdjectives])),b}function Be(e,t={}){let{customDomain:r,pathPrefix:n="/blog"}=t,s={"@context":"https://schema.org","@type":"Person","@id":`#author-${e.id}`,name:e.name,identifier:e.id};if(e.bio&&(s.description=e.bio),e.slug?.trim()){let i=r?`https://${r}${n}/authors/${e.slug}`:`${n}/authors/${e.slug}`;s.url=i;}return e.isGuest&&(s.additionalType="GuestAuthor"),s}function fe(e,t={}){let{customDomain:r,pathPrefix:n="/blog"}=t,i=`https://${r??e.domain}${n}`,o={"@context":"https://schema.org","@type":"Organization","@id":`${i}#organization`,name:e.name,url:i};return e.description?.trim()&&(o.description=e.description),e.tagline?.trim()&&(o.description=o.description?`${o.description}. ${e.tagline}`:e.tagline),o}function he(e,t={}){let{customDomain:r,pathPrefix:n="/blog",language:s,includeSearchAction:i=true}=t,a=`https://${r??e.domain}${n}`,c=fe(e,t),l={"@context":"https://schema.org","@type":"WebSite","@id":`${a}#website`,name:e.name,url:a,publisher:c};return e.description?.trim()&&(l.description=e.description),(s??e.locale)&&(l.inLanguage=s??e.locale),i&&(l.potentialAction={"@type":"SearchAction",target:{"@type":"EntryPoint",urlTemplate:`${a}?search={search_term_string}`},"query-input":"required name=search_term_string"}),l}function Ie(e,t={}){let{customDomain:r}=t;return {"@context":"https://schema.org","@type":"BreadcrumbList",itemListElement:e.map((n,s)=>({"@type":"ListItem",position:s+1,name:n.name,item:r&&!n.url.startsWith("http")?`https://${r}${n.url}`:n.url}))}}function be(e,t={}){let r=[];r.push(te(e,t)),r.push(he(e.site,t));let n=t.pathPrefix??"/blog",s=[{name:"Home",url:"/"},{name:e.site.name,url:n},{name:e.title,url:`${n}/${e.slug}`}];return r.push(Ie(s,t)),r}function ye(e,t=[],r={}){let n=[];if(n.push(he(e,r)),t.length>0){let s=t.slice(0,5).map(i=>te(i,r));n.push(...s);}return n}function ke(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 De(e){return JSON.stringify(e,null,0)}function q(e){return {type:"application/ld+json",dangerouslySetInnerHTML:{__html:De(e)}}}function ht(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 F=class extends Error{constructor(r,n,s){super(r);this.code=n;this.details=s;this.name="StructuredDataError";}};function bt(e,t={}){try{let r=te(e,t),n=ke(r);return n.isValid?{schema:r}:{error:new F("Generated schema validation failed","VALIDATION_FAILED",n.errors)}}catch(r){return {error:new F("Failed to generate structured data","GENERATION_FAILED",r)}}}function $e({articles:e,siteName:t,siteTagline:r,className:n,site:s,includeStructuredData:i=false,pagination:o}){return m__namespace.default.createElement("div",{className:P("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)},t&&m__namespace.default.createElement("header",{className:"blog-header mb-8 text-center sm:mb-12 lg:mb-16"},m__namespace.default.createElement("h1",{className:"blog-title text-foreground mb-2 text-3xl font-light tracking-tight sm:text-4xl lg:text-5xl"},t),r&&m__namespace.default.createElement("p",{className:"blog-tagline text-muted-foreground text-base sm:text-lg"},r)),m__namespace.default.createElement("main",{className:"articles-list"},e.length===0?m__namespace.default.createElement("div",{className:"no-articles text-muted-foreground py-16 text-center sm:py-24 lg:py-32"},m__namespace.default.createElement("h2",{className:"mb-3 text-xl font-light sm:mb-4 sm:text-2xl lg:text-3xl"},"No articles yet"),m__namespace.default.createElement("p",{className:"text-muted-foreground/70 mx-auto max-w-md text-base sm:text-lg"},"This blog doesn't have any published articles yet.")):m__namespace.default.createElement("div",{className:"space-y-0"},e.map(a=>m__namespace.default.createElement(St,{key:a.id,article:a}))),o&&o.totalPages>1&&m__namespace.default.createElement("div",{className:"pagination-wrapper mt-12"},m__namespace.default.createElement(ee,{currentPage:o.currentPage,totalPages:o.totalPages,baseUrl:o.baseUrl??"/blog",className:"justify-center"}))),i&&s&&(()=>{let a=q(ye(s,e.slice(0,5)));return m__namespace.default.createElement("script",{type:a.type,dangerouslySetInnerHTML:a.dangerouslySetInnerHTML})})())}function Pt(e){return `${Math.ceil(e/60)} min read`}function St({article:e}){let t=`/blog/${e.slug}`,r=dateFns.formatDistanceToNow(new Date(e.publishedAt),{addSuffix:true}),n=Pt(e.readingSeconds),s=e.featuredImage;return m__namespace.default.createElement("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"},m__namespace.default.createElement(ve__default.default,{href:t,className:"focus-visible:ring-ring block rounded-lg hover:no-underline focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none","aria-label":`Read article: ${e.title}`},m__namespace.default.createElement("div",{className:"space-y-4 lg:hidden"},s&&m__namespace.default.createElement("div",{className:"relative aspect-[16/10] w-full overflow-hidden rounded-lg"},m__namespace.default.createElement(Me__default.default,{src:s,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"})),m__namespace.default.createElement("div",{className:"space-y-3"},m__namespace.default.createElement("h2",{className:"group-hover:text-primary text-lg leading-tight font-bold transition-colors sm:text-xl md:text-2xl"},e.title),m__namespace.default.createElement("div",{className:"flex flex-wrap items-center gap-x-3 gap-y-1 text-sm text-muted-foreground"},e.author&&m__namespace.default.createElement(m__namespace.default.Fragment,null,m__namespace.default.createElement("span",{className:"font-medium"},e.author.name),m__namespace.default.createElement("span",{className:"text-border"},"\u2022")),m__namespace.default.createElement("time",{dateTime:e.publishedAt,className:"font-medium","aria-label":`Published ${r}`},r),m__namespace.default.createElement("span",{className:"text-border"},"\u2022"),m__namespace.default.createElement("span",{className:"font-medium"},n)),e.excerpt&&m__namespace.default.createElement("p",{className:"text-muted-foreground line-clamp-3 text-sm leading-relaxed sm:text-base"},e.excerpt))),m__namespace.default.createElement("div",{className:"hidden items-start gap-6 lg:flex xl:gap-8"},s&&m__namespace.default.createElement("div",{className:"relative aspect-[16/10] w-64 shrink-0 overflow-hidden rounded-lg xl:w-72"},m__namespace.default.createElement(Me__default.default,{src:s,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"})),m__namespace.default.createElement("div",{className:"flex min-h-[180px] flex-1 flex-col justify-between space-y-4 xl:min-h-[200px]"},m__namespace.default.createElement("div",{className:"space-y-4"},m__namespace.default.createElement("h2",{className:"group-hover:text-primary text-2xl leading-tight font-bold transition-colors xl:text-3xl"},e.title),e.excerpt&&m__namespace.default.createElement("p",{className:"text-muted-foreground line-clamp-3 text-base leading-relaxed xl:text-lg"},e.excerpt)),m__namespace.default.createElement("div",{className:"flex flex-wrap items-center gap-x-3 gap-y-1 text-sm text-muted-foreground"},e.author&&m__namespace.default.createElement(m__namespace.default.Fragment,null,m__namespace.default.createElement("span",{className:"font-medium"},e.author.name),m__namespace.default.createElement("span",{className:"text-border"},"\u2022")),m__namespace.default.createElement("time",{dateTime:e.publishedAt,className:"font-medium","aria-label":`Published ${r}`},r),m__namespace.default.createElement("span",{className:"text-border"},"\u2022"),m__namespace.default.createElement("span",{className:"font-medium"},n))))))}function At(e,t,r,n){let s=e?`${e} - Blog`:"Blog",i=n&&n.currentPage>1?`${s} - Page ${n.currentPage}`:s,o=t??"Read our latest articles and insights.",a="/blog",c=r?`${r}${n&&n.currentPage>1?`${a}?page=${n.currentPage}`:a}`:void 0,l=n&&n.currentPage>1&&r?`${r}${n.currentPage===2?a:`${a}?page=${n.currentPage-1}`}`:void 0,d=n&&n.currentPage<n.totalPages&&r?`${r}${a}?page=${n.currentPage+1}`:void 0;return {title:i,description:o,openGraph:{title:i,description:o,type:"website",...r&&{url:c}},twitter:{card:"summary_large_image",title:i,description:o},alternates:{...c&&{canonical:c}},other:{...l&&{prev:l},...d&&{next:d}}}}var wt=classVarianceAuthority.cva("inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",{variants:{variant:{default:"border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80",secondary:"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",destructive:"border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80",outline:"text-foreground"}},defaultVariants:{variant:"default"}});function xe({className:e,variant:t,...r}){return m__namespace.createElement("div",{className:P(wt({variant:t}),e),...r})}function z({className:e,...t}){return m__namespace.createElement("div",{"data-slot":"card",className:P("bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm",e),...t})}function Pe({className:e,...t}){return m__namespace.createElement("div",{"data-slot":"card-header",className:P("@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 Se({className:e,...t}){return m__namespace.createElement("div",{"data-slot":"card-title",className:P("leading-none font-semibold",e),...t})}function Nt({className:e,...t}){return m__namespace.createElement("div",{"data-slot":"card-description",className:P("text-muted-foreground text-sm",e),...t})}function W({className:e,...t}){return m__namespace.createElement("div",{"data-slot":"card-content",className:P("px-6",e),...t})}function Rt({className:e,...t}){return m__namespace.createElement("div",{"data-slot":"card-footer",className:P("flex items-center px-6 [.border-t]:pt-6",e),...t})}var ne=m__namespace.forwardRef(({className:e,orientation:t="horizontal",decorative:r=true,...n},s)=>m__namespace.createElement(Ae__namespace.Root,{ref:s,decorative:r,orientation:t,className:P("shrink-0 bg-border",t==="horizontal"?"h-[1px] w-full":"h-full w-[1px]",e),...n}));ne.displayName=Ae__namespace.Root.displayName;function Et(e){return `${Math.ceil(e/60)} min read`}function Ve({article:e,className:t,navigation:r}){let n=new Date(e.publishedAt),s=new Date(e.updatedAt),i=s.getTime()!==n.getTime(),o=dateFns.formatDistanceToNow(n,{addSuffix:true}),a=Et(e.readingSeconds),c=e.featuredImage;return m__namespace.default.createElement("article",{className:P("article-page mx-auto max-w-4xl px-4 py-6 pb-12 sm:px-6 sm:py-8 sm:pb-16 lg:px-8 lg:py-12 lg:pb-24",t)},r?.backToHome&&m__namespace.default.createElement("header",{className:"mb-8 sm:mb-12 lg:mb-16"},m__namespace.default.createElement(ve__default.default,{href:r.backToHome.url,className:"text-muted-foreground hover:text-foreground group focus-visible:ring-ring inline-flex touch-manipulation items-center space-x-2 rounded-md px-2 py-1 transition-colors focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none sm:space-x-3","aria-label":r.backToHome.label??"Return to blog"},m__namespace.default.createElement(lucideReact.ArrowLeft,{className:"h-4 w-4 transition-transform group-hover:-translate-x-1 sm:h-5 sm:w-5","aria-hidden":"true"}),m__namespace.default.createElement("span",{className:"text-sm font-medium sm:text-base"},m__namespace.default.createElement("span",{className:"hidden sm:inline"},r.backToHome.label??"Back to all articles"),m__namespace.default.createElement("span",{className:"sm:hidden"},"Back")))),m__namespace.default.createElement("header",{className:"article-header mb-6 space-y-4 text-center sm:mb-8 sm:space-y-6 lg:mb-12 lg:space-y-8"},m__namespace.default.createElement("h1",{className:"article-title text-foreground px-4 text-2xl leading-tight font-light tracking-tight sm:px-0 sm:text-3xl md:text-4xl lg:text-5xl xl:text-6xl"},e.title),e.excerpt&&m__namespace.default.createElement("p",{className:"article-excerpt text-muted-foreground mx-auto mt-6 max-w-xs px-4 text-base leading-relaxed sm:mt-8 sm:max-w-lg sm:px-0 sm:text-lg md:max-w-2xl md:text-xl lg:max-w-4xl lg:text-2xl"},e.excerpt),m__namespace.default.createElement("div",{className:"article-meta text-muted-foreground flex flex-col items-center gap-2 text-sm sm:gap-3 sm:text-base"},e.author&&m__namespace.default.createElement("div",{className:"flex items-center gap-2"},m__namespace.default.createElement("span",{className:"sr-only"},"Author"),m__namespace.default.createElement("span",{className:"font-medium"},e.author.name),e.author.isGuest&&m__namespace.default.createElement(xe,{variant:"outline",className:"text-xs"},"Guest Author")),m__namespace.default.createElement("div",{className:"flex flex-wrap items-center justify-center gap-x-3 gap-y-1"},m__namespace.default.createElement("time",{dateTime:e.publishedAt,className:"font-medium","aria-label":`Published ${o}`},"Published ",o),m__namespace.default.createElement("span",{className:"text-border"},"\u2022"),m__namespace.default.createElement("span",{className:"font-medium"},a)),i&&m__namespace.default.createElement("time",{dateTime:e.updatedAt,className:"text-xs"},"Updated ",dateFns.format(s,"MMMM d, yyyy")),m__namespace.default.createElement("div",{className:"bg-border h-px w-6 sm:w-8","aria-hidden":"true"}),m__namespace.default.createElement("span",{className:"text-xs tracking-wider uppercase sm:text-sm",role:"text"},"From ",e.site.name))),c&&m__namespace.default.createElement("div",{className:"article-featured-image relative my-8 aspect-[16/9] w-full overflow-hidden rounded-lg sm:my-12 lg:my-16"},m__namespace.default.createElement(Me__default.default,{src:c,alt:e.featuredImageAlt??`Featured image for ${e.title}`,className:"h-full w-full object-cover",width:800,height:450,priority:true})),m__namespace.default.createElement("div",{className:"article-content"},m__namespace.default.createElement("div",{className:"prose prose-sm sm:prose-base lg:prose-lg xl:prose-xl prose-gray dark:prose-invert prose-headings:scroll-mt-20 prose-headings:font-light prose-h1:text-2xl sm:prose-h1:text-3xl lg:prose-h1:text-4xl prose-h2:text-xl sm:prose-h2:text-2xl lg:prose-h2:text-3xl prose-h3:text-lg sm:prose-h3:text-xl lg:prose-h3:text-2xl prose-p:leading-relaxed prose-img:mx-auto prose-img:rounded-lg prose-a:transition-colors max-w-none"},m__namespace.default.createElement(rsc.MDXRemote,{source:e.content}))),e.author?.bio&&m__namespace.default.createElement("div",{className:"author-bio mt-12"},m__namespace.default.createElement(ne,{className:"mb-8"}),m__namespace.default.createElement(z,null,m__namespace.default.createElement(Pe,null,m__namespace.default.createElement(Se,{className:"flex items-center gap-2"},"About ",e.author.name,e.author.isGuest&&m__namespace.default.createElement(xe,{variant:"outline",className:"text-xs"},"Guest Author"))),m__namespace.default.createElement(W,null,m__namespace.default.createElement("div",{className:"prose dark:prose-invert"},m__namespace.default.createElement("p",{className:"text-muted-foreground"},e.author.bio))))),(!!r?.previousArticle||!!r?.nextArticle)&&m__namespace.default.createElement("nav",{className:"article-nav mt-12"},m__namespace.default.createElement(ne,{className:"mb-8"}),m__namespace.default.createElement("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-2"},r?.previousArticle&&m__namespace.default.createElement(z,{className:"group hover:bg-accent/50 cursor-pointer transition-colors"},m__namespace.default.createElement(ve__default.default,{href:r.previousArticle.url,className:"block"},m__namespace.default.createElement(W,{className:"p-4"},m__namespace.default.createElement("div",{className:"text-muted-foreground mb-2 text-sm font-medium"},"\u2190 Previous Article"),m__namespace.default.createElement("div",{className:"text-foreground group-hover:text-primary transition-colors"},r.previousArticle.title)))),r?.nextArticle&&m__namespace.default.createElement(z,{className:P("group hover:bg-accent/50 cursor-pointer transition-colors",!r?.previousArticle&&"md:col-start-2")},m__namespace.default.createElement(ve__default.default,{href:r.nextArticle.url,className:"block"},m__namespace.default.createElement(W,{className:"p-4 md:text-right"},m__namespace.default.createElement("div",{className:"text-muted-foreground mb-2 text-sm font-medium"},"Next Article \u2192"),m__namespace.default.createElement("div",{className:"text-foreground group-hover:text-primary transition-colors"},r.nextArticle.title)))))),(()=>{let l=q(be(e));return m__namespace.default.createElement("script",{type:l.type,dangerouslySetInnerHTML:l.dangerouslySetInnerHTML})})())}function Bt(e){let t=e.meta.title??e.title,r=e.meta.description??e.excerpt,n=e.meta.canonicalUrl??`${e.site.domain}/blog/${e.slug}`,s=e.meta.ogImage??e.featuredImage;return {title:t,description:r,keywords:e.meta.keywords.join(", "),authors:e.author?[{name:e.author.name}]:void 0,openGraph:{title:t,description:r,type:"article",url:n,images:s?[{url:s,alt:e.featuredImageAlt??t}]: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:t,description:r,images:s?[s]:void 0},alternates:{canonical:n}}}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 i=/^Token\s+(.+)$/i.exec(t);return i?.[1]?i[1]:null}var ie=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)+"..."}},U=class extends ie{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(s=>s.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);}},X=class{async validateToken(){return {valid:true,context:{development:true}}}extractToken(){return "development-mode"}},se=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 It(){return globalThis.__BLOG_PLATFORM_AUTH_CONFIG__??=new se,globalThis.__BLOG_PLATFORM_AUTH_CONFIG__}function oe(e){globalThis.__BLOG_PLATFORM_AUTH_CONFIG__=e;}function Ne(){return globalThis.__BLOG_PLATFORM_AUTH_CONFIG__??It()}function kt(e){oe(new U(e));}async function _(e){let t=Ne(),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 Dt(e,t=""){let n=Ne().errorMessages??{},s,i;switch(e.errorCode){case "missing":s=n.missing??"Authentication token is required",i="PUB005";break;case "expired":s=n.expired??"Authentication token has expired",i="PUB005";break;case "invalid":default:s=n.invalid??"Invalid authentication credentials",i="PUB005";break}return {success:false,error:{code:i,message:s,details:{authError:e.errorCode??"invalid"}},idempotencyKey:t}}async function B(e){let t=await _(e);return t.authenticated?{authenticated:true,context:t.result.context}:{authenticated:false,error:Dt(t.result)}}function Mt(){let e=process.env.SKIP_BLOG_PLATFORM_AUTH;return e==="true"||e==="1"||process.env.NODE_ENV==="test"}var ae=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(o=>o.id===t.id))return n}else return n;if(this.articles.has(t.slug)){let i={success:false,error:{code:"PUB003",message:"This URL is already in use. Please choose another."},idempotencyKey:r};return await this.storeOperationResult(r,i),i}this.articles.set(t.slug,t);let s={success:true,url:`/${t.slug}`,platformPostId:t.id,publishedAt:t.publishedAt,idempotencyKey:r};return await this.storeOperationResult(r,s),s}async getArticle(t){return this.articles.get(t)??null}async listArticles(t={}){let{limit:r=10,offset:n=0,sortBy:s="publishedAt",order:i="desc"}=t,o=Array.from(this.articles.values());return o.sort((c,l)=>{let d=new Date(c[s]).getTime(),p=new Date(l[s]).getTime();return i==="desc"?p-d:d-p}),{articles:o.slice(n,n+r),total:o.length}}async removeArticle(t,r){let n=await this.checkIdempotency(r);if(n)if(n.success){if(!this.articles.has(t))return n}else return n;if(!this.articles.has(t)){let i={success:false,error:{code:"PUB007",message:"Article not found"},idempotencyKey:r};return await this.storeOperationResult(r,i),i}this.articles.delete(t);let s={success:true,idempotencyKey:r};return await this.storeOperationResult(r,s),s}async checkIdempotency(t){return this.operations.get(t)??null}async storeOperationResult(t,r){this.operations.set(t,r);}};function $t(){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 Ut(){let e=globalThis;e.__BLOG_PLATFORM_STORAGE__||($t(),e.__BLOG_PLATFORM_STORAGE__=new ae);let t=e.__BLOG_PLATFORM_STORAGE__;if(!t)throw new Error("Blog platform storage not initialized");return t}function I(){return Ut()}function Re(e){let t=globalThis;t.__BLOG_PLATFORM_STORAGE__=e;}function Gt(){return globalThis.__BLOG_PLATFORM_RATE_LIMITER__??null}function Ht(e){let t=globalThis;t.__BLOG_PLATFORM_RATE_LIMITER__=e;}function le(e){let{redisUrl:t,redisToken:r,requestsPerMinute:n=5,keyPrefix:s="blog-platform-ratelimit",analytics:i=true}=e,o=new redis.Redis({url:t,token:r}),a=new ratelimit.Ratelimit({redis:o,analytics:i,prefix:s,limiter:ratelimit.Ratelimit.slidingWindow(n,"1m")});Ht(a);}function Te(){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}le({redisUrl:e,redisToken:t}),console.log("Blog platform: Rate limiting configured (5 requests per minute per token)");}async function He(e){let t=Gt();if(!t)return console.warn("Blog platform: Rate limiter not configured. All requests allowed."),{success:true,remaining:999,reset:Date.now()+6e4,limit:5,count:0};try{let r=await t.limit(e);return {success:r.success,remaining:r.remaining,reset:r.reset,limit:r.limit,count:r.limit-r.remaining}}catch(r){return console.error("Blog platform: Rate limit check failed:",r),{success:true,remaining:0,reset:Date.now()+6e4,limit:5,count:0}}}function je(e,t=""){let r=Math.ceil((e.reset-Date.now())/6e4);return {success:false,error:{code:"PUB011",message:`Rate limit exceeded. You can make ${e.limit} requests per minute. Try again in ${r} minute(s).`,details:{rateLimit:e}},idempotencyKey:t}}async function E(e,t=""){let r=await He(e);return r.success?{allowed:true,rateLimitResult:r}:{allowed:false,errorResponse:je(r,t)}}function N(e){return {"X-RateLimit-Limit":e.limit.toString(),"X-RateLimit-Remaining":e.remaining.toString(),"X-RateLimit-Reset":e.reset.toString(),"Retry-After":Math.ceil((e.reset-Date.now())/1e3).toString()}}function ce(e){let{auth:t,storage:r,rateLimit:n,autoRateLimit:s=true}=e;if(!t)throw new Error(`Blog platform initialization failed: 'auth' is required.
1
+ 'use strict';var m=require('react'),ve=require('next/link'),Me=require('next/image'),clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),lucideReact=require('lucide-react'),reactSlot=require('@radix-ui/react-slot'),classVarianceAuthority=require('class-variance-authority'),dateFns=require('date-fns'),rsc=require('next-mdx-remote-client/rsc'),Ae=require('@radix-ui/react-separator'),ratelimit=require('@upstash/ratelimit'),redis=require('@upstash/redis'),drizzleOrm=require('drizzle-orm'),sqliteCore=require('drizzle-orm/sqlite-core'),server=require('next/server');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var m__namespace=/*#__PURE__*/_interopNamespace(m);var ve__default=/*#__PURE__*/_interopDefault(ve);var Me__default=/*#__PURE__*/_interopDefault(Me);var Ae__namespace=/*#__PURE__*/_interopNamespace(Ae);function P(...e){return tailwindMerge.twMerge(clsx.clsx(e))}var Q=classVarianceAuthority.cva("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",{variants:{variant:{default:"bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",destructive:"bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",outline:"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2 has-[>svg]:px-3",sm:"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",lg:"h-10 rounded-md px-6 has-[>svg]:px-4",icon:"size-9"}},defaultVariants:{variant:"default",size:"default"}});function lt({className:e,variant:t,size:r,asChild:n=false,...s}){return m__namespace.createElement(n?reactSlot.Slot:"button",{"data-slot":"button",className:P(Q({variant:t,size:r,className:e})),...s})}function me({className:e,...t}){return m__namespace.createElement("nav",{role:"navigation","aria-label":"pagination","data-slot":"pagination",className:P("mx-auto flex w-full justify-center",e),...t})}function pe({className:e,...t}){return m__namespace.createElement("ul",{"data-slot":"pagination-content",className:P("flex flex-row items-center gap-1",e),...t})}function L({...e}){return m__namespace.createElement("li",{"data-slot":"pagination-item",...e})}function D({className:e,isActive:t,size:r="icon",...n}){return m__namespace.createElement("a",{"aria-current":t?"page":void 0,"data-slot":"pagination-link","data-active":t,className:P(Q({variant:t?"outline":"ghost",size:r}),e),...n})}function de({className:e,...t}){return m__namespace.createElement(D,{"aria-label":"Go to previous page",size:"default",className:P("gap-1 px-2.5 sm:pl-2.5",e),...t},m__namespace.createElement(lucideReact.ChevronLeftIcon,null),m__namespace.createElement("span",{className:"hidden sm:block"},"Previous"))}function ge({className:e,...t}){return m__namespace.createElement(D,{"aria-label":"Go to next page",size:"default",className:P("gap-1 px-2.5 sm:pr-2.5",e),...t},m__namespace.createElement("span",{className:"hidden sm:block"},"Next"),m__namespace.createElement(lucideReact.ChevronRightIcon,null))}function Z({className:e,...t}){return m__namespace.createElement("span",{"aria-hidden":true,"data-slot":"pagination-ellipsis",className:P("flex size-9 items-center justify-center",e),...t},m__namespace.createElement(lucideReact.MoreHorizontalIcon,{className:"size-4"}),m__namespace.createElement("span",{className:"sr-only"},"More pages"))}function ee({currentPage:e,totalPages:t,baseUrl:r,className:n,maxVisiblePages:s=5,showPrevNext:i=true,showFirstLast:o=true}){if(t<=1)return null;let a=()=>{let u=Math.floor(s/2),g=Math.max(1,e-u),y=Math.min(t,g+s-1);return y-g+1<s&&(g=Math.max(1,y-s+1)),{start:g,end:y}},{start:c,end:l}=a(),d=Array.from({length:l-c+1},(u,g)=>c+g),p=u=>u===1?r:`${r}?page=${u}`,S=e>1,b=e<t;return m__namespace.default.createElement(me,{className:n},m__namespace.default.createElement(pe,null,o&&e>2&&m__namespace.default.createElement(m__namespace.default.Fragment,null,m__namespace.default.createElement(L,null,m__namespace.default.createElement(D,{href:p(1),"aria-label":"Go to first page"},m__namespace.default.createElement(lucideReact.ChevronsLeft,{className:"h-4 w-4"}))),c>2&&m__namespace.default.createElement(L,null,m__namespace.default.createElement(Z,null))),i&&m__namespace.default.createElement(L,null,S?m__namespace.default.createElement(de,{href:p(e-1)}):m__namespace.default.createElement("span",{className:"flex h-9 items-center justify-center gap-1 px-2.5 text-muted-foreground sm:pl-2.5"},m__namespace.default.createElement("span",{className:"hidden sm:block"},"Previous"))),d.map(u=>m__namespace.default.createElement(L,{key:u},m__namespace.default.createElement(D,{href:p(u),isActive:u===e},u))),i&&m__namespace.default.createElement(L,null,b?m__namespace.default.createElement(ge,{href:p(e+1)}):m__namespace.default.createElement("span",{className:"flex h-9 items-center justify-center gap-1 px-2.5 text-muted-foreground sm:pr-2.5"},m__namespace.default.createElement("span",{className:"hidden sm:block"},"Next"))),o&&e<t-1&&m__namespace.default.createElement(m__namespace.default.Fragment,null,l<t-1&&m__namespace.default.createElement(L,null,m__namespace.default.createElement(Z,null)),m__namespace.default.createElement(L,null,m__namespace.default.createElement(D,{href:p(t),"aria-label":"Go to last page"},m__namespace.default.createElement(lucideReact.ChevronsRight,{className:"h-4 w-4"}))))),m__namespace.default.createElement("div",{className:"sr-only","aria-live":"polite"},"Page ",e," of ",t))}function gt(e,t=10){let r=e.page,n=Array.isArray(r)?r[0]:r,s=Math.max(1,parseInt(n??"1",10)),i=(s-1)*t;return {currentPage:s,itemsPerPage:t,offset:i,calculateTotalPages:a=>Math.ceil(a/t)}}function ft(e,t,r,n){let s=n?`${n}${e===1?r:`${r}?page=${e}`}`:void 0,i=e>1&&n?`${n}${e===2?r:`${r}?page=${e-1}`}`:void 0,o=e<t&&n?`${n}${r}?page=${e+1}`:void 0;return {alternates:{...s&&{canonical:s}},other:{...i&&{prev:i},...o&&{next:o}}}}function te(e,t={}){let{customDomain:r,pathPrefix:n="/blog",language:s,isAccessibleForFree:i=true,includeOptionalProperties:o=true}=t,a=r??e.site.domain,c=r?`https://${a}${n}/${e.slug}`:e.meta.canonicalUrl??`https://${a}${n}/${e.slug}`,l=e.author?Be(e.author,{customDomain:r,pathPrefix:n}):void 0,d=fe(e.site,{customDomain:r,pathPrefix:n}),S=`PT${Math.max(1,Math.ceil(e.readingSeconds/60))}M`,b={"@context":"https://schema.org","@type":"BlogPosting","@id":`${c}#article`,headline:e.title,description:e.excerpt,datePublished:e.publishedAt,dateModified:e.updatedAt,author:l,publisher:d,mainEntityOfPage:{"@type":"WebPage","@id":c},wordCount:e.wordCount,timeRequired:S,isAccessibleForFree:i};return o&&(e.featuredImage&&(b.image=e.featuredImage),e.meta.keywords.length>0&&(b.keywords=[...e.meta.keywords]),(s??e.site.locale)&&(b.inLanguage=s??e.site.locale),e.site.toneAdjectives.length>0&&(b.about=e.site.toneAdjectives.map(u=>({"@type":"Thing",name:u}))),e.site.toneAdjectives.length>0&&(b.genre=[...e.site.toneAdjectives])),b}function Be(e,t={}){let{customDomain:r,pathPrefix:n="/blog"}=t,s={"@context":"https://schema.org","@type":"Person","@id":`#author-${e.id}`,name:e.name,identifier:e.id};if(e.bio&&(s.description=e.bio),e.slug?.trim()){let i=r?`https://${r}${n}/authors/${e.slug}`:`${n}/authors/${e.slug}`;s.url=i;}return e.isGuest&&(s.additionalType="GuestAuthor"),e.toneAdjectives&&e.toneAdjectives.length>0&&(s.knowsAbout=[...e.toneAdjectives]),s}function fe(e,t={}){let{customDomain:r,pathPrefix:n="/blog"}=t,i=`https://${r??e.domain}${n}`,o={"@context":"https://schema.org","@type":"Organization","@id":`${i}#organization`,name:e.name,url:i};return e.description?.trim()&&(o.description=e.description),e.tagline?.trim()&&(o.description=o.description?`${o.description}. ${e.tagline}`:e.tagline),o}function he(e,t={}){let{customDomain:r,pathPrefix:n="/blog",language:s,includeSearchAction:i=true}=t,a=`https://${r??e.domain}${n}`,c=fe(e,t),l={"@context":"https://schema.org","@type":"WebSite","@id":`${a}#website`,name:e.name,url:a,publisher:c};return e.description?.trim()&&(l.description=e.description),(s??e.locale)&&(l.inLanguage=s??e.locale),i&&(l.potentialAction={"@type":"SearchAction",target:{"@type":"EntryPoint",urlTemplate:`${a}?search={search_term_string}`},"query-input":"required name=search_term_string"}),l}function Ie(e,t={}){let{customDomain:r}=t;return {"@context":"https://schema.org","@type":"BreadcrumbList",itemListElement:e.map((n,s)=>({"@type":"ListItem",position:s+1,name:n.name,item:r&&!n.url.startsWith("http")?`https://${r}${n.url}`:n.url}))}}function be(e,t={}){let r=[];r.push(te(e,t)),r.push(he(e.site,t));let n=t.pathPrefix??"/blog",s=[{name:"Home",url:"/"},{name:e.site.name,url:n},{name:e.title,url:`${n}/${e.slug}`}];return r.push(Ie(s,t)),r}function ye(e,t=[],r={}){let n=[];if(n.push(he(e,r)),t.length>0){let s=t.slice(0,5).map(i=>te(i,r));n.push(...s);}return n}function ke(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 De(e){return JSON.stringify(e,null,0)}function q(e){return {type:"application/ld+json",dangerouslySetInnerHTML:{__html:De(e)}}}function ht(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 F=class extends Error{constructor(r,n,s){super(r);this.code=n;this.details=s;this.name="StructuredDataError";}};function bt(e,t={}){try{let r=te(e,t),n=ke(r);return n.isValid?{schema:r}:{error:new F("Generated schema validation failed","VALIDATION_FAILED",n.errors)}}catch(r){return {error:new F("Failed to generate structured data","GENERATION_FAILED",r)}}}function $e({articles:e,siteName:t,siteTagline:r,className:n,site:s,includeStructuredData:i=false,pagination:o}){return m__namespace.default.createElement("div",{className:P("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)},t&&m__namespace.default.createElement("header",{className:"blog-header mb-8 text-center sm:mb-12 lg:mb-16"},m__namespace.default.createElement("h1",{className:"blog-title text-foreground mb-2 text-3xl font-light tracking-tight sm:text-4xl lg:text-5xl"},t),r&&m__namespace.default.createElement("p",{className:"blog-tagline text-muted-foreground text-base sm:text-lg"},r)),m__namespace.default.createElement("main",{className:"articles-list"},e.length===0?m__namespace.default.createElement("div",{className:"no-articles text-muted-foreground py-16 text-center sm:py-24 lg:py-32"},m__namespace.default.createElement("h2",{className:"mb-3 text-xl font-light sm:mb-4 sm:text-2xl lg:text-3xl"},"No articles yet"),m__namespace.default.createElement("p",{className:"text-muted-foreground/70 mx-auto max-w-md text-base sm:text-lg"},"This blog doesn't have any published articles yet.")):m__namespace.default.createElement("div",{className:"space-y-0"},e.map(a=>m__namespace.default.createElement(St,{key:a.id,article:a}))),o&&o.totalPages>1&&m__namespace.default.createElement("div",{className:"pagination-wrapper mt-12"},m__namespace.default.createElement(ee,{currentPage:o.currentPage,totalPages:o.totalPages,baseUrl:o.baseUrl??"/blog",className:"justify-center"}))),i&&s&&(()=>{let a=q(ye(s,e.slice(0,5)));return m__namespace.default.createElement("script",{type:a.type,dangerouslySetInnerHTML:a.dangerouslySetInnerHTML})})())}function Pt(e){return `${Math.ceil(e/60)} min read`}function St({article:e}){let t=`/blog/${e.slug}`,r=dateFns.formatDistanceToNow(new Date(e.publishedAt),{addSuffix:true}),n=Pt(e.readingSeconds),s=e.featuredImage;return m__namespace.default.createElement("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"},m__namespace.default.createElement(ve__default.default,{href:t,className:"focus-visible:ring-ring block rounded-lg hover:no-underline focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none","aria-label":`Read article: ${e.title}`},m__namespace.default.createElement("div",{className:"space-y-4 lg:hidden"},s&&m__namespace.default.createElement("div",{className:"relative aspect-[16/10] w-full overflow-hidden rounded-lg"},m__namespace.default.createElement(Me__default.default,{src:s,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"})),m__namespace.default.createElement("div",{className:"space-y-3"},m__namespace.default.createElement("h2",{className:"group-hover:text-primary text-lg leading-tight font-bold transition-colors sm:text-xl md:text-2xl"},e.title),m__namespace.default.createElement("div",{className:"flex flex-wrap items-center gap-x-3 gap-y-1 text-sm text-muted-foreground"},e.author&&m__namespace.default.createElement(m__namespace.default.Fragment,null,m__namespace.default.createElement("span",{className:"font-medium"},e.author.name),m__namespace.default.createElement("span",{className:"text-border"},"\u2022")),m__namespace.default.createElement("time",{dateTime:e.publishedAt,className:"font-medium","aria-label":`Published ${r}`},r),m__namespace.default.createElement("span",{className:"text-border"},"\u2022"),m__namespace.default.createElement("span",{className:"font-medium"},n)),e.excerpt&&m__namespace.default.createElement("p",{className:"text-muted-foreground line-clamp-3 text-sm leading-relaxed sm:text-base"},e.excerpt))),m__namespace.default.createElement("div",{className:"hidden items-start gap-6 lg:flex xl:gap-8"},s&&m__namespace.default.createElement("div",{className:"relative aspect-[16/10] w-64 shrink-0 overflow-hidden rounded-lg xl:w-72"},m__namespace.default.createElement(Me__default.default,{src:s,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"})),m__namespace.default.createElement("div",{className:"flex min-h-[180px] flex-1 flex-col justify-between space-y-4 xl:min-h-[200px]"},m__namespace.default.createElement("div",{className:"space-y-4"},m__namespace.default.createElement("h2",{className:"group-hover:text-primary text-2xl leading-tight font-bold transition-colors xl:text-3xl"},e.title),e.excerpt&&m__namespace.default.createElement("p",{className:"text-muted-foreground line-clamp-3 text-base leading-relaxed xl:text-lg"},e.excerpt)),m__namespace.default.createElement("div",{className:"flex flex-wrap items-center gap-x-3 gap-y-1 text-sm text-muted-foreground"},e.author&&m__namespace.default.createElement(m__namespace.default.Fragment,null,m__namespace.default.createElement("span",{className:"font-medium"},e.author.name),m__namespace.default.createElement("span",{className:"text-border"},"\u2022")),m__namespace.default.createElement("time",{dateTime:e.publishedAt,className:"font-medium","aria-label":`Published ${r}`},r),m__namespace.default.createElement("span",{className:"text-border"},"\u2022"),m__namespace.default.createElement("span",{className:"font-medium"},n))))))}function At(e,t,r,n){let s=e?`${e} - Blog`:"Blog",i=n&&n.currentPage>1?`${s} - Page ${n.currentPage}`:s,o=t??"Read our latest articles and insights.",a="/blog",c=r?`${r}${n&&n.currentPage>1?`${a}?page=${n.currentPage}`:a}`:void 0,l=n&&n.currentPage>1&&r?`${r}${n.currentPage===2?a:`${a}?page=${n.currentPage-1}`}`:void 0,d=n&&n.currentPage<n.totalPages&&r?`${r}${a}?page=${n.currentPage+1}`:void 0;return {title:i,description:o,openGraph:{title:i,description:o,type:"website",...r&&{url:c}},twitter:{card:"summary_large_image",title:i,description:o},alternates:{...c&&{canonical:c}},other:{...l&&{prev:l},...d&&{next:d}}}}var wt=classVarianceAuthority.cva("inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",{variants:{variant:{default:"border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80",secondary:"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",destructive:"border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80",outline:"text-foreground"}},defaultVariants:{variant:"default"}});function xe({className:e,variant:t,...r}){return m__namespace.createElement("div",{className:P(wt({variant:t}),e),...r})}function z({className:e,...t}){return m__namespace.createElement("div",{"data-slot":"card",className:P("bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm",e),...t})}function Pe({className:e,...t}){return m__namespace.createElement("div",{"data-slot":"card-header",className:P("@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 Se({className:e,...t}){return m__namespace.createElement("div",{"data-slot":"card-title",className:P("leading-none font-semibold",e),...t})}function Nt({className:e,...t}){return m__namespace.createElement("div",{"data-slot":"card-description",className:P("text-muted-foreground text-sm",e),...t})}function W({className:e,...t}){return m__namespace.createElement("div",{"data-slot":"card-content",className:P("px-6",e),...t})}function Rt({className:e,...t}){return m__namespace.createElement("div",{"data-slot":"card-footer",className:P("flex items-center px-6 [.border-t]:pt-6",e),...t})}var ne=m__namespace.forwardRef(({className:e,orientation:t="horizontal",decorative:r=true,...n},s)=>m__namespace.createElement(Ae__namespace.Root,{ref:s,decorative:r,orientation:t,className:P("shrink-0 bg-border",t==="horizontal"?"h-[1px] w-full":"h-full w-[1px]",e),...n}));ne.displayName=Ae__namespace.Root.displayName;function Et(e){return `${Math.ceil(e/60)} min read`}function Ve({article:e,className:t,navigation:r}){let n=new Date(e.publishedAt),s=new Date(e.updatedAt),i=s.getTime()!==n.getTime(),o=dateFns.formatDistanceToNow(n,{addSuffix:true}),a=Et(e.readingSeconds),c=e.featuredImage;return m__namespace.default.createElement("article",{className:P("article-page mx-auto max-w-4xl px-4 py-6 pb-12 sm:px-6 sm:py-8 sm:pb-16 lg:px-8 lg:py-12 lg:pb-24",t)},r?.backToHome&&m__namespace.default.createElement("header",{className:"mb-8 sm:mb-12 lg:mb-16"},m__namespace.default.createElement(ve__default.default,{href:r.backToHome.url,className:"text-muted-foreground hover:text-foreground group focus-visible:ring-ring inline-flex touch-manipulation items-center space-x-2 rounded-md px-2 py-1 transition-colors focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none sm:space-x-3","aria-label":r.backToHome.label??"Return to blog"},m__namespace.default.createElement(lucideReact.ArrowLeft,{className:"h-4 w-4 transition-transform group-hover:-translate-x-1 sm:h-5 sm:w-5","aria-hidden":"true"}),m__namespace.default.createElement("span",{className:"text-sm font-medium sm:text-base"},m__namespace.default.createElement("span",{className:"hidden sm:inline"},r.backToHome.label??"Back to all articles"),m__namespace.default.createElement("span",{className:"sm:hidden"},"Back")))),m__namespace.default.createElement("header",{className:"article-header mb-6 space-y-4 text-center sm:mb-8 sm:space-y-6 lg:mb-12 lg:space-y-8"},m__namespace.default.createElement("h1",{className:"article-title text-foreground px-4 text-2xl leading-tight font-light tracking-tight sm:px-0 sm:text-3xl md:text-4xl lg:text-5xl xl:text-6xl"},e.title),e.excerpt&&m__namespace.default.createElement("p",{className:"article-excerpt text-muted-foreground mx-auto mt-6 max-w-xs px-4 text-base leading-relaxed sm:mt-8 sm:max-w-lg sm:px-0 sm:text-lg md:max-w-2xl md:text-xl lg:max-w-4xl lg:text-2xl"},e.excerpt),m__namespace.default.createElement("div",{className:"article-meta text-muted-foreground flex flex-col items-center gap-2 text-sm sm:gap-3 sm:text-base"},e.author&&m__namespace.default.createElement("div",{className:"flex items-center gap-2"},m__namespace.default.createElement("span",{className:"sr-only"},"Author"),m__namespace.default.createElement("span",{className:"font-medium"},e.author.name),e.author.isGuest&&m__namespace.default.createElement(xe,{variant:"outline",className:"text-xs"},"Guest Author")),m__namespace.default.createElement("div",{className:"flex flex-wrap items-center justify-center gap-x-3 gap-y-1"},m__namespace.default.createElement("time",{dateTime:e.publishedAt,className:"font-medium","aria-label":`Published ${o}`},"Published ",o),m__namespace.default.createElement("span",{className:"text-border"},"\u2022"),m__namespace.default.createElement("span",{className:"font-medium"},a)),i&&m__namespace.default.createElement("time",{dateTime:e.updatedAt,className:"text-xs"},"Updated ",dateFns.format(s,"MMMM d, yyyy")),m__namespace.default.createElement("div",{className:"bg-border h-px w-6 sm:w-8","aria-hidden":"true"}),m__namespace.default.createElement("span",{className:"text-xs tracking-wider uppercase sm:text-sm",role:"text"},"From ",e.site.name))),c&&m__namespace.default.createElement("div",{className:"article-featured-image relative my-8 aspect-[16/9] w-full overflow-hidden rounded-lg sm:my-12 lg:my-16"},m__namespace.default.createElement(Me__default.default,{src:c,alt:e.featuredImageAlt??`Featured image for ${e.title}`,className:"h-full w-full object-cover",width:800,height:450,priority:true})),m__namespace.default.createElement("div",{className:"article-content"},m__namespace.default.createElement("div",{className:"prose prose-sm sm:prose-base lg:prose-lg xl:prose-xl prose-gray dark:prose-invert prose-headings:scroll-mt-20 prose-headings:font-light prose-h1:text-2xl sm:prose-h1:text-3xl lg:prose-h1:text-4xl prose-h2:text-xl sm:prose-h2:text-2xl lg:prose-h2:text-3xl prose-h3:text-lg sm:prose-h3:text-xl lg:prose-h3:text-2xl prose-p:leading-relaxed prose-img:mx-auto prose-img:rounded-lg prose-a:transition-colors max-w-none"},m__namespace.default.createElement(rsc.MDXRemote,{source:e.content}))),e.author?.bio&&m__namespace.default.createElement("div",{className:"author-bio mt-12"},m__namespace.default.createElement(ne,{className:"mb-8"}),m__namespace.default.createElement(z,null,m__namespace.default.createElement(Pe,null,m__namespace.default.createElement(Se,{className:"flex items-center gap-2"},"About ",e.author.name,e.author.isGuest&&m__namespace.default.createElement(xe,{variant:"outline",className:"text-xs"},"Guest Author"))),m__namespace.default.createElement(W,null,m__namespace.default.createElement("div",{className:"prose dark:prose-invert"},m__namespace.default.createElement("p",{className:"text-muted-foreground"},e.author.bio))))),(!!r?.previousArticle||!!r?.nextArticle)&&m__namespace.default.createElement("nav",{className:"article-nav mt-12"},m__namespace.default.createElement(ne,{className:"mb-8"}),m__namespace.default.createElement("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-2"},r?.previousArticle&&m__namespace.default.createElement(z,{className:"group hover:bg-accent/50 cursor-pointer transition-colors"},m__namespace.default.createElement(ve__default.default,{href:r.previousArticle.url,className:"block"},m__namespace.default.createElement(W,{className:"p-4"},m__namespace.default.createElement("div",{className:"text-muted-foreground mb-2 text-sm font-medium"},"\u2190 Previous Article"),m__namespace.default.createElement("div",{className:"text-foreground group-hover:text-primary transition-colors"},r.previousArticle.title)))),r?.nextArticle&&m__namespace.default.createElement(z,{className:P("group hover:bg-accent/50 cursor-pointer transition-colors",!r?.previousArticle&&"md:col-start-2")},m__namespace.default.createElement(ve__default.default,{href:r.nextArticle.url,className:"block"},m__namespace.default.createElement(W,{className:"p-4 md:text-right"},m__namespace.default.createElement("div",{className:"text-muted-foreground mb-2 text-sm font-medium"},"Next Article \u2192"),m__namespace.default.createElement("div",{className:"text-foreground group-hover:text-primary transition-colors"},r.nextArticle.title)))))),(()=>{let l=q(be(e));return m__namespace.default.createElement("script",{type:l.type,dangerouslySetInnerHTML:l.dangerouslySetInnerHTML})})())}function Bt(e){let t=e.meta.title??e.title,r=e.meta.description??e.excerpt,n=e.meta.canonicalUrl??`${e.site.domain}/blog/${e.slug}`,s=e.meta.ogImage??e.featuredImage;return {title:t,description:r,keywords:e.meta.keywords.join(", "),authors:e.author?[{name:e.author.name}]:void 0,openGraph:{title:t,description:r,type:"article",url:n,images:s?[{url:s,alt:e.featuredImageAlt??t}]: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:t,description:r,images:s?[s]:void 0},alternates:{canonical:n}}}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 i=/^Token\s+(.+)$/i.exec(t);return i?.[1]?i[1]:null}var ie=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)+"..."}},U=class extends ie{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(s=>s.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);}},X=class{async validateToken(){return {valid:true,context:{development:true}}}extractToken(){return "development-mode"}},se=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 It(){return globalThis.__BLOG_PLATFORM_AUTH_CONFIG__??=new se,globalThis.__BLOG_PLATFORM_AUTH_CONFIG__}function oe(e){globalThis.__BLOG_PLATFORM_AUTH_CONFIG__=e;}function Ne(){return globalThis.__BLOG_PLATFORM_AUTH_CONFIG__??It()}function kt(e){oe(new U(e));}async function _(e){let t=Ne(),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 Dt(e,t=""){let n=Ne().errorMessages??{},s,i;switch(e.errorCode){case "missing":s=n.missing??"Authentication token is required",i="PUB005";break;case "expired":s=n.expired??"Authentication token has expired",i="PUB005";break;case "invalid":default:s=n.invalid??"Invalid authentication credentials",i="PUB005";break}return {success:false,error:{code:i,message:s,details:{authError:e.errorCode??"invalid"}},idempotencyKey:t}}async function B(e){let t=await _(e);return t.authenticated?{authenticated:true,context:t.result.context}:{authenticated:false,error:Dt(t.result)}}function Mt(){let e=process.env.SKIP_BLOG_PLATFORM_AUTH;return e==="true"||e==="1"||process.env.NODE_ENV==="test"}var ae=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(o=>o.id===t.id))return n}else return n;if(this.articles.has(t.slug)){let i={success:false,error:{code:"PUB003",message:"This URL is already in use. Please choose another."},idempotencyKey:r};return await this.storeOperationResult(r,i),i}this.articles.set(t.slug,t);let s={success:true,url:`/${t.slug}`,platformPostId:t.id,publishedAt:t.publishedAt,idempotencyKey:r};return await this.storeOperationResult(r,s),s}async getArticle(t){return this.articles.get(t)??null}async listArticles(t={}){let{limit:r=10,offset:n=0,sortBy:s="publishedAt",order:i="desc"}=t,o=Array.from(this.articles.values());return o.sort((c,l)=>{let d=new Date(c[s]).getTime(),p=new Date(l[s]).getTime();return i==="desc"?p-d:d-p}),{articles:o.slice(n,n+r),total:o.length}}async removeArticle(t,r){let n=await this.checkIdempotency(r);if(n)if(n.success){if(!this.articles.has(t))return n}else return n;if(!this.articles.has(t)){let i={success:false,error:{code:"PUB007",message:"Article not found"},idempotencyKey:r};return await this.storeOperationResult(r,i),i}this.articles.delete(t);let s={success:true,idempotencyKey:r};return await this.storeOperationResult(r,s),s}async checkIdempotency(t){return this.operations.get(t)??null}async storeOperationResult(t,r){this.operations.set(t,r);}};function $t(){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 Ut(){let e=globalThis;e.__BLOG_PLATFORM_STORAGE__||($t(),e.__BLOG_PLATFORM_STORAGE__=new ae);let t=e.__BLOG_PLATFORM_STORAGE__;if(!t)throw new Error("Blog platform storage not initialized");return t}function I(){return Ut()}function Re(e){let t=globalThis;t.__BLOG_PLATFORM_STORAGE__=e;}function Gt(){return globalThis.__BLOG_PLATFORM_RATE_LIMITER__??null}function Ht(e){let t=globalThis;t.__BLOG_PLATFORM_RATE_LIMITER__=e;}function le(e){let{redisUrl:t,redisToken:r,requestsPerMinute:n=5,keyPrefix:s="blog-platform-ratelimit",analytics:i=true}=e,o=new redis.Redis({url:t,token:r}),a=new ratelimit.Ratelimit({redis:o,analytics:i,prefix:s,limiter:ratelimit.Ratelimit.slidingWindow(n,"1m")});Ht(a);}function Te(){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}le({redisUrl:e,redisToken:t}),console.log("Blog platform: Rate limiting configured (5 requests per minute per token)");}async function He(e){let t=Gt();if(!t)return console.warn("Blog platform: Rate limiter not configured. All requests allowed."),{success:true,remaining:999,reset:Date.now()+6e4,limit:5,count:0};try{let r=await t.limit(e);return {success:r.success,remaining:r.remaining,reset:r.reset,limit:r.limit,count:r.limit-r.remaining}}catch(r){return console.error("Blog platform: Rate limit check failed:",r),{success:true,remaining:0,reset:Date.now()+6e4,limit:5,count:0}}}function je(e,t=""){let r=Math.ceil((e.reset-Date.now())/6e4);return {success:false,error:{code:"PUB011",message:`Rate limit exceeded. You can make ${e.limit} requests per minute. Try again in ${r} minute(s).`,details:{rateLimit:e}},idempotencyKey:t}}async function E(e,t=""){let r=await He(e);return r.success?{allowed:true,rateLimitResult:r}:{allowed:false,errorResponse:je(r,t)}}function N(e){return {"X-RateLimit-Limit":e.limit.toString(),"X-RateLimit-Remaining":e.remaining.toString(),"X-RateLimit-Reset":e.reset.toString(),"Retry-After":Math.ceil((e.reset-Date.now())/1e3).toString()}}function ce(e){let{auth:t,storage:r,rateLimit:n,autoRateLimit:s=true}=e;if(!t)throw new Error(`Blog platform initialization failed: 'auth' is required.
2
2
  Example: initBlogPlatform({ auth: new EnvAuth() })
3
3
  See https://github.com/xexr/blog-platform#authentication for more details.`);console.log("Blog platform: Setting up authentication"),oe(t),n?(console.log("Blog platform: Using custom rate limiting configuration"),le(n)):s?(console.log("Blog platform: Auto-configuring rate limiting from environment"),Te()):console.log("Blog platform: Rate limiting disabled"),r?(console.log("Blog platform: Using custom storage provider"),Re(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 jt(e){if(globalThis.__BLOG_PLATFORM_INITIALISED__){console.log("Blog platform: Already initialized, skipping");return}console.log("Blog platform: Initializing blog platform once"),ce(e);}function Ft(){ce({auth:new X,autoRateLimit:false}),console.log("Blog platform: Development mode enabled (no auth, in-memory storage, no rate limiting)");}function qt(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.`);ce({auth:new U(t),autoRateLimit:true}),console.log("Blog platform: Production mode enabled (environment-based auth, rate limiting)");}var A=sqliteCore.sqliteTable("bp_articles",{id:sqliteCore.text("id").primaryKey(),slug:sqliteCore.text("slug").notNull(),title:sqliteCore.text("title").notNull(),excerpt:sqliteCore.text("excerpt").notNull(),content:sqliteCore.text("content").notNull(),readingSeconds:sqliteCore.integer("reading_seconds").notNull(),wordCount:sqliteCore.integer("word_count").notNull(),publishedAt:sqliteCore.text("published_at").notNull(),updatedAt:sqliteCore.text("updated_at").notNull(),featuredImage:sqliteCore.text("featured_image"),featuredImageAlt:sqliteCore.text("featured_image_alt"),authorJson:sqliteCore.text("author_json"),siteJson:sqliteCore.text("site_json").notNull(),metaJson:sqliteCore.text("meta_json").notNull(),version:sqliteCore.integer("version").notNull()},e=>({slugUniqueIdx:sqliteCore.uniqueIndex("bp_articles_slug_unique").on(e.slug)})),V=sqliteCore.sqliteTable("bp_operations",{key:sqliteCore.text("key").primaryKey(),resultJson:sqliteCore.text("result_json").notNull(),createdAt:sqliteCore.integer("created_at",{mode:"timestamp_ms"}).notNull(),expiresAt:sqliteCore.integer("expires_at",{mode:"timestamp_ms"})});function Jt(e){return {id:e.id,slug:e.slug,title:e.title,excerpt:e.excerpt,content:e.content,readingSeconds:e.readingSeconds,wordCount:e.wordCount,publishedAt:e.publishedAt,updatedAt:e.updatedAt,featuredImage:e.featuredImage??null,featuredImageAlt:e.featuredImageAlt??null,authorJson:e.author?JSON.stringify(e.author):null,siteJson:JSON.stringify(e.site),metaJson:JSON.stringify(e.meta),version:e.version}}function Fe(e){return {id:e.id,slug:e.slug,title:e.title,excerpt:e.excerpt,content:e.content,readingSeconds:e.readingSeconds,wordCount:e.wordCount,publishedAt:e.publishedAt,updatedAt:e.updatedAt,featuredImage:e.featuredImage??void 0,featuredImageAlt:e.featuredImageAlt??void 0,author:e.authorJson?JSON.parse(e.authorJson):null,site:JSON.parse(e.siteJson),meta:JSON.parse(e.metaJson),version:e.version}}var Ce=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(drizzleOrm.eq(A.id,t.id)).limit(1)).length!==0)return n}else return n;let s=await this.db.select().from(A).where(drizzleOrm.eq(A.slug,t.slug)).limit(1),i=s[0];if(i&&i.id!==t.id){let c={success:false,error:{code:"PUB003",message:"This URL is already in use. Please choose another."},idempotencyKey:r};return await this.storeOperationResult(r,c),c}let o=Jt(t);s.length===0?await this.db.insert(A).values(o).run():await this.db.update(A).set({title:o.title,excerpt:o.excerpt,content:o.content,readingSeconds:o.readingSeconds,wordCount:o.wordCount,updatedAt:o.updatedAt,featuredImage:o.featuredImage,featuredImageAlt:o.featuredImageAlt,authorJson:o.authorJson,siteJson:o.siteJson,metaJson:o.metaJson,version:o.version}).where(drizzleOrm.and(drizzleOrm.eq(A.id,o.id),drizzleOrm.eq(A.slug,o.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(drizzleOrm.eq(A.slug,t)).limit(1);return r[0]?Fe(r[0]):null}async listArticles(t={}){let{limit:r=10,offset:n=0,sortBy:s="publishedAt",order:i="desc"}=t,o=s==="publishedAt"?A.publishedAt:A.updatedAt,a=i==="desc"?drizzleOrm.desc(o):o,c=await this.db.select().from(A).orderBy(a).limit(r).offset(n),l=await this.db.select({c:drizzleOrm.sql`count(*)`}).from(A),d=Number(l?.[0]?.c??0);return {articles:c.map(Fe),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(drizzleOrm.eq(A.slug,t)).limit(1)).length>0))return n}else return n;if(!(await this.db.select().from(A).where(drizzleOrm.eq(A.slug,t)).limit(1))[0]){let o={success:false,error:{code:"PUB007",message:"Article not found"},idempotencyKey:r};return await this.storeOperationResult(r,o),o}await this.db.delete(A).where(drizzleOrm.eq(A.slug,t)).run();let i={success:true,idempotencyKey:r};return await this.storeOperationResult(r,i),i}async checkIdempotency(t){let r=await this.db.select().from(V).where(drizzleOrm.eq(V.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(),s=this.options.operationTtlMs?n+this.options.operationTtlMs:null;await this.db.delete(V).where(drizzleOrm.eq(V.key,t)).run(),await this.db.insert(V).values({key:t,resultJson:JSON.stringify(r),createdAt:new Date(n),expiresAt:s?new Date(s):null}).run();}};function Yt(){return {createArticles:`CREATE TABLE IF NOT EXISTS bp_articles (
4
4
  id TEXT PRIMARY KEY,
@@ -26,6 +26,6 @@ See https://github.com/xexr/blog-platform#authentication for more details.`);con
26
26
  `)});return [t,r,...s,n].join(`
27
27
  `)}function ar(e,t){let r='<?xml version="1.0" encoding="UTF-8"?>',n='<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">',s="</sitemapindex>",i=e.map(o=>{let a=[];return a.push(" <sitemap>"),a.push(` <loc>${J(o.url)}</loc>`),o.lastmod&&a.push(` <lastmod>${J(o.lastmod)}</lastmod>`),a.push(" </sitemap>"),a.join(`
28
28
  `)});return [r,n,...i,s].join(`
29
- `)}function lr(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((s,i)=>{try{new URL(s.loc);}catch{t.push(`Invalid URL at entry ${i+1}: ${s.loc}`);}s.priority!==void 0&&(s.priority<0||s.priority>1)&&t.push(`Invalid priority at entry ${i+1}: must be between 0.0 and 1.0`),s.lastmod&&!mr(s.lastmod)&&t.push(`Invalid lastmod date at entry ${i+1}: ${s.lastmod}`),s.loc.length>2048&&r.push(`URL at entry ${i+1} exceeds 2048 character limit`);});let n=new Map;return e.entries.forEach(s=>{let i=n.get(s.loc)??0;n.set(s.loc,i+1);}),n.forEach((s,i)=>{s>1&&t.push(`Duplicate URL found: ${i} (appears ${s} times)`);}),{valid:t.length===0,errors:t,warnings:r}}function H(e){return e.length===0?new Date().toISOString():e.reduce((r,n)=>{let s=new Date(n.updatedAt);return s>r?s:r},new Date(e[0].updatedAt)).toISOString()}function cr(e,t,r=[],n={}){return async function(){let o=(await Oe(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:o,totalEntries:o.length,generatedAt:new Date().toISOString(),baseUrl:G(n.canonical?.domain??e.domain,n.canonical?.forceHttps??true)},c=We(a);return new Response(c,{headers:{"Content-Type":"application/xml","Cache-Control":"public, max-age=3600, s-maxage=3600"}})}}function ur(e){return async function(){let r=await e.getSite(),n=await e.getArticles(),s=e.getAuthors?await e.getAuthors():[];return Oe(r,n,s,e.options)}}function J(e){let t={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;"};return e.replace(/[&<>"']/g,r=>t[r]??r)}function mr(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 j={name:"@xexr/blog-platform",version:"0.2.0"};function Xe(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),s=parseInt(r[1]??"0",10),i=parseInt(r[2]?.split("-")[0]??"0",10);if(isNaN(n)||isNaN(s)||isNaN(i))throw new Error(`Invalid version format: ${e}`);return {major:n,minor:s,patch:i}}function C(){let e=Xe(j.version);return {name:j.name,version:j.version,...e}}function k(e){try{let t=e.split(" "),r={};for(let n of t){let[s,i]=n.split("/");if(!s||!i)continue;let o=Xe(i),a={name:s,version:i,...o};s==="bloggy"?r.bloggyVersion=a:s==="platform"&&(r.platformVersion=a);}return r}catch{return null}}function Ke(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 Je={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 dr(){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 {...Je,enableCSP:!e,frameOptions:t??Je.frameOptions,enableHSTS:!r}}function gr(e){return Object.entries(e).map(([t,r])=>r?`${t} ${r}`:t).join("; ")}function fr(e){return Object.entries(e).map(([t,r])=>`${t}=${r}`).join(", ")}function hr(e,t={}){let r={...dr(),...t},n={};if(r.enableCSP){let s={...r.cspDirectives,...t.cspDirectives??{}};n["Content-Security-Policy"]=gr(s);}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&&br(e)){let s=[`max-age=${r.hstsMaxAge}`,r.hstsIncludeSubdomains?"includeSubDomains":""].filter(Boolean).join("; ");n["Strict-Transport-Security"]=s;}if(r.enablePermissionsPolicy){let s={...r.permissionsPolicyDirectives,...t.permissionsPolicyDirectives??{}};n["Permissions-Policy"]=fr(s);}return n}function br(e){return !!(e.url.startsWith("https://")||e.headers.get("x-forwarded-proto")==="https"||e.headers.get("cf-visitor")?.includes('"scheme":"https"'))}function ue(e,t={}){return hr(e,{...t,cspDirectives:{...{"default-src":"'none'","frame-ancestors":"'none'","base-uri":"'none'"},...t.cspDirectives??{}}})}var Ye={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 Qe(){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 {...Ye,allowedOrigins:e?e.split(",").map(n=>n.trim()):Ye.allowedOrigins,allowWildcard:t,allowCredentials:r}}function Ze(e,t){return e?t.allowWildcard?true:t.allowedOrigins.includes(e):false}function et(e,t){let r=e.headers.get("origin"),n={};return t.allowWildcard?n["Access-Control-Allow-Origin"]="*":r&&Ze(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 yr(e,t,r,n){return {...et(e,t),"Access-Control-Allow-Methods":r.join(", "),"Access-Control-Allow-Headers":n.join(", "),"Access-Control-Max-Age":t.maxAge.toString()}}var xr=["Content-Type","X-Bloggy-Version","X-Idempotency-Key","Authorization","X-Requested-With"];function h(e,t,r={}){let{status:n=200,headers:s={},corsConfig:i={}}=r,o={...Qe(),...i},a=et(e,o),c=ue(e,o.securityConfig),l={"Content-Type":"application/json",...a,...c,...s};return server.NextResponse.json(t,{status:n,headers:l})}function Y(e,t,r={}){let{allowedHeaders:n=xr,corsConfig:s={}}=r,i={...Qe(),...s},o=e.headers.get("origin");if(o&&!i.allowWildcard&&!Ze(o,i)){let l=ue(e,i.securityConfig);return new server.NextResponse(null,{status:403,headers:{"Content-Type":"text/plain",...l}})}let a=yr(e,i,[...t,"OPTIONS"],n),c=ue(e,i.securityConfig);return new server.NextResponse(null,{status:200,headers:{...a,...c}})}async function Pr(e){try{let t=await _(e);if(!t.authenticated){let g=await B(e);return h(e,g.error,{status:401})}let r=t.token??"anonymous",n=await E(r);if(!n.allowed){let g=n.errorResponse.error?.details?.rateLimit,y=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},T=N(y);return h(e,n.errorResponse,{status:429,headers:T})}if(!e.headers.get("content-type")?.includes("application/json"))return h(e,{success:!1,error:{code:"PUB001",message:"Content-Type must be application/json"},idempotencyKey:""},{status:400});let i;try{i=await e.json();}catch{return h(e,{success:!1,error:{code:"PUB001",message:"Invalid JSON in request body"},idempotencyKey:""},{status:400})}let o=Sr(i);if(o.length>0)return h(e,{success:!1,error:{code:"PUB001",message:"Missing required fields",details:{errors:o}},idempotencyKey:i.idempotencyKey??""},{status:400});let a=e.headers.get("X-Bloggy-Version");if(a){let g=k(a);if(g?.platformVersion){let y=C();if(g.platformVersion.major!==y.major)return h(e,{success:!1,error:{code:"PUB009",message:"Major version incompatibility. Please upgrade your blog platform package.",details:{clientVersion:g.platformVersion.version,serverVersion:y.version}},idempotencyKey:i.idempotencyKey},{status:409})}}if(i.dryRun){let g=[];return i.article.wordCount<50&&g.push("Article has fewer than 50 words, which may affect SEO"),(!i.article.excerpt||i.article.excerpt.length<120)&&g.push("Article excerpt is shorter than recommended 120 characters"),i.article.meta.keywords.length||g.push("No SEO keywords provided"),h(e,{success:!0,warnings:g,idempotencyKey:i.idempotencyKey},{status:200})}let c={...i.article,slug:i.slug??i.article.slug,meta:{...i.article.meta,description:i.metaDescription??i.article.meta.description}};if(!_e(c.slug))return h(e,{success:!1,error:{code:"PUB002",message:"Slug can only contain lowercase letters, numbers, and hyphens"},idempotencyKey:i.idempotencyKey},{status:400});let d=await I().saveArticle(c,i.idempotencyKey),p=C(),S=N(n.rateLimitResult),b={"X-Bloggy-Version":`platform/${p.version}`,"X-Idempotency-Key":i.idempotencyKey,...S};d.success&&(b.Location=d.url??`/${c.slug}`);let u=d.success?201:d.error?.code==="PUB003"?409:400;return h(e,d,{status:u,headers:b})}catch(t){return console.error("Publish endpoint error:",t),h(e,{success:false,error:{code:"PUB007",message:"Internal server error during publishing"},idempotencyKey:""},{status:500})}}function Sr(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,s=["id","slug","title","content","publishedAt","site"];for(let i of s)n[i]||t.push(`Missing required article field: ${i}`);if(n.site&&typeof n.site=="object"){let i=n.site,o=["id","name","domain"];for(let a of o)i[a]||t.push(`Missing required site field: ${a}`);}if(n.meta&&typeof n.meta=="object"){let i=n.meta;Array.isArray(i.keywords)||t.push("Article meta.keywords must be an array");}}return t}function _e(e){return !e||typeof e!="string"?false:/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(e)&&e.length>=1&&e.length<=100}async function vr(e){try{let t=await _(e);if(!t.authenticated){let u=await B(e);return server.NextResponse.json(u.error,{status:401})}let r=t.token??"anonymous",n=await E(r);if(!n.allowed){let u=n.errorResponse.error?.details?.rateLimit,g=u&&typeof u=="object"&&"limit"in u&&"remaining"in u&&"reset"in u&&"count"in u&&"success"in u?u:{limit:10,remaining:0,reset:Date.now()+6e4,count:10,success:!1},y=N(g);return h(e,n.errorResponse,{status:429,headers:y})}if(!e.headers.get("content-type")?.includes("application/json"))return h(e,{success:!1,error:{code:"PUB001",message:"Content-Type must be application/json"},idempotencyKey:""},{status:400});let i;try{i=await e.json();}catch{return h(e,{success:!1,error:{code:"PUB001",message:"Invalid JSON in request body"},idempotencyKey:""},{status:400})}let o=wr(i);if(o.length>0)return h(e,{success:!1,error:{code:"PUB001",message:"Missing required fields",details:{errors:o}},idempotencyKey:i.idempotencyKey??""},{status:400});let a=e.headers.get("X-Bloggy-Version");if(a){let u=k(a);if(u?.platformVersion){let g=C();if(u.platformVersion.major!==g.major)return h(e,{success:!1,error:{code:"PUB009",message:"Major version incompatibility. Please upgrade your blog platform package.",details:{clientVersion:u.platformVersion.version,serverVersion:g.version}},idempotencyKey:i.idempotencyKey},{status:409})}}if(!Nr(i.slug))return h(e,{success:!1,error:{code:"PUB002",message:"Slug can only contain lowercase letters, numbers, and hyphens"},idempotencyKey:i.idempotencyKey},{status:400});if(i.dryRun){let g=await I().getArticle(i.slug),y=[];return g||y.push("Article with this slug does not exist"),h(e,{success:!0,warnings:y,idempotencyKey:i.idempotencyKey},{status:200})}let l=await I().removeArticle(i.slug,i.idempotencyKey),d=C(),p=N(n.rateLimitResult),S={"X-Bloggy-Version":`platform/${d.version}`,"X-Idempotency-Key":i.idempotencyKey,...p},b=l.success?200:l.error?.code==="PUB007"?404:400;return h(e,l,{status:b,headers:S})}catch(t){return console.error("Unpublish endpoint error:",t),h(e,{success:false,error:{code:"PUB007",message:"Internal server error during unpublishing"},idempotencyKey:""},{status:500})}}function wr(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 Nr(e){return !e||typeof e!="string"?false:/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(e)&&e.length>=1&&e.length<=100}async function Rr(e){try{let t=await _(e);if(!t.authenticated){let p=await B(e),S={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 h(e,S,{status:401})}let r=t.token??"anonymous",n=await E(r);if(!n.allowed){let p=n.errorResponse.error?.details?.rateLimit,S=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},b=N(S),u={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 h(e,u,{status:429,headers:b})}let s=C(),i=e.headers.get("X-Bloggy-Version"),o={name:"unknown",version:"unknown",major:0,minor:0,patch:0};if(i)try{if(/^\d+\.\d+\.\d+/.test(i)){let p=i.split("."),S=parseInt(p[0]??"0",10),b=parseInt(p[1]??"0",10),u=parseInt(p[2]?.split("-")[0]??"0",10);o={name:"bloggy",version:i,major:S,minor:b,patch:u};}else {let p=k(i);p?.bloggyVersion&&(o=p.bloggyVersion);}}catch(p){console.warn("Failed to parse X-Bloggy-Version header:",p);}let a={compatible:!0};o.version!=="unknown"&&(a=Ke(o,s));let c={success:!0,versions:{bloggy:o,platform:s},compatibility:a},l=N(n.rateLimitResult),d={"X-Bloggy-Version":`platform/${s.version}`,"Cache-Control":"public, max-age=300, stale-while-revalidate=60",...l};return h(e,c,{status:200,headers:d})}catch(t){console.error("Version endpoint error:",t);let r={success:false,versions:{bloggy:{name:"unknown",version:"unknown",major:0,minor:0,patch:0},platform:{name:"unknown",version:"unknown",major:0,minor:0,patch:0}},compatibility:{compatible:false,errorMessage:"Internal server error while checking version compatibility"},error:t instanceof Error?t.message:"Unknown error"};return h(e,r,{status:500})}}async function Cr(e,{params:t}){try{let{slug:r}=await t,n=await _(e);if(!n.authenticated){let g=await B(e);return server.NextResponse.json(g.error,{status:401})}let s=n.token??"anonymous",i=await E(s);if(!i.allowed){let g=i.errorResponse.error?.details?.rateLimit||{limit:10,remaining:0,reset:Date.now()+6e4,count:10,success:!1},y=N(g);return h(e,i.errorResponse,{status:429,headers:y})}if(!r||!_e(r))return h(e,{exists:!1,error:{code:"PUB002",message:"Invalid slug format. Must be lowercase letters, numbers, and hyphens only."}},{status:400});let o=e.headers.get("X-Bloggy-Version");if(o){let g=k(o);if(g?.platformVersion){let y=C();if(g.platformVersion.major!==y.major)return h(e,{exists:!1,error:{code:"PUB009",message:"Major version incompatibility. Please upgrade your blog platform package.",details:{clientVersion:g.platformVersion.version,serverVersion:y.version}}},{status:409})}}let l=await I().getArticle(r)!==null,d={exists:l,...l&&{message:"Slug is already in use. Please choose another (e.g., append '-v2')."}},p=C(),S=N(i.rateLimitResult),b={"X-Bloggy-Version":`platform/${p.version}`,...S},u=e.headers.get("X-Idempotency-Key");return u&&(b["X-Idempotency-Key"]=u,console.log(`Slug check for idempotency: ${u}, exists: ${l}`)),h(e,d,{status:200,headers:b})}catch(r){return console.error("Slug existence check error:",r instanceof Error?r.message:String(r)),h(e,{exists:false,error:{code:"PUB007",message:"Internal server error during slug check"}},{status:500})}}async function Or(e){return Y(e,["GET"])}var bi=j.version;
29
+ `)}function lr(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((s,i)=>{try{new URL(s.loc);}catch{t.push(`Invalid URL at entry ${i+1}: ${s.loc}`);}s.priority!==void 0&&(s.priority<0||s.priority>1)&&t.push(`Invalid priority at entry ${i+1}: must be between 0.0 and 1.0`),s.lastmod&&!mr(s.lastmod)&&t.push(`Invalid lastmod date at entry ${i+1}: ${s.lastmod}`),s.loc.length>2048&&r.push(`URL at entry ${i+1} exceeds 2048 character limit`);});let n=new Map;return e.entries.forEach(s=>{let i=n.get(s.loc)??0;n.set(s.loc,i+1);}),n.forEach((s,i)=>{s>1&&t.push(`Duplicate URL found: ${i} (appears ${s} times)`);}),{valid:t.length===0,errors:t,warnings:r}}function H(e){return e.length===0?new Date().toISOString():e.reduce((r,n)=>{let s=new Date(n.updatedAt);return s>r?s:r},new Date(e[0].updatedAt)).toISOString()}function cr(e,t,r=[],n={}){return async function(){let o=(await Oe(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:o,totalEntries:o.length,generatedAt:new Date().toISOString(),baseUrl:G(n.canonical?.domain??e.domain,n.canonical?.forceHttps??true)},c=We(a);return new Response(c,{headers:{"Content-Type":"application/xml","Cache-Control":"public, max-age=3600, s-maxage=3600"}})}}function ur(e){return async function(){let r=await e.getSite(),n=await e.getArticles(),s=e.getAuthors?await e.getAuthors():[];return Oe(r,n,s,e.options)}}function J(e){let t={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;"};return e.replace(/[&<>"']/g,r=>t[r]??r)}function mr(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 j={name:"@xexr/blog-platform",version:"0.2.1"};function Xe(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),s=parseInt(r[1]??"0",10),i=parseInt(r[2]?.split("-")[0]??"0",10);if(isNaN(n)||isNaN(s)||isNaN(i))throw new Error(`Invalid version format: ${e}`);return {major:n,minor:s,patch:i}}function C(){let e=Xe(j.version);return {name:j.name,version:j.version,...e}}function k(e){try{let t=e.split(" "),r={};for(let n of t){let[s,i]=n.split("/");if(!s||!i)continue;let o=Xe(i),a={name:s,version:i,...o};s==="bloggy"?r.bloggyVersion=a:s==="platform"&&(r.platformVersion=a);}return r}catch{return null}}function Ke(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 Je={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 dr(){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 {...Je,enableCSP:!e,frameOptions:t??Je.frameOptions,enableHSTS:!r}}function gr(e){return Object.entries(e).map(([t,r])=>r?`${t} ${r}`:t).join("; ")}function fr(e){return Object.entries(e).map(([t,r])=>`${t}=${r}`).join(", ")}function hr(e,t={}){let r={...dr(),...t},n={};if(r.enableCSP){let s={...r.cspDirectives,...t.cspDirectives??{}};n["Content-Security-Policy"]=gr(s);}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&&br(e)){let s=[`max-age=${r.hstsMaxAge}`,r.hstsIncludeSubdomains?"includeSubDomains":""].filter(Boolean).join("; ");n["Strict-Transport-Security"]=s;}if(r.enablePermissionsPolicy){let s={...r.permissionsPolicyDirectives,...t.permissionsPolicyDirectives??{}};n["Permissions-Policy"]=fr(s);}return n}function br(e){return !!(e.url.startsWith("https://")||e.headers.get("x-forwarded-proto")==="https"||e.headers.get("cf-visitor")?.includes('"scheme":"https"'))}function ue(e,t={}){return hr(e,{...t,cspDirectives:{...{"default-src":"'none'","frame-ancestors":"'none'","base-uri":"'none'"},...t.cspDirectives??{}}})}var Ye={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 Qe(){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 {...Ye,allowedOrigins:e?e.split(",").map(n=>n.trim()):Ye.allowedOrigins,allowWildcard:t,allowCredentials:r}}function Ze(e,t){return e?t.allowWildcard?true:t.allowedOrigins.includes(e):false}function et(e,t){let r=e.headers.get("origin"),n={};return t.allowWildcard?n["Access-Control-Allow-Origin"]="*":r&&Ze(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 yr(e,t,r,n){return {...et(e,t),"Access-Control-Allow-Methods":r.join(", "),"Access-Control-Allow-Headers":n.join(", "),"Access-Control-Max-Age":t.maxAge.toString()}}var xr=["Content-Type","X-Bloggy-Version","X-Idempotency-Key","Authorization","X-Requested-With"];function h(e,t,r={}){let{status:n=200,headers:s={},corsConfig:i={}}=r,o={...Qe(),...i},a=et(e,o),c=ue(e,o.securityConfig),l={"Content-Type":"application/json",...a,...c,...s};return server.NextResponse.json(t,{status:n,headers:l})}function Y(e,t,r={}){let{allowedHeaders:n=xr,corsConfig:s={}}=r,i={...Qe(),...s},o=e.headers.get("origin");if(o&&!i.allowWildcard&&!Ze(o,i)){let l=ue(e,i.securityConfig);return new server.NextResponse(null,{status:403,headers:{"Content-Type":"text/plain",...l}})}let a=yr(e,i,[...t,"OPTIONS"],n),c=ue(e,i.securityConfig);return new server.NextResponse(null,{status:200,headers:{...a,...c}})}async function Pr(e){try{let t=await _(e);if(!t.authenticated){let g=await B(e);return h(e,g.error,{status:401})}let r=t.token??"anonymous",n=await E(r);if(!n.allowed){let g=n.errorResponse.error?.details?.rateLimit,y=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},T=N(y);return h(e,n.errorResponse,{status:429,headers:T})}if(!e.headers.get("content-type")?.includes("application/json"))return h(e,{success:!1,error:{code:"PUB001",message:"Content-Type must be application/json"},idempotencyKey:""},{status:400});let i;try{i=await e.json();}catch{return h(e,{success:!1,error:{code:"PUB001",message:"Invalid JSON in request body"},idempotencyKey:""},{status:400})}let o=Sr(i);if(o.length>0)return h(e,{success:!1,error:{code:"PUB001",message:"Missing required fields",details:{errors:o}},idempotencyKey:i.idempotencyKey??""},{status:400});let a=e.headers.get("X-Bloggy-Version");if(a){let g=k(a);if(g?.platformVersion){let y=C();if(g.platformVersion.major!==y.major)return h(e,{success:!1,error:{code:"PUB009",message:"Major version incompatibility. Please upgrade your blog platform package.",details:{clientVersion:g.platformVersion.version,serverVersion:y.version}},idempotencyKey:i.idempotencyKey},{status:409})}}if(i.dryRun){let g=[];return i.article.wordCount<50&&g.push("Article has fewer than 50 words, which may affect SEO"),(!i.article.excerpt||i.article.excerpt.length<120)&&g.push("Article excerpt is shorter than recommended 120 characters"),i.article.meta.keywords.length||g.push("No SEO keywords provided"),h(e,{success:!0,warnings:g,idempotencyKey:i.idempotencyKey},{status:200})}let c={...i.article,slug:i.slug??i.article.slug,meta:{...i.article.meta,description:i.metaDescription??i.article.meta.description}};if(!_e(c.slug))return h(e,{success:!1,error:{code:"PUB002",message:"Slug can only contain lowercase letters, numbers, and hyphens"},idempotencyKey:i.idempotencyKey},{status:400});let d=await I().saveArticle(c,i.idempotencyKey),p=C(),S=N(n.rateLimitResult),b={"X-Bloggy-Version":`platform/${p.version}`,"X-Idempotency-Key":i.idempotencyKey,...S};d.success&&(b.Location=d.url??`/${c.slug}`);let u=d.success?201:d.error?.code==="PUB003"?409:400;return h(e,d,{status:u,headers:b})}catch(t){return console.error("Publish endpoint error:",t),h(e,{success:false,error:{code:"PUB007",message:"Internal server error during publishing"},idempotencyKey:""},{status:500})}}function Sr(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,s=["id","slug","title","content","publishedAt","site"];for(let i of s)n[i]||t.push(`Missing required article field: ${i}`);if(n.site&&typeof n.site=="object"){let i=n.site,o=["id","name","domain"];for(let a of o)i[a]||t.push(`Missing required site field: ${a}`);}if(n.meta&&typeof n.meta=="object"){let i=n.meta;Array.isArray(i.keywords)||t.push("Article meta.keywords must be an array");}}return t}function _e(e){return !e||typeof e!="string"?false:/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(e)&&e.length>=1&&e.length<=100}async function vr(e){try{let t=await _(e);if(!t.authenticated){let u=await B(e);return server.NextResponse.json(u.error,{status:401})}let r=t.token??"anonymous",n=await E(r);if(!n.allowed){let u=n.errorResponse.error?.details?.rateLimit,g=u&&typeof u=="object"&&"limit"in u&&"remaining"in u&&"reset"in u&&"count"in u&&"success"in u?u:{limit:10,remaining:0,reset:Date.now()+6e4,count:10,success:!1},y=N(g);return h(e,n.errorResponse,{status:429,headers:y})}if(!e.headers.get("content-type")?.includes("application/json"))return h(e,{success:!1,error:{code:"PUB001",message:"Content-Type must be application/json"},idempotencyKey:""},{status:400});let i;try{i=await e.json();}catch{return h(e,{success:!1,error:{code:"PUB001",message:"Invalid JSON in request body"},idempotencyKey:""},{status:400})}let o=wr(i);if(o.length>0)return h(e,{success:!1,error:{code:"PUB001",message:"Missing required fields",details:{errors:o}},idempotencyKey:i.idempotencyKey??""},{status:400});let a=e.headers.get("X-Bloggy-Version");if(a){let u=k(a);if(u?.platformVersion){let g=C();if(u.platformVersion.major!==g.major)return h(e,{success:!1,error:{code:"PUB009",message:"Major version incompatibility. Please upgrade your blog platform package.",details:{clientVersion:u.platformVersion.version,serverVersion:g.version}},idempotencyKey:i.idempotencyKey},{status:409})}}if(!Nr(i.slug))return h(e,{success:!1,error:{code:"PUB002",message:"Slug can only contain lowercase letters, numbers, and hyphens"},idempotencyKey:i.idempotencyKey},{status:400});if(i.dryRun){let g=await I().getArticle(i.slug),y=[];return g||y.push("Article with this slug does not exist"),h(e,{success:!0,warnings:y,idempotencyKey:i.idempotencyKey},{status:200})}let l=await I().removeArticle(i.slug,i.idempotencyKey),d=C(),p=N(n.rateLimitResult),S={"X-Bloggy-Version":`platform/${d.version}`,"X-Idempotency-Key":i.idempotencyKey,...p},b=l.success?200:l.error?.code==="PUB007"?404:400;return h(e,l,{status:b,headers:S})}catch(t){return console.error("Unpublish endpoint error:",t),h(e,{success:false,error:{code:"PUB007",message:"Internal server error during unpublishing"},idempotencyKey:""},{status:500})}}function wr(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 Nr(e){return !e||typeof e!="string"?false:/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(e)&&e.length>=1&&e.length<=100}async function Rr(e){try{let t=await _(e);if(!t.authenticated){let p=await B(e),S={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 h(e,S,{status:401})}let r=t.token??"anonymous",n=await E(r);if(!n.allowed){let p=n.errorResponse.error?.details?.rateLimit,S=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},b=N(S),u={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 h(e,u,{status:429,headers:b})}let s=C(),i=e.headers.get("X-Bloggy-Version"),o={name:"unknown",version:"unknown",major:0,minor:0,patch:0};if(i)try{if(/^\d+\.\d+\.\d+/.test(i)){let p=i.split("."),S=parseInt(p[0]??"0",10),b=parseInt(p[1]??"0",10),u=parseInt(p[2]?.split("-")[0]??"0",10);o={name:"bloggy",version:i,major:S,minor:b,patch:u};}else {let p=k(i);p?.bloggyVersion&&(o=p.bloggyVersion);}}catch(p){console.warn("Failed to parse X-Bloggy-Version header:",p);}let a={compatible:!0};o.version!=="unknown"&&(a=Ke(o,s));let c={success:!0,versions:{bloggy:o,platform:s},compatibility:a},l=N(n.rateLimitResult),d={"X-Bloggy-Version":`platform/${s.version}`,"Cache-Control":"public, max-age=300, stale-while-revalidate=60",...l};return h(e,c,{status:200,headers:d})}catch(t){console.error("Version endpoint error:",t);let r={success:false,versions:{bloggy:{name:"unknown",version:"unknown",major:0,minor:0,patch:0},platform:{name:"unknown",version:"unknown",major:0,minor:0,patch:0}},compatibility:{compatible:false,errorMessage:"Internal server error while checking version compatibility"},error:t instanceof Error?t.message:"Unknown error"};return h(e,r,{status:500})}}async function Cr(e,{params:t}){try{let{slug:r}=await t,n=await _(e);if(!n.authenticated){let g=await B(e);return server.NextResponse.json(g.error,{status:401})}let s=n.token??"anonymous",i=await E(s);if(!i.allowed){let g=i.errorResponse.error?.details?.rateLimit||{limit:10,remaining:0,reset:Date.now()+6e4,count:10,success:!1},y=N(g);return h(e,i.errorResponse,{status:429,headers:y})}if(!r||!_e(r))return h(e,{exists:!1,error:{code:"PUB002",message:"Invalid slug format. Must be lowercase letters, numbers, and hyphens only."}},{status:400});let o=e.headers.get("X-Bloggy-Version");if(o){let g=k(o);if(g?.platformVersion){let y=C();if(g.platformVersion.major!==y.major)return h(e,{exists:!1,error:{code:"PUB009",message:"Major version incompatibility. Please upgrade your blog platform package.",details:{clientVersion:g.platformVersion.version,serverVersion:y.version}}},{status:409})}}let l=await I().getArticle(r)!==null,d={exists:l,...l&&{message:"Slug is already in use. Please choose another (e.g., append '-v2')."}},p=C(),S=N(i.rateLimitResult),b={"X-Bloggy-Version":`platform/${p.version}`,...S},u=e.headers.get("X-Idempotency-Key");return u&&(b["X-Idempotency-Key"]=u,console.log(`Slug check for idempotency: ${u}, exists: ${l}`)),h(e,d,{status:200,headers:b})}catch(r){return console.error("Slug existence check error:",r instanceof Error?r.message:String(r)),h(e,{exists:false,error:{code:"PUB007",message:"Internal server error during slug check"}},{status:500})}}async function Or(e){return Y(e,["GET"])}var bi=j.version;
30
30
  exports.ApiKeyAuth=ie;exports.BlogArticlePage=Ve;exports.BlogHomePage=$e;exports.Button=lt;exports.Card=z;exports.CardContent=W;exports.CardDescription=Nt;exports.CardFooter=Rt;exports.CardHeader=Pe;exports.CardTitle=Se;exports.DrizzleStorage=Ce;exports.EnvAuth=U;exports.InMemoryStorage=ae;exports.NoAuth=X;exports.PACKAGE_VERSION=bi;exports.Pagination=ee;exports.PaginationContent=pe;exports.PaginationEllipsis=Z;exports.PaginationItem=L;exports.PaginationLink=D;exports.PaginationNext=ge;exports.PaginationPrevious=de;exports.ShadcnPagination=me;exports.StructuredDataError=F;exports.UninitializedAuth=se;exports.autoConfigureRateLimit=Te;exports.bpArticles=A;exports.bpOperations=V;exports.buttonVariants=Q;exports.checkRateLimit=He;exports.cn=P;exports.configureRateLimit=le;exports.createBlogSitemapRoute=cr;exports.createDynamicBlogSitemap=ur;exports.createRateLimitErrorResponse=je;exports.createStructuredDataScript=q;exports.enforceRateLimit=E;exports.extractKeywordsFromArticle=ht;exports.extractTokenFromHeader=we;exports.generateArticleMetadata=Bt;exports.generateArticleStructuredData=te;exports.generateAuthorStructuredData=Be;exports.generateBlogHomeMetadata=At;exports.generateBlogHomeStructuredData=ye;exports.generateBlogSitemapEntries=Oe;exports.generateBreadcrumbStructuredData=Ie;exports.generateCanonicalUrl=$;exports.generateCanonicalUrlFromSlug=Qt;exports.generateCompleteArticleStructuredData=be;exports.generateOrganizationStructuredData=fe;exports.generatePaginationMetadata=ft;exports.generateSiteMetadata=rr;exports.generateSitemap=or;exports.generateSitemapIndex=ar;exports.generateWebSiteStructuredData=he;exports.getAuthConfig=Ne;exports.getBaseUrl=er;exports.getDrizzleAdapterSql=Yt;exports.getRateLimitHeaders=N;exports.getStorage=I;exports.initBlogPlatform=ce;exports.initBlogPlatformDev=Ft;exports.initBlogPlatformOnce=jt;exports.initBlogPlatformProd=qt;exports.initEnvAuth=kt;exports.isValidCanonicalUrl=Zt;exports.metadataToHtml=ir;exports.normalizeDomain=G;exports.normalizeSlug=ze;exports.publishHandler=Pr;exports.safeGenerateArticleStructuredData=bt;exports.setAuthConfig=oe;exports.setStorage=Re;exports.shouldSkipAuth=Mt;exports.sitemapToXml=We;exports.slugExistsHandler=Cr;exports.slugExistsOptionsHandler=Or;exports.structuredDataToJsonLd=De;exports.unpublishHandler=vr;exports.updateArticleCanonicalUrl=tr;exports.usePagination=gt;exports.validateMetadata=sr;exports.validateSitemap=lr;exports.validateStructuredData=ke;exports.versionHandler=Rr;//# sourceMappingURL=index.js.map
31
31
  //# sourceMappingURL=index.js.map