nextblogkit 0.6.2 → 0.7.2

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 (113) hide show
  1. package/README.md +84 -21
  2. package/dist/admin/index.cjs +656 -115
  3. package/dist/admin/index.cjs.map +1 -1
  4. package/dist/admin/index.d.cts +7 -3
  5. package/dist/admin/index.d.ts +7 -3
  6. package/dist/admin/index.js +575 -37
  7. package/dist/admin/index.js.map +1 -1
  8. package/dist/api/categories.cjs +32 -32
  9. package/dist/api/categories.cjs.map +1 -1
  10. package/dist/api/categories.d.cts +1 -1
  11. package/dist/api/categories.d.ts +1 -1
  12. package/dist/api/categories.js +6 -6
  13. package/dist/api/categories.js.map +1 -1
  14. package/dist/api/media.cjs +37 -30
  15. package/dist/api/media.cjs.map +1 -1
  16. package/dist/api/media.d.cts +1 -1
  17. package/dist/api/media.d.ts +1 -1
  18. package/dist/api/media.js +13 -6
  19. package/dist/api/media.js.map +1 -1
  20. package/dist/api/posts.cjs +39 -39
  21. package/dist/api/posts.cjs.map +1 -1
  22. package/dist/api/posts.d.cts +1 -1
  23. package/dist/api/posts.d.ts +1 -1
  24. package/dist/api/posts.js +6 -6
  25. package/dist/api/posts.js.map +1 -1
  26. package/dist/api/rss.cjs +3 -3
  27. package/dist/api/rss.js +2 -2
  28. package/dist/api/settings.cjs +13 -13
  29. package/dist/api/settings.cjs.map +1 -1
  30. package/dist/api/settings.d.cts +1 -1
  31. package/dist/api/settings.d.ts +1 -1
  32. package/dist/api/settings.js +5 -5
  33. package/dist/api/settings.js.map +1 -1
  34. package/dist/api/sitemap.cjs +3 -3
  35. package/dist/api/sitemap.js +2 -2
  36. package/dist/api/tokens.cjs +56 -0
  37. package/dist/api/tokens.cjs.map +1 -0
  38. package/dist/api/tokens.d.cts +22 -0
  39. package/dist/api/tokens.d.ts +22 -0
  40. package/dist/api/tokens.js +52 -0
  41. package/dist/api/tokens.js.map +1 -0
  42. package/dist/{chunk-6HKMZOI4.cjs → chunk-3BKPNOES.cjs} +8 -7
  43. package/dist/chunk-3BKPNOES.cjs.map +1 -0
  44. package/dist/{chunk-N5MKAD7J.cjs → chunk-DR7QNI32.cjs} +6 -2
  45. package/dist/chunk-DR7QNI32.cjs.map +1 -0
  46. package/dist/{chunk-QE4VLQYN.cjs → chunk-F47RPOTU.cjs} +13 -10
  47. package/dist/chunk-F47RPOTU.cjs.map +1 -0
  48. package/dist/{chunk-64HUVJOZ.js → chunk-JI2RK6KX.js} +80 -13
  49. package/dist/chunk-JI2RK6KX.js.map +1 -0
  50. package/dist/{chunk-R6MO3QIP.js → chunk-NSR7NYSB.js} +6 -5
  51. package/dist/chunk-NSR7NYSB.js.map +1 -0
  52. package/dist/{chunk-4PY224XM.js → chunk-O3XES5O2.js} +6 -3
  53. package/dist/chunk-O3XES5O2.js.map +1 -0
  54. package/dist/{chunk-4NKOJYWJ.js → chunk-OOUJYUGP.js} +8 -7
  55. package/dist/chunk-OOUJYUGP.js.map +1 -0
  56. package/dist/{chunk-A2S32RZN.js → chunk-OWWWTTUT.js} +8 -3
  57. package/dist/chunk-OWWWTTUT.js.map +1 -0
  58. package/dist/{chunk-E2QLTHKN.cjs → chunk-QBZLGBHQ.cjs} +11 -10
  59. package/dist/chunk-QBZLGBHQ.cjs.map +1 -0
  60. package/dist/{chunk-ZP5XRVVH.cjs → chunk-SUJT6LWH.cjs} +12 -7
  61. package/dist/chunk-SUJT6LWH.cjs.map +1 -0
  62. package/dist/{chunk-JM7QRXXK.js → chunk-TVHY4BR2.js} +10 -7
  63. package/dist/chunk-TVHY4BR2.js.map +1 -0
  64. package/dist/{chunk-JLPJKNRZ.js → chunk-UMIBGO4S.js} +18 -5
  65. package/dist/chunk-UMIBGO4S.js.map +1 -0
  66. package/dist/{chunk-U2ROR6AY.cjs → chunk-VWKVU3SE.cjs} +86 -12
  67. package/dist/chunk-VWKVU3SE.cjs.map +1 -0
  68. package/dist/{chunk-KDZER3PU.cjs → chunk-YTJQ426D.cjs} +19 -5
  69. package/dist/chunk-YTJQ426D.cjs.map +1 -0
  70. package/dist/cli/index.cjs +90 -19
  71. package/dist/components/index.cjs +12 -6
  72. package/dist/components/index.cjs.map +1 -1
  73. package/dist/components/index.d.cts +2 -1
  74. package/dist/components/index.d.ts +2 -1
  75. package/dist/components/index.js +12 -6
  76. package/dist/components/index.js.map +1 -1
  77. package/dist/db-OUSQPM53.js +3 -0
  78. package/dist/db-OUSQPM53.js.map +1 -0
  79. package/dist/db-RFY6O5UE.cjs +108 -0
  80. package/dist/db-RFY6O5UE.cjs.map +1 -0
  81. package/dist/editor/index.cjs +49 -12
  82. package/dist/editor/index.cjs.map +1 -1
  83. package/dist/editor/index.d.cts +5 -1
  84. package/dist/editor/index.d.ts +5 -1
  85. package/dist/editor/index.js +37 -1
  86. package/dist/editor/index.js.map +1 -1
  87. package/dist/{index-vjlZDWNr.d.cts → index-Bk8gOqBq.d.cts} +25 -21
  88. package/dist/{index-Cgzphklp.d.ts → index-DsnG2kdW.d.ts} +25 -21
  89. package/dist/index.cjs +47 -47
  90. package/dist/index.d.cts +3 -3
  91. package/dist/index.d.ts +3 -3
  92. package/dist/index.js +5 -5
  93. package/dist/lib/index.cjs +39 -35
  94. package/dist/lib/index.d.cts +2 -2
  95. package/dist/lib/index.d.ts +2 -2
  96. package/dist/lib/index.js +5 -5
  97. package/dist/{types-CBEEBR4A.d.ts → types-Cu515Egx.d.cts} +16 -1
  98. package/dist/{types-CBEEBR4A.d.cts → types-Cu515Egx.d.ts} +16 -1
  99. package/package.json +1 -1
  100. package/dist/chunk-4NKOJYWJ.js.map +0 -1
  101. package/dist/chunk-4PY224XM.js.map +0 -1
  102. package/dist/chunk-64HUVJOZ.js.map +0 -1
  103. package/dist/chunk-6HKMZOI4.cjs.map +0 -1
  104. package/dist/chunk-A2S32RZN.js.map +0 -1
  105. package/dist/chunk-E2QLTHKN.cjs.map +0 -1
  106. package/dist/chunk-JLPJKNRZ.js.map +0 -1
  107. package/dist/chunk-JM7QRXXK.js.map +0 -1
  108. package/dist/chunk-KDZER3PU.cjs.map +0 -1
  109. package/dist/chunk-N5MKAD7J.cjs.map +0 -1
  110. package/dist/chunk-QE4VLQYN.cjs.map +0 -1
  111. package/dist/chunk-R6MO3QIP.js.map +0 -1
  112. package/dist/chunk-U2ROR6AY.cjs.map +0 -1
  113. package/dist/chunk-ZP5XRVVH.cjs.map +0 -1
package/dist/index.cjs CHANGED
@@ -1,10 +1,10 @@
1
1
  'use strict';
2
2
 
