@xiwebdesign/xicms-core 6.4.7 → 7.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (373) hide show
  1. package/dist/SiteChrome.d.ts +12 -0
  2. package/dist/SiteChrome.js +24 -0
  3. package/dist/SiteChrome.js.map +1 -0
  4. package/dist/XiCMSProvider.d.ts +16 -8
  5. package/dist/XiCMSProvider.js +83 -58
  6. package/dist/XiCMSProvider.js.map +1 -1
  7. package/dist/admin/AdminApp.d.ts +1 -1
  8. package/dist/admin/AdminApp.js +79 -35
  9. package/dist/admin/AdminApp.js.map +1 -1
  10. package/dist/admin/AdminHelp.d.ts +8 -1
  11. package/dist/admin/AdminHelp.js +2 -2
  12. package/dist/admin/AdminHelp.js.map +1 -1
  13. package/dist/admin/NewsEditor.js +9 -9
  14. package/dist/admin/SuperadminPanel.js +5 -5
  15. package/dist/admin/blockEditors/GenericEditor.d.ts +2 -2
  16. package/dist/admin/blockEditors/GenericEditor.js +12 -11
  17. package/dist/admin/blockEditors/GenericEditor.js.map +1 -1
  18. package/dist/admin/blockEditors/StyleEditor.d.ts +1 -1
  19. package/dist/admin/blockEditors/StyleEditor.js +2 -2
  20. package/dist/admin/blockEditors/SymbolRefEditor.d.ts +1 -1
  21. package/dist/admin/blockEditors/SymbolRefEditor.js +5 -5
  22. package/dist/admin/blockEditors/index.d.ts +1 -1
  23. package/dist/admin/blockEditors/index.js +10 -10
  24. package/dist/admin/customBlocks/CustomBlocksPanel.js +7 -7
  25. package/dist/admin/editors/RichTextEditor.js +8 -7
  26. package/dist/admin/editors/RichTextEditor.js.map +1 -1
  27. package/dist/admin/editors/fontSizeExtension.js +1 -1
  28. package/dist/admin/editors/fontSizeExtension.js.map +1 -1
  29. package/dist/admin/forms/FormsPanel.js +9 -9
  30. package/dist/admin/index.d.ts +16 -16
  31. package/dist/admin/index.js +16 -16
  32. package/dist/admin/lib/mediaUsage.js +1 -1
  33. package/dist/admin/lib/pagesClient.d.ts +1 -1
  34. package/dist/admin/lib/pagesClient.js +11 -7
  35. package/dist/admin/lib/pagesClient.js.map +1 -1
  36. package/dist/admin/lib/sanitizeDraft.d.ts +9 -0
  37. package/dist/admin/lib/sanitizeDraft.js +28 -0
  38. package/dist/admin/lib/sanitizeDraft.js.map +1 -0
  39. package/dist/admin/lib/symbolsClient.d.ts +1 -1
  40. package/dist/admin/lib/symbolsClient.js +3 -3
  41. package/dist/admin/lib/upload.js +3 -3
  42. package/dist/admin/lib/useNestedDialog.d.ts +15 -0
  43. package/dist/admin/lib/useNestedDialog.js +23 -0
  44. package/dist/admin/lib/useNestedDialog.js.map +1 -0
  45. package/dist/admin/lib/zodFields.d.ts +4 -18
  46. package/dist/admin/lib/zodFields.js +54 -35
  47. package/dist/admin/lib/zodFields.js.map +1 -1
  48. package/dist/admin/media/MediaManager.js +7 -7
  49. package/dist/admin/media/MediaPicker.js +7 -7
  50. package/dist/admin/media/MediaPicker.js.map +1 -1
  51. package/dist/admin/pages/PageEditor.d.ts +1 -1
  52. package/dist/admin/pages/PageEditor.js +13 -13
  53. package/dist/admin/pages/PagesPanel.js +30 -30
  54. package/dist/admin/pages/PagesPanel.js.map +1 -1
  55. package/dist/admin/panelRegistry.js +7 -7
  56. package/dist/admin/patterns/PatternInserter.d.ts +1 -1
  57. package/dist/admin/patterns/PatternInserter.js +5 -5
  58. package/dist/admin/patterns/PatternInserter.js.map +1 -1
  59. package/dist/admin/settings/MailSettings.js +5 -5
  60. package/dist/admin/settings/MailTemplates.d.ts +1 -1
  61. package/dist/admin/settings/MailTemplates.js +5 -5
  62. package/dist/admin/settings/SettingsPanel.js +20 -20
  63. package/dist/admin/settings/SettingsPanel.js.map +1 -1
  64. package/dist/admin/settings/SnapshotsCard.js +5 -5
  65. package/dist/admin/settings/moduleSettingsForm.d.ts +1 -1
  66. package/dist/admin/settings/moduleSettingsForm.js +4 -4
  67. package/dist/admin/settings/moduleSettingsForm.js.map +1 -1
  68. package/dist/admin/shop/CategoriesTab.js +8 -8
  69. package/dist/admin/shop/ConnectionsTab.js +3 -3
  70. package/dist/admin/shop/DiscountsTab.js +8 -8
  71. package/dist/admin/shop/OrdersTab.js +10 -10
  72. package/dist/admin/shop/OrdersTab.js.map +1 -1
  73. package/dist/admin/shop/ProductsTab.js +10 -10
  74. package/dist/admin/shop/ShopPanel.js +9 -9
  75. package/dist/admin/shop/ShopSettingsTab.js +4 -4
  76. package/dist/admin/shop/index.d.ts +2 -2
  77. package/dist/admin/shop/index.js +2 -2
  78. package/dist/admin/shop/lib.js +2 -2
  79. package/dist/admin/stats/StatsPanel.js +2 -2
  80. package/dist/admin/ui/ArrayEditor.js +1 -1
  81. package/dist/admin/ui/PanelIcon.d.ts +3 -0
  82. package/dist/admin/ui/PanelIcon.js +34 -0
  83. package/dist/admin/ui/PanelIcon.js.map +1 -0
  84. package/dist/admin/ui/dialog.d.ts +21 -6
  85. package/dist/admin/ui/dialog.js +55 -34
  86. package/dist/admin/ui/dialog.js.map +1 -1
  87. package/dist/admin/ui/index.d.ts +7 -7
  88. package/dist/admin/ui/index.js +7 -7
  89. package/dist/admin/ui/primitives.js +1 -1
  90. package/dist/admin/ui/tabs.js +1 -1
  91. package/dist/admin/visual/TranslationPanel.d.ts +1 -1
  92. package/dist/admin/visual/TranslationPanel.js +3 -3
  93. package/dist/admin/visual/VisualEditor.js +47 -25
  94. package/dist/admin/visual/VisualEditor.js.map +1 -1
  95. package/dist/admin.css +2 -1
  96. package/dist/agentFiles/catalog.d.ts +2 -2
  97. package/dist/agentFiles/catalog.js +6 -5
  98. package/dist/agentFiles/catalog.js.map +1 -1
  99. package/dist/agentFiles/files.d.ts +5 -5
  100. package/dist/agentFiles/files.js +17 -17
  101. package/dist/agentFiles/files.js.map +1 -1
  102. package/dist/all.d.ts +4 -4
  103. package/dist/all.js +6 -6
  104. package/dist/auth/AuthProvider.d.ts +2 -2
  105. package/dist/auth/AuthProvider.js +51 -28
  106. package/dist/auth/AuthProvider.js.map +1 -1
  107. package/dist/auth/LoginForm.js +1 -1
  108. package/dist/auth/roles.js +4 -1
  109. package/dist/auth/roles.js.map +1 -1
  110. package/dist/blocks/BlockRenderer.d.ts +1 -1
  111. package/dist/blocks/BlockRenderer.js +3 -3
  112. package/dist/blocks/blockStyle.d.ts +1 -1
  113. package/dist/blocks/builtins/Accordion.d.ts +1 -1
  114. package/dist/blocks/builtins/Accordion.js +13 -6
  115. package/dist/blocks/builtins/Accordion.js.map +1 -1
  116. package/dist/blocks/builtins/Agenda.d.ts +1 -1
  117. package/dist/blocks/builtins/Agenda.js +5 -5
  118. package/dist/blocks/builtins/Banner.d.ts +1 -1
  119. package/dist/blocks/builtins/Banner.js +2 -2
  120. package/dist/blocks/builtins/BeforeAfter.d.ts +1 -1
  121. package/dist/blocks/builtins/BeforeAfter.js +4 -4
  122. package/dist/blocks/builtins/BeforeAfter.js.map +1 -1
  123. package/dist/blocks/builtins/Booking.d.ts +1 -1
  124. package/dist/blocks/builtins/Booking.js +5 -5
  125. package/dist/blocks/builtins/Breadcrumbs.d.ts +1 -1
  126. package/dist/blocks/builtins/Breadcrumbs.js +3 -3
  127. package/dist/blocks/builtins/Cards.d.ts +1 -1
  128. package/dist/blocks/builtins/Cards.js +5 -5
  129. package/dist/blocks/builtins/Cards.js.map +1 -1
  130. package/dist/blocks/builtins/Columns.d.ts +1 -1
  131. package/dist/blocks/builtins/Columns.js +4 -4
  132. package/dist/blocks/builtins/Contact.d.ts +3 -3
  133. package/dist/blocks/builtins/Contact.js +4 -4
  134. package/dist/blocks/builtins/Countdown.d.ts +1 -1
  135. package/dist/blocks/builtins/Countdown.js +4 -4
  136. package/dist/blocks/builtins/Countdown.js.map +1 -1
  137. package/dist/blocks/builtins/Cta.d.ts +1 -1
  138. package/dist/blocks/builtins/Cta.js +3 -3
  139. package/dist/blocks/builtins/Downloads.d.ts +1 -1
  140. package/dist/blocks/builtins/Downloads.js +4 -4
  141. package/dist/blocks/builtins/Elements.d.ts +3 -3
  142. package/dist/blocks/builtins/Elements.js +3 -3
  143. package/dist/blocks/builtins/Embed.d.ts +1 -1
  144. package/dist/blocks/builtins/Embed.js +3 -3
  145. package/dist/blocks/builtins/Faq.d.ts +1 -1
  146. package/dist/blocks/builtins/Faq.js +14 -6
  147. package/dist/blocks/builtins/Faq.js.map +1 -1
  148. package/dist/blocks/builtins/FormBlock.d.ts +1 -1
  149. package/dist/blocks/builtins/FormBlock.js +28 -18
  150. package/dist/blocks/builtins/FormBlock.js.map +1 -1
  151. package/dist/blocks/builtins/Gallery.d.ts +2 -2
  152. package/dist/blocks/builtins/Gallery.js +5 -5
  153. package/dist/blocks/builtins/Hero.d.ts +1 -1
  154. package/dist/blocks/builtins/Hero.js +4 -4
  155. package/dist/blocks/builtins/ImageBlock.d.ts +1 -1
  156. package/dist/blocks/builtins/ImageBlock.js +3 -3
  157. package/dist/blocks/builtins/Jobs.d.ts +2 -2
  158. package/dist/blocks/builtins/Jobs.js +5 -5
  159. package/dist/blocks/builtins/Layout.d.ts +2 -2
  160. package/dist/blocks/builtins/Layout.js +4 -4
  161. package/dist/blocks/builtins/MapBlock.d.ts +1 -1
  162. package/dist/blocks/builtins/MapBlock.js +3 -3
  163. package/dist/blocks/builtins/NewsListBlock.d.ts +1 -1
  164. package/dist/blocks/builtins/NewsListBlock.js +4 -4
  165. package/dist/blocks/builtins/Newsletter.d.ts +1 -1
  166. package/dist/blocks/builtins/Newsletter.js +7 -7
  167. package/dist/blocks/builtins/Newsletter.js.map +1 -1
  168. package/dist/blocks/builtins/OpenNowBadge.d.ts +1 -1
  169. package/dist/blocks/builtins/OpenNowBadge.js +8 -3
  170. package/dist/blocks/builtins/OpenNowBadge.js.map +1 -1
  171. package/dist/blocks/builtins/OpeningHours.d.ts +1 -1
  172. package/dist/blocks/builtins/OpeningHours.js +6 -6
  173. package/dist/blocks/builtins/PdfBlock.d.ts +1 -1
  174. package/dist/blocks/builtins/PdfBlock.js +3 -3
  175. package/dist/blocks/builtins/Portfolio.d.ts +1 -1
  176. package/dist/blocks/builtins/Portfolio.js +5 -5
  177. package/dist/blocks/builtins/Pricing.d.ts +2 -2
  178. package/dist/blocks/builtins/Pricing.js +5 -5
  179. package/dist/blocks/builtins/Pricing.js.map +1 -1
  180. package/dist/blocks/builtins/RichTextBlock.d.ts +1 -1
  181. package/dist/blocks/builtins/RichTextBlock.js +2 -2
  182. package/dist/blocks/builtins/RichTextBlock.js.map +1 -1
  183. package/dist/blocks/builtins/Search.d.ts +1 -1
  184. package/dist/blocks/builtins/Search.js +9 -7
  185. package/dist/blocks/builtins/Search.js.map +1 -1
  186. package/dist/blocks/builtins/Sections.d.ts +4 -4
  187. package/dist/blocks/builtins/Sections.js +4 -4
  188. package/dist/blocks/builtins/Slider.d.ts +1 -1
  189. package/dist/blocks/builtins/Slider.js +3 -3
  190. package/dist/blocks/builtins/Spacer.d.ts +1 -1
  191. package/dist/blocks/builtins/Spacer.js +2 -2
  192. package/dist/blocks/builtins/SymbolRef.d.ts +1 -1
  193. package/dist/blocks/builtins/SymbolRef.js +31 -17
  194. package/dist/blocks/builtins/SymbolRef.js.map +1 -1
  195. package/dist/blocks/builtins/Team.d.ts +1 -1
  196. package/dist/blocks/builtins/Team.js +4 -4
  197. package/dist/blocks/builtins/Testimonials.d.ts +2 -2
  198. package/dist/blocks/builtins/Testimonials.js +4 -4
  199. package/dist/blocks/builtins/Video.d.ts +2 -2
  200. package/dist/blocks/builtins/Video.js +4 -4
  201. package/dist/blocks/builtins/Video.js.map +1 -1
  202. package/dist/blocks/builtins/WhatsappChat.d.ts +1 -1
  203. package/dist/blocks/builtins/WhatsappChat.js +2 -2
  204. package/dist/blocks/builtins/Widgets.d.ts +12 -12
  205. package/dist/blocks/builtins/Widgets.js +19 -19
  206. package/dist/blocks/builtins/Widgets.js.map +1 -1
  207. package/dist/blocks/builtins/consentEmbed.js +2 -2
  208. package/dist/blocks/builtins/index.d.ts +40 -40
  209. package/dist/blocks/builtins/index.js +40 -40
  210. package/dist/blocks/builtins/lib/submitForm.js +5 -3
  211. package/dist/blocks/builtins/lib/submitForm.js.map +1 -1
  212. package/dist/blocks/context.d.ts +1 -1
  213. package/dist/blocks/customTemplate/definition.d.ts +3 -3
  214. package/dist/blocks/customTemplate/definition.js +6 -6
  215. package/dist/blocks/customTemplate/definition.js.map +1 -1
  216. package/dist/blocks/customTemplate/interpret.js +1 -1
  217. package/dist/blocks/index.d.ts +5 -5
  218. package/dist/blocks/index.js +5 -5
  219. package/dist/blocks/registry.d.ts +17 -7
  220. package/dist/blocks/registry.js +2 -1
  221. package/dist/blocks/registry.js.map +1 -1
  222. package/dist/components/EditBar.js +3 -3
  223. package/dist/components/FeedbackWidget.js +4 -4
  224. package/dist/components/News.d.ts +1 -1
  225. package/dist/components/News.js +50 -37
  226. package/dist/components/News.js.map +1 -1
  227. package/dist/components/PageView.js +11 -8
  228. package/dist/components/PageView.js.map +1 -1
  229. package/dist/components/ResponsiveImage.d.ts +1 -1
  230. package/dist/components/site/SiteFooter.d.ts +1 -1
  231. package/dist/components/site/SiteFooter.js +2 -2
  232. package/dist/config.d.ts +1 -1
  233. package/dist/demo/DemoStudio.js +3 -3
  234. package/dist/demo/demoStore.d.ts +3 -3
  235. package/dist/demo/index.d.ts +2 -2
  236. package/dist/demo/index.js +2 -2
  237. package/dist/editor/EditorProvider.js +1 -1
  238. package/dist/firebase/admin.d.ts +0 -2
  239. package/dist/firebase/admin.js +0 -6
  240. package/dist/firebase/admin.js.map +1 -1
  241. package/dist/firebase/appcheck.d.ts +1 -1
  242. package/dist/firebase/appcheck.js +5 -3
  243. package/dist/firebase/appcheck.js.map +1 -1
  244. package/dist/firebase/client.d.ts +2 -1
  245. package/dist/firebase/client.js +2 -14
  246. package/dist/firebase/client.js.map +1 -1
  247. package/dist/firebase/config.d.ts +31 -0
  248. package/dist/firebase/config.js +39 -0
  249. package/dist/firebase/config.js.map +1 -0
  250. package/dist/firebase/feedback.js +5 -3
  251. package/dist/firebase/feedback.js.map +1 -1
  252. package/dist/i18n/overlay.d.ts +2 -2
  253. package/dist/i18n/overlay.js +6 -4
  254. package/dist/i18n/overlay.js.map +1 -1
  255. package/dist/index.d.ts +45 -44
  256. package/dist/index.js +35 -33
  257. package/dist/index.js.map +1 -1
  258. package/dist/lock/DemoLock.js +1 -1
  259. package/dist/modules/builtins.d.ts +1 -1
  260. package/dist/modules/builtins.js +53 -55
  261. package/dist/modules/builtins.js.map +1 -1
  262. package/dist/modules/consent/ConsentBanner.js +1 -1
  263. package/dist/modules/consent/useConsent.js +1 -1
  264. package/dist/modules/context.d.ts +1 -1
  265. package/dist/modules/contract.d.ts +1 -1
  266. package/dist/modules/defineModule.d.ts +1 -1
  267. package/dist/modules/index.d.ts +9 -9
  268. package/dist/modules/index.js +8 -8
  269. package/dist/modules/overrides.d.ts +1 -1
  270. package/dist/modules/registry.d.ts +2 -7
  271. package/dist/modules/registry.js +2 -1
  272. package/dist/modules/registry.js.map +1 -1
  273. package/dist/modules/shop/blocks/Cart.d.ts +1 -1
  274. package/dist/modules/shop/blocks/Cart.js +6 -6
  275. package/dist/modules/shop/blocks/Checkout.d.ts +1 -1
  276. package/dist/modules/shop/blocks/Checkout.js +6 -6
  277. package/dist/modules/shop/blocks/Donation.d.ts +1 -1
  278. package/dist/modules/shop/blocks/Donation.js +5 -5
  279. package/dist/modules/shop/blocks/OrderStatus.d.ts +1 -1
  280. package/dist/modules/shop/blocks/OrderStatus.js +5 -5
  281. package/dist/modules/shop/blocks/ProductDetail.d.ts +1 -1
  282. package/dist/modules/shop/blocks/ProductDetail.js +8 -8
  283. package/dist/modules/shop/blocks/ProductGrid.d.ts +3 -3
  284. package/dist/modules/shop/blocks/ProductGrid.js +7 -7
  285. package/dist/modules/shop/blocks/ShopCategories.d.ts +1 -1
  286. package/dist/modules/shop/blocks/ShopCategories.js +6 -6
  287. package/dist/modules/shop/index.d.ts +5 -5
  288. package/dist/modules/shop/index.js +5 -5
  289. package/dist/modules/shop/lib.d.ts +2 -2
  290. package/dist/modules/shop/lib.js +18 -13
  291. package/dist/modules/shop/lib.js.map +1 -1
  292. package/dist/modules/shop/module.d.ts +1 -1
  293. package/dist/modules/shop/module.js +9 -9
  294. package/dist/modules/shop/settings.d.ts +18 -50
  295. package/dist/modules/shop/settings.js +16 -16
  296. package/dist/modules/shop/settings.js.map +1 -1
  297. package/dist/modules/shop/strings.js +1 -1
  298. package/dist/modules/shop/types.d.ts +1 -1
  299. package/dist/modules/types.d.ts +2 -2
  300. package/dist/patterns/builtins.d.ts +1 -1
  301. package/dist/patterns/builtins.js +1 -1
  302. package/dist/patterns/index.d.ts +2 -2
  303. package/dist/patterns/index.js +2 -2
  304. package/dist/render/PageRenderer.d.ts +2 -2
  305. package/dist/render/PageRenderer.js +1 -1
  306. package/dist/render/PublishedPage.d.ts +1 -1
  307. package/dist/render/PublishedPage.js +2 -2
  308. package/dist/schema/blocks.d.ts +6793 -15095
  309. package/dist/schema/blocks.js +335 -355
  310. package/dist/schema/blocks.js.map +1 -1
  311. package/dist/schema/customBlocks.d.ts +10 -29
  312. package/dist/schema/customBlocks.js +14 -13
  313. package/dist/schema/customBlocks.js.map +1 -1
  314. package/dist/schema/fields.d.ts +10 -16
  315. package/dist/schema/fields.js +37 -37
  316. package/dist/schema/fields.js.map +1 -1
  317. package/dist/schema/forms.d.ts +62 -111
  318. package/dist/schema/forms.js +17 -17
  319. package/dist/schema/forms.js.map +1 -1
  320. package/dist/schema/index.d.ts +7 -7
  321. package/dist/schema/index.js +7 -7
  322. package/dist/schema/mail.d.ts +39 -87
  323. package/dist/schema/mail.js +4 -4
  324. package/dist/schema/mail.js.map +1 -1
  325. package/dist/schema/pages.d.ts +152 -674
  326. package/dist/schema/pages.js +26 -15
  327. package/dist/schema/pages.js.map +1 -1
  328. package/dist/schema/seo.d.ts +9 -27
  329. package/dist/schema/seo.js +7 -7
  330. package/dist/schema/seo.js.map +1 -1
  331. package/dist/schema/settings.d.ts +218 -1074
  332. package/dist/schema/settings.js +55 -55
  333. package/dist/schema/settings.js.map +1 -1
  334. package/dist/schema/shop.d.ts +470 -1214
  335. package/dist/schema/shop.js +124 -124
  336. package/dist/schema/shop.js.map +1 -1
  337. package/dist/schema/siteConfig.d.ts +73 -597
  338. package/dist/schema/siteConfig.js +17 -17
  339. package/dist/schema/siteConfig.js.map +1 -1
  340. package/dist/schema/symbols.d.ts +34 -191
  341. package/dist/schema/symbols.js +8 -8
  342. package/dist/schema/symbols.js.map +1 -1
  343. package/dist/server/auth.d.ts +17 -0
  344. package/dist/server/auth.js +11 -0
  345. package/dist/server/auth.js.map +1 -0
  346. package/dist/server/bundle.d.ts +15 -6
  347. package/dist/server/bundle.js +5 -1
  348. package/dist/server/bundle.js.map +1 -1
  349. package/dist/server/draft.d.ts +16 -0
  350. package/dist/server/draft.js +12 -0
  351. package/dist/server/draft.js.map +1 -0
  352. package/dist/server/env.js +8 -8
  353. package/dist/server/env.js.map +1 -1
  354. package/dist/server/index.d.ts +10 -8
  355. package/dist/server/index.js +12 -9
  356. package/dist/server/index.js.map +1 -1
  357. package/dist/server/pages.d.ts +14 -7
  358. package/dist/server/pages.js +183 -17
  359. package/dist/server/pages.js.map +1 -1
  360. package/dist/server/revalidate.d.ts +6 -0
  361. package/dist/server/revalidate.js +40 -0
  362. package/dist/server/revalidate.js.map +1 -0
  363. package/dist/server/seo.d.ts +3 -3
  364. package/dist/server/seo.js +1 -1
  365. package/dist/server/shop.d.ts +3 -3
  366. package/dist/server/shop.js +6 -3
  367. package/dist/server/shop.js.map +1 -1
  368. package/dist/settings/useSiteSettings.d.ts +2 -2
  369. package/dist/settings/useSiteSettings.js +48 -28
  370. package/dist/settings/useSiteSettings.js.map +1 -1
  371. package/dist/styles.css +4 -1
  372. package/dist/theme/presets.d.ts +1 -1
  373. package/package.json +35 -34
