@xiwebdesign/xicms-core 6.5.0 → 7.1.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 (381) 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 +90 -61
  6. package/dist/XiCMSProvider.js.map +1 -1
  7. package/dist/admin/AdminApp.d.ts +1 -1
  8. package/dist/admin/AdminApp.js +81 -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/CoreVersion.d.ts +13 -0
  14. package/dist/admin/CoreVersion.js +38 -0
  15. package/dist/admin/CoreVersion.js.map +1 -0
  16. package/dist/admin/NewsEditor.js +9 -9
  17. package/dist/admin/SuperadminPanel.js +5 -5
  18. package/dist/admin/blockEditors/GenericEditor.d.ts +2 -2
  19. package/dist/admin/blockEditors/GenericEditor.js +12 -11
  20. package/dist/admin/blockEditors/GenericEditor.js.map +1 -1
  21. package/dist/admin/blockEditors/StyleEditor.d.ts +1 -1
  22. package/dist/admin/blockEditors/StyleEditor.js +2 -2
  23. package/dist/admin/blockEditors/SymbolRefEditor.d.ts +1 -1
  24. package/dist/admin/blockEditors/SymbolRefEditor.js +5 -5
  25. package/dist/admin/blockEditors/index.d.ts +1 -1
  26. package/dist/admin/blockEditors/index.js +10 -10
  27. package/dist/admin/customBlocks/CustomBlocksPanel.js +7 -7
  28. package/dist/admin/editors/RichTextEditor.js +8 -7
  29. package/dist/admin/editors/RichTextEditor.js.map +1 -1
  30. package/dist/admin/editors/fontSizeExtension.js +1 -1
  31. package/dist/admin/editors/fontSizeExtension.js.map +1 -1
  32. package/dist/admin/forms/FormsPanel.js +9 -9
  33. package/dist/admin/index.d.ts +16 -16
  34. package/dist/admin/index.js +16 -16
  35. package/dist/admin/lib/mediaUsage.js +1 -1
  36. package/dist/admin/lib/pagesClient.d.ts +1 -1
  37. package/dist/admin/lib/pagesClient.js +11 -7
  38. package/dist/admin/lib/pagesClient.js.map +1 -1
  39. package/dist/admin/lib/sanitizeDraft.d.ts +9 -0
  40. package/dist/admin/lib/sanitizeDraft.js +28 -0
  41. package/dist/admin/lib/sanitizeDraft.js.map +1 -0
  42. package/dist/admin/lib/symbolsClient.d.ts +1 -1
  43. package/dist/admin/lib/symbolsClient.js +3 -3
  44. package/dist/admin/lib/upload.js +3 -3
  45. package/dist/admin/lib/useNestedDialog.d.ts +15 -0
  46. package/dist/admin/lib/useNestedDialog.js +23 -0
  47. package/dist/admin/lib/useNestedDialog.js.map +1 -0
  48. package/dist/admin/lib/zodFields.d.ts +4 -18
  49. package/dist/admin/lib/zodFields.js +54 -35
  50. package/dist/admin/lib/zodFields.js.map +1 -1
  51. package/dist/admin/media/MediaManager.js +7 -7
  52. package/dist/admin/media/MediaPicker.js +7 -7
  53. package/dist/admin/media/MediaPicker.js.map +1 -1
  54. package/dist/admin/pages/PageEditor.d.ts +1 -1
  55. package/dist/admin/pages/PageEditor.js +13 -13
  56. package/dist/admin/pages/PagesPanel.js +30 -30
  57. package/dist/admin/pages/PagesPanel.js.map +1 -1
  58. package/dist/admin/panelRegistry.js +7 -7
  59. package/dist/admin/patterns/PatternInserter.d.ts +1 -1
  60. package/dist/admin/patterns/PatternInserter.js +5 -5
  61. package/dist/admin/patterns/PatternInserter.js.map +1 -1
  62. package/dist/admin/settings/MailSettings.js +5 -5
  63. package/dist/admin/settings/MailTemplates.d.ts +1 -1
  64. package/dist/admin/settings/MailTemplates.js +5 -5
  65. package/dist/admin/settings/SettingsPanel.js +66 -20
  66. package/dist/admin/settings/SettingsPanel.js.map +1 -1
  67. package/dist/admin/settings/SnapshotsCard.js +5 -5
  68. package/dist/admin/settings/moduleSettingsForm.d.ts +1 -1
  69. package/dist/admin/settings/moduleSettingsForm.js +4 -4
  70. package/dist/admin/settings/moduleSettingsForm.js.map +1 -1
  71. package/dist/admin/shop/CategoriesTab.js +8 -8
  72. package/dist/admin/shop/ConnectionsTab.js +3 -3
  73. package/dist/admin/shop/DiscountsTab.js +8 -8
  74. package/dist/admin/shop/OrdersTab.js +10 -10
  75. package/dist/admin/shop/OrdersTab.js.map +1 -1
  76. package/dist/admin/shop/ProductsTab.js +10 -10
  77. package/dist/admin/shop/ShopPanel.js +9 -9
  78. package/dist/admin/shop/ShopSettingsTab.js +4 -4
  79. package/dist/admin/shop/index.d.ts +2 -2
  80. package/dist/admin/shop/index.js +2 -2
  81. package/dist/admin/shop/lib.js +2 -2
  82. package/dist/admin/stats/StatsPanel.js +2 -2
  83. package/dist/admin/ui/ArrayEditor.js +1 -1
  84. package/dist/admin/ui/PanelIcon.d.ts +3 -0
  85. package/dist/admin/ui/PanelIcon.js +34 -0
  86. package/dist/admin/ui/PanelIcon.js.map +1 -0
  87. package/dist/admin/ui/dialog.d.ts +21 -6
  88. package/dist/admin/ui/dialog.js +55 -34
  89. package/dist/admin/ui/dialog.js.map +1 -1
  90. package/dist/admin/ui/index.d.ts +7 -7
  91. package/dist/admin/ui/index.js +7 -7
  92. package/dist/admin/ui/primitives.js +1 -1
  93. package/dist/admin/ui/tabs.js +1 -1
  94. package/dist/admin/visual/TranslationPanel.d.ts +1 -1
  95. package/dist/admin/visual/TranslationPanel.js +3 -3
  96. package/dist/admin/visual/VisualEditor.js +47 -25
  97. package/dist/admin/visual/VisualEditor.js.map +1 -1
  98. package/dist/admin.css +2 -1
  99. package/dist/agentFiles/catalog.d.ts +2 -2
  100. package/dist/agentFiles/catalog.js +6 -5
  101. package/dist/agentFiles/catalog.js.map +1 -1
  102. package/dist/agentFiles/files.d.ts +5 -5
  103. package/dist/agentFiles/files.js +17 -17
  104. package/dist/agentFiles/files.js.map +1 -1
  105. package/dist/all.d.ts +4 -4
  106. package/dist/all.js +6 -6
  107. package/dist/auth/AuthProvider.d.ts +2 -2
  108. package/dist/auth/AuthProvider.js +51 -28
  109. package/dist/auth/AuthProvider.js.map +1 -1
  110. package/dist/auth/LoginForm.js +1 -1
  111. package/dist/auth/roles.js +4 -1
  112. package/dist/auth/roles.js.map +1 -1
  113. package/dist/blocks/BlockRenderer.d.ts +1 -1
  114. package/dist/blocks/BlockRenderer.js +3 -3
  115. package/dist/blocks/blockStyle.d.ts +1 -1
  116. package/dist/blocks/builtins/Accordion.d.ts +1 -1
  117. package/dist/blocks/builtins/Accordion.js +13 -6
  118. package/dist/blocks/builtins/Accordion.js.map +1 -1
  119. package/dist/blocks/builtins/Agenda.d.ts +1 -1
  120. package/dist/blocks/builtins/Agenda.js +5 -5
  121. package/dist/blocks/builtins/Banner.d.ts +1 -1
  122. package/dist/blocks/builtins/Banner.js +2 -2
  123. package/dist/blocks/builtins/BeforeAfter.d.ts +1 -1
  124. package/dist/blocks/builtins/BeforeAfter.js +4 -4
  125. package/dist/blocks/builtins/BeforeAfter.js.map +1 -1
  126. package/dist/blocks/builtins/Booking.d.ts +1 -1
  127. package/dist/blocks/builtins/Booking.js +5 -5
  128. package/dist/blocks/builtins/Breadcrumbs.d.ts +1 -1
  129. package/dist/blocks/builtins/Breadcrumbs.js +3 -3
  130. package/dist/blocks/builtins/Cards.d.ts +1 -1
  131. package/dist/blocks/builtins/Cards.js +5 -5
  132. package/dist/blocks/builtins/Cards.js.map +1 -1
  133. package/dist/blocks/builtins/Columns.d.ts +1 -1
  134. package/dist/blocks/builtins/Columns.js +4 -4
  135. package/dist/blocks/builtins/Contact.d.ts +3 -3
  136. package/dist/blocks/builtins/Contact.js +4 -4
  137. package/dist/blocks/builtins/Countdown.d.ts +1 -1
  138. package/dist/blocks/builtins/Countdown.js +4 -4
  139. package/dist/blocks/builtins/Countdown.js.map +1 -1
  140. package/dist/blocks/builtins/Cta.d.ts +1 -1
  141. package/dist/blocks/builtins/Cta.js +3 -3
  142. package/dist/blocks/builtins/Downloads.d.ts +1 -1
  143. package/dist/blocks/builtins/Downloads.js +4 -4
  144. package/dist/blocks/builtins/Elements.d.ts +3 -3
  145. package/dist/blocks/builtins/Elements.js +3 -3
  146. package/dist/blocks/builtins/Embed.d.ts +1 -1
  147. package/dist/blocks/builtins/Embed.js +3 -3
  148. package/dist/blocks/builtins/Faq.d.ts +1 -1
  149. package/dist/blocks/builtins/Faq.js +14 -6
  150. package/dist/blocks/builtins/Faq.js.map +1 -1
  151. package/dist/blocks/builtins/FormBlock.d.ts +1 -1
  152. package/dist/blocks/builtins/FormBlock.js +28 -18
  153. package/dist/blocks/builtins/FormBlock.js.map +1 -1
  154. package/dist/blocks/builtins/Gallery.d.ts +2 -2
  155. package/dist/blocks/builtins/Gallery.js +5 -5
  156. package/dist/blocks/builtins/Hero.d.ts +1 -1
  157. package/dist/blocks/builtins/Hero.js +4 -4
  158. package/dist/blocks/builtins/ImageBlock.d.ts +1 -1
  159. package/dist/blocks/builtins/ImageBlock.js +3 -3
  160. package/dist/blocks/builtins/Jobs.d.ts +2 -2
  161. package/dist/blocks/builtins/Jobs.js +5 -5
  162. package/dist/blocks/builtins/Layout.d.ts +2 -2
  163. package/dist/blocks/builtins/Layout.js +4 -4
  164. package/dist/blocks/builtins/MapBlock.d.ts +1 -1
  165. package/dist/blocks/builtins/MapBlock.js +3 -3
  166. package/dist/blocks/builtins/NewsListBlock.d.ts +1 -1
  167. package/dist/blocks/builtins/NewsListBlock.js +4 -4
  168. package/dist/blocks/builtins/Newsletter.d.ts +1 -1
  169. package/dist/blocks/builtins/Newsletter.js +7 -7
  170. package/dist/blocks/builtins/Newsletter.js.map +1 -1
  171. package/dist/blocks/builtins/OpenNowBadge.d.ts +1 -1
  172. package/dist/blocks/builtins/OpenNowBadge.js +8 -3
  173. package/dist/blocks/builtins/OpenNowBadge.js.map +1 -1
  174. package/dist/blocks/builtins/OpeningHours.d.ts +1 -1
  175. package/dist/blocks/builtins/OpeningHours.js +6 -6
  176. package/dist/blocks/builtins/PdfBlock.d.ts +1 -1
  177. package/dist/blocks/builtins/PdfBlock.js +3 -3
  178. package/dist/blocks/builtins/Portfolio.d.ts +1 -1
  179. package/dist/blocks/builtins/Portfolio.js +5 -5
  180. package/dist/blocks/builtins/Pricing.d.ts +2 -2
  181. package/dist/blocks/builtins/Pricing.js +5 -5
  182. package/dist/blocks/builtins/Pricing.js.map +1 -1
  183. package/dist/blocks/builtins/RichTextBlock.d.ts +1 -1
  184. package/dist/blocks/builtins/RichTextBlock.js +2 -2
  185. package/dist/blocks/builtins/RichTextBlock.js.map +1 -1
  186. package/dist/blocks/builtins/Search.d.ts +1 -1
  187. package/dist/blocks/builtins/Search.js +9 -7
  188. package/dist/blocks/builtins/Search.js.map +1 -1
  189. package/dist/blocks/builtins/Sections.d.ts +4 -4
  190. package/dist/blocks/builtins/Sections.js +4 -4
  191. package/dist/blocks/builtins/Slider.d.ts +1 -1
  192. package/dist/blocks/builtins/Slider.js +3 -3
  193. package/dist/blocks/builtins/Spacer.d.ts +1 -1
  194. package/dist/blocks/builtins/Spacer.js +2 -2
  195. package/dist/blocks/builtins/SymbolRef.d.ts +1 -1
  196. package/dist/blocks/builtins/SymbolRef.js +31 -17
  197. package/dist/blocks/builtins/SymbolRef.js.map +1 -1
  198. package/dist/blocks/builtins/Team.d.ts +1 -1
  199. package/dist/blocks/builtins/Team.js +4 -4
  200. package/dist/blocks/builtins/Testimonials.d.ts +2 -2
  201. package/dist/blocks/builtins/Testimonials.js +4 -4
  202. package/dist/blocks/builtins/Video.d.ts +2 -2
  203. package/dist/blocks/builtins/Video.js +4 -4
  204. package/dist/blocks/builtins/Video.js.map +1 -1
  205. package/dist/blocks/builtins/WhatsappChat.d.ts +1 -1
  206. package/dist/blocks/builtins/WhatsappChat.js +2 -2
  207. package/dist/blocks/builtins/Widgets.d.ts +12 -12
  208. package/dist/blocks/builtins/Widgets.js +19 -19
  209. package/dist/blocks/builtins/Widgets.js.map +1 -1
  210. package/dist/blocks/builtins/consentEmbed.js +2 -2
  211. package/dist/blocks/builtins/index.d.ts +40 -40
  212. package/dist/blocks/builtins/index.js +40 -40
  213. package/dist/blocks/builtins/lib/submitForm.js +5 -3
  214. package/dist/blocks/builtins/lib/submitForm.js.map +1 -1
  215. package/dist/blocks/context.d.ts +1 -1
  216. package/dist/blocks/customTemplate/definition.d.ts +3 -3
  217. package/dist/blocks/customTemplate/definition.js +6 -6
  218. package/dist/blocks/customTemplate/definition.js.map +1 -1
  219. package/dist/blocks/customTemplate/interpret.js +1 -1
  220. package/dist/blocks/index.d.ts +5 -5
  221. package/dist/blocks/index.js +5 -5
  222. package/dist/blocks/registry.d.ts +17 -7
  223. package/dist/blocks/registry.js +2 -1
  224. package/dist/blocks/registry.js.map +1 -1
  225. package/dist/components/EditBar.js +3 -3
  226. package/dist/components/FeedbackWidget.js +4 -4
  227. package/dist/components/News.d.ts +1 -1
  228. package/dist/components/News.js +50 -37
  229. package/dist/components/News.js.map +1 -1
  230. package/dist/components/PageView.js +11 -8
  231. package/dist/components/PageView.js.map +1 -1
  232. package/dist/components/ResponsiveImage.d.ts +1 -1
  233. package/dist/components/site/SiteFooter.d.ts +1 -1
  234. package/dist/components/site/SiteFooter.js +2 -2
  235. package/dist/config.d.ts +1 -1
  236. package/dist/demo/DemoStudio.js +3 -3
  237. package/dist/demo/demoStore.d.ts +3 -3
  238. package/dist/demo/index.d.ts +2 -2
  239. package/dist/demo/index.js +2 -2
  240. package/dist/editor/EditorProvider.js +1 -1
  241. package/dist/firebase/admin.d.ts +0 -2
  242. package/dist/firebase/admin.js +0 -6
  243. package/dist/firebase/admin.js.map +1 -1
  244. package/dist/firebase/appcheck.d.ts +1 -1
  245. package/dist/firebase/appcheck.js +5 -3
  246. package/dist/firebase/appcheck.js.map +1 -1
  247. package/dist/firebase/client.d.ts +2 -1
  248. package/dist/firebase/client.js +2 -14
  249. package/dist/firebase/client.js.map +1 -1
  250. package/dist/firebase/config.d.ts +31 -0
  251. package/dist/firebase/config.js +39 -0
  252. package/dist/firebase/config.js.map +1 -0
  253. package/dist/firebase/feedback.js +5 -3
  254. package/dist/firebase/feedback.js.map +1 -1
  255. package/dist/i18n/overlay.d.ts +2 -2
  256. package/dist/i18n/overlay.js +6 -4
  257. package/dist/i18n/overlay.js.map +1 -1
  258. package/dist/index.d.ts +46 -44
  259. package/dist/index.js +39 -33
  260. package/dist/index.js.map +1 -1
  261. package/dist/lock/DemoLock.js +1 -1
  262. package/dist/modules/builtins.d.ts +1 -1
  263. package/dist/modules/builtins.js +53 -55
  264. package/dist/modules/builtins.js.map +1 -1
  265. package/dist/modules/consent/ConsentBanner.js +1 -1
  266. package/dist/modules/consent/useConsent.js +1 -1
  267. package/dist/modules/context.d.ts +1 -1
  268. package/dist/modules/contract.d.ts +1 -1
  269. package/dist/modules/defineModule.d.ts +1 -1
  270. package/dist/modules/index.d.ts +9 -9
  271. package/dist/modules/index.js +8 -8
  272. package/dist/modules/overrides.d.ts +1 -1
  273. package/dist/modules/registry.d.ts +2 -7
  274. package/dist/modules/registry.js +2 -1
  275. package/dist/modules/registry.js.map +1 -1
  276. package/dist/modules/shop/blocks/Cart.d.ts +1 -1
  277. package/dist/modules/shop/blocks/Cart.js +6 -6
  278. package/dist/modules/shop/blocks/Checkout.d.ts +1 -1
  279. package/dist/modules/shop/blocks/Checkout.js +6 -6
  280. package/dist/modules/shop/blocks/Donation.d.ts +1 -1
  281. package/dist/modules/shop/blocks/Donation.js +5 -5
  282. package/dist/modules/shop/blocks/OrderStatus.d.ts +1 -1
  283. package/dist/modules/shop/blocks/OrderStatus.js +5 -5
  284. package/dist/modules/shop/blocks/ProductDetail.d.ts +1 -1
  285. package/dist/modules/shop/blocks/ProductDetail.js +8 -8
  286. package/dist/modules/shop/blocks/ProductGrid.d.ts +3 -3
  287. package/dist/modules/shop/blocks/ProductGrid.js +7 -7
  288. package/dist/modules/shop/blocks/ShopCategories.d.ts +1 -1
  289. package/dist/modules/shop/blocks/ShopCategories.js +6 -6
  290. package/dist/modules/shop/index.d.ts +5 -5
  291. package/dist/modules/shop/index.js +5 -5
  292. package/dist/modules/shop/lib.d.ts +2 -2
  293. package/dist/modules/shop/lib.js +18 -13
  294. package/dist/modules/shop/lib.js.map +1 -1
  295. package/dist/modules/shop/module.d.ts +1 -1
  296. package/dist/modules/shop/module.js +9 -9
  297. package/dist/modules/shop/settings.d.ts +18 -50
  298. package/dist/modules/shop/settings.js +16 -16
  299. package/dist/modules/shop/settings.js.map +1 -1
  300. package/dist/modules/shop/strings.js +1 -1
  301. package/dist/modules/shop/types.d.ts +1 -1
  302. package/dist/modules/types.d.ts +2 -2
  303. package/dist/patterns/builtins.d.ts +1 -1
  304. package/dist/patterns/builtins.js +1 -1
  305. package/dist/patterns/index.d.ts +2 -2
  306. package/dist/patterns/index.js +2 -2
  307. package/dist/render/PageRenderer.d.ts +2 -2
  308. package/dist/render/PageRenderer.js +1 -1
  309. package/dist/render/PublishedPage.d.ts +1 -1
  310. package/dist/render/PublishedPage.js +2 -2
  311. package/dist/schema/blocks.d.ts +6793 -15095
  312. package/dist/schema/blocks.js +335 -355
  313. package/dist/schema/blocks.js.map +1 -1
  314. package/dist/schema/customBlocks.d.ts +10 -29
  315. package/dist/schema/customBlocks.js +14 -13
  316. package/dist/schema/customBlocks.js.map +1 -1
  317. package/dist/schema/fields.d.ts +10 -16
  318. package/dist/schema/fields.js +37 -37
  319. package/dist/schema/fields.js.map +1 -1
  320. package/dist/schema/forms.d.ts +62 -111
  321. package/dist/schema/forms.js +17 -17
  322. package/dist/schema/forms.js.map +1 -1
  323. package/dist/schema/index.d.ts +7 -7
  324. package/dist/schema/index.js +7 -7
  325. package/dist/schema/mail.d.ts +39 -87
  326. package/dist/schema/mail.js +4 -4
  327. package/dist/schema/mail.js.map +1 -1
  328. package/dist/schema/pages.d.ts +152 -674
  329. package/dist/schema/pages.js +26 -15
  330. package/dist/schema/pages.js.map +1 -1
  331. package/dist/schema/seo.d.ts +9 -27
  332. package/dist/schema/seo.js +7 -7
  333. package/dist/schema/seo.js.map +1 -1
  334. package/dist/schema/settings.d.ts +233 -1074
  335. package/dist/schema/settings.js +71 -56
  336. package/dist/schema/settings.js.map +1 -1
  337. package/dist/schema/shop.d.ts +470 -1214
  338. package/dist/schema/shop.js +124 -124
  339. package/dist/schema/shop.js.map +1 -1
  340. package/dist/schema/siteConfig.d.ts +78 -597
  341. package/dist/schema/siteConfig.js +17 -17
  342. package/dist/schema/siteConfig.js.map +1 -1
  343. package/dist/schema/symbols.d.ts +34 -191
  344. package/dist/schema/symbols.js +8 -8
  345. package/dist/schema/symbols.js.map +1 -1
  346. package/dist/server/auth.d.ts +17 -0
  347. package/dist/server/auth.js +11 -0
  348. package/dist/server/auth.js.map +1 -0
  349. package/dist/server/bundle.d.ts +15 -6
  350. package/dist/server/bundle.js +5 -1
  351. package/dist/server/bundle.js.map +1 -1
  352. package/dist/server/draft.d.ts +16 -0
  353. package/dist/server/draft.js +12 -0
  354. package/dist/server/draft.js.map +1 -0
  355. package/dist/server/env.js +8 -8
  356. package/dist/server/env.js.map +1 -1
  357. package/dist/server/index.d.ts +11 -9
  358. package/dist/server/index.js +13 -10
  359. package/dist/server/index.js.map +1 -1
  360. package/dist/server/pages.d.ts +11 -4
  361. package/dist/server/pages.js +43 -15
  362. package/dist/server/pages.js.map +1 -1
  363. package/dist/server/revalidate.js +11 -2
  364. package/dist/server/revalidate.js.map +1 -1
  365. package/dist/server/seo.d.ts +3 -3
  366. package/dist/server/seo.js +1 -1
  367. package/dist/server/shop.d.ts +3 -3
  368. package/dist/server/shop.js +6 -3
  369. package/dist/server/shop.js.map +1 -1
  370. package/dist/server/version.d.ts +16 -0
  371. package/dist/server/version.js +17 -0
  372. package/dist/server/version.js.map +1 -0
  373. package/dist/settings/useSiteSettings.d.ts +2 -2
  374. package/dist/settings/useSiteSettings.js +48 -28
  375. package/dist/settings/useSiteSettings.js.map +1 -1
  376. package/dist/styles.css +30 -4
  377. package/dist/theme/presets.d.ts +1 -1
  378. package/dist/version.d.ts +8 -0
  379. package/dist/version.js +16 -0
  380. package/dist/version.js.map +1 -0
  381. package/package.json +35 -34
