@xexr/blog-platform 1.0.12 → 1.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -9,6 +9,8 @@ import { ClassValue } from 'clsx';
9
9
  import { NextRequest, NextResponse } from 'next/server';
10
10
  import * as drizzle_orm_sqlite_core from 'drizzle-orm/sqlite-core';
11
11
  import { LibSQLDatabase } from 'drizzle-orm/libsql';
12
+ import { C as CanonicalUrlOptions } from './sitemap-Dz9DB7py.mjs';
13
+ export { B as BlogSitemapConfig, N as NextjsSitemapEntry, S as SitemapChangeFreq, a as SitemapData, b as SitemapEntry, c as SitemapOptions, d as createBlogSitemapRoute, e as createDynamicBlogSitemap, g as generateBlogSitemapEntries, f as generateCanonicalUrl, h as generateCanonicalUrlFromSlug, i as generateSitemap, j as generateSitemapIndex, k as getBaseUrl, l as isValidCanonicalUrl, n as normalizeDomain, m as normalizeSlug, s as sitemapToXml, u as updateArticleCanonicalUrl, v as validateSitemap } from './sitemap-Dz9DB7py.mjs';
12
14
 
13
15
  interface BlogTheme {
14
16
  accentColor?: string;
@@ -1151,140 +1153,6 @@ declare function getDrizzleAdapterSql(): {
1151
1153
  createOperations: string;
1152
1154
  };
1153
1155
 
1154
- /**
1155
- * SEO utilities for canonical URL generation and validation.
1156
- *
1157
- * These utilities ensure proper canonical URL structure for SEO optimization,
1158
- * preventing duplicate content issues and improving search engine indexing.
1159
- */
1160
-
1161
- /**
1162
- * Configuration options for canonical URL generation.
1163
- */
1164
- interface CanonicalUrlOptions {
1165
- /** Whether to force HTTPS protocol (default: true) */
1166
- forceHttps?: boolean;
1167
- /** Whether to remove trailing slashes (default: true) */
1168
- removeTrailingSlash?: boolean;
1169
- /** Custom domain override (uses site.domain if not provided) */
1170
- domain?: string;
1171
- /** Custom path prefix (default: '/blog') */
1172
- pathPrefix?: string;
1173
- }
1174
- /**
1175
- * Normalizes a domain by ensuring proper protocol and removing trailing slashes.
1176
- *
1177
- * @param domain - The domain to normalize
1178
- * @param forceHttps - Whether to force HTTPS protocol
1179
- * @returns The normalized domain
1180
- *
1181
- * @example
1182
- * ```typescript
1183
- * normalizeDomain('example.com') // 'https://example.com'
1184
- * normalizeDomain('http://example.com/') // 'https://example.com'
1185
- * normalizeDomain('https://example.com', false) // 'https://example.com'
1186
- * ```
1187
- */
1188
- declare function normalizeDomain(domain: string, forceHttps?: boolean): string;
1189
- /**
1190
- * Validates and normalizes a slug for URL usage.
1191
- *
1192
- * @param slug - The slug to validate and normalize
1193
- * @returns The normalized slug
1194
- * @throws Error if slug is invalid
1195
- *
1196
- * @example
1197
- * ```typescript
1198
- * normalizeSlug('hello-world') // 'hello-world'
1199
- * normalizeSlug('Hello World!') // throws Error
1200
- * normalizeSlug('hello--world') // 'hello-world'
1201
- * ```
1202
- */
1203
- declare function normalizeSlug(slug: string): string;
1204
- /**
1205
- * Generates a canonical URL for an article.
1206
- *
1207
- * @param article - The published article
1208
- * @param options - Configuration options for URL generation
1209
- * @returns The canonical URL
1210
- * @throws Error if article or site data is invalid
1211
- *
1212
- * @example
1213
- * ```typescript
1214
- * const article = {
1215
- * slug: 'hello-world',
1216
- * site: { domain: 'example.com' },
1217
- * // ... other fields
1218
- * };
1219
- *
1220
- * generateCanonicalUrl(article)
1221
- * // 'https://example.com/blog/hello-world'
1222
- *
1223
- * generateCanonicalUrl(article, { pathPrefix: '/posts' })
1224
- * // 'https://example.com/posts/hello-world'
1225
- * ```
1226
- */
1227
- declare function generateCanonicalUrl(article: PublishedArticle, options?: CanonicalUrlOptions): string;
1228
- /**
1229
- * Generates a canonical URL for an article from site and slug data.
1230
- * Useful when you don't have a full PublishedArticle object.
1231
- *
1232
- * @param site - The published site
1233
- * @param slug - The article slug
1234
- * @param options - Configuration options for URL generation
1235
- * @returns The canonical URL
1236
- *
1237
- * @example
1238
- * ```typescript
1239
- * const site = { domain: 'example.com', ... };
1240
- * generateCanonicalUrlFromSlug(site, 'hello-world')
1241
- * // 'https://example.com/blog/hello-world'
1242
- * ```
1243
- */
1244
- declare function generateCanonicalUrlFromSlug(site: PublishedSite, slug: string, options?: CanonicalUrlOptions): string;
1245
- /**
1246
- * Validates if a URL is a valid canonical URL format.
1247
- *
1248
- * @param url - The URL to validate
1249
- * @returns True if the URL is valid for canonical use
1250
- *
1251
- * @example
1252
- * ```typescript
1253
- * isValidCanonicalUrl('https://example.com/blog/hello-world') // true
1254
- * isValidCanonicalUrl('http://example.com/blog/hello-world') // true
1255
- * isValidCanonicalUrl('example.com/blog/hello-world') // false (missing protocol)
1256
- * isValidCanonicalUrl('https://example.com/blog/hello world') // false (spaces)
1257
- * ```
1258
- */
1259
- declare function isValidCanonicalUrl(url: string): boolean;
1260
- /**
1261
- * Extracts the base URL (protocol + hostname + port) from a canonical URL.
1262
- *
1263
- * @param canonicalUrl - The canonical URL
1264
- * @returns The base URL
1265
- *
1266
- * @example
1267
- * ```typescript
1268
- * getBaseUrl('https://example.com/blog/hello-world') // 'https://example.com'
1269
- * getBaseUrl('https://blog.example.com:8080/posts/test') // 'https://blog.example.com:8080'
1270
- * ```
1271
- */
1272
- declare function getBaseUrl(canonicalUrl: string): string;
1273
- /**
1274
- * Updates an article's canonical URL in its meta field.
1275
- *
1276
- * @param article - The article to update
1277
- * @param options - Configuration options for URL generation
1278
- * @returns A new article object with updated canonical URL
1279
- *
1280
- * @example
1281
- * ```typescript
1282
- * const updatedArticle = updateArticleCanonicalUrl(article);
1283
- * console.log(updatedArticle.meta.canonicalUrl); // Generated canonical URL
1284
- * ```
1285
- */
1286
- declare function updateArticleCanonicalUrl(article: PublishedArticle, options?: CanonicalUrlOptions): PublishedArticle;
1287
-
1288
1156
  /**
1289
1157
  * Metadata generation utilities for SEO meta tags, OpenGraph, and Twitter Cards.
1290
1158
  *
@@ -1430,281 +1298,6 @@ declare function validateMetadata(metadata: GeneratedMetadata): {
1430
1298
  warnings: string[];
1431
1299
  };
1432
1300
 
1433
- /**
1434
- * Next.js-compatible sitemap generation utilities for blog platform integration.
1435
- *
1436
- * These utilities generate sitemap entries that follow Next.js MetadataRoute.Sitemap
1437
- * conventions, allowing seamless integration with existing Next.js applications.
1438
- *
1439
- * @example Integration with existing Next.js sitemap:
1440
- * ```typescript
1441
- * // app/sitemap.ts
1442
- * import { generateBlogSitemapEntries } from '@xexr/blog-platform';
1443
- * import type { MetadataRoute } from 'next';
1444
- *
1445
- * export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
1446
- * // Your existing routes
1447
- * const staticRoutes = [
1448
- * { url: 'https://yoursite.com', lastModified: new Date(), priority: 1 },
1449
- * { url: 'https://yoursite.com/about', lastModified: new Date(), priority: 0.8 }
1450
- * ];
1451
- *
1452
- * // Blog platform entries
1453
- * const blogEntries = await generateBlogSitemapEntries(blogConfig);
1454
- *
1455
- * return [...staticRoutes, ...blogEntries];
1456
- * }
1457
- * ```
1458
- */
1459
-
1460
- /**
1461
- * Configuration options for sitemap generation.
1462
- */
1463
- interface SitemapOptions {
1464
- /** Canonical URL configuration */
1465
- canonical?: CanonicalUrlOptions;
1466
- /** Whether to include author pages in sitemap */
1467
- includeAuthorPages?: boolean;
1468
- /** Whether to include pagination pages in sitemap */
1469
- includePaginationPages?: boolean;
1470
- /** Number of articles per page for pagination calculation */
1471
- articlesPerPage?: number;
1472
- /** Maximum number of sitemap entries (defaults to 50,000 per Google guidelines) */
1473
- maxEntries?: number;
1474
- /** Change frequency for different page types */
1475
- changeFrequency?: {
1476
- /** Change frequency for blog home page */
1477
- homePage?: SitemapChangeFreq;
1478
- /** Change frequency for article pages */
1479
- articles?: SitemapChangeFreq;
1480
- /** Change frequency for author pages */
1481
- authorPages?: SitemapChangeFreq;
1482
- /** Change frequency for pagination pages */
1483
- paginationPages?: SitemapChangeFreq;
1484
- };
1485
- /** Priority values for different page types */
1486
- priority?: {
1487
- /** Priority for blog home page (0.0-1.0) */
1488
- homePage?: number;
1489
- /** Priority for article pages (0.0-1.0) */
1490
- articles?: number;
1491
- /** Priority for author pages (0.0-1.0) */
1492
- authorPages?: number;
1493
- /** Priority for pagination pages (0.0-1.0) */
1494
- paginationPages?: number;
1495
- };
1496
- }
1497
- /**
1498
- * Valid sitemap change frequency values as per XML sitemap standard.
1499
- */
1500
- type SitemapChangeFreq = "always" | "hourly" | "daily" | "weekly" | "monthly" | "yearly" | "never";
1501
- /**
1502
- * Next.js MetadataRoute.Sitemap compatible entry.
1503
- * This matches the expected format for Next.js sitemap generation.
1504
- */
1505
- interface NextjsSitemapEntry {
1506
- /** The URL of the page */
1507
- url: string;
1508
- /** Last modification date */
1509
- lastModified?: string | Date;
1510
- /** Change frequency hint for search engines */
1511
- changeFrequency?: SitemapChangeFreq;
1512
- /** Priority relative to other URLs on the site (0.0-1.0) */
1513
- priority?: number;
1514
- /** Alternate language versions (for i18n) */
1515
- alternates?: {
1516
- languages?: Record<string, string>;
1517
- };
1518
- }
1519
- /**
1520
- * Legacy XML sitemap entry format (for backward compatibility).
1521
- * @deprecated Use NextjsSitemapEntry for new implementations
1522
- */
1523
- interface SitemapEntry {
1524
- /** The URL of the page */
1525
- loc: string;
1526
- /** Last modification date as ISO 8601 string */
1527
- lastmod?: string;
1528
- /** Change frequency hint for search engines */
1529
- changefreq?: SitemapChangeFreq;
1530
- /** Priority relative to other URLs on the site (0.0-1.0) */
1531
- priority?: number;
1532
- }
1533
- /**
1534
- * Complete sitemap data structure.
1535
- */
1536
- interface SitemapData {
1537
- /** All URL entries in the sitemap */
1538
- entries: SitemapEntry[];
1539
- /** Total number of entries */
1540
- totalEntries: number;
1541
- /** Whether the sitemap was truncated due to size limits */
1542
- truncated: boolean;
1543
- /** Generation timestamp */
1544
- generatedAt: string;
1545
- /** Base URL used for canonical URL generation */
1546
- baseUrl: string;
1547
- }
1548
- /**
1549
- * Generates Next.js-compatible sitemap entries for blog platform integration.
1550
- *
1551
- * @param site - The published site information
1552
- * @param articles - Array of published articles
1553
- * @param authors - Array of published authors (optional)
1554
- * @param options - Sitemap generation options
1555
- * @returns Array of Next.js MetadataRoute.Sitemap compatible entries
1556
- *
1557
- * @example
1558
- * ```typescript
1559
- * // In your Next.js app/sitemap.ts file:
1560
- * import { generateBlogSitemapEntries } from '@xexr/blog-platform';
1561
- * import type { MetadataRoute } from 'next';
1562
- *
1563
- * export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
1564
- * const blogEntries = await generateBlogSitemapEntries(site, articles, authors, {
1565
- * includeAuthorPages: true,
1566
- * includePaginationPages: true,
1567
- * changeFrequency: { articles: 'monthly' }
1568
- * });
1569
- *
1570
- * return [
1571
- * // Your existing site routes
1572
- * { url: 'https://yoursite.com', lastModified: new Date(), priority: 1 },
1573
- * { url: 'https://yoursite.com/about', lastModified: new Date() },
1574
- * // Blog entries
1575
- * ...blogEntries
1576
- * ];
1577
- * }
1578
- * ```
1579
- */
1580
- declare function generateBlogSitemapEntries(site: PublishedSite, articles: readonly PublishedArticle[], authors?: readonly PublishedAuthor[], options?: SitemapOptions): Promise<NextjsSitemapEntry[]>;
1581
- /**
1582
- * Legacy sitemap generation for backward compatibility.
1583
- * @deprecated Use generateBlogSitemapEntries for Next.js integration
1584
- *
1585
- * @param site - The published site information
1586
- * @param articles - Array of published articles
1587
- * @param authors - Array of published authors (optional)
1588
- * @param options - Sitemap generation options
1589
- * @returns Complete sitemap data
1590
- */
1591
- declare function generateSitemap(site: PublishedSite, articles: readonly PublishedArticle[], authors?: readonly PublishedAuthor[], options?: SitemapOptions): SitemapData;
1592
- /**
1593
- * Converts sitemap data to XML format.
1594
- *
1595
- * @param sitemapData - The sitemap data to convert
1596
- * @returns XML string in sitemap format
1597
- *
1598
- * @example
1599
- * ```typescript
1600
- * const sitemap = generateSitemap(site, articles);
1601
- * const xmlString = sitemapToXml(sitemap);
1602
- * // Use in API route response
1603
- * ```
1604
- */
1605
- declare function sitemapToXml(sitemapData: SitemapData): string;
1606
- /**
1607
- * Generates a sitemap index for large blogs that need multiple sitemaps.
1608
- *
1609
- * @param sitemaps - Array of sitemap information
1610
- * @param baseUrl - Base URL for the site
1611
- * @returns XML string for sitemap index
1612
- *
1613
- * @example
1614
- * ```typescript
1615
- * const sitemapIndex = generateSitemapIndex([
1616
- * { url: 'https://example.com/sitemap-articles.xml', lastmod: '2023-01-01T00:00:00Z' },
1617
- * { url: 'https://example.com/sitemap-authors.xml', lastmod: '2023-01-01T00:00:00Z' }
1618
- * ], 'https://example.com');
1619
- * ```
1620
- */
1621
- declare function generateSitemapIndex(sitemaps: readonly {
1622
- url: string;
1623
- lastmod?: string;
1624
- }[], _baseUrl: string): string;
1625
- /**
1626
- * Validates sitemap data for compliance with search engine guidelines.
1627
- *
1628
- * @param sitemapData - The sitemap data to validate
1629
- * @returns Validation results with errors and warnings
1630
- *
1631
- * @example
1632
- * ```typescript
1633
- * const sitemap = generateSitemap(site, articles);
1634
- * const validation = validateSitemap(sitemap);
1635
- *
1636
- * if (validation.errors.length > 0) {
1637
- * console.error('Sitemap errors:', validation.errors);
1638
- * }
1639
- * ```
1640
- */
1641
- declare function validateSitemap(sitemapData: SitemapData): {
1642
- valid: boolean;
1643
- errors: string[];
1644
- warnings: string[];
1645
- };
1646
- /**
1647
- * Creates a separate sitemap specifically for blog content.
1648
- * Useful for large sites that need to split sitemaps by content type.
1649
- *
1650
- * @param site - The published site information
1651
- * @param articles - Array of published articles
1652
- * @param authors - Array of published authors (optional)
1653
- * @param options - Sitemap generation options
1654
- * @returns Next.js sitemap function
1655
- *
1656
- * @example
1657
- * ```typescript
1658
- * // app/blog-sitemap/route.ts - separate blog sitemap endpoint
1659
- * import { createBlogSitemapRoute } from '@xexr/blog-platform';
1660
- *
1661
- * export const GET = createBlogSitemapRoute(site, articles, authors, {
1662
- * includeAuthorPages: true,
1663
- * articlesPerPage: 20
1664
- * });
1665
- * ```
1666
- */
1667
- declare function createBlogSitemapRoute(site: PublishedSite, articles: readonly PublishedArticle[], authors?: readonly PublishedAuthor[], options?: SitemapOptions): () => Promise<Response>;
1668
- /**
1669
- * Configuration interface for blog data fetching.
1670
- * Used to fetch blog data for sitemap generation.
1671
- */
1672
- interface BlogSitemapConfig {
1673
- /** Function to fetch site data */
1674
- getSite: () => Promise<PublishedSite>;
1675
- /** Function to fetch published articles */
1676
- getArticles: () => Promise<readonly PublishedArticle[]>;
1677
- /** Function to fetch authors (optional) */
1678
- getAuthors?: () => Promise<readonly PublishedAuthor[]>;
1679
- /** Sitemap generation options */
1680
- options?: SitemapOptions;
1681
- }
1682
- /**
1683
- * Higher-order function that creates a Next.js sitemap function with data fetching.
1684
- * Ideal for dynamic blog content that needs to be fetched at sitemap generation time.
1685
- *
1686
- * @param config - Configuration for fetching blog data
1687
- * @returns Next.js sitemap function
1688
- *
1689
- * @example
1690
- * ```typescript
1691
- * // app/sitemap.ts
1692
- * import { createDynamicBlogSitemap } from '@xexr/blog-platform';
1693
- * import { getBlogData } from './lib/blog';
1694
- *
1695
- * export default createDynamicBlogSitemap({
1696
- * getSite: () => getBlogData().site,
1697
- * getArticles: () => getBlogData().articles,
1698
- * getAuthors: () => getBlogData().authors,
1699
- * options: {
1700
- * includeAuthorPages: true,
1701
- * changeFrequency: { articles: 'weekly' }
1702
- * }
1703
- * });
1704
- * ```
1705
- */
1706
- declare function createDynamicBlogSitemap(config: BlogSitemapConfig): () => Promise<NextjsSitemapEntry[]>;
1707
-
1708
1301
  /**
1709
1302
  * Structured Data (JSON-LD) utilities for SEO optimization
1710
1303
  *
@@ -2013,4 +1606,4 @@ declare function OPTIONS(request: NextRequest): Promise<NextResponse>;
2013
1606
 
2014
1607
  declare const PACKAGE_VERSION: string;
2015
1608
 
2016
- export { ApiKeyAuth, type AuthConfig, type AuthResult, type AuthorArchive, type AuthorArchiveOptions, ArticlePage as BlogArticlePage, AuthorPage as BlogAuthorPage, BlogAuthorsIndexPage, BlogHomePage, type BlogPlatformConfig, type BlogPlatformStorage, type BlogPostingSchema, type BlogSitemapConfig, type BlogTheme, BlogTopicArchivePage, BlogTopicsIndexPage, type BreadcrumbListSchema, Button, type CanonicalUrlOptions, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, DrizzleStorage, EnvAuth, type GeneratedMetadata, InMemoryStorage, type LinkTag, type MetaTag, type MetadataOptions, NEWSLETTER_SUCCESS_MESSAGE, NewsletterSignup, type NewsletterSignupProps, type NextjsSitemapEntry, NoAuth, type OrganizationSchema, PACKAGE_VERSION, Pagination$1 as Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, type PersonSchema, PublishResult, PublishedArticle, PublishedAuthor, PublishedNewsletterSettings, PublishedSite, PublishedTopic, type RateLimitConfig, type RateLimitResult, Pagination as ShadcnPagination, type SitemapChangeFreq, type SitemapData, type SitemapEntry, type SitemapOptions, StructuredDataError, type StructuredDataOptions, type TopicArchive, UninitializedAuth, type WebSiteSchema, autoConfigureRateLimit, bpArticles, bpOperations, buildAuthorPath, buildBlogPath, buttonVariants, checkRateLimit, cn, configureRateLimit, createBlogSitemapRoute, createDynamicBlogSitemap, createRateLimitErrorResponse, createStructuredDataScript, createTokenFingerprint, enforceRateLimit, extractKeywordsFromArticle, extractTableOfContents, extractTokenFromHeader, formatArticleDateMeta, generateArticleMetadata, generateArticleStructuredData, generateAuthorPageMetadata, generateAuthorStructuredData, generateBlogHomeMetadata, generateBlogHomeStructuredData, generateBlogSitemapEntries, generateBreadcrumbStructuredData, generateCanonicalUrl, generateCanonicalUrlFromSlug, generateCompleteArticleStructuredData, generateOrganizationStructuredData, generatePaginationMetadata, generateSiteMetadata, generateSitemap, generateSitemapIndex, generateWebSiteStructuredData, getAllTopics, getArticlePrimaryTopic, getAuthConfig, getAuthorArchive, getAuthorsFromArticles, getBaseUrl, getBlogThemeStyle, getDrizzleAdapterSql, getPathPrefixFromBlogUrl, getRateLimitHeaders, getStorage, getTopicArchive, initBlogPlatform, initBlogPlatformDev, initBlogPlatformOnce, initBlogPlatformProd, initEnvAuth, isValidCanonicalUrl, loadAuthorArchive, metadataToHtml, normalizeBlogBasePath, normalizeDomain, normalizeSlug, POST$1 as publishHandler, safeGenerateArticleStructuredData, setAuthConfig, setStorage, shouldSkipAuth, sitemapToXml, GET as slugExistsHandler, OPTIONS as slugExistsOptionsHandler, structuredDataToJsonLd, POST as unpublishHandler, updateArticleCanonicalUrl, usePagination, validateMetadata, validateSitemap, validateStructuredData, GET$1 as versionHandler };
1609
+ export { ApiKeyAuth, type AuthConfig, type AuthResult, type AuthorArchive, type AuthorArchiveOptions, ArticlePage as BlogArticlePage, AuthorPage as BlogAuthorPage, BlogAuthorsIndexPage, BlogHomePage, type BlogPlatformConfig, type BlogPlatformStorage, type BlogPostingSchema, type BlogTheme, BlogTopicArchivePage, BlogTopicsIndexPage, type BreadcrumbListSchema, Button, CanonicalUrlOptions, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, DrizzleStorage, EnvAuth, type GeneratedMetadata, InMemoryStorage, type LinkTag, type MetaTag, type MetadataOptions, NEWSLETTER_SUCCESS_MESSAGE, NewsletterSignup, type NewsletterSignupProps, NoAuth, type OrganizationSchema, PACKAGE_VERSION, Pagination$1 as Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, type PersonSchema, PublishResult, PublishedArticle, PublishedAuthor, PublishedNewsletterSettings, PublishedSite, PublishedTopic, type RateLimitConfig, type RateLimitResult, Pagination as ShadcnPagination, StructuredDataError, type StructuredDataOptions, type TopicArchive, UninitializedAuth, type WebSiteSchema, autoConfigureRateLimit, bpArticles, bpOperations, buildAuthorPath, buildBlogPath, buttonVariants, checkRateLimit, cn, configureRateLimit, createRateLimitErrorResponse, createStructuredDataScript, createTokenFingerprint, enforceRateLimit, extractKeywordsFromArticle, extractTableOfContents, extractTokenFromHeader, formatArticleDateMeta, generateArticleMetadata, generateArticleStructuredData, generateAuthorPageMetadata, generateAuthorStructuredData, generateBlogHomeMetadata, generateBlogHomeStructuredData, generateBreadcrumbStructuredData, generateCompleteArticleStructuredData, generateOrganizationStructuredData, generatePaginationMetadata, generateSiteMetadata, generateWebSiteStructuredData, getAllTopics, getArticlePrimaryTopic, getAuthConfig, getAuthorArchive, getAuthorsFromArticles, getBlogThemeStyle, getDrizzleAdapterSql, getPathPrefixFromBlogUrl, getRateLimitHeaders, getStorage, getTopicArchive, initBlogPlatform, initBlogPlatformDev, initBlogPlatformOnce, initBlogPlatformProd, initEnvAuth, loadAuthorArchive, metadataToHtml, normalizeBlogBasePath, POST$1 as publishHandler, safeGenerateArticleStructuredData, setAuthConfig, setStorage, shouldSkipAuth, GET as slugExistsHandler, OPTIONS as slugExistsOptionsHandler, structuredDataToJsonLd, POST as unpublishHandler, usePagination, validateMetadata, validateStructuredData, GET$1 as versionHandler };