@xexr/blog-platform 1.1.3 → 1.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist/app/blog/[slug]/page.tsx +11 -4
  2. package/dist/app/blog/authors/[slug]/page.tsx +1 -1
  3. package/dist/app/blog/page.test.ts +20 -0
  4. package/dist/app/blog/page.tsx +14 -13
  5. package/dist/app/blog/series/[slug]/page.d.ts +28 -0
  6. package/dist/app/blog/series/[slug]/page.tsx +39 -0
  7. package/dist/app/blog/series/page.d.ts +24 -0
  8. package/dist/app/blog/series/page.tsx +28 -0
  9. package/dist/components/SeriesArchivePages.tsx +212 -0
  10. package/dist/components/SeriesNavigation.tsx +117 -0
  11. package/dist/components/TopicArchivePages.test.ts +22 -0
  12. package/dist/components/TopicArchivePages.tsx +1 -1
  13. package/dist/{index-Dr8HaKGm.d.mts → index-CKWrb9a4.d.mts} +43 -1
  14. package/dist/{index-Dr8HaKGm.d.ts → index-CKWrb9a4.d.ts} +43 -1
  15. package/dist/index.d.mts +85 -5
  16. package/dist/index.d.ts +85 -5
  17. package/dist/index.js +12 -12
  18. package/dist/index.js.map +1 -1
  19. package/dist/index.mjs +12 -12
  20. package/dist/index.mjs.map +1 -1
  21. package/dist/lib/related-articles.d.mts +1 -1
  22. package/dist/lib/related-articles.d.ts +1 -1
  23. package/dist/lib/series.ts +55 -0
  24. package/dist/lib/sitemap.ts +76 -4
  25. package/dist/lib/storage/drizzle.ts +9 -0
  26. package/dist/lib/urls.ts +7 -0
  27. package/dist/{sitemap-BmCh8BpN.d.ts → sitemap-BDT3d496.d.ts} +7 -1
  28. package/dist/{sitemap-Dbl4CUGI.d.mts → sitemap-D3rS0iAF.d.mts} +7 -1
  29. package/dist/sitemap.d.mts +2 -2
  30. package/dist/sitemap.d.ts +2 -2
  31. package/dist/sitemap.js +5 -5
  32. package/dist/sitemap.js.map +1 -1
  33. package/dist/sitemap.mjs +5 -5
  34. package/dist/sitemap.mjs.map +1 -1
  35. package/dist/types/contracts.ts +58 -0
  36. package/dist/types/index.d.mts +1 -1
  37. package/dist/types/index.d.ts +1 -1
  38. package/package.json +1 -1
@@ -122,6 +122,46 @@ interface PublishedTopic {
122
122
  /** Whether this is the article's primary topic */
123
123
  readonly isPrimary: boolean;
124
124
  }
125
+ /**
126
+ * Compact link metadata for an article within a published series.
127
+ */
128
+ interface PublishedSeriesArticleLink {
129
+ /** Unique article identifier */
130
+ readonly id: string;
131
+ /** URL-friendly article slug */
132
+ readonly slug: string;
133
+ /** Display title */
134
+ readonly title: string;
135
+ /** Ordered position within the series */
136
+ readonly position: number;
137
+ /** Whether this entry is the current article */
138
+ readonly isCurrent: boolean;
139
+ /** Optional excerpt for archive/list rendering */
140
+ readonly excerpt?: string;
141
+ }
142
+ /**
143
+ * Reader-facing series context for a published article.
144
+ */
145
+ interface PublishedSeriesContext {
146
+ /** Unique series identifier */
147
+ readonly id: string;
148
+ /** Display title */
149
+ readonly title: string;
150
+ /** URL-friendly series slug */
151
+ readonly slug: string;
152
+ /** Optional public description */
153
+ readonly description?: string;
154
+ /** Current article position in the series */
155
+ readonly position: number;
156
+ /** Number of visible articles in the series context */
157
+ readonly total: number;
158
+ /** Previous published article in the series, when available */
159
+ readonly previous?: PublishedSeriesArticleLink;
160
+ /** Next published article in the series, when available */
161
+ readonly next?: PublishedSeriesArticleLink;
162
+ /** Ordered article list for compact navigation and archive pages */
163
+ readonly articles: readonly PublishedSeriesArticleLink[];
164
+ }
125
165
  /**
126
166
  * Represents a published article with all necessary metadata for rendering
127
167
  * on external blog platforms.
@@ -153,6 +193,8 @@ interface PublishedArticle {
153
193
  readonly cta?: PublishedArticleCta;
154
194
  /** Public topic taxonomy assigned to the article */