@@ -7,5 +7,5 @@
7
7
  * settings-veld toe zonder `.default()`/`.optional()` — anders faalt validatie op bestaande content
8
8
  * of instellingen. Zo blijft een core-update non-breaking voor klantsites (semver).
9
9
  */
10
- import type { ModuleDefinition } from "./types";
10
+ import type { ModuleDefinition } from "./types.js";
11
11
  export declare function defineModule(def: ModuleDefinition): ModuleDefinition;
@@ -2,12 +2,12 @@
2
2
  * @xiwebdesign/xicms-core/modules — de module-laag (XiCMS 3.0).
3
3
  * Pure data + lichte client-context; admin-panelen zitten in `.../admin`.
4
4
  */
5
- export { defineModule } from "./defineModule";
6
- export type { ModuleDefinition, ModuleSiteSetting, ModulesSiteConfig, Capability, } from "./types";
7
- export { resolveModules, isModuleActive, moduleIdForBlockType, type ResolvedModules, } from "./registry";
8
- export { ModulesProvider, useModules, useModuleActive, useModuleSettings, } from "./context";
9
- export { applyBlockOverrides, type BlockOverride, type BlockOverrides, } from "./overrides";
10
- export { builtinModules } from "./builtins";
11
- export { validateModuleContract, assertModuleContract } from "./contract";
12
- export { useConsent, normalizeConsentState, consentDecided, type ConsentState } from "./consent/useConsent";
13
- export { ConsentBanner, ConsentGate, ConsentReopenLink, type ConsentSettings, type ConsentCategory, } from "./consent/ConsentBanner";
5
+ export { defineModule } from "./defineModule.js";
6
+ export type { ModuleDefinition, ModuleSiteSetting, ModulesSiteConfig, Capability, } from "./types.js";
7
+ export { resolveModules, isModuleActive, moduleIdForBlockType, type ResolvedModules, } from "./registry.js";
8
+ export { ModulesProvider, useModules, useModuleActive, useModuleSettings, } from "./context.js";
9
+ export { applyBlockOverrides, type BlockOverride, type BlockOverrides, } from "./overrides.js";
10
+ export { builtinModules } from "./builtins.js";
11
+ export { validateModuleContract, assertModuleContract } from "./contract.js";
12
+ export { useConsent, normalizeConsentState, consentDecided, type ConsentState } from "./consent/useConsent.js";
13
+ export { ConsentBanner, ConsentGate, ConsentReopenLink, type ConsentSettings, type ConsentCategory, } from "./consent/ConsentBanner.js";
@@ -1,26 +1,26 @@
1
- import { defineModule } from "./defineModule";
1
+ import { defineModule } from "./defineModule.js";
2
2
  import {
3
3
  resolveModules,
4
4
  isModuleActive,
5
5
  moduleIdForBlockType
6
- } from "./registry";
6
+ } from "./registry.js";
7
7
  import {
8
8
  ModulesProvider,
9
9
  useModules,
10
10
  useModuleActive,
11
11
  useModuleSettings
12
- } from "./context";
12
+ } from "./context.js";
13
13
  import {
14
14
  applyBlockOverrides
15
- } from "./overrides";
16
- import { builtinModules } from "./builtins";
17
- import { validateModuleContract, assertModuleContract } from "./contract";
18
- import { useConsent, normalizeConsentState, consentDecided } from "./consent/useConsent";
15
+ } from "./overrides.js";
16
+ import { builtinModules } from "./builtins.js";
17
+ import { validateModuleContract, assertModuleContract } from "./contract.js";
18
+ import { useConsent, normalizeConsentState, consentDecided } from "./consent/useConsent.js";
19
19
  import {
20
20
  ConsentBanner,
21
21
  ConsentGate,
22
22
  ConsentReopenLink
23
- } from "./consent/ConsentBanner";
23
+ } from "./consent/ConsentBanner.js";
24
24
  export {
25
25
  ConsentBanner,
26
26
  ConsentGate,
@@ -9,7 +9,7 @@
9
9
  * Alleen presentatie (`Render`/`Editor`/`label`/`icon`) is te overschrijven; het schema (de
10
10
  * structuur/het datacontract) blijft van core. Een override op een onbekend type wordt genegeerd.
11
11
  */
12
- import type { BlockDefinition, BlockRegistry } from "../blocks/registry";
12
+ import type { BlockDefinition, BlockRegistry } from "../blocks/registry.js";
13
13
  export type BlockOverride = Partial<Pick<BlockDefinition, "Render" | "Editor" | "label" | "icon">>;
14
14
  /** Map van block-`type` naar de te overschrijven presentatievelden. */
15
15
  export type BlockOverrides = Record<string, BlockOverride>;
@@ -1,10 +1,5 @@
1
- /**
2
- * Module-resolutie: bepaalt welke modules actief zijn voor een site en levert daaruit de
3
- * block-lijst en de samengestelde instellingen. Pure logica (geen React/Firebase): bruikbaar op
4
- * server (publieke rendering) én client (provider).
5
- */
6
- import type { BlockDefinition } from "../blocks/registry";
7
- import type { ModuleDefinition, ModulesSiteConfig } from "./types";
1
+ import type { BlockDefinition } from "../blocks/registry.js";
2
+ import type { ModuleDefinition, ModulesSiteConfig } from "./types.js";
8
3
  export interface ResolvedModules {
9
4
  /** Actieve module-ids. */
10
5
  activeIds: Set<string>;
@@ -1,3 +1,4 @@
1
+ import { safeParse } from "zod/v4/core";
1
2
  function mergeModuleConfig(a, b) {
2
3
  const out = { ...a ?? {} };
3
4
  for (const [id, setting] of Object.entries(b ?? {})) {
@@ -54,7 +55,7 @@ function resolveModules(defs, opts) {
54
55
  function resolveSettings(def, config) {
55
56
  const merged = { ...def.defaultSettings ?? {}, ...config ?? {} };
56
57
  if (!def.settingsSchema) return merged;
57
- const res = def.settingsSchema.safeParse(merged);
58
+ const res = safeParse(def.settingsSchema, merged);
58
59
  if (res.success) return res.data;
59
60
  if (typeof console !== "undefined") {
60
61
  console.warn(
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/modules/registry.ts"],"sourcesContent":["/**\n * Module-resolutie: bepaalt welke modules actief zijn voor een site en levert daaruit de\n * block-lijst en de samengestelde instellingen. Pure logica (geen React/Firebase): bruikbaar op\n * server (publieke rendering) én client (provider).\n */\nimport type { BlockDefinition } from \"../blocks/registry\";\nimport type { ModuleDefinition, ModulesSiteConfig, ModuleSiteSetting } from \"./types\";\n\nexport interface ResolvedModules {\n /** Actieve module-ids. */\n activeIds: Set<string>;\n /** Blocks van alle actieve modules (volgorde = module-volgorde). */\n blocks: BlockDefinition[];\n /** Per actieve module: defaultSettings gemerged met de per-site config. */\n settings: Record<string, Record<string, unknown>>;\n /** Alle bekende module-definities (gededupliceerd) — voor het instellingenpaneel. */\n defs: ModuleDefinition[];\n}\n\n/** Voegt twee module-config-bronnen samen op id (b overschrijft a). */\nfunction mergeModuleConfig(\n a: ModulesSiteConfig | undefined,\n b: ModulesSiteConfig | undefined,\n): ModulesSiteConfig {\n const out: ModulesSiteConfig = { ...(a ?? {}) };\n for (const [id, setting] of Object.entries(b ?? {})) {\n const prev = out[id];\n if (\n prev &&\n typeof prev === \"object\" &&\n typeof setting === \"object\" &&\n setting !== null\n ) {\n out[id] = {\n enabled: setting.enabled ?? prev.enabled,\n config: { ...(prev.config ?? {}), ...(setting.config ?? {}) },\n };\n } else {\n out[id] = setting;\n }\n }\n return out;\n}\n\nfunction settingFor(\n id: string,\n modules: ModulesSiteConfig | undefined,\n): ModuleSiteSetting | undefined {\n return modules?.[id];\n}\n\n/**\n * Is een module actief? Precedentie:\n * 1. `core: true` -> altijd actief.\n * 2. expliciet `modules[id]` -> boolean of `{ enabled }`.\n * 3. `defaultEnabled` -> default true.\n * (De legacy `features`-brug uit 2.x is in 5.4 verwijderd — gebruik `modules`.)\n */\nexport function isModuleActive(def: ModuleDefinition, modules?: ModulesSiteConfig): boolean {\n if (def.core) return true;\n\n const explicit = settingFor(def.id, modules);\n if (typeof explicit === \"boolean\") return explicit;\n if (explicit && typeof explicit === \"object\" && typeof explicit.enabled === \"boolean\") {\n return explicit.enabled;\n }\n\n return def.defaultEnabled ?? true;\n}\n\nfunction configFor(\n id: string,\n modules?: ModulesSiteConfig,\n): Record<string, unknown> | undefined {\n const s = settingFor(id, modules);\n if (s && typeof s === \"object\" && s.config) return s.config;\n return undefined;\n}\n\n/**\n * Stelt de actieve modules samen. `defs` = ingebouwde + (optioneel) klant-modules; latere\n * definities met dezelfde `id` overschrijven eerdere (zo kan een site een built-in vervangen).\n */\nexport function resolveModules(\n defs: ModuleDefinition[],\n opts?: {\n modules?: ModulesSiteConfig;\n /**\n * Per-site instellingen uit Firestore (`settings/public.modules`), bewerkt in /beheer. Worden\n * OVER `modules` (uit SiteConfig) gelegd. Precedentie: core > firestore > SiteConfig > default.\n */\n firestoreModules?: ModulesSiteConfig;\n },\n): ResolvedModules {\n // Dedup op id (laatste wint), volgorde behouden van eerste verschijning.\n const byId = new Map<string, ModuleDefinition>();\n const order: string[] = [];\n for (const d of defs) {\n if (!byId.has(d.id)) order.push(d.id);\n byId.set(d.id, d);\n }\n\n const merged = mergeModuleConfig(opts?.modules, opts?.firestoreModules);\n\n const activeIds = new Set<string>();\n const blocks: BlockDefinition[] = [];\n const settings: Record<string, Record<string, unknown>> = {};\n const resolvedDefs: ModuleDefinition[] = order.map((id) => byId.get(id)!);\n\n for (const id of order) {\n const def = byId.get(id)!;\n if (!isModuleActive(def, merged)) continue;\n activeIds.add(id);\n if (def.blocks) blocks.push(...def.blocks);\n settings[id] = resolveSettings(def, configFor(id, merged));\n }\n\n return { activeIds, blocks, settings, defs: resolvedDefs };\n}\n\n/**\n * Stelt de runtime-instellingen van één module samen: `defaultSettings` ⊕ per-site `config`,\n * daarna door het `settingsSchema` gehaald (indien aanwezig). Zo worden schema-`.default()`s\n * daadwerkelijk geïnjecteerd en wordt ongeldige config gevalideerd i.p.v. blind doorgegeven.\n * Bij een schema-fout valt dit terug op de ongevalideerde merge (mét console-waarschuwing) —\n * nooit stil een module z'n instellingen afpakken.\n */\nfunction resolveSettings(\n def: ModuleDefinition,\n config: Record<string, unknown> | undefined,\n): Record<string, unknown> {\n const merged = { ...(def.defaultSettings ?? {}), ...(config ?? {}) };\n if (!def.settingsSchema) return merged;\n const res = def.settingsSchema.safeParse(merged);\n if (res.success) return res.data as Record<string, unknown>;\n if (typeof console !== \"undefined\") {\n console.warn(\n `[xicms] instellingen van module \"${def.id}\" voldoen niet aan het settingsSchema; ongevalideerde waarden gebruikt.`,\n res.error.issues,\n );\n }\n return merged;\n}\n\n/** Geeft het module-id dat een block-type levert (voor \"module staat uit\"-waarschuwingen). */\nexport function moduleIdForBlockType(defs: ModuleDefinition[], type: string): string | undefined {\n for (const d of defs) {\n if (d.blocks?.some((b) => b.type === type)) return d.id;\n }\n return undefined;\n}\n"],"mappings":"AAoBA,SAAS,kBACP,GACA,GACmB;AACnB,QAAM,MAAyB,EAAE,GAAI,KAAK,CAAC,EAAG;AAC9C,aAAW,CAAC,IAAI,OAAO,KAAK,OAAO,QAAQ,KAAK,CAAC,CAAC,GAAG;AACnD,UAAM,OAAO,IAAI,EAAE;AACnB,QACE,QACA,OAAO,SAAS,YAChB,OAAO,YAAY,YACnB,YAAY,MACZ;AACA,UAAI,EAAE,IAAI;AAAA,QACR,SAAS,QAAQ,WAAW,KAAK;AAAA,QACjC,QAAQ,EAAE,GAAI,KAAK,UAAU,CAAC,GAAI,GAAI,QAAQ,UAAU,CAAC,EAAG;AAAA,MAC9D;AAAA,IACF,OAAO;AACL,UAAI,EAAE,IAAI;AAAA,IACZ;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,WACP,IACA,SAC+B;AAC/B,SAAO,UAAU,EAAE;AACrB;AASO,SAAS,eAAe,KAAuB,SAAsC;AAC1F,MAAI,IAAI,KAAM,QAAO;AAErB,QAAM,WAAW,WAAW,IAAI,IAAI,OAAO;AAC3C,MAAI,OAAO,aAAa,UAAW,QAAO;AAC1C,MAAI,YAAY,OAAO,aAAa,YAAY,OAAO,SAAS,YAAY,WAAW;AACrF,WAAO,SAAS;AAAA,EAClB;AAEA,SAAO,IAAI,kBAAkB;AAC/B;AAEA,SAAS,UACP,IACA,SACqC;AACrC,QAAM,IAAI,WAAW,IAAI,OAAO;AAChC,MAAI,KAAK,OAAO,MAAM,YAAY,EAAE,OAAQ,QAAO,EAAE;AACrD,SAAO;AACT;AAMO,SAAS,eACd,MACA,MAQiB;AAEjB,QAAM,OAAO,oBAAI,IAA8B;AAC/C,QAAM,QAAkB,CAAC;AACzB,aAAW,KAAK,MAAM;AACpB,QAAI,CAAC,KAAK,IAAI,EAAE,EAAE,EAAG,OAAM,KAAK,EAAE,EAAE;AACpC,SAAK,IAAI,EAAE,IAAI,CAAC;AAAA,EAClB;AAEA,QAAM,SAAS,kBAAkB,MAAM,SAAS,MAAM,gBAAgB;AAEtE,QAAM,YAAY,oBAAI,IAAY;AAClC,QAAM,SAA4B,CAAC;AACnC,QAAM,WAAoD,CAAC;AAC3D,QAAM,eAAmC,MAAM,IAAI,CAAC,OAAO,KAAK,IAAI,EAAE,CAAE;AAExE,aAAW,MAAM,OAAO;AACtB,UAAM,MAAM,KAAK,IAAI,EAAE;AACvB,QAAI,CAAC,eAAe,KAAK,MAAM,EAAG;AAClC,cAAU,IAAI,EAAE;AAChB,QAAI,IAAI,OAAQ,QAAO,KAAK,GAAG,IAAI,MAAM;AACzC,aAAS,EAAE,IAAI,gBAAgB,KAAK,UAAU,IAAI,MAAM,CAAC;AAAA,EAC3D;AAEA,SAAO,EAAE,WAAW,QAAQ,UAAU,MAAM,aAAa;AAC3D;AASA,SAAS,gBACP,KACA,QACyB;AACzB,QAAM,SAAS,EAAE,GAAI,IAAI,mBAAmB,CAAC,GAAI,GAAI,UAAU,CAAC,EAAG;AACnE,MAAI,CAAC,IAAI,eAAgB,QAAO;AAChC,QAAM,MAAM,IAAI,eAAe,UAAU,MAAM;AAC/C,MAAI,IAAI,QAAS,QAAO,IAAI;AAC5B,MAAI,OAAO,YAAY,aAAa;AAClC,YAAQ;AAAA,MACN,oCAAoC,IAAI,EAAE;AAAA,MAC1C,IAAI,MAAM;AAAA,IACZ;AAAA,EACF;AACA,SAAO;AACT;AAGO,SAAS,qBAAqB,MAA0B,MAAkC;AAC/F,aAAW,KAAK,MAAM;AACpB,QAAI,EAAE,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI,EAAG,QAAO,EAAE;AAAA,EACvD;AACA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../src/modules/registry.ts"],"sourcesContent":["/**\n * Module-resolutie: bepaalt welke modules actief zijn voor een site en levert daaruit de\n * block-lijst en de samengestelde instellingen. Pure logica (geen React/Firebase): bruikbaar op\n * server (publieke rendering) én client (provider).\n */\nimport { safeParse } from \"zod/v4/core\";\nimport type { BlockDefinition } from \"../blocks/registry\";\nimport type { ModuleDefinition, ModulesSiteConfig, ModuleSiteSetting } from \"./types\";\n\nexport interface ResolvedModules {\n /** Actieve module-ids. */\n activeIds: Set<string>;\n /** Blocks van alle actieve modules (volgorde = module-volgorde). */\n blocks: BlockDefinition[];\n /** Per actieve module: defaultSettings gemerged met de per-site config. */\n settings: Record<string, Record<string, unknown>>;\n /** Alle bekende module-definities (gededupliceerd) — voor het instellingenpaneel. */\n defs: ModuleDefinition[];\n}\n\n/** Voegt twee module-config-bronnen samen op id (b overschrijft a). */\nfunction mergeModuleConfig(\n a: ModulesSiteConfig | undefined,\n b: ModulesSiteConfig | undefined,\n): ModulesSiteConfig {\n const out: ModulesSiteConfig = { ...(a ?? {}) };\n for (const [id, setting] of Object.entries(b ?? {})) {\n const prev = out[id];\n if (\n prev &&\n typeof prev === \"object\" &&\n typeof setting === \"object\" &&\n setting !== null\n ) {\n out[id] = {\n enabled: setting.enabled ?? prev.enabled,\n config: { ...(prev.config ?? {}), ...(setting.config ?? {}) },\n };\n } else {\n out[id] = setting;\n }\n }\n return out;\n}\n\nfunction settingFor(\n id: string,\n modules: ModulesSiteConfig | undefined,\n): ModuleSiteSetting | undefined {\n return modules?.[id];\n}\n\n/**\n * Is een module actief? Precedentie:\n * 1. `core: true` -> altijd actief.\n * 2. expliciet `modules[id]` -> boolean of `{ enabled }`.\n * 3. `defaultEnabled` -> default true.\n * (De legacy `features`-brug uit 2.x is in 5.4 verwijderd — gebruik `modules`.)\n */\nexport function isModuleActive(def: ModuleDefinition, modules?: ModulesSiteConfig): boolean {\n if (def.core) return true;\n\n const explicit = settingFor(def.id, modules);\n if (typeof explicit === \"boolean\") return explicit;\n if (explicit && typeof explicit === \"object\" && typeof explicit.enabled === \"boolean\") {\n return explicit.enabled;\n }\n\n return def.defaultEnabled ?? true;\n}\n\nfunction configFor(\n id: string,\n modules?: ModulesSiteConfig,\n): Record<string, unknown> | undefined {\n const s = settingFor(id, modules);\n if (s && typeof s === \"object\" && s.config) return s.config;\n return undefined;\n}\n\n/**\n * Stelt de actieve modules samen. `defs` = ingebouwde + (optioneel) klant-modules; latere\n * definities met dezelfde `id` overschrijven eerdere (zo kan een site een built-in vervangen).\n */\nexport function resolveModules(\n defs: ModuleDefinition[],\n opts?: {\n modules?: ModulesSiteConfig;\n /**\n * Per-site instellingen uit Firestore (`settings/public.modules`), bewerkt in /beheer. Worden\n * OVER `modules` (uit SiteConfig) gelegd. Precedentie: core > firestore > SiteConfig > default.\n */\n firestoreModules?: ModulesSiteConfig;\n },\n): ResolvedModules {\n // Dedup op id (laatste wint), volgorde behouden van eerste verschijning.\n const byId = new Map<string, ModuleDefinition>();\n const order: string[] = [];\n for (const d of defs) {\n if (!byId.has(d.id)) order.push(d.id);\n byId.set(d.id, d);\n }\n\n const merged = mergeModuleConfig(opts?.modules, opts?.firestoreModules);\n\n const activeIds = new Set<string>();\n const blocks: BlockDefinition[] = [];\n const settings: Record<string, Record<string, unknown>> = {};\n const resolvedDefs: ModuleDefinition[] = order.map((id) => byId.get(id)!);\n\n for (const id of order) {\n const def = byId.get(id)!;\n if (!isModuleActive(def, merged)) continue;\n activeIds.add(id);\n if (def.blocks) blocks.push(...def.blocks);\n settings[id] = resolveSettings(def, configFor(id, merged));\n }\n\n return { activeIds, blocks, settings, defs: resolvedDefs };\n}\n\n/**\n * Stelt de runtime-instellingen van één module samen: `defaultSettings` ⊕ per-site `config`,\n * daarna door het `settingsSchema` gehaald (indien aanwezig). Zo worden schema-`.default()`s\n * daadwerkelijk geïnjecteerd en wordt ongeldige config gevalideerd i.p.v. blind doorgegeven.\n * Bij een schema-fout valt dit terug op de ongevalideerde merge (mét console-waarschuwing) —\n * nooit stil een module z'n instellingen afpakken.\n */\nfunction resolveSettings(\n def: ModuleDefinition,\n config: Record<string, unknown> | undefined,\n): Record<string, unknown> {\n const merged = { ...(def.defaultSettings ?? {}), ...(config ?? {}) };\n if (!def.settingsSchema) return merged;\n const res = safeParse(def.settingsSchema, merged);\n if (res.success) return res.data as Record<string, unknown>;\n if (typeof console !== \"undefined\") {\n console.warn(\n `[xicms] instellingen van module \"${def.id}\" voldoen niet aan het settingsSchema; ongevalideerde waarden gebruikt.`,\n res.error.issues,\n );\n }\n return merged;\n}\n\n/** Geeft het module-id dat een block-type levert (voor \"module staat uit\"-waarschuwingen). */\nexport function moduleIdForBlockType(defs: ModuleDefinition[], type: string): string | undefined {\n for (const d of defs) {\n if (d.blocks?.some((b) => b.type === type)) return d.id;\n }\n return undefined;\n}\n"],"mappings":"AAKA,SAAS,iBAAiB;AAgB1B,SAAS,kBACP,GACA,GACmB;AACnB,QAAM,MAAyB,EAAE,GAAI,KAAK,CAAC,EAAG;AAC9C,aAAW,CAAC,IAAI,OAAO,KAAK,OAAO,QAAQ,KAAK,CAAC,CAAC,GAAG;AACnD,UAAM,OAAO,IAAI,EAAE;AACnB,QACE,QACA,OAAO,SAAS,YAChB,OAAO,YAAY,YACnB,YAAY,MACZ;AACA,UAAI,EAAE,IAAI;AAAA,QACR,SAAS,QAAQ,WAAW,KAAK;AAAA,QACjC,QAAQ,EAAE,GAAI,KAAK,UAAU,CAAC,GAAI,GAAI,QAAQ,UAAU,CAAC,EAAG;AAAA,MAC9D;AAAA,IACF,OAAO;AACL,UAAI,EAAE,IAAI;AAAA,IACZ;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,WACP,IACA,SAC+B;AAC/B,SAAO,UAAU,EAAE;AACrB;AASO,SAAS,eAAe,KAAuB,SAAsC;AAC1F,MAAI,IAAI,KAAM,QAAO;AAErB,QAAM,WAAW,WAAW,IAAI,IAAI,OAAO;AAC3C,MAAI,OAAO,aAAa,UAAW,QAAO;AAC1C,MAAI,YAAY,OAAO,aAAa,YAAY,OAAO,SAAS,YAAY,WAAW;AACrF,WAAO,SAAS;AAAA,EAClB;AAEA,SAAO,IAAI,kBAAkB;AAC/B;AAEA,SAAS,UACP,IACA,SACqC;AACrC,QAAM,IAAI,WAAW,IAAI,OAAO;AAChC,MAAI,KAAK,OAAO,MAAM,YAAY,EAAE,OAAQ,QAAO,EAAE;AACrD,SAAO;AACT;AAMO,SAAS,eACd,MACA,MAQiB;AAEjB,QAAM,OAAO,oBAAI,IAA8B;AAC/C,QAAM,QAAkB,CAAC;AACzB,aAAW,KAAK,MAAM;AACpB,QAAI,CAAC,KAAK,IAAI,EAAE,EAAE,EAAG,OAAM,KAAK,EAAE,EAAE;AACpC,SAAK,IAAI,EAAE,IAAI,CAAC;AAAA,EAClB;AAEA,QAAM,SAAS,kBAAkB,MAAM,SAAS,MAAM,gBAAgB;AAEtE,QAAM,YAAY,oBAAI,IAAY;AAClC,QAAM,SAA4B,CAAC;AACnC,QAAM,WAAoD,CAAC;AAC3D,QAAM,eAAmC,MAAM,IAAI,CAAC,OAAO,KAAK,IAAI,EAAE,CAAE;AAExE,aAAW,MAAM,OAAO;AACtB,UAAM,MAAM,KAAK,IAAI,EAAE;AACvB,QAAI,CAAC,eAAe,KAAK,MAAM,EAAG;AAClC,cAAU,IAAI,EAAE;AAChB,QAAI,IAAI,OAAQ,QAAO,KAAK,GAAG,IAAI,MAAM;AACzC,aAAS,EAAE,IAAI,gBAAgB,KAAK,UAAU,IAAI,MAAM,CAAC;AAAA,EAC3D;AAEA,SAAO,EAAE,WAAW,QAAQ,UAAU,MAAM,aAAa;AAC3D;AASA,SAAS,gBACP,KACA,QACyB;AACzB,QAAM,SAAS,EAAE,GAAI,IAAI,mBAAmB,CAAC,GAAI,GAAI,UAAU,CAAC,EAAG;AACnE,MAAI,CAAC,IAAI,eAAgB,QAAO;AAChC,QAAM,MAAM,UAAU,IAAI,gBAAgB,MAAM;AAChD,MAAI,IAAI,QAAS,QAAO,IAAI;AAC5B,MAAI,OAAO,YAAY,aAAa;AAClC,YAAQ;AAAA,MACN,oCAAoC,IAAI,EAAE;AAAA,MAC1C,IAAI,MAAM;AAAA,IACZ;AAAA,EACF;AACA,SAAO;AACT;AAGO,SAAS,qBAAqB,MAA0B,MAAkC;AAC/F,aAAW,KAAK,MAAM;AACpB,QAAI,EAAE,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI,EAAG,QAAO,EAAE;AAAA,EACvD;AACA,SAAO;AACT;","names":[]}
@@ -1,2 +1,2 @@
1
1
  import type { z } from "zod";
2
- export declare const cartBlock: import("../../..").BlockDefinition<z.ZodTypeAny>;
2
+ export declare const cartBlock: import("../../../index.js").BlockDefinition<z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
@@ -1,11 +1,11 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
- import { CartBlockSchema, formatCents, shippingCentsFor } from "../../../schema/shop";
4
- import { defineBlock } from "../../../blocks/registry";
5
- import { Card, Heading, Text } from "../../../blocks/ui";
6
- import { cartLineKey, cartRemove, cartSetQty, useCart } from "../cartStore";
7
- import { useShopStrings } from "../strings";
8
- import { useShopSettings } from "../lib";
3
+ import { CartBlockSchema, formatCents, shippingCentsFor } from "../../../schema/shop.js";
4
+ import { defineBlock } from "../../../blocks/registry.js";
5
+ import { Card, Heading, Text } from "../../../blocks/ui/index.js";
6
+ import { cartLineKey, cartRemove, cartSetQty, useCart } from "../cartStore.js";
7
+ import { useShopStrings } from "../strings.js";
8
+ import { useShopSettings } from "../lib.js";
9
9
  function CartRender({ block, siteId }) {
10
10
  const settings = useShopSettings();
11
11
  const t = useShopStrings();
@@ -1,2 +1,2 @@
1
1
  import type { z } from "zod";
2
- export declare const checkoutBlock: import("../../..").BlockDefinition<z.ZodTypeAny>;
2
+ export declare const checkoutBlock: import("../../../index.js").BlockDefinition<z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
@@ -1,14 +1,14 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import { useState } from "react";
4
- import { CheckoutBlockSchema, formatCents, shippingCentsFor } from "../../../schema/shop";
5
- import { defineBlock } from "../../../blocks/registry";
6
- import { Card, Heading, Text } from "../../../blocks/ui";
4
+ import { CheckoutBlockSchema, formatCents, shippingCentsFor } from "../../../schema/shop.js";
5
+ import { defineBlock } from "../../../blocks/registry.js";
6
+ import { Card, Heading, Text } from "../../../blocks/ui/index.js";
7
7
  import { TextInput } from "@astryxdesign/core/TextInput";
8
8
  import { TextArea } from "@astryxdesign/core/TextArea";
9
- import { cartLineKey, useCart } from "../cartStore";
10
- import { useShopStrings } from "../strings";
11
- import { createOrderCall, useShopSettings, validateDiscountCall } from "../lib";
9
+ import { cartLineKey, useCart } from "../cartStore.js";
10
+ import { useShopStrings } from "../strings.js";
11
+ import { createOrderCall, useShopSettings, validateDiscountCall } from "../lib.js";
12
12
  function CheckoutRender({ block, siteId, mode }) {
13
13
  const settings = useShopSettings();
14
14
  const t = useShopStrings();
@@ -1,2 +1,2 @@
1
1
  import type { z } from "zod";
2
- export declare const donationBlock: import("../../..").BlockDefinition<z.ZodTypeAny>;
2
+ export declare const donationBlock: import("../../../index.js").BlockDefinition<z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
@@ -1,12 +1,12 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import { useState } from "react";
4
- import { DonationBlockSchema, formatCents } from "../../../schema/shop";
5
- import { defineBlock } from "../../../blocks/registry";
6
- import { Card, Heading, Text } from "../../../blocks/ui";
4
+ import { DonationBlockSchema, formatCents } from "../../../schema/shop.js";
5
+ import { defineBlock } from "../../../blocks/registry.js";
6
+ import { Card, Heading, Text } from "../../../blocks/ui/index.js";
7
7
  import { TextInput } from "@astryxdesign/core/TextInput";
8
- import { createOrderCall, useShopSettings } from "../lib";
9
- import { useShopStrings } from "../strings";
8
+ import { createOrderCall, useShopSettings } from "../lib.js";
9
+ import { useShopStrings } from "../strings.js";
10
10
  function DonationRender({ block, siteId, mode }) {
11
11
  const settings = useShopSettings();
12
12
  const t = useShopStrings();
@@ -1,2 +1,2 @@
1
1
  import type { z } from "zod";
2
- export declare const orderStatusBlock: import("../../..").BlockDefinition<z.ZodTypeAny>;
2
+ export declare const orderStatusBlock: import("../../../index.js").BlockDefinition<z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
@@ -1,11 +1,11 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import { useEffect, useState } from "react";
4
- import { OrderStatusBlockSchema } from "../../../schema/shop";
5
- import { defineBlock } from "../../../blocks/registry";
6
- import { Card, Heading, Text } from "../../../blocks/ui";
7
- import { cartClear } from "../cartStore";
8
- import { getOrderReturnStatusCall, readQueryParam, useShopSettings } from "../lib";
4
+ import { OrderStatusBlockSchema } from "../../../schema/shop.js";
5
+ import { defineBlock } from "../../../blocks/registry.js";
6
+ import { Card, Heading, Text } from "../../../blocks/ui/index.js";
7
+ import { cartClear } from "../cartStore.js";
8
+ import { getOrderReturnStatusCall, readQueryParam, useShopSettings } from "../lib.js";
9
9
  function OrderStatusRender({ block, siteId }) {
10
10
  const settings = useShopSettings();
11
11
  const [view, setView] = useState("loading");
@@ -1,2 +1,2 @@
1
1
  import type { z } from "zod";
2
- export declare const productDetailBlock: import("../../..").BlockDefinition<z.ZodTypeAny>;
2
+ export declare const productDetailBlock: import("../../../index.js").BlockDefinition<z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
@@ -6,13 +6,13 @@ import {
6
6
  formatCents,
7
7
  productPriceCents,
8
8
  variantKeyFor
9
- } from "../../../schema/shop";
10
- import { defineBlock } from "../../../blocks/registry";
11
- import { useBlockData } from "../../../blocks/context";
12
- import { Card, Heading, Text } from "../../../blocks/ui";
9
+ } from "../../../schema/shop.js";
10
+ import { defineBlock } from "../../../blocks/registry.js";
11
+ import { useBlockData } from "../../../blocks/context.js";
12
+ import { Card, Heading, Text } from "../../../blocks/ui/index.js";
13
13
  import { Selector } from "@astryxdesign/core/Selector";
14
- import { cartAdd } from "../cartStore";
15
- import { useShopStrings } from "../strings";
14
+ import { cartAdd } from "../cartStore.js";
15
+ import { useShopStrings } from "../strings.js";
16
16
  import {
17
17
  fetchActiveProducts,
18
18
  fetchProductBySlug,
@@ -21,8 +21,8 @@ import {
21
21
  uploadPersonalizationCall,
22
22
  useShopSettings,
23
23
  variantLabelFor
24
- } from "../lib";
25
- import { ProductCard } from "./ProductGrid";
24
+ } from "../lib.js";
25
+ import { ProductCard } from "./ProductGrid.js";
26
26
  function PersonalizationInputs({
27
27
  fields,
28
28
  siteId,
@@ -1,6 +1,6 @@
1
1
  import type { z } from "zod";
2
- import { type ShopT } from "../strings";
3
- import { type StoredProduct } from "../lib";
2
+ import { type ShopT } from "../strings.js";
3
+ import { type StoredProduct } from "../lib.js";
4
4
  /** Prijsregel met optionele doorgestreepte "van"-prijs en "vanaf" bij variant-prijzen. */
5
5
  export declare function PriceLine({ product, currency }: {
6
6
  product: StoredProduct;
@@ -16,4 +16,4 @@ export declare function ProductCard({ product, siteId, currency, detailPath, car
16
16
  /** Actief kleurfilter uit het overzicht — toont bij voorkeur de foto van die kleur. */
17
17
  filterColor?: string | null;
18
18
  }): import("react").JSX.Element;
19
- export declare const productGridBlock: import("../../..").BlockDefinition<z.ZodTypeAny>;
19
+ export declare const productGridBlock: import("../../../index.js").BlockDefinition<z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
@@ -1,12 +1,12 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import { useEffect, useMemo, useState } from "react";
4
- import { ProductGridBlockSchema, formatCents } from "../../../schema/shop";
5
- import { defineBlock } from "../../../blocks/registry";
6
- import { useBlockData } from "../../../blocks/context";
7
- import { Card, Heading, Text } from "../../../blocks/ui";
8
- import { cartAdd } from "../cartStore";
9
- import { useShopStrings } from "../strings";
4
+ import { ProductGridBlockSchema, formatCents } from "../../../schema/shop.js";
5
+ import { defineBlock } from "../../../blocks/registry.js";
6
+ import { useBlockData } from "../../../blocks/context.js";
7
+ import { Card, Heading, Text } from "../../../blocks/ui/index.js";
8
+ import { cartAdd } from "../cartStore.js";
9
+ import { useShopStrings } from "../strings.js";
10
10
  import {
11
11
  fetchActiveProducts,
12
12
  fetchShopCategories,
@@ -14,7 +14,7 @@ import {
14
14
  kleurOptie,
15
15
  readQueryParam,
16
16
  useShopSettings
17
- } from "../lib";
17
+ } from "../lib.js";
18
18
  function PriceLine({ product, currency }) {
19
19
  const variantPrices = (product.variants ?? []).filter((v) => v.priceCents !== void 0).map((v) => v.priceCents);
20
20
  const min = Math.min(product.priceCents, ...variantPrices);
@@ -1,2 +1,2 @@
1
1
  import type { z } from "zod";
2
- export declare const shopCategoriesBlock: import("../../..").BlockDefinition<z.ZodTypeAny>;
2
+ export declare const shopCategoriesBlock: import("../../../index.js").BlockDefinition<z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
@@ -1,12 +1,12 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import { useEffect, useState } from "react";
4
- import { ShopCategoriesBlockSchema } from "../../../schema/shop";
5
- import { defineBlock } from "../../../blocks/registry";
6
- import { Card, Heading, Text } from "../../../blocks/ui";
7
- import { useBlockData } from "../../../blocks/context";
8
- import { useShopStrings } from "../strings";
9
- import { fetchShopCategories, readQueryParam, useShopSettings } from "../lib";
4
+ import { ShopCategoriesBlockSchema } from "../../../schema/shop.js";
5
+ import { defineBlock } from "../../../blocks/registry.js";
6
+ import { Card, Heading, Text } from "../../../blocks/ui/index.js";
7
+ import { useBlockData } from "../../../blocks/context.js";
8
+ import { useShopStrings } from "../strings.js";
9
+ import { fetchShopCategories, readQueryParam, useShopSettings } from "../lib.js";
10
10
  function ShopCategoriesRender({ block, siteId }) {
11
11
  const settings = useShopSettings();
12
12
  const t = useShopStrings();
@@ -6,8 +6,8 @@
6
6
  *
7
7
  * Admin-paneel: `@xiwebdesign/xicms-core/admin/shop`. Server-readers: `.../server/shop`.
8
8
  */
9
- export { shopModule } from "./module";
10
- export * from "./types";
11
- export * from "./settings";
12
- export { useCart, cartAdd, cartSetQty, cartRemove, cartClear, type CartLine, type CartState } from "./cartStore";
13
- export { useShopSettings } from "./lib";
9
+ export { shopModule } from "./module.js";
10
+ export * from "./types.js";
11
+ export * from "./settings.js";
12
+ export { useCart, cartAdd, cartSetQty, cartRemove, cartClear, type CartLine, type CartState } from "./cartStore.js";
13
+ export { useShopSettings } from "./lib.js";
@@ -1,8 +1,8 @@
1
- import { shopModule } from "./module";
2
- export * from "./types";
3
- export * from "./settings";
4
- import { useCart, cartAdd, cartSetQty, cartRemove, cartClear } from "./cartStore";
5
- import { useShopSettings } from "./lib";
1
+ import { shopModule } from "./module.js";
2
+ export * from "./types.js";
3
+ export * from "./settings.js";
4
+ import { useCart, cartAdd, cartSetQty, cartRemove, cartClear } from "./cartStore.js";
5
+ import { useShopSettings } from "./lib.js";
6
6
  export {
7
7
  cartAdd,
8
8
  cartClear,
@@ -1,5 +1,5 @@
1
- import type { CreateOrderInput, Product, ProductOption, ShopCategory } from "../../schema/shop";
2
- import { type ShopSettings } from "./settings";
1
+ import type { CreateOrderInput, Product, ProductOption, ShopCategory } from "../../schema/shop.js";
2
+ import { type ShopSettings } from "./settings.js";
3
3
  /** Publieke shop-instellingen met defaults (paden, verzendkosten, valuta). */
4
4
  export declare function useShopSettings(): ShopSettings;
5
5
  export type StoredProduct = Product & {
@@ -1,16 +1,21 @@
1
1
  "use client";
2
- import { collection, getDocs, limit as fsLimit, query, where } from "firebase/firestore";
3
- import { getFunctions, httpsCallable } from "firebase/functions";
4
- import { getDb, getFirebaseApp } from "../../firebase/client";
5
- import { functionsRegion } from "../../firebase/region";
6
- import { useModuleSettings } from "../context";
7
- import { defaultShopSettings } from "./settings";
2
+ async function fsSdk() {
3
+ const [client, sdk] = await Promise.all([import("../../firebase/client.js"), import("firebase/firestore")]);
4
+ return { db: client.getDb(), ...sdk };
5
+ }
6
+ async function fnSdk() {
7
+ const [client, sdk] = await Promise.all([import("../../firebase/client.js"), import("firebase/functions")]);
8
+ return { app: client.getFirebaseApp(), ...sdk };
9
+ }
10
+ import { functionsRegion } from "../../firebase/region.js";
11
+ import { useModuleSettings } from "../context.js";
12
+ import { defaultShopSettings } from "./settings.js";
8
13
  function useShopSettings() {
9
14
  const raw = useModuleSettings("shop");
10
15
  return { ...defaultShopSettings, ...raw };
11
16
  }
12
17
  async function fetchActiveProducts(siteId) {
13
- const db = getDb();
18
+ const { db, collection, getDocs, limit: fsLimit, query, where } = await fsSdk();
14
19
  if (!db) return [];
15
20
  const snap = await getDocs(
16
21
  query(collection(db, "sites", siteId, "products"), where("status", "==", "active"), fsLimit(500))
@@ -18,7 +23,7 @@ async function fetchActiveProducts(siteId) {
18
23
  return snap.docs.map((d) => ({ id: d.id, ...d.data() }));
19
24
  }
20
25
  async function fetchProductBySlug(siteId, slug) {
21
- const db = getDb();
26
+ const { db, collection, getDocs, limit: fsLimit, query, where } = await fsSdk();
22
27
  if (!db || !slug) return null;
23
28
  const snap = await getDocs(
24
29
  query(
@@ -33,7 +38,7 @@ async function fetchProductBySlug(siteId, slug) {
33
38
  return { id: doc.id, ...doc.data() };
34
39
  }
35
40
  async function fetchShopCategories(siteId) {
36
- const db = getDb();
41
+ const { db, collection, getDocs, limit: fsLimit, query, where } = await fsSdk();
37
42
  if (!db) return [];
38
43
  const snap = await getDocs(query(collection(db, "sites", siteId, "shopCategories"), fsLimit(100)));
39
44
  return snap.docs.map((d) => ({ id: d.id, ...d.data() })).filter((c) => c.visible !== false).sort((a, b) => (a.order ?? 0) - (b.order ?? 0));
@@ -53,21 +58,21 @@ function stripEmpty(value) {
53
58
  return value;
54
59
  }
55
60
  async function createOrderCall(input) {
56
- const app = getFirebaseApp();
61
+ const { app, getFunctions, httpsCallable } = await fnSdk();
57
62
  if (!app) throw new Error("Webwinkel niet beschikbaar.");
58
63
  const fn = httpsCallable(getFunctions(app, functionsRegion()), "createOrder");
59
64
  const res = await fn(stripEmpty(input));
60
65
  return res.data;
61
66
  }
62
67
  async function validateDiscountCall(siteId, code, itemsCents) {
63
- const app = getFirebaseApp();
68
+ const { app, getFunctions, httpsCallable } = await fnSdk();
64
69
  if (!app) throw new Error("Webwinkel niet beschikbaar.");
65
70
  const fn = httpsCallable(getFunctions(app, functionsRegion()), "validateDiscountCode");
66
71
  const res = await fn({ siteId, code, itemsCents });
67
72
  return res.data;
68
73
  }
69
74
  async function uploadPersonalizationCall(siteId, productId, file) {
70
- const app = getFirebaseApp();
75
+ const { app, getFunctions, httpsCallable } = await fnSdk();
71
76
  if (!app) throw new Error("Webwinkel niet beschikbaar.");
72
77
  if (file.size > 5 * 1024 * 1024) throw new Error("TOO_BIG");
73
78
  const bytesBase64 = await new Promise((resolve, reject) => {
@@ -89,7 +94,7 @@ function readQueryParam(name) {
89
94
  return new URLSearchParams(window.location.search).get(name);
90
95
  }
91
96
  async function getOrderReturnStatusCall(siteId, orderId) {
92
- const app = getFirebaseApp();
97
+ const { app, getFunctions, httpsCallable } = await fnSdk();
93
98
  if (!app) return { status: "unknown" };
94
99
  const fn = httpsCallable(getFunctions(app, functionsRegion()), "getOrderReturnStatus");
95
100
  const res = await fn({ siteId, orderId });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/modules/shop/lib.ts"],"sourcesContent":["\"use client\";\n\n/**\n * Client-helpers voor de shop-blocks: producten/categorieën lezen (publieke rules) en de\n * `createOrder`-callable aanroepen. Queries bewust simpel gehouden (één `where` op status,\n * filteren/sorteren client-side) zodat er géén composite-indexes nodig zijn — assortimenten\n * van XiCMS-sites zijn klein (tientallen tot honderden producten).\n */\nimport { collection, getDocs, limit as fsLimit, query, where } from \"firebase/firestore\";\nimport { getFunctions, httpsCallable } from \"firebase/functions\";\nimport { getDb, getFirebaseApp } from \"../../firebase/client\";\nimport { functionsRegion } from \"../../firebase/region\";\nimport type { CreateOrderInput, Product, ProductOption, ShopCategory } from \"../../schema/shop\";\nimport { useModuleSettings } from \"../context\";\nimport { defaultShopSettings, type ShopSettings } from \"./settings\";\n\n/** Publieke shop-instellingen met defaults (paden, verzendkosten, valuta). */\nexport function useShopSettings(): ShopSettings {\n const raw = useModuleSettings<Partial<ShopSettings>>(\"shop\");\n return { ...defaultShopSettings, ...raw };\n}\n\nexport type StoredProduct = Product & { id: string };\nexport type StoredShopCategory = ShopCategory & { id: string };\n\nexport async function fetchActiveProducts(siteId: string): Promise<StoredProduct[]> {\n const db = getDb();\n if (!db) return [];\n const snap = await getDocs(\n query(collection(db, \"sites\", siteId, \"products\"), where(\"status\", \"==\", \"active\"), fsLimit(500)),\n );\n return snap.docs.map((d) => ({ id: d.id, ...(d.data() as Product) }));\n}\n\nexport async function fetchProductBySlug(siteId: string, slug: string): Promise<StoredProduct | null> {\n const db = getDb();\n if (!db || !slug) return null;\n // Het status-filter is verplicht: de rules staan publieke reads alleen toe voor actieve\n // producten, en Firestore weigert query's die niet aantoonbaar binnen die regel blijven.\n // Twee equality-filters → geen composite index nodig (index-merging).\n const snap = await getDocs(\n query(\n collection(db, \"sites\", siteId, \"products\"),\n where(\"slug\", \"==\", slug),\n where(\"status\", \"==\", \"active\"),\n fsLimit(1),\n ),\n );\n const doc = snap.docs[0];\n if (!doc) return null;\n return { id: doc.id, ...(doc.data() as Product) };\n}\n\nexport async function fetchShopCategories(siteId: string): Promise<StoredShopCategory[]> {\n const db = getDb();\n if (!db) return [];\n const snap = await getDocs(query(collection(db, \"sites\", siteId, \"shopCategories\"), fsLimit(100)));\n return snap.docs\n .map((d) => ({ id: d.id, ...(d.data() as ShopCategory) }))\n .filter((c) => c.visible !== false)\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n}\n\n/** Start de checkout: order + Stripe-sessie server-side; geeft de redirect-URL terug. */\n/**\n * Verwijdert `undefined`/`null`-velden diep uit een payload vóór een callable-aanroep.\n * De Firebase-callable-SDK serialiseert `undefined` namelijk als `null` op de wire, terwijl de\n * server-side Zod-schema's optionele velden met `.optional()` valideren — dat wijst `null` af en\n * geeft \"Ongeldige invoer\". Door lege velden hier weg te laten komen ze als afwezig binnen (= ok).\n */\nfunction stripEmpty<T>(value: T): T {\n if (Array.isArray(value)) {\n return value.map((v) => stripEmpty(v)) as unknown as T;\n }\n if (value && typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n if (v === undefined || v === null) continue;\n out[k] = stripEmpty(v);\n }\n return out as T;\n }\n return value;\n}\n\nexport async function createOrderCall(input: CreateOrderInput): Promise<{ url: string; orderNumber: string }> {\n const app = getFirebaseApp();\n if (!app) throw new Error(\"Webwinkel niet beschikbaar.\");\n const fn = httpsCallable(getFunctions(app, functionsRegion()), \"createOrder\");\n const res = await fn(stripEmpty(input));\n return res.data as { url: string; orderNumber: string };\n}\n\n/** Valideert een kortingscode server-side; geeft de verwachte korting terug (preview). */\nexport interface DiscountPreview {\n valid: boolean;\n code?: string;\n discountCents?: number;\n freeShipping?: boolean;\n reason?: string;\n}\nexport async function validateDiscountCall(siteId: string, code: string, itemsCents: number): Promise<DiscountPreview> {\n const app = getFirebaseApp();\n if (!app) throw new Error(\"Webwinkel niet beschikbaar.\");\n const fn = httpsCallable(getFunctions(app, functionsRegion()), \"validateDiscountCode\");\n const res = await fn({ siteId, code, itemsCents });\n return res.data as DiscountPreview;\n}\n\n/**\n * Upload een personalisatie-afbeelding (eigen logo e.d.) via de begrensde callable —\n * geeft het Storage-pad terug dat op de orderregel meegaat. Max 5 MB, jpeg/png/webp.\n */\nexport async function uploadPersonalizationCall(\n siteId: string,\n productId: string,\n file: File,\n): Promise<{ path: string }> {\n const app = getFirebaseApp();\n if (!app) throw new Error(\"Webwinkel niet beschikbaar.\");\n if (file.size > 5 * 1024 * 1024) throw new Error(\"TOO_BIG\");\n const bytesBase64 = await new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(String(reader.result).split(\",\")[1] ?? \"\");\n reader.onerror = () => reject(new Error(\"Bestand lezen mislukt.\"));\n reader.readAsDataURL(file);\n });\n const fn = httpsCallable(getFunctions(app, functionsRegion()), \"uploadPersonalization\");\n const res = await fn({ siteId, productId, fileName: file.name, contentType: file.type, bytesBase64 });\n return res.data as { path: string };\n}\n\n/** Leesbaar variantlabel: opties [\"Maat\",\"Kleur\"] + key \"68|Roze\" → \"Maat 68 · Roze\". */\nexport function variantLabelFor(options: { name: string; values: string[] }[], key: string): string {\n const parts = key.split(\"|\");\n return options.map((o, i) => `${o.name} ${parts[i] ?? \"?\"}`).join(\" · \");\n}\n\n/** Querystring-parameter client-side lezen (blocks zijn client components). */\nexport function readQueryParam(name: string): string | null {\n if (typeof window === \"undefined\") return null;\n return new URLSearchParams(window.location.search).get(name);\n}\n\n/**\n * Echte orderstatus opvragen (voor de bedankt-pagina). Nodig bij Mollie: die heeft één\n * redirect-URL voor alle uitkomsten, dus de status moet server-side gecheckt worden.\n */\nexport async function getOrderReturnStatusCall(\n siteId: string,\n orderId: string,\n): Promise<{ status: string; number?: string }> {\n const app = getFirebaseApp();\n if (!app) return { status: \"unknown\" };\n const fn = httpsCallable(getFunctions(app, functionsRegion()), \"getOrderReturnStatus\");\n const res = await fn({ siteId, orderId });\n return res.data as { status: string; number?: string };\n}\n\n/* ── Kleur-swatches ──────────────────────────────────────────────────────── */\n\n// Zachte, pastelachtige swatch-tinten — informatief maar rustig (geen felle vlekken op de\n// kaart). Bewust gedempt t.o.v. de echte stofkleuren; de foto toont de precieze kleur.\nconst KLEUR_CSS: [RegExp, string][] = [\n [/fuchsia|fushia/, \"#dd8fb4\"],\n [/roze|pink/, \"#f2c3d3\"],\n [/blauw|blue/, \"#bcd3ea\"],\n [/mint/, \"#bfe0d2\"],\n [/oker|geel|yellow/, \"#eccf90\"],\n [/wit|white/, \"#f6f3ec\"],\n [/creme|crème|ecru|beige|zand/, \"#f0e7d6\"],\n [/grijs|gray|grey/, \"#c7ccd3\"],\n [/groen|green/, \"#b3d1b3\"],\n [/rood|red|bordeaux/, \"#e0a0a0\"],\n [/paars|purple|lila/, \"#cdbce6\"],\n [/oranje|orange/, \"#f2bd94\"],\n [/bruin|brown/, \"#c3a488\"],\n [/zwart|black|navy|donkerblauw/, \"#6b7488\"],\n];\n\n/**\n * Zet een kleurnaam (\"Roze\", \"Korte mouw tshirt (oker)geel\") om naar een CSS-kleur voor de\n * swatch-stipjes op productkaarten. Onbekende namen geven null (dan geen stipje).\n */\nexport function kleurNaarCss(naam: string): string | null {\n const l = naam.toLowerCase();\n for (const [re, css] of KLEUR_CSS) if (re.test(l)) return css;\n return null;\n}\n\n/** De kleur-optie van een product (naam \"Kleur\"/\"Colour\"/\"Color\"), of null. */\nexport function kleurOptie(product: Pick<Product, \"options\">): ProductOption | null {\n return (product.options ?? []).find((o) => /^kleur|^colou?r/i.test(o.name)) ?? null;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/modules/shop/lib.ts"],"sourcesContent":["\"use client\";\n\n/**\n * Client-helpers voor de shop-blocks: producten/categorieën lezen (publieke rules) en de\n * `createOrder`-callable aanroepen. Queries bewust simpel gehouden (één `where` op status,\n * filteren/sorteren client-side) zodat er géén composite-indexes nodig zijn — assortimenten\n * van XiCMS-sites zijn klein (tientallen tot honderden producten).\n */\n\n/**\n * Firestore/Functions worden hier DYNAMISCH geladen. De shop-blocks zitten in de publieke bundel,\n * dus een statische import zette de SDK op élke pagina — ook op sites zonder webshop.\n */\nasync function fsSdk() {\n const [client, sdk] = await Promise.all([import(\"../../firebase/client\"), import(\"firebase/firestore\")]);\n return { db: client.getDb(), ...sdk };\n}\nasync function fnSdk() {\n const [client, sdk] = await Promise.all([import(\"../../firebase/client\"), import(\"firebase/functions\")]);\n return { app: client.getFirebaseApp(), ...sdk };\n}\nimport { functionsRegion } from \"../../firebase/region\";\nimport type { CreateOrderInput, Product, ProductOption, ShopCategory } from \"../../schema/shop\";\nimport { useModuleSettings } from \"../context\";\nimport { defaultShopSettings, type ShopSettings } from \"./settings\";\n\n/** Publieke shop-instellingen met defaults (paden, verzendkosten, valuta). */\nexport function useShopSettings(): ShopSettings {\n const raw = useModuleSettings<Partial<ShopSettings>>(\"shop\");\n return { ...defaultShopSettings, ...raw };\n}\n\nexport type StoredProduct = Product & { id: string };\nexport type StoredShopCategory = ShopCategory & { id: string };\n\nexport async function fetchActiveProducts(siteId: string): Promise<StoredProduct[]> {\n const { db, collection, getDocs, limit: fsLimit, query, where } = await fsSdk();\n if (!db) return [];\n const snap = await getDocs(\n query(collection(db, \"sites\", siteId, \"products\"), where(\"status\", \"==\", \"active\"), fsLimit(500)),\n );\n return snap.docs.map((d) => ({ id: d.id, ...(d.data() as Product) }));\n}\n\nexport async function fetchProductBySlug(siteId: string, slug: string): Promise<StoredProduct | null> {\n const { db, collection, getDocs, limit: fsLimit, query, where } = await fsSdk();\n if (!db || !slug) return null;\n // Het status-filter is verplicht: de rules staan publieke reads alleen toe voor actieve\n // producten, en Firestore weigert query's die niet aantoonbaar binnen die regel blijven.\n // Twee equality-filters → geen composite index nodig (index-merging).\n const snap = await getDocs(\n query(\n collection(db, \"sites\", siteId, \"products\"),\n where(\"slug\", \"==\", slug),\n where(\"status\", \"==\", \"active\"),\n fsLimit(1),\n ),\n );\n const doc = snap.docs[0];\n if (!doc) return null;\n return { id: doc.id, ...(doc.data() as Product) };\n}\n\nexport async function fetchShopCategories(siteId: string): Promise<StoredShopCategory[]> {\n const { db, collection, getDocs, limit: fsLimit, query, where } = await fsSdk();\n if (!db) return [];\n const snap = await getDocs(query(collection(db, \"sites\", siteId, \"shopCategories\"), fsLimit(100)));\n return snap.docs\n .map((d) => ({ id: d.id, ...(d.data() as ShopCategory) }))\n .filter((c) => c.visible !== false)\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n}\n\n/** Start de checkout: order + Stripe-sessie server-side; geeft de redirect-URL terug. */\n/**\n * Verwijdert `undefined`/`null`-velden diep uit een payload vóór een callable-aanroep.\n * De Firebase-callable-SDK serialiseert `undefined` namelijk als `null` op de wire, terwijl de\n * server-side Zod-schema's optionele velden met `.optional()` valideren — dat wijst `null` af en\n * geeft \"Ongeldige invoer\". Door lege velden hier weg te laten komen ze als afwezig binnen (= ok).\n */\nfunction stripEmpty<T>(value: T): T {\n if (Array.isArray(value)) {\n return value.map((v) => stripEmpty(v)) as unknown as T;\n }\n if (value && typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n if (v === undefined || v === null) continue;\n out[k] = stripEmpty(v);\n }\n return out as T;\n }\n return value;\n}\n\nexport async function createOrderCall(input: CreateOrderInput): Promise<{ url: string; orderNumber: string }> {\n const { app, getFunctions, httpsCallable } = await fnSdk();\n if (!app) throw new Error(\"Webwinkel niet beschikbaar.\");\n const fn = httpsCallable(getFunctions(app, functionsRegion()), \"createOrder\");\n const res = await fn(stripEmpty(input));\n return res.data as { url: string; orderNumber: string };\n}\n\n/** Valideert een kortingscode server-side; geeft de verwachte korting terug (preview). */\nexport interface DiscountPreview {\n valid: boolean;\n code?: string;\n discountCents?: number;\n freeShipping?: boolean;\n reason?: string;\n}\nexport async function validateDiscountCall(siteId: string, code: string, itemsCents: number): Promise<DiscountPreview> {\n const { app, getFunctions, httpsCallable } = await fnSdk();\n if (!app) throw new Error(\"Webwinkel niet beschikbaar.\");\n const fn = httpsCallable(getFunctions(app, functionsRegion()), \"validateDiscountCode\");\n const res = await fn({ siteId, code, itemsCents });\n return res.data as DiscountPreview;\n}\n\n/**\n * Upload een personalisatie-afbeelding (eigen logo e.d.) via de begrensde callable —\n * geeft het Storage-pad terug dat op de orderregel meegaat. Max 5 MB, jpeg/png/webp.\n */\nexport async function uploadPersonalizationCall(\n siteId: string,\n productId: string,\n file: File,\n): Promise<{ path: string }> {\n const { app, getFunctions, httpsCallable } = await fnSdk();\n if (!app) throw new Error(\"Webwinkel niet beschikbaar.\");\n if (file.size > 5 * 1024 * 1024) throw new Error(\"TOO_BIG\");\n const bytesBase64 = await new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(String(reader.result).split(\",\")[1] ?? \"\");\n reader.onerror = () => reject(new Error(\"Bestand lezen mislukt.\"));\n reader.readAsDataURL(file);\n });\n const fn = httpsCallable(getFunctions(app, functionsRegion()), \"uploadPersonalization\");\n const res = await fn({ siteId, productId, fileName: file.name, contentType: file.type, bytesBase64 });\n return res.data as { path: string };\n}\n\n/** Leesbaar variantlabel: opties [\"Maat\",\"Kleur\"] + key \"68|Roze\" → \"Maat 68 · Roze\". */\nexport function variantLabelFor(options: { name: string; values: string[] }[], key: string): string {\n const parts = key.split(\"|\");\n return options.map((o, i) => `${o.name} ${parts[i] ?? \"?\"}`).join(\" · \");\n}\n\n/** Querystring-parameter client-side lezen (blocks zijn client components). */\nexport function readQueryParam(name: string): string | null {\n if (typeof window === \"undefined\") return null;\n return new URLSearchParams(window.location.search).get(name);\n}\n\n/**\n * Echte orderstatus opvragen (voor de bedankt-pagina). Nodig bij Mollie: die heeft één\n * redirect-URL voor alle uitkomsten, dus de status moet server-side gecheckt worden.\n */\nexport async function getOrderReturnStatusCall(\n siteId: string,\n orderId: string,\n): Promise<{ status: string; number?: string }> {\n const { app, getFunctions, httpsCallable } = await fnSdk();\n if (!app) return { status: \"unknown\" };\n const fn = httpsCallable(getFunctions(app, functionsRegion()), \"getOrderReturnStatus\");\n const res = await fn({ siteId, orderId });\n return res.data as { status: string; number?: string };\n}\n\n/* ── Kleur-swatches ──────────────────────────────────────────────────────── */\n\n// Zachte, pastelachtige swatch-tinten — informatief maar rustig (geen felle vlekken op de\n// kaart). Bewust gedempt t.o.v. de echte stofkleuren; de foto toont de precieze kleur.\nconst KLEUR_CSS: [RegExp, string][] = [\n [/fuchsia|fushia/, \"#dd8fb4\"],\n [/roze|pink/, \"#f2c3d3\"],\n [/blauw|blue/, \"#bcd3ea\"],\n [/mint/, \"#bfe0d2\"],\n [/oker|geel|yellow/, \"#eccf90\"],\n [/wit|white/, \"#f6f3ec\"],\n [/creme|crème|ecru|beige|zand/, \"#f0e7d6\"],\n [/grijs|gray|grey/, \"#c7ccd3\"],\n [/groen|green/, \"#b3d1b3\"],\n [/rood|red|bordeaux/, \"#e0a0a0\"],\n [/paars|purple|lila/, \"#cdbce6\"],\n [/oranje|orange/, \"#f2bd94\"],\n [/bruin|brown/, \"#c3a488\"],\n [/zwart|black|navy|donkerblauw/, \"#6b7488\"],\n];\n\n/**\n * Zet een kleurnaam (\"Roze\", \"Korte mouw tshirt (oker)geel\") om naar een CSS-kleur voor de\n * swatch-stipjes op productkaarten. Onbekende namen geven null (dan geen stipje).\n */\nexport function kleurNaarCss(naam: string): string | null {\n const l = naam.toLowerCase();\n for (const [re, css] of KLEUR_CSS) if (re.test(l)) return css;\n return null;\n}\n\n/** De kleur-optie van een product (naam \"Kleur\"/\"Colour\"/\"Color\"), of null. */\nexport function kleurOptie(product: Pick<Product, \"options\">): ProductOption | null {\n return (product.options ?? []).find((o) => /^kleur|^colou?r/i.test(o.name)) ?? null;\n}\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- export declare const shopModule: import("..").ModuleDefinition;
1
+ export declare const shopModule: import("../index.js").ModuleDefinition;
@@ -1,12 +1,12 @@
1
- import { defineModule } from "../defineModule";
2
- import { ShopSettingsSchema, defaultShopSettings } from "./settings";
3
- import { shopCategoriesBlock } from "./blocks/ShopCategories";
4
- import { productGridBlock } from "./blocks/ProductGrid";
5
- import { productDetailBlock } from "./blocks/ProductDetail";
6
- import { cartBlock } from "./blocks/Cart";
7
- import { checkoutBlock } from "./blocks/Checkout";
8
- import { donationBlock } from "./blocks/Donation";
9
- import { orderStatusBlock } from "./blocks/OrderStatus";
1
+ import { defineModule } from "../defineModule.js";
2
+ import { ShopSettingsSchema, defaultShopSettings } from "./settings.js";
3
+ import { shopCategoriesBlock } from "./blocks/ShopCategories.js";
4
+ import { productGridBlock } from "./blocks/ProductGrid.js";
5
+ import { productDetailBlock } from "./blocks/ProductDetail.js";
6
+ import { cartBlock } from "./blocks/Cart.js";
7
+ import { checkoutBlock } from "./blocks/Checkout.js";
8
+ import { donationBlock } from "./blocks/Donation.js";
9
+ import { orderStatusBlock } from "./blocks/OrderStatus.js";
10
10
  const shopModule = defineModule({
11
11
  id: "shop",
12
12
  version: "1.0.0",