octocms 0.4.2 → 0.4.4

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 (497) hide show
  1. package/dist/admin/AdminApp.d.ts +4 -5
  2. package/dist/admin/AdminApp.d.ts.map +1 -1
  3. package/dist/admin/AdminApp.js +8 -17
  4. package/dist/admin/AdminApp.js.map +1 -1
  5. package/dist/admin/actions/build.d.ts.map +1 -1
  6. package/dist/admin/actions/build.js +20 -5
  7. package/dist/admin/actions/build.js.map +1 -1
  8. package/dist/admin/actions/diff.d.ts.map +1 -1
  9. package/dist/admin/actions/diff.js +3 -2
  10. package/dist/admin/actions/diff.js.map +1 -1
  11. package/dist/admin/actions/entries.d.ts.map +1 -1
  12. package/dist/admin/actions/entries.js +18 -28
  13. package/dist/admin/actions/entries.js.map +1 -1
  14. package/dist/admin/actions/files.d.ts +8 -0
  15. package/dist/admin/actions/files.d.ts.map +1 -1
  16. package/dist/admin/actions/files.js +67 -10
  17. package/dist/admin/actions/files.js.map +1 -1
  18. package/dist/admin/actions/media.d.ts +4 -3
  19. package/dist/admin/actions/media.d.ts.map +1 -1
  20. package/dist/admin/actions/media.js +69 -15
  21. package/dist/admin/actions/media.js.map +1 -1
  22. package/dist/admin/actions/schema.d.ts.map +1 -1
  23. package/dist/admin/actions/schema.js +2 -4
  24. package/dist/admin/actions/schema.js.map +1 -1
  25. package/dist/admin/actions/search.js +15 -4
  26. package/dist/admin/actions/search.js.map +1 -1
  27. package/dist/admin/pages/AdminLayout.d.ts.map +1 -1
  28. package/dist/admin/pages/AdminLayout.js +5 -4
  29. package/dist/admin/pages/AdminLayout.js.map +1 -1
  30. package/dist/admin/pages/CollectionPage.d.ts.map +1 -1
  31. package/dist/admin/pages/CollectionPage.js +1 -13
  32. package/dist/admin/pages/CollectionPage.js.map +1 -1
  33. package/dist/admin/pages/ContentModelPage.d.ts +5 -0
  34. package/dist/admin/pages/ContentModelPage.d.ts.map +1 -1
  35. package/dist/admin/pages/ContentModelPage.js +1 -4
  36. package/dist/admin/pages/ContentModelPage.js.map +1 -1
  37. package/dist/admin/pages/ContentPage.d.ts.map +1 -1
  38. package/dist/admin/pages/ContentPage.js +2 -7
  39. package/dist/admin/pages/ContentPage.js.map +1 -1
  40. package/dist/admin/pages/ContentTypePage.d.ts +4 -0
  41. package/dist/admin/pages/ContentTypePage.d.ts.map +1 -1
  42. package/dist/admin/pages/ContentTypePage.js +1 -5
  43. package/dist/admin/pages/ContentTypePage.js.map +1 -1
  44. package/dist/admin/pages/EntryPage.d.ts +9 -0
  45. package/dist/admin/pages/EntryPage.d.ts.map +1 -1
  46. package/dist/admin/pages/EntryPage.js +6 -10
  47. package/dist/admin/pages/EntryPage.js.map +1 -1
  48. package/dist/admin/pages/MediaAssetPage.d.ts +7 -0
  49. package/dist/admin/pages/MediaAssetPage.d.ts.map +1 -1
  50. package/dist/admin/pages/MediaAssetPage.js +1 -7
  51. package/dist/admin/pages/MediaAssetPage.js.map +1 -1
  52. package/dist/admin/pages/MediaPage.d.ts +5 -0
  53. package/dist/admin/pages/MediaPage.d.ts.map +1 -1
  54. package/dist/admin/pages/MediaPage.js +1 -3
  55. package/dist/admin/pages/MediaPage.js.map +1 -1
  56. package/dist/admin/provider.d.ts +1 -3
  57. package/dist/admin/provider.d.ts.map +1 -1
  58. package/dist/admin/provider.js +2 -3
  59. package/dist/admin/provider.js.map +1 -1
  60. package/dist/admin/query/QueryProvider.d.ts +11 -0
  61. package/dist/admin/query/QueryProvider.d.ts.map +1 -0
  62. package/dist/admin/query/QueryProvider.js +33 -0
  63. package/dist/admin/query/QueryProvider.js.map +1 -0
  64. package/dist/admin/query/hooks/useAgentStatus.d.ts +6 -0
  65. package/dist/admin/query/hooks/useAgentStatus.d.ts.map +1 -0
  66. package/dist/admin/query/hooks/useAgentStatus.js +16 -0
  67. package/dist/admin/query/hooks/useAgentStatus.js.map +1 -0
  68. package/dist/admin/query/hooks/useBranch.d.ts +7 -0
  69. package/dist/admin/query/hooks/useBranch.d.ts.map +1 -0
  70. package/dist/admin/query/hooks/useBranch.js +16 -0
  71. package/dist/admin/query/hooks/useBranch.js.map +1 -0
  72. package/dist/admin/query/hooks/useBranchList.d.ts +10 -0
  73. package/dist/admin/query/hooks/useBranchList.d.ts.map +1 -0
  74. package/dist/admin/query/hooks/useBranchList.js +18 -0
  75. package/dist/admin/query/hooks/useBranchList.js.map +1 -0
  76. package/dist/admin/query/hooks/useBranchMutations.d.ts +16 -0
  77. package/dist/admin/query/hooks/useBranchMutations.d.ts.map +1 -0
  78. package/dist/admin/query/hooks/useBranchMutations.js +39 -0
  79. package/dist/admin/query/hooks/useBranchMutations.js.map +1 -0
  80. package/dist/admin/query/hooks/useEntry.d.ts +9 -0
  81. package/dist/admin/query/hooks/useEntry.d.ts.map +1 -0
  82. package/dist/admin/query/hooks/useEntry.js +16 -0
  83. package/dist/admin/query/hooks/useEntry.js.map +1 -0
  84. package/dist/admin/query/hooks/useEntryBacklinks.d.ts +8 -0
  85. package/dist/admin/query/hooks/useEntryBacklinks.d.ts.map +1 -0
  86. package/dist/admin/query/hooks/useEntryBacklinks.js +17 -0
  87. package/dist/admin/query/hooks/useEntryBacklinks.js.map +1 -0
  88. package/dist/admin/query/hooks/useEntryCommits.d.ts +9 -0
  89. package/dist/admin/query/hooks/useEntryCommits.d.ts.map +1 -0
  90. package/dist/admin/query/hooks/useEntryCommits.js +18 -0
  91. package/dist/admin/query/hooks/useEntryCommits.js.map +1 -0
  92. package/dist/admin/query/hooks/useEntryDiff.d.ts +6 -0
  93. package/dist/admin/query/hooks/useEntryDiff.d.ts.map +1 -0
  94. package/dist/admin/query/hooks/useEntryDiff.js +16 -0
  95. package/dist/admin/query/hooks/useEntryDiff.js.map +1 -0
  96. package/dist/admin/query/hooks/useEntryList.d.ts +10 -0
  97. package/dist/admin/query/hooks/useEntryList.d.ts.map +1 -0
  98. package/dist/admin/query/hooks/useEntryList.js +18 -0
  99. package/dist/admin/query/hooks/useEntryList.js.map +1 -0
  100. package/dist/admin/query/hooks/useEntryMutations.d.ts +38 -0
  101. package/dist/admin/query/hooks/useEntryMutations.d.ts.map +1 -0
  102. package/dist/admin/query/hooks/useEntryMutations.js +149 -0
  103. package/dist/admin/query/hooks/useEntryMutations.js.map +1 -0
  104. package/dist/admin/query/hooks/useHasActiveBranch.d.ts +6 -0
  105. package/dist/admin/query/hooks/useHasActiveBranch.d.ts.map +1 -0
  106. package/dist/admin/query/hooks/useHasActiveBranch.js +16 -0
  107. package/dist/admin/query/hooks/useHasActiveBranch.js.map +1 -0
  108. package/dist/admin/query/hooks/useIsProduction.d.ts +6 -0
  109. package/dist/admin/query/hooks/useIsProduction.d.ts.map +1 -0
  110. package/dist/admin/query/hooks/useIsProduction.js +16 -0
  111. package/dist/admin/query/hooks/useIsProduction.js.map +1 -0
  112. package/dist/admin/query/hooks/useMediaAsset.d.ts +15 -0
  113. package/dist/admin/query/hooks/useMediaAsset.d.ts.map +1 -0
  114. package/dist/admin/query/hooks/useMediaAsset.js +31 -0
  115. package/dist/admin/query/hooks/useMediaAsset.js.map +1 -0
  116. package/dist/admin/query/hooks/useMediaList.d.ts +8 -0
  117. package/dist/admin/query/hooks/useMediaList.d.ts.map +1 -0
  118. package/dist/admin/query/hooks/useMediaList.js +17 -0
  119. package/dist/admin/query/hooks/useMediaList.js.map +1 -0
  120. package/dist/admin/query/hooks/useMediaMutations.d.ts +25 -0
  121. package/dist/admin/query/hooks/useMediaMutations.d.ts.map +1 -0
  122. package/dist/admin/query/hooks/useMediaMutations.js +63 -0
  123. package/dist/admin/query/hooks/useMediaMutations.js.map +1 -0
  124. package/dist/admin/query/hooks/useNewFile.d.ts +18 -0
  125. package/dist/admin/query/hooks/useNewFile.d.ts.map +1 -0
  126. package/dist/admin/query/hooks/useNewFile.js +25 -0
  127. package/dist/admin/query/hooks/useNewFile.js.map +1 -0
  128. package/dist/admin/query/hooks/useSaveSchema.d.ts +19 -0
  129. package/dist/admin/query/hooks/useSaveSchema.d.ts.map +1 -0
  130. package/dist/admin/query/hooks/useSaveSchema.js +33 -0
  131. package/dist/admin/query/hooks/useSaveSchema.js.map +1 -0
  132. package/dist/admin/query/hooks/useSchema.d.ts +7 -0
  133. package/dist/admin/query/hooks/useSchema.d.ts.map +1 -0
  134. package/dist/admin/query/hooks/useSchema.js +16 -0
  135. package/dist/admin/query/hooks/useSchema.js.map +1 -0
  136. package/dist/admin/query/hooks/useSchemaImpactPreview.d.ts +16 -0
  137. package/dist/admin/query/hooks/useSchemaImpactPreview.d.ts.map +1 -0
  138. package/dist/admin/query/hooks/useSchemaImpactPreview.js +13 -0
  139. package/dist/admin/query/hooks/useSchemaImpactPreview.js.map +1 -0
  140. package/dist/admin/query/invalidate.d.ts +52 -0
  141. package/dist/admin/query/invalidate.d.ts.map +1 -0
  142. package/dist/admin/query/invalidate.js +91 -0
  143. package/dist/admin/query/invalidate.js.map +1 -0
  144. package/dist/admin/query/keys.d.ts +40 -0
  145. package/dist/admin/query/keys.d.ts.map +1 -0
  146. package/dist/admin/query/keys.js +36 -0
  147. package/dist/admin/query/keys.js.map +1 -0
  148. package/dist/admin/query/queryClient.d.ts +8 -0
  149. package/dist/admin/query/queryClient.d.ts.map +1 -0
  150. package/dist/admin/query/queryClient.js +28 -0
  151. package/dist/admin/query/queryClient.js.map +1 -0
  152. package/dist/admin/query/test/renderWithQuery.d.ts +24 -0
  153. package/dist/admin/query/test/renderWithQuery.d.ts.map +1 -0
  154. package/dist/admin/query/test/renderWithQuery.js +38 -0
  155. package/dist/admin/query/test/renderWithQuery.js.map +1 -0
  156. package/dist/admin/query/useAdminQuery.d.ts +33 -0
  157. package/dist/admin/query/useAdminQuery.d.ts.map +1 -0
  158. package/dist/admin/query/useAdminQuery.js +23 -0
  159. package/dist/admin/query/useAdminQuery.js.map +1 -0
  160. package/dist/admin/store/contentStore.d.ts +3 -0
  161. package/dist/admin/store/contentStore.d.ts.map +1 -1
  162. package/dist/admin/store/contentStore.js +31 -28
  163. package/dist/admin/store/contentStore.js.map +1 -1
  164. package/dist/admin/store/contentStoreFetch.d.ts.map +1 -1
  165. package/dist/admin/store/contentStoreFetch.js +10 -4
  166. package/dist/admin/store/contentStoreFetch.js.map +1 -1
  167. package/dist/admin/theme/cookie.d.ts +7 -0
  168. package/dist/admin/theme/cookie.d.ts.map +1 -0
  169. package/dist/admin/{actions/getThemeCookie.js → theme/cookie.js} +3 -3
  170. package/dist/admin/theme/cookie.js.map +1 -0
  171. package/dist/admin/theme/index.d.ts +4 -0
  172. package/dist/admin/theme/index.d.ts.map +1 -0
  173. package/dist/admin/theme/index.js +9 -0
  174. package/dist/admin/theme/index.js.map +1 -0
  175. package/dist/admin/theme/toggle.d.ts +5 -0
  176. package/dist/admin/theme/toggle.d.ts.map +1 -0
  177. package/dist/admin/theme/toggle.js +38 -0
  178. package/dist/admin/theme/toggle.js.map +1 -0
  179. package/dist/admin/theme/types.d.ts +10 -0
  180. package/dist/admin/theme/types.d.ts.map +1 -0
  181. package/dist/admin/theme/types.js +8 -0
  182. package/dist/admin/theme/types.js.map +1 -0
  183. package/dist/agent/embeddings.d.ts.map +1 -1
  184. package/dist/agent/embeddings.js +5 -3
  185. package/dist/agent/embeddings.js.map +1 -1
  186. package/dist/agent/embeddingsHook.js +1 -1
  187. package/dist/agent/embeddingsHook.js.map +1 -1
  188. package/dist/agent/index.cjs +215 -83
  189. package/dist/agent/index.cjs.map +1 -1
  190. package/dist/agent/search.js +1 -1
  191. package/dist/agent/search.js.map +1 -1
  192. package/dist/{agentDocs-L4RLZCYK.js → agentDocs-JZRZW7XI.js} +2 -2
  193. package/dist/{chunk-SJ3MPCWY.js → chunk-6D5NU3XR.js} +2 -1
  194. package/dist/chunk-6D5NU3XR.js.map +1 -0
  195. package/dist/cli/index.js +5 -5
  196. package/dist/cli/index.js.map +1 -1
  197. package/dist/components/Chat/ProposalCard.d.ts.map +1 -1
  198. package/dist/components/Chat/ProposalCard.js +10 -29
  199. package/dist/components/Chat/ProposalCard.js.map +1 -1
  200. package/dist/components/Chat/useChatStream.d.ts.map +1 -1
  201. package/dist/components/Chat/useChatStream.js +5 -1
  202. package/dist/components/Chat/useChatStream.js.map +1 -1
  203. package/dist/components/CommandK/CommandK.d.ts.map +1 -1
  204. package/dist/components/CommandK/CommandK.js +32 -1
  205. package/dist/components/CommandK/CommandK.js.map +1 -1
  206. package/dist/components/ContentModel/ContentModelList.d.ts +1 -7
  207. package/dist/components/ContentModel/ContentModelList.d.ts.map +1 -1
  208. package/dist/components/ContentModel/ContentModelList.js +93 -54
  209. package/dist/components/ContentModel/ContentModelList.js.map +1 -1
  210. package/dist/components/ContentModel/ContentTypeDetail.d.ts +1 -4
  211. package/dist/components/ContentModel/ContentTypeDetail.d.ts.map +1 -1
  212. package/dist/components/ContentModel/ContentTypeDetail.js +103 -100
  213. package/dist/components/ContentModel/ContentTypeDetail.js.map +1 -1
  214. package/dist/components/ContentModel/CreateContentTypeDialog.d.ts.map +1 -1
  215. package/dist/components/ContentModel/CreateContentTypeDialog.js +11 -7
  216. package/dist/components/ContentModel/CreateContentTypeDialog.js.map +1 -1
  217. package/dist/components/ContentModel/DeleteContentTypeDialog.d.ts.map +1 -1
  218. package/dist/components/ContentModel/DeleteContentTypeDialog.js +12 -9
  219. package/dist/components/ContentModel/DeleteContentTypeDialog.js.map +1 -1
  220. package/dist/components/ContentModel/DeleteFieldDialog.d.ts.map +1 -1
  221. package/dist/components/ContentModel/DeleteFieldDialog.js +16 -11
  222. package/dist/components/ContentModel/DeleteFieldDialog.js.map +1 -1
  223. package/dist/components/ContentModel/EditContentTypeDialog.d.ts.map +1 -1
  224. package/dist/components/ContentModel/EditContentTypeDialog.js +15 -10
  225. package/dist/components/ContentModel/EditContentTypeDialog.js.map +1 -1
  226. package/dist/components/ContentModel/FieldDialog.d.ts.map +1 -1
  227. package/dist/components/ContentModel/FieldDialog.js +15 -11
  228. package/dist/components/ContentModel/FieldDialog.js.map +1 -1
  229. package/dist/components/ContentModel/SchemaImpactList.js +2 -2
  230. package/dist/components/ContentModel/SchemaImpactList.js.map +1 -1
  231. package/dist/components/ContentModel/skeletons/FieldTableSkeleton.d.ts +8 -0
  232. package/dist/components/ContentModel/skeletons/FieldTableSkeleton.d.ts.map +1 -0
  233. package/dist/components/ContentModel/skeletons/FieldTableSkeleton.js +14 -0
  234. package/dist/components/ContentModel/skeletons/FieldTableSkeleton.js.map +1 -0
  235. package/dist/components/ContentModel/skeletons/SchemaTableSkeleton.d.ts +8 -0
  236. package/dist/components/ContentModel/skeletons/SchemaTableSkeleton.d.ts.map +1 -0
  237. package/dist/components/ContentModel/skeletons/SchemaTableSkeleton.js +22 -0
  238. package/dist/components/ContentModel/skeletons/SchemaTableSkeleton.js.map +1 -0
  239. package/dist/components/Dashboard/DashboardContent.d.ts +1 -6
  240. package/dist/components/Dashboard/DashboardContent.d.ts.map +1 -1
  241. package/dist/components/Dashboard/DashboardContent.js +42 -32
  242. package/dist/components/Dashboard/DashboardContent.js.map +1 -1
  243. package/dist/components/Dashboard/skeletons/ContentTableSkeleton.d.ts +9 -0
  244. package/dist/components/Dashboard/skeletons/ContentTableSkeleton.d.ts.map +1 -0
  245. package/dist/components/Dashboard/skeletons/ContentTableSkeleton.js +21 -0
  246. package/dist/components/Dashboard/skeletons/ContentTableSkeleton.js.map +1 -0
  247. package/dist/components/Dashboard/skeletons/DashboardPageChromeSkeleton.d.ts +8 -0
  248. package/dist/components/Dashboard/skeletons/DashboardPageChromeSkeleton.d.ts.map +1 -0
  249. package/dist/components/Dashboard/skeletons/DashboardPageChromeSkeleton.js +24 -0
  250. package/dist/components/Dashboard/skeletons/DashboardPageChromeSkeleton.js.map +1 -0
  251. package/dist/components/Dashboard/skeletons/LeftPanelSkeleton.d.ts +6 -0
  252. package/dist/components/Dashboard/skeletons/LeftPanelSkeleton.d.ts.map +1 -0
  253. package/dist/components/Dashboard/skeletons/LeftPanelSkeleton.js +27 -0
  254. package/dist/components/Dashboard/skeletons/LeftPanelSkeleton.js.map +1 -0
  255. package/dist/components/DiffView/DiffHunk.js +2 -2
  256. package/dist/components/DiffView/DiffHunk.js.map +1 -1
  257. package/dist/components/DiffView/DiffView.d.ts.map +1 -1
  258. package/dist/components/DiffView/DiffView.js +8 -28
  259. package/dist/components/DiffView/DiffView.js.map +1 -1
  260. package/dist/components/EditPost/EditPost.d.ts +5 -3
  261. package/dist/components/EditPost/EditPost.d.ts.map +1 -1
  262. package/dist/components/EditPost/EditPost.js +260 -234
  263. package/dist/components/EditPost/EditPost.js.map +1 -1
  264. package/dist/components/EditPost/skeletons/EntryFormSkeleton.d.ts +8 -0
  265. package/dist/components/EditPost/skeletons/EntryFormSkeleton.d.ts.map +1 -0
  266. package/dist/components/EditPost/skeletons/EntryFormSkeleton.js +18 -0
  267. package/dist/components/EditPost/skeletons/EntryFormSkeleton.js.map +1 -0
  268. package/dist/components/EditPost/skeletons/EntrySidebarSkeleton.d.ts +6 -0
  269. package/dist/components/EditPost/skeletons/EntrySidebarSkeleton.d.ts.map +1 -0
  270. package/dist/components/EditPost/skeletons/EntrySidebarSkeleton.js +30 -0
  271. package/dist/components/EditPost/skeletons/EntrySidebarSkeleton.js.map +1 -0
  272. package/dist/components/FieldLabel.d.ts +11 -0
  273. package/dist/components/FieldLabel.d.ts.map +1 -0
  274. package/dist/components/FieldLabel.js +17 -0
  275. package/dist/components/FieldLabel.js.map +1 -0
  276. package/dist/components/FieldShell.d.ts +15 -0
  277. package/dist/components/FieldShell.d.ts.map +1 -0
  278. package/dist/components/FieldShell.js +29 -0
  279. package/dist/components/FieldShell.js.map +1 -0
  280. package/dist/components/FormBooleanField.d.ts.map +1 -1
  281. package/dist/components/FormBooleanField.js +25 -12
  282. package/dist/components/FormBooleanField.js.map +1 -1
  283. package/dist/components/FormColorField.d.ts.map +1 -1
  284. package/dist/components/FormColorField.js +8 -12
  285. package/dist/components/FormColorField.js.map +1 -1
  286. package/dist/components/FormDatetimeField.d.ts.map +1 -1
  287. package/dist/components/FormDatetimeField.js +8 -12
  288. package/dist/components/FormDatetimeField.js.map +1 -1
  289. package/dist/components/FormImageField.d.ts.map +1 -1
  290. package/dist/components/FormImageField.js +83 -193
  291. package/dist/components/FormImageField.js.map +1 -1
  292. package/dist/components/FormJsonField.d.ts.map +1 -1
  293. package/dist/components/FormJsonField.js +7 -10
  294. package/dist/components/FormJsonField.js.map +1 -1
  295. package/dist/components/FormNumberField.d.ts.map +1 -1
  296. package/dist/components/FormNumberField.js +8 -12
  297. package/dist/components/FormNumberField.js.map +1 -1
  298. package/dist/components/FormReferenceField.d.ts.map +1 -1
  299. package/dist/components/FormReferenceField.js +65 -56
  300. package/dist/components/FormReferenceField.js.map +1 -1
  301. package/dist/components/FormSelectField.d.ts.map +1 -1
  302. package/dist/components/FormSelectField.js +13 -11
  303. package/dist/components/FormSelectField.js.map +1 -1
  304. package/dist/components/FormSlugField.d.ts.map +1 -1
  305. package/dist/components/FormSlugField.js +9 -13
  306. package/dist/components/FormSlugField.js.map +1 -1
  307. package/dist/components/FormStringField.d.ts.map +1 -1
  308. package/dist/components/FormStringField.js +8 -12
  309. package/dist/components/FormStringField.js.map +1 -1
  310. package/dist/components/FormTextField.d.ts.map +1 -1
  311. package/dist/components/FormTextField.js +6 -9
  312. package/dist/components/FormTextField.js.map +1 -1
  313. package/dist/components/FormUrlField.d.ts.map +1 -1
  314. package/dist/components/FormUrlField.js +8 -12
  315. package/dist/components/FormUrlField.js.map +1 -1
  316. package/dist/components/HistorySection/HistorySection.d.ts +2 -1
  317. package/dist/components/HistorySection/HistorySection.d.ts.map +1 -1
  318. package/dist/components/HistorySection/HistorySection.js +70 -78
  319. package/dist/components/HistorySection/HistorySection.js.map +1 -1
  320. package/dist/components/InlineEntryEditor/InlineEntryEditor.d.ts.map +1 -1
  321. package/dist/components/InlineEntryEditor/InlineEntryEditor.js +94 -124
  322. package/dist/components/InlineEntryEditor/InlineEntryEditor.js.map +1 -1
  323. package/dist/components/Layout/Layout.d.ts +3 -1
  324. package/dist/components/Layout/Layout.d.ts.map +1 -1
  325. package/dist/components/Layout/Layout.js +31 -30
  326. package/dist/components/Layout/Layout.js.map +1 -1
  327. package/dist/components/Layout/TopHeader.d.ts +3 -1
  328. package/dist/components/Layout/TopHeader.d.ts.map +1 -1
  329. package/dist/components/Layout/TopHeader.js +65 -95
  330. package/dist/components/Layout/TopHeader.js.map +1 -1
  331. package/dist/components/Layout/skeletons/AgentNavSkeleton.d.ts +9 -0
  332. package/dist/components/Layout/skeletons/AgentNavSkeleton.d.ts.map +1 -0
  333. package/dist/components/Layout/skeletons/AgentNavSkeleton.js +9 -0
  334. package/dist/components/Layout/skeletons/AgentNavSkeleton.js.map +1 -0
  335. package/dist/components/Layout/skeletons/BranchChipSkeleton.d.ts +7 -0
  336. package/dist/components/Layout/skeletons/BranchChipSkeleton.d.ts.map +1 -0
  337. package/dist/components/Layout/skeletons/BranchChipSkeleton.js +17 -0
  338. package/dist/components/Layout/skeletons/BranchChipSkeleton.js.map +1 -0
  339. package/dist/components/Layout/skeletons/TopHeaderSkeleton.d.ts +8 -0
  340. package/dist/components/Layout/skeletons/TopHeaderSkeleton.d.ts.map +1 -0
  341. package/dist/components/Layout/skeletons/TopHeaderSkeleton.js +26 -0
  342. package/dist/components/Layout/skeletons/TopHeaderSkeleton.js.map +1 -0
  343. package/dist/components/LinkedBySection/LinkedBySection.d.ts.map +1 -1
  344. package/dist/components/LinkedBySection/LinkedBySection.js +21 -42
  345. package/dist/components/LinkedBySection/LinkedBySection.js.map +1 -1
  346. package/dist/components/MediaAsset/MediaAsset.d.ts +2 -4
  347. package/dist/components/MediaAsset/MediaAsset.d.ts.map +1 -1
  348. package/dist/components/MediaAsset/MediaAsset.js +76 -46
  349. package/dist/components/MediaAsset/MediaAsset.js.map +1 -1
  350. package/dist/components/MediaAsset/skeletons/MediaMetadataFormSkeleton.d.ts +3 -0
  351. package/dist/components/MediaAsset/skeletons/MediaMetadataFormSkeleton.d.ts.map +1 -0
  352. package/dist/components/MediaAsset/skeletons/MediaMetadataFormSkeleton.js +32 -0
  353. package/dist/components/MediaAsset/skeletons/MediaMetadataFormSkeleton.js.map +1 -0
  354. package/dist/components/MediaAsset/skeletons/MediaPreviewSkeleton.d.ts +3 -0
  355. package/dist/components/MediaAsset/skeletons/MediaPreviewSkeleton.d.ts.map +1 -0
  356. package/dist/components/MediaAsset/skeletons/MediaPreviewSkeleton.js +18 -0
  357. package/dist/components/MediaAsset/skeletons/MediaPreviewSkeleton.js.map +1 -0
  358. package/dist/components/MediaManager/MediaListTable.d.ts +6 -1
  359. package/dist/components/MediaManager/MediaListTable.d.ts.map +1 -1
  360. package/dist/components/MediaManager/MediaListTable.js +11 -4
  361. package/dist/components/MediaManager/MediaListTable.js.map +1 -1
  362. package/dist/components/MediaManager/MediaManager.d.ts +1 -5
  363. package/dist/components/MediaManager/MediaManager.d.ts.map +1 -1
  364. package/dist/components/MediaManager/MediaManager.js +46 -75
  365. package/dist/components/MediaManager/MediaManager.js.map +1 -1
  366. package/dist/components/MediaManager/MediaSelectDialog.d.ts +12 -0
  367. package/dist/components/MediaManager/MediaSelectDialog.d.ts.map +1 -0
  368. package/dist/components/MediaManager/MediaSelectDialog.js +188 -0
  369. package/dist/components/MediaManager/MediaSelectDialog.js.map +1 -0
  370. package/dist/components/MediaManager/MediaUploadDialog.d.ts +13 -0
  371. package/dist/components/MediaManager/MediaUploadDialog.d.ts.map +1 -0
  372. package/dist/components/MediaManager/MediaUploadDialog.js +101 -0
  373. package/dist/components/MediaManager/MediaUploadDialog.js.map +1 -0
  374. package/dist/components/MediaManager/skeletons/MediaGridSkeleton.d.ts +8 -0
  375. package/dist/components/MediaManager/skeletons/MediaGridSkeleton.d.ts.map +1 -0
  376. package/dist/components/MediaManager/skeletons/MediaGridSkeleton.js +21 -0
  377. package/dist/components/MediaManager/skeletons/MediaGridSkeleton.js.map +1 -0
  378. package/dist/components/MediaManager/skeletons/MediaLeftPanelSkeleton.d.ts +6 -0
  379. package/dist/components/MediaManager/skeletons/MediaLeftPanelSkeleton.d.ts.map +1 -0
  380. package/dist/components/MediaManager/skeletons/MediaLeftPanelSkeleton.js +22 -0
  381. package/dist/components/MediaManager/skeletons/MediaLeftPanelSkeleton.js.map +1 -0
  382. package/dist/components/MediaManager/skeletons/MediaListTableSkeleton.d.ts +8 -0
  383. package/dist/components/MediaManager/skeletons/MediaListTableSkeleton.d.ts.map +1 -0
  384. package/dist/components/MediaManager/skeletons/MediaListTableSkeleton.js +25 -0
  385. package/dist/components/MediaManager/skeletons/MediaListTableSkeleton.js.map +1 -0
  386. package/dist/components/richtext/ComponentEmbedEditor.js +4 -4
  387. package/dist/components/richtext/ComponentEmbedEditor.js.map +1 -1
  388. package/dist/components/richtext/ConditionEmbedEditor.js +2 -2
  389. package/dist/components/richtext/ConditionEmbedEditor.js.map +1 -1
  390. package/dist/components/richtext/ImageEmbedEditor.d.ts.map +1 -1
  391. package/dist/components/richtext/ImageEmbedEditor.js +11 -13
  392. package/dist/components/richtext/ImageEmbedEditor.js.map +1 -1
  393. package/dist/components/richtext/ReferenceEmbedEditor.d.ts.map +1 -1
  394. package/dist/components/richtext/ReferenceEmbedEditor.js +14 -16
  395. package/dist/components/richtext/ReferenceEmbedEditor.js.map +1 -1
  396. package/dist/components/richtext/VariableEmbedEditor.js +3 -3
  397. package/dist/components/richtext/VariableEmbedEditor.js.map +1 -1
  398. package/dist/components/skeletons/MainSlotSkeleton.d.ts +13 -0
  399. package/dist/components/skeletons/MainSlotSkeleton.d.ts.map +1 -0
  400. package/dist/components/skeletons/MainSlotSkeleton.js +27 -0
  401. package/dist/components/skeletons/MainSlotSkeleton.js.map +1 -0
  402. package/dist/components/skeletons/blocks.d.ts +21 -0
  403. package/dist/components/skeletons/blocks.d.ts.map +1 -0
  404. package/dist/components/skeletons/blocks.js +29 -0
  405. package/dist/components/skeletons/blocks.js.map +1 -0
  406. package/dist/components/skeletons/index.d.ts +6 -7
  407. package/dist/components/skeletons/index.d.ts.map +1 -1
  408. package/dist/components/skeletons/index.js +7 -6
  409. package/dist/components/skeletons/index.js.map +1 -1
  410. package/dist/components/skeletons/primitives.d.ts +0 -5
  411. package/dist/components/skeletons/primitives.d.ts.map +1 -1
  412. package/dist/components/skeletons/primitives.js +1 -16
  413. package/dist/components/skeletons/primitives.js.map +1 -1
  414. package/dist/config.cjs +2 -4
  415. package/dist/config.cjs.map +1 -1
  416. package/dist/{embeddingsGen-FWXI55MC.js → embeddingsGen-775PXWJY.js} +14 -6
  417. package/dist/embeddingsGen-775PXWJY.js.map +1 -0
  418. package/dist/{github-Q7ABLNZF.js → github-WDLK3J4R.js} +55 -30
  419. package/dist/{github-Q7ABLNZF.js.map → github-WDLK3J4R.js.map} +1 -1
  420. package/dist/github-public.d.ts +4 -0
  421. package/dist/github-public.d.ts.map +1 -1
  422. package/dist/github-public.js +52 -25
  423. package/dist/github-public.js.map +1 -1
  424. package/dist/globals.css +156 -106
  425. package/dist/hooks/useEntryStack.d.ts +7 -3
  426. package/dist/hooks/useEntryStack.d.ts.map +1 -1
  427. package/dist/hooks/useEntryStack.js +60 -57
  428. package/dist/hooks/useEntryStack.js.map +1 -1
  429. package/dist/index.cjs +54 -29
  430. package/dist/index.cjs.map +1 -1
  431. package/dist/{init-IKO4CU7H.js → init-DTJPSWLO.js} +2 -2
  432. package/dist/lib/extractImageMetadata.d.ts +10 -3
  433. package/dist/lib/extractImageMetadata.d.ts.map +1 -1
  434. package/dist/lib/extractImageMetadata.js +8 -5
  435. package/dist/lib/extractImageMetadata.js.map +1 -1
  436. package/dist/lib/githubContentMode.d.ts +23 -2
  437. package/dist/lib/githubContentMode.d.ts.map +1 -1
  438. package/dist/lib/githubContentMode.js +2 -4
  439. package/dist/lib/githubContentMode.js.map +1 -1
  440. package/dist/lib/mediaPath.d.ts +14 -0
  441. package/dist/lib/mediaPath.d.ts.map +1 -0
  442. package/dist/lib/mediaPath.js +20 -0
  443. package/dist/lib/mediaPath.js.map +1 -0
  444. package/dist/lib/resolveEntryTitle.d.ts +2 -1
  445. package/dist/lib/resolveEntryTitle.d.ts.map +1 -1
  446. package/dist/lib/resolveEntryTitle.js +4 -2
  447. package/dist/lib/resolveEntryTitle.js.map +1 -1
  448. package/dist/query.cjs +54 -29
  449. package/dist/query.cjs.map +1 -1
  450. package/dist/types.cjs.map +1 -1
  451. package/dist/types.d.ts +13 -3
  452. package/dist/types.d.ts.map +1 -1
  453. package/dist/{update-GBKBWOJX.js → update-CJ3XVFNU.js} +2 -2
  454. package/dist/utils/formatUpdatedAt.d.ts +1 -0
  455. package/dist/utils/formatUpdatedAt.d.ts.map +1 -1
  456. package/dist/utils/formatUpdatedAt.js +10 -2
  457. package/dist/utils/formatUpdatedAt.js.map +1 -1
  458. package/dist/withOctoCMS.cjs +2 -4
  459. package/dist/withOctoCMS.cjs.map +1 -1
  460. package/globals.css +156 -106
  461. package/package.json +11 -4
  462. package/dist/admin/ThemeProvider.d.ts +0 -37
  463. package/dist/admin/ThemeProvider.d.ts.map +0 -1
  464. package/dist/admin/ThemeProvider.js +0 -42
  465. package/dist/admin/ThemeProvider.js.map +0 -1
  466. package/dist/admin/actions/getThemeCookie.d.ts +0 -9
  467. package/dist/admin/actions/getThemeCookie.d.ts.map +0 -1
  468. package/dist/admin/actions/getThemeCookie.js.map +0 -1
  469. package/dist/admin/theme.d.ts +0 -10
  470. package/dist/admin/theme.d.ts.map +0 -1
  471. package/dist/admin/theme.js +0 -8
  472. package/dist/admin/theme.js.map +0 -1
  473. package/dist/chunk-SJ3MPCWY.js.map +0 -1
  474. package/dist/components/Chat/ChatPage.skeleton.d.ts +0 -3
  475. package/dist/components/Chat/ChatPage.skeleton.d.ts.map +0 -1
  476. package/dist/components/Chat/ChatPage.skeleton.js +0 -22
  477. package/dist/components/Chat/ChatPage.skeleton.js.map +0 -1
  478. package/dist/components/Header/ThemeToggle.d.ts +0 -7
  479. package/dist/components/Header/ThemeToggle.d.ts.map +0 -1
  480. package/dist/components/Header/ThemeToggle.js +0 -31
  481. package/dist/components/Header/ThemeToggle.js.map +0 -1
  482. package/dist/components/Loading.d.ts +0 -6
  483. package/dist/components/Loading.d.ts.map +0 -1
  484. package/dist/components/Loading.js +0 -14
  485. package/dist/components/Loading.js.map +0 -1
  486. package/dist/components/skeletons/AdminGenericSkeleton.d.ts +0 -7
  487. package/dist/components/skeletons/AdminGenericSkeleton.d.ts.map +0 -1
  488. package/dist/components/skeletons/AdminGenericSkeleton.js +0 -14
  489. package/dist/components/skeletons/AdminGenericSkeleton.js.map +0 -1
  490. package/dist/components/skeletons/SectionSkeleton.d.ts +0 -11
  491. package/dist/components/skeletons/SectionSkeleton.d.ts.map +0 -1
  492. package/dist/components/skeletons/SectionSkeleton.js +0 -26
  493. package/dist/components/skeletons/SectionSkeleton.js.map +0 -1
  494. package/dist/embeddingsGen-FWXI55MC.js.map +0 -1
  495. /package/dist/{agentDocs-L4RLZCYK.js.map → agentDocs-JZRZW7XI.js.map} +0 -0
  496. /package/dist/{init-IKO4CU7H.js.map → init-DTJPSWLO.js.map} +0 -0
  497. /package/dist/{update-GBKBWOJX.js.map → update-CJ3XVFNU.js.map} +0 -0