3
- var chunkQE4VLQYN_cjs = require('./chunk-QE4VLQYN.cjs');
4
- var chunkZP5XRVVH_cjs = require('./chunk-ZP5XRVVH.cjs');
5
- var chunkE2QLTHKN_cjs = require('./chunk-E2QLTHKN.cjs');
6
- var chunk6HKMZOI4_cjs = require('./chunk-6HKMZOI4.cjs');
7
- var chunkU2ROR6AY_cjs = require('./chunk-U2ROR6AY.cjs');
3
+ var chunkF47RPOTU_cjs = require('./chunk-F47RPOTU.cjs');
4
+ var chunk3BKPNOES_cjs = require('./chunk-3BKPNOES.cjs');
5
+ var chunkSUJT6LWH_cjs = require('./chunk-SUJT6LWH.cjs');
6
+ var chunkQBZLGBHQ_cjs = require('./chunk-QBZLGBHQ.cjs');
7
+ var chunkVWKVU3SE_cjs = require('./chunk-VWKVU3SE.cjs');
8
8
 
9
9
  // src/editor/renderer.ts
10
10
  function renderBlocksToHTML(doc) {
@@ -207,159 +207,159 @@ function extractFAQItems(doc) {
207
207
 
208
208
  Object.defineProperty(exports, "calculateSEOScore", {
209
209
  enumerable: true,
210
- get: function () { return chunkQE4VLQYN_cjs.calculateSEOScore; }
210
+ get: function () { return chunkF47RPOTU_cjs.calculateSEOScore; }
211
211
  });
212
212
  Object.defineProperty(exports, "generateBreadcrumbs", {
213
213
  enumerable: true,
214
- get: function () { return chunkQE4VLQYN_cjs.generateBreadcrumbs; }
214
+ get: function () { return chunkF47RPOTU_cjs.generateBreadcrumbs; }
215
215
  });
216
216
  Object.defineProperty(exports, "generateFAQStructuredData", {
217
217
  enumerable: true,
218
- get: function () { return chunkQE4VLQYN_cjs.generateFAQStructuredData; }
218
+ get: function () { return chunkF47RPOTU_cjs.generateFAQStructuredData; }
219
219
  });
220
220
  Object.defineProperty(exports, "generateMetaTags", {
221
221
  enumerable: true,
222
- get: function () { return chunkQE4VLQYN_cjs.generateMetaTags; }
222
+ get: function () { return chunkF47RPOTU_cjs.generateMetaTags; }
223
223
  });
224
224
  Object.defineProperty(exports, "generateStructuredData", {
225
225
  enumerable: true,
226
- get: function () { return chunkQE4VLQYN_cjs.generateStructuredData; }
226
+ get: function () { return chunkF47RPOTU_cjs.generateStructuredData; }
227
227
  });
228
228
  Object.defineProperty(exports, "searchPosts", {
229
229
  enumerable: true,
230
- get: function () { return chunkQE4VLQYN_cjs.searchPosts; }
230
+ get: function () { return chunkF47RPOTU_cjs.searchPosts; }
231
+ });
232
+ Object.defineProperty(exports, "generateRSSFeed", {
233
+ enumerable: true,
234
+ get: function () { return chunk3BKPNOES_cjs.generateRSSFeed; }
231
235
  });
232
236
  Object.defineProperty(exports, "R2StorageProvider", {
233
237
  enumerable: true,
234
- get: function () { return chunkZP5XRVVH_cjs.R2StorageProvider; }
238
+ get: function () { return chunkSUJT6LWH_cjs.R2StorageProvider; }
235
239
  });
236
240
  Object.defineProperty(exports, "processImage", {
237
241
  enumerable: true,
238
- get: function () { return chunkZP5XRVVH_cjs.processImage; }
242
+ get: function () { return chunkSUJT6LWH_cjs.processImage; }
239
243
  });
240
244
  Object.defineProperty(exports, "generateSitemap", {
241
245
  enumerable: true,
242
- get: function () { return chunkE2QLTHKN_cjs.generateSitemap; }
243
- });
244
- Object.defineProperty(exports, "generateRSSFeed", {
245
- enumerable: true,
246
- get: function () { return chunk6HKMZOI4_cjs.generateRSSFeed; }
246
+ get: function () { return chunkQBZLGBHQ_cjs.generateSitemap; }
247
247
  });
248
248
  Object.defineProperty(exports, "calculateReadingTime", {
249
249
  enumerable: true,
250
- get: function () { return chunkU2ROR6AY_cjs.calculateReadingTime; }
250
+ get: function () { return chunkVWKVU3SE_cjs.calculateReadingTime; }
251
251
  });
252
252
  Object.defineProperty(exports, "countWords", {
253
253
  enumerable: true,
254
- get: function () { return chunkU2ROR6AY_cjs.countWords; }
254
+ get: function () { return chunkVWKVU3SE_cjs.countWords; }
255
255
  });
256
256
  Object.defineProperty(exports, "createCategory", {
257
257
  enumerable: true,
258
- get: function () { return chunkU2ROR6AY_cjs.createCategory; }
258
+ get: function () { return chunkVWKVU3SE_cjs.createCategory; }
259
259
  });
260
260
  Object.defineProperty(exports, "createMedia", {
261
261
  enumerable: true,
262
- get: function () { return chunkU2ROR6AY_cjs.createMedia; }
262
+ get: function () { return chunkVWKVU3SE_cjs.createMedia; }
263
263
  });
264
264
  Object.defineProperty(exports, "createPost", {
265
265
  enumerable: true,
266
- get: function () { return chunkU2ROR6AY_cjs.createPost; }
266
+ get: function () { return chunkVWKVU3SE_cjs.createPost; }
267
267
  });
268
268
  Object.defineProperty(exports, "defineConfig", {
269
269
  enumerable: true,
270
- get: function () { return chunkU2ROR6AY_cjs.defineConfig; }
270
+ get: function () { return chunkVWKVU3SE_cjs.defineConfig; }
271
271
  });
272
272
  Object.defineProperty(exports, "deleteCategory", {
273
273
  enumerable: true,
274
- get: function () { return chunkU2ROR6AY_cjs.deleteCategory; }
274
+ get: function () { return chunkVWKVU3SE_cjs.deleteCategory; }
275
275
  });
276
276
  Object.defineProperty(exports, "deleteMedia", {
277
277
  enumerable: true,
278
- get: function () { return chunkU2ROR6AY_cjs.deleteMedia; }
278
+ get: function () { return chunkVWKVU3SE_cjs.deleteMedia; }
279
279
  });
280
280
  Object.defineProperty(exports, "deletePost", {
281
281
  enumerable: true,
282
- get: function () { return chunkU2ROR6AY_cjs.deletePost; }
282
+ get: function () { return chunkVWKVU3SE_cjs.deletePost; }
283
283
  });
284
284
  Object.defineProperty(exports, "ensureIndexes", {
285
285
  enumerable: true,
286
- get: function () { return chunkU2ROR6AY_cjs.ensureIndexes; }
286
+ get: function () { return chunkVWKVU3SE_cjs.ensureIndexes; }
287
287
  });
288
288
  Object.defineProperty(exports, "ensureUniqueSlug", {
289
289
  enumerable: true,
290
- get: function () { return chunkU2ROR6AY_cjs.ensureUniqueSlug; }
290
+ get: function () { return chunkVWKVU3SE_cjs.ensureUniqueSlug; }
291
291
  });
292
292
  Object.defineProperty(exports, "extractTextFromBlocks", {
293
293
  enumerable: true,
294
- get: function () { return chunkU2ROR6AY_cjs.extractTextFromBlocks; }
294
+ get: function () { return chunkVWKVU3SE_cjs.extractTextFromBlocks; }
295
295
  });
296
296
  Object.defineProperty(exports, "extractTextFromHTML", {
297
297
  enumerable: true,
298
- get: function () { return chunkU2ROR6AY_cjs.extractTextFromHTML; }
298
+ get: function () { return chunkVWKVU3SE_cjs.extractTextFromHTML; }
299
299
  });
300
300
  Object.defineProperty(exports, "generateSlug", {
301
301
  enumerable: true,
302
- get: function () { return chunkU2ROR6AY_cjs.generateSlug; }
302
+ get: function () { return chunkVWKVU3SE_cjs.generateSlug; }
303
303
  });
304
304
  Object.defineProperty(exports, "getBlogConfig", {
305
305
  enumerable: true,
306
- get: function () { return chunkU2ROR6AY_cjs.getBlogConfig; }
306
+ get: function () { return chunkVWKVU3SE_cjs.getBlogConfig; }
307
307
  });
308
308
  Object.defineProperty(exports, "getCategoryBySlug", {
309
309
  enumerable: true,
310
- get: function () { return chunkU2ROR6AY_cjs.getCategoryBySlug; }
310
+ get: function () { return chunkVWKVU3SE_cjs.getCategoryBySlug; }
311
311
  });
312
312
  Object.defineProperty(exports, "getCollection", {
313
313
  enumerable: true,
314
- get: function () { return chunkU2ROR6AY_cjs.getCollection; }
314
+ get: function () { return chunkVWKVU3SE_cjs.getCollection; }
315
315
  });
316
316
  Object.defineProperty(exports, "getConfig", {
317
317
  enumerable: true,
318
- get: function () { return chunkU2ROR6AY_cjs.getConfig; }
318
+ get: function () { return chunkVWKVU3SE_cjs.getConfig; }
319
319
  });
320
320
  Object.defineProperty(exports, "getDb", {
321
321
  enumerable: true,
322
- get: function () { return chunkU2ROR6AY_cjs.getDb; }
322
+ get: function () { return chunkVWKVU3SE_cjs.getDb; }
323
323
  });
324
324
  Object.defineProperty(exports, "getEnvConfig", {
325
325
  enumerable: true,
326
- get: function () { return chunkU2ROR6AY_cjs.getEnvConfig; }
326
+ get: function () { return chunkVWKVU3SE_cjs.getEnvConfig; }
327
327
  });
328
328
  Object.defineProperty(exports, "getPostById", {
329
329
  enumerable: true,
330
- get: function () { return chunkU2ROR6AY_cjs.getPostById; }
330
+ get: function () { return chunkVWKVU3SE_cjs.getPostById; }
331
331
  });
332
332
  Object.defineProperty(exports, "getPostBySlug", {
333
333
  enumerable: true,
334
- get: function () { return chunkU2ROR6AY_cjs.getPostBySlug; }
334
+ get: function () { return chunkVWKVU3SE_cjs.getPostBySlug; }
335
335
  });
336
336
  Object.defineProperty(exports, "getSettings", {
337
337
  enumerable: true,
338
- get: function () { return chunkU2ROR6AY_cjs.getSettings; }
338
+ get: function () { return chunkVWKVU3SE_cjs.getSettings; }
339
339
  });
340
340
  Object.defineProperty(exports, "listCategories", {
341
341
  enumerable: true,
342
- get: function () { return chunkU2ROR6AY_cjs.listCategories; }
342
+ get: function () { return chunkVWKVU3SE_cjs.listCategories; }
343
343
  });
344
344
  Object.defineProperty(exports, "listMedia", {
345
345
  enumerable: true,
346
- get: function () { return chunkU2ROR6AY_cjs.listMedia; }
346
+ get: function () { return chunkVWKVU3SE_cjs.listMedia; }
347
347
  });
348
348
  Object.defineProperty(exports, "listPosts", {
349
349
  enumerable: true,
350
- get: function () { return chunkU2ROR6AY_cjs.listPosts; }
350
+ get: function () { return chunkVWKVU3SE_cjs.listPosts; }
351
351
  });
352
352
  Object.defineProperty(exports, "updateCategory", {
353
353
  enumerable: true,
354
- get: function () { return chunkU2ROR6AY_cjs.updateCategory; }
354
+ get: function () { return chunkVWKVU3SE_cjs.updateCategory; }
355
355
  });
356
356
  Object.defineProperty(exports, "updatePost", {
357
357
  enumerable: true,
358
- get: function () { return chunkU2ROR6AY_cjs.updatePost; }
358
+ get: function () { return chunkVWKVU3SE_cjs.updatePost; }
359
359
  });
360
360
  Object.defineProperty(exports, "updateSettings", {
361
361
  enumerable: true,
362
- get: function () { return chunkU2ROR6AY_cjs.updateSettings; }
362
+ get: function () { return chunkVWKVU3SE_cjs.updateSettings; }
363
363
  });
364
364
  exports.extractFAQItems = extractFAQItems;
365
365
  exports.extractHeadings = extractHeadings;
package/dist/index.d.cts CHANGED
@@ -1,6 +1,6 @@
1
- export { R as R2StorageProvider, c as calculateReadingTime, a as calculateSEOScore, b as countWords, d as createCategory, e as createMedia, f as createPost, g as defineConfig, h as deleteCategory, i as deleteMedia, j as deletePost, k as ensureIndexes, l as ensureUniqueSlug, m as extractTextFromBlocks, n as extractTextFromHTML, o as generateBreadcrumbs, p as generateFAQStructuredData, q as generateMetaTags, r as generateRSSFeed, s as generateSitemap, t as generateSlug, u as generateStructuredData, v as getBlogConfig, w as getCategoryBySlug, x as getCollection, y as getConfig, z as getDb, A as getEnvConfig, B as getPostById, C as getPostBySlug, D as getSettings, E as listCategories, F as listMedia, G as listPosts, H as processImage, I as searchPosts, J as updateCategory, K as updatePost, L as updateSettings } from './index-vjlZDWNr.cjs';
2
- import { B as BlockContent } from './types-CBEEBR4A.cjs';
3
- export { A as ApiErrorResponse, a as ApiResponse, b as ApiSuccessResponse, c as Author, d as BlockType, e as BlogPost, f as BlogSettings, C as Category, g as CreateCategoryInput, h as CreatePostInput, M as Media, i as MediaListQuery, j as MediaReference, N as NextBlogKitConfig, P as PostListQuery, k as PostSEO, l as PostStatus, R as Revision, S as SEOCheck, m as SEOCheckStatus, n as SEOOverallScore, o as SEOScore, U as UpdateCategoryInput, p as UpdatePostInput } from './types-CBEEBR4A.cjs';
1
+ export { R as R2StorageProvider, c as calculateReadingTime, a as calculateSEOScore, b as countWords, d as createCategory, e as createMedia, f as createPost, g as defineConfig, h as deleteCategory, i as deleteMedia, j as deletePost, k as ensureIndexes, l as ensureUniqueSlug, m as extractTextFromBlocks, n as extractTextFromHTML, o as generateBreadcrumbs, p as generateFAQStructuredData, q as generateMetaTags, r as generateRSSFeed, s as generateSitemap, t as generateSlug, u as generateStructuredData, v as getBlogConfig, w as getCategoryBySlug, x as getCollection, y as getConfig, z as getDb, A as getEnvConfig, B as getPostById, C as getPostBySlug, D as getSettings, E as listCategories, F as listMedia, G as listPosts, H as processImage, I as searchPosts, J as updateCategory, K as updatePost, L as updateSettings } from './index-Bk8gOqBq.cjs';
2
+ import { B as BlockContent } from './types-Cu515Egx.cjs';
3
+ export { A as ApiErrorResponse, a as ApiResponse, b as ApiSuccessResponse, c as Author, d as BlockType, e as BlogPost, f as BlogSettings, C as Category, g as CreateCategoryInput, h as CreatePostInput, M as Media, i as MediaListQuery, j as MediaReference, N as NextBlogKitConfig, P as PostListQuery, k as PostSEO, l as PostStatus, R as Revision, S as SEOCheck, m as SEOCheckStatus, n as SEOOverallScore, o as SEOScore, U as UpdateCategoryInput, p as UpdatePostInput } from './types-Cu515Egx.cjs';
4
4
  import 'zod';
5
5
  import 'mongodb';
6
6
 
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- export { R as R2StorageProvider, c as calculateReadingTime, a as calculateSEOScore, b as countWords, d as createCategory, e as createMedia, f as createPost, g as defineConfig, h as deleteCategory, i as deleteMedia, j as deletePost, k as ensureIndexes, l as ensureUniqueSlug, m as extractTextFromBlocks, n as extractTextFromHTML, o as generateBreadcrumbs, p as generateFAQStructuredData, q as generateMetaTags, r as generateRSSFeed, s as generateSitemap, t as generateSlug, u as generateStructuredData, v as getBlogConfig, w as getCategoryBySlug, x as getCollection, y as getConfig, z as getDb, A as getEnvConfig, B as getPostById, C as getPostBySlug, D as getSettings, E as listCategories, F as listMedia, G as listPosts, H as processImage, I as searchPosts, J as updateCategory, K as updatePost, L as updateSettings } from './index-Cgzphklp.js';
2
- import { B as BlockContent } from './types-CBEEBR4A.js';
3
- export { A as ApiErrorResponse, a as ApiResponse, b as ApiSuccessResponse, c as Author, d as BlockType, e as BlogPost, f as BlogSettings, C as Category, g as CreateCategoryInput, h as CreatePostInput, M as Media, i as MediaListQuery, j as MediaReference, N as NextBlogKitConfig, P as PostListQuery, k as PostSEO, l as PostStatus, R as Revision, S as SEOCheck, m as SEOCheckStatus, n as SEOOverallScore, o as SEOScore, U as UpdateCategoryInput, p as UpdatePostInput } from './types-CBEEBR4A.js';
1
+ export { R as R2StorageProvider, c as calculateReadingTime, a as calculateSEOScore, b as countWords, d as createCategory, e as createMedia, f as createPost, g as defineConfig, h as deleteCategory, i as deleteMedia, j as deletePost, k as ensureIndexes, l as ensureUniqueSlug, m as extractTextFromBlocks, n as extractTextFromHTML, o as generateBreadcrumbs, p as generateFAQStructuredData, q as generateMetaTags, r as generateRSSFeed, s as generateSitemap, t as generateSlug, u as generateStructuredData, v as getBlogConfig, w as getCategoryBySlug, x as getCollection, y as getConfig, z as getDb, A as getEnvConfig, B as getPostById, C as getPostBySlug, D as getSettings, E as listCategories, F as listMedia, G as listPosts, H as processImage, I as searchPosts, J as updateCategory, K as updatePost, L as updateSettings } from './index-DsnG2kdW.js';
2
+ import { B as BlockContent } from './types-Cu515Egx.js';
3
+ export { A as ApiErrorResponse, a as ApiResponse, b as ApiSuccessResponse, c as Author, d as BlockType, e as BlogPost, f as BlogSettings, C as Category, g as CreateCategoryInput, h as CreatePostInput, M as Media, i as MediaListQuery, j as MediaReference, N as NextBlogKitConfig, P as PostListQuery, k as PostSEO, l as PostStatus, R as Revision, S as SEOCheck, m as SEOCheckStatus, n as SEOOverallScore, o as SEOScore, U as UpdateCategoryInput, p as UpdatePostInput } from './types-Cu515Egx.js';
4
4
  import 'zod';
5
5
  import 'mongodb';
6
6
 
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
- export { calculateSEOScore, generateBreadcrumbs, generateFAQStructuredData, generateMetaTags, generateStructuredData, searchPosts } from './chunk-JM7QRXXK.js';
2
- export { R2StorageProvider, processImage } from './chunk-A2S32RZN.js';
3
- export { generateSitemap } from './chunk-4NKOJYWJ.js';
4
- export { generateRSSFeed } from './chunk-R6MO3QIP.js';
5
- export { calculateReadingTime, countWords, createCategory, createMedia, createPost, defineConfig, deleteCategory, deleteMedia, deletePost, ensureIndexes, ensureUniqueSlug, extractTextFromBlocks, extractTextFromHTML, generateSlug, getBlogConfig, getCategoryBySlug, getCollection, getConfig, getDb, getEnvConfig, getPostById, getPostBySlug, getSettings, listCategories, listMedia, listPosts, updateCategory, updatePost, updateSettings } from './chunk-64HUVJOZ.js';
1
+ export { calculateSEOScore, generateBreadcrumbs, generateFAQStructuredData, generateMetaTags, generateStructuredData, searchPosts } from './chunk-TVHY4BR2.js';
2
+ export { generateRSSFeed } from './chunk-NSR7NYSB.js';
3
+ export { R2StorageProvider, processImage } from './chunk-OWWWTTUT.js';
4
+ export { generateSitemap } from './chunk-OOUJYUGP.js';
5
+ export { calculateReadingTime, countWords, createCategory, createMedia, createPost, defineConfig, deleteCategory, deleteMedia, deletePost, ensureIndexes, ensureUniqueSlug, extractTextFromBlocks, extractTextFromHTML, generateSlug, getBlogConfig, getCategoryBySlug, getCollection, getConfig, getDb, getEnvConfig, getPostById, getPostBySlug, getSettings, listCategories, listMedia, listPosts, updateCategory, updatePost, updateSettings } from './chunk-JI2RK6KX.js';
6
6
 
7
7
  // src/editor/renderer.ts
8
8
  function renderBlocksToHTML(doc) {
@@ -1,120 +1,124 @@
1
1
  'use strict';
2
2
 
3
- var chunkQE4VLQYN_cjs = require('../chunk-QE4VLQYN.cjs');
4
- var chunkZP5XRVVH_cjs = require('../chunk-ZP5XRVVH.cjs');
5
- var chunkE2QLTHKN_cjs = require('../chunk-E2QLTHKN.cjs');
6
- var chunk6HKMZOI4_cjs = require('../chunk-6HKMZOI4.cjs');
7
- var chunkU2ROR6AY_cjs = require('../chunk-U2ROR6AY.cjs');
3
+ var chunkF47RPOTU_cjs = require('../chunk-F47RPOTU.cjs');
4
+ var chunk3BKPNOES_cjs = require('../chunk-3BKPNOES.cjs');
5
+ var chunkSUJT6LWH_cjs = require('../chunk-SUJT6LWH.cjs');
6
+ var chunkQBZLGBHQ_cjs = require('../chunk-QBZLGBHQ.cjs');
7
+ var chunkVWKVU3SE_cjs = require('../chunk-VWKVU3SE.cjs');
8
8
 
9
9
 
10
10
 
11
11
  Object.defineProperty(exports, "calculateSEOScore", {
12
12
  enumerable: true,
13
- get: function () { return chunkQE4VLQYN_cjs.calculateSEOScore; }
13
+ get: function () { return chunkF47RPOTU_cjs.calculateSEOScore; }
14
14
  });
15
15
  Object.defineProperty(exports, "generateBreadcrumbs", {
16
16
  enumerable: true,
17
- get: function () { return chunkQE4VLQYN_cjs.generateBreadcrumbs; }
17
+ get: function () { return chunkF47RPOTU_cjs.generateBreadcrumbs; }
18
18
  });
19
19
  Object.defineProperty(exports, "generateMetaTags", {
20
20
  enumerable: true,
21
- get: function () { return chunkQE4VLQYN_cjs.generateMetaTags; }
21
+ get: function () { return chunkF47RPOTU_cjs.generateMetaTags; }
22
22
  });
23
23
  Object.defineProperty(exports, "generateStructuredData", {
24
24
  enumerable: true,
25
- get: function () { return chunkQE4VLQYN_cjs.generateStructuredData; }
25
+ get: function () { return chunkF47RPOTU_cjs.generateStructuredData; }
26
26
  });
27
27
  Object.defineProperty(exports, "searchPosts", {
28
28
  enumerable: true,
29
- get: function () { return chunkQE4VLQYN_cjs.searchPosts; }
29
+ get: function () { return chunkF47RPOTU_cjs.searchPosts; }
30
+ });
31
+ Object.defineProperty(exports, "generateRSSFeed", {
32
+ enumerable: true,
33
+ get: function () { return chunk3BKPNOES_cjs.generateRSSFeed; }
30
34
  });
31
35
  Object.defineProperty(exports, "R2StorageProvider", {
32
36
  enumerable: true,
33
- get: function () { return chunkZP5XRVVH_cjs.R2StorageProvider; }
37
+ get: function () { return chunkSUJT6LWH_cjs.R2StorageProvider; }
34
38
  });
35
39
  Object.defineProperty(exports, "processImage", {
36
40
  enumerable: true,
37
- get: function () { return chunkZP5XRVVH_cjs.processImage; }
41
+ get: function () { return chunkSUJT6LWH_cjs.processImage; }
38
42
  });
39
43
  Object.defineProperty(exports, "generateSitemap", {
40
44
  enumerable: true,
41
- get: function () { return chunkE2QLTHKN_cjs.generateSitemap; }
42
- });
43
- Object.defineProperty(exports, "generateRSSFeed", {
44
- enumerable: true,
45
- get: function () { return chunk6HKMZOI4_cjs.generateRSSFeed; }
45
+ get: function () { return chunkQBZLGBHQ_cjs.generateSitemap; }
46
46
  });
47
47
  Object.defineProperty(exports, "calculateReadingTime", {
48
48
  enumerable: true,
49
- get: function () { return chunkU2ROR6AY_cjs.calculateReadingTime; }
49
+ get: function () { return chunkVWKVU3SE_cjs.calculateReadingTime; }
50
50
  });
51
51
  Object.defineProperty(exports, "countWords", {
52
52
  enumerable: true,
53
- get: function () { return chunkU2ROR6AY_cjs.countWords; }
53
+ get: function () { return chunkVWKVU3SE_cjs.countWords; }
54
54
  });
55
55
  Object.defineProperty(exports, "defineConfig", {
56
56
  enumerable: true,
57
- get: function () { return chunkU2ROR6AY_cjs.defineConfig; }
57
+ get: function () { return chunkVWKVU3SE_cjs.defineConfig; }
58
58
  });
59
59
  Object.defineProperty(exports, "ensureIndexes", {
60
60
  enumerable: true,
61
- get: function () { return chunkU2ROR6AY_cjs.ensureIndexes; }
61
+ get: function () { return chunkVWKVU3SE_cjs.ensureIndexes; }
62
62
  });
63
63
  Object.defineProperty(exports, "ensureUniqueSlug", {
64
64
  enumerable: true,
65
- get: function () { return chunkU2ROR6AY_cjs.ensureUniqueSlug; }
65
+ get: function () { return chunkVWKVU3SE_cjs.ensureUniqueSlug; }
66
66
  });
67
67
  Object.defineProperty(exports, "extractTextFromBlocks", {
68
68
  enumerable: true,
69
- get: function () { return chunkU2ROR6AY_cjs.extractTextFromBlocks; }
69
+ get: function () { return chunkVWKVU3SE_cjs.extractTextFromBlocks; }
70
70
  });
71
71
  Object.defineProperty(exports, "extractTextFromHTML", {
72
72
  enumerable: true,
73
- get: function () { return chunkU2ROR6AY_cjs.extractTextFromHTML; }
73
+ get: function () { return chunkVWKVU3SE_cjs.extractTextFromHTML; }
74
74
  });
75
75
  Object.defineProperty(exports, "generateSlug", {
76
76
  enumerable: true,
77
- get: function () { return chunkU2ROR6AY_cjs.generateSlug; }
77
+ get: function () { return chunkVWKVU3SE_cjs.generateSlug; }
78
78
  });
79
79
  Object.defineProperty(exports, "getBlogConfig", {
80
80
  enumerable: true,
81
- get: function () { return chunkU2ROR6AY_cjs.getBlogConfig; }
81
+ get: function () { return chunkVWKVU3SE_cjs.getBlogConfig; }
82
82
  });
83
83
  Object.defineProperty(exports, "getCategoryBySlug", {
84
84
  enumerable: true,
85
- get: function () { return chunkU2ROR6AY_cjs.getCategoryBySlug; }
85
+ get: function () { return chunkVWKVU3SE_cjs.getCategoryBySlug; }
86
86
  });
87
87
  Object.defineProperty(exports, "getCollection", {
88
88
  enumerable: true,
89
- get: function () { return chunkU2ROR6AY_cjs.getCollection; }
89
+ get: function () { return chunkVWKVU3SE_cjs.getCollection; }
90
90
  });
91
91
  Object.defineProperty(exports, "getConfig", {
92
92
  enumerable: true,
93
- get: function () { return chunkU2ROR6AY_cjs.getConfig; }
93
+ get: function () { return chunkVWKVU3SE_cjs.getConfig; }
94
94
  });
95
95
  Object.defineProperty(exports, "getDb", {
96
96
  enumerable: true,
97
- get: function () { return chunkU2ROR6AY_cjs.getDb; }
97
+ get: function () { return chunkVWKVU3SE_cjs.getDb; }
98
98
  });
99
99
  Object.defineProperty(exports, "getEnvConfig", {
100
100
  enumerable: true,
101
- get: function () { return chunkU2ROR6AY_cjs.getEnvConfig; }
101
+ get: function () { return chunkVWKVU3SE_cjs.getEnvConfig; }
102
102
  });
103
103
  Object.defineProperty(exports, "getPostById", {
104
104
  enumerable: true,
105
- get: function () { return chunkU2ROR6AY_cjs.getPostById; }
105
+ get: function () { return chunkVWKVU3SE_cjs.getPostById; }
106
106
  });
107
107
  Object.defineProperty(exports, "getPostBySlug", {
108
108
  enumerable: true,
109
- get: function () { return chunkU2ROR6AY_cjs.getPostBySlug; }
109
+ get: function () { return chunkVWKVU3SE_cjs.getPostBySlug; }
110
+ });
111
+ Object.defineProperty(exports, "isR2Configured", {
112
+ enumerable: true,
113
+ get: function () { return chunkVWKVU3SE_cjs.isR2Configured; }
110
114
  });
111
115
  Object.defineProperty(exports, "listCategories", {
112
116
  enumerable: true,
113
- get: function () { return chunkU2ROR6AY_cjs.listCategories; }
117
+ get: function () { return chunkVWKVU3SE_cjs.listCategories; }
114
118
  });
115
119
  Object.defineProperty(exports, "listPosts", {
116
120
  enumerable: true,
117
- get: function () { return chunkU2ROR6AY_cjs.listPosts; }
121
+ get: function () { return chunkVWKVU3SE_cjs.listPosts; }
118
122
  });
119
123
  //# sourceMappingURL=index.cjs.map
120
124
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- export { R as R2StorageProvider, c as calculateReadingTime, a as calculateSEOScore, b as countWords, g as defineConfig, k as ensureIndexes, l as ensureUniqueSlug, m as extractTextFromBlocks, n as extractTextFromHTML, o as generateBreadcrumbs, q as generateMetaTags, r as generateRSSFeed, s as generateSitemap, t as generateSlug, u as generateStructuredData, v as getBlogConfig, w as getCategoryBySlug, x as getCollection, y as getConfig, z as getDb, A as getEnvConfig, B as getPostById, C as getPostBySlug, E as listCategories, G as listPosts, H as processImage, I as searchPosts } from '../index-vjlZDWNr.cjs';
2
- export { A as ApiErrorResponse, a as ApiResponse, b as ApiSuccessResponse, c as Author, q as AuthorSchema, B as BlockContent, d as BlockType, r as BlockTypeSchema, e as BlogPost, f as BlogSettings, s as BlogSettingsSchema, C as Category, g as CreateCategoryInput, t as CreateCategorySchema, h as CreatePostInput, u as CreatePostSchema, M as Media, i as MediaListQuery, j as MediaReference, v as MediaSchema, N as NextBlogKitConfig, P as PostListQuery, k as PostSEO, w as PostSEOSchema, l as PostStatus, x as PostStatusSchema, R as Revision, S as SEOCheck, m as SEOCheckStatus, n as SEOOverallScore, o as SEOScore, U as UpdateCategoryInput, y as UpdateCategorySchema, p as UpdatePostInput, z as UpdatePostSchema } from '../types-CBEEBR4A.cjs';
1
+ export { R as R2StorageProvider, c as calculateReadingTime, a as calculateSEOScore, b as countWords, g as defineConfig, k as ensureIndexes, l as ensureUniqueSlug, m as extractTextFromBlocks, n as extractTextFromHTML, o as generateBreadcrumbs, q as generateMetaTags, r as generateRSSFeed, s as generateSitemap, t as generateSlug, u as generateStructuredData, v as getBlogConfig, w as getCategoryBySlug, x as getCollection, y as getConfig, z as getDb, A as getEnvConfig, B as getPostById, C as getPostBySlug, M as isR2Configured, E as listCategories, G as listPosts, H as processImage, I as searchPosts } from '../index-Bk8gOqBq.cjs';
2
+ export { A as ApiErrorResponse, a as ApiResponse, b as ApiSuccessResponse, q as ApiToken, c as Author, r as AuthorSchema, B as BlockContent, d as BlockType, s as BlockTypeSchema, e as BlogPost, f as BlogSettings, t as BlogSettingsSchema, C as Category, u as CreateApiTokenSchema, g as CreateCategoryInput, v as CreateCategorySchema, h as CreatePostInput, w as CreatePostSchema, M as Media, i as MediaListQuery, j as MediaReference, x as MediaSchema, N as NextBlogKitConfig, P as PostListQuery, k as PostSEO, y as PostSEOSchema, l as PostStatus, z as PostStatusSchema, R as Revision, S as SEOCheck, m as SEOCheckStatus, n as SEOOverallScore, o as SEOScore, U as UpdateCategoryInput, D as UpdateCategorySchema, p as UpdatePostInput, E as UpdatePostSchema } from '../types-Cu515Egx.cjs';
3
3
  import 'zod';
4
4
  import 'mongodb';
@@ -1,4 +1,4 @@
1
- export { R as R2StorageProvider, c as calculateReadingTime, a as calculateSEOScore, b as countWords, g as defineConfig, k as ensureIndexes, l as ensureUniqueSlug, m as extractTextFromBlocks, n as extractTextFromHTML, o as generateBreadcrumbs, q as generateMetaTags, r as generateRSSFeed, s as generateSitemap, t as generateSlug, u as generateStructuredData, v as getBlogConfig, w as getCategoryBySlug, x as getCollection, y as getConfig, z as getDb, A as getEnvConfig, B as getPostById, C as getPostBySlug, E as listCategories, G as listPosts, H as processImage, I as searchPosts } from '../index-Cgzphklp.js';
2
- export { A as ApiErrorResponse, a as ApiResponse, b as ApiSuccessResponse, c as Author, q as AuthorSchema, B as BlockContent, d as BlockType, r as BlockTypeSchema, e as BlogPost, f as BlogSettings, s as BlogSettingsSchema, C as Category, g as CreateCategoryInput, t as CreateCategorySchema, h as CreatePostInput, u as CreatePostSchema, M as Media, i as MediaListQuery, j as MediaReference, v as MediaSchema, N as NextBlogKitConfig, P as PostListQuery, k as PostSEO, w as PostSEOSchema, l as PostStatus, x as PostStatusSchema, R as Revision, S as SEOCheck, m as SEOCheckStatus, n as SEOOverallScore, o as SEOScore, U as UpdateCategoryInput, y as UpdateCategorySchema, p as UpdatePostInput, z as UpdatePostSchema } from '../types-CBEEBR4A.js';
1
+ export { R as R2StorageProvider, c as calculateReadingTime, a as calculateSEOScore, b as countWords, g as defineConfig, k as ensureIndexes, l as ensureUniqueSlug, m as extractTextFromBlocks, n as extractTextFromHTML, o as generateBreadcrumbs, q as generateMetaTags, r as generateRSSFeed, s as generateSitemap, t as generateSlug, u as generateStructuredData, v as getBlogConfig, w as getCategoryBySlug, x as getCollection, y as getConfig, z as getDb, A as getEnvConfig, B as getPostById, C as getPostBySlug, M as isR2Configured, E as listCategories, G as listPosts, H as processImage, I as searchPosts } from '../index-DsnG2kdW.js';
2
+ export { A as ApiErrorResponse, a as ApiResponse, b as ApiSuccessResponse, q as ApiToken, c as Author, r as AuthorSchema, B as BlockContent, d as BlockType, s as BlockTypeSchema, e as BlogPost, f as BlogSettings, t as BlogSettingsSchema, C as Category, u as CreateApiTokenSchema, g as CreateCategoryInput, v as CreateCategorySchema, h as CreatePostInput, w as CreatePostSchema, M as Media, i as MediaListQuery, j as MediaReference, x as MediaSchema, N as NextBlogKitConfig, P as PostListQuery, k as PostSEO, y as PostSEOSchema, l as PostStatus, z as PostStatusSchema, R as Revision, S as SEOCheck, m as SEOCheckStatus, n as SEOOverallScore, o as SEOScore, U as UpdateCategoryInput, D as UpdateCategorySchema, p as UpdatePostInput, E as UpdatePostSchema } from '../types-Cu515Egx.js';
3
3
  import 'zod';
4
4
  import 'mongodb';
package/dist/lib/index.js CHANGED
@@ -1,7 +1,7 @@
1
- export { calculateSEOScore, generateBreadcrumbs, generateMetaTags, generateStructuredData, searchPosts } from '../chunk-JM7QRXXK.js';
2
- export { R2StorageProvider, processImage } from '../chunk-A2S32RZN.js';
3
- export { generateSitemap } from '../chunk-4NKOJYWJ.js';
4
- export { generateRSSFeed } from '../chunk-R6MO3QIP.js';
5
- export { calculateReadingTime, countWords, defineConfig, ensureIndexes, ensureUniqueSlug, extractTextFromBlocks, extractTextFromHTML, generateSlug, getBlogConfig, getCategoryBySlug, getCollection, getConfig, getDb, getEnvConfig, getPostById, getPostBySlug, listCategories, listPosts } from '../chunk-64HUVJOZ.js';
1
+ export { calculateSEOScore, generateBreadcrumbs, generateMetaTags, generateStructuredData, searchPosts } from '../chunk-TVHY4BR2.js';
2
+ export { generateRSSFeed } from '../chunk-NSR7NYSB.js';
3
+ export { R2StorageProvider, processImage } from '../chunk-OWWWTTUT.js';
4
+ export { generateSitemap } from '../chunk-OOUJYUGP.js';
5
+ export { calculateReadingTime, countWords, defineConfig, ensureIndexes, ensureUniqueSlug, extractTextFromBlocks, extractTextFromHTML, generateSlug, getBlogConfig, getCategoryBySlug, getCollection, getConfig, getDb, getEnvConfig, getPostById, getPostBySlug, isR2Configured, listCategories, listPosts } from '../chunk-JI2RK6KX.js';
6
6
  //# sourceMappingURL=index.js.map
7
7
  //# sourceMappingURL=index.js.map
@@ -635,6 +635,21 @@ interface BlogSettings {
635
635
  plausibleDomain?: string;
636
636
  };
637
637
  }
638
+ declare const CreateApiTokenSchema: z.ZodObject<{
639
+ name: z.ZodString;
640
+ }, "strip", z.ZodTypeAny, {
641
+ name: string;
642
+ }, {
643
+ name: string;
644
+ }>;
645
+ interface ApiToken {
646
+ _id: ObjectId;
647
+ name: string;
648
+ tokenHash: string;
649
+ prefix: string;
650
+ lastUsedAt?: Date;
651
+ createdAt: Date;
652
+ }
638
653
  interface ApiSuccessResponse<T = unknown> {
639
654
  success: true;
640
655
  data: T;
@@ -729,4 +744,4 @@ interface MediaListQuery {
729
744
  mimeType?: string;
730
745
  }
731
746
 
732
- export { type ApiErrorResponse as A, type BlockContent as B, type Category as C, type Media as M, type NextBlogKitConfig as N, type PostListQuery as P, type Revision as R, type SEOCheck as S, type UpdateCategoryInput as U, type ApiResponse as a, type ApiSuccessResponse as b, type Author as c, type BlockType as d, type BlogPost as e, type BlogSettings as f, type CreateCategoryInput as g, type CreatePostInput as h, type MediaListQuery as i, type MediaReference as j, type PostSEO as k, type PostStatus as l, type SEOCheckStatus as m, type SEOOverallScore as n, type SEOScore as o, type UpdatePostInput as p, AuthorSchema as q, BlockTypeSchema as r, BlogSettingsSchema as s, CreateCategorySchema as t, CreatePostSchema as u, MediaSchema as v, PostSEOSchema as w, PostStatusSchema as x, UpdateCategorySchema as y, UpdatePostSchema as z };
747
+ export { type ApiErrorResponse as A, type BlockContent as B, type Category as C, UpdateCategorySchema as D, UpdatePostSchema as E, type Media as M, type NextBlogKitConfig as N, type PostListQuery as P, type Revision as R, type SEOCheck as S, type UpdateCategoryInput as U, type ApiResponse as a, type ApiSuccessResponse as b, type Author as c, type BlockType as d, type BlogPost as e, type BlogSettings as f, type CreateCategoryInput as g, type CreatePostInput as h, type MediaListQuery as i, type MediaReference as j, type PostSEO as k, type PostStatus as l, type SEOCheckStatus as m, type SEOOverallScore as n, type SEOScore as o, type UpdatePostInput as p, type ApiToken as q, AuthorSchema as r, BlockTypeSchema as s, BlogSettingsSchema as t, CreateApiTokenSchema as u, CreateCategorySchema as v, CreatePostSchema as w, MediaSchema as x, PostSEOSchema as y, PostStatusSchema as z };
@@ -635,6 +635,21 @@ interface BlogSettings {
635
635
  plausibleDomain?: string;
636
636
  };
637
637
  }
638
+ declare const CreateApiTokenSchema: z.ZodObject<{
639
+ name: z.ZodString;
640
+ }, "strip", z.ZodTypeAny, {
641
+ name: string;
642
+ }, {
643
+ name: string;
644
+ }>;
645
+ interface ApiToken {
646
+ _id: ObjectId;
647
+ name: string;
648
+ tokenHash: string;
649
+ prefix: string;
650
+ lastUsedAt?: Date;
651
+ createdAt: Date;
652
+ }
638
653
  interface ApiSuccessResponse<T = unknown> {
639
654
  success: true;
640
655
  data: T;
@@ -729,4 +744,4 @@ interface MediaListQuery {
729
744
  mimeType?: string;
730
745
  }
731
746
 
732
- export { type ApiErrorResponse as A, type BlockContent as B, type Category as C, type Media as M, type NextBlogKitConfig as N, type PostListQuery as P, type Revision as R, type SEOCheck as S, type UpdateCategoryInput as U, type ApiResponse as a, type ApiSuccessResponse as b, type Author as c, type BlockType as d, type BlogPost as e, type BlogSettings as f, type CreateCategoryInput as g, type CreatePostInput as h, type MediaListQuery as i, type MediaReference as j, type PostSEO as k, type PostStatus as l, type SEOCheckStatus as m, type SEOOverallScore as n, type SEOScore as o, type UpdatePostInput as p, AuthorSchema as q, BlockTypeSchema as r, BlogSettingsSchema as s, CreateCategorySchema as t, CreatePostSchema as u, MediaSchema as v, PostSEOSchema as w, PostStatusSchema as x, UpdateCategorySchema as y, UpdatePostSchema as z };
747
+ export { type ApiErrorResponse as A, type BlockContent as B, type Category as C, UpdateCategorySchema as D, UpdatePostSchema as E, type Media as M, type NextBlogKitConfig as N, type PostListQuery as P, type Revision as R, type SEOCheck as S, type UpdateCategoryInput as U, type ApiResponse as a, type ApiSuccessResponse as b, type Author as c, type BlockType as d, type BlogPost as e, type BlogSettings as f, type CreateCategoryInput as g, type CreatePostInput as h, type MediaListQuery as i, type MediaReference as j, type PostSEO as k, type PostStatus as l, type SEOCheckStatus as m, type SEOOverallScore as n, type SEOScore as o, type UpdatePostInput as p, type ApiToken as q, AuthorSchema as r, BlockTypeSchema as s, BlogSettingsSchema as t, CreateApiTokenSchema as u, CreateCategorySchema as v, CreatePostSchema as w, MediaSchema as x, PostSEOSchema as y, PostStatusSchema as z };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nextblogkit",
3
- "version": "0.6.2",
3
+ "version": "0.7.2",
4
4
  "description": "A complete blog engine for Next.js — admin panel, block editor, SEO, media storage, and more.",
5
5
  "license": "MIT",
6
6
  "author": "Santosh Patidar",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/lib/sitemap.ts"],"names":[],"mappings":"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","file":"chunk-4NKOJYWJ.js","sourcesContent":["import { getCollection } from './db';\nimport { getEnvConfig } from './config';\n\ninterface SitemapEntry {\n loc: string;\n lastmod?: string;\n changefreq?: string;\n priority?: string;\n}\n\nexport async function generateSitemap(): Promise<string> {\n const env = getEnvConfig();\n const posts = await getCollection('nbk_posts');\n const categories = await getCollection('nbk_categories');\n\n const entries: SitemapEntry[] = [];\n\n // Blog listing page\n entries.push({\n loc: `${env.NEXTBLOGKIT_SITE_URL}/blog`,\n changefreq: 'daily',\n priority: '0.9',\n });\n\n // Published posts\n const publishedPosts = await posts\n .find({ status: 'published' })\n .sort({ publishedAt: -1 })\n .project({ slug: 1, updatedAt: 1, publishedAt: 1 })\n .toArray();\n\n for (const post of publishedPosts) {\n const lastmod = post.updatedAt || post.publishedAt;\n const daysSincePublish = lastmod\n ? Math.floor((Date.now() - new Date(lastmod).getTime()) / (1000 * 60 * 60 * 24))\n : 0;\n\n let changefreq = 'monthly';\n if (daysSincePublish < 7) changefreq = 'daily';\n else if (daysSincePublish < 30) changefreq = 'weekly';\n\n entries.push({\n loc: `${env.NEXTBLOGKIT_SITE_URL}/blog/${post.slug}`,\n lastmod: lastmod ? new Date(lastmod).toISOString().split('T')[0] : undefined,\n changefreq,\n priority: '0.8',\n });\n }\n\n // Category pages\n const allCategories = await categories\n .find({})\n .sort({ order: 1 })\n .project({ slug: 1 })\n .toArray();\n\n for (const cat of allCategories) {\n entries.push({\n loc: `${env.NEXTBLOGKIT_SITE_URL}/blog/category/${cat.slug}`,\n changefreq: 'weekly',\n priority: '0.6',\n });\n }\n\n // Paginated listing pages\n const totalPosts = publishedPosts.length;\n const postsPerPage = 10;\n const totalPages = Math.ceil(totalPosts / postsPerPage);\n for (let page = 2; page <= totalPages; page++) {\n entries.push({\n loc: `${env.NEXTBLOGKIT_SITE_URL}/blog?page=${page}`,\n changefreq: 'weekly',\n priority: '0.5',\n });\n }\n\n return buildXML(entries);\n}\n\nfunction buildXML(entries: SitemapEntry[]): string {\n const urls = entries\n .map(\n (entry) => ` <url>\n <loc>${escapeXml(entry.loc)}</loc>${entry.lastmod ? `\\n <lastmod>${entry.lastmod}</lastmod>` : ''}${entry.changefreq ? `\\n <changefreq>${entry.changefreq}</changefreq>` : ''}${entry.priority ? `\\n <priority>${entry.priority}</priority>` : ''}\n </url>`\n )\n .join('\\n');\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n${urls}\n</urlset>`;\n}\n\nfunction escapeXml(str: string): string {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;');\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/lib/types.ts"],"names":[],"mappings":"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","file":"chunk-4PY224XM.js","sourcesContent":["import { z } from 'zod';\nimport type { ObjectId } from 'mongodb';\n\n// ============================================================\n// Block Editor Types\n// ============================================================\n\nexport const BlockTypeSchema = z.enum([\n 'paragraph',\n 'heading',\n 'image',\n 'codeBlock',\n 'blockquote',\n 'bulletList',\n 'orderedList',\n 'taskList',\n 'table',\n 'embed',\n 'horizontalRule',\n 'callout',\n 'tableOfContents',\n 'faq',\n 'html',\n]);\n\nexport type BlockType = z.infer<typeof BlockTypeSchema>;\n\nexport interface BlockContent {\n type: string;\n attrs?: Record<string, unknown>;\n content?: BlockContent[];\n text?: string;\n marks?: { type: string; attrs?: Record<string, unknown> }[];\n}\n\n// ============================================================\n// Media\n// ============================================================\n\nexport interface MediaReference {\n _id: string;\n url: string;\n alt?: string;\n caption?: string;\n width?: number;\n height?: number;\n}\n\nexport const MediaSchema = z.object({\n filename: z.string(),\n originalName: z.string(),\n mimeType: z.string(),\n size: z.number(),\n width: z.number().optional(),\n height: z.number().optional(),\n r2Key: z.string(),\n url: z.string().url(),\n alt: z.string().optional(),\n caption: z.string().optional(),\n createdAt: z.date(),\n});\n\nexport interface Media {\n _id: ObjectId;\n filename: string;\n originalName: string;\n mimeType: string;\n size: number;\n width?: number;\n height?: number;\n r2Key: string;\n url: string;\n alt?: string;\n caption?: string;\n createdAt: Date;\n}\n\n// ============================================================\n// Author\n// ============================================================\n\nexport const AuthorSchema = z.object({\n name: z.string().min(1),\n avatar: z.string().url().optional(),\n bio: z.string().optional(),\n url: z.string().url().optional(),\n});\n\nexport interface Author {\n name: string;\n avatar?: string;\n bio?: string;\n url?: string;\n}\n\n// ============================================================\n// SEO\n// ============================================================\n\nexport const PostSEOSchema = z.object({\n metaTitle: z.string().optional(),\n metaDescription: z.string().optional(),\n canonicalUrl: z.string().url().optional(),\n ogImage: z.string().url().optional(),\n ogType: z.string().default('article'),\n noIndex: z.boolean().default(false),\n structuredData: z.record(z.unknown()).optional(),\n focusKeyword: z.string().optional(),\n});\n\nexport interface PostSEO {\n metaTitle?: string;\n metaDescription?: string;\n canonicalUrl?: string;\n ogImage?: string;\n ogType: string;\n noIndex: boolean;\n structuredData?: Record<string, unknown>;\n focusKeyword?: string;\n}\n\n// ============================================================\n// Revision\n// ============================================================\n\nexport interface Revision {\n version: number;\n title: string;\n content: BlockContent[];\n contentHTML: string;\n savedAt: Date;\n}\n\n// ============================================================\n// Post\n// ============================================================\n\nexport const PostStatusSchema = z.enum(['draft', 'published', 'scheduled', 'archived']);\nexport type PostStatus = z.infer<typeof PostStatusSchema>;\n\nexport const CreatePostSchema = z.object({\n title: z.string().min(1, 'Title is required'),\n slug: z.string().optional(),\n excerpt: z.string().optional(),\n content: z.any(), // BlockContent[] — validated structurally\n contentHTML: z.string().optional(),\n contentText: z.string().optional(),\n coverImage: z\n .object({\n _id: z.string(),\n url: z.string().url(),\n alt: z.string().optional(),\n caption: z.string().optional(),\n width: z.number().optional(),\n height: z.number().optional(),\n })\n .optional(),\n categories: z.array(z.string()).default([]),\n tags: z.array(z.string()).default([]),\n author: AuthorSchema.optional(),\n seo: PostSEOSchema.optional(),\n status: PostStatusSchema.default('draft'),\n publishedAt: z.coerce.date().optional(),\n scheduledAt: z.coerce.date().optional(),\n});\n\nexport const UpdatePostSchema = CreatePostSchema.partial();\n\nexport type CreatePostInput = z.infer<typeof CreatePostSchema>;\nexport type UpdatePostInput = z.infer<typeof UpdatePostSchema>;\n\nexport interface BlogPost {\n _id: ObjectId;\n title: string;\n slug: string;\n excerpt: string;\n content: BlockContent[];\n contentHTML: string;\n contentText: string;\n coverImage?: MediaReference;\n categories: string[];\n tags: string[];\n author: Author;\n seo: PostSEO;\n status: PostStatus;\n publishedAt?: Date;\n scheduledAt?: Date;\n readingTime: number;\n wordCount: number;\n version: number;\n revisions: Revision[];\n createdAt: Date;\n updatedAt: Date;\n}\n\n// ============================================================\n// Category\n// ============================================================\n\nexport const CreateCategorySchema = z.object({\n name: z.string().min(1, 'Category name is required'),\n slug: z.string().optional(),\n description: z.string().optional(),\n seo: z\n .object({\n metaTitle: z.string().optional(),\n metaDescription: z.string().optional(),\n })\n .optional(),\n order: z.number().default(0),\n parentId: z.string().optional(),\n});\n\nexport const UpdateCategorySchema = CreateCategorySchema.partial();\n\nexport type CreateCategoryInput = z.infer<typeof CreateCategorySchema>;\nexport type UpdateCategoryInput = z.infer<typeof UpdateCategorySchema>;\n\nexport interface Category {\n _id: ObjectId;\n name: string;\n slug: string;\n description?: string;\n seo?: {\n metaTitle?: string;\n metaDescription?: string;\n };\n order: number;\n parentId?: ObjectId;\n postCount: number;\n}\n\n// ============================================================\n// Settings\n// ============================================================\n\nexport const BlogSettingsSchema = z.object({\n postsPerPage: z.number().min(1).max(100).default(10),\n defaultAuthor: AuthorSchema.optional(),\n defaultOgImage: z.string().url().optional(),\n commentSystem: z.enum(['none', 'giscus', 'disqus']).default('none'),\n commentConfig: z.record(z.unknown()).optional(),\n customCSS: z.string().optional(),\n analytics: z\n .object({\n gaId: z.string().optional(),\n plausibleDomain: z.string().optional(),\n })\n .optional(),\n});\n\nexport interface BlogSettings {\n _id: string;\n postsPerPage: number;\n defaultAuthor?: Author;\n defaultOgImage?: string;\n commentSystem: 'none' | 'giscus' | 'disqus';\n commentConfig?: Record<string, unknown>;\n customCSS?: string;\n analytics?: {\n gaId?: string;\n plausibleDomain?: string;\n };\n}\n\n// ============================================================\n// API Response Types\n// ============================================================\n\nexport interface ApiSuccessResponse<T = unknown> {\n success: true;\n data: T;\n meta?: {\n page: number;\n limit: number;\n total: number;\n totalPages: number;\n };\n}\n\nexport interface ApiErrorResponse {\n success: false;\n error: {\n code: string;\n message: string;\n };\n}\n\nexport type ApiResponse<T = unknown> = ApiSuccessResponse<T> | ApiErrorResponse;\n\n// ============================================================\n// SEO Score Types\n// ============================================================\n\nexport type SEOCheckStatus = 'pass' | 'warn' | 'fail';\nexport type SEOOverallScore = 'good' | 'ok' | 'poor';\n\nexport interface SEOCheck {\n id: string;\n status: SEOCheckStatus;\n message: string;\n}\n\nexport interface SEOScore {\n overall: SEOOverallScore;\n checks: SEOCheck[];\n}\n\n// ============================================================\n// Config Types\n// ============================================================\n\nexport interface NextBlogKitConfig {\n basePath: string;\n adminPath: string;\n apiPath: string;\n postsPerPage: number;\n excerptLength: number;\n codeHighlighter: 'shiki' | 'prism';\n editor: {\n blocks: BlockType[];\n maxImageSize: number;\n imageFormats: string[];\n autosaveInterval: number;\n };\n seo: {\n titleTemplate: string;\n defaultOgImage?: string;\n generateRSS: boolean;\n generateSitemap: boolean;\n structuredData: boolean;\n minContentLength: number;\n };\n auth: {\n strategy: 'api-key' | 'custom' | 'credentials';\n verify?: (request: Request) => Promise<boolean>;\n admins?: string[];\n };\n features: {\n search: boolean;\n relatedPosts: boolean;\n readingProgress: boolean;\n tableOfContents: boolean;\n shareButtons: boolean;\n darkMode: boolean;\n scheduling: boolean;\n revisionHistory: boolean;\n imageOptimization: boolean;\n };\n theme: {\n variables?: Record<string, string>;\n darkMode?: boolean;\n components?: Record<string, React.ComponentType<unknown>>;\n };\n hooks: {\n beforePublish?: (post: BlogPost) => Promise<void>;\n afterPublish?: (post: BlogPost) => Promise<void>;\n beforeDelete?: (post: BlogPost) => Promise<void>;\n onMediaUpload?: (media: Media) => Promise<void>;\n };\n}\n\n// ============================================================\n// Query Types\n// ============================================================\n\nexport interface PostListQuery {\n page?: number;\n limit?: number;\n category?: string;\n tag?: string;\n status?: PostStatus;\n search?: string;\n sortBy?: 'publishedAt' | 'createdAt' | 'title';\n sortOrder?: 'asc' | 'desc';\n}\n\nexport interface MediaListQuery {\n page?: number;\n limit?: number;\n mimeType?: string;\n}\n"]}