@xleddyl/nuxt-cms 0.9.4 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (431) hide show
  1. package/README.md +1 -1
  2. package/dist/module.d.mts +20 -1
  3. package/dist/module.json +1 -1
  4. package/dist/module.mjs +1037 -148
  5. package/dist/runtime/app/blocks/CmsBlocks.d.vue.ts +1 -1
  6. package/dist/runtime/app/blocks/CmsBlocks.vue +57 -9
  7. package/dist/runtime/app/blocks/CmsBlocks.vue.d.ts +1 -1
  8. package/dist/runtime/app/blocks/CmsField.d.ts +24 -0
  9. package/dist/runtime/app/blocks/CmsField.js +16 -0
  10. package/dist/runtime/app/blocks/node.d.ts +37 -0
  11. package/dist/runtime/app/blocks/node.js +17 -0
  12. package/dist/runtime/app/blocks/resolve.d.ts +18 -0
  13. package/dist/runtime/app/blocks/resolve.js +34 -0
  14. package/dist/runtime/app/components/cms/BlockPicker.d.vue.ts +22 -0
  15. package/dist/runtime/app/components/cms/BlockPicker.vue +87 -0
  16. package/dist/runtime/app/components/cms/BlockPicker.vue.d.ts +22 -0
  17. package/dist/runtime/app/components/cms/BlockPickerPopover.d.vue.ts +38 -0
  18. package/dist/runtime/app/components/cms/BlockPickerPopover.vue +44 -0
  19. package/dist/runtime/app/components/cms/BlockPickerPopover.vue.d.ts +38 -0
  20. package/dist/runtime/app/components/cms/BlockTree.d.vue.ts +29 -0
  21. package/dist/runtime/app/components/cms/BlockTree.vue +322 -0
  22. package/dist/runtime/app/components/cms/BlockTree.vue.d.ts +29 -0
  23. package/dist/runtime/app/components/cms/BlocksField.vue +569 -218
  24. package/dist/runtime/app/components/cms/BrandMark.vue +7 -13
  25. package/dist/runtime/app/components/cms/ConfirmGroups.vue +15 -13
  26. package/dist/runtime/app/components/cms/{BlockPalette.vue.d.ts → EditorHistory.d.vue.ts} +6 -5
  27. package/dist/runtime/app/components/cms/EditorHistory.vue +34 -0
  28. package/dist/runtime/app/components/cms/{BlockPalette.d.vue.ts → EditorHistory.vue.d.ts} +6 -5
  29. package/dist/runtime/app/components/cms/EntryDrawer.d.vue.ts +11 -5
  30. package/dist/runtime/app/components/cms/EntryDrawer.vue +183 -152
  31. package/dist/runtime/app/components/cms/EntryDrawer.vue.d.ts +11 -5
  32. package/dist/runtime/app/components/cms/EntryForm.d.vue.ts +16 -4
  33. package/dist/runtime/app/components/cms/EntryForm.vue +106 -146
  34. package/dist/runtime/app/components/cms/EntryForm.vue.d.ts +16 -4
  35. package/dist/runtime/app/components/cms/FieldInput.vue +10 -2
  36. package/dist/runtime/app/components/cms/FormSections.d.vue.ts +22 -0
  37. package/dist/runtime/app/components/cms/FormSections.vue +71 -0
  38. package/dist/runtime/app/components/cms/FormSections.vue.d.ts +22 -0
  39. package/dist/runtime/app/components/cms/ImportModal.vue +46 -58
  40. package/dist/runtime/app/components/cms/LinkField.d.vue.ts +16 -0
  41. package/dist/runtime/app/components/cms/LinkField.vue +250 -0
  42. package/dist/runtime/app/components/cms/LinkField.vue.d.ts +16 -0
  43. package/dist/runtime/app/components/cms/ListFilters.vue +10 -12
  44. package/dist/runtime/app/components/cms/LocaleSwitch.d.vue.ts +2 -1
  45. package/dist/runtime/app/components/cms/LocaleSwitch.vue +29 -5
  46. package/dist/runtime/app/components/cms/LocaleSwitch.vue.d.ts +2 -1
  47. package/dist/runtime/app/components/cms/MediaDetail.d.vue.ts +2 -0
  48. package/dist/runtime/app/components/cms/MediaDetail.vue +112 -83
  49. package/dist/runtime/app/components/cms/MediaDetail.vue.d.ts +2 -0
  50. package/dist/runtime/app/components/cms/MediaField.vue +35 -25
  51. package/dist/runtime/app/components/cms/MediaFolderPicker.vue +26 -71
  52. package/dist/runtime/app/components/cms/MediaGallery.d.vue.ts +1 -0
  53. package/dist/runtime/app/components/cms/MediaGallery.vue +442 -419
  54. package/dist/runtime/app/components/cms/MediaGallery.vue.d.ts +1 -0
  55. package/dist/runtime/app/components/cms/MediaThumb.vue +9 -25
  56. package/dist/runtime/app/components/cms/MediaUpload.vue +1 -1
  57. package/dist/runtime/app/components/cms/{BlockOutline.d.vue.ts → NestedBlockList.d.vue.ts} +5 -5
  58. package/dist/runtime/app/components/cms/NestedBlockList.vue +87 -0
  59. package/dist/runtime/app/components/cms/{BlockOutline.vue.d.ts → NestedBlockList.vue.d.ts} +5 -5
  60. package/dist/runtime/app/components/cms/PoweredBy.vue +12 -5
  61. package/dist/runtime/app/components/cms/PresetModal.d.vue.ts +18 -0
  62. package/dist/runtime/app/components/cms/PresetModal.vue +70 -0
  63. package/dist/runtime/app/components/cms/PresetModal.vue.d.ts +18 -0
  64. package/dist/runtime/app/components/cms/RelationField.vue +2 -8
  65. package/dist/runtime/app/components/cms/SettingsAccount.vue +60 -71
  66. package/dist/runtime/app/components/cms/SettingsColumns.vue +47 -69
  67. package/dist/runtime/app/components/cms/SettingsEmptyAdd.d.vue.ts +13 -0
  68. package/dist/runtime/app/components/cms/SettingsEmptyAdd.vue +21 -0
  69. package/dist/runtime/app/components/cms/SettingsEmptyAdd.vue.d.ts +13 -0
  70. package/dist/runtime/app/components/cms/SettingsEntries.d.vue.ts +13 -0
  71. package/dist/runtime/app/components/cms/SettingsEntries.vue +50 -0
  72. package/dist/runtime/app/components/cms/SettingsEntries.vue.d.ts +13 -0
  73. package/dist/runtime/app/components/cms/SettingsEntry.d.vue.ts +1 -10
  74. package/dist/runtime/app/components/cms/SettingsEntry.vue +11 -95
  75. package/dist/runtime/app/components/cms/SettingsEntry.vue.d.ts +1 -10
  76. package/dist/runtime/app/components/cms/SettingsEntryActions.d.vue.ts +7 -0
  77. package/dist/runtime/app/components/cms/SettingsEntryActions.vue +42 -0
  78. package/dist/runtime/app/components/cms/SettingsEntryActions.vue.d.ts +7 -0
  79. package/dist/runtime/app/components/cms/SettingsEntryTabs.d.vue.ts +7 -0
  80. package/dist/runtime/app/components/cms/SettingsEntryTabs.vue +21 -0
  81. package/dist/runtime/app/components/cms/SettingsEntryTabs.vue.d.ts +7 -0
  82. package/dist/runtime/app/components/cms/SettingsFormAction.d.vue.ts +3 -0
  83. package/dist/runtime/app/components/cms/SettingsFormAction.vue +17 -0
  84. package/dist/runtime/app/components/cms/SettingsFormAction.vue.d.ts +3 -0
  85. package/dist/runtime/app/components/cms/SettingsLayout.vue +18 -14
  86. package/dist/runtime/app/components/cms/SettingsPresetForm.d.vue.ts +11 -0
  87. package/dist/runtime/app/components/cms/SettingsPresetForm.vue +60 -0
  88. package/dist/runtime/app/components/cms/SettingsPresetForm.vue.d.ts +11 -0
  89. package/dist/runtime/app/components/cms/SettingsPresets.d.vue.ts +13 -0
  90. package/dist/runtime/app/components/cms/SettingsPresets.vue +65 -0
  91. package/dist/runtime/app/components/cms/SettingsPresets.vue.d.ts +13 -0
  92. package/dist/runtime/app/components/cms/SettingsRecordActions.d.vue.ts +32 -0
  93. package/dist/runtime/app/components/cms/SettingsRecordActions.vue +45 -0
  94. package/dist/runtime/app/components/cms/SettingsRecordActions.vue.d.ts +32 -0
  95. package/dist/runtime/app/components/cms/SettingsRedirectActions.d.vue.ts +3 -0
  96. package/dist/runtime/app/components/cms/SettingsRedirectActions.vue +59 -0
  97. package/dist/runtime/app/components/cms/SettingsRedirectActions.vue.d.ts +3 -0
  98. package/dist/runtime/app/components/cms/SettingsRedirectForm.d.vue.ts +11 -0
  99. package/dist/runtime/app/components/cms/SettingsRedirectForm.vue +77 -0
  100. package/dist/runtime/app/components/cms/SettingsRedirectForm.vue.d.ts +11 -0
  101. package/dist/runtime/app/components/cms/SettingsRedirects.d.vue.ts +13 -0
  102. package/dist/runtime/app/components/cms/SettingsRedirects.vue +117 -0
  103. package/dist/runtime/app/components/cms/SettingsRedirects.vue.d.ts +13 -0
  104. package/dist/runtime/app/components/cms/SettingsSecretCard.d.vue.ts +17 -0
  105. package/dist/runtime/app/components/cms/SettingsSecretCard.vue +43 -0
  106. package/dist/runtime/app/components/cms/SettingsSecretCard.vue.d.ts +17 -0
  107. package/dist/runtime/app/components/cms/SettingsSite.d.vue.ts +3 -0
  108. package/dist/runtime/app/components/cms/SettingsSite.vue +140 -0
  109. package/dist/runtime/app/components/cms/SettingsSite.vue.d.ts +3 -0
  110. package/dist/runtime/app/components/cms/SettingsUserCreate.d.vue.ts +8 -0
  111. package/dist/runtime/app/components/cms/SettingsUserCreate.vue +82 -0
  112. package/dist/runtime/app/components/cms/SettingsUserCreate.vue.d.ts +8 -0
  113. package/dist/runtime/app/components/cms/SettingsUserDetail.d.vue.ts +11 -0
  114. package/dist/runtime/app/components/cms/SettingsUserDetail.vue +179 -0
  115. package/dist/runtime/app/components/cms/SettingsUserDetail.vue.d.ts +11 -0
  116. package/dist/runtime/app/components/cms/SettingsUsers.d.vue.ts +9 -6
  117. package/dist/runtime/app/components/cms/SettingsUsers.vue +88 -234
  118. package/dist/runtime/app/components/cms/SettingsUsers.vue.d.ts +9 -6
  119. package/dist/runtime/app/components/cms/SharePreview.d.vue.ts +18 -0
  120. package/dist/runtime/app/components/cms/SharePreview.vue +219 -0
  121. package/dist/runtime/app/components/cms/SharePreview.vue.d.ts +18 -0
  122. package/dist/runtime/app/components/cms/SlugField.vue +5 -3
  123. package/dist/runtime/app/components/cms/StatusBadge.vue +9 -8
  124. package/dist/runtime/app/components/cms/TranslationBadges.d.vue.ts +7 -0
  125. package/dist/runtime/app/components/cms/TranslationBadges.vue +45 -0
  126. package/dist/runtime/app/components/cms/TranslationBadges.vue.d.ts +7 -0
  127. package/dist/runtime/app/components/cms/TranslationMenu.d.vue.ts +17 -0
  128. package/dist/runtime/app/components/cms/TranslationMenu.vue +28 -0
  129. package/dist/runtime/app/components/cms/TranslationMenu.vue.d.ts +17 -0
  130. package/dist/runtime/app/components/cms/VisualEditor.d.vue.ts +22 -4
  131. package/dist/runtime/app/components/cms/VisualEditor.vue +1152 -335
  132. package/dist/runtime/app/components/cms/VisualEditor.vue.d.ts +22 -4
  133. package/dist/runtime/app/components/cms/WelcomeModal.vue +32 -50
  134. package/dist/runtime/app/composables/cms-clipboard.d.ts +8 -0
  135. package/dist/runtime/app/composables/cms-clipboard.js +38 -0
  136. package/dist/runtime/app/composables/cms-confirm.d.ts +6 -8
  137. package/dist/runtime/app/composables/cms-confirm.js +5 -7
  138. package/dist/runtime/app/composables/cms-entry-disabled.d.ts +5 -1
  139. package/dist/runtime/app/composables/cms-entry-disabled.js +7 -0
  140. package/dist/runtime/app/composables/cms-entry-form.d.ts +15 -0
  141. package/dist/runtime/app/composables/cms-entry-form.js +40 -0
  142. package/dist/runtime/app/composables/cms-entry-settings.d.ts +30 -0
  143. package/dist/runtime/app/composables/cms-entry-settings.js +122 -0
  144. package/dist/runtime/app/composables/cms-entry.d.ts +5 -1
  145. package/dist/runtime/app/composables/cms-entry.js +36 -11
  146. package/dist/runtime/app/composables/cms-history.d.ts +10 -0
  147. package/dist/runtime/app/composables/cms-history.js +24 -0
  148. package/dist/runtime/app/composables/cms-link-targets.d.ts +10 -0
  149. package/dist/runtime/app/composables/cms-link-targets.js +40 -0
  150. package/dist/runtime/app/composables/cms-link-usage.d.ts +1 -0
  151. package/dist/runtime/app/composables/cms-link-usage.js +45 -0
  152. package/dist/runtime/app/composables/cms-media-library.d.ts +19 -9
  153. package/dist/runtime/app/composables/cms-media-library.js +31 -13
  154. package/dist/runtime/app/composables/cms-media-uploader.js +6 -20
  155. package/dist/runtime/app/composables/cms-permissions.d.ts +18 -0
  156. package/dist/runtime/app/composables/cms-permissions.js +54 -0
  157. package/dist/runtime/app/composables/cms-presets.d.ts +11 -0
  158. package/dist/runtime/app/composables/cms-presets.js +40 -0
  159. package/dist/runtime/app/composables/cms-preview-mode.d.ts +4 -0
  160. package/dist/runtime/app/composables/cms-preview-mode.js +8 -0
  161. package/dist/runtime/app/composables/cms-query.d.ts +3 -0
  162. package/dist/runtime/app/composables/cms-query.js +45 -20
  163. package/dist/runtime/app/composables/cms-record-list.d.ts +31 -0
  164. package/dist/runtime/app/composables/cms-record-list.js +75 -0
  165. package/dist/runtime/app/composables/cms-route.d.ts +6 -0
  166. package/dist/runtime/app/composables/cms-route.js +36 -0
  167. package/dist/runtime/app/composables/cms-runtime.d.ts +1 -0
  168. package/dist/runtime/app/composables/cms-save-handoff.d.ts +4 -0
  169. package/dist/runtime/app/composables/cms-save-handoff.js +19 -0
  170. package/dist/runtime/app/composables/cms-seo.d.ts +12 -0
  171. package/dist/runtime/app/composables/cms-seo.js +69 -0
  172. package/dist/runtime/app/composables/cms-settings-form.d.ts +13 -0
  173. package/dist/runtime/app/composables/cms-settings-form.js +29 -0
  174. package/dist/runtime/app/composables/cms-settings-sections.d.ts +26 -0
  175. package/dist/runtime/app/composables/cms-settings-sections.js +181 -0
  176. package/dist/runtime/app/composables/cms-settings-stores.d.ts +52 -0
  177. package/dist/runtime/app/composables/cms-settings-stores.js +156 -0
  178. package/dist/runtime/app/composables/cms-settings.d.ts +3 -3
  179. package/dist/runtime/app/composables/cms-settings.js +14 -8
  180. package/dist/runtime/app/composables/cms-site-disabled.d.ts +7 -0
  181. package/dist/runtime/app/composables/cms-site-disabled.js +8 -0
  182. package/dist/runtime/app/composables/cms-site.d.ts +7 -0
  183. package/dist/runtime/app/composables/cms-site.js +22 -0
  184. package/dist/runtime/app/composables/cms-toast.d.ts +2 -8
  185. package/dist/runtime/app/composables/cms-toast.js +3 -9
  186. package/dist/runtime/app/composables/cms-translation-actions.d.ts +15 -0
  187. package/dist/runtime/app/composables/cms-translation-actions.js +108 -0
  188. package/dist/runtime/app/css-url.d.ts +4 -0
  189. package/dist/runtime/app/image/CmsImage.d.vue.ts +89 -0
  190. package/dist/runtime/app/image/CmsImage.vue +91 -0
  191. package/dist/runtime/app/image/CmsImage.vue.d.ts +89 -0
  192. package/dist/runtime/app/layouts/cms-admin.d.vue.ts +2 -2
  193. package/dist/runtime/app/layouts/cms-admin.vue +98 -76
  194. package/dist/runtime/app/layouts/cms-admin.vue.d.ts +2 -2
  195. package/dist/runtime/app/layouts/cms-editor.vue +7 -2
  196. package/dist/runtime/app/links/CmsLink.d.vue.ts +18 -0
  197. package/dist/runtime/app/links/CmsLink.vue +18 -0
  198. package/dist/runtime/app/links/CmsLink.vue.d.ts +18 -0
  199. package/dist/runtime/app/middleware/cms-auth.js +13 -1
  200. package/dist/runtime/app/pages/admin-collection.vue +473 -297
  201. package/dist/runtime/app/pages/admin-content.vue +190 -53
  202. package/dist/runtime/app/pages/admin-entry.vue +79 -75
  203. package/dist/runtime/app/pages/admin-index.vue +18 -5
  204. package/dist/runtime/app/pages/admin-login.vue +1 -1
  205. package/dist/runtime/app/pages/admin-logout.vue +1 -1
  206. package/dist/runtime/app/pages/admin-media.vue +3 -3
  207. package/dist/runtime/app/pages/admin-preview.vue +112 -24
  208. package/dist/runtime/app/plugins/cms-field.d.ts +2 -0
  209. package/dist/runtime/app/plugins/cms-field.js +8 -0
  210. package/dist/runtime/app/plugins/cms-preview-banner.client.d.ts +2 -0
  211. package/dist/runtime/app/plugins/cms-preview-banner.client.js +19 -0
  212. package/dist/runtime/app/plugins/cms-preview.d.ts +2 -0
  213. package/dist/runtime/app/plugins/cms-preview.js +27 -0
  214. package/dist/runtime/app/preview/CmsPreviewBanner.d.vue.ts +7 -0
  215. package/dist/runtime/app/preview/CmsPreviewBanner.vue +63 -0
  216. package/dist/runtime/app/preview/CmsPreviewBanner.vue.d.ts +7 -0
  217. package/dist/runtime/app/preview/PreviewOverlay.d.vue.ts +17 -3
  218. package/dist/runtime/app/preview/PreviewOverlay.vue +629 -166
  219. package/dist/runtime/app/preview/PreviewOverlay.vue.d.ts +17 -3
  220. package/dist/runtime/app/preview/field-marker.d.ts +12 -0
  221. package/dist/runtime/app/preview/field-marker.js +20 -0
  222. package/dist/runtime/app/preview/inline-text.d.ts +15 -0
  223. package/dist/runtime/app/preview/inline-text.js +158 -0
  224. package/dist/runtime/app/utils/block-editor.d.ts +22 -0
  225. package/dist/runtime/app/utils/block-editor.js +12 -0
  226. package/dist/runtime/app/utils/keyboard.d.ts +6 -0
  227. package/dist/runtime/app/utils/keyboard.js +52 -0
  228. package/dist/runtime/app/utils/redirects.d.ts +6 -0
  229. package/dist/runtime/app/utils/redirects.js +7 -0
  230. package/dist/runtime/app/utils/ui.d.ts +8 -0
  231. package/dist/runtime/app/utils/ui.js +15 -1
  232. package/dist/runtime/app/utils/users.d.ts +15 -0
  233. package/dist/runtime/app/utils/users.js +14 -0
  234. package/dist/runtime/assets/cms.css +1 -1
  235. package/dist/runtime/generate.js +16 -2
  236. package/dist/runtime/server/api/collection-export.get.js +3 -2
  237. package/dist/runtime/server/api/collection-import.post.js +39 -11
  238. package/dist/runtime/server/api/collection.get.js +27 -9
  239. package/dist/runtime/server/api/collection.post.js +28 -11
  240. package/dist/runtime/server/api/collection.put.js +35 -13
  241. package/dist/runtime/server/api/item.delete.js +19 -7
  242. package/dist/runtime/server/api/item.get.js +3 -2
  243. package/dist/runtime/server/api/item.put.js +52 -18
  244. package/dist/runtime/server/api/link-usage.post.d.ts +5 -0
  245. package/dist/runtime/server/api/link-usage.post.js +21 -0
  246. package/dist/runtime/server/api/media-delete.post.js +4 -2
  247. package/dist/runtime/server/api/media-download.get.js +2 -2
  248. package/dist/runtime/server/api/media-folder.delete.js +8 -2
  249. package/dist/runtime/server/api/media-folder.patch.js +10 -2
  250. package/dist/runtime/server/api/media-folder.post.js +4 -2
  251. package/dist/runtime/server/api/media-move.post.js +7 -4
  252. package/dist/runtime/server/api/media-presign.post.js +2 -2
  253. package/dist/runtime/server/api/media-upload.put.js +2 -2
  254. package/dist/runtime/server/api/media-usage.post.d.ts +2 -4
  255. package/dist/runtime/server/api/media-usage.post.js +13 -9
  256. package/dist/runtime/server/api/media.delete.js +4 -2
  257. package/dist/runtime/server/api/media.get.js +22 -7
  258. package/dist/runtime/server/api/media.post.js +4 -2
  259. package/dist/runtime/server/api/media.put.js +33 -16
  260. package/dist/runtime/server/api/preset.delete.d.ts +4 -0
  261. package/dist/runtime/server/api/preset.delete.js +9 -0
  262. package/dist/runtime/server/api/preset.put.d.ts +3 -0
  263. package/dist/runtime/server/api/preset.put.js +23 -0
  264. package/dist/runtime/server/api/presets-field.get.d.ts +3 -0
  265. package/dist/runtime/server/api/presets-field.get.js +13 -0
  266. package/dist/runtime/server/api/presets-field.post.d.ts +3 -0
  267. package/dist/runtime/server/api/presets-field.post.js +36 -0
  268. package/dist/runtime/server/api/presets.get.d.ts +3 -0
  269. package/dist/runtime/server/api/presets.get.js +7 -0
  270. package/dist/runtime/server/api/preview-link.delete.d.ts +4 -0
  271. package/dist/runtime/server/api/preview-link.delete.js +15 -0
  272. package/dist/runtime/server/api/preview-links.get.d.ts +3 -0
  273. package/dist/runtime/server/api/preview-links.get.js +10 -0
  274. package/dist/runtime/server/api/preview-links.post.d.ts +3 -0
  275. package/dist/runtime/server/api/preview-links.post.js +17 -0
  276. package/dist/runtime/server/api/preview.get.d.ts +3 -0
  277. package/dist/runtime/server/api/preview.get.js +7 -0
  278. package/dist/runtime/server/api/redirect.delete.d.ts +4 -0
  279. package/dist/runtime/server/api/redirect.delete.js +10 -0
  280. package/dist/runtime/server/api/redirect.put.d.ts +3 -0
  281. package/dist/runtime/server/api/redirect.put.js +8 -0
  282. package/dist/runtime/server/api/redirects-import.post.d.ts +3 -0
  283. package/dist/runtime/server/api/redirects-import.post.js +13 -0
  284. package/dist/runtime/server/api/redirects.get.d.ts +3 -0
  285. package/dist/runtime/server/api/redirects.get.js +7 -0
  286. package/dist/runtime/server/api/redirects.post.d.ts +3 -0
  287. package/dist/runtime/server/api/redirects.post.js +7 -0
  288. package/dist/runtime/server/api/search.get.js +8 -3
  289. package/dist/runtime/server/api/settings.delete.js +2 -2
  290. package/dist/runtime/server/api/settings.get.js +4 -2
  291. package/dist/runtime/server/api/settings.put.js +2 -2
  292. package/dist/runtime/server/api/site.get.d.ts +3 -0
  293. package/dist/runtime/server/api/site.get.js +7 -0
  294. package/dist/runtime/server/api/site.put.d.ts +3 -0
  295. package/dist/runtime/server/api/site.put.js +16 -0
  296. package/dist/runtime/server/api/tags.get.js +3 -2
  297. package/dist/runtime/server/api/user.delete.js +8 -2
  298. package/dist/runtime/server/api/user.put.js +14 -4
  299. package/dist/runtime/server/api/users.get.js +2 -2
  300. package/dist/runtime/server/api/users.post.js +8 -4
  301. package/dist/runtime/server/middleware/hidden-site.d.ts +2 -0
  302. package/dist/runtime/server/middleware/hidden-site.js +8 -0
  303. package/dist/runtime/server/middleware/preview-links.d.ts +2 -0
  304. package/dist/runtime/server/middleware/preview-links.js +6 -0
  305. package/dist/runtime/server/middleware/redirects.d.ts +2 -0
  306. package/dist/runtime/server/middleware/redirects.js +18 -0
  307. package/dist/runtime/server/plugins/session-validate.js +4 -1
  308. package/dist/runtime/server/plugins/webhooks.d.ts +3 -0
  309. package/dist/runtime/server/plugins/webhooks.js +27 -0
  310. package/dist/runtime/server/routes/graphql.js +5 -3
  311. package/dist/runtime/server/routes/robots.d.ts +2 -0
  312. package/dist/runtime/server/routes/robots.js +16 -0
  313. package/dist/runtime/server/routes/sitemap.d.ts +2 -0
  314. package/dist/runtime/server/routes/sitemap.js +67 -0
  315. package/dist/runtime/server/utils/cached-value.d.ts +5 -0
  316. package/dist/runtime/server/utils/cached-value.js +24 -0
  317. package/dist/runtime/server/utils/content-routes.d.ts +5 -0
  318. package/dist/runtime/server/utils/content-routes.js +29 -0
  319. package/dist/runtime/server/utils/field-rules.d.ts +19 -0
  320. package/dist/runtime/server/utils/field-rules.js +72 -0
  321. package/dist/runtime/server/utils/graphql.d.ts +3 -1
  322. package/dist/runtime/server/utils/graphql.js +143 -28
  323. package/dist/runtime/server/utils/hooks.d.ts +14 -0
  324. package/dist/runtime/server/utils/hooks.js +71 -0
  325. package/dist/runtime/server/utils/import.d.ts +7 -2
  326. package/dist/runtime/server/utils/import.js +108 -14
  327. package/dist/runtime/server/utils/link-usage.d.ts +4 -0
  328. package/dist/runtime/server/utils/link-usage.js +28 -0
  329. package/dist/runtime/server/utils/media-references.d.ts +6 -1
  330. package/dist/runtime/server/utils/media-references.js +49 -20
  331. package/dist/runtime/server/utils/media-usage.d.ts +2 -0
  332. package/dist/runtime/server/utils/media-usage.js +5 -3
  333. package/dist/runtime/server/utils/page-rows.d.ts +2 -0
  334. package/dist/runtime/server/utils/page-rows.js +42 -29
  335. package/dist/runtime/server/utils/permissions.d.ts +14 -0
  336. package/dist/runtime/server/utils/permissions.js +43 -0
  337. package/dist/runtime/server/utils/presets.d.ts +18 -0
  338. package/dist/runtime/server/utils/presets.js +68 -0
  339. package/dist/runtime/server/utils/preview-links.d.ts +207 -0
  340. package/dist/runtime/server/utils/preview-links.js +161 -0
  341. package/dist/runtime/server/utils/redirects.d.ts +31 -0
  342. package/dist/runtime/server/utils/redirects.js +240 -0
  343. package/dist/runtime/server/utils/registry.js +4 -1
  344. package/dist/runtime/server/utils/relations.d.ts +8 -0
  345. package/dist/runtime/server/utils/relations.js +25 -6
  346. package/dist/runtime/server/utils/require-admin.d.ts +0 -1
  347. package/dist/runtime/server/utils/require-admin.js +4 -8
  348. package/dist/runtime/server/utils/search.d.ts +1 -0
  349. package/dist/runtime/server/utils/search.js +44 -19
  350. package/dist/runtime/server/utils/site.d.ts +23 -0
  351. package/dist/runtime/server/utils/site.js +79 -0
  352. package/dist/runtime/server/utils/sitemap.d.ts +12 -0
  353. package/dist/runtime/server/utils/sitemap.js +109 -0
  354. package/dist/runtime/server/utils/user-management.d.ts +4 -0
  355. package/dist/runtime/server/utils/user-management.js +20 -0
  356. package/dist/runtime/server/utils/users.d.ts +1 -1
  357. package/dist/runtime/server/utils/users.js +1 -1
  358. package/dist/runtime/server/utils/visibility.d.ts +1 -0
  359. package/dist/runtime/server/utils/visibility.js +6 -1
  360. package/dist/runtime/server/utils/webhooks.d.ts +24 -0
  361. package/dist/runtime/server/utils/webhooks.js +90 -0
  362. package/dist/runtime/shared/block-paths.d.ts +66 -0
  363. package/dist/runtime/shared/block-paths.js +310 -0
  364. package/dist/runtime/shared/block-picker.d.ts +18 -0
  365. package/dist/runtime/shared/block-picker.js +31 -0
  366. package/dist/runtime/shared/block-signature.d.ts +4 -0
  367. package/dist/runtime/shared/block-signature.js +46 -0
  368. package/dist/runtime/shared/clipboard.d.ts +31 -0
  369. package/dist/runtime/shared/clipboard.js +206 -0
  370. package/dist/runtime/shared/conditions.d.ts +36 -0
  371. package/dist/runtime/shared/conditions.js +100 -0
  372. package/dist/runtime/shared/content-routes.d.ts +42 -0
  373. package/dist/runtime/shared/content-routes.js +237 -0
  374. package/dist/runtime/shared/duplicate.js +2 -1
  375. package/dist/runtime/shared/editor-layout.d.ts +18 -0
  376. package/dist/runtime/shared/editor-layout.js +9 -0
  377. package/dist/runtime/shared/field-options.d.ts +21 -0
  378. package/dist/runtime/shared/field-options.js +90 -0
  379. package/dist/runtime/shared/graphql-sdl.d.ts +1 -0
  380. package/dist/runtime/shared/graphql-sdl.js +50 -26
  381. package/dist/runtime/shared/history.d.ts +27 -0
  382. package/dist/runtime/shared/history.js +123 -0
  383. package/dist/runtime/shared/hooks.d.ts +45 -0
  384. package/dist/runtime/shared/hooks.js +28 -0
  385. package/dist/runtime/shared/index.d.ts +90 -21
  386. package/dist/runtime/shared/index.js +121 -37
  387. package/dist/runtime/shared/inline-text.d.ts +38 -0
  388. package/dist/runtime/shared/inline-text.js +85 -0
  389. package/dist/runtime/shared/layout.d.ts +2 -1
  390. package/dist/runtime/shared/layout.js +3 -0
  391. package/dist/runtime/shared/links.d.ts +48 -0
  392. package/dist/runtime/shared/links.js +155 -0
  393. package/dist/runtime/shared/list-filters.d.ts +2 -0
  394. package/dist/runtime/shared/list-filters.js +2 -0
  395. package/dist/runtime/shared/media-focal.d.ts +30 -0
  396. package/dist/runtime/shared/media-focal.js +52 -0
  397. package/dist/runtime/shared/migrations-dir.d.ts +14 -0
  398. package/dist/runtime/shared/migrations-dir.js +48 -2
  399. package/dist/runtime/shared/presets.d.ts +67 -0
  400. package/dist/runtime/shared/presets.js +127 -0
  401. package/dist/runtime/shared/preview-links.d.ts +64 -0
  402. package/dist/runtime/shared/preview-links.js +54 -0
  403. package/dist/runtime/shared/preview.d.ts +124 -21
  404. package/dist/runtime/shared/preview.js +419 -81
  405. package/dist/runtime/shared/redirects.d.ts +75 -0
  406. package/dist/runtime/shared/redirects.js +230 -0
  407. package/dist/runtime/shared/roles.d.ts +57 -0
  408. package/dist/runtime/shared/roles.js +293 -0
  409. package/dist/runtime/shared/save-state.d.ts +8 -0
  410. package/dist/runtime/shared/save-state.js +15 -0
  411. package/dist/runtime/shared/search.d.ts +16 -1
  412. package/dist/runtime/shared/search.js +41 -7
  413. package/dist/runtime/shared/seo.d.ts +167 -0
  414. package/dist/runtime/shared/seo.js +335 -0
  415. package/dist/runtime/shared/transfer.js +2 -1
  416. package/dist/runtime/shared/translations.d.ts +29 -0
  417. package/dist/runtime/shared/translations.js +123 -0
  418. package/dist/runtime/shared/users.d.ts +1 -1
  419. package/dist/runtime/shared/validation.d.ts +23 -1
  420. package/dist/runtime/shared/validation.js +214 -64
  421. package/dist/runtime/webhooks.d.ts +33 -0
  422. package/dist/runtime/webhooks.js +57 -0
  423. package/dist/types.d.mts +5 -1
  424. package/package.json +6 -2
  425. package/dist/runtime/app/components/cms/BlockOutline.vue +0 -88
  426. package/dist/runtime/app/components/cms/BlockPalette.vue +0 -31
  427. package/dist/runtime/app/components/cms/SettingsModal.d.vue.ts +0 -12
  428. package/dist/runtime/app/components/cms/SettingsModal.vue +0 -126
  429. package/dist/runtime/app/components/cms/SettingsModal.vue.d.ts +0 -12
  430. package/dist/runtime/app/composables/cms-field-focus.d.ts +0 -4
  431. package/dist/runtime/app/composables/cms-field-focus.js +0 -20