155
195
  readonly topics?: readonly PublishedTopic[];
196
+ /** Optional ordered series context for article navigation */
197
+ readonly series?: PublishedSeriesContext;
156
198
  /** Featured image URL (optional) */
157
199
  readonly featuredImage?: string;
158
200
  /** Alt text for featured image */
@@ -226,4 +268,4 @@ interface PublishResult {
226
268
  readonly idempotencyKey: string;
227
269
  }
228
270
 
229
- export type { PublishedTopic as P, PublishedArticle as a, PublishedSite as b, PublishedAuthor as c, PublishedNewsletterSettings as d, PublishedArticleCta as e, PublishResult as f, PublishPayload as g, PublishedAuthorSocialLinks as h };
271
+ export type { PublishedTopic as P, PublishedArticle as a, PublishedSite as b, PublishedAuthor as c, PublishedNewsletterSettings as d, PublishedArticleCta as e, PublishResult as f, PublishedSeriesContext as g, PublishPayload as h, PublishedAuthorSocialLinks as i };
@@ -122,6 +122,46 @@ interface PublishedTopic {
122
122
  /** Whether this is the article's primary topic */
123
123
  readonly isPrimary: boolean;
124
124
  }
125
+ /**
126
+ * Compact link metadata for an article within a published series.
127
+ */
128
+ interface PublishedSeriesArticleLink {
129
+ /** Unique article identifier */
130
+ readonly id: string;
131
+ /** URL-friendly article slug */
132
+ readonly slug: string;
133
+ /** Display title */
134
+ readonly title: string;
135
+ /** Ordered position within the series */
136
+ readonly position: number;
137
+ /** Whether this entry is the current article */
138
+ readonly isCurrent: boolean;
139
+ /** Optional excerpt for archive/list rendering */
140
+ readonly excerpt?: string;
141
+ }
142
+ /**
143
+ * Reader-facing series context for a published article.
144
+ */
145
+ interface PublishedSeriesContext {
146
+ /** Unique series identifier */
147
+ readonly id: string;
148
+ /** Display title */
149
+ readonly title: string;
150
+ /** URL-friendly series slug */
151
+ readonly slug: string;
152
+ /** Optional public description */
153
+ readonly description?: string;
154
+ /** Current article position in the series */
155
+ readonly position: number;
156
+ /** Number of visible articles in the series context */
157
+ readonly total: number;
158
+ /** Previous published article in the series, when available */
159
+ readonly previous?: PublishedSeriesArticleLink;
160
+ /** Next published article in the series, when available */
161
+ readonly next?: PublishedSeriesArticleLink;
162
+ /** Ordered article list for compact navigation and archive pages */
163
+ readonly articles: readonly PublishedSeriesArticleLink[];
164
+ }
125
165
  /**
126
166
  * Represents a published article with all necessary metadata for rendering
127
167
  * on external blog platforms.
@@ -153,6 +193,8 @@ interface PublishedArticle {
153
193
  readonly cta?: PublishedArticleCta;
154
194
  /** Public topic taxonomy assigned to the article */
155
195
  readonly topics?: readonly PublishedTopic[];
196
+ /** Optional ordered series context for article navigation */
197
+ readonly series?: PublishedSeriesContext;
156
198
  /** Featured image URL (optional) */
157
199
  readonly featuredImage?: string;