@@ -1,102 +1,102 @@
1
- import { z } from "zod";
1
+ import * as z from "zod/mini";
2
2
  const ShowIfSchema = z.object({
3
3
  /** Sleutel van het veld (zelfde niveau) waarvan de waarde bepaalt of dit veld toont. */
4
- field: z.string().min(1),
4
+ field: z.string().check(z.minLength(1)),
5
5
  /** Toon alléén bij exact deze waarde. Weggelaten → toon bij een truthy waarde. */
6
- equals: z.union([z.string(), z.number(), z.boolean()]).optional()
6
+ equals: z.optional(z.union([z.string(), z.number(), z.boolean()]))
7
7
  });
8
8
  const base = {
9
9
  /** Sleutel in het waarden-object (dotted paths niet toegestaan; nesting via group/repeater). */
10
- key: z.string().min(1).regex(/^[a-zA-Z][a-zA-Z0-9]*$/, "veldsleutel: letters/cijfers, begint met letter"),
10
+ key: z.string().check(z.minLength(1)).check(z.regex(/^[a-zA-Z][a-zA-Z0-9]*$/, "veldsleutel: letters/cijfers, begint met letter")),
11
11
  /** Leesbaar label (NL). */
12
- label: z.string().default(""),
12
+ label: z._default(z.string(), ""),
13
13
  /** Optionele hint onder het veld. */
14
- hint: z.string().optional(),
14
+ hint: z.optional(z.string()),
15
15
  /** Conditioneel tonen (primo's Condition). */
16
- showIf: ShowIfSchema.optional()
16
+ showIf: z.optional(ShowIfSchema)
17
17
  };
