next-blogpanel 1.0.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.
Files changed (127) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +211 -0
  3. package/dist/admin/index.cjs +3062 -0
  4. package/dist/admin/index.cjs.map +1 -0
  5. package/dist/admin/index.d.cts +51 -0
  6. package/dist/admin/index.d.ts +51 -0
  7. package/dist/admin/index.js +3029 -0
  8. package/dist/admin/index.js.map +1 -0
  9. package/dist/api/categories.cjs +82 -0
  10. package/dist/api/categories.cjs.map +1 -0
  11. package/dist/api/categories.d.cts +27 -0
  12. package/dist/api/categories.d.ts +27 -0
  13. package/dist/api/categories.js +77 -0
  14. package/dist/api/categories.js.map +1 -0
  15. package/dist/api/media-file.cjs +46 -0
  16. package/dist/api/media-file.cjs.map +1 -0
  17. package/dist/api/media-file.d.cts +7 -0
  18. package/dist/api/media-file.d.ts +7 -0
  19. package/dist/api/media-file.js +44 -0
  20. package/dist/api/media-file.js.map +1 -0
  21. package/dist/api/media.cjs +180 -0
  22. package/dist/api/media.cjs.map +1 -0
  23. package/dist/api/media.d.cts +22 -0
  24. package/dist/api/media.d.ts +22 -0
  25. package/dist/api/media.js +176 -0
  26. package/dist/api/media.js.map +1 -0
  27. package/dist/api/posts.cjs +103 -0
  28. package/dist/api/posts.cjs.map +1 -0
  29. package/dist/api/posts.d.cts +27 -0
  30. package/dist/api/posts.d.ts +27 -0
  31. package/dist/api/posts.js +98 -0
  32. package/dist/api/posts.js.map +1 -0
  33. package/dist/api/rss.cjs +25 -0
  34. package/dist/api/rss.cjs.map +1 -0
  35. package/dist/api/rss.d.cts +5 -0
  36. package/dist/api/rss.d.ts +5 -0
  37. package/dist/api/rss.js +23 -0
  38. package/dist/api/rss.js.map +1 -0
  39. package/dist/api/settings.cjs +40 -0
  40. package/dist/api/settings.cjs.map +1 -0
  41. package/dist/api/settings.d.cts +17 -0
  42. package/dist/api/settings.d.ts +17 -0
  43. package/dist/api/settings.js +37 -0
  44. package/dist/api/settings.js.map +1 -0
  45. package/dist/api/sitemap.cjs +25 -0
  46. package/dist/api/sitemap.cjs.map +1 -0
  47. package/dist/api/sitemap.d.cts +5 -0
  48. package/dist/api/sitemap.d.ts +5 -0
  49. package/dist/api/sitemap.js +23 -0
  50. package/dist/api/sitemap.js.map +1 -0
  51. package/dist/api/tokens.cjs +56 -0
  52. package/dist/api/tokens.cjs.map +1 -0
  53. package/dist/api/tokens.d.cts +22 -0
  54. package/dist/api/tokens.d.ts +22 -0
  55. package/dist/api/tokens.js +52 -0
  56. package/dist/api/tokens.js.map +1 -0
  57. package/dist/chunk-2M46MMWN.cjs +76 -0
  58. package/dist/chunk-2M46MMWN.cjs.map +1 -0
  59. package/dist/chunk-4GK22Q3R.cjs +229 -0
  60. package/dist/chunk-4GK22Q3R.cjs.map +1 -0
  61. package/dist/chunk-6PZ772NQ.js +595 -0
  62. package/dist/chunk-6PZ772NQ.js.map +1 -0
  63. package/dist/chunk-BZXPRGLN.cjs +351 -0
  64. package/dist/chunk-BZXPRGLN.cjs.map +1 -0
  65. package/dist/chunk-DAX5C6SC.cjs +86 -0
  66. package/dist/chunk-DAX5C6SC.cjs.map +1 -0
  67. package/dist/chunk-DWNMHQ4I.cjs +57 -0
  68. package/dist/chunk-DWNMHQ4I.cjs.map +1 -0
  69. package/dist/chunk-FPGVR2BX.cjs +121 -0
  70. package/dist/chunk-FPGVR2BX.cjs.map +1 -0
  71. package/dist/chunk-JBP3G4QJ.js +50 -0
  72. package/dist/chunk-JBP3G4QJ.js.map +1 -0
  73. package/dist/chunk-JDP4DIHI.js +215 -0
  74. package/dist/chunk-JDP4DIHI.js.map +1 -0
  75. package/dist/chunk-LIZOVA4W.js +118 -0
  76. package/dist/chunk-LIZOVA4W.js.map +1 -0
  77. package/dist/chunk-QLBTOCT3.js +118 -0
  78. package/dist/chunk-QLBTOCT3.js.map +1 -0
  79. package/dist/chunk-UI2KDZ5H.js +344 -0
  80. package/dist/chunk-UI2KDZ5H.js.map +1 -0
  81. package/dist/chunk-V7QPRX4A.cjs +125 -0
  82. package/dist/chunk-V7QPRX4A.cjs.map +1 -0
  83. package/dist/chunk-VEJFN65Y.js +82 -0
  84. package/dist/chunk-VEJFN65Y.js.map +1 -0
  85. package/dist/chunk-WYZFAI6O.js +74 -0
  86. package/dist/chunk-WYZFAI6O.js.map +1 -0
  87. package/dist/chunk-XLYTATRQ.cjs +637 -0
  88. package/dist/chunk-XLYTATRQ.cjs.map +1 -0
  89. package/dist/cli/index.cjs +2036 -0
  90. package/dist/components/index.cjs +647 -0
  91. package/dist/components/index.cjs.map +1 -0
  92. package/dist/components/index.d.cts +187 -0
  93. package/dist/components/index.d.ts +187 -0
  94. package/dist/components/index.js +633 -0
  95. package/dist/components/index.js.map +1 -0
  96. package/dist/db-M3KXLBUP.js +3 -0
  97. package/dist/db-M3KXLBUP.js.map +1 -0
  98. package/dist/db-TDCZNY3Q.cjs +112 -0
  99. package/dist/db-TDCZNY3Q.cjs.map +1 -0
  100. package/dist/editor/index.cjs +1126 -0
  101. package/dist/editor/index.cjs.map +1 -0
  102. package/dist/editor/index.d.cts +137 -0
  103. package/dist/editor/index.d.ts +137 -0
  104. package/dist/editor/index.js +1093 -0
  105. package/dist/editor/index.js.map +1 -0
  106. package/dist/index-BcNka7gK.d.cts +475 -0
  107. package/dist/index-DPRgaNEE.d.ts +475 -0
  108. package/dist/index.cjs +433 -0
  109. package/dist/index.cjs.map +1 -0
  110. package/dist/index.d.cts +27 -0
  111. package/dist/index.d.ts +27 -0
  112. package/dist/index.js +209 -0
  113. package/dist/index.js.map +1 -0
  114. package/dist/lib/index.cjs +193 -0
  115. package/dist/lib/index.cjs.map +1 -0
  116. package/dist/lib/index.d.cts +4 -0
  117. package/dist/lib/index.d.ts +4 -0
  118. package/dist/lib/index.js +8 -0
  119. package/dist/lib/index.js.map +1 -0
  120. package/dist/styles/admin.css +667 -0
  121. package/dist/styles/blog.css +851 -0
  122. package/dist/styles/editor.css +452 -0
  123. package/dist/styles/globals.css +270 -0
  124. package/dist/styles/prose.css +299 -0
  125. package/dist/types-CgrBuig-.d.cts +778 -0
  126. package/dist/types-CgrBuig-.d.ts +778 -0
  127. package/package.json +140 -0