@@ -0,0 +1,52 @@
1
+ const FOCAL_PRECISION = 1e4;
2
+ export function isFocalCoordinate(value) {
3
+ return typeof value === "number" && Number.isFinite(value) && value >= 0 && value <= 1;
4
+ }
5
+ export function roundFocalCoordinate(value) {
6
+ return Math.round(Math.min(1, Math.max(0, value)) * FOCAL_PRECISION) / FOCAL_PRECISION;
7
+ }
8
+ export function focalPointOf(media) {
9
+ if (!media) return null;
10
+ const { focalX, focalY } = media;
11
+ if (!isFocalCoordinate(focalX) || !isFocalCoordinate(focalY)) return null;
12
+ return { x: focalX, y: focalY };
13
+ }
14
+ export function focalPointIssue(focalX, focalY) {
15
+ const unset = (value) => value === null || value === void 0;
16
+ if (unset(focalX) && unset(focalY)) return null;
17
+ if (unset(focalX) || unset(focalY)) return "focalX and focalY must be set together";
18
+ if (!isFocalCoordinate(focalX) || !isFocalCoordinate(focalY))
19
+ return "focalX and focalY must be numbers from 0 to 1";
20
+ return null;
21
+ }
22
+ function percent(value) {
23
+ return `${Math.round(value * 1e4) / 100}%`;
24
+ }
25
+ export function focalObjectPosition(media) {
26
+ const point = focalPointOf(media);
27
+ return point ? `${percent(point.x)} ${percent(point.y)}` : void 0;
28
+ }
29
+ export function imgixFocalModifiers(media) {
30
+ const point = focalPointOf(media);
31
+ if (!point) return {};
32
+ return { crop: "focalpoint", focalPointXPosition: point.x, focalPointYPosition: point.y };
33
+ }
34
+ function toPixels(value) {
35
+ if (value === null || value === void 0 || value === "") return void 0;
36
+ const parsed = typeof value === "number" ? value : Number(value);
37
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : void 0;
38
+ }
39
+ export function cmsImageSize(media, input = {}) {
40
+ const naturalWidth = toPixels(media?.width);
41
+ const naturalHeight = toPixels(media?.height);
42
+ const width = toPixels(input.width);
43
+ const height = toPixels(input.height);
44
+ const ratio = naturalWidth && naturalHeight ? naturalWidth / naturalHeight : void 0;
45
+ if (width && height) return { width, height };
46
+ if (width) return { width, height: ratio ? Math.round(width / ratio) : void 0 };
47
+ if (height) return { width: ratio ? Math.round(height * ratio) : void 0, height };
48
+ return { width: naturalWidth, height: naturalHeight };
49
+ }
50
+ export function isRenderableImage(media) {
51
+ return !!media?.url && (media.type === void 0 || media.type === null || media.type === "image");
52
+ }
@@ -1 +1,15 @@
1
1
  export declare function migrationsDirFor(root: string, driver: string): string;