@@ -18,11 +18,10 @@ type AdminAppProps = {
18
18
  * /cms/model → ContentModelPage
19
19
  * /cms/model/<type> → ContentTypePage
20
20
  *
21
- * Streaming model: each branch wraps its page in `<Suspense fallback={<MatchingSkeleton/>}>`.
22
- * There is **no outer Suspense** around AdminApp itself Next.js's
23
- * navigation hold-over keeps the previous page rendered until the new one's
24
- * `await params` resolves, so the user never sees a generic-shimmer flash
25
- * between sub-routes. Only the inner per-page skeleton is ever visible.
21
+ * **No `Suspense` in the dispatcher** `await params` runs in this async RSC; Next.js
22
+ * keeps the previous segment visible during navigation. Thin server shells (`*Page`)
23
+ * hand off to client components that load via TanStack Query and render their own
24
+ * block-level skeletons (`LeftPanelSkeleton`, `ContentTableSkeleton`, etc.).
26
25
  */
27
26
  export declare function AdminApp({ params }: AdminAppProps): Promise<import("react/jsx-runtime").JSX.Element>;
28
27
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"AdminApp.d.ts","sourceRoot":"","sources":["../../admin/AdminApp.tsx"],"names":[],"mappings":"AAsBA,KAAK,aAAa,GAAG;IACnB,MAAM,EAAE,OAAO,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CACtC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,QAAQ,CAAC,EAAE,MAAM,EAAE,EAAE,aAAa,oDAyEvD"}
1
+ {"version":3,"file":"AdminApp.d.ts","sourceRoot":"","sources":["../../admin/AdminApp.tsx"],"names":[],"mappings":"AAYA,KAAK,aAAa,GAAG;IACnB,MAAM,EAAE,OAAO,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CACtC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,QAAQ,CAAC,EAAE,MAAM,EAAE,EAAE,aAAa,oDAyCvD"}
@@ -1,15 +1,6 @@
1
1
  import "../chunk-B5LE2OEC.js";