package/dist/index.cjs ADDED
@@ -0,0 +1,433 @@
1
+ 'use strict';
2
+
3
+ var chunkBZXPRGLN_cjs = require('./chunk-BZXPRGLN.cjs');
4
+ var chunk2M46MMWN_cjs = require('./chunk-2M46MMWN.cjs');
5
+ var chunkDAX5C6SC_cjs = require('./chunk-DAX5C6SC.cjs');
6
+ var chunkFPGVR2BX_cjs = require('./chunk-FPGVR2BX.cjs');
7
+ var chunk4GK22Q3R_cjs = require('./chunk-4GK22Q3R.cjs');
8
+ var chunkXLYTATRQ_cjs = require('./chunk-XLYTATRQ.cjs');
9
+
10
+ // src/editor/renderer.ts
11
+ function renderBlocksToHTML(doc) {
12
+ if (!doc.content) return "";
13
+ return doc.content.map(renderNode).join("");
14
+ }
15
+ function renderNode(node) {
16
+ switch (node.type) {
17
+ case "paragraph":
18
+ return `<p>${renderInline(node)}</p>`;
19
+ case "heading": {
20
+ const level = node.attrs?.level || 2;
21
+ const text = renderInline(node);
22
+ const id = slugify(stripTags(text));
23
+ return `<h${level} id="${id}">${text}</h${level}>`;
24
+ }
25
+ case "bulletList":
26
+ return `<ul>${renderChildren(node)}</ul>`;
27
+ case "orderedList":
28
+ return `<ol>${renderChildren(node)}</ol>`;
29
+ case "listItem":
30
+ return `<li>${renderChildren(node)}</li>`;
31
+ case "taskList":
32
+ return `<ul class="nbp-task-list">${renderChildren(node)}</ul>`;
33
+ case "taskItem": {
34
+ const checked = node.attrs?.checked ? "checked" : "";
35
+ return `<li class="nbp-task-item" data-checked="${checked}"><input type="checkbox" ${checked} disabled />${renderChildren(node)}</li>`;
36
+ }
37
+ case "blockquote":
38
+ return `<blockquote>${renderChildren(node)}</blockquote>`;
39
+ case "codeBlock": {
40
+ const lang = node.attrs?.language || "plaintext";
41
+ const filename = node.attrs?.filename;
42
+ const code = escapeHtml(getTextContent(node));
43
+ const header = filename ? `<div class="nbp-code-header">${escapeHtml(filename)}</div>` : "";
44
+ return `${header}<pre><code class="language-${lang}">${code}</code></pre>`;
45
+ }
46
+ case "image": {
47
+ const src = node.attrs?.src || "";
48
+ const alt = node.attrs?.alt || "";
49
+ const caption = node.attrs?.caption;
50
+ const width = node.attrs?.width;
51
+ const height = node.attrs?.height;
52
+ let img = `<img src="${escapeAttr(src)}" alt="${escapeAttr(alt)}"`;
53
+ if (width) img += ` width="${width}"`;
54
+ if (height) img += ` height="${height}"`;
55
+ img += ' loading="lazy" />';
56
+ if (caption) {
57
+ return `<figure>${img}<figcaption>${escapeHtml(caption)}</figcaption></figure>`;
58
+ }
59
+ return img;
60
+ }
61
+ case "horizontalRule":
62
+ return "<hr />";
63
+ case "table":
64
+ return `<table>${renderChildren(node)}</table>`;
65
+ case "tableRow":
66
+ return `<tr>${renderChildren(node)}</tr>`;
67
+ case "tableHeader":
68
+ return `<th>${renderInline(node)}</th>`;
69
+ case "tableCell":
70
+ return `<td>${renderInline(node)}</td>`;
71
+ case "callout": {
72
+ const calloutType = node.attrs?.type || "info";
73
+ const icons = {
74
+ info: "\u2139\uFE0F",
75
+ warning: "\u26A0\uFE0F",
76
+ tip: "\u{1F4A1}",
77
+ danger: "\u{1F6A8}"
78
+ };
79
+ return `<div class="nbp-callout nbp-callout-${calloutType}"><span class="nbp-callout-icon">${icons[calloutType] || ""}</span><div class="nbp-callout-content">${renderChildren(node)}</div></div>`;
80
+ }
81
+ case "faq":
82
+ return `<div class="nbp-faq" itemscope itemtype="https://schema.org/FAQPage">${renderChildren(node)}</div>`;
83
+ case "faqItem":
84
+ return `<div class="nbp-faq-item" itemscope itemprop="mainEntity" itemtype="https://schema.org/Question">${renderChildren(node)}</div>`;
85
+ case "faqQuestion":
86
+ return `<h3 itemprop="name">${renderInline(node)}</h3>`;
87
+ case "faqAnswer":
88
+ return `<div itemprop="acceptedAnswer" itemscope itemtype="https://schema.org/Answer"><div itemprop="text">${renderChildren(node)}</div></div>`;
89
+ case "tableOfContents":
90
+ return '<div data-toc="true" class="nbp-toc"></div>';
91
+ case "html":
92
+ return getTextContent(node);
93
+ case "embed": {
94
+ const embedUrl = node.attrs?.src || "";
95
+ return `<div class="nbp-embed"><iframe src="${escapeAttr(embedUrl)}" frameborder="0" allowfullscreen loading="lazy"></iframe></div>`;
96
+ }
97
+ case "text":
98
+ return renderTextNode(node);
99
+ case "hardBreak":
100
+ return "<br />";
101
+ default:
102
+ if (node.content) return renderChildren(node);
103
+ if (node.text) return escapeHtml(node.text);
104
+ return "";
105
+ }
106
+ }
107
+ function renderChildren(node) {
108
+ if (!node.content) return "";
109
+ return node.content.map(renderNode).join("");
110
+ }
111
+ function renderInline(node) {
112
+ if (!node.content) return "";
113
+ return node.content.map(renderNode).join("");
114
+ }
115
+ function renderTextNode(node) {
116
+ let text = escapeHtml(node.text || "");
117
+ if (node.marks) {
118
+ for (const mark of node.marks) {
119
+ switch (mark.type) {
120
+ case "bold":
121
+ text = `<strong>${text}</strong>`;
122
+ break;
123
+ case "italic":
124
+ text = `<em>${text}</em>`;
125
+ break;
126
+ case "strike":
127
+ text = `<s>${text}</s>`;
128
+ break;
129
+ case "code":
130
+ text = `<code>${text}</code>`;
131
+ break;
132
+ case "underline":
133
+ text = `<u>${text}</u>`;
134
+ break;
135
+ case "highlight":
136
+ text = `<mark>${text}</mark>`;
137
+ break;
138
+ case "link": {
139
+ const href = mark.attrs?.href || "";
140
+ const target = href.startsWith("http") ? ' target="_blank" rel="noopener noreferrer"' : "";
141
+ text = `<a href="${escapeAttr(href)}"${target}>${text}</a>`;
142
+ break;
143
+ }
144
+ }
145
+ }
146
+ }
147
+ return text;
148
+ }
149
+ function getTextContent(node) {
150
+ if (node.text) return node.text;
151
+ if (!node.content) return "";
152
+ return node.content.map(getTextContent).join("");
153
+ }
154
+ function escapeHtml(str) {
155
+ return str.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
156
+ }
157
+ function escapeAttr(str) {
158
+ return str.replace(/"/g, "&quot;").replace(/&/g, "&amp;");
159
+ }
160
+ function stripTags(html) {
161
+ return html.replace(/<[^>]+>/g, "");
162
+ }
163
+ function slugify(text) {
164
+ return text.toLowerCase().trim().replace(/[^\w\s-]/g, "").replace(/[\s_]+/g, "-").replace(/-+/g, "-");
165
+ }
166
+ function extractHeadings(doc) {
167
+ const headings = [];
168
+ function walk(node) {
169
+ if (node.type === "heading") {
170
+ const text = getTextContent(node);
171
+ headings.push({
172
+ id: slugify(text),
173
+ text,
174
+ level: node.attrs?.level || 2
175
+ });
176
+ }
177
+ if (node.content) {
178
+ node.content.forEach(walk);
179
+ }
180
+ }
181
+ if (doc.content) {
182
+ doc.content.forEach(walk);
183
+ }
184
+ return headings;
185
+ }
186
+ function extractFAQItems(doc) {
187
+ const items = [];
188
+ function walk(node) {
189
+ if (node.type === "faqItem" && node.content) {
190
+ const question = node.content.find((c) => c.type === "faqQuestion");
191
+ const answer = node.content.find((c) => c.type === "faqAnswer");
192
+ if (question && answer) {
193
+ items.push({
194
+ question: getTextContent(question),
195
+ answer: renderChildren(answer)
196
+ });
197
+ }
198
+ }
199
+ if (node.content) {
200
+ node.content.forEach(walk);
201
+ }
202
+ }
203
+ if (doc.content) {
204
+ doc.content.forEach(walk);
205
+ }
206
+ return items;
207
+ }
208
+
209
+ Object.defineProperty(exports, "calculateSEOScore", {
210
+ enumerable: true,
211
+ get: function () { return chunkBZXPRGLN_cjs.calculateSEOScore; }
212
+ });
213
+ Object.defineProperty(exports, "generateBreadcrumbs", {
214
+ enumerable: true,
215
+ get: function () { return chunkBZXPRGLN_cjs.generateBreadcrumbs; }
216
+ });
217
+ Object.defineProperty(exports, "generateFAQStructuredData", {
218
+ enumerable: true,
219
+ get: function () { return chunkBZXPRGLN_cjs.generateFAQStructuredData; }
220
+ });
221
+ Object.defineProperty(exports, "generateMetaTags", {
222
+ enumerable: true,
223
+ get: function () { return chunkBZXPRGLN_cjs.generateMetaTags; }
224
+ });
225
+ Object.defineProperty(exports, "generateStructuredData", {
226
+ enumerable: true,
227
+ get: function () { return chunkBZXPRGLN_cjs.generateStructuredData; }
228
+ });
229
+ Object.defineProperty(exports, "searchPosts", {
230
+ enumerable: true,
231
+ get: function () { return chunkBZXPRGLN_cjs.searchPosts; }
232
+ });
233
+ Object.defineProperty(exports, "generateSitemap", {
234
+ enumerable: true,
235
+ get: function () { return chunk2M46MMWN_cjs.generateSitemap; }
236
+ });
237
+ Object.defineProperty(exports, "absoluteUrl", {
238
+ enumerable: true,
239
+ get: function () { return chunkDAX5C6SC_cjs.absoluteUrl; }
240
+ });
241
+ Object.defineProperty(exports, "generateRSSFeed", {
242
+ enumerable: true,
243
+ get: function () { return chunkDAX5C6SC_cjs.generateRSSFeed; }
244
+ });
245
+ Object.defineProperty(exports, "isAbsoluteUrl", {
246
+ enumerable: true,
247
+ get: function () { return chunkDAX5C6SC_cjs.isAbsoluteUrl; }
248
+ });
249
+ Object.defineProperty(exports, "ImageTooLargeError", {
250
+ enumerable: true,
251
+ get: function () { return chunkFPGVR2BX_cjs.ImageTooLargeError; }
252
+ });
253
+ Object.defineProperty(exports, "processImage", {
254
+ enumerable: true,
255
+ get: function () { return chunkFPGVR2BX_cjs.processImage; }
256
+ });
257
+ Object.defineProperty(exports, "BUILT_IN_PROVIDER_NAMES", {
258
+ enumerable: true,
259
+ get: function () { return chunk4GK22Q3R_cjs.BUILT_IN_PROVIDER_NAMES; }
260
+ });
261
+ Object.defineProperty(exports, "GridFSStorageProvider", {
262
+ enumerable: true,
263
+ get: function () { return chunk4GK22Q3R_cjs.GridFSStorageProvider; }
264
+ });
265
+ Object.defineProperty(exports, "R2StorageProvider", {
266
+ enumerable: true,
267
+ get: function () { return chunk4GK22Q3R_cjs.R2StorageProvider; }
268
+ });
269
+ Object.defineProperty(exports, "StorageProviderNotRegisteredError", {
270
+ enumerable: true,
271
+ get: function () { return chunk4GK22Q3R_cjs.StorageProviderNotRegisteredError; }
272
+ });
273
+ Object.defineProperty(exports, "generateKey", {
274
+ enumerable: true,
275
+ get: function () { return chunk4GK22Q3R_cjs.generateKey; }
276
+ });
277
+ Object.defineProperty(exports, "getStorageProvider", {
278
+ enumerable: true,
279
+ get: function () { return chunk4GK22Q3R_cjs.getStorageProvider; }
280
+ });
281
+ Object.defineProperty(exports, "getStorageProviderByName", {
282
+ enumerable: true,
283
+ get: function () { return chunk4GK22Q3R_cjs.getStorageProviderByName; }
284
+ });
285
+ Object.defineProperty(exports, "isStorageProviderRegistered", {
286
+ enumerable: true,
287
+ get: function () { return chunk4GK22Q3R_cjs.isStorageProviderRegistered; }
288
+ });
289
+ Object.defineProperty(exports, "listStorageProviderNames", {
290
+ enumerable: true,
291
+ get: function () { return chunk4GK22Q3R_cjs.listStorageProviderNames; }
292
+ });
293
+ Object.defineProperty(exports, "registerStorageProvider", {
294
+ enumerable: true,
295
+ get: function () { return chunk4GK22Q3R_cjs.registerStorageProvider; }
296
+ });
297
+ Object.defineProperty(exports, "unregisterStorageProvider", {
298
+ enumerable: true,
299
+ get: function () { return chunk4GK22Q3R_cjs.unregisterStorageProvider; }
300
+ });
301
+ Object.defineProperty(exports, "ConfigNotInstalledError", {
302
+ enumerable: true,
303
+ get: function () { return chunkXLYTATRQ_cjs.ConfigNotInstalledError; }
304
+ });
305
+ Object.defineProperty(exports, "calculateReadingTime", {
306
+ enumerable: true,
307
+ get: function () { return chunkXLYTATRQ_cjs.calculateReadingTime; }
308
+ });
309
+ Object.defineProperty(exports, "countWords", {
310
+ enumerable: true,
311
+ get: function () { return chunkXLYTATRQ_cjs.countWords; }
312
+ });
313
+ Object.defineProperty(exports, "createCategory", {
314
+ enumerable: true,
315
+ get: function () { return chunkXLYTATRQ_cjs.createCategory; }
316
+ });
317
+ Object.defineProperty(exports, "createMedia", {
318
+ enumerable: true,
319
+ get: function () { return chunkXLYTATRQ_cjs.createMedia; }
320
+ });
321
+ Object.defineProperty(exports, "createPost", {
322
+ enumerable: true,
323
+ get: function () { return chunkXLYTATRQ_cjs.createPost; }
324
+ });
325
+ Object.defineProperty(exports, "defineConfig", {
326
+ enumerable: true,
327
+ get: function () { return chunkXLYTATRQ_cjs.defineConfig; }
328
+ });
329
+ Object.defineProperty(exports, "deleteCategory", {
330
+ enumerable: true,
331
+ get: function () { return chunkXLYTATRQ_cjs.deleteCategory; }
332
+ });
333
+ Object.defineProperty(exports, "deleteMedia", {
334
+ enumerable: true,
335
+ get: function () { return chunkXLYTATRQ_cjs.deleteMedia; }
336
+ });
337
+ Object.defineProperty(exports, "deletePost", {
338
+ enumerable: true,
339
+ get: function () { return chunkXLYTATRQ_cjs.deletePost; }
340
+ });
341
+ Object.defineProperty(exports, "ensureIndexes", {
342
+ enumerable: true,
343
+ get: function () { return chunkXLYTATRQ_cjs.ensureIndexes; }
344
+ });
345
+ Object.defineProperty(exports, "ensureUniqueSlug", {
346
+ enumerable: true,
347
+ get: function () { return chunkXLYTATRQ_cjs.ensureUniqueSlug; }
348
+ });
349
+ Object.defineProperty(exports, "extractTextFromBlocks", {
350
+ enumerable: true,
351
+ get: function () { return chunkXLYTATRQ_cjs.extractTextFromBlocks; }
352
+ });
353
+ Object.defineProperty(exports, "extractTextFromHTML", {
354
+ enumerable: true,
355
+ get: function () { return chunkXLYTATRQ_cjs.extractTextFromHTML; }
356
+ });
357
+ Object.defineProperty(exports, "generateSlug", {
358
+ enumerable: true,
359
+ get: function () { return chunkXLYTATRQ_cjs.generateSlug; }
360
+ });
361
+ Object.defineProperty(exports, "getBlogConfig", {
362
+ enumerable: true,
363
+ get: function () { return chunkXLYTATRQ_cjs.getBlogConfig; }
364
+ });
365
+ Object.defineProperty(exports, "getCategoryBySlug", {
366
+ enumerable: true,
367
+ get: function () { return chunkXLYTATRQ_cjs.getCategoryBySlug; }
368
+ });
369
+ Object.defineProperty(exports, "getCollection", {
370
+ enumerable: true,
371
+ get: function () { return chunkXLYTATRQ_cjs.getCollection; }
372
+ });
373
+ Object.defineProperty(exports, "getConfig", {
374
+ enumerable: true,
375
+ get: function () { return chunkXLYTATRQ_cjs.getConfig; }
376
+ });
377
+ Object.defineProperty(exports, "getDb", {
378
+ enumerable: true,
379
+ get: function () { return chunkXLYTATRQ_cjs.getDb; }
380
+ });
381
+ Object.defineProperty(exports, "getEnvConfig", {
382
+ enumerable: true,
383
+ get: function () { return chunkXLYTATRQ_cjs.getEnvConfig; }
384
+ });
385
+ Object.defineProperty(exports, "getPostById", {
386
+ enumerable: true,
387
+ get: function () { return chunkXLYTATRQ_cjs.getPostById; }
388
+ });
389
+ Object.defineProperty(exports, "getPostBySlug", {
390
+ enumerable: true,
391
+ get: function () { return chunkXLYTATRQ_cjs.getPostBySlug; }
392
+ });
393
+ Object.defineProperty(exports, "getSettings", {
394
+ enumerable: true,
395
+ get: function () { return chunkXLYTATRQ_cjs.getSettings; }
396
+ });
397
+ Object.defineProperty(exports, "isConfigInstalled", {
398
+ enumerable: true,
399
+ get: function () { return chunkXLYTATRQ_cjs.isConfigInstalled; }
400
+ });
401
+ Object.defineProperty(exports, "listCategories", {
402
+ enumerable: true,
403
+ get: function () { return chunkXLYTATRQ_cjs.listCategories; }
404
+ });
405
+ Object.defineProperty(exports, "listMedia", {
406
+ enumerable: true,
407
+ get: function () { return chunkXLYTATRQ_cjs.listMedia; }
408
+ });
409
+ Object.defineProperty(exports, "listPosts", {
410
+ enumerable: true,
411
+ get: function () { return chunkXLYTATRQ_cjs.listPosts; }
412
+ });
413
+ Object.defineProperty(exports, "setConfig", {
414
+ enumerable: true,
415
+ get: function () { return chunkXLYTATRQ_cjs.setConfig; }
416
+ });
417
+ Object.defineProperty(exports, "updateCategory", {
418
+ enumerable: true,
419
+ get: function () { return chunkXLYTATRQ_cjs.updateCategory; }
420
+ });
421
+ Object.defineProperty(exports, "updatePost", {
422
+ enumerable: true,
423
+ get: function () { return chunkXLYTATRQ_cjs.updatePost; }
424
+ });
425
+ Object.defineProperty(exports, "updateSettings", {
426
+ enumerable: true,
427
+ get: function () { return chunkXLYTATRQ_cjs.updateSettings; }
428
+ });
429
+ exports.extractFAQItems = extractFAQItems;
430
+ exports.extractHeadings = extractHeadings;
431
+ exports.renderBlocksToHTML = renderBlocksToHTML;
432
+ //# sourceMappingURL=index.cjs.map
433
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/editor/renderer.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["import type { BlockContent } from '../lib/types';\n\nexport function renderBlocksToHTML(doc: { type: string; content?: BlockContent[] }): string {\n if (!doc.content) return '';\n return doc.content.map(renderNode).join('');\n}\n\nfunction renderNode(node: BlockContent): string {\n switch (node.type) {\n case 'paragraph':\n return `<p>${renderInline(node)}</p>`;\n\n case 'heading': {\n const level = (node.attrs?.level as number) || 2;\n const text = renderInline(node);\n const id = slugify(stripTags(text));\n return `<h${level} id=\"${id}\">${text}</h${level}>`;\n }\n\n case 'bulletList':\n return `<ul>${renderChildren(node)}</ul>`;\n\n case 'orderedList':\n return `<ol>${renderChildren(node)}</ol>`;\n\n case 'listItem':\n return `<li>${renderChildren(node)}</li>`;\n\n case 'taskList':\n return `<ul class=\"nbp-task-list\">${renderChildren(node)}</ul>`;\n\n case 'taskItem': {\n const checked = node.attrs?.checked ? 'checked' : '';\n return `<li class=\"nbp-task-item\" data-checked=\"${checked}\"><input type=\"checkbox\" ${checked} disabled />${renderChildren(node)}</li>`;\n }\n\n case 'blockquote':\n return `<blockquote>${renderChildren(node)}</blockquote>`;\n\n case 'codeBlock': {\n const lang = (node.attrs?.language as string) || 'plaintext';\n const filename = node.attrs?.filename as string;\n const code = escapeHtml(getTextContent(node));\n const header = filename ? `<div class=\"nbp-code-header\">${escapeHtml(filename)}</div>` : '';\n return `${header}<pre><code class=\"language-${lang}\">${code}</code></pre>`;\n }\n\n case 'image': {\n const src = node.attrs?.src as string || '';\n const alt = node.attrs?.alt as string || '';\n const caption = node.attrs?.caption as string;\n const width = node.attrs?.width;\n const height = node.attrs?.height;\n let img = `<img src=\"${escapeAttr(src)}\" alt=\"${escapeAttr(alt)}\"`;\n if (width) img += ` width=\"${width}\"`;\n if (height) img += ` height=\"${height}\"`;\n img += ' loading=\"lazy\" />';\n if (caption) {\n return `<figure>${img}<figcaption>${escapeHtml(caption)}</figcaption></figure>`;\n }\n return img;\n }\n\n case 'horizontalRule':\n return '<hr />';\n\n case 'table':\n return `<table>${renderChildren(node)}</table>`;\n\n case 'tableRow':\n return `<tr>${renderChildren(node)}</tr>`;\n\n case 'tableHeader':\n return `<th>${renderInline(node)}</th>`;\n\n case 'tableCell':\n return `<td>${renderInline(node)}</td>`;\n\n case 'callout': {\n const calloutType = (node.attrs?.type as string) || 'info';\n const icons: Record<string, string> = {\n info: 'ℹ️',\n warning: '⚠️',\n tip: '💡',\n danger: '🚨',\n };\n return `<div class=\"nbp-callout nbp-callout-${calloutType}\"><span class=\"nbp-callout-icon\">${icons[calloutType] || ''}</span><div class=\"nbp-callout-content\">${renderChildren(node)}</div></div>`;\n }\n\n case 'faq':\n return `<div class=\"nbp-faq\" itemscope itemtype=\"https://schema.org/FAQPage\">${renderChildren(node)}</div>`;\n\n case 'faqItem':\n return `<div class=\"nbp-faq-item\" itemscope itemprop=\"mainEntity\" itemtype=\"https://schema.org/Question\">${renderChildren(node)}</div>`;\n\n case 'faqQuestion':\n return `<h3 itemprop=\"name\">${renderInline(node)}</h3>`;\n\n case 'faqAnswer':\n return `<div itemprop=\"acceptedAnswer\" itemscope itemtype=\"https://schema.org/Answer\"><div itemprop=\"text\">${renderChildren(node)}</div></div>`;\n\n case 'tableOfContents':\n return '<div data-toc=\"true\" class=\"nbp-toc\"></div>';\n\n case 'html':\n return getTextContent(node);\n\n case 'embed': {\n const embedUrl = node.attrs?.src as string || '';\n return `<div class=\"nbp-embed\"><iframe src=\"${escapeAttr(embedUrl)}\" frameborder=\"0\" allowfullscreen loading=\"lazy\"></iframe></div>`;\n }\n\n case 'text':\n return renderTextNode(node);\n\n case 'hardBreak':\n return '<br />';\n\n default:\n if (node.content) return renderChildren(node);\n if (node.text) return escapeHtml(node.text);\n return '';\n }\n}\n\nfunction renderChildren(node: BlockContent): string {\n if (!node.content) return '';\n return node.content.map(renderNode).join('');\n}\n\nfunction renderInline(node: BlockContent): string {\n if (!node.content) return '';\n return node.content.map(renderNode).join('');\n}\n\nfunction renderTextNode(node: BlockContent): string {\n let text = escapeHtml(node.text || '');\n\n if (node.marks) {\n for (const mark of node.marks) {\n switch (mark.type) {\n case 'bold':\n text = `<strong>${text}</strong>`;\n break;\n case 'italic':\n text = `<em>${text}</em>`;\n break;\n case 'strike':\n text = `<s>${text}</s>`;\n break;\n case 'code':\n text = `<code>${text}</code>`;\n break;\n case 'underline':\n text = `<u>${text}</u>`;\n break;\n case 'highlight':\n text = `<mark>${text}</mark>`;\n break;\n case 'link': {\n const href = mark.attrs?.href as string || '';\n const target = href.startsWith('http') ? ' target=\"_blank\" rel=\"noopener noreferrer\"' : '';\n text = `<a href=\"${escapeAttr(href)}\"${target}>${text}</a>`;\n break;\n }\n }\n }\n }\n\n return text;\n}\n\nfunction getTextContent(node: BlockContent): string {\n if (node.text) return node.text;\n if (!node.content) return '';\n return node.content.map(getTextContent).join('');\n}\n\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;');\n}\n\nfunction escapeAttr(str: string): string {\n return str.replace(/\"/g, '&quot;').replace(/&/g, '&amp;');\n}\n\nfunction stripTags(html: string): string {\n return html.replace(/<[^>]+>/g, '');\n}\n\nfunction slugify(text: string): string {\n return text\n .toLowerCase()\n .trim()\n .replace(/[^\\w\\s-]/g, '')\n .replace(/[\\s_]+/g, '-')\n .replace(/-+/g, '-');\n}\n\nexport function extractHeadings(\n doc: { type: string; content?: BlockContent[] }\n): { id: string; text: string; level: number }[] {\n const headings: { id: string; text: string; level: number }[] = [];\n\n function walk(node: BlockContent) {\n if (node.type === 'heading') {\n const text = getTextContent(node);\n headings.push({\n id: slugify(text),\n text,\n level: (node.attrs?.level as number) || 2,\n });\n }\n if (node.content) {\n node.content.forEach(walk);\n }\n }\n\n if (doc.content) {\n doc.content.forEach(walk);\n }\n\n return headings;\n}\n\nexport function extractFAQItems(\n doc: { type: string; content?: BlockContent[] }\n): { question: string; answer: string }[] {\n const items: { question: string; answer: string }[] = [];\n\n function walk(node: BlockContent) {\n if (node.type === 'faqItem' && node.content) {\n const question = node.content.find((c) => c.type === 'faqQuestion');\n const answer = node.content.find((c) => c.type === 'faqAnswer');\n if (question && answer) {\n items.push({\n question: getTextContent(question),\n answer: renderChildren(answer),\n });\n }\n }\n if (node.content) {\n node.content.forEach(walk);\n }\n }\n\n if (doc.content) {\n doc.content.forEach(walk);\n }\n\n return items;\n}\n"]}
@@ -0,0 +1,27 @@
1
+ export { B as BUILT_IN_PROVIDER_NAMES, C as ConfigNotInstalledError, G as GridFSStorageProvider, I as ImageTooLargeError, M as MediaUploadResult, P as ProcessedImage, R as R2StorageProvider, S as StorageObject, a as StorageProvider, b as StorageProviderNotRegisteredError, c as absoluteUrl, d as calculateReadingTime, e as calculateSEOScore, f as countWords, g as createCategory, h as createMedia, i as createPost, j as defineConfig, k as deleteCategory, l as deleteMedia, m as deletePost, n as ensureIndexes, o as ensureUniqueSlug, p as extractTextFromBlocks, q as extractTextFromHTML, r as generateBreadcrumbs, s as generateFAQStructuredData, t as generateKey, u as generateMetaTags, v as generateRSSFeed, w as generateSitemap, x as generateSlug, y as generateStructuredData, z as getBlogConfig, A as getCategoryBySlug, D as getCollection, E as getConfig, F as getDb, H as getEnvConfig, J as getPostById, K as getPostBySlug, L as getSettings, N as getStorageProvider, O as getStorageProviderByName, Q as isAbsoluteUrl, T as isConfigInstalled, U as isStorageProviderRegistered, V as listCategories, W as listMedia, X as listPosts, Y as listStorageProviderNames, Z as processImage, _ as registerStorageProvider, $ as searchPosts, a0 as setConfig, a1 as unregisterStorageProvider, a2 as updateCategory, a3 as updatePost, a4 as updateSettings } from './index-BcNka7gK.cjs';
2
+ import { B as BlockContent } from './types-CgrBuig-.cjs';
3
+ export { A as ApiErrorResponse, a as ApiResponse, b as ApiSuccessResponse, c as Author, d as BlockType, e as BlogPanelConfig, f as BlogPanelUserConfig, g as BlogPost, h as BlogSettings, C as Category, i as CreateCategoryInput, j as CreatePostInput, M as Media, k as MediaListQuery, l as MediaReference, P as PostListQuery, m as PostSEO, n as PostStatus, R as Revision, S as SEOCheck, o as SEOCheckStatus, p as SEOOverallScore, q as SEOScore, U as UpdateCategoryInput, r as UpdatePostInput } from './types-CgrBuig-.cjs';
4
+ import 'zod';
5
+ import 'mongodb';
6
+
7
+ declare function renderBlocksToHTML(doc: {
8
+ type: string;
9
+ content?: BlockContent[];
10
+ }): string;
11
+ declare function extractHeadings(doc: {
12
+ type: string;
13
+ content?: BlockContent[];
14
+ }): {
15
+ id: string;
16
+ text: string;
17
+ level: number;
18
+ }[];
19
+ declare function extractFAQItems(doc: {
20
+ type: string;
21
+ content?: BlockContent[];
22
+ }): {
23
+ question: string;
24
+ answer: string;
25
+ }[];
26
+
27
+ export { BlockContent, extractFAQItems, extractHeadings, renderBlocksToHTML };
@@ -0,0 +1,27 @@
1
+ export { B as BUILT_IN_PROVIDER_NAMES, C as ConfigNotInstalledError, G as GridFSStorageProvider, I as ImageTooLargeError, M as MediaUploadResult, P as ProcessedImage, R as R2StorageProvider, S as StorageObject, a as StorageProvider, b as StorageProviderNotRegisteredError, c as absoluteUrl, d as calculateReadingTime, e as calculateSEOScore, f as countWords, g as createCategory, h as createMedia, i as createPost, j as defineConfig, k as deleteCategory, l as deleteMedia, m as deletePost, n as ensureIndexes, o as ensureUniqueSlug, p as extractTextFromBlocks, q as extractTextFromHTML, r as generateBreadcrumbs, s as generateFAQStructuredData, t as generateKey, u as generateMetaTags, v as generateRSSFeed, w as generateSitemap, x as generateSlug, y as generateStructuredData, z as getBlogConfig, A as getCategoryBySlug, D as getCollection, E as getConfig, F as getDb, H as getEnvConfig, J as getPostById, K as getPostBySlug, L as getSettings, N as getStorageProvider, O as getStorageProviderByName, Q as isAbsoluteUrl, T as isConfigInstalled, U as isStorageProviderRegistered, V as listCategories, W as listMedia, X as listPosts, Y as listStorageProviderNames, Z as processImage, _ as registerStorageProvider, $ as searchPosts, a0 as setConfig, a1 as unregisterStorageProvider, a2 as updateCategory, a3 as updatePost, a4 as updateSettings } from './index-DPRgaNEE.js';
2
+ import { B as BlockContent } from './types-CgrBuig-.js';
3
+ export { A as ApiErrorResponse, a as ApiResponse, b as ApiSuccessResponse, c as Author, d as BlockType, e as BlogPanelConfig, f as BlogPanelUserConfig, g as BlogPost, h as BlogSettings, C as Category, i as CreateCategoryInput, j as CreatePostInput, M as Media, k as MediaListQuery, l as MediaReference, P as PostListQuery, m as PostSEO, n as PostStatus, R as Revision, S as SEOCheck, o as SEOCheckStatus, p as SEOOverallScore, q as SEOScore, U as UpdateCategoryInput, r as UpdatePostInput } from './types-CgrBuig-.js';
4
+ import 'zod';
5
+ import 'mongodb';
6
+
7
+ declare function renderBlocksToHTML(doc: {
8
+ type: string;
9
+ content?: BlockContent[];
10
+ }): string;
11
+ declare function extractHeadings(doc: {
12
+ type: string;
13
+ content?: BlockContent[];
14
+ }): {
15
+ id: string;
16
+ text: string;
17
+ level: number;
18
+ }[];
19
+ declare function extractFAQItems(doc: {
20
+ type: string;
21
+ content?: BlockContent[];
22
+ }): {
23
+ question: string;
24
+ answer: string;
25
+ }[];
26
+
27
+ export { BlockContent, extractFAQItems, extractHeadings, renderBlocksToHTML };