18
- const selectOption = z.object({ value: z.string(), label: z.string().default("") });
18
+ const selectOption = z.object({ value: z.string(), label: z._default(z.string(), "") });
19
19
  const FieldSchema = z.lazy(
20
20
  () => z.discriminatedUnion("type", [
21
- z.object({ ...base, type: z.literal("text"), maxLength: z.number().int().positive().optional(), placeholder: z.string().optional() }),
22
- z.object({ ...base, type: z.literal("textarea"), maxLength: z.number().int().positive().optional(), rows: z.number().int().positive().optional() }),
21
+ z.object({ ...base, type: z.literal("text"), maxLength: z.optional(z.int().check(z.positive())), placeholder: z.optional(z.string()) }),
22
+ z.object({ ...base, type: z.literal("textarea"), maxLength: z.optional(z.int().check(z.positive())), rows: z.optional(z.int().check(z.positive())) }),
23
23
  z.object({ ...base, type: z.literal("richtext") }),
24
- z.object({ ...base, type: z.literal("number"), min: z.number().optional(), max: z.number().optional(), step: z.number().optional() }),
25
- z.object({ ...base, type: z.literal("slider"), min: z.number(), max: z.number(), step: z.number().optional() }),
24
+ z.object({ ...base, type: z.literal("number"), min: z.optional(z.number()), max: z.optional(z.number()), step: z.optional(z.number()) }),
25
+ z.object({ ...base, type: z.literal("slider"), min: z.number(), max: z.number(), step: z.optional(z.number()) }),
26
26
  z.object({ ...base, type: z.literal("switch") }),
27
- z.object({ ...base, type: z.literal("select"), options: z.array(selectOption).min(1).max(50) }),
27
+ z.object({ ...base, type: z.literal("select"), options: z.array(selectOption).check(z.minLength(1)).check(z.maxLength(50)) }),
28
28
  z.object({ ...base, type: z.literal("date") }),
29
29
  z.object({ ...base, type: z.literal("icon") }),
30
30
  z.object({ ...base, type: z.literal("image") }),
31
31
  z.object({ ...base, type: z.literal("url") }),
32
32
  z.object({ ...base, type: z.literal("link") }),
33
- z.object({ ...base, type: z.literal("group"), fields: z.array(FieldSchema).max(30) }),
34
- z.object({ ...base, type: z.literal("repeater"), fields: z.array(FieldSchema).max(30), max: z.number().int().positive().optional(), itemLabel: z.string().optional() }),
33
+ z.object({ ...base, type: z.literal("group"), fields: z.array(FieldSchema).check(z.maxLength(30)) }),
34
+ z.object({ ...base, type: z.literal("repeater"), fields: z.array(FieldSchema).check(z.maxLength(30)), max: z.optional(z.int().check(z.positive())), itemLabel: z.optional(z.string()) }),
35
35
  z.object({ ...base, type: z.literal("pageRef") }),
36
36
  z.object({ ...base, type: z.literal("info"), text: z.string() }),
37
37
  z.object({ ...base, type: z.literal("json") })
38
38
  ])
39
39
  );