158
200
  /** Alt text for featured image */
@@ -226,4 +268,4 @@ interface PublishResult {
226
268
  readonly idempotencyKey: string;
227
269
  }
228
270
 
229
- export type { PublishedTopic as P, PublishedArticle as a, PublishedSite as b, PublishedAuthor as c, PublishedNewsletterSettings as d, PublishedArticleCta as e, PublishResult as f, PublishPayload as g, PublishedAuthorSocialLinks as h };
271
+ export type { PublishedTopic as P, PublishedArticle as a, PublishedSite as b, PublishedAuthor as c, PublishedNewsletterSettings as d, PublishedArticleCta as e, PublishResult as f, PublishedSeriesContext as g, PublishPayload as h, PublishedAuthorSocialLinks as i };
package/dist/index.d.mts CHANGED
@@ -1,5 +1,5 @@
1
- import { a as PublishedArticle, b as PublishedSite, d as PublishedNewsletterSettings, e as PublishedArticleCta, c as PublishedAuthor, f as PublishResult, P as PublishedTopic } from './index-Dr8HaKGm.mjs';
2
- export { g as PublishPayload, h as PublishedAuthorSocialLinks } from './index-Dr8HaKGm.mjs';
1
+ import { a as PublishedArticle, b as PublishedSite, d as PublishedNewsletterSettings, e as PublishedArticleCta, c as PublishedAuthor, f as PublishResult, P as PublishedTopic, g as PublishedSeriesContext } from './index-CKWrb9a4.mjs';
2
+ export { h as PublishPayload, i as PublishedAuthorSocialLinks } from './index-CKWrb9a4.mjs';
3
3
  import * as React from 'react';
4
4
  import { CSSProperties, ReactElement } from 'react';
5
5
  import * as react_jsx_runtime from 'react/jsx-runtime';
