@xexr/blog-platform 1.0.16 → 1.1.0

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.ts CHANGED
@@ -7,7 +7,7 @@ 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';
9
9
  export { RelatedArticleCandidate, RelatedFeaturedArticlesOptions, getRelatedFeaturedArticles } from './lib/related-articles.js';
10
- import { NextRequest, NextResponse } from 'next/server';
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
13
  import { C as CanonicalUrlOptions } from './sitemap-BmCh8BpN.js';
@@ -340,6 +340,14 @@ interface BlogPlatformStorage {
340
340
  * Store the result of an operation for idempotency
341
341
  */
342
342
  storeOperationResult(idempotencyKey: string, result: PublishResult): Promise<void>;
343
+ /**
344
+ * Store platform metadata/configuration by key.
345
+ */
346
+ setMetadata(key: string, value: unknown): Promise<void>;
347
+ /**
348
+ * Retrieve platform metadata/configuration by key.
349
+ */
350
+ getMetadata<T = unknown>(key: string): Promise<T | null>;
343
351
  }
344
352
  /**
345
353
  * Default in-memory storage implementation for development/testing
@@ -348,6 +356,7 @@ interface BlogPlatformStorage {
348
356
  declare class InMemoryStorage implements BlogPlatformStorage {
349
357
  private articles;
350
358
  private operations;
359
+ private metadata;
351
360
  saveArticle(article: PublishedArticle, idempotencyKey: string): Promise<PublishResult>;
352
361
  getArticle(slug: string): Promise<PublishedArticle | null>;
353
362
  listArticles(options?: {
@@ -362,6 +371,8 @@ declare class InMemoryStorage implements BlogPlatformStorage {
362
371
  removeArticle(slug: string, idempotencyKey: string): Promise<PublishResult>;
363
372
  checkIdempotency(idempotencyKey: string): Promise<PublishResult | null>;
364
373
  storeOperationResult(idempotencyKey: string, result: PublishResult): Promise<void>;
374
+ setMetadata(key: string, value: unknown): Promise<void>;
375
+ getMetadata<T = unknown>(key: string): Promise<T | null>;
365
376
  }
366
377
  declare function getStorage(): BlogPlatformStorage;
367
378
  declare function setStorage(storage: BlogPlatformStorage): void;
@@ -1115,9 +1126,576 @@ declare const bpOperations: drizzle_orm_sqlite_core.SQLiteTableWithColumns<{
1115
1126
  };
1116
1127
  dialect: "sqlite";
1117
1128
  }>;
1129
+ declare const bpMetadata: drizzle_orm_sqlite_core.SQLiteTableWithColumns<{
1130
+ name: "bp_metadata";
1131
+ schema: undefined;
1132
+ columns: {
1133
+ key: drizzle_orm_sqlite_core.SQLiteColumn<{
1134
+ name: "key";
1135
+ tableName: "bp_metadata";
1136
+ dataType: "string";
1137
+ columnType: "SQLiteText";
1138
+ data: string;
1139
+ driverParam: string;
1140
+ notNull: true;
1141
+ hasDefault: false;
1142
+ isPrimaryKey: true;
1143
+ isAutoincrement: false;
1144
+ hasRuntimeDefault: false;
1145
+ enumValues: [string, ...string[]];
1146
+ baseColumn: never;
1147
+ identity: undefined;
1148
+ generated: undefined;
1149
+ }, {}, {
1150
+ length: number | undefined;
1151
+ }>;
1152
+ valueJson: drizzle_orm_sqlite_core.SQLiteColumn<{
1153
+ name: "value_json";
1154
+ tableName: "bp_metadata";
1155
+ dataType: "string";
1156
+ columnType: "SQLiteText";
1157
+ data: string;
1158
+ driverParam: string;
1159
+ notNull: true;
1160
+ hasDefault: false;
1161
+ isPrimaryKey: false;
1162
+ isAutoincrement: false;
1163
+ hasRuntimeDefault: false;
1164
+ enumValues: [string, ...string[]];
1165
+ baseColumn: never;
1166
+ identity: undefined;
1167
+ generated: undefined;
1168
+ }, {}, {
1169
+ length: number | undefined;
1170
+ }>;
1171
+ updatedAt: drizzle_orm_sqlite_core.SQLiteColumn<{
1172
+ name: "updated_at";
1173
+ tableName: "bp_metadata";
1174
+ dataType: "date";
1175
+ columnType: "SQLiteTimestamp";
1176
+ data: Date;
1177
+ driverParam: number;
1178
+ notNull: true;
1179
+ hasDefault: false;
1180
+ isPrimaryKey: false;
1181
+ isAutoincrement: false;
1182
+ hasRuntimeDefault: false;
1183
+ enumValues: undefined;
1184
+ baseColumn: never;
1185
+ identity: undefined;
1186
+ generated: undefined;
1187
+ }, {}, {}>;
1188
+ };
1189
+ dialect: "sqlite";
1190
+ }>;
1191
+ declare const BLOG_PLATFORM_SCHEMA_VERSION = 2;
1192
+ declare const BLOG_PLATFORM_TABLE_NAMES: readonly ["bp_articles", "bp_operations", "bp_metadata"];
1193
+ type BlogPlatformTableName = (typeof BLOG_PLATFORM_TABLE_NAMES)[number];
1194
+ declare const blogPlatformDrizzleSchema: {
1195
+ readonly bpArticles: drizzle_orm_sqlite_core.SQLiteTableWithColumns<{
1196
+ name: "bp_articles";
1197
+ schema: undefined;
1198
+ columns: {
1199
+ id: drizzle_orm_sqlite_core.SQLiteColumn<{
1200
+ name: "id";
1201
+ tableName: "bp_articles";
1202
+ dataType: "string";
1203
+ columnType: "SQLiteText";
1204
+ data: string;
1205
+ driverParam: string;
1206
+ notNull: true;
1207
+ hasDefault: false;
1208
+ isPrimaryKey: true;
1209
+ isAutoincrement: false;
1210
+ hasRuntimeDefault: false;
1211
+ enumValues: [string, ...string[]];
1212
+ baseColumn: never;
1213
+ identity: undefined;
1214
+ generated: undefined;
1215
+ }, {}, {
1216
+ length: number | undefined;
1217
+ }>;
1218
+ slug: drizzle_orm_sqlite_core.SQLiteColumn<{
1219
+ name: "slug";
1220
+ tableName: "bp_articles";
1221
+ dataType: "string";
1222
+ columnType: "SQLiteText";
1223
+ data: string;
1224
+ driverParam: string;
1225
+ notNull: true;
1226
+ hasDefault: false;
1227
+ isPrimaryKey: false;
1228
+ isAutoincrement: false;
1229
+ hasRuntimeDefault: false;
1230
+ enumValues: [string, ...string[]];
1231
+ baseColumn: never;
1232
+ identity: undefined;
1233
+ generated: undefined;
1234
+ }, {}, {
1235
+ length: number | undefined;
1236
+ }>;
1237
+ title: drizzle_orm_sqlite_core.SQLiteColumn<{
1238
+ name: "title";
1239
+ tableName: "bp_articles";
1240
+ dataType: "string";
1241
+ columnType: "SQLiteText";
1242
+ data: string;
1243
+ driverParam: string;
1244
+ notNull: true;
1245
+ hasDefault: false;
1246
+ isPrimaryKey: false;
1247
+ isAutoincrement: false;
1248
+ hasRuntimeDefault: false;
1249
+ enumValues: [string, ...string[]];
1250
+ baseColumn: never;
1251
+ identity: undefined;
1252
+ generated: undefined;
1253
+ }, {}, {
1254
+ length: number | undefined;
1255
+ }>;
1256
+ excerpt: drizzle_orm_sqlite_core.SQLiteColumn<{
1257
+ name: "excerpt";
1258
+ tableName: "bp_articles";
1259
+ dataType: "string";
1260
+ columnType: "SQLiteText";
1261
+ data: string;
1262
+ driverParam: string;
1263
+ notNull: true;
1264
+ hasDefault: false;
1265
+ isPrimaryKey: false;
1266
+ isAutoincrement: false;
1267
+ hasRuntimeDefault: false;
1268
+ enumValues: [string, ...string[]];
1269
+ baseColumn: never;
1270
+ identity: undefined;
1271
+ generated: undefined;
1272
+ }, {}, {
1273
+ length: number | undefined;
1274
+ }>;
1275
+ content: drizzle_orm_sqlite_core.SQLiteColumn<{
1276
+ name: "content";
1277
+ tableName: "bp_articles";
1278
+ dataType: "string";
1279
+ columnType: "SQLiteText";
1280
+ data: string;
1281
+ driverParam: string;
1282
+ notNull: true;
1283
+ hasDefault: false;
1284
+ isPrimaryKey: false;
1285
+ isAutoincrement: false;
1286
+ hasRuntimeDefault: false;
1287
+ enumValues: [string, ...string[]];
1288
+ baseColumn: never;
1289
+ identity: undefined;
1290
+ generated: undefined;
1291
+ }, {}, {
1292
+ length: number | undefined;
1293
+ }>;
1294
+ readingSeconds: drizzle_orm_sqlite_core.SQLiteColumn<{
1295
+ name: "reading_seconds";
1296
+ tableName: "bp_articles";
1297
+ dataType: "number";
1298
+ columnType: "SQLiteInteger";
1299
+ data: number;
1300
+ driverParam: number;
1301
+ notNull: true;
1302
+ hasDefault: false;
1303
+ isPrimaryKey: false;
1304
+ isAutoincrement: false;
1305
+ hasRuntimeDefault: false;
1306
+ enumValues: undefined;
1307
+ baseColumn: never;
1308
+ identity: undefined;
1309
+ generated: undefined;
1310
+ }, {}, {}>;
1311
+ wordCount: drizzle_orm_sqlite_core.SQLiteColumn<{
1312
+ name: "word_count";
1313
+ tableName: "bp_articles";
1314
+ dataType: "number";
1315
+ columnType: "SQLiteInteger";
1316
+ data: number;
1317
+ driverParam: number;
1318
+ notNull: true;
1319
+ hasDefault: false;
1320
+ isPrimaryKey: false;
1321
+ isAutoincrement: false;
1322
+ hasRuntimeDefault: false;
1323
+ enumValues: undefined;
1324
+ baseColumn: never;
1325
+ identity: undefined;
1326
+ generated: undefined;
1327
+ }, {}, {}>;
1328
+ publishedAt: drizzle_orm_sqlite_core.SQLiteColumn<{
1329
+ name: "published_at";
1330
+ tableName: "bp_articles";
1331
+ dataType: "string";
1332
+ columnType: "SQLiteText";
1333
+ data: string;
1334
+ driverParam: string;
1335
+ notNull: true;
1336
+ hasDefault: false;
1337
+ isPrimaryKey: false;
1338
+ isAutoincrement: false;
1339
+ hasRuntimeDefault: false;
1340
+ enumValues: [string, ...string[]];
1341
+ baseColumn: never;
1342
+ identity: undefined;
1343
+ generated: undefined;
1344
+ }, {}, {
1345
+ length: number | undefined;
1346
+ }>;
1347
+ updatedAt: drizzle_orm_sqlite_core.SQLiteColumn<{
1348
+ name: "updated_at";
1349
+ tableName: "bp_articles";
1350
+ dataType: "string";
1351
+ columnType: "SQLiteText";
1352
+ data: string;
1353
+ driverParam: string;
1354
+ notNull: true;
1355
+ hasDefault: false;
1356
+ isPrimaryKey: false;
1357
+ isAutoincrement: false;
1358
+ hasRuntimeDefault: false;
1359
+ enumValues: [string, ...string[]];
1360
+ baseColumn: never;
1361
+ identity: undefined;
1362
+ generated: undefined;
1363
+ }, {}, {
1364
+ length: number | undefined;
1365
+ }>;
1366
+ featuredImage: drizzle_orm_sqlite_core.SQLiteColumn<{
1367
+ name: "featured_image";
1368
+ tableName: "bp_articles";
1369
+ dataType: "string";
1370
+ columnType: "SQLiteText";
1371
+ data: string;
1372
+ driverParam: string;
1373
+ notNull: false;
1374
+ hasDefault: false;
1375
+ isPrimaryKey: false;
1376
+ isAutoincrement: false;
1377
+ hasRuntimeDefault: false;
1378
+ enumValues: [string, ...string[]];
1379
+ baseColumn: never;
1380
+ identity: undefined;
1381
+ generated: undefined;
1382
+ }, {}, {
1383
+ length: number | undefined;
1384
+ }>;
1385
+ featuredImageAlt: drizzle_orm_sqlite_core.SQLiteColumn<{
1386
+ name: "featured_image_alt";
1387
+ tableName: "bp_articles";
1388
+ dataType: "string";
1389
+ columnType: "SQLiteText";
1390
+ data: string;
1391
+ driverParam: string;
1392
+ notNull: false;
1393
+ hasDefault: false;
1394
+ isPrimaryKey: false;
1395
+ isAutoincrement: false;
1396
+ hasRuntimeDefault: false;
1397
+ enumValues: [string, ...string[]];
1398
+ baseColumn: never;
1399
+ identity: undefined;
1400
+ generated: undefined;
1401
+ }, {}, {
1402
+ length: number | undefined;
1403
+ }>;
1404
+ featuredImageCaption: drizzle_orm_sqlite_core.SQLiteColumn<{
1405
+ name: "featured_image_caption";
1406
+ tableName: "bp_articles";
1407
+ dataType: "string";
1408
+ columnType: "SQLiteText";
1409
+ data: string;
1410
+ driverParam: string;
1411
+ notNull: false;
1412
+ hasDefault: false;
1413
+ isPrimaryKey: false;
1414
+ isAutoincrement: false;
1415
+ hasRuntimeDefault: false;
1416
+ enumValues: [string, ...string[]];
1417
+ baseColumn: never;
1418
+ identity: undefined;
1419
+ generated: undefined;
1420
+ }, {}, {
1421
+ length: number | undefined;
1422
+ }>;
1423
+ featuredImageCreditText: drizzle_orm_sqlite_core.SQLiteColumn<{
1424
+ name: "featured_image_credit_text";
1425
+ tableName: "bp_articles";
1426
+ dataType: "string";
1427
+ columnType: "SQLiteText";
1428
+ data: string;
1429
+ driverParam: string;
1430
+ notNull: false;
1431
+ hasDefault: false;
1432
+ isPrimaryKey: false;
1433
+ isAutoincrement: false;
1434
+ hasRuntimeDefault: false;
1435
+ enumValues: [string, ...string[]];
1436
+ baseColumn: never;
1437
+ identity: undefined;
1438
+ generated: undefined;
1439
+ }, {}, {
1440
+ length: number | undefined;
1441
+ }>;
1442
+ featuredImageCreditUrl: drizzle_orm_sqlite_core.SQLiteColumn<{
1443
+ name: "featured_image_credit_url";
1444
+ tableName: "bp_articles";
1445
+ dataType: "string";
1446
+ columnType: "SQLiteText";
1447
+ data: string;
1448
+ driverParam: string;
1449
+ notNull: false;
1450
+ hasDefault: false;
1451
+ isPrimaryKey: false;
1452
+ isAutoincrement: false;
1453
+ hasRuntimeDefault: false;
1454
+ enumValues: [string, ...string[]];
1455
+ baseColumn: never;
1456
+ identity: undefined;
1457
+ generated: undefined;
1458
+ }, {}, {
1459
+ length: number | undefined;
1460
+ }>;
1461
+ authorJson: drizzle_orm_sqlite_core.SQLiteColumn<{
1462
+ name: "author_json";
1463
+ tableName: "bp_articles";
1464
+ dataType: "string";
1465
+ columnType: "SQLiteText";
1466
+ data: string;
1467
+ driverParam: string;
1468
+ notNull: false;
1469
+ hasDefault: false;
1470
+ isPrimaryKey: false;
1471
+ isAutoincrement: false;
1472
+ hasRuntimeDefault: false;
1473
+ enumValues: [string, ...string[]];
1474
+ baseColumn: never;
1475
+ identity: undefined;
1476
+ generated: undefined;
1477
+ }, {}, {
1478
+ length: number | undefined;
1479
+ }>;
1480
+ siteJson: drizzle_orm_sqlite_core.SQLiteColumn<{
1481
+ name: "site_json";
1482
+ tableName: "bp_articles";
1483
+ dataType: "string";
1484
+ columnType: "SQLiteText";
1485
+ data: string;
1486
+ driverParam: string;
1487
+ notNull: true;
1488
+ hasDefault: false;
1489
+ isPrimaryKey: false;
1490
+ isAutoincrement: false;
1491
+ hasRuntimeDefault: false;
1492
+ enumValues: [string, ...string[]];
1493
+ baseColumn: never;
1494
+ identity: undefined;
1495
+ generated: undefined;
1496
+ }, {}, {
1497
+ length: number | undefined;
1498
+ }>;
1499
+ metaJson: drizzle_orm_sqlite_core.SQLiteColumn<{
1500
+ name: "meta_json";
1501
+ tableName: "bp_articles";
1502
+ dataType: "string";
1503
+ columnType: "SQLiteText";
1504
+ data: string;
1505
+ driverParam: string;
1506
+ notNull: true;
1507
+ hasDefault: false;
1508
+ isPrimaryKey: false;
1509
+ isAutoincrement: false;
1510
+ hasRuntimeDefault: false;
1511
+ enumValues: [string, ...string[]];
1512
+ baseColumn: never;
1513
+ identity: undefined;
1514
+ generated: undefined;
1515
+ }, {}, {
1516
+ length: number | undefined;
1517
+ }>;
1518
+ version: drizzle_orm_sqlite_core.SQLiteColumn<{
1519
+ name: "version";
1520
+ tableName: "bp_articles";
1521
+ dataType: "number";
1522
+ columnType: "SQLiteInteger";
1523
+ data: number;
1524
+ driverParam: number;
1525
+ notNull: true;
1526
+ hasDefault: false;
1527
+ isPrimaryKey: false;
1528
+ isAutoincrement: false;
1529
+ hasRuntimeDefault: false;
1530
+ enumValues: undefined;
1531
+ baseColumn: never;
1532
+ identity: undefined;
1533
+ generated: undefined;
1534
+ }, {}, {}>;
1535
+ };
1536
+ dialect: "sqlite";
1537
+ }>;
1538
+ readonly bpOperations: drizzle_orm_sqlite_core.SQLiteTableWithColumns<{
1539
+ name: "bp_operations";
1540
+ schema: undefined;
1541
+ columns: {
1542
+ key: drizzle_orm_sqlite_core.SQLiteColumn<{
1543
+ name: "key";
1544
+ tableName: "bp_operations";
1545
+ dataType: "string";
1546
+ columnType: "SQLiteText";
1547
+ data: string;
1548
+ driverParam: string;
1549
+ notNull: true;
1550
+ hasDefault: false;
1551
+ isPrimaryKey: true;
1552
+ isAutoincrement: false;
1553
+ hasRuntimeDefault: false;
1554
+ enumValues: [string, ...string[]];
1555
+ baseColumn: never;
1556
+ identity: undefined;
1557
+ generated: undefined;
1558
+ }, {}, {
1559
+ length: number | undefined;
1560
+ }>;
1561
+ resultJson: drizzle_orm_sqlite_core.SQLiteColumn<{
1562
+ name: "result_json";
1563
+ tableName: "bp_operations";
1564
+ dataType: "string";
1565
+ columnType: "SQLiteText";
1566
+ data: string;
1567
+ driverParam: string;
1568
+ notNull: true;
1569
+ hasDefault: false;
1570
+ isPrimaryKey: false;
1571
+ isAutoincrement: false;
1572
+ hasRuntimeDefault: false;
1573
+ enumValues: [string, ...string[]];
1574
+ baseColumn: never;
1575
+ identity: undefined;
1576
+ generated: undefined;
1577
+ }, {}, {
1578
+ length: number | undefined;
1579
+ }>;
1580
+ createdAt: drizzle_orm_sqlite_core.SQLiteColumn<{
1581
+ name: "created_at";
1582
+ tableName: "bp_operations";
1583
+ dataType: "date";
1584
+ columnType: "SQLiteTimestamp";
1585
+ data: Date;
1586
+ driverParam: number;
1587
+ notNull: true;
1588
+ hasDefault: false;
1589
+ isPrimaryKey: false;
1590
+ isAutoincrement: false;
1591
+ hasRuntimeDefault: false;
1592
+ enumValues: undefined;
1593
+ baseColumn: never;
1594
+ identity: undefined;
1595
+ generated: undefined;
1596
+ }, {}, {}>;
1597
+ expiresAt: drizzle_orm_sqlite_core.SQLiteColumn<{
1598
+ name: "expires_at";
1599
+ tableName: "bp_operations";
1600
+ dataType: "date";
1601
+ columnType: "SQLiteTimestamp";
1602
+ data: Date;
1603
+ driverParam: number;
1604
+ notNull: false;
1605
+ hasDefault: false;
1606
+ isPrimaryKey: false;
1607
+ isAutoincrement: false;
1608
+ hasRuntimeDefault: false;
1609
+ enumValues: undefined;
1610
+ baseColumn: never;
1611
+ identity: undefined;
1612
+ generated: undefined;
1613
+ }, {}, {}>;
1614
+ };
1615
+ dialect: "sqlite";
1616
+ }>;
1617
+ readonly bpMetadata: drizzle_orm_sqlite_core.SQLiteTableWithColumns<{
1618
+ name: "bp_metadata";
1619
+ schema: undefined;
1620
+ columns: {
1621
+ key: drizzle_orm_sqlite_core.SQLiteColumn<{
1622
+ name: "key";
1623
+ tableName: "bp_metadata";
1624
+ dataType: "string";
1625
+ columnType: "SQLiteText";
1626
+ data: string;
1627
+ driverParam: string;
1628
+ notNull: true;
1629
+ hasDefault: false;
1630
+ isPrimaryKey: true;
1631
+ isAutoincrement: false;
1632
+ hasRuntimeDefault: false;
1633
+ enumValues: [string, ...string[]];
1634
+ baseColumn: never;
1635
+ identity: undefined;
1636
+ generated: undefined;
1637
+ }, {}, {
1638
+ length: number | undefined;
1639
+ }>;
1640
+ valueJson: drizzle_orm_sqlite_core.SQLiteColumn<{
1641
+ name: "value_json";
1642
+ tableName: "bp_metadata";
1643
+ dataType: "string";
1644
+ columnType: "SQLiteText";
1645
+ data: string;
1646
+ driverParam: string;
1647
+ notNull: true;
1648
+ hasDefault: false;
1649
+ isPrimaryKey: false;
1650
+ isAutoincrement: false;
1651
+ hasRuntimeDefault: false;
1652
+ enumValues: [string, ...string[]];
1653
+ baseColumn: never;
1654
+ identity: undefined;
1655
+ generated: undefined;
1656
+ }, {}, {
1657
+ length: number | undefined;
1658
+ }>;
1659
+ updatedAt: drizzle_orm_sqlite_core.SQLiteColumn<{
1660
+ name: "updated_at";
1661
+ tableName: "bp_metadata";
1662
+ dataType: "date";
1663
+ columnType: "SQLiteTimestamp";
1664
+ data: Date;
1665
+ driverParam: number;
1666
+ notNull: true;
1667
+ hasDefault: false;
1668
+ isPrimaryKey: false;
1669
+ isAutoincrement: false;
1670
+ hasRuntimeDefault: false;
1671
+ enumValues: undefined;
1672
+ baseColumn: never;
1673
+ identity: undefined;
1674
+ generated: undefined;
1675
+ }, {}, {}>;
1676
+ };
1677
+ dialect: "sqlite";
1678
+ }>;
1679
+ };
1118
1680
  interface DrizzleStorageOptions {
1119
1681
  operationTtlMs?: number;
1120
1682
  }
1683
+ interface BlogPlatformSchemaCheckResult {
1684
+ ok: boolean;
1685
+ schemaVersion: number;
1686
+ requiredTables: readonly BlogPlatformTableName[];
1687
+ presentTables: BlogPlatformTableName[];
1688
+ missingTables: BlogPlatformTableName[];
1689
+ setupSql: string[];
1690
+ }
1691
+ declare class BlogPlatformSchemaError extends Error {
1692
+ readonly code = "BLOG_PLATFORM_SCHEMA_MISSING";
1693
+ readonly missingTables: BlogPlatformTableName[];
1694
+ readonly setupSql: string[];
1695
+ constructor(missingTables: BlogPlatformTableName[], options?: {
1696
+ cause?: unknown;
1697
+ });
1698
+ }
1121
1699
  /**
1122
1700
  * Drizzle-backed durable storage adapter.
1123
1701
  * Pass a Drizzle Database instance created with drizzle-orm/libsql.
@@ -1140,14 +1718,22 @@ declare class DrizzleStorage implements BlogPlatformStorage {
1140
1718
  removeArticle(slug: string, idempotencyKey: string): Promise<PublishResult>;
1141
1719
  checkIdempotency(idempotencyKey: string): Promise<PublishResult | null>;
1142
1720
  storeOperationResult(idempotencyKey: string, result: PublishResult): Promise<void>;
1721
+ setMetadata(key: string, value: unknown): Promise<void>;
1722
+ getMetadata<T = unknown>(key: string): Promise<T | null>;
1143
1723
  }
1724
+ declare function checkDrizzleAdapterSchema(db: LibSQLDatabase): Promise<BlogPlatformSchemaCheckResult>;
1725
+ declare function ensureDrizzleAdapterSchema(db: LibSQLDatabase): Promise<void>;
1144
1726
  /**
1145
1727
  * Helper: Return SQL strings for creating required tables.
1146
1728
  * Consumers can embed these in their migrations.
1147
1729
  */