2
+ export interface CmsUniqueTextColumn {
3
+ table: string;
4
+ column: string;
5
+ }
6
+ export type CmsMigrationDialect = 'sqlite' | 'turso' | 'postgresql';
7
+ export declare function blankUniqueValuesToNull(sql: string, columns: readonly CmsUniqueTextColumn[], dialect: CmsMigrationDialect): string;
8
+ export declare function migrationSqlFiles(dir: string): string[];
9
+ export declare function fixNewMigrations(dir: string, before: readonly string[], columns: readonly CmsUniqueTextColumn[], dialect: CmsMigrationDialect): string[];
10
+ export declare const MIGRATION_FIXES_FILE = "migration-fixes.json";
11
+ export interface CmsMigrationFixes {
12
+ dialect: CmsMigrationDialect;
13
+ out: string;
14
+ uniqueTextColumns: CmsUniqueTextColumn[];
15
+ }
@@ -1,5 +1,5 @@
1
- import { existsSync } from "node:fs";
2
- import { resolve } from "node:path";
1
+ import { existsSync, readFileSync, readdirSync, writeFileSync } from "node:fs";
2
+ import { join, resolve } from "node:path";
3
3
  const MIGRATIONS_ROOT = "server/db/migrations";
4
4
  export function migrationsDirFor(root, driver) {
5
5
  if (driver === "postgres") return resolve(root, `${MIGRATIONS_ROOT}/postgres`);
@@ -7,3 +7,49 @@ export function migrationsDirFor(root, driver) {
7
7
  if (driver !== "sqlite" && existsSync(perDriver)) return perDriver;
8
8
  return resolve(root, `${MIGRATIONS_ROOT}/sqlite`);
9
9
  }
10
+ const STATEMENT_BREAKPOINT = "--> statement-breakpoint";
11
+ const SQLITE_UNIQUE_INDEX = /^CREATE UNIQUE INDEX [`"]?[\w]+[`"]? ON [`"]?(\w+)[`"]? \([`"]?(\w+)[`"]?\)/i;
12
+ const POSTGRES_UNIQUE_CONSTRAINT = /^ALTER TABLE "(?:\w+"\.")?(\w+)" ADD CONSTRAINT "\w+" UNIQUE(?: NULLS NOT DISTINCT)?\("(\w+)"\)/i;
13
+ function uniqueTarget(statement) {
14
+ const match = SQLITE_UNIQUE_INDEX.exec(statement) ?? POSTGRES_UNIQUE_CONSTRAINT.exec(statement);
15
+ return match ? { table: match[1], column: match[2] } : null;
16
+ }
17
+ function blankToNullStatement(target, dialect) {
18
+ const quote = dialect === "postgresql" ? '"' : "`";
19
+ const table = `${quote}${target.table}${quote}`;
20
+ const column = `${quote}${target.column}${quote}`;
21
+ return `UPDATE ${table} SET ${column} = NULL WHERE trim(${column}) = '';`;
22
+ }
23
+ export function blankUniqueValuesToNull(sql, columns, dialect) {
24
+ const out = [];
25
+ for (const part of sql.split(STATEMENT_BREAKPOINT)) {
26
+ const target = uniqueTarget(part.trim());
27
+ const listed = columns.some(
28
+ (column) => column.table === target?.table && column.column === target?.column
29
+ );
30
+ if (target && listed) {
31
+ const leading = /^\s*/.exec(part)[0];
32
+ out.push(`${leading}${blankToNullStatement(target, dialect)}`, `
33
+ ${part.trimStart()}`);
34
+ } else out.push(part);
35
+ }
36
+ return out.join(STATEMENT_BREAKPOINT);
37
+ }
38
+ export function migrationSqlFiles(dir) {
39
+ return existsSync(dir) ? readdirSync(dir).filter((file) => file.endsWith(".sql")) : [];
40
+ }
41
+ export function fixNewMigrations(dir, before, columns, dialect) {
42
+ const fixed = [];
43
+ if (!columns.length) return fixed;
44
+ for (const file of migrationSqlFiles(dir)) {
45
+ if (before.includes(file)) continue;
46
+ const path = join(dir, file);
47
+ const sql = readFileSync(path, "utf8");
48
+ const next = blankUniqueValuesToNull(sql, columns, dialect);
49
+ if (next === sql) continue;
50
+ writeFileSync(path, next);
51
+ fixed.push(file);
52
+ }
53
+ return fixed;
54
+ }
55
+ export const MIGRATION_FIXES_FILE = "migration-fixes.json";
@@ -0,0 +1,67 @@
1
+ import { z } from 'zod';
2
+ import type { CmsI18n, FieldConfig } from './index.js';
3
+ import type { CmsClipboardNotice, CmsPasteResult } from './clipboard.js';
4
+ import type { CmsBlockValue } from './preview.js';
5
+ export declare const CMS_PRESET_KEY_PREFIX = "cms:presets:";
6
+ export declare const CMS_PRESET_NAME_MAX = 80;
7
+ export declare const CMS_PRESET_DESCRIPTION_MAX = 300;
8
+ export declare const CMS_PRESET_MAX_ITEMS = 100;
9
+ export declare const CMS_PRESET_MAX_BYTES = 1000000;
10
+ export declare const CMS_PRESET_MAX_COUNT = 500;
11
+ export type CmsPresetAction = 'use' | 'manage';
12
+ export declare function presetPermission(action: CmsPresetAction, entry: string): string;
13
+ export interface CmsBlockPreset {
14
+ id: string;
15
+ name: string;
16
+ description?: string;
17
+ source: string;
18
+ types: string[];
19
+ signatures?: Record<string, string>;
20
+ items: CmsBlockValue[];
21
+ createdAt: string;
22
+ updatedAt: string;
23
+ }
24
+ export declare const presetCreateSchema: z.ZodObject<{
25
+ name: z.ZodString;
26
+ description: z.ZodOptional<z.ZodString>;
27
+ items: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
28
+ }, z.core.$strict>;
29
+ export declare const presetUpdateSchema: z.ZodObject<{
30
+ name: z.ZodString;
31
+ description: z.ZodOptional<z.ZodString>;
32
+ }, z.core.$strict>;
33
+ export interface CmsPresetDetails {
34
+ name: string;
35
+ description?: string;
36
+ }
37
+ export type CmsPresetCreate = z.infer<typeof presetCreateSchema>;
38
+ export type CmsPresetUpdate = z.infer<typeof presetUpdateSchema>;
39
+ export declare function presetKey(id: string): string;
40
+ export declare function presetTypes(items: readonly CmsBlockValue[]): string[];
41
+ export declare function presetFits(preset: Pick<CmsBlockPreset, 'types' | 'signatures' | 'source'>, field: Pick<FieldConfig, 'blocks'>, source: string): boolean;
42
+ export declare function presetSourceEntry(preset: Pick<CmsBlockPreset, 'source'>): string;
43
+ export declare function presetReadable(preset: Pick<CmsBlockPreset, 'source'>, canRead: (permission: string) => boolean): boolean;
44
+ export declare function parseStoredPreset(raw: string): CmsBlockPreset | null;
45
+ export declare function sortPresets(presets: readonly CmsBlockPreset[]): CmsBlockPreset[];
46
+ export type CmsPresetBuild = {
47
+ preset: CmsBlockPreset;
48
+ } | {
49
+ error: string;
50
+ };
51
+ export declare function buildPreset(input: CmsPresetCreate, field: Pick<FieldConfig, 'blocks'>, i18n: CmsI18n, meta: {
52
+ id: string;
53
+ source: string;
54
+ now: string;
55
+ }): CmsPresetBuild;
56
+ export declare function renamePreset(preset: CmsBlockPreset, input: CmsPresetUpdate, now: string): CmsBlockPreset;
57
+ export declare function presetBlockCount(count: number): string;
58
+ export declare function presetInsertNotice(result: CmsPasteResult, field: Pick<FieldConfig, 'max'>, preset: Pick<CmsBlockPreset, 'name'>): CmsClipboardNotice;
59
+ export declare const CMS_PRESET_PICKER_GROUP = "Presets";
60
+ export declare const CMS_PRESET_ICON = "bookmark";
61
+ export interface CmsPresetPickerItem {
62
+ id: string;
63
+ label: string;
64
+ description: string;
65
+ keywords: string[];
66
+ }
67
+ export declare function presetPickerItem(preset: CmsBlockPreset): CmsPresetPickerItem;
@@ -0,0 +1,127 @@
1
+ import { z } from "zod";
2
+ import { pasteBlocks, skippedText } from "./clipboard.js";
3
+ import { blockSignature, blockSignatures } from "./block-signature.js";
4
+ export const CMS_PRESET_KEY_PREFIX = "cms:presets:";
5
+ export const CMS_PRESET_NAME_MAX = 80;
6
+ export const CMS_PRESET_DESCRIPTION_MAX = 300;
7
+ export const CMS_PRESET_MAX_ITEMS = 100;
8
+ export const CMS_PRESET_MAX_BYTES = 1e6;
9
+ export const CMS_PRESET_MAX_COUNT = 500;
10
+ export function presetPermission(action, entry) {
11
+ return action === "use" ? `${entry}.update` : "settings.manage";
12
+ }
13
+ const name = z.string().trim().min(1, "Give the preset a name").max(CMS_PRESET_NAME_MAX);
14
+ const description = z.string().trim().max(CMS_PRESET_DESCRIPTION_MAX);
15
+ const item = z.record(z.string(), z.unknown()).refine(
16
+ (value) => typeof value.type === "string" && value.type !== "",
17
+ "Every block needs a type"
18
+ );
19
+ export const presetCreateSchema = z.object({
20
+ name,
21
+ description: description.optional(),
22
+ items: z.array(item).min(1, "A preset needs at least one block").max(CMS_PRESET_MAX_ITEMS)
23
+ }).strict();
24
+ export const presetUpdateSchema = z.object({ name, description: description.optional() }).strict();
25
+ const storedSchema = z.object({
26
+ id: z.string().min(1),
27
+ name: z.string().min(1),
28
+ description: z.string().optional(),
29
+ source: z.string(),
30
+ types: z.array(z.string()),
31
+ signatures: z.record(z.string(), z.string()).optional(),
32
+ items: z.array(z.record(z.string(), z.unknown())),
33
+ createdAt: z.string(),
34
+ updatedAt: z.string()
35
+ });
36
+ export function presetKey(id) {
37
+ return `${CMS_PRESET_KEY_PREFIX}${id}`;
38
+ }
39
+ export function presetTypes(items) {
40
+ return [...new Set(items.map((value) => String(value.type)))].sort();
41
+ }
42
+ export function presetFits(preset, field, source) {
43
+ const blocks = field.blocks ?? {};
44
+ if (!preset.types.length || !preset.types.every((type) => Object.hasOwn(blocks, type)))
45
+ return false;
46
+ const signatures = preset.signatures;
47
+ if (!signatures) return preset.source === source;
48
+ return preset.types.every(
49
+ (type) => Object.hasOwn(signatures, type) && signatures[type] === blockSignature(blocks[type])
50
+ );
51
+ }
52
+ export function presetSourceEntry(preset) {
53
+ return preset.source.split(".")[0] ?? "";
54
+ }
55
+ export function presetReadable(preset, canRead) {
56
+ const entry = presetSourceEntry(preset);
57
+ return !!entry && canRead(`${entry}.read`);
58
+ }
59
+ export function parseStoredPreset(raw) {
60
+ try {
61
+ const parsed = storedSchema.safeParse(JSON.parse(raw));
62
+ if (!parsed.success) return null;
63
+ const { description: text, ...rest } = parsed.data;
64
+ return { ...rest, ...text ? { description: text } : {} };
65
+ } catch {
66
+ return null;
67
+ }
68
+ }
69
+ export function sortPresets(presets) {
70
+ return [...presets].sort(
71
+ (a, b) => a.name.localeCompare(b.name, void 0, { sensitivity: "base" }) || a.createdAt.localeCompare(b.createdAt)
72
+ );
73
+ }
74
+ export function buildPreset(input, field, i18n, meta) {
75
+ const result = pasteBlocks([], 0, input.items, { blocks: field.blocks }, i18n);
76
+ if (result.unknown.length)
77
+ return {
78
+ error: `Not a block of this field: ${[...new Set(result.unknown)].join(", ")}`
79
+ };
80
+ const types = presetTypes(result.list);
81
+ const preset = {
82
+ id: meta.id,
83
+ name: input.name,
84
+ ...input.description ? { description: input.description } : {},
85
+ source: meta.source,
86
+ types,
87
+ signatures: blockSignatures(field.blocks, types),
88
+ items: result.list,
89
+ createdAt: meta.now,
90
+ updatedAt: meta.now
91
+ };
92
+ if (JSON.stringify(preset).length > CMS_PRESET_MAX_BYTES)
93
+ return { error: "The preset is too large" };
94
+ return { preset };
95
+ }
96
+ export function renamePreset(preset, input, now) {
97
+ const { description: _description, ...rest } = preset;
98
+ return {
99
+ ...rest,
100
+ name: input.name,
101
+ ...input.description ? { description: input.description } : {},
102
+ updatedAt: now
103
+ };
104
+ }
105
+ export function presetBlockCount(count) {
106
+ return `${count} ${count === 1 ? "block" : "blocks"}`;
107
+ }
108
+ export function presetInsertNotice(result, field, preset) {
109
+ const description2 = skippedText(result, field);
110
+ if (!result.pasted) return { title: "Nothing inserted", description: description2, color: "error" };
111
+ return {
112
+ title: `${preset.name} inserted`,
113
+ description: description2 ?? presetBlockCount(result.pasted),
114
+ color: description2 ? void 0 : "success"
115
+ };
116
+ }
117
+ export const CMS_PRESET_PICKER_GROUP = "Presets";
118
+ export const CMS_PRESET_ICON = "bookmark";
119
+ export function presetPickerItem(preset) {
120
+ const count = presetBlockCount(preset.items.length);
121
+ return {
122
+ id: preset.id,
123
+ label: preset.name,
124
+ description: preset.description ? `${count} \xB7 ${preset.description}` : count,
125
+ keywords: [CMS_PRESET_PICKER_GROUP, ...preset.types]
126
+ };
127
+ }
@@ -0,0 +1,64 @@
1
+ export declare const PREVIEW_QUERY_PARAM = "cms-preview";
2
+ export declare const PREVIEW_HEADER = "x-cms-preview";
3
+ export declare const PREVIEW_TOKEN_BYTES = 32;
4
+ export declare const PREVIEW_RESPONSE_HEADERS: {
5
+ readonly 'cache-control': "private, no-store";
6
+ readonly 'x-robots-tag': "noindex, nofollow";
7
+ readonly 'referrer-policy': "same-origin";
8
+ };
9
+ export declare const PREVIEW_LINK_DURATIONS: readonly [{
10
+ readonly value: "1h";
11
+ readonly label: "1 hour";
12
+ readonly ms: 3600000;
13
+ }, {
14
+ readonly value: "1d";
15
+ readonly label: "1 day";
16
+ readonly ms: number;
17
+ }, {
18
+ readonly value: "7d";
19
+ readonly label: "7 days";
20
+ readonly ms: number;
21
+ }, {
22
+ readonly value: "30d";
23
+ readonly label: "30 days";
24
+ readonly ms: number;
25
+ }];
26
+ export type CmsPreviewLinkDuration = (typeof PREVIEW_LINK_DURATIONS)[number]['value'];
27
+ export declare const DEFAULT_PREVIEW_LINK_DURATION: CmsPreviewLinkDuration;
28
+ export interface CmsPreviewLink {
29
+ id: string;
30
+ entry: string;
31
+ itemId: string;
32
+ locale: string | null;
33
+ path: string;
34
+ createdBy: string | null;
35
+ createdAt: string;
36
+ expiresAt: string;
37
+ }
38
+ export interface CmsCreatedPreviewLink {
39
+ link: CmsPreviewLink;
40
+ url: string;
41
+ }
42
+ export interface CmsPreviewGrant {
43
+ entry: string;
44
+ itemId: string;
45
+ expiresAt: string;
46
+ }
47
+ export interface CmsPreviewMode {
48
+ entry: string;
49
+ id: string;
50
+ expiresAt: string;
51
+ }
52
+ export interface CmsPreviewLinkState {
53
+ expiresAt: string;
54
+ revokedAt: string | null;
55
+ }
56
+ export declare function isPreviewToken(value: unknown): value is string;
57
+ export declare function previewTokenFrom(value: unknown): string | null;
58
+ export declare function hasPreviewQuery(path: string): boolean;
59
+ export declare function isPreviewLinkDuration(value: unknown): value is CmsPreviewLinkDuration;
60
+ export declare function previewLinkExpiry(duration: CmsPreviewLinkDuration, now?: Date): string;
61
+ export declare function isPreviewLinkActive(link: CmsPreviewLinkState, now?: Date): boolean;
62
+ export declare function previewGrantAllows(grant: CmsPreviewGrant | null | undefined, entry: string, itemId?: string): boolean;
63
+ export declare function previewLinkUrl(path: string, token: string): string;
64
+ export declare function previewBannerErrors(banner: unknown): string[];
@@ -0,0 +1,54 @@
1
+ export const PREVIEW_QUERY_PARAM = "cms-preview";
2
+ export const PREVIEW_HEADER = "x-cms-preview";
3
+ export const PREVIEW_TOKEN_BYTES = 32;
4
+ export const PREVIEW_RESPONSE_HEADERS = {
5
+ "cache-control": "private, no-store",
6
+ "x-robots-tag": "noindex, nofollow",
7
+ "referrer-policy": "same-origin"
8
+ };
9
+ const HOUR_MS = 36e5;
10
+ export const PREVIEW_LINK_DURATIONS = [
11
+ { value: "1h", label: "1 hour", ms: HOUR_MS },
12
+ { value: "1d", label: "1 day", ms: 24 * HOUR_MS },
13
+ { value: "7d", label: "7 days", ms: 7 * 24 * HOUR_MS },
14
+ { value: "30d", label: "30 days", ms: 30 * 24 * HOUR_MS }
15
+ ];
16
+ export const DEFAULT_PREVIEW_LINK_DURATION = "1d";
17
+ const TOKEN_PATTERN = /^[A-Za-z0-9_-]{43}$/;
18
+ export function isPreviewToken(value) {
19
+ return typeof value === "string" && TOKEN_PATTERN.test(value);
20
+ }
21
+ export function previewTokenFrom(value) {
22
+ const candidate = Array.isArray(value) ? value[0] : value;
23
+ return isPreviewToken(candidate) ? candidate : null;
24
+ }
25
+ export function hasPreviewQuery(path) {
26
+ const query = path.replace(/#.*$/s, "").split("?").slice(1).join("?");
27
+ return query.split("&").some((part) => part.split("=")[0] === PREVIEW_QUERY_PARAM);
28
+ }
29
+ export function isPreviewLinkDuration(value) {
30
+ return PREVIEW_LINK_DURATIONS.some((duration) => duration.value === value);
31
+ }
32
+ export function previewLinkExpiry(duration, now = /* @__PURE__ */ new Date()) {
33
+ const ms = PREVIEW_LINK_DURATIONS.find((option) => option.value === duration).ms;
34
+ return new Date(now.getTime() + ms).toISOString();
35
+ }
36
+ export function isPreviewLinkActive(link, now = /* @__PURE__ */ new Date()) {
37
+ if (link.revokedAt) return false;
38
+ const expires = Date.parse(link.expiresAt);
39
+ return Number.isFinite(expires) && expires > now.getTime();
40
+ }
41
+ export function previewGrantAllows(grant, entry, itemId) {
42
+ if (!grant || grant.entry !== entry) return false;
43
+ return itemId === void 0 || grant.itemId === itemId;
44
+ }
45
+ export function previewLinkUrl(path, token) {
46
+ const [base = "", hash] = path.split(/#(.*)/s);
47
+ const separator = base.includes("?") ? "&" : "?";
48
+ const url = `${base}${separator}${PREVIEW_QUERY_PARAM}=${token}`;
49
+ return hash === void 0 ? url : `${url}#${hash}`;
50
+ }
51
+ export function previewBannerErrors(banner) {
52
+ if (banner === void 0 || typeof banner === "boolean") return [];
53
+ return [`preview.banner must be a boolean, got ${JSON.stringify(banner)}`];
54
+ }
@@ -1,4 +1,6 @@
1
- import type { BlockConfig, FieldConfig, MediaItem, MediaType } from './index.js';
1
+ import type { BlockConfig, CmsLink, FieldConfig, MediaItem, MediaType } from './index.js';
2
+ import type { CmsBlockPath } from './block-paths.js';
3
+ export type CmsPreviewLinkResolver = (value: unknown) => CmsLink | null;
2
4
  export declare const CMS_PREVIEW_CHANNEL = "nuxt-cms:preview";
3
5
  export declare const DEFAULT_CMS_PREVIEW_PATH = "/cms/preview";
4
6
  export declare function previewPathErrors(path: string, entryNames: string[]): string[];
@@ -13,7 +15,11 @@ export interface CmsPreviewMedia {
13
15
  size: number | null;
14
16
  width: number | null;
15
17
  height: number | null;
18
+ focalX: number | null;
19
+ focalY: number | null;
16
20
  }
21
+ export type CmsPreviewTheme = 'system' | 'light' | 'dark';
22
+ export declare function readPreviewTheme(value: unknown): CmsPreviewTheme;
17
23
  export interface CmsPreviewState {
18
24
  entry: string;
19
25
  field: string;
@@ -21,65 +27,162 @@ export interface CmsPreviewState {
21
27
  blocks: CmsBlockValue[];
22
28
  item: Record<string, unknown> | null;
23
29
  media: Record<string, CmsPreviewMedia>;
24
- selected: number | null;
30
+ selected: CmsBlockPath | null;
31
+ editable: boolean;
32
+ lockedFields: string[];
33
+ theme: CmsPreviewTheme;
25
34
  }
26
35
  export type CmsPreviewHostMessage = {
27
36
  type: 'render';
28
37
  state: CmsPreviewState;
38
+ } | {
39
+ type: 'highlight';
40
+ path: CmsBlockPath | null;
41
+ } | {
42
+ type: 'reveal';
43
+ path: CmsBlockPath;
29
44
  };
30
45
  export type CmsPreviewFrameMessage = {
31
46
  type: 'ready';
32
47
  } | {
33
48
  type: 'select';
34
- index: number | null;
49
+ path: CmsBlockPath | null;
35
50
  focus?: boolean;
51
+ } | {
52
+ type: 'hover';
53
+ path: CmsBlockPath | null;
36
54
  } | {
37
55
  type: 'insert';
38
- index: number;
56
+ path: CmsBlockPath;
39
57
  } | {
40
58
  type: 'move';
41
- from: number;
42
- to: number;
59
+ from: CmsBlockPath;
60
+ to: CmsBlockPath;
43
61
  focus?: boolean;
44
62
  } | {
45
63
  type: 'duplicate';
46
- index: number;
64
+ path: CmsBlockPath;
47
65
  } | {
48
66
  type: 'toggle-hidden';
49
- index: number;
67
+ path: CmsBlockPath;
50
68
  } | {
51
69
  type: 'remove';
52
- index: number;
70
+ path: CmsBlockPath;
71
+ } | {
72
+ type: 'copy';
73
+ path: CmsBlockPath;
74
+ } | {
75
+ type: 'cut';
76
+ path: CmsBlockPath;
77
+ } | {
78
+ type: 'paste';
79
+ path: CmsBlockPath;
80
+ text?: string;
81
+ } | {
82
+ type: 'focus-field';
83
+ path: CmsBlockPath | null;
84
+ key: string;
85
+ } | {
86
+ type: 'field-input';
87
+ path: CmsBlockPath | null;
88
+ key: string;
89
+ locale: string;
90
+ value: string;
91
+ commit?: boolean;
92
+ } | {
93
+ type: 'undo';
94
+ } | {
95
+ type: 'redo';
96
+ } | {
97
+ type: 'save';
53
98
  };
99
+ export declare const CMS_CLIPBOARD_MAX_LENGTH = 2000000;
54
100
  export type CmsPreviewEnvelope<T> = T & {
55
101
  channel: typeof CMS_PREVIEW_CHANNEL;
56
102
  };
57
103
  export declare function previewEnvelope<T extends {
58
104
  type: string;
59
105
  }>(message: T): CmsPreviewEnvelope<T>;
106
+ export declare function isFieldKey(value: unknown): value is string;
107
+ export declare function readMessagePath(value: unknown): CmsBlockPath | null;
60
108
  export declare function parseFrameMessage(data: unknown): CmsPreviewFrameMessage | null;
61
109
  export declare function parseHostMessage(data: unknown): CmsPreviewHostMessage | null;
110
+ export interface CmsFieldTarget {
111
+ path: CmsBlockPath | null;
112
+ key: string;
113
+ }
114
+ export declare function previewFieldConfig(target: CmsFieldTarget, blocksFields: Record<string, FieldConfig>, blocksValues: Record<string, unknown>, entryFields: Record<string, FieldConfig> | null | undefined, blocksKey: string): FieldConfig | undefined;
115
+ export type CmsEditorShortcut = 'undo' | 'redo' | 'save' | 'remove' | 'duplicate' | 'move-up' | 'move-down' | 'insert-after' | 'insert-before' | 'deselect';
116
+ export interface CmsShortcutKey {
117
+ key: string;
118
+ metaKey: boolean;
119
+ ctrlKey: boolean;
120
+ altKey: boolean;
121
+ shiftKey: boolean;
122
+ }
123
+ export interface CmsShortcutTarget {
124
+ editable: boolean;
125
+ interactive: boolean;
126
+ selected: boolean;
127
+ }
128
+ export declare function isApplePlatform(platform: string): boolean;
129
+ export declare function editorShortcut(event: CmsShortcutKey, apple: boolean): CmsEditorShortcut | null;
130
+ export declare function shortcutApplies(action: CmsEditorShortcut, target: CmsShortcutTarget): boolean;
131
+ export type CmsClipboardAction = 'copy' | 'cut' | 'paste';
132
+ export interface CmsClipboardTarget {
133
+ editable: boolean;
134
+ interactive: boolean;
135
+ textSelected: boolean;
136
+ selected: boolean;
137
+ }
138
+ export declare function clipboardActionApplies(action: CmsClipboardAction, target: CmsClipboardTarget): boolean;
62
139
  export declare function isTrustedPreviewEvent(event: {
63
140
  origin: string;
64
141
  source: unknown;
65
142
  }, origin: string, source: unknown): boolean;
66
143
  export declare function emptyBlock(type: string, block: BlockConfig): CmsBlockValue;
67
- export declare function insertBlock(list: readonly CmsBlockValue[], index: number, item: CmsBlockValue): CmsBlockValue[];
68
- export declare function moveBlock(list: readonly CmsBlockValue[], from: number, to: number): CmsBlockValue[];
69
- export declare function duplicateBlock(list: readonly CmsBlockValue[], index: number): CmsBlockValue[];
70
- export declare function removeBlock(list: readonly CmsBlockValue[], index: number): CmsBlockValue[];
144
+ export declare function duplicateBlockAt(values: Record<string, unknown>, path: CmsBlockPath): Record<string, unknown>;
71
145
  export declare function canHideBlock(block: BlockConfig | undefined): boolean;
72
- export declare function toggleBlockHidden(list: readonly CmsBlockValue[], index: number, block: BlockConfig | undefined): CmsBlockValue[];
73
- export declare function selectionAfterMove(selected: number | null, from: number, to: number): number | null;
74
- export declare function selectionAfterRemove(selected: number | null, index: number): number | null;
75
- export declare function moveTargetForInsertion(from: number, insertAt: number): number;
76
- export declare function insertionIndex(blocks: readonly {
146
+ export declare function toggleBlockHiddenAt(values: Record<string, unknown>, path: CmsBlockPath, block: BlockConfig | undefined): Record<string, unknown>;
147
+ export declare function canMoveBlock(fields: Record<string, FieldConfig>, values: Record<string, unknown>, from: CmsBlockPath, toList: CmsBlockPath): boolean;
148
+ export interface CmsDropBox {
77
149
  index: number;
78
150
  top: number;
79
151
  bottom: number;
80
- }[], y: number, total: number): number;
152
+ left: number;
153
+ right: number;
154
+ }
155
+ export declare function isHorizontalList(boxes: readonly CmsDropBox[]): boolean;
156
+ export declare function insertionIndex(boxes: readonly CmsDropBox[], point: {
157
+ x: number;
158
+ y: number;
159
+ }, total: number): number;
81
160
  export declare function collectMediaKeys(fields: Record<string, FieldConfig>, values: Record<string, unknown> | null | undefined): string[];
82
161
  export declare function previewMedia(key: string, item: MediaItem | undefined, baseUrl: string | null | undefined): CmsPreviewMedia;
83
- export declare function previewBlocks(field: FieldConfig, value: unknown, locale: string, defaultLocale: string, media: Record<string, CmsPreviewMedia>): CmsBlockValue[];
84
- export declare function previewItem(fields: Record<string, FieldConfig>, values: Record<string, unknown>, locale: string, defaultLocale: string, media: Record<string, CmsPreviewMedia>): Record<string, unknown>;
162
+ export declare function previewBlocks(field: FieldConfig, value: unknown, locale: string, defaultLocale: string, media: Record<string, CmsPreviewMedia>, resolveLink?: CmsPreviewLinkResolver): CmsBlockValue[];
163
+ export declare function previewItem(fields: Record<string, FieldConfig>, values: Record<string, unknown>, locale: string, defaultLocale: string, media: Record<string, CmsPreviewMedia>, resolveLink?: CmsPreviewLinkResolver): Record<string, unknown>;
85
164
  export declare function blockSummary(block: BlockConfig | undefined, item: CmsBlockValue, locale: string, defaultLocale: string, max?: number): string;
165
+ export declare function blockErrorPaths(errors: Record<string, string | undefined | null>, fieldKey: string): Set<string>;
166
+ export declare function firstBlockError(errors: Record<string, string | undefined | null>, fieldKey: string): {
167
+ path: CmsBlockPath;
168
+ key?: string;
169
+ } | null;
170
+ export declare function editorIssueKeys(fields: Record<string, FieldConfig>, values: Record<string, unknown>, path: readonly unknown[], fieldKey: string): string[];
171
+ export interface CmsBlockTreeVisit {
172
+ path: CmsBlockPath;
173
+ item: CmsBlockValue;
174
+ block: BlockConfig | undefined;
175
+ field: FieldConfig;
176
+ }
177
+ export declare function blockTreeVisits(fields: Record<string, FieldConfig>, values: Record<string, unknown> | null | undefined, prefix?: CmsBlockPath): CmsBlockTreeVisit[];
178
+ export interface CmsBlockIdSnapshot<T> {
179
+ items: Map<CmsBlockValue, T>;
180
+ lists: Map<string, {
181
+ items: CmsBlockValue[];
182
+ ids: T[];
183
+ }>;
184
+ }
185
+ export declare function stableBlockTreeIds<T>(visits: readonly CmsBlockTreeVisit[], previous: CmsBlockIdSnapshot<T> | null, createId: () => T): {
186
+ ids: Map<string, T>;
187
+ snapshot: CmsBlockIdSnapshot<T>;
188
+ };