@xexr/blog-platform 1.0.17 → 1.1.1
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 +12 -0
- package/README.md +94 -5
- package/dist/app/api/blog/config/route.ts +259 -0
- package/dist/app/api/blog/publish/route.ts +1 -1
- package/dist/app/api/blog/slugs/[slug]/route.ts +1 -1
- package/dist/app/api/blog/unpublish/route.ts +1 -1
- package/dist/app/api/blog/version/route.ts +1 -1
- package/dist/app/blog/[slug]/page.mdx-security.test.ts +23 -0
- package/dist/app/blog/[slug]/page.tsx +2 -2
- package/dist/app/blog/authors/[slug]/page.tsx +2 -2
- package/dist/app/blog/page.tsx +2 -2
- package/dist/app/bloggy-indexnow-key.txt/route.ts +22 -0
- package/dist/components/AuthorByline.tsx +1 -1
- package/dist/components/AuthorPages.tsx +2 -2
- package/dist/components/TopicArchivePages.tsx +2 -2
- package/dist/index.d.mts +605 -5
- package/dist/index.d.ts +605 -5
- package/dist/index.js +20 -12
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +20 -12
- package/dist/index.mjs.map +1 -1
- package/dist/lib/auth.ts +1 -1
- package/dist/lib/cors.ts +2 -2
- package/dist/lib/database.ts +20 -0
- package/dist/lib/security-headers.ts +1 -1
- package/dist/lib/storage/drizzle.ts +229 -18
- package/dist/lib/structured-data.ts +6 -1
- package/dist/sitemap.js +5 -5
- package/dist/sitemap.mjs +5 -5
- package/dist/types/contracts.ts +21 -0
- package/package.json +1 -1
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$
|
|
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$
|
|
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$
|
|
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 };
|