@xexr/blog-platform 1.1.1 → 1.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -75,6 +75,6 @@ See https://github.com/xexr/blog-platform#authentication for more details.`);con
75
75
  `)});return [t,r,...o,n].join(`
76
76
  `)}function mo(e,t){let r='<?xml version="1.0" encoding="UTF-8"?>',n='<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">',o="</sitemapindex>",i=e.map(a=>{let c=[];return c.push(" <sitemap>"),c.push(` <loc>${Me(a.url)}</loc>`),a.lastmod&&c.push(` <lastmod>${Me(a.lastmod)}</lastmod>`),c.push(" </sitemap>"),c.join(`
77
77
  `)});return [r,n,...i,o].join(`
78
- `)}function po(e){let t=[],r=[];e.entries.length===0?t.push("Sitemap must contain at least one URL"):e.entries.length>5e4&&t.push("Sitemap contains more than 50,000 URLs (Google limit)"),e.truncated&&r.push("Sitemap was truncated due to size limits"),e.entries.forEach((o,i)=>{try{new URL(o.loc);}catch{t.push(`Invalid URL at entry ${i+1}: ${o.loc}`);}o.priority!==void 0&&(o.priority<0||o.priority>1)&&t.push(`Invalid priority at entry ${i+1}: must be between 0.0 and 1.0`),o.lastmod&&!ho(o.lastmod)&&t.push(`Invalid lastmod date at entry ${i+1}: ${o.lastmod}`),o.loc.length>2048&&r.push(`URL at entry ${i+1} exceeds 2048 character limit`);});let n=new Map;return e.entries.forEach(o=>{let i=n.get(o.loc)??0;n.set(o.loc,i+1);}),n.forEach((o,i)=>{o>1&&t.push(`Duplicate URL found: ${i} (appears ${o} times)`);}),{valid:t.length===0,errors:t,warnings:r}}function z(e){return e.length===0?new Date().toISOString():e.reduce((r,n)=>{let o=new Date(n.updatedAt);return o>r?o:r},new Date(e[0].updatedAt)).toISOString()}function go(e,t,r=[],n={}){return async function(){let a=(await It(e,t,r,n)).map(u=>({loc:u.url,lastmod:typeof u.lastModified=="string"?u.lastModified:u.lastModified?.toISOString(),changefreq:u.changeFrequency,priority:u.priority})),c={entries:a,totalEntries:a.length,generatedAt:new Date().toISOString(),baseUrl:Ae(n.canonical?.domain??e.domain,n.canonical?.forceHttps??true)},l=Sr(c);return new Response(l,{headers:{"Content-Type":"application/xml","Cache-Control":"public, max-age=3600, s-maxage=3600"}})}}function fo(e){return async function(){let r=[...e.staticRoutes??[],...e.getStaticRoutes?await e.getStaticRoutes():[]],n=await e.getSite(),o=await e.getArticles(),i=e.getAuthors?await e.getAuthors():[];return [...r,...await It(n,o,i,e.options)]}}function Me(e){let t={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;"};return e.replace(/[&<>"']/g,r=>t[r]??r)}function ho(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 we={name:"@xexr/blog-platform",version:"1.1.1"};function Nr(e){let r=e.replace(/^v/,"").split(".");if(r.length<3)throw new Error(`Invalid version format: ${e}`);let n=parseInt(r[0]??"0",10),o=parseInt(r[1]??"0",10),i=parseInt(r[2]?.split("-")[0]??"0",10);if(isNaN(n)||isNaN(o)||isNaN(i))throw new Error(`Invalid version format: ${e}`);return {major:n,minor:o,patch:i}}function J(){let e=Nr(we.version);return {name:we.name,version:we.version,...e}}function ie(e){try{let t=e.split(" "),r={};for(let n of t){let[o,i]=n.split("/");if(!o||!i)continue;let a=Nr(i),c={name:o,version:i,...a};o==="bloggy"?r.bloggyVersion=c:o==="platform"&&(r.platformVersion=c);}return r}catch{return null}}function Tr(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 Rr={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 xo(){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 {...Rr,enableCSP:!e,frameOptions:t??Rr.frameOptions,enableHSTS:!r}}function yo(e){return Object.entries(e).map(([t,r])=>r?`${t} ${r}`:t).join("; ")}function vo(e){return Object.entries(e).map(([t,r])=>`${t}=${r}`).join(", ")}function Po(e,t={}){let r={...xo(),...t},n={};if(r.enableCSP){let o={...r.cspDirectives,...t.cspDirectives??{}};n["Content-Security-Policy"]=yo(o);}if(r.enableFrameOptions&&(n["X-Frame-Options"]=r.frameOptions),r.enableContentTypeOptions&&(n["X-Content-Type-Options"]="nosniff"),r.enableXSSProtection&&(n["X-XSS-Protection"]="1; mode=block"),r.enableReferrerPolicy&&(n["Referrer-Policy"]=r.referrerPolicy),r.enableHSTS&&Ao(e)){let o=[`max-age=${r.hstsMaxAge}`,r.hstsIncludeSubdomains?"includeSubDomains":""].filter(Boolean).join("; ");n["Strict-Transport-Security"]=o;}if(r.enablePermissionsPolicy){let o={...r.permissionsPolicyDirectives,...t.permissionsPolicyDirectives??{}};n["Permissions-Policy"]=vo(o);}return n}function Ao(e){return !!(e.url.startsWith("https://")||e.headers.get("x-forwarded-proto")==="https"||e.headers.get("cf-visitor")?.includes('"scheme":"https"'))}function Qe(e,t={}){return Po(e,{...t,cspDirectives:{...{"default-src":"'none'","frame-ancestors":"'none'","base-uri":"'none'"},...t.cspDirectives??{}}})}var Cr={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 Lr(){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 {...Cr,allowedOrigins:e?e.split(",").map(n=>n.trim()):Cr.allowedOrigins,allowWildcard:t,allowCredentials:r}}function kr(e,t){return e?t.allowWildcard?true:t.allowedOrigins.includes(e):false}function _r(e,t){let r=e.headers.get("origin"),n={};return t.allowWildcard?n["Access-Control-Allow-Origin"]="*":r&&kr(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 wo(e,t,r,n){return {..._r(e,t),"Access-Control-Allow-Methods":r.join(", "),"Access-Control-Allow-Headers":n.join(", "),"Access-Control-Max-Age":t.maxAge.toString()}}var So=["Content-Type","X-Bloggy-Version","X-Idempotency-Key","Authorization","X-Requested-With"];function v(e,t,r={}){let{status:n=200,headers:o={},corsConfig:i={}}=r,a={...Lr(),...i},c=_r(e,a),l=Qe(e,a.securityConfig),u={"Content-Type":"application/json",...c,...l,...o};return server_js.NextResponse.json(t,{status:n,headers:u})}function me(e,t,r={}){let{allowedHeaders:n=So,corsConfig:o={}}=r,i={...Lr(),...o},a=e.headers.get("origin");if(a&&!i.allowWildcard&&!kr(a,i)){let u=Qe(e,i.securityConfig);return new server_js.NextResponse(null,{status:403,headers:{"Content-Type":"text/plain",...u}})}let c=wo(e,i,[...t,"OPTIONS"],n),l=Qe(e,i.securityConfig);return new server_js.NextResponse(null,{status:200,headers:{...c,...l}})}async function No(e){try{let t=await W(e);if(!t.authenticated){let p=await Q(e);return v(e,p.error,{status:401})}let r=F(t.token??"anonymous"),n=await K(r);if(!n.allowed){let p=n.errorResponse.error?.details?.rateLimit,x=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},S=B(x);return v(e,n.errorResponse,{status:429,headers:S})}if(!e.headers.get("content-type")?.includes("application/json"))return v(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 v(e,{success:!1,error:{code:"PUB001",message:"Invalid JSON in request body"},idempotencyKey:""},{status:400})}let a=To(i);if(a.length>0)return v(e,{success:!1,error:{code:"PUB001",message:"Missing required fields",details:{errors:a}},idempotencyKey:i.idempotencyKey??""},{status:400});let c=e.headers.get("X-Bloggy-Version");if(c){let p=ie(c);if(p?.platformVersion){let x=J();if(p.platformVersion.major!==x.major)return v(e,{success:!1,error:{code:"PUB009",message:"Major version incompatibility. Please upgrade your blog platform package.",details:{clientVersion:p.platformVersion.version,serverVersion:x.version}},idempotencyKey:i.idempotencyKey},{status:409})}}if(i.dryRun){let p=[];return i.article.wordCount<50&&p.push("Article has fewer than 50 words, which may affect SEO"),(!i.article.excerpt||i.article.excerpt.length<120)&&p.push("Article excerpt is shorter than recommended 120 characters"),i.article.meta.keywords.length||p.push("No SEO keywords provided"),v(e,{success:!0,warnings:p,idempotencyKey:i.idempotencyKey},{status:200})}let l={...i.article,slug:i.slug??i.article.slug,meta:{...i.article.meta,description:i.metaDescription??i.article.meta.description}};if(!Et(l.slug))return v(e,{success:!1,error:{code:"PUB002",message:"Slug can only contain lowercase letters, numbers, and hyphens"},idempotencyKey:i.idempotencyKey},{status:400});let m=await M().saveArticle(l,i.idempotencyKey),s=J(),f=B(n.rateLimitResult),h={"X-Bloggy-Version":`platform/${s.version}`,"X-Idempotency-Key":i.idempotencyKey,...f};m.success&&(h.Location=m.url??`/${l.slug}`);let g=m.success?201:m.error?.code==="PUB003"?409:400;return v(e,m,{status:g,headers:h})}catch(t){return console.error("Publish endpoint error:",t),v(e,{success:false,error:{code:"PUB007",message:"Internal server error during publishing"},idempotencyKey:""},{status:500})}}function To(e){let t=[];if(!e||typeof e!="object")return t.push("Request body must be a valid object"),t;let r=e;if((!r.article||typeof r.article!="object")&&t.push("Missing required field: article"),(!r.idempotencyKey||typeof r.idempotencyKey!="string")&&t.push("Missing required field: idempotencyKey"),r.article&&typeof r.article=="object"){let n=r.article,o=["id","slug","title","content","publishedAt","site"];for(let i of o)n[i]||t.push(`Missing required article field: ${i}`);if(n.site&&typeof n.site=="object"){let i=n.site,a=["id","name","domain"];for(let c of a)i[c]||t.push(`Missing required site field: ${c}`);}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 Et(e){return !e||typeof e!="string"?false:/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(e)&&e.length>=1&&e.length<=100}async function Co(e){try{let t=await W(e);if(!t.authenticated){let g=await Q(e);return server_js.NextResponse.json(g.error,{status:401})}let r=F(t.token??"anonymous"),n=await K(r);if(!n.allowed){let g=n.errorResponse.error?.details?.rateLimit,p=g&&typeof g=="object"&&"limit"in g&&"remaining"in g&&"reset"in g&&"count"in g&&"success"in g?g:{limit:10,remaining:0,reset:Date.now()+6e4,count:10,success:!1},x=B(p);return v(e,n.errorResponse,{status:429,headers:x})}if(!e.headers.get("content-type")?.includes("application/json"))return v(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 v(e,{success:!1,error:{code:"PUB001",message:"Invalid JSON in request body"},idempotencyKey:""},{status:400})}let a=Lo(i);if(a.length>0)return v(e,{success:!1,error:{code:"PUB001",message:"Missing required fields",details:{errors:a}},idempotencyKey:i.idempotencyKey??""},{status:400});let c=e.headers.get("X-Bloggy-Version");if(c){let g=ie(c);if(g?.platformVersion){let p=J();if(g.platformVersion.major!==p.major)return v(e,{success:!1,error:{code:"PUB009",message:"Major version incompatibility. Please upgrade your blog platform package.",details:{clientVersion:g.platformVersion.version,serverVersion:p.version}},idempotencyKey:i.idempotencyKey},{status:409})}}if(!ko(i.slug))return v(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 p=await M().getArticle(i.slug),x=[];return p||x.push("Article with this slug does not exist"),v(e,{success:!0,warnings:x,idempotencyKey:i.idempotencyKey},{status:200})}let u=await M().removeArticle(i.slug,i.idempotencyKey),m=J(),s=B(n.rateLimitResult),f={"X-Bloggy-Version":`platform/${m.version}`,"X-Idempotency-Key":i.idempotencyKey,...s},h=u.success?200:u.error?.code==="PUB007"?404:400;return v(e,u,{status:h,headers:f})}catch(t){return console.error("Unpublish endpoint error:",t),v(e,{success:false,error:{code:"PUB007",message:"Internal server error during unpublishing"},idempotencyKey:""},{status:500})}}function Lo(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 ko(e){return !e||typeof e!="string"?false:/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(e)&&e.length>=1&&e.length<=100}async function _o(e){try{let t=await W(e);if(!t.authenticated){let s=await Q(e),f={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:s.error?.error?.message??"Authentication required"}};return v(e,f,{status:401})}let r=F(t.token??"anonymous"),n=await K(r);if(!n.allowed){let s=n.errorResponse.error?.details?.rateLimit,f=s&&typeof s=="object"&&"limit"in s&&"remaining"in s&&"reset"in s&&"count"in s&&"success"in s?s:{limit:10,remaining:0,reset:Date.now()+6e4,count:10,success:!1},h=B(f),g={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 v(e,g,{status:429,headers:h})}let o=J(),i=e.headers.get("X-Bloggy-Version"),a={name:"unknown",version:"unknown",major:0,minor:0,patch:0};if(i)try{if(/^\d+\.\d+\.\d+/.test(i)){let s=i.split("."),f=parseInt(s[0]??"0",10),h=parseInt(s[1]??"0",10),g=parseInt(s[2]?.split("-")[0]??"0",10);a={name:"bloggy",version:i,major:f,minor:h,patch:g};}else {let s=ie(i);s?.bloggyVersion&&(a=s.bloggyVersion);}}catch(s){console.warn("Failed to parse X-Bloggy-Version header:",s);}let c={compatible:!0};a.version!=="unknown"&&(c=Tr(a,o));let l={success:!0,versions:{bloggy:a,platform:o},compatibility:c},u=B(n.rateLimitResult),m={"X-Bloggy-Version":`platform/${o.version}`,"Cache-Control":"public, max-age=300, stale-while-revalidate=60",...u};return v(e,l,{status:200,headers:m})}catch(t){console.error("Version endpoint error:",t);let r={success:false,versions:{bloggy:{name:"unknown",version:"unknown",major:0,minor:0,patch:0},platform:{name:"unknown",version:"unknown",major:0,minor:0,patch:0}},compatibility:{compatible:false,errorMessage:"Internal server error while checking version compatibility"},error:t instanceof Error?t.message:"Unknown error"};return v(e,r,{status:500})}}var Io=/^[A-Za-z0-9-]{8,128}$/;async function Bo(e){let t=await W(e);if(!t.authenticated){let l=await Q(e);return v(e,{success:false,error:{code:l.error?.error?.code??"PUB005",message:l.error?.error?.message??"Authentication required"}},{status:401})}let r=F(t.token??"anonymous"),n=await K(r);if(!n.allowed){let l=B({remaining:0,reset:Date.now()+6e4,limit:5});return v(e,{success:false,error:n.errorResponse.error??{code:"PUB011",message:"Rate limit exceeded"}},{status:429,headers:l})}if(!e.headers.get("content-type")?.includes("application/json"))return v(e,Ot("Expected JSON body"),{status:400});let i;try{i=await e.json();}catch{return v(e,Ot("Invalid JSON body"),{status:400})}let a=Oo(i);if(!a.success)return v(e,Ot(a.message),{status:400});let c=[];return a.config.searchSubmission&&(await M().setMetadata("searchSubmission",a.config.searchSubmission),c.push("searchSubmission")),v(e,{success:true,updated:c},{status:200,headers:B(n.rateLimitResult)})}async function Eo(e){return me(e,["POST"],{allowedHeaders:["Content-Type","X-Bloggy-Version","Authorization","X-Requested-With"]})}function Ot(e){return {success:false,error:{code:"PUB001",message:e}}}function Oo(e){if(!e||typeof e!="object"||Array.isArray(e))return {success:false,message:"Request body must be an object"};let t=e,r=new Set(["version","searchSubmission"]),n=Object.keys(t).filter(i=>!r.has(i));if(n.length>0)return {success:false,message:`Unsupported config section: ${n.join(", ")}`};if(t.version!==1)return {success:false,message:"Config version must be 1"};let o={version:1};if(t.searchSubmission!==void 0){let i=Mo(t.searchSubmission);return i.success?{success:true,config:{...o,searchSubmission:i.config}}:i}return {success:false,message:"At least one supported config section is required"}}function Mo(e){if(!e||typeof e!="object"||Array.isArray(e))return {success:false,message:"searchSubmission must be an object"};let t=e,r=new Set(["indexNow"]),n=Object.keys(t).filter(a=>!r.has(a));if(n.length>0)return {success:false,message:`Unsupported searchSubmission section: ${n.join(", ")}`};if(t.indexNow===void 0)return {success:false,message:"searchSubmission.indexNow is required"};let o=t.indexNow;if(!o||typeof o!="object"||Array.isArray(o))return {success:false,message:"searchSubmission.indexNow must be an object"};let i=o;if(typeof i.enabled!="boolean")return {success:false,message:"indexNow.enabled must be a boolean"};if(typeof i.key!="string"||!Io.test(i.key))return {success:false,message:"indexNow.key must be 8 to 128 characters using letters, numbers, or dashes"};if(typeof i.keyLocation!="string")return {success:false,message:"indexNow.keyLocation must be a URL"};try{let a=new URL(i.keyLocation);if(a.protocol!=="https:"&&a.protocol!=="http:")return {success:!1,message:"indexNow.keyLocation must use HTTP or HTTPS"}}catch{return {success:false,message:"indexNow.keyLocation must be a URL"}}return {success:true,config:{indexNow:{enabled:i.enabled,key:i.key,keyLocation:i.keyLocation}}}}async function $o(e){let r=(await M().getMetadata("searchSubmission"))?.indexNow;return !r?.enabled||!r.key?new server_js.NextResponse("Not found",{status:404}):new server_js.NextResponse(r.key,{status:200,headers:{"Content-Type":"text/plain; charset=utf-8","Cache-Control":"public, max-age=300, stale-while-revalidate=60"}})}async function Uo(e,{params:t}){try{let{slug:r}=await t,n=await W(e);if(!n.authenticated){let p=await Q(e);return server_js.NextResponse.json(p.error,{status:401})}let o=F(n.token??"anonymous"),i=await K(o);if(!i.allowed){let p=i.errorResponse.error?.details?.rateLimit||{limit:10,remaining:0,reset:Date.now()+6e4,count:10,success:!1},x=B(p);return v(e,i.errorResponse,{status:429,headers:x})}if(!r||!Et(r))return v(e,{exists:!1,error:{code:"PUB002",message:"Invalid slug format. Must be lowercase letters, numbers, and hyphens only."}},{status:400});let a=e.headers.get("X-Bloggy-Version");if(a){let p=ie(a);if(p?.platformVersion){let x=J();if(p.platformVersion.major!==x.major)return v(e,{exists:!1,error:{code:"PUB009",message:"Major version incompatibility. Please upgrade your blog platform package.",details:{clientVersion:p.platformVersion.version,serverVersion:x.version}}},{status:409})}}let u=await M().getArticle(r)!==null,m={exists:u,...u&&{message:"Slug is already in use. Please choose another (e.g., append '-v2')."}},s=J(),f=B(i.rateLimitResult),h={"X-Bloggy-Version":`platform/${s.version}`,...f},g=e.headers.get("X-Idempotency-Key");return g&&(h["X-Idempotency-Key"]=g,console.log(`Slug check for idempotency: ${g}, exists: ${u}`)),v(e,m,{status:200,headers:h})}catch(r){return console.error("Slug existence check error:",r instanceof Error?r.message:String(r)),v(e,{exists:false,error:{code:"PUB007",message:"Internal server error during slug check"}},{status:500})}}async function Ho(e){return me(e,["GET"])}var lc=we.version;
78
+ `)}function po(e){let t=[],r=[];e.entries.length===0?t.push("Sitemap must contain at least one URL"):e.entries.length>5e4&&t.push("Sitemap contains more than 50,000 URLs (Google limit)"),e.truncated&&r.push("Sitemap was truncated due to size limits"),e.entries.forEach((o,i)=>{try{new URL(o.loc);}catch{t.push(`Invalid URL at entry ${i+1}: ${o.loc}`);}o.priority!==void 0&&(o.priority<0||o.priority>1)&&t.push(`Invalid priority at entry ${i+1}: must be between 0.0 and 1.0`),o.lastmod&&!ho(o.lastmod)&&t.push(`Invalid lastmod date at entry ${i+1}: ${o.lastmod}`),o.loc.length>2048&&r.push(`URL at entry ${i+1} exceeds 2048 character limit`);});let n=new Map;return e.entries.forEach(o=>{let i=n.get(o.loc)??0;n.set(o.loc,i+1);}),n.forEach((o,i)=>{o>1&&t.push(`Duplicate URL found: ${i} (appears ${o} times)`);}),{valid:t.length===0,errors:t,warnings:r}}function z(e){return e.length===0?new Date().toISOString():e.reduce((r,n)=>{let o=new Date(n.updatedAt);return o>r?o:r},new Date(e[0].updatedAt)).toISOString()}function go(e,t,r=[],n={}){return async function(){let a=(await It(e,t,r,n)).map(u=>({loc:u.url,lastmod:typeof u.lastModified=="string"?u.lastModified:u.lastModified?.toISOString(),changefreq:u.changeFrequency,priority:u.priority})),c={entries:a,totalEntries:a.length,generatedAt:new Date().toISOString(),baseUrl:Ae(n.canonical?.domain??e.domain,n.canonical?.forceHttps??true)},l=Sr(c);return new Response(l,{headers:{"Content-Type":"application/xml","Cache-Control":"public, max-age=3600, s-maxage=3600"}})}}function fo(e){return async function(){let r=[...e.staticRoutes??[],...e.getStaticRoutes?await e.getStaticRoutes():[]],n=await e.getSite(),o=await e.getArticles(),i=e.getAuthors?await e.getAuthors():[];return [...r,...await It(n,o,i,e.options)]}}function Me(e){let t={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;"};return e.replace(/[&<>"']/g,r=>t[r]??r)}function ho(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 we={name:"@xexr/blog-platform",version:"1.1.2"};function Nr(e){let r=e.replace(/^v/,"").split(".");if(r.length<3)throw new Error(`Invalid version format: ${e}`);let n=parseInt(r[0]??"0",10),o=parseInt(r[1]??"0",10),i=parseInt(r[2]?.split("-")[0]??"0",10);if(isNaN(n)||isNaN(o)||isNaN(i))throw new Error(`Invalid version format: ${e}`);return {major:n,minor:o,patch:i}}function J(){let e=Nr(we.version);return {name:we.name,version:we.version,...e}}function ie(e){try{let t=e.split(" "),r={};for(let n of t){let[o,i]=n.split("/");if(!o||!i)continue;let a=Nr(i),c={name:o,version:i,...a};o==="bloggy"?r.bloggyVersion=c:o==="platform"&&(r.platformVersion=c);}return r}catch{return null}}function Tr(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 Rr={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 xo(){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 {...Rr,enableCSP:!e,frameOptions:t??Rr.frameOptions,enableHSTS:!r}}function yo(e){return Object.entries(e).map(([t,r])=>r?`${t} ${r}`:t).join("; ")}function vo(e){return Object.entries(e).map(([t,r])=>`${t}=${r}`).join(", ")}function Po(e,t={}){let r={...xo(),...t},n={};if(r.enableCSP){let o={...r.cspDirectives,...t.cspDirectives??{}};n["Content-Security-Policy"]=yo(o);}if(r.enableFrameOptions&&(n["X-Frame-Options"]=r.frameOptions),r.enableContentTypeOptions&&(n["X-Content-Type-Options"]="nosniff"),r.enableXSSProtection&&(n["X-XSS-Protection"]="1; mode=block"),r.enableReferrerPolicy&&(n["Referrer-Policy"]=r.referrerPolicy),r.enableHSTS&&Ao(e)){let o=[`max-age=${r.hstsMaxAge}`,r.hstsIncludeSubdomains?"includeSubDomains":""].filter(Boolean).join("; ");n["Strict-Transport-Security"]=o;}if(r.enablePermissionsPolicy){let o={...r.permissionsPolicyDirectives,...t.permissionsPolicyDirectives??{}};n["Permissions-Policy"]=vo(o);}return n}function Ao(e){return !!(e.url.startsWith("https://")||e.headers.get("x-forwarded-proto")==="https"||e.headers.get("cf-visitor")?.includes('"scheme":"https"'))}function Qe(e,t={}){return Po(e,{...t,cspDirectives:{...{"default-src":"'none'","frame-ancestors":"'none'","base-uri":"'none'"},...t.cspDirectives??{}}})}var Cr={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 Lr(){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 {...Cr,allowedOrigins:e?e.split(",").map(n=>n.trim()):Cr.allowedOrigins,allowWildcard:t,allowCredentials:r}}function kr(e,t){return e?t.allowWildcard?true:t.allowedOrigins.includes(e):false}function _r(e,t){let r=e.headers.get("origin"),n={};return t.allowWildcard?n["Access-Control-Allow-Origin"]="*":r&&kr(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 wo(e,t,r,n){return {..._r(e,t),"Access-Control-Allow-Methods":r.join(", "),"Access-Control-Allow-Headers":n.join(", "),"Access-Control-Max-Age":t.maxAge.toString()}}var So=["Content-Type","X-Bloggy-Version","X-Idempotency-Key","Authorization","X-Requested-With"];function v(e,t,r={}){let{status:n=200,headers:o={},corsConfig:i={}}=r,a={...Lr(),...i},c=_r(e,a),l=Qe(e,a.securityConfig),u={"Content-Type":"application/json",...c,...l,...o};return server_js.NextResponse.json(t,{status:n,headers:u})}function me(e,t,r={}){let{allowedHeaders:n=So,corsConfig:o={}}=r,i={...Lr(),...o},a=e.headers.get("origin");if(a&&!i.allowWildcard&&!kr(a,i)){let u=Qe(e,i.securityConfig);return new server_js.NextResponse(null,{status:403,headers:{"Content-Type":"text/plain",...u}})}let c=wo(e,i,[...t,"OPTIONS"],n),l=Qe(e,i.securityConfig);return new server_js.NextResponse(null,{status:200,headers:{...c,...l}})}async function No(e){try{let t=await W(e);if(!t.authenticated){let p=await Q(e);return v(e,p.error,{status:401})}let r=F(t.token??"anonymous"),n=await K(r);if(!n.allowed){let p=n.errorResponse.error?.details?.rateLimit,x=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},S=B(x);return v(e,n.errorResponse,{status:429,headers:S})}if(!e.headers.get("content-type")?.includes("application/json"))return v(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 v(e,{success:!1,error:{code:"PUB001",message:"Invalid JSON in request body"},idempotencyKey:""},{status:400})}let a=To(i);if(a.length>0)return v(e,{success:!1,error:{code:"PUB001",message:"Missing required fields",details:{errors:a}},idempotencyKey:i.idempotencyKey??""},{status:400});let c=e.headers.get("X-Bloggy-Version");if(c){let p=ie(c);if(p?.platformVersion){let x=J();if(p.platformVersion.major!==x.major)return v(e,{success:!1,error:{code:"PUB009",message:"Major version incompatibility. Please upgrade your blog platform package.",details:{clientVersion:p.platformVersion.version,serverVersion:x.version}},idempotencyKey:i.idempotencyKey},{status:409})}}if(i.dryRun){let p=[];return i.article.wordCount<50&&p.push("Article has fewer than 50 words, which may affect SEO"),(!i.article.excerpt||i.article.excerpt.length<120)&&p.push("Article excerpt is shorter than recommended 120 characters"),i.article.meta.keywords.length||p.push("No SEO keywords provided"),v(e,{success:!0,warnings:p,idempotencyKey:i.idempotencyKey},{status:200})}let l={...i.article,slug:i.slug??i.article.slug,meta:{...i.article.meta,description:i.metaDescription??i.article.meta.description}};if(!Et(l.slug))return v(e,{success:!1,error:{code:"PUB002",message:"Slug can only contain lowercase letters, numbers, and hyphens"},idempotencyKey:i.idempotencyKey},{status:400});let m=await M().saveArticle(l,i.idempotencyKey),s=J(),f=B(n.rateLimitResult),h={"X-Bloggy-Version":`platform/${s.version}`,"X-Idempotency-Key":i.idempotencyKey,...f};m.success&&(h.Location=m.url??`/${l.slug}`);let g=m.success?201:m.error?.code==="PUB003"?409:400;return v(e,m,{status:g,headers:h})}catch(t){return console.error("Publish endpoint error:",t),v(e,{success:false,error:{code:"PUB007",message:"Internal server error during publishing"},idempotencyKey:""},{status:500})}}function To(e){let t=[];if(!e||typeof e!="object")return t.push("Request body must be a valid object"),t;let r=e;if((!r.article||typeof r.article!="object")&&t.push("Missing required field: article"),(!r.idempotencyKey||typeof r.idempotencyKey!="string")&&t.push("Missing required field: idempotencyKey"),r.article&&typeof r.article=="object"){let n=r.article,o=["id","slug","title","content","publishedAt","site"];for(let i of o)n[i]||t.push(`Missing required article field: ${i}`);if(n.site&&typeof n.site=="object"){let i=n.site,a=["id","name","domain"];for(let c of a)i[c]||t.push(`Missing required site field: ${c}`);}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 Et(e){return !e||typeof e!="string"?false:/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(e)&&e.length>=1&&e.length<=100}async function Co(e){try{let t=await W(e);if(!t.authenticated){let g=await Q(e);return server_js.NextResponse.json(g.error,{status:401})}let r=F(t.token??"anonymous"),n=await K(r);if(!n.allowed){let g=n.errorResponse.error?.details?.rateLimit,p=g&&typeof g=="object"&&"limit"in g&&"remaining"in g&&"reset"in g&&"count"in g&&"success"in g?g:{limit:10,remaining:0,reset:Date.now()+6e4,count:10,success:!1},x=B(p);return v(e,n.errorResponse,{status:429,headers:x})}if(!e.headers.get("content-type")?.includes("application/json"))return v(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 v(e,{success:!1,error:{code:"PUB001",message:"Invalid JSON in request body"},idempotencyKey:""},{status:400})}let a=Lo(i);if(a.length>0)return v(e,{success:!1,error:{code:"PUB001",message:"Missing required fields",details:{errors:a}},idempotencyKey:i.idempotencyKey??""},{status:400});let c=e.headers.get("X-Bloggy-Version");if(c){let g=ie(c);if(g?.platformVersion){let p=J();if(g.platformVersion.major!==p.major)return v(e,{success:!1,error:{code:"PUB009",message:"Major version incompatibility. Please upgrade your blog platform package.",details:{clientVersion:g.platformVersion.version,serverVersion:p.version}},idempotencyKey:i.idempotencyKey},{status:409})}}if(!ko(i.slug))return v(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 p=await M().getArticle(i.slug),x=[];return p||x.push("Article with this slug does not exist"),v(e,{success:!0,warnings:x,idempotencyKey:i.idempotencyKey},{status:200})}let u=await M().removeArticle(i.slug,i.idempotencyKey),m=J(),s=B(n.rateLimitResult),f={"X-Bloggy-Version":`platform/${m.version}`,"X-Idempotency-Key":i.idempotencyKey,...s},h=u.success?200:u.error?.code==="PUB007"?404:400;return v(e,u,{status:h,headers:f})}catch(t){return console.error("Unpublish endpoint error:",t),v(e,{success:false,error:{code:"PUB007",message:"Internal server error during unpublishing"},idempotencyKey:""},{status:500})}}function Lo(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 ko(e){return !e||typeof e!="string"?false:/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(e)&&e.length>=1&&e.length<=100}async function _o(e){try{let t=await W(e);if(!t.authenticated){let s=await Q(e),f={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:s.error?.error?.message??"Authentication required"}};return v(e,f,{status:401})}let r=F(t.token??"anonymous"),n=await K(r);if(!n.allowed){let s=n.errorResponse.error?.details?.rateLimit,f=s&&typeof s=="object"&&"limit"in s&&"remaining"in s&&"reset"in s&&"count"in s&&"success"in s?s:{limit:10,remaining:0,reset:Date.now()+6e4,count:10,success:!1},h=B(f),g={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 v(e,g,{status:429,headers:h})}let o=J(),i=e.headers.get("X-Bloggy-Version"),a={name:"unknown",version:"unknown",major:0,minor:0,patch:0};if(i)try{if(/^\d+\.\d+\.\d+/.test(i)){let s=i.split("."),f=parseInt(s[0]??"0",10),h=parseInt(s[1]??"0",10),g=parseInt(s[2]?.split("-")[0]??"0",10);a={name:"bloggy",version:i,major:f,minor:h,patch:g};}else {let s=ie(i);s?.bloggyVersion&&(a=s.bloggyVersion);}}catch(s){console.warn("Failed to parse X-Bloggy-Version header:",s);}let c={compatible:!0};a.version!=="unknown"&&(c=Tr(a,o));let l={success:!0,versions:{bloggy:a,platform:o},compatibility:c},u=B(n.rateLimitResult),m={"X-Bloggy-Version":`platform/${o.version}`,"Cache-Control":"public, max-age=300, stale-while-revalidate=60",...u};return v(e,l,{status:200,headers:m})}catch(t){console.error("Version endpoint error:",t);let r={success:false,versions:{bloggy:{name:"unknown",version:"unknown",major:0,minor:0,patch:0},platform:{name:"unknown",version:"unknown",major:0,minor:0,patch:0}},compatibility:{compatible:false,errorMessage:"Internal server error while checking version compatibility"},error:t instanceof Error?t.message:"Unknown error"};return v(e,r,{status:500})}}var Io=/^[A-Za-z0-9-]{8,128}$/;async function Bo(e){let t=await W(e);if(!t.authenticated){let l=await Q(e);return v(e,{success:false,error:{code:l.error?.error?.code??"PUB005",message:l.error?.error?.message??"Authentication required"}},{status:401})}let r=F(t.token??"anonymous"),n=await K(r);if(!n.allowed){let l=B({remaining:0,reset:Date.now()+6e4,limit:5});return v(e,{success:false,error:n.errorResponse.error??{code:"PUB011",message:"Rate limit exceeded"}},{status:429,headers:l})}if(!e.headers.get("content-type")?.includes("application/json"))return v(e,Ot("Expected JSON body"),{status:400});let i;try{i=await e.json();}catch{return v(e,Ot("Invalid JSON body"),{status:400})}let a=Oo(i);if(!a.success)return v(e,Ot(a.message),{status:400});let c=[];return a.config.searchSubmission&&(await M().setMetadata("searchSubmission",a.config.searchSubmission),c.push("searchSubmission")),v(e,{success:true,updated:c},{status:200,headers:B(n.rateLimitResult)})}async function Eo(e){return me(e,["POST"],{allowedHeaders:["Content-Type","X-Bloggy-Version","Authorization","X-Requested-With"]})}function Ot(e){return {success:false,error:{code:"PUB001",message:e}}}function Oo(e){if(!e||typeof e!="object"||Array.isArray(e))return {success:false,message:"Request body must be an object"};let t=e,r=new Set(["version","searchSubmission"]),n=Object.keys(t).filter(i=>!r.has(i));if(n.length>0)return {success:false,message:`Unsupported config section: ${n.join(", ")}`};if(t.version!==1)return {success:false,message:"Config version must be 1"};let o={version:1};if(t.searchSubmission!==void 0){let i=Mo(t.searchSubmission);return i.success?{success:true,config:{...o,searchSubmission:i.config}}:i}return {success:false,message:"At least one supported config section is required"}}function Mo(e){if(!e||typeof e!="object"||Array.isArray(e))return {success:false,message:"searchSubmission must be an object"};let t=e,r=new Set(["indexNow"]),n=Object.keys(t).filter(a=>!r.has(a));if(n.length>0)return {success:false,message:`Unsupported searchSubmission section: ${n.join(", ")}`};if(t.indexNow===void 0)return {success:false,message:"searchSubmission.indexNow is required"};let o=t.indexNow;if(!o||typeof o!="object"||Array.isArray(o))return {success:false,message:"searchSubmission.indexNow must be an object"};let i=o;if(typeof i.enabled!="boolean")return {success:false,message:"indexNow.enabled must be a boolean"};if(typeof i.key!="string"||!Io.test(i.key))return {success:false,message:"indexNow.key must be 8 to 128 characters using letters, numbers, or dashes"};if(typeof i.keyLocation!="string")return {success:false,message:"indexNow.keyLocation must be a URL"};try{let a=new URL(i.keyLocation);if(a.protocol!=="https:"&&a.protocol!=="http:")return {success:!1,message:"indexNow.keyLocation must use HTTP or HTTPS"}}catch{return {success:false,message:"indexNow.keyLocation must be a URL"}}return {success:true,config:{indexNow:{enabled:i.enabled,key:i.key,keyLocation:i.keyLocation}}}}async function $o(e){let r=(await M().getMetadata("searchSubmission"))?.indexNow;return !r?.enabled||!r.key?new server_js.NextResponse("Not found",{status:404}):new server_js.NextResponse(r.key,{status:200,headers:{"Content-Type":"text/plain; charset=utf-8","Cache-Control":"public, max-age=300, stale-while-revalidate=60"}})}async function Uo(e,{params:t}){try{let{slug:r}=await t,n=await W(e);if(!n.authenticated){let p=await Q(e);return server_js.NextResponse.json(p.error,{status:401})}let o=F(n.token??"anonymous"),i=await K(o);if(!i.allowed){let p=i.errorResponse.error?.details?.rateLimit||{limit:10,remaining:0,reset:Date.now()+6e4,count:10,success:!1},x=B(p);return v(e,i.errorResponse,{status:429,headers:x})}if(!r||!Et(r))return v(e,{exists:!1,error:{code:"PUB002",message:"Invalid slug format. Must be lowercase letters, numbers, and hyphens only."}},{status:400});let a=e.headers.get("X-Bloggy-Version");if(a){let p=ie(a);if(p?.platformVersion){let x=J();if(p.platformVersion.major!==x.major)return v(e,{exists:!1,error:{code:"PUB009",message:"Major version incompatibility. Please upgrade your blog platform package.",details:{clientVersion:p.platformVersion.version,serverVersion:x.version}}},{status:409})}}let u=await M().getArticle(r)!==null,m={exists:u,...u&&{message:"Slug is already in use. Please choose another (e.g., append '-v2')."}},s=J(),f=B(i.rateLimitResult),h={"X-Bloggy-Version":`platform/${s.version}`,...f},g=e.headers.get("X-Idempotency-Key");return g&&(h["X-Idempotency-Key"]=g,console.log(`Slug check for idempotency: ${g}, exists: ${u}`)),v(e,m,{status:200,headers:h})}catch(r){return console.error("Slug existence check error:",r instanceof Error?r.message:String(r)),v(e,{exists:false,error:{code:"PUB007",message:"Internal server error during slug check"}},{status:500})}}async function Ho(e){return me(e,["GET"])}var lc=we.version;
79
79
  exports.ApiKeyAuth=Xe;exports.BLOG_PLATFORM_SCHEMA_VERSION=kt;exports.BLOG_PLATFORM_TABLE_NAMES=Ee;exports.BlogArticlePage=sr;exports.BlogAuthorPage=ur;exports.BlogAuthorsIndexPage=_i;exports.BlogHomePage=qt;exports.BlogPlatformSchemaError=Oe;exports.BlogTopicArchivePage=Ci;exports.BlogTopicsIndexPage=Ri;exports.Button=Dr;exports.Card=Ce;exports.CardContent=Le;exports.CardDescription=Pn;exports.CardFooter=An;exports.CardHeader=yn;exports.CardTitle=vn;exports.DrizzleStorage=Nt;exports.EnvAuth=ve;exports.InMemoryStorage=Ve;exports.NEWSLETTER_SUCCESS_MESSAGE=Fe;exports.NewsletterSignup=Te;exports.NoAuth=Be;exports.PACKAGE_VERSION=lc;exports.Pagination=ge;exports.PaginationContent=tt;exports.PaginationEllipsis=De;exports.PaginationItem=Z;exports.PaginationLink=oe;exports.PaginationNext=nt;exports.PaginationPrevious=rt;exports.ShadcnPagination=et;exports.StructuredDataError=Ne;exports.UninitializedAuth=We;exports.autoConfigureRateLimit=St;exports.blogPlatformDrizzleSchema=Wi;exports.bpArticles=T;exports.bpMetadata=ne;exports.bpOperations=ue;exports.buildAuthorPath=_;exports.buildBlogPath=N;exports.buttonVariants=$e;exports.checkDrizzleAdapterSchema=vr;exports.checkRateLimit=fr;exports.cn=b;exports.configHandler=Bo;exports.configOptionsHandler=Eo;exports.configureRateLimit=Je;exports.createBlogSitemapRoute=go;exports.createDynamicBlogSitemap=fo;exports.createRateLimitErrorResponse=hr;exports.createStructuredDataScript=ae;exports.createTokenFingerprint=F;exports.enforceRateLimit=K;exports.ensureDrizzleAdapterSchema=Zi;exports.extractKeywordsFromArticle=Wr;exports.extractTableOfContents=ut;exports.extractTokenFromHeader=At;exports.formatArticleDateMeta=ct;exports.generateArticleMetadata=ui;exports.generateArticleStructuredData=Ue;exports.generateAuthorPageMetadata=vi;exports.generateAuthorStructuredData=He;exports.generateBlogHomeMetadata=fn;exports.generateBlogHomeStructuredData=lt;exports.generateBlogSitemapEntries=It;exports.generateBreadcrumbStructuredData=$t;exports.generateCanonicalUrl=de;exports.generateCanonicalUrlFromSlug=ro;exports.generateCompleteArticleStructuredData=st;exports.generateOrganizationStructuredData=ot;exports.generatePaginationMetadata=qr;exports.generateSiteMetadata=ao;exports.generateSitemap=uo;exports.generateSitemapIndex=mo;exports.generateWebSiteStructuredData=at;exports.getAllTopics=ye;exports.getArticlePrimaryTopic=Si;exports.getAuthConfig=wt;exports.getAuthorArchive=dr;exports.getAuthorsFromArticles=xe;exports.getBaseUrl=io;exports.getBlogThemeStyle=j;exports.getDrizzleAdapterSql=to;exports.getPathPrefixFromBlogUrl=Xr;exports.getRateLimitHeaders=B;exports.getRelatedFeaturedArticles=bt;exports.getStorage=M;exports.getTopicArchive=Pt;exports.indexNowKeyRoute=$o;exports.initBlogPlatform=Ye;exports.initBlogPlatformDev=Gi;exports.initBlogPlatformOnce=Fi;exports.initBlogPlatformProd=zi;exports.initEnvAuth=Mi;exports.isValidCanonicalUrl=no;exports.loadAuthorArchive=wi;exports.metadataToHtml=lo;exports.normalizeBlogBasePath=E;exports.normalizeDomain=Ae;exports.normalizeSlug=wr;exports.publishHandler=No;exports.safeGenerateArticleStructuredData=Kr;exports.setAuthConfig=Ke;exports.setStorage=vt;exports.shouldSkipAuth=Di;exports.sitemapToXml=Sr;exports.slugExistsHandler=Uo;exports.slugExistsOptionsHandler=Ho;exports.structuredDataToJsonLd=Ut;exports.unpublishHandler=Co;exports.updateArticleCanonicalUrl=oo;exports.usePagination=Vr;exports.validateMetadata=co;exports.validateSitemap=po;exports.validateStructuredData=Dt;exports.versionHandler=_o;//# sourceMappingURL=index.js.map
80
80
  //# sourceMappingURL=index.js.map