2
2
  import { jsx } from "react/jsx-runtime";
3
- import { Suspense } from "react";
4
- import { ChatPageSkeleton } from "../components/Chat/ChatPage.skeleton";
5
- import { ContentModelListSkeleton } from "../components/ContentModel/ContentModelList.skeleton";
6
- import { ContentTypeDetailSkeleton } from "../components/ContentModel/ContentTypeDetail.skeleton";
7
- import { DashboardCollectionSkeleton } from "../components/Dashboard/DashboardContent.collection.skeleton";
8
3
  import { DashboardContentSkeleton } from "../components/Dashboard/DashboardContent.skeleton";
9
- import { DashboardListSkeleton } from "../components/Dashboard/DashboardContent.list.skeleton";
10
- import { EditPostSkeleton } from "../components/EditPost/EditPost.skeleton";
11
- import { MediaAssetSkeleton } from "../components/MediaAsset/MediaAsset.skeleton";
12
- import { MediaManagerSkeleton } from "../components/MediaManager/MediaManager.skeleton";
13
4
  import { ChatPage } from "./pages/ChatPage";
14
5
  import { CollectionPage } from "./pages/CollectionPage";
15
6
  import { ContentModelPage } from "./pages/ContentModelPage";
@@ -26,32 +17,32 @@ async function AdminApp({ params }) {
26
17
  return /* @__PURE__ */ jsx(DashboardPage, {});
27
18
  }
28
19
  if (segments[0] === "chat") {
29
- return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(ChatPageSkeleton, {}), children: /* @__PURE__ */ jsx(ChatPage, {}) });
20
+ return /* @__PURE__ */ jsx(ChatPage, {});
30
21
  }
31
22
  if (segments[0] === "media") {
32
23
  if (segments.length === 1) {
33
- return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(MediaManagerSkeleton, {}), children: /* @__PURE__ */ jsx(MediaPage, {}) });
24
+ return /* @__PURE__ */ jsx(MediaPage, {});
34
25
  }
35
26
  const id = segments[1];
36
- return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(MediaAssetSkeleton, {}), children: /* @__PURE__ */ jsx(MediaAssetPage, { id }) }, id);
27
+ return /* @__PURE__ */ jsx(MediaAssetPage, { id }, id);
37
28
  }
38
29
  if (segments[0] === "model") {
39
30
  if (segments.length === 1) {
40
- return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(ContentModelListSkeleton, {}), children: /* @__PURE__ */ jsx(ContentModelPage, {}) });
31
+ return /* @__PURE__ */ jsx(ContentModelPage, {});
41
32
  }
42
33
  const [, type] = segments;
43
- return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(ContentTypeDetailSkeleton, {}), children: /* @__PURE__ */ jsx(ContentTypePage, { type }) }, type);
34
+ return /* @__PURE__ */ jsx(ContentTypePage, { type }, type);
44
35
  }
45
36
  if (segments[0] === "content") {
46
37
  if (segments.length === 1) {
47
- return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(DashboardListSkeleton, {}), children: /* @__PURE__ */ jsx(ContentPage, {}) });
38
+ return /* @__PURE__ */ jsx(ContentPage, {});
48
39
  }
49
40
  if (segments.length === 2) {
50
41
  const [, type2] = segments;
51
- return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(DashboardCollectionSkeleton, {}), children: /* @__PURE__ */ jsx(CollectionPage, { params: Promise.resolve({ type: type2 }) }) }, type2);
42
+ return /* @__PURE__ */ jsx(CollectionPage, { params: Promise.resolve({ type: type2 }) }, type2);
52
43
  }
53
44
  const [, type, id] = segments;
54
- return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(EditPostSkeleton, {}), children: /* @__PURE__ */ jsx(EntryPage, { params: Promise.resolve({ type, id }) }) }, `${type}/${id}`);
45
+ return /* @__PURE__ */ jsx(EntryPage, { params: Promise.resolve({ type, id }) }, `${type}/${id}`);
55
46
  }
56
47
  return /* @__PURE__ */ jsx(DashboardContentSkeleton, {});