1148
1730
  declare function getDrizzleAdapterSql(): {
1731
+ schemaVersion: number;
1732
+ requiredTableNames: readonly BlogPlatformTableName[];
1733
+ createAll: string[];
1149
1734
  createArticles: string;
1150
1735
  createOperations: string;
1736
+ createMetadata: string;
1151
1737
  };
1152
1738
 
1153
1739
  /**
@@ -1515,7 +2101,7 @@ declare function safeGenerateArticleStructuredData(article: PublishedArticle, op
1515
2101
  * - idempotencyKey: SHA-256 hash for duplicate prevention
1516
2102
  * - Optional overrides for slug, meta description, etc.
1517
2103
  */
1518
- declare function POST$1(request: NextRequest): Promise<NextResponse<PublishResult>>;
2104
+ declare function POST$2(request: NextRequest): Promise<NextResponse<PublishResult>>;
1519
2105
 
1520
2106
  /**
1521
2107
  * POST /api/blog/unpublish
@@ -1528,7 +2114,7 @@ declare function POST$1(request: NextRequest): Promise<NextResponse<PublishResul
1528
2114
  * - idempotencyKey: SHA-256 hash for duplicate prevention
1529
2115
  * - Optional dry run flag for validation
1530
2116
  */
1531
- declare function POST(request: NextRequest): Promise<NextResponse<PublishResult>>;
2117
+ declare function POST$1(request: NextRequest): Promise<NextResponse<PublishResult>>;
1532
2118
 