@@ -10,8 +10,8 @@ export { RelatedArticleCandidate, RelatedFeaturedArticlesOptions, getRelatedFeat
10
10
  import { NextRequest, NextResponse } from 'next/server.js';
11
11
  import * as drizzle_orm_sqlite_core from 'drizzle-orm/sqlite-core';
12
12
  import { LibSQLDatabase } from 'drizzle-orm/libsql';
13
- import { C as CanonicalUrlOptions } from './sitemap-Dbl4CUGI.mjs';
14
- 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-Dbl4CUGI.mjs';
13
+ import { C as CanonicalUrlOptions } from './sitemap-D3rS0iAF.mjs';
14
+ 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-D3rS0iAF.mjs';
15
15
 
16
16
  interface BlogTheme {
17
17
  accentColor?: string;
@@ -159,6 +159,52 @@ declare function generateArticleMetadata(
159
159
  };
160
160
  };
161
161
 
162
+ interface BlogSeriesPageProps {
163
+ articles: PublishedArticle[];
164
+ basePath?: string;
165
+ title?: string;
166
+ description?: string;
167
+ className?: string;
168
+ theme?: BlogTheme;
169
+ }
170
+
171
+ declare function BlogSeriesPage(
172
+ props: BlogSeriesPageProps,
173
+ ): ReactElement;
174
+
175
+ declare function generateSeriesIndexMetadata(basePath?: string): {
176
+ title: string;
177
+ description: string;
178
+ alternates: {
179
+ canonical: string;
180
+ };
181
+ };
182
+
183
+ interface BlogSeriesArchiveRoutePageProps {
184
+ articles: PublishedArticle[];
185
+ seriesSlug: string;
186
+ basePath?: string;
187
+ className?: string;
188
+ theme?: BlogTheme;
189
+ }
190
+
191
+ declare function BlogSeriesArchiveRoutePage(
192
+ props: BlogSeriesArchiveRoutePageProps,
193
+ ): ReactElement;
194
+
195
+ declare function generateSeriesArchiveMetadata(options: {
196
+ title: string;
197
+ description?: string;
198
+ slug: string;
199
+ basePath?: string;
200
+ }): {
201
+ title: string;
202
+ description: string;
203
+ alternates: {
204
+ canonical: string;
205
+ };
206
+ };
207
+
162
208
  interface AuthorPageProps {
163
209
  author: PublishedAuthor;
164
210
  articles: PublishedArticle[];
@@ -297,6 +343,7 @@ declare function cn(...inputs: ClassValue[]): string;
297
343
  declare function normalizeBlogBasePath(basePath?: string): string;
298
344
  declare function buildBlogPath(basePath: string | undefined, slug?: string): string;
299
345
  declare function buildAuthorPath(basePath: string | undefined, authorSlug: string): string;
346
+ declare function buildSeriesPath(basePath: string | undefined, seriesSlug: string): string;
300
347
  declare function getPathPrefixFromBlogUrl(blogUrl: string): string;
301
348
 
302
349
  /**
@@ -397,6 +444,14 @@ declare function getArticlePrimaryTopic(article: PublishedArticle): PublishedTop
397
444
  declare function getAllTopics(articles: PublishedArticle[]): PublishedTopic[];
398
445
  declare function getTopicArchive(articles: PublishedArticle[], topicSlug: string): TopicArchive | null;
399
446
 
447
+ interface SeriesArchive {
448
+ series: PublishedSeriesContext;
449
+ articles: PublishedArticle[];
450
+ }
451
+ declare function getAllSeries(articles: PublishedArticle[]): PublishedSeriesContext[];
452
+ declare function getSeriesArchive(articles: PublishedArticle[], seriesSlug: string): SeriesArchive | null;
453
+ declare function getArticleSeriesNavigation(article: PublishedArticle): PublishedSeriesContext | null;
454
+
400
455
  interface BlogTopicsIndexPageProps {
401
456
  articles: PublishedArticle[];
402
457
  basePath?: string;
@@ -415,6 +470,31 @@ interface BlogTopicArchivePageProps {
415
470
  declare function BlogTopicsIndexPage({ articles, basePath, title, description, className, theme, }: BlogTopicsIndexPageProps): react_jsx_runtime.JSX.Element;
416
471
  declare function BlogTopicArchivePage({ articles, topicSlug, basePath, className, theme, }: BlogTopicArchivePageProps): react_jsx_runtime.JSX.Element;
417
472
 
473
+ interface BlogSeriesIndexPageProps {
474
+ articles: PublishedArticle[];
475
+ basePath?: string;
476
+ title?: string;
477
+ description?: string;
478
+ className?: string;
479
+ theme?: BlogTheme;
480
+ }
481
+ interface BlogSeriesArchivePageProps {
482
+ articles: PublishedArticle[];
483
+ seriesSlug: string;
484
+ basePath?: string;
485
+ className?: string;
486
+ theme?: BlogTheme;
487
+ }
488
+ declare function BlogSeriesIndexPage({ articles, basePath, title, description, className, theme, }: BlogSeriesIndexPageProps): react_jsx_runtime.JSX.Element;
489
+ declare function BlogSeriesArchivePage({ articles, seriesSlug, basePath, className, theme, }: BlogSeriesArchivePageProps): react_jsx_runtime.JSX.Element;
490
+
491
+ interface SeriesNavigationProps {
492
+ article: PublishedArticle;
493
+ basePath?: string;
494
+ className?: string;
495
+ }
496
+ declare function SeriesNavigation({ article, basePath, className, }: SeriesNavigationProps): react_jsx_runtime.JSX.Element | null;
497
+
418
498
  interface BlogAuthorsIndexPageProps {
419
499
  articles: PublishedArticle[];
420
500
  basePath?: string;
@@ -2203,4 +2283,4 @@ declare function OPTIONS(request: NextRequest): Promise<NextResponse>;
2203
2283
 
2204
2284
  declare const PACKAGE_VERSION: string;
2205
2285
 
2206
- export { ApiKeyAuth, type AuthConfig, type AuthResult, type AuthorArchive, type AuthorArchiveOptions, BLOG_PLATFORM_SCHEMA_VERSION, BLOG_PLATFORM_TABLE_NAMES, ArticlePage as BlogArticlePage, AuthorPage as BlogAuthorPage, BlogAuthorsIndexPage, BlogHomePage, type BlogPlatformConfig, type BlogPlatformSchemaCheckResult, BlogPlatformSchemaError, type BlogPlatformStorage, type BlogPlatformTableName, 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, blogPlatformDrizzleSchema, bpArticles, bpMetadata, bpOperations, buildAuthorPath, buildBlogPath, buttonVariants, checkDrizzleAdapterSchema, checkRateLimit, cn, POST as configHandler, OPTIONS$1 as configOptionsHandler, configureRateLimit, createRateLimitErrorResponse, createStructuredDataScript, createTokenFingerprint, enforceRateLimit, ensureDrizzleAdapterSchema, 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, GET$1 as indexNowKeyRoute, initBlogPlatform, initBlogPlatformDev, initBlogPlatformOnce, initBlogPlatformProd, initEnvAuth, loadAuthorArchive, metadataToHtml, normalizeBlogBasePath, POST$2 as publishHandler, safeGenerateArticleStructuredData, setAuthConfig, setStorage, shouldSkipAuth, GET as slugExistsHandler, OPTIONS as slugExistsOptionsHandler, structuredDataToJsonLd, POST$1 as unpublishHandler, usePagination, validateMetadata, validateStructuredData, GET$2 as versionHandler };
2286
+ export { ApiKeyAuth, type AuthConfig, type AuthResult, type AuthorArchive, type AuthorArchiveOptions, BLOG_PLATFORM_SCHEMA_VERSION, BLOG_PLATFORM_TABLE_NAMES, ArticlePage as BlogArticlePage, AuthorPage as BlogAuthorPage, BlogAuthorsIndexPage, BlogHomePage, type BlogPlatformConfig, type BlogPlatformSchemaCheckResult, BlogPlatformSchemaError, type BlogPlatformStorage, type BlogPlatformTableName, type BlogPostingSchema, BlogSeriesArchivePage, BlogSeriesArchiveRoutePage, BlogSeriesIndexPage, BlogSeriesPage, 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, type SeriesArchive, SeriesNavigation, Pagination as ShadcnPagination, StructuredDataError, type StructuredDataOptions, type TopicArchive, UninitializedAuth, type WebSiteSchema, autoConfigureRateLimit, blogPlatformDrizzleSchema, bpArticles, bpMetadata, bpOperations, buildAuthorPath, buildBlogPath, buildSeriesPath, buttonVariants, checkDrizzleAdapterSchema, checkRateLimit, cn, POST as configHandler, OPTIONS$1 as configOptionsHandler, configureRateLimit, createRateLimitErrorResponse, createStructuredDataScript, createTokenFingerprint, enforceRateLimit, ensureDrizzleAdapterSchema, extractKeywordsFromArticle, extractTableOfContents, extractTokenFromHeader, formatArticleDateMeta, generateArticleMetadata, generateArticleStructuredData, generateAuthorPageMetadata, generateAuthorStructuredData, generateBlogHomeMetadata, generateBlogHomeStructuredData, generateBreadcrumbStructuredData, generateCompleteArticleStructuredData, generateOrganizationStructuredData, generatePaginationMetadata, generateSeriesArchiveMetadata, generateSeriesIndexMetadata, generateSiteMetadata, generateWebSiteStructuredData, getAllSeries, getAllTopics, getArticlePrimaryTopic, getArticleSeriesNavigation, getAuthConfig, getAuthorArchive, getAuthorsFromArticles, getBlogThemeStyle, getDrizzleAdapterSql, getPathPrefixFromBlogUrl, getRateLimitHeaders, getSeriesArchive, getStorage, getTopicArchive, GET$1 as indexNowKeyRoute, initBlogPlatform, initBlogPlatformDev, initBlogPlatformOnce, initBlogPlatformProd, initEnvAuth, loadAuthorArchive, metadataToHtml, normalizeBlogBasePath, POST$2 as publishHandler, safeGenerateArticleStructuredData, setAuthConfig, setStorage, shouldSkipAuth, GET as slugExistsHandler, OPTIONS as slugExistsOptionsHandler, structuredDataToJsonLd, POST$1 as unpublishHandler, usePagination, validateMetadata, validateStructuredData, GET$2 as versionHandler };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { a as PublishedArticle, b as PublishedSite, d as PublishedNewsletterSettings, e as PublishedArticleCta, c as PublishedAuthor, f as PublishResult, P as PublishedTopic } from './index-Dr8HaKGm.js';
2
- export { g as PublishPayload, h as PublishedAuthorSocialLinks } from './index-Dr8HaKGm.js';
1
+ import { a as PublishedArticle, b as PublishedSite, d as PublishedNewsletterSettings, e as PublishedArticleCta, c as PublishedAuthor, f as PublishResult, P as PublishedTopic, g as PublishedSeriesContext } from './index-CKWrb9a4.js';
2
+ export { h as PublishPayload, i as PublishedAuthorSocialLinks } from './index-CKWrb9a4.js';
3
3
  import * as React from 'react';
4
4
  import { CSSProperties, ReactElement } from 'react';
5
5
  import * as react_jsx_runtime from 'react/jsx-runtime';
@@ -10,8 +10,8 @@ export { RelatedArticleCandidate, RelatedFeaturedArticlesOptions, getRelatedFeat
10
10
  import { NextRequest, NextResponse } from 'next/server.js';
11
11
  import * as drizzle_orm_sqlite_core from 'drizzle-orm/sqlite-core';
12
12
  import { LibSQLDatabase } from 'drizzle-orm/libsql';
13
- import { C as CanonicalUrlOptions } from './sitemap-BmCh8BpN.js';
14
- 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-BmCh8BpN.js';
13
+ import { C as CanonicalUrlOptions } from './sitemap-BDT3d496.js';
14
+ 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-BDT3d496.js';
15
15
 
16
16
  interface BlogTheme {
17
17
  accentColor?: string;
@@ -159,6 +159,52 @@ declare function generateArticleMetadata(
159
159
  };
160
160
  };
161
161
 
162
+ interface BlogSeriesPageProps {
163
+ articles: PublishedArticle[];
164
+ basePath?: string;
165
+ title?: string;
166
+ description?: string;
167
+ className?: string;
168
+ theme?: BlogTheme;
169
+ }
170
+
171
+ declare function BlogSeriesPage(
172
+ props: BlogSeriesPageProps,
173
+ ): ReactElement;
174
+
175
+ declare function generateSeriesIndexMetadata(basePath?: string): {
176
+ title: string;
177
+ description: string;
178
+ alternates: {
179
+ canonical: string;
180
+ };
181
+ };
182
+
183
+ interface BlogSeriesArchiveRoutePageProps {
184
+ articles: PublishedArticle[];
185
+ seriesSlug: string;
186
+ basePath?: string;
187
+ className?: string;
188
+ theme?: BlogTheme;
189
+ }
190
+
191
+ declare function BlogSeriesArchiveRoutePage(
192
+ props: BlogSeriesArchiveRoutePageProps,
193
+ ): ReactElement;
194
+
195
+ declare function generateSeriesArchiveMetadata(options: {
196
+ title: string;
197
+ description?: string;
198
+ slug: string;
199
+ basePath?: string;
200
+ }): {
201
+ title: string;
202
+ description: string;
203
+ alternates: {
204
+ canonical: string;
205
+ };
206
+ };
207
+
162
208
  interface AuthorPageProps {
163
209
  author: PublishedAuthor;
164
210
  articles: PublishedArticle[];
@@ -297,6 +343,7 @@ declare function cn(...inputs: ClassValue[]): string;
297
343
  declare function normalizeBlogBasePath(basePath?: string): string;
298
344
  declare function buildBlogPath(basePath: string | undefined, slug?: string): string;
299
345
  declare function buildAuthorPath(basePath: string | undefined, authorSlug: string): string;
346
+ declare function buildSeriesPath(basePath: string | undefined, seriesSlug: string): string;
300
347
  declare function getPathPrefixFromBlogUrl(blogUrl: string): string;
301
348
 
302
349
  /**
@@ -397,6 +444,14 @@ declare function getArticlePrimaryTopic(article: PublishedArticle): PublishedTop
397
444
  declare function getAllTopics(articles: PublishedArticle[]): PublishedTopic[];
398
445
  declare function getTopicArchive(articles: PublishedArticle[], topicSlug: string): TopicArchive | null;
399
446
 
447
+ interface SeriesArchive {
448
+ series: PublishedSeriesContext;
449
+ articles: PublishedArticle[];
450
+ }
451
+ declare function getAllSeries(articles: PublishedArticle[]): PublishedSeriesContext[];
452
+ declare function getSeriesArchive(articles: PublishedArticle[], seriesSlug: string): SeriesArchive | null;
453
+ declare function getArticleSeriesNavigation(article: PublishedArticle): PublishedSeriesContext | null;
454
+
400
455
  interface BlogTopicsIndexPageProps {
401
456
  articles: PublishedArticle[];
402
457
  basePath?: string;
@@ -415,6 +470,31 @@ interface BlogTopicArchivePageProps {
415
470
  declare function BlogTopicsIndexPage({ articles, basePath, title, description, className, theme, }: BlogTopicsIndexPageProps): react_jsx_runtime.JSX.Element;
416
471
  declare function BlogTopicArchivePage({ articles, topicSlug, basePath, className, theme, }: BlogTopicArchivePageProps): react_jsx_runtime.JSX.Element;
417
472
 
473
+ interface BlogSeriesIndexPageProps {
474
+ articles: PublishedArticle[];
475
+ basePath?: string;
476
+ title?: string;
477
+ description?: string;
478
+ className?: string;
479
+ theme?: BlogTheme;
480
+ }
481
+ interface BlogSeriesArchivePageProps {
482
+ articles: PublishedArticle[];
483
+ seriesSlug: string;
484
+ basePath?: string;
485
+ className?: string;
486
+ theme?: BlogTheme;
487
+ }
488
+ declare function BlogSeriesIndexPage({ articles, basePath, title, description, className, theme, }: BlogSeriesIndexPageProps): react_jsx_runtime.JSX.Element;
489
+ declare function BlogSeriesArchivePage({ articles, seriesSlug, basePath, className, theme, }: BlogSeriesArchivePageProps): react_jsx_runtime.JSX.Element;
490
+
491
+ interface SeriesNavigationProps {
492
+ article: PublishedArticle;
493
+ basePath?: string;
494
+ className?: string;
495
+ }
496
+ declare function SeriesNavigation({ article, basePath, className, }: SeriesNavigationProps): react_jsx_runtime.JSX.Element | null;
497
+
418
498
  interface BlogAuthorsIndexPageProps {
419
499
  articles: PublishedArticle[];
420
500
  basePath?: string;
@@ -2203,4 +2283,4 @@ declare function OPTIONS(request: NextRequest): Promise<NextResponse>;
2203
2283
 
2204
2284
  declare const PACKAGE_VERSION: string;
2205
2285
 
2206
- export { ApiKeyAuth, type AuthConfig, type AuthResult, type AuthorArchive, type AuthorArchiveOptions, BLOG_PLATFORM_SCHEMA_VERSION, BLOG_PLATFORM_TABLE_NAMES, ArticlePage as BlogArticlePage, AuthorPage as BlogAuthorPage, BlogAuthorsIndexPage, BlogHomePage, type BlogPlatformConfig, type BlogPlatformSchemaCheckResult, BlogPlatformSchemaError, type BlogPlatformStorage, type BlogPlatformTableName, 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, blogPlatformDrizzleSchema, bpArticles, bpMetadata, bpOperations, buildAuthorPath, buildBlogPath, buttonVariants, checkDrizzleAdapterSchema, checkRateLimit, cn, POST as configHandler, OPTIONS$1 as configOptionsHandler, configureRateLimit, createRateLimitErrorResponse, createStructuredDataScript, createTokenFingerprint, enforceRateLimit, ensureDrizzleAdapterSchema, 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, GET$1 as indexNowKeyRoute, initBlogPlatform, initBlogPlatformDev, initBlogPlatformOnce, initBlogPlatformProd, initEnvAuth, loadAuthorArchive, metadataToHtml, normalizeBlogBasePath, POST$2 as publishHandler, safeGenerateArticleStructuredData, setAuthConfig, setStorage, shouldSkipAuth, GET as slugExistsHandler, OPTIONS as slugExistsOptionsHandler, structuredDataToJsonLd, POST$1 as unpublishHandler, usePagination, validateMetadata, validateStructuredData, GET$2 as versionHandler };
2286
+ export { ApiKeyAuth, type AuthConfig, type AuthResult, type AuthorArchive, type AuthorArchiveOptions, BLOG_PLATFORM_SCHEMA_VERSION, BLOG_PLATFORM_TABLE_NAMES, ArticlePage as BlogArticlePage, AuthorPage as BlogAuthorPage, BlogAuthorsIndexPage, BlogHomePage, type BlogPlatformConfig, type BlogPlatformSchemaCheckResult, BlogPlatformSchemaError, type BlogPlatformStorage, type BlogPlatformTableName, type BlogPostingSchema, BlogSeriesArchivePage, BlogSeriesArchiveRoutePage, BlogSeriesIndexPage, BlogSeriesPage, 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, type SeriesArchive, SeriesNavigation, Pagination as ShadcnPagination, StructuredDataError, type StructuredDataOptions, type TopicArchive, UninitializedAuth, type WebSiteSchema, autoConfigureRateLimit, blogPlatformDrizzleSchema, bpArticles, bpMetadata, bpOperations, buildAuthorPath, buildBlogPath, buildSeriesPath, buttonVariants, checkDrizzleAdapterSchema, checkRateLimit, cn, POST as configHandler, OPTIONS$1 as configOptionsHandler, configureRateLimit, createRateLimitErrorResponse, createStructuredDataScript, createTokenFingerprint, enforceRateLimit, ensureDrizzleAdapterSchema, extractKeywordsFromArticle, extractTableOfContents, extractTokenFromHeader, formatArticleDateMeta, generateArticleMetadata, generateArticleStructuredData, generateAuthorPageMetadata, generateAuthorStructuredData, generateBlogHomeMetadata, generateBlogHomeStructuredData, generateBreadcrumbStructuredData, generateCompleteArticleStructuredData, generateOrganizationStructuredData, generatePaginationMetadata, generateSeriesArchiveMetadata, generateSeriesIndexMetadata, generateSiteMetadata, generateWebSiteStructuredData, getAllSeries, getAllTopics, getArticlePrimaryTopic, getArticleSeriesNavigation, getAuthConfig, getAuthorArchive, getAuthorsFromArticles, getBlogThemeStyle, getDrizzleAdapterSql, getPathPrefixFromBlogUrl, getRateLimitHeaders, getSeriesArchive, getStorage, getTopicArchive, GET$1 as indexNowKeyRoute, initBlogPlatform, initBlogPlatformDev, initBlogPlatformOnce, initBlogPlatformProd, initEnvAuth, loadAuthorArchive, metadataToHtml, normalizeBlogBasePath, POST$2 as publishHandler, safeGenerateArticleStructuredData, setAuthConfig, setStorage, shouldSkipAuth, GET as slugExistsHandler, OPTIONS as slugExistsOptionsHandler, structuredDataToJsonLd, POST$1 as unpublishHandler, usePagination, validateMetadata, validateStructuredData, GET$2 as versionHandler };