40
- const FieldsSchema = z.array(FieldSchema).max(40).superRefine((fields, ctx) => {
40
+ const FieldsSchema = z.array(FieldSchema).check(z.maxLength(40)).check((ctx) => {
41
41
  const seen = /* @__PURE__ */ new Set();
42
- for (const f of fields) {
43
- if (seen.has(f.key)) ctx.addIssue({ code: z.ZodIssueCode.custom, message: `dubbele veldsleutel "${f.key}"` });
42
+ for (const f of ctx.value) {
43
+ if (seen.has(f.key)) ctx.issues.push({ code: "custom", input: ctx.value, message: `dubbele veldsleutel "${f.key}"` });
44
44
  seen.add(f.key);
45
45
  }
46
46
  });
47
47
  function isRichTextKey(key) {
48
48
  return key === "html" || key.endsWith("Html");
49
49
  }
50
- const linkValue = z.object({ label: z.string().max(200).default(""), href: z.string().max(2e3).default("") });
50
+ const linkValue = z.object({ label: z._default(z.string().check(z.maxLength(200)), ""), href: z._default(z.string().check(z.maxLength(2e3)), "") });
51
51
  function fieldsToZod(fields) {
52
52
  const shape = {};
53
53
  for (const f of fields) {
54
54
  const s = fieldToZod(f);
55
- if (s) shape[f.key] = f.label ? s.describe(f.label) : s;
55
+ if (s) shape[f.key] = f.label ? s.register(z.globalRegistry, { description: f.label }) : s;
56
56
  }
57
57
  return z.object(shape);
58
58
  }
59
59
  function fieldToZod(f) {
60
60
  switch (f.type) {
61
61
  case "text":
62
- return z.string().max(f.maxLength ?? 500).default("");
62
+ return z._default(z.string().check(z.maxLength(f.maxLength ?? 500)), "");
63
63
  case "textarea":
64
- return z.string().max(f.maxLength ?? 5e3).default("");
64
+ return z._default(z.string().check(z.maxLength(f.maxLength ?? 5e3)), "");
65
65
  case "richtext":
66
- return z.string().max(5e4).default("");
66
+ return z._default(z.string().check(z.maxLength(5e4)), "");
67
67
  case "number": {
68
68
  let n = z.number();
69
- if (f.min != null) n = n.min(f.min);
70
- if (f.max != null) n = n.max(f.max);
71
- return n.optional();
69
+ if (f.min != null) n = n.check(z.minimum(f.min));
70
+ if (f.max != null) n = n.check(z.maximum(f.max));
71
+ return z.optional(n);
72
72
  }
73
73
  case "slider":
74
- return z.number().min(f.min).max(f.max).default(f.min);
74
+ return z._default(z.number().check(z.minimum(f.min)).check(z.maximum(f.max)), f.min);
75
75
  case "switch":
76
- return z.boolean().default(false);
76
+ return z._default(z.boolean(), false);
77
77
  case "select": {
78
78
  const values = f.options.map((o) => o.value);
79
- return values.length > 0 ? z.enum([values[0], ...values.slice(1)]).default(values[0]) : z.string().default("");
79
+ return values.length > 0 ? z._default(z.enum([values[0], ...values.slice(1)]), values[0]) : z._default(z.string(), "");
80
80
  }
81
81
  case "date":
82
- return z.string().regex(/^(\d{4}-\d{2}-\d{2})?$/, "datum als jjjj-mm-dd").default("");
82
+ return z._default(z.string().check(z.regex(/^(\d{4}-\d{2}-\d{2})?$/, "datum als jjjj-mm-dd")), "");
83
83
  case "icon":
84
- return z.string().max(16).default("");
84
+ return z._default(z.string().check(z.maxLength(16)), "");
85
85
  case "image":
86
86
  case "url":
87
- return z.string().max(2e3).default("");
87
+ return z._default(z.string().check(z.maxLength(2e3)), "");
88
88
  case "link":
89
- return linkValue.default({ label: "", href: "" });
89
+ return z._default(linkValue, { label: "", href: "" });
90
90
  case "group":
91
- return fieldsToZod(f.fields).default({});
91
+ return z._default(fieldsToZod(f.fields), {});
92
92
  case "repeater":
93
- return z.array(fieldsToZod(f.fields)).max(f.max ?? 100).default([]);
93
+ return z._default(z.array(fieldsToZod(f.fields)).check(z.maxLength(f.max ?? 100)), []);
94
94
  case "pageRef":
95
- return z.string().max(500).default("");
95
+ return z._default(z.string().check(z.maxLength(500)), "");
96
96
  case "info":
97
97
  return null;
98
98
  case "json":
99
- return z.unknown().optional();
99
+ return z.optional(z.unknown());
100
100
  }
101
101
  }
102
102
  function fieldsDefaults(fields) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/schema/fields.ts"],"sourcesContent":["/**\n * Field-IR (\"intermediate representation\") — het declaratieve veldmodel dat formulieren aandrijft.\n *\n * Geport concept + modelvorm uit primo (github.com/primocms/primo, MIT © Matthew Morris) — zie\n * THIRD_PARTY_LICENSES.md. Primo definieert velden als een Zod discriminated union met een\n * `config`-blob per type, nesting zonder recursieve schema's en conditionele velden (`Condition`).\n * XiCMS gebruikt dit model op twee plekken:\n *\n * 1. **Afgeleid**: `introspectToFields()` (admin/lib/zodFields.ts) leidt een Field-IR af uit de\n * bestaande Zod-block-schema's — de GenericEditor rendert die IR. De Zod-schema's blijven de\n * bron van waarheid; dit is puur de formulier-beschrijving.\n * 2. **Als data**: custom blocks (sites/{siteId}/customBlocks) slaan hun velddefinities als\n * Field-IR op in Firestore. `fieldsToZod()` genereert daaruit een echt Zod-schema zodat ook\n * runtime-gedefinieerde blokken de harde XiCMS-validatie houden.\n *\n * Server-safe (geen React). Nesting gaat via een `fields`-array in group/repeater — documentvorm,\n * geen aparte rows (Firestore-vriendelijk, en `z.lazy` dekt de recursie).\n */\nimport { z, type ZodTypeAny } from \"zod\";\n\n/** Conditioneel tonen: veld is zichtbaar als `field` (sibling-sleutel) matcht. */\nexport const ShowIfSchema = z.object({\n /** Sleutel van het veld (zelfde niveau) waarvan de waarde bepaalt of dit veld toont. */\n field: z.string().min(1),\n /** Toon alléén bij exact deze waarde. Weggelaten → toon bij een truthy waarde. */\n equals: z.union([z.string(), z.number(), z.boolean()]).optional(),\n});\nexport type ShowIf = z.infer<typeof ShowIfSchema>;\n\nconst base = {\n /** Sleutel in het waarden-object (dotted paths niet toegestaan; nesting via group/repeater). */\n key: z.string().min(1).regex(/^[a-zA-Z][a-zA-Z0-9]*$/, \"veldsleutel: letters/cijfers, begint met letter\"),\n /** Leesbaar label (NL). */\n label: z.string().default(\"\"),\n /** Optionele hint onder het veld. */\n hint: z.string().optional(),\n /** Conditioneel tonen (primo's Condition). */\n showIf: ShowIfSchema.optional(),\n};\n\n/** Selectie-optie voor `select`. */\nconst selectOption = z.object({ value: z.string(), label: z.string().default(\"\") });\n\n// ── Veldtypes (primo: Text, RichText, Number, Slider, Switch, Select, Date, Icon, Image, Url,\n// Link, Group, Repeater, Page, Info — hier op XiCMS-conventies gebracht) ──────────────────────\n\nexport type Field =\n | ({ type: \"text\"; maxLength?: number; placeholder?: string } & BaseShape)\n | ({ type: \"textarea\"; maxLength?: number; rows?: number } & BaseShape)\n | ({ type: \"richtext\" } & BaseShape)\n | ({ type: \"number\"; min?: number; max?: number; step?: number } & BaseShape)\n | ({ type: \"slider\"; min: number; max: number; step?: number } & BaseShape)\n | ({ type: \"switch\" } & BaseShape)\n | ({ type: \"select\"; options: { value: string; label: string }[] } & BaseShape)\n | ({ type: \"date\" } & BaseShape)\n | ({ type: \"icon\" } & BaseShape)\n | ({ type: \"image\" } & BaseShape)\n | ({ type: \"url\" } & BaseShape)\n | ({ type: \"link\" } & BaseShape)\n | ({ type: \"group\"; fields: Field[] } & BaseShape)\n | ({ type: \"repeater\"; fields: Field[]; max?: number; itemLabel?: string } & BaseShape)\n | ({ type: \"pageRef\" } & BaseShape)\n | ({ type: \"info\"; text: string } & BaseShape)\n | ({ type: \"json\" } & BaseShape);\n\ntype BaseShape = { key: string; label: string; hint?: string; showIf?: ShowIf };\n\n/** Zod-schema voor één veld-definitie (recursief via z.lazy voor group/repeater). */\nexport const FieldSchema: z.ZodType<Field> = z.lazy(() =>\n z.discriminatedUnion(\"type\", [\n z.object({ ...base, type: z.literal(\"text\"), maxLength: z.number().int().positive().optional(), placeholder: z.string().optional() }),\n z.object({ ...base, type: z.literal(\"textarea\"), maxLength: z.number().int().positive().optional(), rows: z.number().int().positive().optional() }),\n z.object({ ...base, type: z.literal(\"richtext\") }),\n z.object({ ...base, type: z.literal(\"number\"), min: z.number().optional(), max: z.number().optional(), step: z.number().optional() }),\n z.object({ ...base, type: z.literal(\"slider\"), min: z.number(), max: z.number(), step: z.number().optional() }),\n z.object({ ...base, type: z.literal(\"switch\") }),\n z.object({ ...base, type: z.literal(\"select\"), options: z.array(selectOption).min(1).max(50) }),\n z.object({ ...base, type: z.literal(\"date\") }),\n z.object({ ...base, type: z.literal(\"icon\") }),\n z.object({ ...base, type: z.literal(\"image\") }),\n z.object({ ...base, type: z.literal(\"url\") }),\n z.object({ ...base, type: z.literal(\"link\") }),\n z.object({ ...base, type: z.literal(\"group\"), fields: z.array(FieldSchema).max(30) }),\n z.object({ ...base, type: z.literal(\"repeater\"), fields: z.array(FieldSchema).max(30), max: z.number().int().positive().optional(), itemLabel: z.string().optional() }),\n z.object({ ...base, type: z.literal(\"pageRef\") }),\n z.object({ ...base, type: z.literal(\"info\"), text: z.string() }),\n z.object({ ...base, type: z.literal(\"json\") }),\n ]),\n) as z.ZodType<Field>;\n\n/** Een lijst velddefinities (bv. van een custom block). Unieke sleutels afgedwongen. */\nexport const FieldsSchema = z\n .array(FieldSchema)\n .max(40)\n .superRefine((fields, ctx) => {\n const seen = new Set<string>();\n for (const f of fields) {\n if (seen.has(f.key)) ctx.addIssue({ code: z.ZodIssueCode.custom, message: `dubbele veldsleutel \"${f.key}\"` });\n seen.add(f.key);\n }\n });\n\n/**\n * Rich-text-conventie (security): de sanitizer saneert alleen velden die `html` heten of op\n * `Html` eindigen. Een `richtext`-veld MOET dus zo'n sleutel hebben — afgedwongen waar Field-IR\n * als data binnenkomt (custom blocks), zodat er geen stored-XSS-gat ontstaat.\n */\nexport function isRichTextKey(key: string): boolean {\n return key === \"html\" || key.endsWith(\"Html\");\n}\n\n/** Waarde-sleutel van een link-veld: `{ label, href }`. */\nconst linkValue = z.object({ label: z.string().max(200).default(\"\"), href: z.string().max(2000).default(\"\") });\n\n/**\n * Genereert een Zod-waardenschema uit een Field-IR — de brug die runtime-gedefinieerde blokken\n * (custom blocks) dezelfde harde validatie geeft als code-gedefinieerde blokken. Alle velden\n * krijgen `.default()`/`.optional()` (update-veilig: bestaande content blijft geldig als er\n * velden bijkomen). `info`-velden zijn display-only en krijgen geen waarde.\n */\nexport function fieldsToZod(fields: Field[]): z.ZodObject<Record<string, ZodTypeAny>> {\n const shape: Record<string, ZodTypeAny> = {};\n for (const f of fields) {\n const s = fieldToZod(f);\n if (s) shape[f.key] = f.label ? s.describe(f.label) : s;\n }\n return z.object(shape);\n}\n\nfunction fieldToZod(f: Field): ZodTypeAny | null {\n switch (f.type) {\n case \"text\":\n return z.string().max(f.maxLength ?? 500).default(\"\");\n case \"textarea\":\n return z.string().max(f.maxLength ?? 5000).default(\"\");\n case \"richtext\":\n return z.string().max(50_000).default(\"\");\n case \"number\": {\n let n = z.number();\n if (f.min != null) n = n.min(f.min);\n if (f.max != null) n = n.max(f.max);\n return n.optional();\n }\n case \"slider\":\n return z.number().min(f.min).max(f.max).default(f.min);\n case \"switch\":\n return z.boolean().default(false);\n case \"select\": {\n const values = f.options.map((o) => o.value);\n return values.length > 0\n ? z.enum([values[0], ...values.slice(1)] as [string, ...string[]]).default(values[0])\n : z.string().default(\"\");\n }\n case \"date\":\n // ISO-datum (yyyy-mm-dd) of leeg.\n return z.string().regex(/^(\\d{4}-\\d{2}-\\d{2})?$/, \"datum als jjjj-mm-dd\").default(\"\");\n case \"icon\":\n return z.string().max(16).default(\"\");\n case \"image\":\n case \"url\":\n return z.string().max(2000).default(\"\");\n case \"link\":\n return linkValue.default({ label: \"\", href: \"\" });\n case \"group\":\n return fieldsToZod(f.fields).default({});\n case \"repeater\":\n return z.array(fieldsToZod(f.fields)).max(f.max ?? 100).default([]);\n case \"pageRef\":\n // Pad van een pagina binnen de site (\"/\", \"/contact\", …).\n return z.string().max(500).default(\"\");\n case \"info\":\n return null;\n case \"json\":\n return z.unknown().optional();\n }\n}\n\n/** Default-waarden voor een Field-IR (bv. een nieuw repeater-item). */\nexport function fieldsDefaults(fields: Field[]): Record<string, unknown> {\n return fieldsToZod(fields).parse({});\n}\n\n/**\n * Hints per veldsleutel (dotted path voor geneste velden, bv. \"items.date\") — verfijnt de uit een\n * Zod-schema afgeleide Field-IR. Gebruikt door `defineBlock({ fields })` + `introspectToFields`.\n */\nexport type FieldHints = Record<string, Partial<Field> & { type?: Field[\"type\"] }>;\n\n/** Evalueert `showIf` tegen de huidige waarden (zelfde niveau). Zonder showIf → altijd tonen. */\nexport function isFieldVisible(f: Field, values: Record<string, unknown>): boolean {\n if (!f.showIf) return true;\n const v = values[f.showIf.field];\n if (f.showIf.equals !== undefined) return v === f.showIf.equals;\n return Boolean(v);\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/schema/fields.ts"],"sourcesContent":["/**\n * Field-IR (\"intermediate representation\") — het declaratieve veldmodel dat formulieren aandrijft.\n *\n * Geport concept + modelvorm uit primo (github.com/primocms/primo, MIT © Matthew Morris) — zie\n * THIRD_PARTY_LICENSES.md. Primo definieert velden als een Zod discriminated union met een\n * `config`-blob per type, nesting zonder recursieve schema's en conditionele velden (`Condition`).\n * XiCMS gebruikt dit model op twee plekken:\n *\n * 1. **Afgeleid**: `introspectToFields()` (admin/lib/zodFields.ts) leidt een Field-IR af uit de\n * bestaande Zod-block-schema's — de GenericEditor rendert die IR. De Zod-schema's blijven de\n * bron van waarheid; dit is puur de formulier-beschrijving.\n * 2. **Als data**: custom blocks (sites/{siteId}/customBlocks) slaan hun velddefinities als\n * Field-IR op in Firestore. `fieldsToZod()` genereert daaruit een echt Zod-schema zodat ook\n * runtime-gedefinieerde blokken de harde XiCMS-validatie houden.\n *\n * Server-safe (geen React). Nesting gaat via een `fields`-array in group/repeater — documentvorm,\n * geen aparte rows (Firestore-vriendelijk, en `z.lazy` dekt de recursie).\n */\nimport * as z from \"zod/mini\";\n\n/** Zod 4 heeft `ZodTypeAny` afgeschaft; in mini is `z.ZodType` de losse bovengrens. */\ntype ZodTypeAny = z.ZodMiniType;\n\n/** Conditioneel tonen: veld is zichtbaar als `field` (sibling-sleutel) matcht. */\nexport const ShowIfSchema = z.object({\n /** Sleutel van het veld (zelfde niveau) waarvan de waarde bepaalt of dit veld toont. */\n field: z.string().check(z.minLength(1)),\n /** Toon alléén bij exact deze waarde. Weggelaten → toon bij een truthy waarde. */\n equals: z.optional(z.union([z.string(), z.number(), z.boolean()])),\n});\nexport type ShowIf = z.infer<typeof ShowIfSchema>;\n\nconst base = {\n /** Sleutel in het waarden-object (dotted paths niet toegestaan; nesting via group/repeater). */\n key: z.string().check(z.minLength(1)).check(z.regex(/^[a-zA-Z][a-zA-Z0-9]*$/, \"veldsleutel: letters/cijfers, begint met letter\")),\n /** Leesbaar label (NL). */\n label: z._default(z.string(), \"\"),\n /** Optionele hint onder het veld. */\n hint: z.optional(z.string()),\n /** Conditioneel tonen (primo's Condition). */\n showIf: z.optional(ShowIfSchema),\n};\n\n/** Selectie-optie voor `select`. */\nconst selectOption = z.object({ value: z.string(), label: z._default(z.string(), \"\") });\n\n// ── Veldtypes (primo: Text, RichText, Number, Slider, Switch, Select, Date, Icon, Image, Url,\n// Link, Group, Repeater, Page, Info — hier op XiCMS-conventies gebracht) ──────────────────────\n\nexport type Field =\n | ({ type: \"text\"; maxLength?: number; placeholder?: string } & BaseShape)\n | ({ type: \"textarea\"; maxLength?: number; rows?: number } & BaseShape)\n | ({ type: \"richtext\" } & BaseShape)\n | ({ type: \"number\"; min?: number; max?: number; step?: number } & BaseShape)\n | ({ type: \"slider\"; min: number; max: number; step?: number } & BaseShape)\n | ({ type: \"switch\" } & BaseShape)\n | ({ type: \"select\"; options: { value: string; label: string }[] } & BaseShape)\n | ({ type: \"date\" } & BaseShape)\n | ({ type: \"icon\" } & BaseShape)\n | ({ type: \"image\" } & BaseShape)\n | ({ type: \"url\" } & BaseShape)\n | ({ type: \"link\" } & BaseShape)\n | ({ type: \"group\"; fields: Field[] } & BaseShape)\n | ({ type: \"repeater\"; fields: Field[]; max?: number; itemLabel?: string } & BaseShape)\n | ({ type: \"pageRef\" } & BaseShape)\n | ({ type: \"info\"; text: string } & BaseShape)\n | ({ type: \"json\" } & BaseShape);\n\ntype BaseShape = { key: string; label: string; hint?: string; showIf?: ShowIf };\n\n/** Zod-schema voor één veld-definitie (recursief via z.lazy voor group/repeater). */\nexport const FieldSchema: z.ZodMiniType<Field> = z.lazy(() =>\n z.discriminatedUnion(\"type\", [\n z.object({ ...base, type: z.literal(\"text\"), maxLength: z.optional(z.int().check(z.positive())), placeholder: z.optional(z.string()) }),\n z.object({ ...base, type: z.literal(\"textarea\"), maxLength: z.optional(z.int().check(z.positive())), rows: z.optional(z.int().check(z.positive())) }),\n z.object({ ...base, type: z.literal(\"richtext\") }),\n z.object({ ...base, type: z.literal(\"number\"), min: z.optional(z.number()), max: z.optional(z.number()), step: z.optional(z.number()) }),\n z.object({ ...base, type: z.literal(\"slider\"), min: z.number(), max: z.number(), step: z.optional(z.number()) }),\n z.object({ ...base, type: z.literal(\"switch\") }),\n z.object({ ...base, type: z.literal(\"select\"), options: z.array(selectOption).check(z.minLength(1)).check(z.maxLength(50)) }),\n z.object({ ...base, type: z.literal(\"date\") }),\n z.object({ ...base, type: z.literal(\"icon\") }),\n z.object({ ...base, type: z.literal(\"image\") }),\n z.object({ ...base, type: z.literal(\"url\") }),\n z.object({ ...base, type: z.literal(\"link\") }),\n z.object({ ...base, type: z.literal(\"group\"), fields: z.array(FieldSchema).check(z.maxLength(30)) }),\n z.object({ ...base, type: z.literal(\"repeater\"), fields: z.array(FieldSchema).check(z.maxLength(30)), max: z.optional(z.int().check(z.positive())), itemLabel: z.optional(z.string()) }),\n z.object({ ...base, type: z.literal(\"pageRef\") }),\n z.object({ ...base, type: z.literal(\"info\"), text: z.string() }),\n z.object({ ...base, type: z.literal(\"json\") }),\n ]),\n) as z.ZodMiniType<Field>;\n\n/** Een lijst velddefinities (bv. van een custom block). Unieke sleutels afgedwongen. */\nexport const FieldsSchema = z.array(FieldSchema).check(z.maxLength(40)).check((ctx) => {\n const seen = new Set<string>();\n for (const f of ctx.value) {\n if (seen.has(f.key)) ctx.issues.push({ code: \"custom\", input: ctx.value, message: `dubbele veldsleutel \"${f.key}\"` });\n seen.add(f.key);\n }\n });\n\n/**\n * Rich-text-conventie (security): de sanitizer saneert alleen velden die `html` heten of op\n * `Html` eindigen. Een `richtext`-veld MOET dus zo'n sleutel hebben — afgedwongen waar Field-IR\n * als data binnenkomt (custom blocks), zodat er geen stored-XSS-gat ontstaat.\n */\nexport function isRichTextKey(key: string): boolean {\n return key === \"html\" || key.endsWith(\"Html\");\n}\n\n/** Waarde-sleutel van een link-veld: `{ label, href }`. */\nconst linkValue = z.object({ label: z._default(z.string().check(z.maxLength(200)), \"\"), href: z._default(z.string().check(z.maxLength(2000)), \"\") });\n\n/**\n * Genereert een Zod-waardenschema uit een Field-IR — de brug die runtime-gedefinieerde blokken\n * (custom blocks) dezelfde harde validatie geeft als code-gedefinieerde blokken. Alle velden\n * krijgen `.default()`/`.optional()` (update-veilig: bestaande content blijft geldig als er\n * velden bijkomen). `info`-velden zijn display-only en krijgen geen waarde.\n */\nexport function fieldsToZod(fields: Field[]): z.ZodMiniObject<Record<string, ZodTypeAny>> {\n const shape: Record<string, ZodTypeAny> = {};\n for (const f of fields) {\n const s = fieldToZod(f);\n if (s) shape[f.key] = f.label ? s.register(z.globalRegistry, { description: f.label }) : s;\n }\n return z.object(shape);\n}\n\nfunction fieldToZod(f: Field): ZodTypeAny | null {\n switch (f.type) {\n case \"text\":\n return z._default(z.string().check(z.maxLength(f.maxLength ?? 500)), \"\");\n case \"textarea\":\n return z._default(z.string().check(z.maxLength(f.maxLength ?? 5000)), \"\");\n case \"richtext\":\n return z._default(z.string().check(z.maxLength(50_000)), \"\");\n case \"number\": {\n let n = z.number();\n if (f.min != null) n = n.check(z.minimum(f.min));\n if (f.max != null) n = n.check(z.maximum(f.max));\n return z.optional(n);\n }\n case \"slider\":\n return z._default(z.number().check(z.minimum(f.min)).check(z.maximum(f.max)), f.min);\n case \"switch\":\n return z._default(z.boolean(), false);\n case \"select\": {\n const values = f.options.map((o) => o.value);\n return values.length > 0\n ? z._default(z.enum([values[0], ...values.slice(1)] as [string, ...string[]]), values[0])\n : z._default(z.string(), \"\");\n }\n case \"date\":\n // ISO-datum (yyyy-mm-dd) of leeg.\n return z._default(z.string().check(z.regex(/^(\\d{4}-\\d{2}-\\d{2})?$/, \"datum als jjjj-mm-dd\")), \"\");\n case \"icon\":\n return z._default(z.string().check(z.maxLength(16)), \"\");\n case \"image\":\n case \"url\":\n return z._default(z.string().check(z.maxLength(2000)), \"\");\n case \"link\":\n return z._default(linkValue, { label: \"\", href: \"\" });\n case \"group\":\n return z._default(fieldsToZod(f.fields), {});\n case \"repeater\":\n return z._default(z.array(fieldsToZod(f.fields)).check(z.maxLength(f.max ?? 100)), []);\n case \"pageRef\":\n // Pad van een pagina binnen de site (\"/\", \"/contact\", …).\n return z._default(z.string().check(z.maxLength(500)), \"\");\n case \"info\":\n return null;\n case \"json\":\n return z.optional(z.unknown());\n }\n}\n\n/** Default-waarden voor een Field-IR (bv. een nieuw repeater-item). */\nexport function fieldsDefaults(fields: Field[]): Record<string, unknown> {\n return fieldsToZod(fields).parse({});\n}\n\n/**\n * Hints per veldsleutel (dotted path voor geneste velden, bv. \"items.date\") — verfijnt de uit een\n * Zod-schema afgeleide Field-IR. Gebruikt door `defineBlock({ fields })` + `introspectToFields`.\n */\nexport type FieldHints = Record<string, Partial<Field> & { type?: Field[\"type\"] }>;\n\n/** Evalueert `showIf` tegen de huidige waarden (zelfde niveau). Zonder showIf → altijd tonen. */\nexport function isFieldVisible(f: Field, values: Record<string, unknown>): boolean {\n if (!f.showIf) return true;\n const v = values[f.showIf.field];\n if (f.showIf.equals !== undefined) return v === f.showIf.equals;\n return Boolean(v);\n}\n"],"mappings":"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","names":[]}
@@ -1,118 +1,69 @@
1
- import { z } from "zod";
2
- export declare const FieldTypeSchema: z.ZodEnum<["text", "email", "tel", "textarea", "select", "checkbox", "radio", "date", "number"]>;
3
- export type FieldType = z.infer<typeof FieldTypeSchema>;
4
- export declare const FormFieldSchema: z.ZodObject<{
5
- /** Stabiele sleutel; wordt de key in de inzending. */
6
- name: z.ZodString;
7
- label: z.ZodString;
8
- type: z.ZodEnum<["text", "email", "tel", "textarea", "select", "checkbox", "radio", "date", "number"]>;
9
- required: z.ZodDefault<z.ZodBoolean>;
10
- placeholder: z.ZodOptional<z.ZodString>;
11
- /** Opties voor type "select" en "radio". */
12
- options: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
13
- }, "strip", z.ZodTypeAny, {
14
- type: "number" | "date" | "text" | "email" | "textarea" | "select" | "checkbox" | "radio" | "tel";
15
- label: string;
16
- name: string;
17
- required: boolean;
18
- options?: string[] | undefined;
19
- placeholder?: string | undefined;
20
- }, {
21
- type: "number" | "date" | "text" | "email" | "textarea" | "select" | "checkbox" | "radio" | "tel";
22
- label: string;
23
- name: string;
24
- options?: string[] | undefined;
25
- placeholder?: string | undefined;
26
- required?: boolean | undefined;
1
+ import * as z from "zod/mini";
2
+ export declare const FieldTypeSchema: z.ZodMiniEnum<{
3
+ checkbox: "checkbox";
4
+ date: "date";
5
+ email: "email";
6
+ number: "number";
7
+ radio: "radio";
8
+ select: "select";
9
+ tel: "tel";
10
+ text: "text";
11
+ textarea: "textarea";
27
12
  }>;
13
+ export type FieldType = z.infer<typeof FieldTypeSchema>;
14
+ export declare const FormFieldSchema: z.ZodMiniObject<{
15
+ name: z.ZodMiniString<string>;
16
+ label: z.ZodMiniString<string>;
17
+ type: z.ZodMiniEnum<{
18
+ checkbox: "checkbox";
19
+ date: "date";
20
+ email: "email";
21
+ number: "number";
22
+ radio: "radio";
23
+ select: "select";
24
+ tel: "tel";
25
+ text: "text";
26
+ textarea: "textarea";
27
+ }>;
28
+ required: z.ZodMiniDefault<z.ZodMiniBoolean<boolean>>;
29
+ placeholder: z.ZodMiniOptional<z.ZodMiniString<string>>;
30
+ options: z.ZodMiniOptional<z.ZodMiniArray<z.ZodMiniString<string>>>;
31
+ }, z.core.$strip>;
28
32
  export type FormField = z.infer<typeof FormFieldSchema>;
29
33
  /** Een formulierdefinitie: `sites/{siteId}/forms/{formId}`. */
30
- export declare const FormSchema: z.ZodObject<{
31
- name: z.ZodString;
32
- fields: z.ZodArray<z.ZodObject<{
33
- /** Stabiele sleutel; wordt de key in de inzending. */
34
- name: z.ZodString;
35
- label: z.ZodString;
36
- type: z.ZodEnum<["text", "email", "tel", "textarea", "select", "checkbox", "radio", "date", "number"]>;
37
- required: z.ZodDefault<z.ZodBoolean>;
38
- placeholder: z.ZodOptional<z.ZodString>;
39
- /** Opties voor type "select" en "radio". */
40
- options: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
41
- }, "strip", z.ZodTypeAny, {
42
- type: "number" | "date" | "text" | "email" | "textarea" | "select" | "checkbox" | "radio" | "tel";
43
- label: string;
44
- name: string;
45
- required: boolean;
46
- options?: string[] | undefined;
47
- placeholder?: string | undefined;
48
- }, {
49
- type: "number" | "date" | "text" | "email" | "textarea" | "select" | "checkbox" | "radio" | "tel";
50
- label: string;
51
- name: string;
52
- options?: string[] | undefined;
53
- placeholder?: string | undefined;
54
- required?: boolean | undefined;
55
- }>, "many">;
56
- submitLabel: z.ZodDefault<z.ZodString>;
57
- successMessage: z.ZodDefault<z.ZodString>;
58
- /** Stuur na een geslaagde inzending door naar deze pagina (bv. een bedankt-pagina). */
59
- successRedirect: z.ZodOptional<z.ZodString>;
60
- /** Stuur de inzender een bevestigingsmail/kopie (naar het eerste e-mailveld van het formulier). */
61
- confirmSubmitter: z.ZodOptional<z.ZodBoolean>;
62
- /**
63
- * Kopie van elke inzending naar dit e-mailadres. Leeg = de site-brede notificatie-instelling
64
- * (Instellingen → E-mail → notificatie-adres, anders het contact-e-mailadres van de site).
65
- */
66
- notifyTo: z.ZodOptional<z.ZodString>;
67
- }, "strip", z.ZodTypeAny, {
68
- name: string;
69
- fields: {
70
- type: "number" | "date" | "text" | "email" | "textarea" | "select" | "checkbox" | "radio" | "tel";
71
- label: string;
72
- name: string;
73
- required: boolean;
74
- options?: string[] | undefined;
75
- placeholder?: string | undefined;
76
- }[];
77
- submitLabel: string;
78
- successMessage: string;
79
- notifyTo?: string | undefined;
80
- successRedirect?: string | undefined;
81
- confirmSubmitter?: boolean | undefined;
82
- }, {
83
- name: string;
84
- fields: {
85
- type: "number" | "date" | "text" | "email" | "textarea" | "select" | "checkbox" | "radio" | "tel";
86
- label: string;
87
- name: string;
88
- options?: string[] | undefined;
89
- placeholder?: string | undefined;
90
- required?: boolean | undefined;
91
- }[];
92
- notifyTo?: string | undefined;
93
- submitLabel?: string | undefined;
94
- successMessage?: string | undefined;
95
- successRedirect?: string | undefined;
96
- confirmSubmitter?: boolean | undefined;
97
- }>;
34
+ export declare const FormSchema: z.ZodMiniObject<{
35
+ name: z.ZodMiniString<string>;
36
+ fields: z.ZodMiniArray<z.ZodMiniObject<{
37
+ name: z.ZodMiniString<string>;
38
+ label: z.ZodMiniString<string>;
39
+ type: z.ZodMiniEnum<{
40
+ checkbox: "checkbox";
41
+ date: "date";
42
+ email: "email";
43
+ number: "number";
44
+ radio: "radio";
45
+ select: "select";
46
+ tel: "tel";
47
+ text: "text";
48
+ textarea: "textarea";
49
+ }>;
50
+ required: z.ZodMiniDefault<z.ZodMiniBoolean<boolean>>;
51
+ placeholder: z.ZodMiniOptional<z.ZodMiniString<string>>;
52
+ options: z.ZodMiniOptional<z.ZodMiniArray<z.ZodMiniString<string>>>;
53
+ }, z.core.$strip>>;
54
+ submitLabel: z.ZodMiniDefault<z.ZodMiniString<string>>;
55
+ successMessage: z.ZodMiniDefault<z.ZodMiniString<string>>;
56
+ successRedirect: z.ZodMiniOptional<z.ZodMiniString<string>>;
57
+ confirmSubmitter: z.ZodMiniOptional<z.ZodMiniBoolean<boolean>>;
58
+ notifyTo: z.ZodMiniOptional<z.ZodMiniString<string>>;
59
+ }, z.core.$strip>;
98
60
  export type FormDefinition = z.infer<typeof FormSchema>;
99
61
  /** Payload van een inzending (callable input). Per-veld-validatie gebeurt server-side
100
62
  * tegen de opgeslagen formulierdefinitie. */
101
- export declare const SubmissionInputSchema: z.ZodObject<{
102
- siteId: z.ZodString;
103
- formId: z.ZodString;
104
- values: z.ZodRecord<z.ZodString, z.ZodUnion<[z.ZodString, z.ZodBoolean]>>;
105
- /** Honeypot — moet leeg zijn (bot-detectie). */
106
- _hp: z.ZodOptional<z.ZodString>;
107
- }, "strip", z.ZodTypeAny, {
108
- values: Record<string, string | boolean>;
109
- formId: string;
110
- siteId: string;
111
- _hp?: string | undefined;
112
- }, {
113
- values: Record<string, string | boolean>;
114
- formId: string;
115
- siteId: string;
116
- _hp?: string | undefined;
117
- }>;
63
+ export declare const SubmissionInputSchema: z.ZodMiniObject<{
64
+ siteId: z.ZodMiniString<string>;
65
+ formId: z.ZodMiniString<string>;
66
+ values: z.ZodMiniRecord<z.ZodMiniString<string>, z.ZodMiniUnion<readonly [z.ZodMiniString<string>, z.ZodMiniBoolean<boolean>]>>;
67
+ _hp: z.ZodMiniOptional<z.ZodMiniString<string>>;
68
+ }, z.core.$strip>;
118
69
  export type SubmissionInput = z.infer<typeof SubmissionInputSchema>;
@@ -1,4 +1,4 @@
1
- import { z } from "zod";
1
+ import * as z from "zod/mini";
2
2
  const FieldTypeSchema = z.enum([
3
3
  "text",
4
4
  "email",
@@ -13,35 +13,35 @@ const FieldTypeSchema = z.enum([
13
13
  ]);
14
14
  const FormFieldSchema = z.object({
15
15
  /** Stabiele sleutel; wordt de key in de inzending. */
16
- name: z.string().min(1).max(60).regex(/^[a-zA-Z][a-zA-Z0-9_]*$/, "veldnaam moet met een letter beginnen en alleen letters/cijfers/_ bevatten"),
17
- label: z.string().min(1).max(160),
16
+ name: z.string().check(z.minLength(1)).check(z.maxLength(60)).check(z.regex(/^[a-zA-Z][a-zA-Z0-9_]*$/, "veldnaam moet met een letter beginnen en alleen letters/cijfers/_ bevatten")),
17
+ label: z.string().check(z.minLength(1)).check(z.maxLength(160)),
18
18
  type: FieldTypeSchema,
19
- required: z.boolean().default(false),
20
- placeholder: z.string().max(200).optional(),
19
+ required: z._default(z.boolean(), false),
20
+ placeholder: z.optional(z.string().check(z.maxLength(200))),
21
21
  /** Opties voor type "select" en "radio". */
22
- options: z.array(z.string().max(200)).max(50).optional()
22
+ options: z.optional(z.array(z.string().check(z.maxLength(200))).check(z.maxLength(50)))
23
23
  });
24
24
  const FormSchema = z.object({
25
- name: z.string().min(1).max(160),
26
- fields: z.array(FormFieldSchema).min(1).max(40),
27
- submitLabel: z.string().max(80).default("Versturen"),
28
- successMessage: z.string().max(500).default("Bedankt! We nemen snel contact op."),
25
+ name: z.string().check(z.minLength(1)).check(z.maxLength(160)),
26
+ fields: z.array(FormFieldSchema).check(z.minLength(1)).check(z.maxLength(40)),
27
+ submitLabel: z._default(z.string().check(z.maxLength(80)), "Versturen"),
28
+ successMessage: z._default(z.string().check(z.maxLength(500)), "Bedankt! We nemen snel contact op."),
29
29
  /** Stuur na een geslaagde inzending door naar deze pagina (bv. een bedankt-pagina). */
30
- successRedirect: z.string().max(400).optional(),
30
+ successRedirect: z.optional(z.string().check(z.maxLength(400))),
31
31
  /** Stuur de inzender een bevestigingsmail/kopie (naar het eerste e-mailveld van het formulier). */
32
- confirmSubmitter: z.boolean().optional(),
32
+ confirmSubmitter: z.optional(z.boolean()),
33
33
  /**
34
34
  * Kopie van elke inzending naar dit e-mailadres. Leeg = de site-brede notificatie-instelling
35
35
  * (Instellingen → E-mail → notificatie-adres, anders het contact-e-mailadres van de site).
36
36
  */
37
- notifyTo: z.string().max(200).optional()
37
+ notifyTo: z.optional(z.string().check(z.maxLength(200)))
38
38
  });
39
39
  const SubmissionInputSchema = z.object({
40
- siteId: z.string().min(1).max(80),
41
- formId: z.string().min(1).max(80),
42
- values: z.record(z.string(), z.union([z.string().max(5e3), z.boolean()])),
40
+ siteId: z.string().check(z.minLength(1)).check(z.maxLength(80)),
41
+ formId: z.string().check(z.minLength(1)).check(z.maxLength(80)),
42
+ values: z.record(z.string(), z.union([z.string().check(z.maxLength(5e3)), z.boolean()])),
43
43
  /** Honeypot — moet leeg zijn (bot-detectie). */
44
- _hp: z.string().max(0).optional()
44
+ _hp: z.optional(z.string().check(z.maxLength(0)))
45
45
  });
46
46
  export {
47
47
  FieldTypeSchema,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/schema/forms.ts"],"sourcesContent":["import { z } from \"zod\";\n\nexport const FieldTypeSchema = z.enum([\n \"text\",\n \"email\",\n \"tel\",\n \"textarea\",\n \"select\",\n \"checkbox\",\n // 4.16: update-veilig toegevoegd (oude definities blijven geldig).\n \"radio\",\n \"date\",\n \"number\",\n]);\nexport type FieldType = z.infer<typeof FieldTypeSchema>;\n\nexport const FormFieldSchema = z.object({\n /** Stabiele sleutel; wordt de key in de inzending. */\n name: z\n .string()\n .min(1)\n .max(60)\n .regex(/^[a-zA-Z][a-zA-Z0-9_]*$/, \"veldnaam moet met een letter beginnen en alleen letters/cijfers/_ bevatten\"),\n label: z.string().min(1).max(160),\n type: FieldTypeSchema,\n required: z.boolean().default(false),\n placeholder: z.string().max(200).optional(),\n /** Opties voor type \"select\" en \"radio\". */\n options: z.array(z.string().max(200)).max(50).optional(),\n});\nexport type FormField = z.infer<typeof FormFieldSchema>;\n\n/** Een formulierdefinitie: `sites/{siteId}/forms/{formId}`. */\nexport const FormSchema = z.object({\n name: z.string().min(1).max(160),\n fields: z.array(FormFieldSchema).min(1).max(40),\n submitLabel: z.string().max(80).default(\"Versturen\"),\n successMessage: z.string().max(500).default(\"Bedankt! We nemen snel contact op.\"),\n /** Stuur na een geslaagde inzending door naar deze pagina (bv. een bedankt-pagina). */\n successRedirect: z.string().max(400).optional(),\n /** Stuur de inzender een bevestigingsmail/kopie (naar het eerste e-mailveld van het formulier). */\n confirmSubmitter: z.boolean().optional(),\n /**\n * Kopie van elke inzending naar dit e-mailadres. Leeg = de site-brede notificatie-instelling\n * (Instellingen → E-mail → notificatie-adres, anders het contact-e-mailadres van de site).\n */\n notifyTo: z.string().max(200).optional(),\n});\nexport type FormDefinition = z.infer<typeof FormSchema>;\n\n/** Payload van een inzending (callable input). Per-veld-validatie gebeurt server-side\n * tegen de opgeslagen formulierdefinitie. */\nexport const SubmissionInputSchema = z.object({\n siteId: z.string().min(1).max(80),\n formId: z.string().min(1).max(80),\n values: z.record(z.string(), z.union([z.string().max(5000), z.boolean()])),\n /** Honeypot — moet leeg zijn (bot-detectie). */\n _hp: z.string().max(0).optional(),\n});\nexport type SubmissionInput = z.infer<typeof SubmissionInputSchema>;\n"],"mappings":"AAAA,SAAS,SAAS;AAEX,MAAM,kBAAkB,EAAE,KAAK;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,MAAM,kBAAkB,EAAE,OAAO;AAAA;AAAA,EAEtC,MAAM,EACH,OAAO,EACP,IAAI,CAAC,EACL,IAAI,EAAE,EACN,MAAM,2BAA2B,4EAA4E;AAAA,EAChH,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EAChC,MAAM;AAAA,EACN,UAAU,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EACnC,aAAa,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA;AAAA,EAE1C,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS;AACzD,CAAC;AAIM,MAAM,aAAa,EAAE,OAAO;AAAA,EACjC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EAC/B,QAAQ,EAAE,MAAM,eAAe,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE;AAAA,EAC9C,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,QAAQ,WAAW;AAAA,EACnD,gBAAgB,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,QAAQ,oCAAoC;AAAA;AAAA,EAEhF,iBAAiB,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA;AAAA,EAE9C,kBAAkB,EAAE,QAAQ,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAKvC,UAAU,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,SAAS;AACzC,CAAC;AAKM,MAAM,wBAAwB,EAAE,OAAO;AAAA,EAC5C,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE;AAAA,EAChC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE;AAAA,EAChC,QAAQ,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,GAAI,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;AAAA;AAAA,EAEzE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAClC,CAAC;","names":[]}
1
+ {"version":3,"sources":["../../src/schema/forms.ts"],"sourcesContent":["import * as z from \"zod/mini\";\n\nexport const FieldTypeSchema = z.enum([\n \"text\",\n \"email\",\n \"tel\",\n \"textarea\",\n \"select\",\n \"checkbox\",\n // 4.16: update-veilig toegevoegd (oude definities blijven geldig).\n \"radio\",\n \"date\",\n \"number\",\n]);\nexport type FieldType = z.infer<typeof FieldTypeSchema>;\n\nexport const FormFieldSchema = z.object({\n /** Stabiele sleutel; wordt de key in de inzending. */\n name: z.string().check(z.minLength(1)).check(z.maxLength(60)).check(z.regex(/^[a-zA-Z][a-zA-Z0-9_]*$/, \"veldnaam moet met een letter beginnen en alleen letters/cijfers/_ bevatten\")),\n label: z.string().check(z.minLength(1)).check(z.maxLength(160)),\n type: FieldTypeSchema,\n required: z._default(z.boolean(), false),\n placeholder: z.optional(z.string().check(z.maxLength(200))),\n /** Opties voor type \"select\" en \"radio\". */\n options: z.optional(z.array(z.string().check(z.maxLength(200))).check(z.maxLength(50))),\n});\nexport type FormField = z.infer<typeof FormFieldSchema>;\n\n/** Een formulierdefinitie: `sites/{siteId}/forms/{formId}`. */\nexport const FormSchema = z.object({\n name: z.string().check(z.minLength(1)).check(z.maxLength(160)),\n fields: z.array(FormFieldSchema).check(z.minLength(1)).check(z.maxLength(40)),\n submitLabel: z._default(z.string().check(z.maxLength(80)), \"Versturen\"),\n successMessage: z._default(z.string().check(z.maxLength(500)), \"Bedankt! We nemen snel contact op.\"),\n /** Stuur na een geslaagde inzending door naar deze pagina (bv. een bedankt-pagina). */\n successRedirect: z.optional(z.string().check(z.maxLength(400))),\n /** Stuur de inzender een bevestigingsmail/kopie (naar het eerste e-mailveld van het formulier). */\n confirmSubmitter: z.optional(z.boolean()),\n /**\n * Kopie van elke inzending naar dit e-mailadres. Leeg = de site-brede notificatie-instelling\n * (Instellingen → E-mail → notificatie-adres, anders het contact-e-mailadres van de site).\n */\n notifyTo: z.optional(z.string().check(z.maxLength(200))),\n});\nexport type FormDefinition = z.infer<typeof FormSchema>;\n\n/** Payload van een inzending (callable input). Per-veld-validatie gebeurt server-side\n * tegen de opgeslagen formulierdefinitie. */\nexport const SubmissionInputSchema = z.object({\n siteId: z.string().check(z.minLength(1)).check(z.maxLength(80)),\n formId: z.string().check(z.minLength(1)).check(z.maxLength(80)),\n values: z.record(z.string(), z.union([z.string().check(z.maxLength(5000)), z.boolean()])),\n /** Honeypot — moet leeg zijn (bot-detectie). */\n _hp: z.optional(z.string().check(z.maxLength(0))),\n});\nexport type SubmissionInput = z.infer<typeof SubmissionInputSchema>;\n"],"mappings":"AAAA,YAAY,OAAO;AAEZ,MAAM,kBAAkB,EAAE,KAAK;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,MAAM,kBAAkB,EAAE,OAAO;AAAA;AAAA,EAEtC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,2BAA2B,4EAA4E,CAAC;AAAA,EACpL,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,GAAG,CAAC;AAAA,EAC9D,MAAM;AAAA,EACN,UAAU,EAAE,SAAS,EAAE,QAAQ,GAAG,KAAK;AAAA,EACvC,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,GAAG,CAAC,CAAC;AAAA;AAAA,EAE1D,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;AACxF,CAAC;AAIM,MAAM,aAAa,EAAE,OAAO;AAAA,EACjC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,GAAG,CAAC;AAAA,EAC7D,QAAQ,EAAE,MAAM,eAAe,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AAAA,EAC5E,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,GAAG,WAAW;AAAA,EACtE,gBAAgB,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,GAAG,CAAC,GAAG,oCAAoC;AAAA;AAAA,EAEnG,iBAAiB,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,GAAG,CAAC,CAAC;AAAA;AAAA,EAE9D,kBAAkB,EAAE,SAAS,EAAE,QAAQ,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKxC,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,GAAG,CAAC,CAAC;AACzD,CAAC;AAKM,MAAM,wBAAwB,EAAE,OAAO;AAAA,EAC5C,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AAAA,EAC9D,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AAAA,EAC9D,QAAQ,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,GAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;AAAA;AAAA,EAExF,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;AAClD,CAAC;","names":[]}
@@ -3,10 +3,10 @@
3
3
  * Geen React, geen Firebase: importeerbaar in server-componenten, de sitemap-route én
4
4
  * de Cloud Functions, zodat content-validatie overal dezelfde bron gebruikt.
5
5
  */
6
- export * from "./seo";
7
- export * from "./settings";
8
- export * from "./blocks";
9
- export * from "./pages";
10
- export * from "./forms";
11
- export * from "./mail";
12
- export { defineSiteConfig, SiteConfigSchema, validateSiteConfig, type SiteConfig, type SiteMode, } from "./siteConfig";
6
+ export * from "./seo.js";
7
+ export * from "./settings.js";
8
+ export * from "./blocks.js";
9
+ export * from "./pages.js";
10
+ export * from "./forms.js";
11
+ export * from "./mail.js";
12
+ export { defineSiteConfig, SiteConfigSchema, validateSiteConfig, type SiteConfig, type SiteMode, } from "./siteConfig.js";
@@ -1,14 +1,14 @@
1
- export * from "./seo";
2
- export * from "./settings";
3
- export * from "./blocks";
4
- export * from "./pages";
5
- export * from "./forms";
6
- export * from "./mail";
1
+ export * from "./seo.js";
2
+ export * from "./settings.js";
3
+ export * from "./blocks.js";
4
+ export * from "./pages.js";
5
+ export * from "./forms.js";
6
+ export * from "./mail.js";
7
7
  import {
8
8
  defineSiteConfig,
9
9
  SiteConfigSchema,
10
10
  validateSiteConfig
11
- } from "./siteConfig";
11
+ } from "./siteConfig.js";
12
12
  export {
13
13
  SiteConfigSchema,
14
14
  defineSiteConfig,