1533
2119
  /**
1534
2120
  * Version information
@@ -1571,7 +2157,21 @@ interface VersionResponse {
1571
2157
  * Optional X-Bloggy-Version header can be provided to check compatibility
1572
2158
  * with specific versions.
1573
2159
  */
1574
- declare function GET$1(request: NextRequest): Promise<NextResponse<VersionResponse>>;
2160
+ declare function GET$2(request: NextRequest): Promise<NextResponse<VersionResponse>>;
2161
+
2162
+ interface ConfigResponse {
2163
+ success: boolean;
2164
+ updated?: string[];
2165
+ error?: {
2166
+ code: string;
2167
+ message: string;
2168
+ details?: Record<string, unknown>;
2169
+ };
2170
+ }
2171
+ declare function POST(request: NextRequest): Promise<NextResponse<ConfigResponse>>;
2172
+ declare function OPTIONS$1(request: NextRequest): Promise<NextResponse>;
2173
+
2174
+ declare function GET$1(_request: NextRequest): Promise<NextResponse>;
1575
2175
 
1576
2176
  /**
1577
2177
  * GET /api/blog/slugs/{slug}
@@ -1603,4 +2203,4 @@ declare function OPTIONS(request: NextRequest): Promise<NextResponse>;
1603
2203
 
1604
2204
  declare const PACKAGE_VERSION: string;
1605
2205
 
1606
- 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 };
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 };