@jhits/plugin-blog 0.0.9 → 0.0.11

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 (276) hide show
  1. package/package.json +58 -59
  2. package/src/api/categories.ts +0 -43
  3. package/src/api/check-title.ts +0 -60
  4. package/src/api/config-handler.ts +0 -76
  5. package/src/api/handler.ts +0 -418
  6. package/src/api/index.ts +0 -33
  7. package/src/api/route.ts +0 -116
  8. package/src/api/router.ts +0 -128
  9. package/src/api-server.ts +0 -11
  10. package/src/config.ts +0 -161
  11. package/src/hooks/index.d.ts +0 -8
  12. package/src/hooks/index.d.ts.map +0 -1
  13. package/src/hooks/index.js +0 -7
  14. package/src/hooks/index.ts +0 -9
  15. package/src/hooks/useBlog.d.ts +0 -31
  16. package/src/hooks/useBlog.d.ts.map +0 -1
  17. package/src/hooks/useBlog.js +0 -57
  18. package/src/hooks/useBlog.ts +0 -85
  19. package/src/hooks/useBlogs.d.ts +0 -39
  20. package/src/hooks/useBlogs.d.ts.map +0 -1
  21. package/src/hooks/useBlogs.js +0 -82
  22. package/src/hooks/useBlogs.ts +0 -123
  23. package/src/hooks/useCategories.d.ts +0 -9
  24. package/src/hooks/useCategories.d.ts.map +0 -1
  25. package/src/hooks/useCategories.js +0 -70
  26. package/src/hooks/useCategories.ts +0 -76
  27. package/src/index.d.ts +0 -55
  28. package/src/index.d.ts.map +0 -1
  29. package/src/index.js +0 -228
  30. package/src/index.server.ts +0 -14
  31. package/src/index.tsx +0 -335
  32. package/src/init.d.ts +0 -40
  33. package/src/init.d.ts.map +0 -1
  34. package/src/init.js +0 -41
  35. package/src/init.tsx +0 -63
  36. package/src/lib/blocks/BlockRenderer.d.ts +0 -54
  37. package/src/lib/blocks/BlockRenderer.d.ts.map +0 -1
  38. package/src/lib/blocks/BlockRenderer.js +0 -54
  39. package/src/lib/blocks/BlockRenderer.tsx +0 -141
  40. package/src/lib/blocks/index.ts +0 -6
  41. package/src/lib/config-storage.d.ts +0 -30
  42. package/src/lib/config-storage.d.ts.map +0 -1
  43. package/src/lib/config-storage.js +0 -31
  44. package/src/lib/config-storage.ts +0 -65
  45. package/src/lib/index.ts +0 -9
  46. package/src/lib/layouts/blocks/ColumnsBlock.d.ts +0 -25
  47. package/src/lib/layouts/blocks/ColumnsBlock.d.ts.map +0 -1
  48. package/src/lib/layouts/blocks/ColumnsBlock.js +0 -182
  49. package/src/lib/layouts/blocks/ColumnsBlock.tsx +0 -298
  50. package/src/lib/layouts/blocks/ColumnsBlock.tsx.tmp +0 -81
  51. package/src/lib/layouts/blocks/SectionBlock.d.ts +0 -25
  52. package/src/lib/layouts/blocks/SectionBlock.d.ts.map +0 -1
  53. package/src/lib/layouts/blocks/SectionBlock.js +0 -44
  54. package/src/lib/layouts/blocks/SectionBlock.tsx +0 -104
  55. package/src/lib/layouts/blocks/index.ts +0 -8
  56. package/src/lib/layouts/index.d.ts +0 -23
  57. package/src/lib/layouts/index.d.ts.map +0 -1
  58. package/src/lib/layouts/index.js +0 -45
  59. package/src/lib/layouts/index.ts +0 -52
  60. package/src/lib/layouts/registerLayoutBlocks.d.ts +0 -9
  61. package/src/lib/layouts/registerLayoutBlocks.d.ts.map +0 -1
  62. package/src/lib/layouts/registerLayoutBlocks.js +0 -60
  63. package/src/lib/layouts/registerLayoutBlocks.ts +0 -64
  64. package/src/lib/mappers/apiMapper.d.ts +0 -66
  65. package/src/lib/mappers/apiMapper.d.ts.map +0 -1
  66. package/src/lib/mappers/apiMapper.js +0 -191
  67. package/src/lib/mappers/apiMapper.ts +0 -254
  68. package/src/lib/migration/index.ts +0 -6
  69. package/src/lib/migration/mapper.ts +0 -140
  70. package/src/lib/rich-text/RichTextEditor.d.ts +0 -45
  71. package/src/lib/rich-text/RichTextEditor.d.ts.map +0 -1
  72. package/src/lib/rich-text/RichTextEditor.js +0 -564
  73. package/src/lib/rich-text/RichTextEditor.tsx +0 -826
  74. package/src/lib/rich-text/RichTextPreview.d.ts +0 -16
  75. package/src/lib/rich-text/RichTextPreview.d.ts.map +0 -1
  76. package/src/lib/rich-text/RichTextPreview.js +0 -144
  77. package/src/lib/rich-text/RichTextPreview.tsx +0 -210
  78. package/src/lib/rich-text/index.d.ts +0 -9
  79. package/src/lib/rich-text/index.d.ts.map +0 -1
  80. package/src/lib/rich-text/index.js +0 -6
  81. package/src/lib/rich-text/index.ts +0 -10
  82. package/src/lib/utils/blockHelpers.d.ts +0 -23
  83. package/src/lib/utils/blockHelpers.d.ts.map +0 -1
  84. package/src/lib/utils/blockHelpers.js +0 -65
  85. package/src/lib/utils/blockHelpers.ts +0 -72
  86. package/src/lib/utils/configValidation.d.ts +0 -23
  87. package/src/lib/utils/configValidation.d.ts.map +0 -1
  88. package/src/lib/utils/configValidation.js +0 -113
  89. package/src/lib/utils/configValidation.ts +0 -137
  90. package/src/lib/utils/index.ts +0 -8
  91. package/src/lib/utils/slugify.ts +0 -79
  92. package/src/registry/BlockRegistry.d.ts +0 -62
  93. package/src/registry/BlockRegistry.d.ts.map +0 -1
  94. package/src/registry/BlockRegistry.js +0 -112
  95. package/src/registry/BlockRegistry.ts +0 -139
  96. package/src/registry/index.d.ts +0 -6
  97. package/src/registry/index.d.ts.map +0 -1
  98. package/src/registry/index.js +0 -4
  99. package/src/registry/index.ts +0 -11
  100. package/src/state/EditorContext.d.ts +0 -45
  101. package/src/state/EditorContext.d.ts.map +0 -1
  102. package/src/state/EditorContext.js +0 -215
  103. package/src/state/EditorContext.tsx +0 -283
  104. package/src/state/index.d.ts +0 -7
  105. package/src/state/index.d.ts.map +0 -1
  106. package/src/state/index.js +0 -6
  107. package/src/state/index.ts +0 -8
  108. package/src/state/reducer.d.ts +0 -11
  109. package/src/state/reducer.d.ts.map +0 -1
  110. package/src/state/reducer.js +0 -443
  111. package/src/state/reducer.ts +0 -694
  112. package/src/state/types.d.ts +0 -162
  113. package/src/state/types.d.ts.map +0 -1
  114. package/src/state/types.js +0 -27
  115. package/src/state/types.ts +0 -160
  116. package/src/types/block.d.ts +0 -221
  117. package/src/types/block.d.ts.map +0 -1
  118. package/src/types/block.js +0 -6
  119. package/src/types/block.ts +0 -269
  120. package/src/types/index.d.ts +0 -8
  121. package/src/types/index.d.ts.map +0 -1
  122. package/src/types/index.js +0 -5
  123. package/src/types/index.ts +0 -17
  124. package/src/types/post.d.ts +0 -136
  125. package/src/types/post.d.ts.map +0 -1
  126. package/src/types/post.js +0 -5
  127. package/src/types/post.ts +0 -169
  128. package/src/utils/client.d.ts +0 -48
  129. package/src/utils/client.d.ts.map +0 -1
  130. package/src/utils/client.js +0 -77
  131. package/src/utils/client.ts +0 -122
  132. package/src/utils/index.ts +0 -7
  133. package/src/views/CanvasEditor/BlockWrapper.d.ts +0 -16
  134. package/src/views/CanvasEditor/BlockWrapper.d.ts.map +0 -1
  135. package/src/views/CanvasEditor/BlockWrapper.js +0 -276
  136. package/src/views/CanvasEditor/BlockWrapper.tsx +0 -522
  137. package/src/views/CanvasEditor/CanvasEditorView.d.ts +0 -14
  138. package/src/views/CanvasEditor/CanvasEditorView.d.ts.map +0 -1
  139. package/src/views/CanvasEditor/CanvasEditorView.js +0 -209
  140. package/src/views/CanvasEditor/CanvasEditorView.tsx +0 -337
  141. package/src/views/CanvasEditor/EditorBody.d.ts +0 -22
  142. package/src/views/CanvasEditor/EditorBody.d.ts.map +0 -1
  143. package/src/views/CanvasEditor/EditorBody.js +0 -505
  144. package/src/views/CanvasEditor/EditorBody.tsx +0 -665
  145. package/src/views/CanvasEditor/EditorHeader.d.ts +0 -18
  146. package/src/views/CanvasEditor/EditorHeader.d.ts.map +0 -1
  147. package/src/views/CanvasEditor/EditorHeader.js +0 -101
  148. package/src/views/CanvasEditor/EditorHeader.tsx +0 -268
  149. package/src/views/CanvasEditor/LayoutContainer.d.ts +0 -17
  150. package/src/views/CanvasEditor/LayoutContainer.d.ts.map +0 -1
  151. package/src/views/CanvasEditor/LayoutContainer.js +0 -222
  152. package/src/views/CanvasEditor/LayoutContainer.tsx +0 -322
  153. package/src/views/CanvasEditor/SaveConfirmationModal.d.ts +0 -13
  154. package/src/views/CanvasEditor/SaveConfirmationModal.d.ts.map +0 -1
  155. package/src/views/CanvasEditor/SaveConfirmationModal.js +0 -78
  156. package/src/views/CanvasEditor/SaveConfirmationModal.tsx +0 -233
  157. package/src/views/CanvasEditor/components/CustomBlockItem.d.ts +0 -14
  158. package/src/views/CanvasEditor/components/CustomBlockItem.d.ts.map +0 -1
  159. package/src/views/CanvasEditor/components/CustomBlockItem.js +0 -44
  160. package/src/views/CanvasEditor/components/CustomBlockItem.tsx +0 -92
  161. package/src/views/CanvasEditor/components/EditorCanvas.d.ts +0 -29
  162. package/src/views/CanvasEditor/components/EditorCanvas.d.ts.map +0 -1
  163. package/src/views/CanvasEditor/components/EditorCanvas.js +0 -32
  164. package/src/views/CanvasEditor/components/EditorCanvas.tsx +0 -160
  165. package/src/views/CanvasEditor/components/EditorLibrary.d.ts +0 -7
  166. package/src/views/CanvasEditor/components/EditorLibrary.d.ts.map +0 -1
  167. package/src/views/CanvasEditor/components/EditorLibrary.js +0 -25
  168. package/src/views/CanvasEditor/components/EditorLibrary.tsx +0 -122
  169. package/src/views/CanvasEditor/components/EditorSidebar.d.ts +0 -13
  170. package/src/views/CanvasEditor/components/EditorSidebar.d.ts.map +0 -1
  171. package/src/views/CanvasEditor/components/EditorSidebar.js +0 -20
  172. package/src/views/CanvasEditor/components/EditorSidebar.tsx +0 -181
  173. package/src/views/CanvasEditor/components/ErrorBanner.d.ts +0 -6
  174. package/src/views/CanvasEditor/components/ErrorBanner.d.ts.map +0 -1
  175. package/src/views/CanvasEditor/components/ErrorBanner.js +0 -8
  176. package/src/views/CanvasEditor/components/ErrorBanner.tsx +0 -31
  177. package/src/views/CanvasEditor/components/FeaturedMediaSection.d.ts +0 -25
  178. package/src/views/CanvasEditor/components/FeaturedMediaSection.d.ts.map +0 -1
  179. package/src/views/CanvasEditor/components/FeaturedMediaSection.js +0 -182
  180. package/src/views/CanvasEditor/components/FeaturedMediaSection.tsx +0 -341
  181. package/src/views/CanvasEditor/components/LibraryItem.d.ts +0 -14
  182. package/src/views/CanvasEditor/components/LibraryItem.d.ts.map +0 -1
  183. package/src/views/CanvasEditor/components/LibraryItem.js +0 -43
  184. package/src/views/CanvasEditor/components/LibraryItem.tsx +0 -80
  185. package/src/views/CanvasEditor/components/PrivacySettingsSection.d.ts +0 -15
  186. package/src/views/CanvasEditor/components/PrivacySettingsSection.d.ts.map +0 -1
  187. package/src/views/CanvasEditor/components/PrivacySettingsSection.js +0 -63
  188. package/src/views/CanvasEditor/components/PrivacySettingsSection.tsx +0 -212
  189. package/src/views/CanvasEditor/components/index.d.ts +0 -21
  190. package/src/views/CanvasEditor/components/index.d.ts.map +0 -1
  191. package/src/views/CanvasEditor/components/index.js +0 -12
  192. package/src/views/CanvasEditor/components/index.ts +0 -28
  193. package/src/views/CanvasEditor/hooks/index.d.ts +0 -10
  194. package/src/views/CanvasEditor/hooks/index.d.ts.map +0 -1
  195. package/src/views/CanvasEditor/hooks/index.js +0 -9
  196. package/src/views/CanvasEditor/hooks/index.ts +0 -10
  197. package/src/views/CanvasEditor/hooks/useHeroBlock.d.ts +0 -8
  198. package/src/views/CanvasEditor/hooks/useHeroBlock.d.ts.map +0 -1
  199. package/src/views/CanvasEditor/hooks/useHeroBlock.js +0 -79
  200. package/src/views/CanvasEditor/hooks/useHeroBlock.ts +0 -103
  201. package/src/views/CanvasEditor/hooks/useKeyboardShortcuts.d.ts +0 -3
  202. package/src/views/CanvasEditor/hooks/useKeyboardShortcuts.d.ts.map +0 -1
  203. package/src/views/CanvasEditor/hooks/useKeyboardShortcuts.js +0 -114
  204. package/src/views/CanvasEditor/hooks/useKeyboardShortcuts.ts +0 -142
  205. package/src/views/CanvasEditor/hooks/usePostLoader.d.ts +0 -5
  206. package/src/views/CanvasEditor/hooks/usePostLoader.d.ts.map +0 -1
  207. package/src/views/CanvasEditor/hooks/usePostLoader.js +0 -32
  208. package/src/views/CanvasEditor/hooks/usePostLoader.ts +0 -39
  209. package/src/views/CanvasEditor/hooks/useRegisteredBlocks.d.ts +0 -2
  210. package/src/views/CanvasEditor/hooks/useRegisteredBlocks.d.ts.map +0 -1
  211. package/src/views/CanvasEditor/hooks/useRegisteredBlocks.js +0 -47
  212. package/src/views/CanvasEditor/hooks/useRegisteredBlocks.ts +0 -55
  213. package/src/views/CanvasEditor/hooks/useUnsavedChanges.d.ts +0 -25
  214. package/src/views/CanvasEditor/hooks/useUnsavedChanges.d.ts.map +0 -1
  215. package/src/views/CanvasEditor/hooks/useUnsavedChanges.js +0 -285
  216. package/src/views/CanvasEditor/hooks/useUnsavedChanges.ts +0 -339
  217. package/src/views/CanvasEditor/index.d.ts +0 -16
  218. package/src/views/CanvasEditor/index.d.ts.map +0 -1
  219. package/src/views/CanvasEditor/index.js +0 -9
  220. package/src/views/CanvasEditor/index.ts +0 -16
  221. package/src/views/PostManager/EmptyState.d.ts +0 -10
  222. package/src/views/PostManager/EmptyState.d.ts.map +0 -1
  223. package/src/views/PostManager/EmptyState.js +0 -12
  224. package/src/views/PostManager/EmptyState.tsx +0 -42
  225. package/src/views/PostManager/PostActionsMenu.d.ts +0 -12
  226. package/src/views/PostManager/PostActionsMenu.d.ts.map +0 -1
  227. package/src/views/PostManager/PostActionsMenu.js +0 -58
  228. package/src/views/PostManager/PostActionsMenu.tsx +0 -112
  229. package/src/views/PostManager/PostCards.d.ts +0 -15
  230. package/src/views/PostManager/PostCards.d.ts.map +0 -1
  231. package/src/views/PostManager/PostCards.js +0 -79
  232. package/src/views/PostManager/PostCards.tsx +0 -197
  233. package/src/views/PostManager/PostFilters.d.ts +0 -16
  234. package/src/views/PostManager/PostFilters.d.ts.map +0 -1
  235. package/src/views/PostManager/PostFilters.js +0 -10
  236. package/src/views/PostManager/PostFilters.tsx +0 -95
  237. package/src/views/PostManager/PostManagerView.d.ts +0 -11
  238. package/src/views/PostManager/PostManagerView.d.ts.map +0 -1
  239. package/src/views/PostManager/PostManagerView.js +0 -174
  240. package/src/views/PostManager/PostManagerView.tsx +0 -289
  241. package/src/views/PostManager/PostStats.d.ts +0 -11
  242. package/src/views/PostManager/PostStats.d.ts.map +0 -1
  243. package/src/views/PostManager/PostStats.js +0 -46
  244. package/src/views/PostManager/PostStats.tsx +0 -81
  245. package/src/views/PostManager/PostTable.d.ts +0 -15
  246. package/src/views/PostManager/PostTable.d.ts.map +0 -1
  247. package/src/views/PostManager/PostTable.js +0 -79
  248. package/src/views/PostManager/PostTable.tsx +0 -230
  249. package/src/views/PostManager/index.d.ts +0 -12
  250. package/src/views/PostManager/index.d.ts.map +0 -1
  251. package/src/views/PostManager/index.js +0 -11
  252. package/src/views/PostManager/index.ts +0 -15
  253. package/src/views/Preview/PreviewBridgeView.d.ts +0 -12
  254. package/src/views/Preview/PreviewBridgeView.d.ts.map +0 -1
  255. package/src/views/Preview/PreviewBridgeView.js +0 -11
  256. package/src/views/Preview/PreviewBridgeView.tsx +0 -64
  257. package/src/views/Preview/index.d.ts +0 -6
  258. package/src/views/Preview/index.d.ts.map +0 -1
  259. package/src/views/Preview/index.js +0 -4
  260. package/src/views/Preview/index.ts +0 -7
  261. package/src/views/Settings/SettingsView.d.ts +0 -10
  262. package/src/views/Settings/SettingsView.d.ts.map +0 -1
  263. package/src/views/Settings/SettingsView.js +0 -111
  264. package/src/views/Settings/SettingsView.tsx +0 -298
  265. package/src/views/Settings/index.d.ts +0 -6
  266. package/src/views/Settings/index.d.ts.map +0 -1
  267. package/src/views/Settings/index.js +0 -4
  268. package/src/views/Settings/index.ts +0 -7
  269. package/src/views/SlugSEO/SlugSEOManagerView.d.ts +0 -12
  270. package/src/views/SlugSEO/SlugSEOManagerView.d.ts.map +0 -1
  271. package/src/views/SlugSEO/SlugSEOManagerView.js +0 -11
  272. package/src/views/SlugSEO/SlugSEOManagerView.tsx +0 -94
  273. package/src/views/SlugSEO/index.d.ts +0 -6
  274. package/src/views/SlugSEO/index.d.ts.map +0 -1
  275. package/src/views/SlugSEO/index.js +0 -4
  276. package/src/views/SlugSEO/index.ts +0 -7