57
48
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../admin/AdminApp.tsx"],"sourcesContent":["import React, { Suspense } from 'react';\n\nimport { ChatPageSkeleton } from '../components/Chat/ChatPage.skeleton';\nimport { ContentModelListSkeleton } from '../components/ContentModel/ContentModelList.skeleton';\nimport { ContentTypeDetailSkeleton } from '../components/ContentModel/ContentTypeDetail.skeleton';\nimport { DashboardCollectionSkeleton } from '../components/Dashboard/DashboardContent.collection.skeleton';\nimport { DashboardContentSkeleton } from '../components/Dashboard/DashboardContent.skeleton';\nimport { DashboardListSkeleton } from '../components/Dashboard/DashboardContent.list.skeleton';\nimport { EditPostSkeleton } from '../components/EditPost/EditPost.skeleton';\nimport { MediaAssetSkeleton } from '../components/MediaAsset/MediaAsset.skeleton';\nimport { MediaManagerSkeleton } from '../components/MediaManager/MediaManager.skeleton';\n\nimport { ChatPage } from './pages/ChatPage';\nimport { CollectionPage } from './pages/CollectionPage';\nimport { ContentModelPage } from './pages/ContentModelPage';\nimport { ContentPage } from './pages/ContentPage';\nimport { ContentTypePage } from './pages/ContentTypePage';\nimport { DashboardPage } from './pages/DashboardPage';\nimport { EntryPage } from './pages/EntryPage';\nimport { MediaAssetPage } from './pages/MediaAssetPage';\nimport { MediaPage } from './pages/MediaPage';\n\ntype AdminAppProps = {\n params: Promise<{ path?: string[] }>;\n};\n\n/**\n * Catch-all admin router. Mounted via a single `src/app/cms/[[...path]]/page.tsx`\n * file in the user app that re-exports this component as the default.\n *\n * Route segments map to admin pages:\n * /cms → DashboardPage (empty home)\n * /cms/content → ContentPage (all entries)\n * /cms/content/<type> → CollectionPage\n * /cms/content/<type>/<id> → EntryPage\n * /cms/chat → ChatPage (gated on `isAgentEnabled(agentConfig)`)\n * /cms/media → MediaPage (library — grid + folders)\n * /cms/media/<id> → MediaAssetPage (full-page asset editor)\n * /cms/model → ContentModelPage\n * /cms/model/<type> → ContentTypePage\n *\n * Streaming model: each branch wraps its page in `<Suspense fallback={<MatchingSkeleton/>}>`.\n * There is **no outer Suspense** around AdminApp itself — Next.js's\n * navigation hold-over keeps the previous page rendered until the new one's\n * `await params` resolves, so the user never sees a generic-shimmer flash\n * between sub-routes. Only the inner per-page skeleton is ever visible.\n */\nexport async function AdminApp({ params }: AdminAppProps) {\n const { path } = await params;\n const segments = path ?? [];\n\n if (segments.length === 0) {\n return <DashboardPage />;\n }\n\n if (segments[0] === 'chat') {\n return (\n <Suspense fallback={<ChatPageSkeleton />}>\n <ChatPage />\n </Suspense>\n );\n }\n\n if (segments[0] === 'media') {\n if (segments.length === 1) {\n return (\n <Suspense fallback={<MediaManagerSkeleton />}>\n <MediaPage />\n </Suspense>\n );\n }\n const id = segments[1];\n return (\n <Suspense fallback={<MediaAssetSkeleton />} key={id}>\n <MediaAssetPage id={id} />\n </Suspense>\n );\n }\n\n if (segments[0] === 'model') {\n if (segments.length === 1) {\n return (\n <Suspense fallback={<ContentModelListSkeleton />}>\n <ContentModelPage />\n </Suspense>\n );\n }\n const [, type] = segments;\n return (\n <Suspense fallback={<ContentTypeDetailSkeleton />} key={type}>\n <ContentTypePage type={type} />\n </Suspense>\n );\n }\n\n if (segments[0] === 'content') {\n if (segments.length === 1) {\n return (\n <Suspense fallback={<DashboardListSkeleton />}>\n <ContentPage />\n </Suspense>\n );\n }\n if (segments.length === 2) {\n const [, type] = segments;\n return (\n <Suspense fallback={<DashboardCollectionSkeleton />} key={type}>\n <CollectionPage params={Promise.resolve({ type })} />\n </Suspense>\n );\n }\n const [, type, id] = segments;\n return (\n <Suspense fallback={<EditPostSkeleton />} key={`${type}/${id}`}>\n <EntryPage params={Promise.resolve({ type, id })} />\n </Suspense>\n );\n }\n\n return <DashboardContentSkeleton />;\n}\n"],"mappings":";AAoDW;AApDX,SAAgB,gBAAgB;AAEhC,SAAS,wBAAwB;AACjC,SAAS,gCAAgC;AACzC,SAAS,iCAAiC;AAC1C,SAAS,mCAAmC;AAC5C,SAAS,gCAAgC;AACzC,SAAS,6BAA6B;AACtC,SAAS,wBAAwB;AACjC,SAAS,0BAA0B;AACnC,SAAS,4BAA4B;AAErC,SAAS,gBAAgB;AACzB,SAAS,sBAAsB;AAC/B,SAAS,wBAAwB;AACjC,SAAS,mBAAmB;AAC5B,SAAS,uBAAuB;AAChC,SAAS,qBAAqB;AAC9B,SAAS,iBAAiB;AAC1B,SAAS,sBAAsB;AAC/B,SAAS,iBAAiB;AA2B1B,eAAsB,SAAS,EAAE,OAAO,GAAkB;AACxD,QAAM,EAAE,KAAK,IAAI,MAAM;AACvB,QAAM,WAAW,sBAAQ,CAAC;AAE1B,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO,oBAAC,iBAAc;AAAA,EACxB;AAEA,MAAI,SAAS,CAAC,MAAM,QAAQ;AAC1B,WACE,oBAAC,YAAS,UAAU,oBAAC,oBAAiB,GACpC,8BAAC,YAAS,GACZ;AAAA,EAEJ;AAEA,MAAI,SAAS,CAAC,MAAM,SAAS;AAC3B,QAAI,SAAS,WAAW,GAAG;AACzB,aACE,oBAAC,YAAS,UAAU,oBAAC,wBAAqB,GACxC,8BAAC,aAAU,GACb;AAAA,IAEJ;AACA,UAAM,KAAK,SAAS,CAAC;AACrB,WACE,oBAAC,YAAS,UAAU,oBAAC,sBAAmB,GACtC,8BAAC,kBAAe,IAAQ,KADuB,EAEjD;AAAA,EAEJ;AAEA,MAAI,SAAS,CAAC,MAAM,SAAS;AAC3B,QAAI,SAAS,WAAW,GAAG;AACzB,aACE,oBAAC,YAAS,UAAU,oBAAC,4BAAyB,GAC5C,8BAAC,oBAAiB,GACpB;AAAA,IAEJ;AACA,UAAM,CAAC,EAAE,IAAI,IAAI;AACjB,WACE,oBAAC,YAAS,UAAU,oBAAC,6BAA0B,GAC7C,8BAAC,mBAAgB,MAAY,KADyB,IAExD;AAAA,EAEJ;AAEA,MAAI,SAAS,CAAC,MAAM,WAAW;AAC7B,QAAI,SAAS,WAAW,GAAG;AACzB,aACE,oBAAC,YAAS,UAAU,oBAAC,yBAAsB,GACzC,8BAAC,eAAY,GACf;AAAA,IAEJ;AACA,QAAI,SAAS,WAAW,GAAG;AACzB,YAAM,CAAC,EAAEA,KAAI,IAAI;AACjB,aACE,oBAAC,YAAS,UAAU,oBAAC,+BAA4B,GAC/C,8BAAC,kBAAe,QAAQ,QAAQ,QAAQ,EAAE,MAAAA,MAAK,CAAC,GAAG,KADKA,KAE1D;AAAA,IAEJ;AACA,UAAM,CAAC,EAAE,MAAM,EAAE,IAAI;AACrB,WACE,oBAAC,YAAS,UAAU,oBAAC,oBAAiB,GACpC,8BAAC,aAAU,QAAQ,QAAQ,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,KADL,GAAG,IAAI,IAAI,EAAE,EAE5D;AAAA,EAEJ;AAEA,SAAO,oBAAC,4BAAyB;AACnC;","names":["type"]}
1
+ {"version":3,"sources":["../../admin/AdminApp.tsx"],"sourcesContent":["import { DashboardContentSkeleton } from '../components/Dashboard/DashboardContent.skeleton';\n\nimport { ChatPage } from './pages/ChatPage';\nimport { CollectionPage } from './pages/CollectionPage';\nimport { ContentModelPage } from './pages/ContentModelPage';\nimport { ContentPage } from './pages/ContentPage';\nimport { ContentTypePage } from './pages/ContentTypePage';\nimport { DashboardPage } from './pages/DashboardPage';\nimport { EntryPage } from './pages/EntryPage';\nimport { MediaAssetPage } from './pages/MediaAssetPage';\nimport { MediaPage } from './pages/MediaPage';\n\ntype AdminAppProps = {\n params: Promise<{ path?: string[] }>;\n};\n\n/**\n * Catch-all admin router. Mounted via a single `src/app/cms/[[...path]]/page.tsx`\n * file in the user app that re-exports this component as the default.\n *\n * Route segments map to admin pages:\n * /cms → DashboardPage (empty home)\n * /cms/content → ContentPage (all entries)\n * /cms/content/<type> → CollectionPage\n * /cms/content/<type>/<id> → EntryPage\n * /cms/chat → ChatPage (gated on `isAgentEnabled(agentConfig)`)\n * /cms/media → MediaPage (library — grid + folders)\n * /cms/media/<id> → MediaAssetPage (full-page asset editor)\n * /cms/model → ContentModelPage\n * /cms/model/<type> → ContentTypePage\n *\n * **No `Suspense` in the dispatcher** `await params` runs in this async RSC; Next.js\n * keeps the previous segment visible during navigation. Thin server shells (`*Page`)\n * hand off to client components that load via TanStack Query and render their own\n * block-level skeletons (`LeftPanelSkeleton`, `ContentTableSkeleton`, etc.).\n */\nexport async function AdminApp({ params }: AdminAppProps) {\n const { path } = await params;\n const segments = path ?? [];\n\n if (segments.length === 0) {\n return <DashboardPage />;\n }\n\n if (segments[0] === 'chat') {\n return <ChatPage />;\n }\n\n if (segments[0] === 'media') {\n if (segments.length === 1) {\n return <MediaPage />;\n }\n const id = segments[1];\n return <MediaAssetPage id={id} key={id} />;\n }\n\n if (segments[0] === 'model') {\n if (segments.length === 1) {\n return <ContentModelPage />;\n }\n const [, type] = segments;\n return <ContentTypePage type={type} key={type} />;\n }\n\n if (segments[0] === 'content') {\n if (segments.length === 1) {\n return <ContentPage />;\n }\n if (segments.length === 2) {\n const [, type] = segments;\n return <CollectionPage params={Promise.resolve({ type })} key={type} />;\n }\n const [, type, id] = segments;\n return <EntryPage params={Promise.resolve({ type, id })} key={`${type}/${id}`} />;\n }\n\n return <DashboardContentSkeleton />;\n}\n"],"mappings":";AAyCW;AAzCX,SAAS,gCAAgC;AAEzC,SAAS,gBAAgB;AACzB,SAAS,sBAAsB;AAC/B,SAAS,wBAAwB;AACjC,SAAS,mBAAmB;AAC5B,SAAS,uBAAuB;AAChC,SAAS,qBAAqB;AAC9B,SAAS,iBAAiB;AAC1B,SAAS,sBAAsB;AAC/B,SAAS,iBAAiB;AA0B1B,eAAsB,SAAS,EAAE,OAAO,GAAkB;AACxD,QAAM,EAAE,KAAK,IAAI,MAAM;AACvB,QAAM,WAAW,sBAAQ,CAAC;AAE1B,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO,oBAAC,iBAAc;AAAA,EACxB;AAEA,MAAI,SAAS,CAAC,MAAM,QAAQ;AAC1B,WAAO,oBAAC,YAAS;AAAA,EACnB;AAEA,MAAI,SAAS,CAAC,MAAM,SAAS;AAC3B,QAAI,SAAS,WAAW,GAAG;AACzB,aAAO,oBAAC,aAAU;AAAA,IACpB;AACA,UAAM,KAAK,SAAS,CAAC;AACrB,WAAO,oBAAC,kBAAe,MAAa,EAAI;AAAA,EAC1C;AAEA,MAAI,SAAS,CAAC,MAAM,SAAS;AAC3B,QAAI,SAAS,WAAW,GAAG;AACzB,aAAO,oBAAC,oBAAiB;AAAA,IAC3B;AACA,UAAM,CAAC,EAAE,IAAI,IAAI;AACjB,WAAO,oBAAC,mBAAgB,QAAiB,IAAM;AAAA,EACjD;AAEA,MAAI,SAAS,CAAC,MAAM,WAAW;AAC7B,QAAI,SAAS,WAAW,GAAG;AACzB,aAAO,oBAAC,eAAY;AAAA,IACtB;AACA,QAAI,SAAS,WAAW,GAAG;AACzB,YAAM,CAAC,EAAEA,KAAI,IAAI;AACjB,aAAO,oBAAC,kBAAe,QAAQ,QAAQ,QAAQ,EAAE,MAAAA,MAAK,CAAC,KAAQA,KAAM;AAAA,IACvE;AACA,UAAM,CAAC,EAAE,MAAM,EAAE,IAAI;AACrB,WAAO,oBAAC,aAAU,QAAQ,QAAQ,QAAQ,EAAE,MAAM,GAAG,CAAC,KAAQ,GAAG,IAAI,IAAI,EAAE,EAAI;AAAA,EACjF;AAEA,SAAO,oBAAC,4BAAyB;AACnC;","names":["type"]}
@@ -1 +1 @@
1
- {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../admin/actions/build.ts"],"names":[],"mappings":"AAaA,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,SAAS,CAAC;AAOjE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,2FAA2F;IAC3F,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB,CAAC;AA0FF,eAAO,MAAM,UAAU,GAAU,kBAAkB,MAAM,EAAE,UAAU,iBAAiB,KAAG,OAAO,CAAC,YAAY,CAmC5G,CAAC"}
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../admin/actions/build.ts"],"names":[],"mappings":"AAaA,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,SAAS,CAAC;AAOjE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,2FAA2F;IAC3F,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB,CAAC;AAuFF,eAAO,MAAM,UAAU,GAAU,kBAAkB,MAAM,EAAE,UAAU,iBAAiB,KAAG,OAAO,CAAC,YAAY,CAmC5G,CAAC"}
@@ -22,9 +22,12 @@ async function getEntriesForPublicSearch() {
22
22
  const entries = [];
23
23
  for (const file of files) {
24
24
  const normalized = file.replace(/\\/g, "/");
25
- if (normalized.includes("/media/")) continue;
26
25
  try {
27
- const filePath = path.join(process.cwd(), normalized);
26
+ const filePath = path.join(
27
+ /*turbopackIgnore: true*/
28
+ process.cwd(),
29
+ normalized
30
+ );
28
31
  const data = await fsPromises.readFile(filePath, { encoding: "utf8" });
29
32
  const content = JSON.parse(data);
30
33
  const sys = content.sys;
@@ -35,7 +38,11 @@ async function getEntriesForPublicSearch() {
35
38
  const mdPaths = companionMarkdownPathsForEntry(normalized, type, config.collections);
36
39
  for (const [fieldName, mdPath] of Object.entries(mdPaths)) {
37
40
  try {
38
- const mdFilePath = path.join(process.cwd(), mdPath);
41
+ const mdFilePath = path.join(
42
+ /*turbopackIgnore: true*/
43
+ process.cwd(),
44
+ mdPath
45
+ );
39
46
  companions[fieldName] = await fsPromises.readFile(mdFilePath, { encoding: "utf8" });
40
47
  } catch (e) {
41
48
  companions[fieldName] = "";
@@ -44,7 +51,11 @@ async function getEntriesForPublicSearch() {
44
51
  const rtPaths = companionRichTextPathsForEntry(normalized, type, config.collections);
45
52
  for (const [fieldName, rtPath] of Object.entries(rtPaths)) {
46
53
  try {
47
- const rtFilePath = path.join(process.cwd(), rtPath);
54
+ const rtFilePath = path.join(
55
+ /*turbopackIgnore: true*/
56
+ process.cwd(),
57
+ rtPath
58
+ );
48
59
  companions[fieldName] = await fsPromises.readFile(rtFilePath, { encoding: "utf8" });
49
60
  } catch (e) {
50
61
  companions[fieldName] = "";
@@ -74,7 +85,11 @@ async function buildAndWriteSearchIndex() {
74
85
  if (isProductionMode()) {
75
86
  await saveGitHubFile(SEARCH_INDEX_FILE_PATH, indexJson, "CMS: update search index");
76
87
  } else {
77
- const filePath = path.join(process.cwd(), SEARCH_INDEX_FILE_PATH);
88
+ const filePath = path.join(
89
+ /*turbopackIgnore: true*/
90
+ process.cwd(),
91
+ SEARCH_INDEX_FILE_PATH
92
+ );
78
93
  await fsPromises.mkdir(path.dirname(filePath), { recursive: true });
79
94
  await fsPromises.writeFile(filePath, indexJson, "utf8");
80
95
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../admin/actions/build.ts"],"sourcesContent":["'use server';\n\nimport fsPromises from 'fs/promises';\nimport path from 'path';\n\nimport { glob } from 'glob';\nimport { revalidatePath, revalidateTag, updateTag } from 'next/cache';\n\nimport { getConfig } from '../../lib/configStore';\nimport { companionMarkdownPathsForEntry, companionRichTextPathsForEntry } from '../../lib/companionMarkdown';\nimport { buildSearchIndex, type EntryForSearch } from '../../lib/searchIndex';\n\nimport { isProductionMode, saveGitHubFile } from '../github';\nimport { actionErr, actionOk, type ActionResult } from './utils';\n\n/** Cache tags used by `getHomePage` / `getBlog` / `getPublishedPosts` in `src/app/cms/ssr/getPageContent.ts`. */\nconst PUBLIC_CACHE_TAGS = ['homePage', 'blog'] as const;\n\nconst SEARCH_INDEX_FILE_PATH = 'cms/__generated__/search-index.json';\n\nexport type BuildJsonsOptions = {\n /** Slug-based `/blog/...` paths to revalidate in addition to the dynamic route segment. */\n blogPaths?: string[];\n};\n\n/** Helper: gather all searchable entries from the filesystem. */\nasync function getEntriesForPublicSearch(): Promise<EntryForSearch[]> {\n const config = getConfig();\n const publicCollections = config.search?.publicCollections;\n if (!publicCollections || Object.keys(publicCollections).length === 0) {\n return [];\n }\n\n const files = await glob(`${config.contentFolder}/**/*.json`);\n const entries: EntryForSearch[] = [];\n\n for (const file of files) {\n const normalized = file.replace(/\\\\/g, '/');\n // Skip media entries\n if (normalized.includes('/media/')) continue;\n\n try {\n const filePath = path.join(process.cwd(), normalized);\n const data = await fsPromises.readFile(filePath, { encoding: 'utf8' });\n const content = JSON.parse(data) as Record<string, unknown>;\n const sys = content.sys as { type?: string } | undefined;\n const type = sys?.type;\n\n // Only include entries from publicCollections\n if (!type || !(type in publicCollections)) continue;\n\n // Read companion markdown/richtext files\n const companions: Record<string, string> = {};\n if (type) {\n const mdPaths = companionMarkdownPathsForEntry(normalized, type, config.collections);\n for (const [fieldName, mdPath] of Object.entries(mdPaths)) {\n try {\n const mdFilePath = path.join(process.cwd(), mdPath);\n companions[fieldName] = await fsPromises.readFile(mdFilePath, { encoding: 'utf8' });\n } catch {\n companions[fieldName] = '';\n }\n }\n const rtPaths = companionRichTextPathsForEntry(normalized, type, config.collections);\n for (const [fieldName, rtPath] of Object.entries(rtPaths)) {\n try {\n const rtFilePath = path.join(process.cwd(), rtPath);\n companions[fieldName] = await fsPromises.readFile(rtFilePath, { encoding: 'utf8' });\n } catch {\n companions[fieldName] = '';\n }\n }\n }\n\n entries.push({\n path: normalized.replace(`${config.contentFolder}/`, ''),\n content,\n companionContent: companions,\n });\n } catch {\n // Skip unreadable files\n }\n }\n\n return entries;\n}\n\n/** Build and write the public search index. */\nasync function buildAndWriteSearchIndex(): Promise<void> {\n const config = getConfig();\n const publicCollections = config.search?.publicCollections;\n if (!publicCollections || Object.keys(publicCollections).length === 0) {\n return;\n }\n\n try {\n const entries = await getEntriesForPublicSearch();\n const indexJson = buildSearchIndex(entries, config, Object.keys(publicCollections));\n\n if (isProductionMode()) {\n // Write to GitHub\n await saveGitHubFile(SEARCH_INDEX_FILE_PATH, indexJson, 'CMS: update search index');\n } else {\n // Write to local filesystem\n const filePath = path.join(process.cwd(), SEARCH_INDEX_FILE_PATH);\n await fsPromises.mkdir(path.dirname(filePath), { recursive: true });\n await fsPromises.writeFile(filePath, indexJson, 'utf8');\n }\n } catch {\n // Silently fail search index generation to not block the build\n }\n}\n\nexport const buildJsons = async (_editedFileName?: string, options?: BuildJsonsOptions): Promise<ActionResult> => {\n try {\n for (const tag of PUBLIC_CACHE_TAGS) {\n // `updateTag` gives read-your-own-writes inside a Server Action (the\n // editor save path). When called from a Route Handler — e.g. the\n // proposal accept endpoint at `/api/agent/proposals/accept` — the\n // runtime throws (\"updateTag can only be called from within a Server\n // Action\"); fall back to `revalidateTag` with immediate expiry, which\n // is allowed everywhere and produces the same fresh-data outcome.\n try {\n updateTag(tag);\n } catch {\n revalidateTag(tag, { expire: 0 });\n }\n }\n\n revalidatePath('/', 'layout');\n revalidatePath('/blog', 'page');\n revalidatePath('/blog/[slug]', 'page');\n\n const seen = new Set<string>();\n for (const p of options?.blogPaths ?? []) {\n if (typeof p === 'string' && p.startsWith('/blog/') && !seen.has(p)) {\n seen.add(p);\n revalidatePath(p);\n }\n }\n\n // Build and write the public search index\n await buildAndWriteSearchIndex();\n\n return actionOk();\n } catch (e) {\n return actionErr(e);\n }\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../admin/actions/build.ts"],"sourcesContent":["'use server';\n\nimport fsPromises from 'fs/promises';\nimport path from 'path';\n\nimport { glob } from 'glob';\nimport { revalidatePath, revalidateTag, updateTag } from 'next/cache';\n\nimport { getConfig } from '../../lib/configStore';\nimport { companionMarkdownPathsForEntry, companionRichTextPathsForEntry } from '../../lib/companionMarkdown';\nimport { buildSearchIndex, type EntryForSearch } from '../../lib/searchIndex';\n\nimport { isProductionMode, saveGitHubFile } from '../github';\nimport { actionErr, actionOk, type ActionResult } from './utils';\n\n/** Cache tags used by `getHomePage` / `getBlog` / `getPublishedPosts` in `src/app/cms/ssr/getPageContent.ts`. */\nconst PUBLIC_CACHE_TAGS = ['homePage', 'blog'] as const;\n\nconst SEARCH_INDEX_FILE_PATH = 'cms/__generated__/search-index.json';\n\nexport type BuildJsonsOptions = {\n /** Slug-based `/blog/...` paths to revalidate in addition to the dynamic route segment. */\n blogPaths?: string[];\n};\n\n/** Helper: gather all searchable entries from the filesystem. */\nasync function getEntriesForPublicSearch(): Promise<EntryForSearch[]> {\n const config = getConfig();\n const publicCollections = config.search?.publicCollections;\n if (!publicCollections || Object.keys(publicCollections).length === 0) {\n return [];\n }\n\n const files = await glob(`${config.contentFolder}/**/*.json`);\n const entries: EntryForSearch[] = [];\n\n for (const file of files) {\n const normalized = file.replace(/\\\\/g, '/');\n try {\n const filePath = path.join(/*turbopackIgnore: true*/ process.cwd(), normalized);\n const data = await fsPromises.readFile(filePath, { encoding: 'utf8' });\n const content = JSON.parse(data) as Record<string, unknown>;\n const sys = content.sys as { type?: string } | undefined;\n const type = sys?.type;\n\n // Only include entries from publicCollections\n if (!type || !(type in publicCollections)) continue;\n\n // Read companion markdown/richtext files\n const companions: Record<string, string> = {};\n if (type) {\n const mdPaths = companionMarkdownPathsForEntry(normalized, type, config.collections);\n for (const [fieldName, mdPath] of Object.entries(mdPaths)) {\n try {\n const mdFilePath = path.join(/*turbopackIgnore: true*/ process.cwd(), mdPath);\n companions[fieldName] = await fsPromises.readFile(mdFilePath, { encoding: 'utf8' });\n } catch {\n companions[fieldName] = '';\n }\n }\n const rtPaths = companionRichTextPathsForEntry(normalized, type, config.collections);\n for (const [fieldName, rtPath] of Object.entries(rtPaths)) {\n try {\n const rtFilePath = path.join(/*turbopackIgnore: true*/ process.cwd(), rtPath);\n companions[fieldName] = await fsPromises.readFile(rtFilePath, { encoding: 'utf8' });\n } catch {\n companions[fieldName] = '';\n }\n }\n }\n\n entries.push({\n path: normalized.replace(`${config.contentFolder}/`, ''),\n content,\n companionContent: companions,\n });\n } catch {\n // Skip unreadable files\n }\n }\n\n return entries;\n}\n\n/** Build and write the public search index. */\nasync function buildAndWriteSearchIndex(): Promise<void> {\n const config = getConfig();\n const publicCollections = config.search?.publicCollections;\n if (!publicCollections || Object.keys(publicCollections).length === 0) {\n return;\n }\n\n try {\n const entries = await getEntriesForPublicSearch();\n const indexJson = buildSearchIndex(entries, config, Object.keys(publicCollections));\n\n if (isProductionMode()) {\n // Write to GitHub\n await saveGitHubFile(SEARCH_INDEX_FILE_PATH, indexJson, 'CMS: update search index');\n } else {\n // Write to local filesystem\n const filePath = path.join(/*turbopackIgnore: true*/ process.cwd(), SEARCH_INDEX_FILE_PATH);\n await fsPromises.mkdir(path.dirname(filePath), { recursive: true });\n await fsPromises.writeFile(filePath, indexJson, 'utf8');\n }\n } catch {\n // Silently fail search index generation to not block the build\n }\n}\n\nexport const buildJsons = async (_editedFileName?: string, options?: BuildJsonsOptions): Promise<ActionResult> => {\n try {\n for (const tag of PUBLIC_CACHE_TAGS) {\n // `updateTag` gives read-your-own-writes inside a Server Action (the\n // editor save path). When called from a Route Handler — e.g. the\n // proposal accept endpoint at `/api/agent/proposals/accept` — the\n // runtime throws (\"updateTag can only be called from within a Server\n // Action\"); fall back to `revalidateTag` with immediate expiry, which\n // is allowed everywhere and produces the same fresh-data outcome.\n try {\n updateTag(tag);\n } catch {\n revalidateTag(tag, { expire: 0 });\n }\n }\n\n revalidatePath('/', 'layout');\n revalidatePath('/blog', 'page');\n revalidatePath('/blog/[slug]', 'page');\n\n const seen = new Set<string>();\n for (const p of options?.blogPaths ?? []) {\n if (typeof p === 'string' && p.startsWith('/blog/') && !seen.has(p)) {\n seen.add(p);\n revalidatePath(p);\n }\n }\n\n // Build and write the public search index\n await buildAndWriteSearchIndex();\n\n return actionOk();\n } catch (e) {\n return actionErr(e);\n }\n};\n"],"mappings":";;AAEA,OAAO,gBAAgB;AACvB,OAAO,UAAU;AAEjB,SAAS,YAAY;AACrB,SAAS,gBAAgB,eAAe,iBAAiB;AAEzD,SAAS,iBAAiB;AAC1B,SAAS,gCAAgC,sCAAsC;AAC/E,SAAS,wBAA6C;AAEtD,SAAS,kBAAkB,sBAAsB;AACjD,SAAS,WAAW,gBAAmC;AAGvD,MAAM,oBAAoB,CAAC,YAAY,MAAM;AAE7C,MAAM,yBAAyB;AAQ/B,eAAe,4BAAuD;AA1BtE;AA2BE,QAAM,SAAS,UAAU;AACzB,QAAM,qBAAoB,YAAO,WAAP,mBAAe;AACzC,MAAI,CAAC,qBAAqB,OAAO,KAAK,iBAAiB,EAAE,WAAW,GAAG;AACrE,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,QAAQ,MAAM,KAAK,GAAG,OAAO,aAAa,YAAY;AAC5D,QAAM,UAA4B,CAAC;AAEnC,aAAW,QAAQ,OAAO;AACxB,UAAM,aAAa,KAAK,QAAQ,OAAO,GAAG;AAC1C,QAAI;AACF,YAAM,WAAW,KAAK;AAAA;AAAA,QAA+B,QAAQ,IAAI;AAAA,QAAG;AAAA,MAAU;AAC9E,YAAM,OAAO,MAAM,WAAW,SAAS,UAAU,EAAE,UAAU,OAAO,CAAC;AACrE,YAAM,UAAU,KAAK,MAAM,IAAI;AAC/B,YAAM,MAAM,QAAQ;AACpB,YAAM,OAAO,2BAAK;AAGlB,UAAI,CAAC,QAAQ,EAAE,QAAQ,mBAAoB;AAG3C,YAAM,aAAqC,CAAC;AAC5C,UAAI,MAAM;AACR,cAAM,UAAU,+BAA+B,YAAY,MAAM,OAAO,WAAW;AACnF,mBAAW,CAAC,WAAW,MAAM,KAAK,OAAO,QAAQ,OAAO,GAAG;AACzD,cAAI;AACF,kBAAM,aAAa,KAAK;AAAA;AAAA,cAA+B,QAAQ,IAAI;AAAA,cAAG;AAAA,YAAM;AAC5E,uBAAW,SAAS,IAAI,MAAM,WAAW,SAAS,YAAY,EAAE,UAAU,OAAO,CAAC;AAAA,UACpF,SAAQ;AACN,uBAAW,SAAS,IAAI;AAAA,UAC1B;AAAA,QACF;AACA,cAAM,UAAU,+BAA+B,YAAY,MAAM,OAAO,WAAW;AACnF,mBAAW,CAAC,WAAW,MAAM,KAAK,OAAO,QAAQ,OAAO,GAAG;AACzD,cAAI;AACF,kBAAM,aAAa,KAAK;AAAA;AAAA,cAA+B,QAAQ,IAAI;AAAA,cAAG;AAAA,YAAM;AAC5E,uBAAW,SAAS,IAAI,MAAM,WAAW,SAAS,YAAY,EAAE,UAAU,OAAO,CAAC;AAAA,UACpF,SAAQ;AACN,uBAAW,SAAS,IAAI;AAAA,UAC1B;AAAA,QACF;AAAA,MACF;AAEA,cAAQ,KAAK;AAAA,QACX,MAAM,WAAW,QAAQ,GAAG,OAAO,aAAa,KAAK,EAAE;AAAA,QACvD;AAAA,QACA,kBAAkB;AAAA,MACpB,CAAC;AAAA,IACH,SAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO;AACT;AAGA,eAAe,2BAA0C;AArFzD;AAsFE,QAAM,SAAS,UAAU;AACzB,QAAM,qBAAoB,YAAO,WAAP,mBAAe;AACzC,MAAI,CAAC,qBAAqB,OAAO,KAAK,iBAAiB,EAAE,WAAW,GAAG;AACrE;AAAA,EACF;AAEA,MAAI;AACF,UAAM,UAAU,MAAM,0BAA0B;AAChD,UAAM,YAAY,iBAAiB,SAAS,QAAQ,OAAO,KAAK,iBAAiB,CAAC;AAElF,QAAI,iBAAiB,GAAG;AAEtB,YAAM,eAAe,wBAAwB,WAAW,0BAA0B;AAAA,IACpF,OAAO;AAEL,YAAM,WAAW,KAAK;AAAA;AAAA,QAA+B,QAAQ,IAAI;AAAA,QAAG;AAAA,MAAsB;AAC1F,YAAM,WAAW,MAAM,KAAK,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAClE,YAAM,WAAW,UAAU,UAAU,WAAW,MAAM;AAAA,IACxD;AAAA,EACF,SAAQ;AAAA,EAER;AACF;AAEO,MAAM,aAAa,OAAO,iBAA0B,YAAuD;AA9GlH;AA+GE,MAAI;AACF,eAAW,OAAO,mBAAmB;AAOnC,UAAI;AACF,kBAAU,GAAG;AAAA,MACf,SAAQ;AACN,sBAAc,KAAK,EAAE,QAAQ,EAAE,CAAC;AAAA,MAClC;AAAA,IACF;AAEA,mBAAe,KAAK,QAAQ;AAC5B,mBAAe,SAAS,MAAM;AAC9B,mBAAe,gBAAgB,MAAM;AAErC,UAAM,OAAO,oBAAI,IAAY;AAC7B,eAAW,MAAK,wCAAS,cAAT,YAAsB,CAAC,GAAG;AACxC,UAAI,OAAO,MAAM,YAAY,EAAE,WAAW,QAAQ,KAAK,CAAC,KAAK,IAAI,CAAC,GAAG;AACnE,aAAK,IAAI,CAAC;AACV,uBAAe,CAAC;AAAA,MAClB;AAAA,IACF;AAGA,UAAM,yBAAyB;AAE/B,WAAO,SAAS;AAAA,EAClB,SAAS,GAAG;AACV,WAAO,UAAU,CAAC;AAAA,EACpB;AACF;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../admin/actions/diff.ts"],"names":[],"mappings":"AAOA,OAAO,EAAmC,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAOtF,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAClC,wFAAwF;IACxF,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;IAC5E,gGAAgG;IAChG,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC,CAAC;AA8CF;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAU,UAAU,MAAM,KAAG,OAAO,CAAC,SAAS,CA0GtE,CAAC"}
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../admin/actions/diff.ts"],"names":[],"mappings":"AAOA,OAAO,EAAmC,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAQtF,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAClC,wFAAwF;IACxF,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;IAC5E,gGAAgG;IAChG,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC,CAAC;AA8CF;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAU,UAAU,MAAM,KAAG,OAAO,CAAC,SAAS,CA0GtE,CAAC"}
@@ -6,6 +6,7 @@ import { getConfig } from "../../lib/configStore";
6
6
  import { companionFilePathsForEntry } from "../../lib/companionMarkdown";
7
7
  import { diffEntryFields, safeParseEntry } from "../../lib/entryDiff";
8
8
  import { logCmsServerError } from "../../lib/cmsServerLog";
9
+ import { mediaContentFolder, mediaEntryPath } from "../../lib/mediaPath";
9
10
  import { parseFileName } from "../../utils/parseFileName";
10
11
  import { getGitHubFile, isProductionMode } from "../github";
11
12
  import { getBranch } from "./git";
@@ -94,12 +95,12 @@ const getEntryDiff = async (filePath) => {
94
95
  }
95
96
  const imageUrls = {};
96
97
  if (imageUuids.size > 0) {
97
- const mediaDir = `${config.contentFolder}/media`;
98
+ const mediaDir = mediaContentFolder();
98
99
  const resolvePairs = await Promise.all(
99
100
  Array.from(imageUuids).map(async (uuid) => {
100
101
  var _a, _b, _c;
101
102
  if (!uuid || uuid.startsWith("/")) return [uuid, uuid];
102
- let raw = (_a = await readFileAtRef(`${mediaDir}/media-${uuid}.json`, activeBranch, isProd)) != null ? _a : await readFileAtRef(`${mediaDir}/media-${uuid}.json`, baseBranch, isProd);
103
+ let raw = (_a = await readFileAtRef(mediaEntryPath(uuid), activeBranch, isProd)) != null ? _a : await readFileAtRef(mediaEntryPath(uuid), baseBranch, isProd);
103
104
  if (!raw) {
104
105
  raw = (_b = await readFileAtRef(`${mediaDir}/${uuid}.json`, activeBranch, isProd)) != null ? _b : await readFileAtRef(`${mediaDir}/${uuid}.json`, baseBranch, isProd);
105
106
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../admin/actions/diff.ts"],"sourcesContent":["'use server';\n\nimport { execFile } from 'node:child_process';\nimport fsPromises from 'node:fs/promises';\n\nimport { getConfig } from '../../lib/configStore';\nimport { companionFilePathsForEntry } from '../../lib/companionMarkdown';\nimport { diffEntryFields, safeParseEntry, type FieldDiff } from '../../lib/entryDiff';\nimport { logCmsServerError } from '../../lib/cmsServerLog';\nimport { parseFileName } from '../../utils/parseFileName';\nimport { getGitHubFile, isProductionMode } from '../github';\nimport { getBranch } from './git';\nimport { getErrorMessage } from './utils';\n\nexport type EntryDiff = {\n changed: boolean;\n activeBranch: string;\n baseBranch: string;\n /** Per-field diffs derived from the entry JSON `fields` object. */\n fields: Record<string, FieldDiff>;\n /** Raw before/after text for companion markdown/richtext files, keyed by field name. */\n companions: Record<string, { before: string | null; after: string | null }>;\n /** Resolved `/media/<uuid>.<ext>` URLs for image UUIDs appearing on either side of the diff. */\n imageUrls: Record<string, string>;\n};\n\nconst emptyDiff = (activeBranch = '', baseBranch = ''): EntryDiff => ({\n changed: false,\n activeBranch,\n baseBranch,\n fields: {},\n companions: {},\n imageUrls: {},\n});\n\n/**\n * Read a file at a specific git ref. Returns `null` if the file doesn't exist on that ref.\n * - Production: GitHub API via {@link getGitHubFile}.\n * - Dev: `git show <ref>:<path>` for committed content, or the working-tree file when the ref\n * matches the currently checked-out branch.\n */\nasync function readFileAtRef(filePath: string, ref: string, isProd: boolean): Promise<string | null> {\n if (isProd) {\n const result = await getGitHubFile(filePath, ref);\n return result ? result.content : null;\n }\n return await readFileAtGitRef(filePath, ref);\n}\n\nfunction readFileAtGitRef(filePath: string, ref: string): Promise<string | null> {\n return new Promise((resolve) => {\n execFile('git', ['show', `${ref}:${filePath}`], { maxBuffer: 10 * 1024 * 1024 }, (error, stdout) => {\n if (error) {\n // `git show` exits non-zero if the path doesn't exist on that ref.\n resolve(null);\n return;\n }\n resolve(stdout.toString());\n });\n });\n}\n\nasync function readWorkingTreeFile(filePath: string): Promise<string | null> {\n try {\n return await fsPromises.readFile(filePath, 'utf-8');\n } catch {\n return null;\n }\n}\n\n/**\n * Compute the diff between the currently active feature branch and the base branch for a\n * single entry's files (JSON + companion `.md` / `.mdx`). Read-only, best-effort: any failure\n * resolves to an empty diff so the UI never throws.\n */\nexport const getEntryDiff = async (filePath: string): Promise<EntryDiff> => {\n if (!filePath) return emptyDiff();\n\n try {\n const config = getConfig();\n const baseBranch = config.git.baseBranch;\n const activeBranch = await getBranch();\n const isProd = isProductionMode();\n\n // Same branch on both sides → no unmerged changes.\n if (!activeBranch || activeBranch === baseBranch) {\n return emptyDiff(activeBranch, baseBranch);\n }\n\n const { type: collectionType } = parseFileName(filePath);\n\n // --- Entry JSON ---------------------------------------------------------\n const [afterJson, beforeJson] = await Promise.all([\n isProd ? readFileAtRef(filePath, activeBranch, true) : readWorkingTreeFile(filePath),\n readFileAtRef(filePath, baseBranch, isProd),\n ]);\n\n const fields = diffEntryFields(safeParseEntry(beforeJson), safeParseEntry(afterJson));\n\n // --- Companion files ----------------------------------------------------\n const companionPaths = companionFilePathsForEntry(filePath, collectionType, config.collections);\n const companionEntries = Object.entries(companionPaths);\n\n const companionResults = await Promise.all(\n companionEntries.map(async ([fieldName, compPath]) => {\n const [after, before] = await Promise.all([\n isProd ? readFileAtRef(compPath, activeBranch, true) : readWorkingTreeFile(compPath),\n readFileAtRef(compPath, baseBranch, isProd),\n ]);\n return [fieldName, { before, after }] as const;\n }),\n );\n\n const companions: EntryDiff['companions'] = {};\n for (const [fieldName, payload] of companionResults) {\n companions[fieldName] = payload;\n }\n\n const hasFieldChange = Object.values(fields).some((d) => d.kind !== 'unchanged');\n const hasCompanionChange = Object.values(companions).some((c) => (c.before ?? '') !== (c.after ?? ''));\n\n // Resolve image UUIDs that changed on either side to `/media/<uuid>.<ext>` URLs.\n const collectionDef = (config.collections as Record<string, { fields: Record<string, { format?: string }> }>)[\n collectionType\n ];\n const imageFieldNames = collectionDef\n ? Object.entries(collectionDef.fields)\n .filter(([, f]) => f.format === 'image')\n .map(([name]) => name)\n : [];\n\n const imageUuids = new Set<string>();\n for (const name of imageFieldNames) {\n const d = fields[name];\n if (!d) continue;\n if (d.kind === 'added' && typeof d.after === 'string') imageUuids.add(d.after);\n else if (d.kind === 'removed' && typeof d.before === 'string') imageUuids.add(d.before);\n else if (d.kind === 'changed') {\n if (typeof d.before === 'string') imageUuids.add(d.before);\n if (typeof d.after === 'string') imageUuids.add(d.after);\n }\n }\n\n const imageUrls: Record<string, string> = {};\n if (imageUuids.size > 0) {\n const mediaDir = `${config.contentFolder}/media`;\n const resolvePairs = await Promise.all(\n Array.from(imageUuids).map(async (uuid) => {\n if (!uuid || uuid.startsWith('/')) return [uuid, uuid] as const;\n // Prefer the active-branch media entry; fall back to base branch.\n let raw =\n (await readFileAtRef(`${mediaDir}/media-${uuid}.json`, activeBranch, isProd)) ??\n (await readFileAtRef(`${mediaDir}/media-${uuid}.json`, baseBranch, isProd));\n if (!raw) {\n // Legacy path: {uuid}.json\n raw =\n (await readFileAtRef(`${mediaDir}/${uuid}.json`, activeBranch, isProd)) ??\n (await readFileAtRef(`${mediaDir}/${uuid}.json`, baseBranch, isProd));\n }\n const parsed = safeParseEntry(raw);\n const ext = parsed && typeof parsed.fields?.extension === 'string' ? (parsed.fields.extension as string) : '';\n return [uuid, ext ? `/media/${uuid}.${ext}` : ''] as const;\n }),\n );\n for (const [uuid, url] of resolvePairs) {\n if (url) imageUrls[uuid] = url;\n }\n }\n\n return {\n changed: hasFieldChange || hasCompanionChange,\n activeBranch,\n baseBranch,\n fields,\n companions,\n imageUrls,\n };\n } catch (e) {\n logCmsServerError({ operation: 'getEntryDiff', message: getErrorMessage(e) });\n return emptyDiff();\n }\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../admin/actions/diff.ts"],"sourcesContent":["'use server';\n\nimport { execFile } from 'node:child_process';\nimport fsPromises from 'node:fs/promises';\n\nimport { getConfig } from '../../lib/configStore';\nimport { companionFilePathsForEntry } from '../../lib/companionMarkdown';\nimport { diffEntryFields, safeParseEntry, type FieldDiff } from '../../lib/entryDiff';\nimport { logCmsServerError } from '../../lib/cmsServerLog';\nimport { mediaContentFolder, mediaEntryPath } from '../../lib/mediaPath';\nimport { parseFileName } from '../../utils/parseFileName';\nimport { getGitHubFile, isProductionMode } from '../github';\nimport { getBranch } from './git';\nimport { getErrorMessage } from './utils';\n\nexport type EntryDiff = {\n changed: boolean;\n activeBranch: string;\n baseBranch: string;\n /** Per-field diffs derived from the entry JSON `fields` object. */\n fields: Record<string, FieldDiff>;\n /** Raw before/after text for companion markdown/richtext files, keyed by field name. */\n companions: Record<string, { before: string | null; after: string | null }>;\n /** Resolved `/media/<uuid>.<ext>` URLs for image UUIDs appearing on either side of the diff. */\n imageUrls: Record<string, string>;\n};\n\nconst emptyDiff = (activeBranch = '', baseBranch = ''): EntryDiff => ({\n changed: false,\n activeBranch,\n baseBranch,\n fields: {},\n companions: {},\n imageUrls: {},\n});\n\n/**\n * Read a file at a specific git ref. Returns `null` if the file doesn't exist on that ref.\n * - Production: GitHub API via {@link getGitHubFile}.\n * - Dev: `git show <ref>:<path>` for committed content, or the working-tree file when the ref\n * matches the currently checked-out branch.\n */\nasync function readFileAtRef(filePath: string, ref: string, isProd: boolean): Promise<string | null> {\n if (isProd) {\n const result = await getGitHubFile(filePath, ref);\n return result ? result.content : null;\n }\n return await readFileAtGitRef(filePath, ref);\n}\n\nfunction readFileAtGitRef(filePath: string, ref: string): Promise<string | null> {\n return new Promise((resolve) => {\n execFile('git', ['show', `${ref}:${filePath}`], { maxBuffer: 10 * 1024 * 1024 }, (error, stdout) => {\n if (error) {\n // `git show` exits non-zero if the path doesn't exist on that ref.\n resolve(null);\n return;\n }\n resolve(stdout.toString());\n });\n });\n}\n\nasync function readWorkingTreeFile(filePath: string): Promise<string | null> {\n try {\n return await fsPromises.readFile(filePath, 'utf-8');\n } catch {\n return null;\n }\n}\n\n/**\n * Compute the diff between the currently active feature branch and the base branch for a\n * single entry's files (JSON + companion `.md` / `.mdx`). Read-only, best-effort: any failure\n * resolves to an empty diff so the UI never throws.\n */\nexport const getEntryDiff = async (filePath: string): Promise<EntryDiff> => {\n if (!filePath) return emptyDiff();\n\n try {\n const config = getConfig();\n const baseBranch = config.git.baseBranch;\n const activeBranch = await getBranch();\n const isProd = isProductionMode();\n\n // Same branch on both sides → no unmerged changes.\n if (!activeBranch || activeBranch === baseBranch) {\n return emptyDiff(activeBranch, baseBranch);\n }\n\n const { type: collectionType } = parseFileName(filePath);\n\n // --- Entry JSON ---------------------------------------------------------\n const [afterJson, beforeJson] = await Promise.all([\n isProd ? readFileAtRef(filePath, activeBranch, true) : readWorkingTreeFile(filePath),\n readFileAtRef(filePath, baseBranch, isProd),\n ]);\n\n const fields = diffEntryFields(safeParseEntry(beforeJson), safeParseEntry(afterJson));\n\n // --- Companion files ----------------------------------------------------\n const companionPaths = companionFilePathsForEntry(filePath, collectionType, config.collections);\n const companionEntries = Object.entries(companionPaths);\n\n const companionResults = await Promise.all(\n companionEntries.map(async ([fieldName, compPath]) => {\n const [after, before] = await Promise.all([\n isProd ? readFileAtRef(compPath, activeBranch, true) : readWorkingTreeFile(compPath),\n readFileAtRef(compPath, baseBranch, isProd),\n ]);\n return [fieldName, { before, after }] as const;\n }),\n );\n\n const companions: EntryDiff['companions'] = {};\n for (const [fieldName, payload] of companionResults) {\n companions[fieldName] = payload;\n }\n\n const hasFieldChange = Object.values(fields).some((d) => d.kind !== 'unchanged');\n const hasCompanionChange = Object.values(companions).some((c) => (c.before ?? '') !== (c.after ?? ''));\n\n // Resolve image UUIDs that changed on either side to `/media/<uuid>.<ext>` URLs.\n const collectionDef = (config.collections as Record<string, { fields: Record<string, { format?: string }> }>)[\n collectionType\n ];\n const imageFieldNames = collectionDef\n ? Object.entries(collectionDef.fields)\n .filter(([, f]) => f.format === 'image')\n .map(([name]) => name)\n : [];\n\n const imageUuids = new Set<string>();\n for (const name of imageFieldNames) {\n const d = fields[name];\n if (!d) continue;\n if (d.kind === 'added' && typeof d.after === 'string') imageUuids.add(d.after);\n else if (d.kind === 'removed' && typeof d.before === 'string') imageUuids.add(d.before);\n else if (d.kind === 'changed') {\n if (typeof d.before === 'string') imageUuids.add(d.before);\n if (typeof d.after === 'string') imageUuids.add(d.after);\n }\n }\n\n const imageUrls: Record<string, string> = {};\n if (imageUuids.size > 0) {\n const mediaDir = mediaContentFolder();\n const resolvePairs = await Promise.all(\n Array.from(imageUuids).map(async (uuid) => {\n if (!uuid || uuid.startsWith('/')) return [uuid, uuid] as const;\n // Prefer the active-branch media entry; fall back to base branch.\n let raw =\n (await readFileAtRef(mediaEntryPath(uuid), activeBranch, isProd)) ??\n (await readFileAtRef(mediaEntryPath(uuid), baseBranch, isProd));\n if (!raw) {\n // Legacy path: {uuid}.json (pre-`media-` prefix)\n raw =\n (await readFileAtRef(`${mediaDir}/${uuid}.json`, activeBranch, isProd)) ??\n (await readFileAtRef(`${mediaDir}/${uuid}.json`, baseBranch, isProd));\n }\n const parsed = safeParseEntry(raw);\n const ext = parsed && typeof parsed.fields?.extension === 'string' ? (parsed.fields.extension as string) : '';\n return [uuid, ext ? `/media/${uuid}.${ext}` : ''] as const;\n }),\n );\n for (const [uuid, url] of resolvePairs) {\n if (url) imageUrls[uuid] = url;\n }\n }\n\n return {\n changed: hasFieldChange || hasCompanionChange,\n activeBranch,\n baseBranch,\n fields,\n companions,\n imageUrls,\n };\n } catch (e) {\n logCmsServerError({ operation: 'getEntryDiff', message: getErrorMessage(e) });\n return emptyDiff();\n }\n};\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"entries.d.ts","sourceRoot":"","sources":["../../../admin/actions/entries.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,aAAa,CAAC;AAO9D,eAAO,MAAM,YAAY,GAAU,aAAY,MAAa,KAAG,OAAO,CAAC,aAAa,EAAE,CAsFrF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAU,oBAAoB,MAAM,KAAG,OAAO,CAAC,aAAa,EAAE,CAgE3F,CAAC"}
1
+ {"version":3,"file":"entries.d.ts","sourceRoot":"","sources":["../../../admin/actions/entries.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,aAAa,CAAC;AAO9D,eAAO,MAAM,YAAY,GAAU,aAAY,MAAa,KAAG,OAAO,CAAC,aAAa,EAAE,CAyErF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAU,oBAAoB,MAAM,KAAG,OAAO,CAAC,aAAa,EAAE,CA6D3F,CAAC"}
@@ -8,7 +8,7 @@ import { isProductionMode } from "../github";
8
8
  import { getMediaEntries } from "./media";
9
9
  import { getEntryTitleField } from "./utils";
10
10
  const getEntryList = async (collection = "**") => {
11
- var _a, _b, _c, _d, _e;
11
+ var _a, _b, _c;
12
12
  const config = getConfig();
13
13
  const files = await getContentFiles(collection);
14
14
  const entries = [];
@@ -34,7 +34,7 @@ const getEntryList = async (collection = "**") => {
34
34
  const nameWithoutFolder = file.replace(`${config.contentFolder}/`, "").replace(".json", "");
35
35
  const parts = nameWithoutFolder.split("/");
36
36
  const type = parts[0];
37
- let id = parts[parts.length - 1];
37
+ const id = parts[parts.length - 1];
38
38
  const titleField = getEntryTitleField(type);
39
39
  let title = id;
40
40
  let status = "merged";
@@ -42,38 +42,29 @@ const getEntryList = async (collection = "**") => {
42
42
  let thumbnailUrl;
43
43
  try {
44
44
  const content = await getFile(file);
45
- if (type === "media") {
46
- const sysId = (content == null ? void 0 : content.sys) && typeof content.sys === "object" && "id" in content.sys ? content.sys.id : null;
47
- if (typeof sysId === "string" && sysId !== "") {
48
- id = sysId;
49
- }
50
- const mediaTitle = (_a = content == null ? void 0 : content.fields) == null ? void 0 : _a.title;
51
- if (typeof mediaTitle === "string" && mediaTitle.trim() !== "") {
52
- title = mediaTitle.trim();
53
- }
54
- const ext = typeof ((_b = content == null ? void 0 : content.fields) == null ? void 0 : _b.extension) === "string" ? content.fields.extension : "";
55
- if (ext) thumbnailUrl = `/media/${id}.${ext}`;
56
- } else {
57
- if (titleField && ((_c = content == null ? void 0 : content.fields) == null ? void 0 : _c[titleField])) {
58
- title = content.fields[titleField];
59
- }
60
- const imgKey = firstImageFieldKey(type);
61
- if (imgKey) {
62
- const value = (_d = content == null ? void 0 : content.fields) == null ? void 0 : _d[imgKey];
63
- if (typeof value === "string" && value.trim()) {
64
- const hit = mediaById.get(value.trim());
65
- if (hit) thumbnailUrl = hit.publicUrl;
66
- }
45
+ if (titleField && ((_a = content == null ? void 0 : content.fields) == null ? void 0 : _a[titleField])) {
46
+ title = content.fields[titleField];
47
+ }
48
+ const imgKey = firstImageFieldKey(type);
49
+ if (imgKey) {
50
+ const value = (_b = content == null ? void 0 : content.fields) == null ? void 0 : _b[imgKey];
51
+ if (typeof value === "string" && value.trim()) {
52
+ const hit = mediaById.get(value.trim());
53
+ if (hit) thumbnailUrl = hit.publicUrl;
67
54
  }
68
55
  }
69
- if ((_e = content == null ? void 0 : content.sys) == null ? void 0 : _e.status) {
56
+ if ((_c = content == null ? void 0 : content.sys) == null ? void 0 : _c.status) {
70
57
  status = content.sys.status;
71
58
  }
72
- } catch (_e2) {
59
+ } catch (_e) {
73
60
  }
74
61
  if (!isProductionMode()) {
75
62
  try {
76
- const stat = await fsPromises.stat(path.join(process.cwd(), file));
63
+ const stat = await fsPromises.stat(path.join(
64
+ /*turbopackIgnore: true*/
65
+ process.cwd(),
66
+ file
67
+ ));
77
68
  updatedAt = stat.mtime.toISOString();
78
69
  } catch (e) {
79
70
  }
@@ -89,7 +80,6 @@ const getEntryBacklinks = async (targetReferenceKey) => {
89
80
  const allFiles = await getContentFiles("**");
90
81
  const backlinks = [];
91
82
  for (const file of allFiles) {
92
- if (file.includes("/media/")) continue;
93
83
  try {
94
84
  const content = await getFile(file);
95
85
  const type = (_a = content == null ? void 0 : content.sys) == null ? void 0 : _a.type;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../admin/actions/entries.ts"],"sourcesContent":["'use server';\n\nimport fsPromises from 'fs/promises';\nimport path from 'path';\n\nimport { getConfig } from '../../lib/configStore';\nimport type { Config } from '../types';\nimport type { EntryListItem, EntryStatus } from '../../types';\n\nimport { getContentFiles, getFile } from './files';\nimport { isProductionMode } from '../github';\nimport { getMediaEntries } from './media';\nimport { getEntryTitleField } from './utils';\n\nexport const getEntryList = async (collection: string = '**'): Promise<EntryListItem[]> => {\n const config = getConfig();\n const files = await getContentFiles(collection);\n const entries: EntryListItem[] = [];\n\n // Build a media lookup so we can resolve thumbnail URLs for any entry that\n // has an `image` field. One batched call regardless of entry count.\n const mediaList = await getMediaEntries().catch(() => []);\n const mediaById = new Map<string, { ext: string; publicUrl: string }>();\n for (const m of mediaList) {\n mediaById.set(m.id, { ext: m.extension, publicUrl: m.publicUrl });\n }\n\n const imageFieldKeyByType = new Map<string, string | null>();\n function firstImageFieldKey(type: string): string | null {\n if (imageFieldKeyByType.has(type)) return imageFieldKeyByType.get(type) ?? null;\n const collection = (config as Config).collections[type as keyof Config['collections']];\n if (!collection) {\n imageFieldKeyByType.set(type, null);\n return null;\n }\n const key = Object.keys(collection.fields).find((k) => collection.fields[k].format === 'image') ?? null;\n imageFieldKeyByType.set(type, key);\n return key;\n }\n\n for (const file of files) {\n const nameWithoutFolder = file.replace(`${config.contentFolder}/`, '').replace('.json', '');\n const parts = nameWithoutFolder.split('/');\n const type = parts[0];\n let id = parts[parts.length - 1];\n const titleField = getEntryTitleField(type);\n\n let title = id;\n let status: EntryStatus = 'merged';\n let updatedAt: string | undefined;\n let thumbnailUrl: string | undefined;\n\n try {\n const content = await getFile(file);\n\n if (type === 'media') {\n const sysId = content?.sys && typeof content.sys === 'object' && 'id' in content.sys ? content.sys.id : null;\n if (typeof sysId === 'string' && sysId !== '') {\n id = sysId;\n }\n const mediaTitle = content?.fields?.title;\n if (typeof mediaTitle === 'string' && mediaTitle.trim() !== '') {\n title = mediaTitle.trim();\n }\n const ext = typeof content?.fields?.extension === 'string' ? content.fields.extension : '';\n if (ext) thumbnailUrl = `/media/${id}.${ext}`;\n } else {\n if (titleField && content?.fields?.[titleField]) {\n title = content.fields[titleField];\n }\n const imgKey = firstImageFieldKey(type);\n if (imgKey) {\n const value = content?.fields?.[imgKey];\n if (typeof value === 'string' && value.trim()) {\n const hit = mediaById.get(value.trim());\n if (hit) thumbnailUrl = hit.publicUrl;\n }\n }\n }\n if (content?.sys?.status) {\n status = content.sys.status;\n }\n } catch (_e) {\n // Fall back to id as title\n }\n\n if (!isProductionMode()) {\n try {\n const stat = await fsPromises.stat(path.join(process.cwd(), file));\n updatedAt = stat.mtime.toISOString();\n } catch {\n // ignore\n }\n }\n\n entries.push({ type, id, path: file, title, status, updatedAt, thumbnailUrl });\n }\n\n entries.sort((a, b) => a.title.localeCompare(b.title));\n return entries;\n};\n\n/**\n * Find all content entries that reference the given entry via reference fields.\n * Returns entries that contain `targetReferenceKey` in any reference field value.\n */\nexport const getEntryBacklinks = async (targetReferenceKey: string): Promise<EntryListItem[]> => {\n const config = getConfig();\n const allFiles = await getContentFiles('**');\n const backlinks: EntryListItem[] = [];\n\n for (const file of allFiles) {\n // Skip media entries\n if (file.includes('/media/')) continue;\n\n try {\n const content = await getFile(file);\n const type = content?.sys?.type;\n if (!type) continue;\n\n const collection = config.collections[type as keyof Config['collections']];\n if (!collection) continue;\n\n const referenceFieldKeys = Object.keys(collection.fields).filter(\n (k) => collection.fields[k].format === 'reference',\n );\n if (referenceFieldKeys.length === 0) continue;\n\n let found = false;\n for (const fieldKey of referenceFieldKeys) {\n const fieldValue = content?.fields?.[fieldKey];\n if (!fieldValue) continue;\n\n // Reference values can be a single string (cardinality 'one') or a JSON array string (cardinality 'many')\n let keys: string[] = [];\n if (typeof fieldValue === 'string') {\n try {\n const parsed = JSON.parse(fieldValue);\n keys = Array.isArray(parsed) ? parsed : [fieldValue];\n } catch {\n keys = [fieldValue];\n }\n } else if (Array.isArray(fieldValue)) {\n keys = fieldValue;\n }\n\n if (keys.includes(targetReferenceKey)) {\n found = true;\n break;\n }\n }\n\n if (found) {\n const nameWithoutFolder = file.replace(`${config.contentFolder}/`, '').replace('.json', '');\n const parts = nameWithoutFolder.split('/');\n const id = parts[parts.length - 1];\n const titleField = getEntryTitleField(type);\n let title = id;\n if (titleField && content?.fields?.[titleField]) {\n title = content.fields[titleField];\n }\n const status: EntryStatus = content?.sys?.status || 'merged';\n backlinks.push({ type, id, path: file, title, status });\n }\n } catch (_e) {\n // Skip files that can't be read\n }\n }\n\n return backlinks;\n};\n"],"mappings":"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","names":["_a","_b","collection","_e"]}
1
+ {"version":3,"sources":["../../../admin/actions/entries.ts"],"sourcesContent":["'use server';\n\nimport fsPromises from 'fs/promises';\nimport path from 'path';\n\nimport { getConfig } from '../../lib/configStore';\nimport type { Config } from '../types';\nimport type { EntryListItem, EntryStatus } from '../../types';\n\nimport { getContentFiles, getFile } from './files';\nimport { isProductionMode } from '../github';\nimport { getMediaEntries } from './media';\nimport { getEntryTitleField } from './utils';\n\nexport const getEntryList = async (collection: string = '**'): Promise<EntryListItem[]> => {\n const config = getConfig();\n const files = await getContentFiles(collection);\n const entries: EntryListItem[] = [];\n\n // Build a media lookup so we can resolve thumbnail URLs for any entry that\n // has an `image` field. One batched call regardless of entry count.\n const mediaList = await getMediaEntries().catch(() => []);\n const mediaById = new Map<string, { ext: string; publicUrl: string }>();\n for (const m of mediaList) {\n mediaById.set(m.id, { ext: m.extension, publicUrl: m.publicUrl });\n }\n\n const imageFieldKeyByType = new Map<string, string | null>();\n function firstImageFieldKey(type: string): string | null {\n if (imageFieldKeyByType.has(type)) return imageFieldKeyByType.get(type) ?? null;\n const collection = (config as Config).collections[type as keyof Config['collections']];\n if (!collection) {\n imageFieldKeyByType.set(type, null);\n return null;\n }\n const key = Object.keys(collection.fields).find((k) => collection.fields[k].format === 'image') ?? null;\n imageFieldKeyByType.set(type, key);\n return key;\n }\n\n for (const file of files) {\n const nameWithoutFolder = file.replace(`${config.contentFolder}/`, '').replace('.json', '');\n const parts = nameWithoutFolder.split('/');\n const type = parts[0];\n const id = parts[parts.length - 1];\n const titleField = getEntryTitleField(type);\n\n let title = id;\n let status: EntryStatus = 'merged';\n let updatedAt: string | undefined;\n let thumbnailUrl: string | undefined;\n\n try {\n const content = await getFile(file);\n\n if (titleField && content?.fields?.[titleField]) {\n title = content.fields[titleField];\n }\n const imgKey = firstImageFieldKey(type);\n if (imgKey) {\n const value = content?.fields?.[imgKey];\n if (typeof value === 'string' && value.trim()) {\n const hit = mediaById.get(value.trim());\n if (hit) thumbnailUrl = hit.publicUrl;\n }\n }\n if (content?.sys?.status) {\n status = content.sys.status;\n }\n } catch (_e) {\n // Fall back to id as title\n }\n\n if (!isProductionMode()) {\n try {\n const stat = await fsPromises.stat(path.join(/*turbopackIgnore: true*/ process.cwd(), file));\n updatedAt = stat.mtime.toISOString();\n } catch {\n // ignore\n }\n }\n\n entries.push({ type, id, path: file, title, status, updatedAt, thumbnailUrl });\n }\n\n entries.sort((a, b) => a.title.localeCompare(b.title));\n return entries;\n};\n\n/**\n * Find all content entries that reference the given entry via reference fields.\n * Returns entries that contain `targetReferenceKey` in any reference field value.\n */\nexport const getEntryBacklinks = async (targetReferenceKey: string): Promise<EntryListItem[]> => {\n const config = getConfig();\n const allFiles = await getContentFiles('**');\n const backlinks: EntryListItem[] = [];\n\n for (const file of allFiles) {\n try {\n const content = await getFile(file);\n const type = content?.sys?.type;\n if (!type) continue;\n\n const collection = config.collections[type as keyof Config['collections']];\n if (!collection) continue;\n\n const referenceFieldKeys = Object.keys(collection.fields).filter(\n (k) => collection.fields[k].format === 'reference',\n );\n if (referenceFieldKeys.length === 0) continue;\n\n let found = false;\n for (const fieldKey of referenceFieldKeys) {\n const fieldValue = content?.fields?.[fieldKey];\n if (!fieldValue) continue;\n\n // Reference values can be a single string (cardinality 'one') or a JSON array string (cardinality 'many')\n let keys: string[] = [];\n if (typeof fieldValue === 'string') {\n try {\n const parsed = JSON.parse(fieldValue);\n keys = Array.isArray(parsed) ? parsed : [fieldValue];\n } catch {\n keys = [fieldValue];\n }\n } else if (Array.isArray(fieldValue)) {\n keys = fieldValue;\n }\n\n if (keys.includes(targetReferenceKey)) {\n found = true;\n break;\n }\n }\n\n if (found) {\n const nameWithoutFolder = file.replace(`${config.contentFolder}/`, '').replace('.json', '');\n const parts = nameWithoutFolder.split('/');\n const id = parts[parts.length - 1];\n const titleField = getEntryTitleField(type);\n let title = id;\n if (titleField && content?.fields?.[titleField]) {\n title = content.fields[titleField];\n }\n const status: EntryStatus = content?.sys?.status || 'merged';\n backlinks.push({ type, id, path: file, title, status });\n }\n } catch (_e) {\n // Skip files that can't be read\n }\n }\n\n return backlinks;\n};\n"],"mappings":"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","names":["_a","_b","collection"]}
@@ -6,6 +6,14 @@ export type { SaveFileResult } from './utils';
6
6
  export declare const assertFeatureBranchForWritesIfRequired: () => Promise<void>;
7
7
  export declare const waitForPublicReadConsistency: (fileName: string, expectedContent: string, readRef?: string) => Promise<void>;
8
8
  export declare const getContentFiles: (collection?: string) => Promise<string[]>;
9
+ /**
10
+ * List media-entry JSON files (e.g. `cms/media/media-<uuid>.json`).
11
+ *
12
+ * Distinct from `getContentFiles`, which lists editorial content under
13
+ * `config.contentFolder`, and from `getMediaFiles`, which lists physical image
14
+ * binaries under `config.mediaFolder`. This is the JSON-entry layer.
15
+ */
16
+ export declare const getMediaContentFiles: () => Promise<string[]>;
9
17
  export declare const getMediaFiles: (folder?: string) => Promise<string[]>;
10
18
  export declare const getFile: (fileName: string) => Promise<any>;
11
19
  export declare const saveFile: (formData: any, fileName: string, options?: {
@@ -1 +1 @@
1
- {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../../admin/actions/files.ts"],"names":[],"mappings":"AA+BA,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,cAAc,EACpB,MAAM,SAAS,CAAC;AAEjB,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AA6L9C;;GAEG;AACH,eAAO,MAAM,sCAAsC,QAAa,OAAO,CAAC,IAAI,CAQ3E,CAAC;AAEF,eAAO,MAAM,4BAA4B,GAAU,UAAU,MAAM,EAAE,iBAAiB,MAAM,EAAE,UAAU,MAAM,kBAyB7G,CAAC;AAEF,eAAO,MAAM,eAAe,GAAU,aAAY,MAAa,sBA8B9D,CAAC;AAEF,eAAO,MAAM,aAAa,GAAU,SAAQ,MAAa,sBAqBxD,CAAC;AAEF,eAAO,MAAM,OAAO,GAAU,UAAU,MAAM,iBAgE7C,CAAC;AAqBF,eAAO,MAAM,QAAQ,GACnB,UAAU,GAAG,EACb,UAAU,MAAM,EAChB,UAAU;IAAE,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAAE,KAC3C,OAAO,CAAC,cAAc,CA4JxB,CAAC;AAEF,eAAO,MAAM,OAAO,GAAU,MAAM,MAAM,KAAG,OAAO,CAAC,aAAa,CAmDjE,CAAC;AAEF,eAAO,MAAM,UAAU,GAAU,UAAU,MAAM,KAAG,OAAO,CAAC,YAAY,CAgEvE,CAAC"}
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../../admin/actions/files.ts"],"names":[],"mappings":"AAgCA,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,cAAc,EACpB,MAAM,SAAS,CAAC;AAEjB,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AA6L9C;;GAEG;AACH,eAAO,MAAM,sCAAsC,QAAa,OAAO,CAAC,IAAI,CAQ3E,CAAC;AAEF,eAAO,MAAM,4BAA4B,GAAU,UAAU,MAAM,EAAE,iBAAiB,MAAM,EAAE,UAAU,MAAM,kBAyB7G,CAAC;AAEF,eAAO,MAAM,eAAe,GAAU,aAAY,MAAa,sBA8B9D,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,QAAa,OAAO,CAAC,MAAM,EAAE,CAkB7D,CAAC;AAEF,eAAO,MAAM,aAAa,GAAU,SAAQ,MAAa,sBAqBxD,CAAC;AAEF,eAAO,MAAM,OAAO,GAAU,UAAU,MAAM,iBAgE7C,CAAC;AAuBF,eAAO,MAAM,QAAQ,GACnB,UAAU,GAAG,EACb,UAAU,MAAM,EAChB,UAAU;IAAE,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAAE,KAC3C,OAAO,CAAC,cAAc,CA4JxB,CAAC;AAEF,eAAO,MAAM,OAAO,GAAU,MAAM,MAAM,KAAG,OAAO,CAAC,aAAa,CAmDjE,CAAC;AAEF,eAAO,MAAM,UAAU,GAAU,UAAU,MAAM,KAAG,OAAO,CAAC,YAAY,CAgEvE,CAAC"}
@@ -27,6 +27,7 @@ import {
27
27
  saveGitHubFile
28
28
  } from "../github";
29
29
  import { applyMutation, getStoredContentFiles, getStoredFile, getStoredFileSha } from "../store/contentStore";
30
+ import { mediaContentFolder, mediaEntryPath } from "../../lib/mediaPath";
30
31
  import { buildJsons } from "./build";
31
32
  import {
32
33
  actionErr,
@@ -67,7 +68,11 @@ async function persistBranchHistoryEntryIfNeeded(activeBranch, entryPath) {
67
68
  return;
68
69
  }
69
70
  try {
70
- const abs = path.join(process.cwd(), BRANCH_HISTORY_FILE_PATH);
71
+ const abs = path.join(
72
+ /*turbopackIgnore: true*/
73
+ process.cwd(),
74
+ BRANCH_HISTORY_FILE_PATH
75
+ );
71
76
  let raw = "";
72
77
  try {
73
78
  raw = await fsPromises.readFile(abs, { encoding: "utf8" });
@@ -155,7 +160,7 @@ async function assertImageFieldsReferenceMediaWithTitle(entryType, strFields) {
155
160
  if (!MEDIA_UUID_RE.test(raw)) {
156
161
  continue;
157
162
  }
158
- const mediaPath = `${config.contentFolder}/media/media-${raw}.json`;
163
+ const mediaPath = mediaEntryPath(raw);
159
164
  let media;
160
165
  try {
161
166
  media = await getFile(mediaPath);
@@ -232,6 +237,23 @@ const getContentFiles = async (collection = "**") => {
232
237
  return [];
233
238
  }
234
239
  };
240
+ const getMediaContentFiles = async () => {
241
+ var _a;
242
+ const folder = mediaContentFolder();
243
+ try {
244
+ if (isProductionMode()) {
245
+ const activeBranch = (_a = (await cookies()).get(CMS_ACTIVE_BRANCH_COOKIE)) == null ? void 0 : _a.value;
246
+ try {
247
+ return await listGitHubFiles(folder, ".json", activeBranch);
248
+ } catch (_e) {
249
+ }
250
+ }
251
+ const files = await glob(`${folder}/*.json`);
252
+ return files || [];
253
+ } catch (_e) {
254
+ return [];
255
+ }
256
+ };
235
257
  const getMediaFiles = async (folder = "**") => {
236
258
  var _a;
237
259
  const config = getConfig();
@@ -282,7 +304,11 @@ const getFile = async (fileName) => {
282
304
  }
283
305
  }
284
306
  if (!entry) {
285
- const filePath = path.join(process.cwd(), fileName);
307
+ const filePath = path.join(
308
+ /*turbopackIgnore: true*/
309
+ process.cwd(),
310
+ fileName
311
+ );
286
312
  const data = await fsPromises.readFile(filePath, { encoding: "utf8" });
287
313
  entry = JSON.parse(data);
288
314
  }
@@ -317,7 +343,13 @@ async function readCompanionMarkdownContent(filePath) {
317
343
  }
318
344
  }
319
345
  try {
320
- return await fsPromises.readFile(path.join(process.cwd(), filePath), { encoding: "utf8" });
346
+ return await fsPromises.readFile(path.join(
347
+ /*turbopackIgnore: true*/
348
+ process.cwd(),
349
+ filePath
350
+ ), {
351
+ encoding: "utf8"
352
+ });
321
353
  } catch (e) {
322
354
  return "";
323
355
  }
@@ -435,17 +467,29 @@ const saveFile = async (formData, fileName, options) => {
435
467
  }
436
468
  const cookieStore = await cookies();
437
469
  const activeBranchDev = (_k = cookieStore.get(CMS_ACTIVE_BRANCH_COOKIE)) == null ? void 0 : _k.value;
438
- const filePath = path.join(process.cwd(), fileName);
470
+ const filePath = path.join(
471
+ /*turbopackIgnore: true*/
472
+ process.cwd(),
473
+ fileName
474
+ );
439
475
  await fsPromises.writeFile(filePath, normalizedData, "utf8");
440
476
  const mdPaths = typeof entryType === "string" ? companionMarkdownPathsForEntry(fileName, entryType, config.collections) : {};
441
477
  for (const [fieldName, mdPath] of Object.entries(mdPaths)) {
442
478
  const mdContent = (_l = markdownContents[fieldName]) != null ? _l : "";
443
- await fsPromises.writeFile(path.join(process.cwd(), mdPath), mdContent, "utf8");
479
+ await fsPromises.writeFile(path.join(
480
+ /*turbopackIgnore: true*/
481
+ process.cwd(),
482
+ mdPath
483
+ ), mdContent, "utf8");
444
484
  }
445
485
  const rtPathsDev = typeof entryType === "string" ? companionRichTextPathsForEntry(fileName, entryType, config.collections) : {};
446
486
  for (const [fieldName, rtPath] of Object.entries(rtPathsDev)) {
447
487
  const rtContent = (_m = markdownContents[fieldName]) != null ? _m : "";
448
- await fsPromises.writeFile(path.join(process.cwd(), rtPath), rtContent, "utf8");
488
+ await fsPromises.writeFile(path.join(
489
+ /*turbopackIgnore: true*/
490
+ process.cwd(),
491
+ rtPath
492
+ ), rtContent, "utf8");
449
493
  }
450
494
  await persistBranchHistoryEntryIfNeeded(activeBranchDev, fileName);
451
495
  await syncEmbeddingsForUpsertIfEnabled(fileName, payload, markdownContents, activeBranchDev, false);
@@ -492,7 +536,11 @@ const newFile = async (type) => {
492
536
  }
493
537
  const cookieStore = await cookies();
494
538
  const activeBranchDev = (_b = cookieStore.get(CMS_ACTIVE_BRANCH_COOKIE)) == null ? void 0 : _b.value;
495
- const filePath = path.join(process.cwd(), file);
539
+ const filePath = path.join(
540
+ /*turbopackIgnore: true*/
541
+ process.cwd(),
542
+ file
543
+ );
496
544
  await fsPromises.writeFile(filePath, normalizedData, "utf8");
497
545
  await persistBranchHistoryEntryIfNeeded(activeBranchDev, file);
498
546
  await syncEmbeddingsForUpsertIfEnabled(file, values, {}, activeBranchDev, false);
@@ -538,11 +586,19 @@ const removeFile = async (fileName) => {
538
586
  const built2 = await buildJsons(fileName, { blogPaths });
539
587
  return built2.success ? actionOk() : built2;
540
588
  }
541
- const filePath = path.join(process.cwd(), fileName);
589
+ const filePath = path.join(
590
+ /*turbopackIgnore: true*/
591
+ process.cwd(),
592
+ fileName
593
+ );
542
594
  await fsPromises.unlink(filePath);
543
595
  for (const mdPath of companionPaths) {
544
596
  try {
545
- await fsPromises.unlink(path.join(process.cwd(), mdPath));
597
+ await fsPromises.unlink(path.join(
598
+ /*turbopackIgnore: true*/
599
+ process.cwd(),
600
+ mdPath
601
+ ));
546
602
  } catch (e) {
547
603
  }
548
604
  }
@@ -557,6 +613,7 @@ export {
557
613
  assertFeatureBranchForWritesIfRequired,
558
614
  getContentFiles,
559
615
  getFile,
616
+ getMediaContentFiles,
560
617
  getMediaFiles,
561
618
  newFile,
562
619
  removeFile,