@xexr/blog-platform 1.0.7 → 1.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/README.md +110 -29
- package/dist/app/blog/[slug]/page.d.ts +68 -0
- package/dist/app/blog/[slug]/page.tsx +175 -116
- package/dist/app/blog/authors/[slug]/page.test.ts +108 -0
- package/dist/app/blog/authors/[slug]/page.tsx +387 -0
- package/dist/app/blog/page.tsx +138 -113
- package/dist/components/ArticleReadingProgress.tsx +208 -0
- package/dist/components/ArticleTopActions.tsx +179 -0
- package/dist/components/AuthorByline.tsx +569 -0
- package/dist/components/AuthorPages.test.ts +87 -0
- package/dist/components/AuthorPages.tsx +129 -0
- package/dist/components/ExpandableArticleImage.tsx +79 -0
- package/dist/components/Pagination.tsx +236 -0
- package/dist/components/TopicArchivePages.tsx +204 -0
- package/dist/components/ui/badge.tsx +36 -0
- package/dist/components/ui/button.tsx +59 -0
- package/dist/components/ui/card.tsx +92 -0
- package/dist/components/ui/pagination.tsx +127 -0
- package/dist/components/ui/separator.tsx +29 -0
- package/dist/index.d.mts +174 -112
- package/dist/index.d.ts +174 -112
- package/dist/index.js +83 -8
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +83 -8
- package/dist/index.mjs.map +1 -1
- package/dist/lib/article-ui.ts +158 -0
- package/dist/lib/auth.ts +354 -0
- package/dist/lib/authors.ts +100 -0
- package/dist/lib/cors.ts +243 -0
- package/dist/lib/database.ts +277 -0
- package/dist/lib/init.ts +186 -0
- package/dist/lib/mdx.ts +73 -0
- package/dist/lib/metadata.ts +558 -0
- package/dist/lib/ratelimit.ts +224 -0
- package/dist/lib/security-headers.ts +322 -0
- package/dist/lib/seo.ts +295 -0
- package/dist/lib/sitemap.ts +738 -0
- package/dist/lib/storage/drizzle.ts +400 -0
- package/dist/lib/structured-data.ts +609 -0
- package/dist/lib/topics.ts +56 -0
- package/dist/lib/urls.ts +36 -0
- package/dist/lib/utils.ts +6 -0
- package/dist/lib/version.ts +154 -0
- package/dist/types/contracts.ts +259 -0
- package/dist/types/index.d.mts +20 -1
- package/dist/types/index.d.ts +20 -1
- package/dist/types/index.ts +16 -0
- package/package.json +14 -9
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { PublishedArticle, PublishedSite,
|
|
2
|
-
export { PublishPayload } from './types/index.js';
|
|
1
|
+
import { PublishedArticle, PublishedSite, PublishedAuthor, PublishResult, PublishedTopic } from './types/index.js';
|
|
2
|
+
export { PublishPayload, PublishedAuthorSocialLinks } from './types/index.js';
|
|
3
3
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
4
4
|
import * as React from 'react';
|
|
5
|
-
import { CSSProperties } from 'react';
|
|
5
|
+
import { CSSProperties, ReactElement } from 'react';
|
|
6
6
|
import * as class_variance_authority_types from 'class-variance-authority/types';
|
|
7
7
|
import { VariantProps } from 'class-variance-authority';
|
|
8
8
|
import { ClassValue } from 'clsx';
|
|
@@ -100,55 +100,97 @@ declare function generateBlogHomeMetadata(siteName?: string, siteDescription?: s
|
|
|
100
100
|
};
|
|
101
101
|
|
|
102
102
|
interface ArticlePageProps {
|
|
103
|
-
|
|
103
|
+
article: PublishedArticle;
|
|
104
|
+
className?: string;
|
|
105
|
+
navigation?: {
|
|
106
|
+
backToHome?: {
|
|
107
|
+
url: string;
|
|
108
|
+
label?: string;
|
|
109
|
+
};
|
|
110
|
+
previousArticle?: {
|
|
111
|
+
url: string;
|
|
112
|
+
title: string;
|
|
113
|
+
featuredImage?: string;
|
|
114
|
+
featuredImageAlt?: string;
|
|
115
|
+
};
|
|
116
|
+
nextArticle?: {
|
|
117
|
+
url: string;
|
|
118
|
+
title: string;
|
|
119
|
+
featuredImage?: string;
|
|
120
|
+
featuredImageAlt?: string;
|
|
121
|
+
};
|
|
122
|
+
};
|
|
123
|
+
basePath?: string;
|
|
124
|
+
theme?: BlogTheme;
|
|
125
|
+
postArticleCta?: {
|
|
126
|
+
title: string;
|
|
127
|
+
description?: string;
|
|
128
|
+
href: string;
|
|
129
|
+
label: string;
|
|
130
|
+
};
|
|
131
|
+
relatedArticles?: PublishedArticle[];
|
|
132
|
+
showShareLinks?: boolean;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
declare function ArticlePage(props: ArticlePageProps): ReactElement;
|
|
136
|
+
|
|
137
|
+
declare function generateArticleMetadata(
|
|
138
|
+
article: PublishedArticle,
|
|
139
|
+
basePath?: string,
|
|
140
|
+
): {
|
|
141
|
+
title: string;
|
|
142
|
+
description: string;
|
|
143
|
+
keywords: string;
|
|
144
|
+
authors: { name: string }[] | undefined;
|
|
145
|
+
openGraph: {
|
|
146
|
+
title: string;
|
|
147
|
+
description: string;
|
|
148
|
+
type: string;
|
|
149
|
+
url: string;
|
|
150
|
+
images: { url: string; alt: string }[] | undefined;
|
|
151
|
+
publishedTime: string;
|
|
152
|
+
modifiedTime: string;
|
|
153
|
+
authors: string[] | undefined;
|
|
154
|
+
siteName: string;
|
|
155
|
+
};
|
|
156
|
+
twitter: {
|
|
157
|
+
card: string;
|
|
158
|
+
title: string;
|
|
159
|
+
description: string;
|
|
160
|
+
images: string[] | undefined;
|
|
161
|
+
};
|
|
162
|
+
alternates: {
|
|
163
|
+
canonical: string;
|
|
164
|
+
};
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
interface AuthorPageProps {
|
|
168
|
+
author: PublishedAuthor;
|
|
169
|
+
articles: PublishedArticle[];
|
|
170
|
+
site: PublishedSite;
|
|
104
171
|
className?: string;
|
|
105
|
-
|
|
172
|
+
basePath?: string;
|
|
173
|
+
theme?: BlogTheme;
|
|
174
|
+
pagination?: {
|
|
175
|
+
currentPage: number;
|
|
176
|
+
totalPages: number;
|
|
177
|
+
baseUrl?: string;
|
|
178
|
+
totalItems?: number;
|
|
179
|
+
};
|
|
106
180
|
navigation?: {
|
|
107
181
|
backToHome?: {
|
|
108
182
|
url: string;
|
|
109
183
|
label?: string;
|
|
110
184
|
};
|
|
111
|
-
previousArticle?: {
|
|
112
|
-
url: string;
|
|
113
|
-
title: string;
|
|
114
|
-
featuredImage?: string;
|
|
115
|
-
featuredImageAlt?: string;
|
|
116
|
-
};
|
|
117
|
-
nextArticle?: {
|
|
118
|
-
url: string;
|
|
119
|
-
title: string;
|
|
120
|
-
featuredImage?: string;
|
|
121
|
-
featuredImageAlt?: string;
|
|
122
|
-
};
|
|
123
|
-
};
|
|
124
|
-
/** Public path where this blog is mounted, e.g. "/blog" or "/new-blog". */
|
|
125
|
-
basePath?: string;
|
|
126
|
-
/** Optional theme values for host-site brand integration. */
|
|
127
|
-
theme?: BlogTheme;
|
|
128
|
-
/** Optional post-article CTA supplied by the host site. */
|
|
129
|
-
postArticleCta?: {
|
|
130
|
-
title: string;
|
|
131
|
-
description?: string;
|
|
132
|
-
href: string;
|
|
133
|
-
label: string;
|
|
134
185
|
};
|
|
135
|
-
/** Optional related articles supplied by the host site. */
|
|
136
|
-
relatedArticles?: PublishedArticle[];
|
|
137
|
-
/** Whether to render static article share links. */
|
|
138
|
-
showShareLinks?: boolean;
|
|
139
186
|
}
|
|
140
|
-
declare function
|
|
141
|
-
|
|
142
|
-
* Generate metadata for the article page for SEO optimization.
|
|
143
|
-
* This function should be used in the Next.js metadata API.
|
|
144
|
-
*/
|
|
145
|
-
declare function generateArticleMetadata(article: PublishedArticle, basePath?: string): {
|
|
187
|
+
declare function AuthorPage({ author, articles, site, className, basePath, theme, pagination, navigation, }: AuthorPageProps): react_jsx_runtime.JSX.Element;
|
|
188
|
+
declare function generateAuthorPageMetadata(author: PublishedAuthor, site: PublishedSite, basePath?: string): {
|
|
146
189
|
title: string;
|
|
147
190
|
description: string;
|
|
148
|
-
keywords: string;
|
|
149
191
|
authors: {
|
|
150
192
|
name: string;
|
|
151
|
-
}[]
|
|
193
|
+
}[];
|
|
152
194
|
openGraph: {
|
|
153
195
|
title: string;
|
|
154
196
|
description: string;
|
|
@@ -158,9 +200,6 @@ declare function generateArticleMetadata(article: PublishedArticle, basePath?: s
|
|
|
158
200
|
url: string;
|
|
159
201
|
alt: string;
|
|
160
202
|
}[] | undefined;
|
|
161
|
-
publishedTime: string;
|
|
162
|
-
modifiedTime: string;
|
|
163
|
-
authors: string[] | undefined;
|
|
164
203
|
siteName: string;
|
|
165
204
|
};
|
|
166
205
|
twitter: {
|
|
@@ -262,8 +301,88 @@ declare function cn(...inputs: ClassValue[]): string;
|
|
|
262
301
|
*/
|
|
263
302
|
declare function normalizeBlogBasePath(basePath?: string): string;
|
|
264
303
|
declare function buildBlogPath(basePath: string | undefined, slug?: string): string;
|
|
304
|
+
declare function buildAuthorPath(basePath: string | undefined, authorSlug: string): string;
|
|
265
305
|
declare function getPathPrefixFromBlogUrl(blogUrl: string): string;
|
|
266
306
|
|
|
307
|
+
/**
|
|
308
|
+
* Database interface for blog platform storage
|
|
309
|
+
*
|
|
310
|
+
* This provides a simple interface for storing published articles
|
|
311
|
+
* without coupling to any specific database implementation.
|
|
312
|
+
* Customers can implement this interface with their preferred database.
|
|
313
|
+
*/
|
|
314
|
+
|
|
315
|
+
interface BlogPlatformStorage {
|
|
316
|
+
/**
|
|
317
|
+
* Store a published article
|
|
318
|
+
*/
|
|
319
|
+
saveArticle(article: PublishedArticle, idempotencyKey: string): Promise<PublishResult>;
|
|
320
|
+
/**
|
|
321
|
+
* Get an article by slug
|
|
322
|
+
*/
|
|
323
|
+
getArticle(slug: string): Promise<PublishedArticle | null>;
|
|
324
|
+
/**
|
|
325
|
+
* List all published articles
|
|
326
|
+
*/
|
|
327
|
+
listArticles(options?: {
|
|
328
|
+
limit?: number;
|
|
329
|
+
offset?: number;
|
|
330
|
+
sortBy?: "publishedAt" | "updatedAt";
|
|
331
|
+
order?: "asc" | "desc";
|
|
332
|
+
}): Promise<{
|
|
333
|
+
articles: PublishedArticle[];
|
|
334
|
+
total: number;
|
|
335
|
+
}>;
|
|
336
|
+
/**
|
|
337
|
+
* Remove an article by slug
|
|
338
|
+
*/
|
|
339
|
+
removeArticle(slug: string, idempotencyKey: string): Promise<PublishResult>;
|
|
340
|
+
/**
|
|
341
|
+
* Check if an operation was already performed (idempotency)
|
|
342
|
+
*/
|
|
343
|
+
checkIdempotency(idempotencyKey: string): Promise<PublishResult | null>;
|
|
344
|
+
/**
|
|
345
|
+
* Store the result of an operation for idempotency
|
|
346
|
+
*/
|
|
347
|
+
storeOperationResult(idempotencyKey: string, result: PublishResult): Promise<void>;
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Default in-memory storage implementation for development/testing
|
|
351
|
+
* IMPORTANT: This is not suitable for production use!
|
|
352
|
+
*/
|
|
353
|
+
declare class InMemoryStorage implements BlogPlatformStorage {
|
|
354
|
+
private articles;
|
|
355
|
+
private operations;
|
|
356
|
+
saveArticle(article: PublishedArticle, idempotencyKey: string): Promise<PublishResult>;
|
|
357
|
+
getArticle(slug: string): Promise<PublishedArticle | null>;
|
|
358
|
+
listArticles(options?: {
|
|
359
|
+
limit?: number;
|
|
360
|
+
offset?: number;
|
|
361
|
+
sortBy?: "publishedAt" | "updatedAt";
|
|
362
|
+
order?: "asc" | "desc";
|
|
363
|
+
}): Promise<{
|
|
364
|
+
articles: PublishedArticle[];
|
|
365
|
+
total: number;
|
|
366
|
+
}>;
|
|
367
|
+
removeArticle(slug: string, idempotencyKey: string): Promise<PublishResult>;
|
|
368
|
+
checkIdempotency(idempotencyKey: string): Promise<PublishResult | null>;
|
|
369
|
+
storeOperationResult(idempotencyKey: string, result: PublishResult): Promise<void>;
|
|
370
|
+
}
|
|
371
|
+
declare function getStorage(): BlogPlatformStorage;
|
|
372
|
+
declare function setStorage(storage: BlogPlatformStorage): void;
|
|
373
|
+
|
|
374
|
+
interface AuthorArchive {
|
|
375
|
+
author: PublishedAuthor;
|
|
376
|
+
articles: PublishedArticle[];
|
|
377
|
+
}
|
|
378
|
+
interface AuthorArchiveOptions {
|
|
379
|
+
limit?: number;
|
|
380
|
+
offset?: number;
|
|
381
|
+
}
|
|
382
|
+
declare function getAuthorsFromArticles(articles: readonly PublishedArticle[]): PublishedAuthor[];
|
|
383
|
+
declare function getAuthorArchive(slug: string, articles: readonly PublishedArticle[]): AuthorArchive | null;
|
|
384
|
+
declare function loadAuthorArchive(slug: string, options?: AuthorArchiveOptions, storage?: BlogPlatformStorage): Promise<AuthorArchive | null>;
|
|
385
|
+
|
|
267
386
|
interface TopicArchive {
|
|
268
387
|
topic: PublishedTopic;
|
|
269
388
|
articles: PublishedArticle[];
|
|
@@ -290,6 +409,16 @@ interface BlogTopicArchivePageProps {
|
|
|
290
409
|
declare function BlogTopicsIndexPage({ articles, basePath, title, description, className, theme, }: BlogTopicsIndexPageProps): react_jsx_runtime.JSX.Element;
|
|
291
410
|
declare function BlogTopicArchivePage({ articles, topicSlug, basePath, className, theme, }: BlogTopicArchivePageProps): react_jsx_runtime.JSX.Element;
|
|
292
411
|
|
|
412
|
+
interface BlogAuthorsIndexPageProps {
|
|
413
|
+
articles: PublishedArticle[];
|
|
414
|
+
basePath?: string;
|
|
415
|
+
title?: string;
|
|
416
|
+
description?: string;
|
|
417
|
+
className?: string;
|
|
418
|
+
theme?: BlogTheme;
|
|
419
|
+
}
|
|
420
|
+
declare function BlogAuthorsIndexPage({ articles, basePath, title, description, className, theme, }: BlogAuthorsIndexPageProps): react_jsx_runtime.JSX.Element;
|
|
421
|
+
|
|
293
422
|
/**
|
|
294
423
|
* Authentication configuration interface
|
|
295
424
|
* Customers can implement this to customize authentication behavior
|
|
@@ -389,73 +518,6 @@ declare function initEnvAuth(envVarName?: string): void;
|
|
|
389
518
|
*/
|
|
390
519
|
declare function shouldSkipAuth(): boolean;
|
|
391
520
|
|
|
392
|
-
/**
|
|
393
|
-
* Database interface for blog platform storage
|
|
394
|
-
*
|
|
395
|
-
* This provides a simple interface for storing published articles
|
|
396
|
-
* without coupling to any specific database implementation.
|
|
397
|
-
* Customers can implement this interface with their preferred database.
|
|
398
|
-
*/
|
|
399
|
-
|
|
400
|
-
interface BlogPlatformStorage {
|
|
401
|
-
/**
|
|
402
|
-
* Store a published article
|
|
403
|
-
*/
|
|
404
|
-
saveArticle(article: PublishedArticle, idempotencyKey: string): Promise<PublishResult>;
|
|
405
|
-
/**
|
|
406
|
-
* Get an article by slug
|
|
407
|
-
*/
|
|
408
|
-
getArticle(slug: string): Promise<PublishedArticle | null>;
|
|
409
|
-
/**
|
|
410
|
-
* List all published articles
|
|
411
|
-
*/
|
|
412
|
-
listArticles(options?: {
|
|
413
|
-
limit?: number;
|
|
414
|
-
offset?: number;
|
|
415
|
-
sortBy?: "publishedAt" | "updatedAt";
|
|
416
|
-
order?: "asc" | "desc";
|
|
417
|
-
}): Promise<{
|
|
418
|
-
articles: PublishedArticle[];
|
|
419
|
-
total: number;
|
|
420
|
-
}>;
|
|
421
|
-
/**
|
|
422
|
-
* Remove an article by slug
|
|
423
|
-
*/
|
|
424
|
-
removeArticle(slug: string, idempotencyKey: string): Promise<PublishResult>;
|
|
425
|
-
/**
|
|
426
|
-
* Check if an operation was already performed (idempotency)
|
|
427
|
-
*/
|
|
428
|
-
checkIdempotency(idempotencyKey: string): Promise<PublishResult | null>;
|
|
429
|
-
/**
|
|
430
|
-
* Store the result of an operation for idempotency
|
|
431
|
-
*/
|
|
432
|
-
storeOperationResult(idempotencyKey: string, result: PublishResult): Promise<void>;
|
|
433
|
-
}
|
|
434
|
-
/**
|
|
435
|
-
* Default in-memory storage implementation for development/testing
|
|
436
|
-
* IMPORTANT: This is not suitable for production use!
|
|
437
|
-
*/
|
|
438
|
-
declare class InMemoryStorage implements BlogPlatformStorage {
|
|
439
|
-
private articles;
|
|
440
|
-
private operations;
|
|
441
|
-
saveArticle(article: PublishedArticle, idempotencyKey: string): Promise<PublishResult>;
|
|
442
|
-
getArticle(slug: string): Promise<PublishedArticle | null>;
|
|
443
|
-
listArticles(options?: {
|
|
444
|
-
limit?: number;
|
|
445
|
-
offset?: number;
|
|
446
|
-
sortBy?: "publishedAt" | "updatedAt";
|
|
447
|
-
order?: "asc" | "desc";
|
|
448
|
-
}): Promise<{
|
|
449
|
-
articles: PublishedArticle[];
|
|
450
|
-
total: number;
|
|
451
|
-
}>;
|
|
452
|
-
removeArticle(slug: string, idempotencyKey: string): Promise<PublishResult>;
|
|
453
|
-
checkIdempotency(idempotencyKey: string): Promise<PublishResult | null>;
|
|
454
|
-
storeOperationResult(idempotencyKey: string, result: PublishResult): Promise<void>;
|
|
455
|
-
}
|
|
456
|
-
declare function getStorage(): BlogPlatformStorage;
|
|
457
|
-
declare function setStorage(storage: BlogPlatformStorage): void;
|
|
458
|
-
|
|
459
521
|
/**
|
|
460
522
|
* Rate limiting for blog platform API endpoints
|
|
461
523
|
*
|
|
@@ -1369,7 +1431,7 @@ interface SitemapOptions {
|
|
|
1369
1431
|
/**
|
|
1370
1432
|
* Valid sitemap change frequency values as per XML sitemap standard.
|
|
1371
1433
|
*/
|
|
1372
|
-
type SitemapChangeFreq =
|
|
1434
|
+
type SitemapChangeFreq = "always" | "hourly" | "daily" | "weekly" | "monthly" | "yearly" | "never";
|
|
1373
1435
|
/**
|
|
1374
1436
|
* Next.js MetadataRoute.Sitemap compatible entry.
|
|
1375
1437
|
* This matches the expected format for Next.js sitemap generation.
|
|
@@ -1885,4 +1947,4 @@ declare function OPTIONS(request: NextRequest): Promise<NextResponse>;
|
|
|
1885
1947
|
|
|
1886
1948
|
declare const PACKAGE_VERSION: string;
|
|
1887
1949
|
|
|
1888
|
-
export { ApiKeyAuth, type AuthConfig, type AuthResult, ArticlePage as BlogArticlePage, 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, type NextjsSitemapEntry, NoAuth, type OrganizationSchema, PACKAGE_VERSION, Pagination$1 as Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, type PersonSchema, PublishResult, PublishedArticle, PublishedAuthor, 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, buildBlogPath, buttonVariants, checkRateLimit, cn, configureRateLimit, createBlogSitemapRoute, createDynamicBlogSitemap, createRateLimitErrorResponse, createStructuredDataScript, enforceRateLimit, extractKeywordsFromArticle, extractTableOfContents, extractTokenFromHeader, formatArticleDateMeta, generateArticleMetadata, generateArticleStructuredData, generateAuthorStructuredData, generateBlogHomeMetadata, generateBlogHomeStructuredData, generateBlogSitemapEntries, generateBreadcrumbStructuredData, generateCanonicalUrl, generateCanonicalUrlFromSlug, generateCompleteArticleStructuredData, generateOrganizationStructuredData, generatePaginationMetadata, generateSiteMetadata, generateSitemap, generateSitemapIndex, generateWebSiteStructuredData, getAllTopics, getArticlePrimaryTopic, getAuthConfig, getBaseUrl, getBlogThemeStyle, getDrizzleAdapterSql, getPathPrefixFromBlogUrl, getRateLimitHeaders, getStorage, getTopicArchive, initBlogPlatform, initBlogPlatformDev, initBlogPlatformOnce, initBlogPlatformProd, initEnvAuth, isValidCanonicalUrl, 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 };
|
|
1950
|
+
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, type NextjsSitemapEntry, NoAuth, type OrganizationSchema, PACKAGE_VERSION, Pagination$1 as Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, type PersonSchema, PublishResult, PublishedArticle, PublishedAuthor, 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, 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 };
|