package/src/api-server.ts DELETED
@@ -1,11 +0,0 @@
1
- /**
2
- * Plugin Blog - Server-Only API Exports
3
- * This file is only imported in server-side code (API routes)
4
- *
5
- * IMPORTANT: This file uses Node.js modules (fs, path, etc.) and should NEVER
6
- * be imported in client-side code. Only use in server-side API routes.
7
- */
8
-
9
- // Re-export everything from the API index
10
- export * from './api';
11
-
package/src/config.ts DELETED
@@ -1,161 +0,0 @@
1
- /**
2
- * Plugin Blog Configuration
3
- * Automatically creates required API routes in client apps
4
- */
5
-
6
- import { writeFileSync, mkdirSync, existsSync } from 'fs';
7
- import { join } from 'path';
8
-
9
- /**
10
- * Automatically creates plugin-blog API catch-all route
11
- * This route forwards requests to the plugin's API router
12
- */
13
- /**
14
- * @deprecated Routes are now handled by the unified /api/[pluginId]/[...path]/route.ts
15
- * This function is kept for backwards compatibility but does nothing
16
- */
17
- export function ensureBlogRoutes() {
18
- // Routes are now handled by the unified /api/[pluginId]/[...path]/route.ts
19
- // No need to generate individual routes anymore
20
- return;
21
- try {
22
- // Find the host app directory (where next.config.ts is)
23
- let appDir = process.cwd();
24
- const possiblePaths = [
25
- appDir,
26
- join(appDir, '..'),
27
- join(appDir, '..', '..'),
28
- ];
29
-
30
- for (const basePath of possiblePaths) {
31
- const configPath = join(basePath, 'next.config.ts');
32
- if (existsSync(configPath)) {
33
- appDir = basePath;
34
- break;
35
- }
36
- }
37
-
38
- const apiDir = join(appDir, 'src', 'app', 'api');
39
- const pluginBlogApiDir = join(apiDir, 'plugin-blog', '[...path]');
40
- const pluginBlogApiPath = join(pluginBlogApiDir, 'route.ts');
41
-
42
- // Check if route already exists
43
- if (existsSync(pluginBlogApiPath)) {
44
- const fs = require('fs');
45
- const existingContent = fs.readFileSync(pluginBlogApiPath, 'utf8');
46
- if (existingContent.includes('@jhits/plugin-blog') || existingContent.includes('plugin-blog')) {
47
- // Already set up, skip
48
- return;
49
- }
50
- }
51
-
52
- // Create plugin-blog API catch-all route
53
- mkdirSync(pluginBlogApiDir, { recursive: true });
54
- writeFileSync(pluginBlogApiPath, `// Auto-generated by @jhits/plugin-blog - Blog Plugin API
55
- // This route is automatically created for the blog plugin
56
- import { NextRequest } from 'next/server';
57
- import { handleBlogApi } from '@jhits/plugin-blog/api';
58
- import { MongoClient } from 'mongodb';
59
- import { cookies } from 'next/headers';
60
- import jwt from 'jsonwebtoken';
61
-
62
- const JWT_SECRET = process.env.JWT_SECRET || 'secret';
63
- const MONGODB_URI = process.env.MONGODB_URI || process.env.MONGO_URI || '';
64
-
65
- // MongoDB client singleton
66
- let client: MongoClient | null = null;
67
- let clientPromise: Promise<MongoClient>;
68
-
69
- if (!MONGODB_URI) {
70
- throw new Error('Please add MONGODB_URI to your .env.local file');
71
- }
72
-
73
- if (process.env.NODE_ENV === 'development') {
74
- const globalWithMongo = global as typeof globalThis & {
75
- _mongoClientPromise?: Promise<MongoClient>;
76
- };
77
-
78
- if (!globalWithMongo._mongoClientPromise) {
79
- client = new MongoClient(MONGODB_URI);
80
- globalWithMongo._mongoClientPromise = client.connect();
81
- }
82
- clientPromise = globalWithMongo._mongoClientPromise;
83
- } else {
84
- client = new MongoClient(MONGODB_URI);
85
- clientPromise = client.connect();
86
- }
87
-
88
- async function getUserId(req: NextRequest): Promise<string | null> {
89
- try {
90
- const cookieStore = await cookies();
91
- const token = cookieStore.get('auth_token')?.value;
92
- if (!token) return null;
93
- const decoded = jwt.verify(token, JWT_SECRET) as { id: string };
94
- return decoded.id;
95
- } catch {
96
- return null;
97
- }
98
- }
99
-
100
- // Get the API config
101
- function getBlogApiConfig() {
102
- return {
103
- getDb: async () => {
104
- const client = await clientPromise;
105
- return { db: () => client.db() };
106
- },
107
- getUserId,
108
- collectionName: 'blogs',
109
- };
110
- }
111
-
112
- export async function GET(
113
- req: NextRequest,
114
- { params }: { params: Promise<{ path: string[] }> }
115
- ) {
116
- const { path } = await params;
117
- const config = getBlogApiConfig();
118
- return handleBlogApi(req, path, config);
119
- }
120
-
121
- export async function POST(
122
- req: NextRequest,
123
- { params }: { params: Promise<{ path: string[] }> }
124
- ) {
125
- const { path } = await params;
126
- const config = getBlogApiConfig();
127
- return handleBlogApi(req, path, config);
128
- }
129
-
130
- export async function PUT(
131
- req: NextRequest,
132
- { params }: { params: Promise<{ path: string[] }> }
133
- ) {
134
- ensureInitialized();
135
- const { path } = await params;
136
- return handleBlogApi(req, path);
137
- }
138
-
139
- export async function DELETE(
140
- req: NextRequest,
141
- { params }: { params: Promise<{ path: string[] }> }
142
- ) {
143
- ensureInitialized();
144
- const { path } = await params;
145
- return handleBlogApi(req, path);
146
- }
147
-
148
- export async function PATCH(
149
- req: NextRequest,
150
- { params }: { params: Promise<{ path: string[] }> }
151
- ) {
152
- ensureInitialized();
153
- const { path } = await params;
154
- return handleBlogApi(req, path);
155
- }
156
- `);
157
- } catch (error) {
158
- // Ignore errors - route might already exist or app structure is different
159
- console.warn('[plugin-blog] Could not ensure blog routes:', error);
160
- }
161
- }
@@ -1,8 +0,0 @@
1
- /**
2
- * Blog Hooks
3
- * React hooks for fetching blog data in client applications
4
- */
5
- export { useBlogs, type UseBlogsOptions, type UseBlogsResult } from './useBlogs';
6
- export { useBlog, type UseBlogOptions, type UseBlogResult } from './useBlog';
7
- export { useCategories } from './useCategories';
8
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC"}
@@ -1,7 +0,0 @@
1
- /**
2
- * Blog Hooks
3
- * React hooks for fetching blog data in client applications
4
- */
5
- export { useBlogs } from './useBlogs';
6
- export { useBlog } from './useBlog';
7
- export { useCategories } from './useCategories';
@@ -1,9 +0,0 @@
1
- /**
2
- * Blog Hooks
3
- * React hooks for fetching blog data in client applications
4
- */
5
-
6
- export { useBlogs, type UseBlogsOptions, type UseBlogsResult } from './useBlogs';
7
- export { useBlog, type UseBlogOptions, type UseBlogResult } from './useBlog';
8
- export { useCategories } from './useCategories';
9
-
@@ -1,31 +0,0 @@
1
- /**
2
- * useBlog Hook
3
- * React hook for fetching a single blog post by slug
4
- */
5
- import { BlogPost } from '../types/post';
6
- export interface UseBlogOptions {
7
- /** Blog post slug */
8
- slug: string;
9
- /** API base URL (default: '/api/blogs') */
10
- apiBaseUrl?: string;
11
- }
12
- export interface UseBlogResult {
13
- /** Blog post data */
14
- blog: BlogPost | null;
15
- /** Whether data is currently loading */
16
- loading: boolean;
17
- /** Error message if fetch failed */
18
- error: string | null;
19
- /** Function to refetch the blog post */
20
- refetch: () => Promise<void>;
21
- }
22
- /**
23
- * React hook to fetch a single blog post by slug
24
- *
25
- * @example
26
- * ```tsx
27
- * const { blog, loading, error } = useBlog({ slug: 'my-blog-post' });
28
- * ```
29
- */
30
- export declare function useBlog(options: UseBlogOptions): UseBlogResult;
31
- //# sourceMappingURL=useBlog.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useBlog.d.ts","sourceRoot":"","sources":["useBlog.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,WAAW,cAAc;IAC3B,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC1B,qBAAqB;IACrB,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IACtB,wCAAwC;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,oCAAoC;IACpC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,wCAAwC;IACxC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC;AAED;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,aAAa,CAgD9D"}
@@ -1,57 +0,0 @@
1
- /**
2
- * useBlog Hook
3
- * React hook for fetching a single blog post by slug
4
- */
5
- import { useState, useEffect } from 'react';
6
- import { apiToBlogPost } from '../lib/mappers/apiMapper';
7
- /**
8
- * React hook to fetch a single blog post by slug
9
- *
10
- * @example
11
- * ```tsx
12
- * const { blog, loading, error } = useBlog({ slug: 'my-blog-post' });
13
- * ```
14
- */
15
- export function useBlog(options) {
16
- const { slug, apiBaseUrl = '/api/plugin-blog' } = options;
17
- const [blog, setBlog] = useState(null);
18
- const [loading, setLoading] = useState(true);
19
- const [error, setError] = useState(null);
20
- const fetchBlog = async () => {
21
- if (!slug) {
22
- setLoading(false);
23
- return;
24
- }
25
- try {
26
- setLoading(true);
27
- setError(null);
28
- const response = await fetch(`${apiBaseUrl}/${slug}`);
29
- if (!response.ok) {
30
- if (response.status === 404) {
31
- throw new Error('Blog post not found');
32
- }
33
- throw new Error(`Failed to fetch blog: ${response.status}`);
34
- }
35
- const apiDoc = await response.json();
36
- const blogPost = apiToBlogPost(apiDoc);
37
- setBlog(blogPost);
38
- }
39
- catch (err) {
40
- console.error('[useBlog] Error fetching blog:', err);
41
- setError(err.message || 'Failed to fetch blog');
42
- setBlog(null);
43
- }
44
- finally {
45
- setLoading(false);
46
- }
47
- };
48
- useEffect(() => {
49
- fetchBlog();
50
- }, [slug, apiBaseUrl]);
51
- return {
52
- blog,
53
- loading,
54
- error,
55
- refetch: fetchBlog,
56
- };
57
- }
@@ -1,85 +0,0 @@
1
- /**
2
- * useBlog Hook
3
- * React hook for fetching a single blog post by slug
4
- */
5
-
6
- import { useState, useEffect } from 'react';
7
- import { apiToBlogPost, type APIBlogDocument } from '../lib/mappers/apiMapper';
8
- import { BlogPost } from '../types/post';
9
-
10
- export interface UseBlogOptions {
11
- /** Blog post slug */
12
- slug: string;
13
- /** API base URL (default: '/api/blogs') */
14
- apiBaseUrl?: string;
15
- }
16
-
17
- export interface UseBlogResult {
18
- /** Blog post data */
19
- blog: BlogPost | null;
20
- /** Whether data is currently loading */
21
- loading: boolean;
22
- /** Error message if fetch failed */
23
- error: string | null;
24
- /** Function to refetch the blog post */
25
- refetch: () => Promise<void>;
26
- }
27
-
28
- /**
29
- * React hook to fetch a single blog post by slug
30
- *
31
- * @example
32
- * ```tsx
33
- * const { blog, loading, error } = useBlog({ slug: 'my-blog-post' });
34
- * ```
35
- */
36
- export function useBlog(options: UseBlogOptions): UseBlogResult {
37
- const { slug, apiBaseUrl = '/api/plugin-blog' } = options;
38
-
39
- const [blog, setBlog] = useState<BlogPost | null>(null);
40
- const [loading, setLoading] = useState(true);
41
- const [error, setError] = useState<string | null>(null);
42
-
43
- const fetchBlog = async () => {
44
- if (!slug) {
45
- setLoading(false);
46
- return;
47
- }
48
-
49
- try {
50
- setLoading(true);
51
- setError(null);
52
-
53
- const response = await fetch(`${apiBaseUrl}/${slug}`);
54
-
55
- if (!response.ok) {
56
- if (response.status === 404) {
57
- throw new Error('Blog post not found');
58
- }
59
- throw new Error(`Failed to fetch blog: ${response.status}`);
60
- }
61
-
62
- const apiDoc: APIBlogDocument = await response.json();
63
- const blogPost = apiToBlogPost(apiDoc);
64
- setBlog(blogPost);
65
- } catch (err: any) {
66
- console.error('[useBlog] Error fetching blog:', err);
67
- setError(err.message || 'Failed to fetch blog');
68
- setBlog(null);
69
- } finally {
70
- setLoading(false);
71
- }
72
- };
73
-
74
- useEffect(() => {
75
- fetchBlog();
76
- }, [slug, apiBaseUrl]);
77
-
78
- return {
79
- blog,
80
- loading,
81
- error,
82
- refetch: fetchBlog,
83
- };
84
- }
85
-
@@ -1,39 +0,0 @@
1
- /**
2
- * useBlogs Hook
3
- * React hook for fetching blog posts in client applications
4
- */
5
- import { PostListItem } from '../types/post';
6
- export interface UseBlogsOptions {
7
- /** Maximum number of posts to fetch (default: 10) */
8
- limit?: number;
9
- /** Number of posts to skip (default: 0) */
10
- skip?: number;
11
- /** Filter by status (published, draft, concept) */
12
- status?: string;
13
- /** Whether to fetch all posts for admin (includes drafts) */
14
- admin?: boolean;
15
- /** API base URL (default: '/api/blogs') */
16
- apiBaseUrl?: string;
17
- }
18
- export interface UseBlogsResult {
19
- /** Array of blog posts */
20
- blogs: PostListItem[];
21
- /** Whether data is currently loading */
22
- loading: boolean;
23
- /** Error message if fetch failed */
24
- error: string | null;
25
- /** Total number of posts available */
26
- total: number;
27
- /** Function to refetch blogs */
28
- refetch: () => Promise<void>;
29
- }
30
- /**
31
- * React hook to fetch blog posts
32
- *
33
- * @example
34
- * ```tsx
35
- * const { blogs, loading, error } = useBlogs({ limit: 5 });
36
- * ```
37
- */
38
- export declare function useBlogs(options?: UseBlogsOptions): UseBlogsResult;
39
- //# sourceMappingURL=useBlogs.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useBlogs.d.ts","sourceRoot":"","sources":["useBlogs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,WAAW,eAAe;IAC5B,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2CAA2C;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC3B,0BAA0B;IAC1B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,wCAAwC;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,oCAAoC;IACpC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,OAAO,GAAE,eAAoB,GAAG,cAAc,CA8EtE"}
@@ -1,82 +0,0 @@
1
- /**
2
- * useBlogs Hook
3
- * React hook for fetching blog posts in client applications
4
- */
5
- import { useState, useEffect } from 'react';
6
- import { apiToBlogPost } from '../lib/mappers/apiMapper';
7
- /**
8
- * React hook to fetch blog posts
9
- *
10
- * @example
11
- * ```tsx
12
- * const { blogs, loading, error } = useBlogs({ limit: 5 });
13
- * ```
14
- */
15
- export function useBlogs(options = {}) {
16
- const { limit = 10, skip = 0, status, admin = false, apiBaseUrl = '/api/plugin-blog', } = options;
17
- const [blogs, setBlogs] = useState([]);
18
- const [loading, setLoading] = useState(true);
19
- const [error, setError] = useState(null);
20
- const [total, setTotal] = useState(0);
21
- const fetchBlogs = async () => {
22
- try {
23
- setLoading(true);
24
- setError(null);
25
- const params = new URLSearchParams();
26
- if (limit)
27
- params.set('limit', limit.toString());
28
- if (skip)
29
- params.set('skip', skip.toString());
30
- if (status)
31
- params.set('status', status);
32
- if (admin)
33
- params.set('admin', 'true');
34
- const url = `${apiBaseUrl}?${params.toString()}`;
35
- const response = await fetch(url);
36
- if (!response.ok) {
37
- throw new Error(`Failed to fetch blogs: ${response.status}`);
38
- }
39
- const data = await response.json();
40
- // Handle error response
41
- if (data.error) {
42
- throw new Error(data.error || 'Failed to fetch blogs');
43
- }
44
- // Convert API format to PostListItem format
45
- const blogsArray = Array.isArray(data.blogs) ? data.blogs : [];
46
- const convertedBlogs = blogsArray.map((apiDoc) => {
47
- const blogPost = apiToBlogPost(apiDoc);
48
- return {
49
- id: blogPost.id,
50
- title: blogPost.title,
51
- slug: blogPost.slug,
52
- excerpt: blogPost.metadata.excerpt || '',
53
- status: blogPost.publication.status,
54
- authorId: blogPost.publication.authorId || '',
55
- updatedAt: blogPost.updatedAt,
56
- featuredImage: blogPost.metadata.featuredImage,
57
- };
58
- });
59
- setBlogs(convertedBlogs);
60
- setTotal(data.total || convertedBlogs.length);
61
- }
62
- catch (err) {
63
- console.error('[useBlogs] Error fetching blogs:', err);
64
- setError(err.message || 'Failed to fetch blogs');
65
- setBlogs([]);
66
- setTotal(0);
67
- }
68
- finally {
69
- setLoading(false);
70
- }
71
- };
72
- useEffect(() => {
73
- fetchBlogs();
74
- }, [limit, skip, status, admin, apiBaseUrl]);
75
- return {
76
- blogs,
77
- loading,
78
- error,
79
- total,
80
- refetch: fetchBlogs,
81
- };
82
- }
@@ -1,123 +0,0 @@
1
- /**
2
- * useBlogs Hook
3
- * React hook for fetching blog posts in client applications
4
- */
5
-
6
- import { useState, useEffect } from 'react';
7
- import { apiToBlogPost, type APIBlogDocument } from '../lib/mappers/apiMapper';
8
- import { PostListItem } from '../types/post';
9
-
10
- export interface UseBlogsOptions {
11
- /** Maximum number of posts to fetch (default: 10) */
12
- limit?: number;
13
- /** Number of posts to skip (default: 0) */
14
- skip?: number;
15
- /** Filter by status (published, draft, concept) */
16
- status?: string;
17
- /** Whether to fetch all posts for admin (includes drafts) */
18
- admin?: boolean;
19
- /** API base URL (default: '/api/blogs') */
20
- apiBaseUrl?: string;
21
- }
22
-
23
- export interface UseBlogsResult {
24
- /** Array of blog posts */
25
- blogs: PostListItem[];
26
- /** Whether data is currently loading */
27
- loading: boolean;
28
- /** Error message if fetch failed */
29
- error: string | null;
30
- /** Total number of posts available */
31
- total: number;
32
- /** Function to refetch blogs */
33
- refetch: () => Promise<void>;
34
- }
35
-
36
- /**
37
- * React hook to fetch blog posts
38
- *
39
- * @example
40
- * ```tsx
41
- * const { blogs, loading, error } = useBlogs({ limit: 5 });
42
- * ```
43
- */
44
- export function useBlogs(options: UseBlogsOptions = {}): UseBlogsResult {
45
- const {
46
- limit = 10,
47
- skip = 0,
48
- status,
49
- admin = false,
50
- apiBaseUrl = '/api/plugin-blog',
51
- } = options;
52
-
53
- const [blogs, setBlogs] = useState<PostListItem[]>([]);
54
- const [loading, setLoading] = useState(true);
55
- const [error, setError] = useState<string | null>(null);
56
- const [total, setTotal] = useState(0);
57
-
58
- const fetchBlogs = async () => {
59
- try {
60
- setLoading(true);
61
- setError(null);
62
-
63
- const params = new URLSearchParams();
64
- if (limit) params.set('limit', limit.toString());
65
- if (skip) params.set('skip', skip.toString());
66
- if (status) params.set('status', status);
67
- if (admin) params.set('admin', 'true');
68
-
69
- const url = `${apiBaseUrl}?${params.toString()}`;
70
- const response = await fetch(url);
71
-
72
- if (!response.ok) {
73
- throw new Error(`Failed to fetch blogs: ${response.status}`);
74
- }
75
-
76
- const data = await response.json();
77
-
78
- // Handle error response
79
- if (data.error) {
80
- throw new Error(data.error || 'Failed to fetch blogs');
81
- }
82
-
83
- // Convert API format to PostListItem format
84
- const blogsArray = Array.isArray(data.blogs) ? data.blogs : [];
85
- const convertedBlogs: PostListItem[] = blogsArray.map((apiDoc: APIBlogDocument) => {
86
- const blogPost = apiToBlogPost(apiDoc);
87
- return {
88
- id: blogPost.id,
89
- title: blogPost.title,
90
- slug: blogPost.slug,
91
- excerpt: blogPost.metadata.excerpt || '',
92
- status: blogPost.publication.status,
93
- authorId: blogPost.publication.authorId || '',
94
- updatedAt: blogPost.updatedAt,
95
- featuredImage: blogPost.metadata.featuredImage,
96
- };
97
- });
98
-
99
- setBlogs(convertedBlogs);
100
- setTotal(data.total || convertedBlogs.length);
101
- } catch (err: any) {
102
- console.error('[useBlogs] Error fetching blogs:', err);
103
- setError(err.message || 'Failed to fetch blogs');
104
- setBlogs([]);
105
- setTotal(0);
106
- } finally {
107
- setLoading(false);
108
- }
109
- };
110
-
111
- useEffect(() => {
112
- fetchBlogs();
113
- }, [limit, skip, status, admin, apiBaseUrl]);
114
-
115
- return {
116
- blogs,
117
- loading,
118
- error,
119
- total,
120
- refetch: fetchBlogs,
121
- };
122
- }
123
-
@@ -1,9 +0,0 @@
1
- /**
2
- * Hook to fetch categories from existing blog posts
3
- * Extracts categories from Hero blocks in all posts
4
- */
5
- export declare function useCategories(): {
6
- categories: string[];
7
- loading: boolean;
8
- };
9
- //# sourceMappingURL=useCategories.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useCategories.d.ts","sourceRoot":"","sources":["useCategories.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,wBAAgB,aAAa;;;EAkE5B"}