@endora-commerce/mod-cms 0.0.0-stage → 0.100.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 (264) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +65 -2
  3. package/dist/admin/api/cms-client.d.ts +77 -0
  4. package/dist/admin/api/cms-client.d.ts.map +1 -0
  5. package/dist/admin/api/cms-client.js +162 -0
  6. package/dist/admin/api/cms-client.js.map +1 -0
  7. package/dist/admin/components/AdminCatalogPreviewProvider.d.ts +6 -0
  8. package/dist/admin/components/AdminCatalogPreviewProvider.d.ts.map +1 -0
  9. package/dist/admin/components/AdminCatalogPreviewProvider.js +74 -0
  10. package/dist/admin/components/AdminCatalogPreviewProvider.js.map +1 -0
  11. package/dist/admin/components/AdminCmsAssetProvider.d.ts +9 -0
  12. package/dist/admin/components/AdminCmsAssetProvider.d.ts.map +1 -0
  13. package/dist/admin/components/AdminCmsAssetProvider.js +50 -0
  14. package/dist/admin/components/AdminCmsAssetProvider.js.map +1 -0
  15. package/dist/admin/components/BackgroundFields.d.ts +4 -0
  16. package/dist/admin/components/BackgroundFields.d.ts.map +1 -0
  17. package/dist/admin/components/BackgroundFields.js +40 -0
  18. package/dist/admin/components/BackgroundFields.js.map +1 -0
  19. package/dist/admin/components/ButtonLinkFields.d.ts +6 -0
  20. package/dist/admin/components/ButtonLinkFields.d.ts.map +1 -0
  21. package/dist/admin/components/ButtonLinkFields.js +127 -0
  22. package/dist/admin/components/ButtonLinkFields.js.map +1 -0
  23. package/dist/admin/components/CarouselPreviewNav.d.ts +12 -0
  24. package/dist/admin/components/CarouselPreviewNav.d.ts.map +1 -0
  25. package/dist/admin/components/CarouselPreviewNav.js +31 -0
  26. package/dist/admin/components/CarouselPreviewNav.js.map +1 -0
  27. package/dist/admin/components/CmsContentEditorLayout.d.ts +12 -0
  28. package/dist/admin/components/CmsContentEditorLayout.d.ts.map +1 -0
  29. package/dist/admin/components/CmsContentEditorLayout.js +9 -0
  30. package/dist/admin/components/CmsContentEditorLayout.js.map +1 -0
  31. package/dist/admin/components/ComponentDragHandle.d.ts +6 -0
  32. package/dist/admin/components/ComponentDragHandle.d.ts.map +1 -0
  33. package/dist/admin/components/ComponentDragHandle.js +119 -0
  34. package/dist/admin/components/ComponentDragHandle.js.map +1 -0
  35. package/dist/admin/components/ContentSliderActionBarExtras.d.ts +6 -0
  36. package/dist/admin/components/ContentSliderActionBarExtras.d.ts.map +1 -0
  37. package/dist/admin/components/ContentSliderActionBarExtras.js +109 -0
  38. package/dist/admin/components/ContentSliderActionBarExtras.js.map +1 -0
  39. package/dist/admin/components/HookBlockAttachmentsPanel.d.ts +9 -0
  40. package/dist/admin/components/HookBlockAttachmentsPanel.d.ts.map +1 -0
  41. package/dist/admin/components/HookBlockAttachmentsPanel.js +137 -0
  42. package/dist/admin/components/HookBlockAttachmentsPanel.js.map +1 -0
  43. package/dist/admin/components/PageBuilderActionBar.d.ts +10 -0
  44. package/dist/admin/components/PageBuilderActionBar.d.ts.map +1 -0
  45. package/dist/admin/components/PageBuilderActionBar.js +118 -0
  46. package/dist/admin/components/PageBuilderActionBar.js.map +1 -0
  47. package/dist/admin/components/PageBuilderDrawer.d.ts +16 -0
  48. package/dist/admin/components/PageBuilderDrawer.d.ts.map +1 -0
  49. package/dist/admin/components/PageBuilderDrawer.js +53 -0
  50. package/dist/admin/components/PageBuilderDrawer.js.map +1 -0
  51. package/dist/admin/components/PageBuilderEditor.d.ts +45 -0
  52. package/dist/admin/components/PageBuilderEditor.d.ts.map +1 -0
  53. package/dist/admin/components/PageBuilderEditor.js +632 -0
  54. package/dist/admin/components/PageBuilderEditor.js.map +1 -0
  55. package/dist/admin/components/PuckActionGuard.d.ts +12 -0
  56. package/dist/admin/components/PuckActionGuard.d.ts.map +1 -0
  57. package/dist/admin/components/PuckActionGuard.js +30 -0
  58. package/dist/admin/components/PuckActionGuard.js.map +1 -0
  59. package/dist/admin/components/RowLayoutPicker.d.ts +8 -0
  60. package/dist/admin/components/RowLayoutPicker.d.ts.map +1 -0
  61. package/dist/admin/components/RowLayoutPicker.js +17 -0
  62. package/dist/admin/components/RowLayoutPicker.js.map +1 -0
  63. package/dist/admin/components/SliderPreviewActionBarExtras.d.ts +6 -0
  64. package/dist/admin/components/SliderPreviewActionBarExtras.d.ts.map +1 -0
  65. package/dist/admin/components/SliderPreviewActionBarExtras.js +32 -0
  66. package/dist/admin/components/SliderPreviewActionBarExtras.js.map +1 -0
  67. package/dist/admin/components/admin-catalog-preview-map.d.ts +17 -0
  68. package/dist/admin/components/admin-catalog-preview-map.d.ts.map +1 -0
  69. package/dist/admin/components/admin-catalog-preview-map.js +18 -0
  70. package/dist/admin/components/admin-catalog-preview-map.js.map +1 -0
  71. package/dist/admin/components/build-viewports.d.ts +23 -0
  72. package/dist/admin/components/build-viewports.d.ts.map +1 -0
  73. package/dist/admin/components/build-viewports.js +23 -0
  74. package/dist/admin/components/build-viewports.js.map +1 -0
  75. package/dist/admin/components/cms-template-layout.d.ts +16 -0
  76. package/dist/admin/components/cms-template-layout.d.ts.map +1 -0
  77. package/dist/admin/components/cms-template-layout.js +53 -0
  78. package/dist/admin/components/cms-template-layout.js.map +1 -0
  79. package/dist/admin/components/page-builder-i18n.d.ts +27 -0
  80. package/dist/admin/components/page-builder-i18n.d.ts.map +1 -0
  81. package/dist/admin/components/page-builder-i18n.js +34 -0
  82. package/dist/admin/components/page-builder-i18n.js.map +1 -0
  83. package/dist/admin/components/puck-safe.d.ts +10 -0
  84. package/dist/admin/components/puck-safe.d.ts.map +1 -0
  85. package/dist/admin/components/puck-safe.js +22 -0
  86. package/dist/admin/components/puck-safe.js.map +1 -0
  87. package/dist/admin/components/scope-utils.d.ts +4 -0
  88. package/dist/admin/components/scope-utils.d.ts.map +1 -0
  89. package/dist/admin/components/scope-utils.js +7 -0
  90. package/dist/admin/components/scope-utils.js.map +1 -0
  91. package/dist/admin/editors/BlockEditor.d.ts +9 -0
  92. package/dist/admin/editors/BlockEditor.d.ts.map +1 -0
  93. package/dist/admin/editors/BlockEditor.js +217 -0
  94. package/dist/admin/editors/BlockEditor.js.map +1 -0
  95. package/dist/admin/editors/PageEditor.d.ts +9 -0
  96. package/dist/admin/editors/PageEditor.d.ts.map +1 -0
  97. package/dist/admin/editors/PageEditor.js +316 -0
  98. package/dist/admin/editors/PageEditor.js.map +1 -0
  99. package/dist/admin/editors/TemplateEditor.d.ts +9 -0
  100. package/dist/admin/editors/TemplateEditor.d.ts.map +1 -0
  101. package/dist/admin/editors/TemplateEditor.js +180 -0
  102. package/dist/admin/editors/TemplateEditor.js.map +1 -0
  103. package/dist/admin/index.d.ts +38 -0
  104. package/dist/admin/index.d.ts.map +1 -0
  105. package/dist/admin/index.js +144 -0
  106. package/dist/admin/index.js.map +1 -0
  107. package/dist/admin/pages/BlocksListPage.d.ts +9 -0
  108. package/dist/admin/pages/BlocksListPage.d.ts.map +1 -0
  109. package/dist/admin/pages/BlocksListPage.js +47 -0
  110. package/dist/admin/pages/BlocksListPage.js.map +1 -0
  111. package/dist/admin/pages/HooksPage.d.ts +9 -0
  112. package/dist/admin/pages/HooksPage.d.ts.map +1 -0
  113. package/dist/admin/pages/HooksPage.js +41 -0
  114. package/dist/admin/pages/HooksPage.js.map +1 -0
  115. package/dist/admin/pages/PagesListPage.d.ts +9 -0
  116. package/dist/admin/pages/PagesListPage.d.ts.map +1 -0
  117. package/dist/admin/pages/PagesListPage.js +51 -0
  118. package/dist/admin/pages/PagesListPage.js.map +1 -0
  119. package/dist/admin/pages/TemplatesListPage.d.ts +9 -0
  120. package/dist/admin/pages/TemplatesListPage.d.ts.map +1 -0
  121. package/dist/admin/pages/TemplatesListPage.js +47 -0
  122. package/dist/admin/pages/TemplatesListPage.js.map +1 -0
  123. package/dist/admin-ui/index.d.ts +90 -0
  124. package/dist/admin-ui/index.d.ts.map +1 -0
  125. package/dist/admin-ui/index.js +89 -0
  126. package/dist/admin-ui/index.js.map +1 -0
  127. package/dist/backend/cli/block-names.d.ts +92 -0
  128. package/dist/backend/cli/block-names.d.ts.map +1 -0
  129. package/dist/backend/cli/block-names.js +132 -0
  130. package/dist/backend/cli/block-names.js.map +1 -0
  131. package/dist/backend/entities/cms-block.entity.d.ts +20 -0
  132. package/dist/backend/entities/cms-block.entity.d.ts.map +1 -0
  133. package/dist/backend/entities/cms-block.entity.js +77 -0
  134. package/dist/backend/entities/cms-block.entity.js.map +1 -0
  135. package/dist/backend/entities/cms-hook-block-attachment.entity.d.ts +15 -0
  136. package/dist/backend/entities/cms-hook-block-attachment.entity.d.ts.map +1 -0
  137. package/dist/backend/entities/cms-hook-block-attachment.entity.js +46 -0
  138. package/dist/backend/entities/cms-hook-block-attachment.entity.js.map +1 -0
  139. package/dist/backend/entities/cms-hook.entity.d.ts +20 -0
  140. package/dist/backend/entities/cms-hook.entity.d.ts.map +1 -0
  141. package/dist/backend/entities/cms-hook.entity.js +73 -0
  142. package/dist/backend/entities/cms-hook.entity.js.map +1 -0
  143. package/dist/backend/entities/cms-page.entity.d.ts +43 -0
  144. package/dist/backend/entities/cms-page.entity.d.ts.map +1 -0
  145. package/dist/backend/entities/cms-page.entity.js +140 -0
  146. package/dist/backend/entities/cms-page.entity.js.map +1 -0
  147. package/dist/backend/entities/cms-template.entity.d.ts +20 -0
  148. package/dist/backend/entities/cms-template.entity.d.ts.map +1 -0
  149. package/dist/backend/entities/cms-template.entity.js +73 -0
  150. package/dist/backend/entities/cms-template.entity.js.map +1 -0
  151. package/dist/backend/index.d.ts +157 -0
  152. package/dist/backend/index.d.ts.map +1 -0
  153. package/dist/backend/index.js +317 -0
  154. package/dist/backend/index.js.map +1 -0
  155. package/dist/backend/plugin.d.ts +81 -0
  156. package/dist/backend/plugin.d.ts.map +1 -0
  157. package/dist/backend/plugin.js +81 -0
  158. package/dist/backend/plugin.js.map +1 -0
  159. package/dist/backend/routes.admin.d.ts +19 -0
  160. package/dist/backend/routes.admin.d.ts.map +1 -0
  161. package/dist/backend/routes.admin.js +164 -0
  162. package/dist/backend/routes.admin.js.map +1 -0
  163. package/dist/backend/routes.storefront.d.ts +6 -0
  164. package/dist/backend/routes.storefront.d.ts.map +1 -0
  165. package/dist/backend/routes.storefront.js +89 -0
  166. package/dist/backend/routes.storefront.js.map +1 -0
  167. package/dist/backend/services/asset-embed-resolver.d.ts +17 -0
  168. package/dist/backend/services/asset-embed-resolver.d.ts.map +1 -0
  169. package/dist/backend/services/asset-embed-resolver.js +40 -0
  170. package/dist/backend/services/asset-embed-resolver.js.map +1 -0
  171. package/dist/backend/services/asset-references.d.ts +4 -0
  172. package/dist/backend/services/asset-references.d.ts.map +1 -0
  173. package/dist/backend/services/asset-references.js +55 -0
  174. package/dist/backend/services/asset-references.js.map +1 -0
  175. package/dist/backend/services/cms-block-read-port.d.ts +27 -0
  176. package/dist/backend/services/cms-block-read-port.d.ts.map +1 -0
  177. package/dist/backend/services/cms-block-read-port.js +50 -0
  178. package/dist/backend/services/cms-block-read-port.js.map +1 -0
  179. package/dist/backend/services/cms-block-seed-port.d.ts +31 -0
  180. package/dist/backend/services/cms-block-seed-port.d.ts.map +1 -0
  181. package/dist/backend/services/cms-block-seed-port.js +68 -0
  182. package/dist/backend/services/cms-block-seed-port.js.map +1 -0
  183. package/dist/backend/services/cms-block-service.d.ts +38 -0
  184. package/dist/backend/services/cms-block-service.d.ts.map +1 -0
  185. package/dist/backend/services/cms-block-service.js +218 -0
  186. package/dist/backend/services/cms-block-service.js.map +1 -0
  187. package/dist/backend/services/cms-cache.d.ts +54 -0
  188. package/dist/backend/services/cms-cache.d.ts.map +1 -0
  189. package/dist/backend/services/cms-cache.js +113 -0
  190. package/dist/backend/services/cms-cache.js.map +1 -0
  191. package/dist/backend/services/cms-hook-service.d.ts +35 -0
  192. package/dist/backend/services/cms-hook-service.d.ts.map +1 -0
  193. package/dist/backend/services/cms-hook-service.js +216 -0
  194. package/dist/backend/services/cms-hook-service.js.map +1 -0
  195. package/dist/backend/services/cms-language-reference.d.ts +11 -0
  196. package/dist/backend/services/cms-language-reference.d.ts.map +1 -0
  197. package/dist/backend/services/cms-language-reference.js +26 -0
  198. package/dist/backend/services/cms-language-reference.js.map +1 -0
  199. package/dist/backend/services/cms-page-read-port.d.ts +23 -0
  200. package/dist/backend/services/cms-page-read-port.d.ts.map +1 -0
  201. package/dist/backend/services/cms-page-read-port.js +54 -0
  202. package/dist/backend/services/cms-page-read-port.js.map +1 -0
  203. package/dist/backend/services/cms-page-service.d.ts +104 -0
  204. package/dist/backend/services/cms-page-service.d.ts.map +1 -0
  205. package/dist/backend/services/cms-page-service.js +468 -0
  206. package/dist/backend/services/cms-page-service.js.map +1 -0
  207. package/dist/backend/services/cms-reference-registry.d.ts +30 -0
  208. package/dist/backend/services/cms-reference-registry.d.ts.map +1 -0
  209. package/dist/backend/services/cms-reference-registry.js +98 -0
  210. package/dist/backend/services/cms-reference-registry.js.map +1 -0
  211. package/dist/backend/services/cms-template-service.d.ts +37 -0
  212. package/dist/backend/services/cms-template-service.d.ts.map +1 -0
  213. package/dist/backend/services/cms-template-service.js +205 -0
  214. package/dist/backend/services/cms-template-service.js.map +1 -0
  215. package/dist/backend/services/content-tree-walker.d.ts +7 -0
  216. package/dist/backend/services/content-tree-walker.d.ts.map +1 -0
  217. package/dist/backend/services/content-tree-walker.js +89 -0
  218. package/dist/backend/services/content-tree-walker.js.map +1 -0
  219. package/dist/backend/services/page-builder-registry.d.ts +120 -0
  220. package/dist/backend/services/page-builder-registry.d.ts.map +1 -0
  221. package/dist/backend/services/page-builder-registry.js +220 -0
  222. package/dist/backend/services/page-builder-registry.js.map +1 -0
  223. package/dist/backend/services/seed-hooks.d.ts +22 -0
  224. package/dist/backend/services/seed-hooks.d.ts.map +1 -0
  225. package/dist/backend/services/seed-hooks.js +94 -0
  226. package/dist/backend/services/seed-hooks.js.map +1 -0
  227. package/dist/backend/services/storefront-resolver.d.ts +71 -0
  228. package/dist/backend/services/storefront-resolver.d.ts.map +1 -0
  229. package/dist/backend/services/storefront-resolver.js +329 -0
  230. package/dist/backend/services/storefront-resolver.js.map +1 -0
  231. package/dist/manifest.d.ts +225 -0
  232. package/dist/manifest.d.ts.map +1 -0
  233. package/dist/manifest.js +695 -0
  234. package/dist/manifest.js.map +1 -0
  235. package/dist/migrations/20260425T162418_cms_pages_init.d.ts +10 -0
  236. package/dist/migrations/20260425T162418_cms_pages_init.d.ts.map +1 -0
  237. package/dist/migrations/20260425T162418_cms_pages_init.js +30 -0
  238. package/dist/migrations/20260425T162418_cms_pages_init.js.map +1 -0
  239. package/dist/migrations/20260505T130214_cms_init.d.ts +28 -0
  240. package/dist/migrations/20260505T130214_cms_init.d.ts.map +1 -0
  241. package/dist/migrations/20260505T130214_cms_init.js +332 -0
  242. package/dist/migrations/20260505T130214_cms_init.js.map +1 -0
  243. package/dist/migrations/20260903T101741_cms_namespace_block_names.d.ts +6 -0
  244. package/dist/migrations/20260903T101741_cms_namespace_block_names.d.ts.map +1 -0
  245. package/dist/migrations/20260903T101741_cms_namespace_block_names.js +60 -0
  246. package/dist/migrations/20260903T101741_cms_namespace_block_names.js.map +1 -0
  247. package/dist/migrations/20260912T094733_cms_sales_channel_cms_pages.d.ts +27 -0
  248. package/dist/migrations/20260912T094733_cms_sales_channel_cms_pages.d.ts.map +1 -0
  249. package/dist/migrations/20260912T094733_cms_sales_channel_cms_pages.js +44 -0
  250. package/dist/migrations/20260912T094733_cms_sales_channel_cms_pages.js.map +1 -0
  251. package/dist/migrations/20260912T125709_cms_page_body_asset_ref_index.d.ts +32 -0
  252. package/dist/migrations/20260912T125709_cms_page_body_asset_ref_index.d.ts.map +1 -0
  253. package/dist/migrations/20260912T125709_cms_page_body_asset_ref_index.js +36 -0
  254. package/dist/migrations/20260912T125709_cms_page_body_asset_ref_index.js.map +1 -0
  255. package/dist/migrations/index.d.ts +31 -0
  256. package/dist/migrations/index.d.ts.map +1 -0
  257. package/dist/migrations/index.js +37 -0
  258. package/dist/migrations/index.js.map +1 -0
  259. package/docs/cms/extending-page-builder.md +256 -0
  260. package/docs/cms/index.md +233 -0
  261. package/i18n/en.json +231 -0
  262. package/i18n/pl.json +231 -0
  263. package/package.json +125 -3
  264. package/tailwind.css +16 -0
@@ -0,0 +1,37 @@
1
+ import type { EntityManager } from '@mikro-orm/postgresql';
2
+ import { type CmsTemplateDetail, type CmsTemplateSummary, type CreateCmsTemplateRequest, type PatchCmsTemplateRequest } from '@endora-commerce/contracts';
3
+ import type { CmsReferenceRegistry } from './cms-reference-registry.js';
4
+ import type { CmsCache } from './cms-cache.js';
5
+ export declare class CmsTemplateService {
6
+ private readonly emFactory;
7
+ private readonly knownComponentNames;
8
+ private readonly references;
9
+ private readonly cache?;
10
+ constructor(emFactory: () => EntityManager, knownComponentNames: () => Iterable<string>, references: CmsReferenceRegistry, cache?: CmsCache | undefined);
11
+ /**
12
+ * Templates are referenced from Pages and Blocks, both of which we
13
+ * cache. We don't track inverse maps yet so a coarse drop of all pages
14
+ * and all blocks is the safe choice; the next request rebuilds them.
15
+ */
16
+ private invalidateAll;
17
+ list(filters?: {
18
+ salesChannelId?: string;
19
+ }): Promise<{
20
+ data: CmsTemplateSummary[];
21
+ nextCursor: null;
22
+ }>;
23
+ create(input: CreateCmsTemplateRequest): Promise<CmsTemplateDetail>;
24
+ get(id: string): Promise<CmsTemplateDetail>;
25
+ patch(id: string, input: PatchCmsTemplateRequest): Promise<CmsTemplateDetail>;
26
+ setContent(id: string, language: string, data: unknown, version: number): Promise<CmsTemplateDetail>;
27
+ delete(id: string): Promise<void>;
28
+ private findRow;
29
+ private assertCodeAvailable;
30
+ private replaceChannelScope;
31
+ private channelIdsFor;
32
+ private assertVersion;
33
+ private toSummary;
34
+ private toDetail;
35
+ private iso;
36
+ }
37
+ //# sourceMappingURL=cms-template-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cms-template-service.d.ts","sourceRoot":"","sources":["../../../src/backend/services/cms-template-service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC7B,MAAM,4BAA4B,CAAC;AAGpC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAgB/C,qBAAa,kBAAkB;IAE3B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAHN,SAAS,EAAE,MAAM,aAAa,EAC9B,mBAAmB,EAAE,MAAM,QAAQ,CAAC,MAAM,CAAC,EAC3C,UAAU,EAAE,oBAAoB,EAChC,KAAK,CAAC,EAAE,QAAQ,YAAA;IAGnC;;;;OAIG;YACW,aAAa;IAKrB,IAAI,CAAC,OAAO,GAAE;QAAE,cAAc,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC;QAC7D,IAAI,EAAE,kBAAkB,EAAE,CAAC;QAC3B,UAAU,EAAE,IAAI,CAAC;KAClB,CAAC;IAwBI,MAAM,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA2BnE,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAM3C,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAyC7E,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA4BpG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAWzB,OAAO;YAOP,mBAAmB;YAoBnB,mBAAmB;YAkBnB,aAAa;IAQ3B,OAAO,CAAC,aAAa;YAMP,SAAS;YAcT,QAAQ;IAStB,OAAO,CAAC,GAAG;CAGZ"}
@@ -0,0 +1,205 @@
1
+ import { randomUUID } from 'crypto';
2
+ import { ERROR_CODES, } from '@endora-commerce/contracts';
3
+ import { HttpError } from '@endora-commerce/platform/http';
4
+ import { walkUnknownComponents } from './content-tree-walker.js';
5
+ const emptyContent = { languages: {} };
6
+ export class CmsTemplateService {
7
+ emFactory;
8
+ knownComponentNames;
9
+ references;
10
+ cache;
11
+ constructor(emFactory, knownComponentNames, references, cache) {
12
+ this.emFactory = emFactory;
13
+ this.knownComponentNames = knownComponentNames;
14
+ this.references = references;
15
+ this.cache = cache;
16
+ }
17
+ /**
18
+ * Templates are referenced from Pages and Blocks, both of which we
19
+ * cache. We don't track inverse maps yet so a coarse drop of all pages
20
+ * and all blocks is the safe choice; the next request rebuilds them.
21
+ */
22
+ async invalidateAll() {
23
+ if (!this.cache)
24
+ return;
25
+ await this.cache.invalidateAll();
26
+ }
27
+ async list(filters = {}) {
28
+ const params = [];
29
+ const where = [];
30
+ if (filters.salesChannelId) {
31
+ params.push(filters.salesChannelId);
32
+ where.push(`exists (
33
+ select 1 from cms_template_sales_channels ctsc
34
+ where ctsc.template_id = t.id and ctsc.sales_channel_id = ?
35
+ )`);
36
+ }
37
+ const rows = (await this.emFactory().execute(`select t.* from cms_templates t
38
+ ${where.length > 0 ? `where ${where.join(' and ')}` : ''}
39
+ order by t.updated_at desc
40
+ limit 50`, params));
41
+ return { data: await Promise.all(rows.map((row) => this.toSummary(row))), nextCursor: null };
42
+ }
43
+ async create(input) {
44
+ const em = this.emFactory();
45
+ const id = randomUUID();
46
+ const now = new Date();
47
+ await em.transactional(async (tx) => {
48
+ await this.assertCodeAvailable(tx, input.code, input.salesChannelIds);
49
+ await tx.execute(`insert into cms_templates
50
+ (id, name, code, description, content, languages, version, created_at, updated_at)
51
+ values (?, ?, ?, ?, ?::jsonb, ?::jsonb, 1, ?, ?)`, [
52
+ id,
53
+ input.name,
54
+ input.code,
55
+ input.description ?? null,
56
+ JSON.stringify(emptyContent),
57
+ JSON.stringify(input.languages),
58
+ now,
59
+ now,
60
+ ]);
61
+ await this.replaceChannelScope(tx, id, input.salesChannelIds, input.code);
62
+ });
63
+ await this.invalidateAll();
64
+ return this.get(id);
65
+ }
66
+ async get(id) {
67
+ const row = await this.findRow(id);
68
+ if (!row)
69
+ throw new HttpError(404, ERROR_CODES.CMS_TEMPLATE_NOT_FOUND, 'CMS Template not found.');
70
+ return this.toDetail(row);
71
+ }
72
+ async patch(id, input) {
73
+ const em = this.emFactory();
74
+ await em.transactional(async (tx) => {
75
+ const row = await this.findRow(id, tx);
76
+ if (!row)
77
+ throw new HttpError(404, ERROR_CODES.CMS_TEMPLATE_NOT_FOUND, 'CMS Template not found.');
78
+ this.assertVersion(row, input.version);
79
+ const nextCode = input.code ?? row.code;
80
+ const nextChannels = input.salesChannelIds ?? (await this.channelIdsFor(id, tx));
81
+ if (input.code || input.salesChannelIds) {
82
+ await this.assertCodeAvailable(tx, nextCode, nextChannels, id);
83
+ }
84
+ const sets = [];
85
+ const params = [];
86
+ const set = (sql, value) => {
87
+ sets.push(sql);
88
+ params.push(value);
89
+ };
90
+ if (input.name !== undefined)
91
+ set('name = ?', input.name);
92
+ if (input.code !== undefined)
93
+ set('code = ?', input.code);
94
+ if (input.description !== undefined)
95
+ set('description = ?', input.description);
96
+ if (input.languages !== undefined)
97
+ set('languages = ?::jsonb', JSON.stringify(input.languages));
98
+ if (sets.length > 0) {
99
+ params.push(id);
100
+ await tx.execute(`update cms_templates
101
+ set ${sets.join(', ')}, version = version + 1, updated_at = now()
102
+ where id = ?`, params);
103
+ }
104
+ if (input.salesChannelIds || input.code) {
105
+ await this.replaceChannelScope(tx, id, nextChannels, nextCode);
106
+ }
107
+ });
108
+ await this.invalidateAll();
109
+ return this.get(id);
110
+ }
111
+ async setContent(id, language, data, version) {
112
+ const em = this.emFactory();
113
+ await em.transactional(async (tx) => {
114
+ const row = await this.findRow(id, tx);
115
+ if (!row)
116
+ throw new HttpError(404, ERROR_CODES.CMS_TEMPLATE_NOT_FOUND, 'CMS Template not found.');
117
+ this.assertVersion(row, version);
118
+ const unknown = walkUnknownComponents(data, new Set(this.knownComponentNames()));
119
+ if (unknown.size > 0) {
120
+ console.warn(`CMS template ${id} saved with unknown components: ${Array.from(unknown).join(', ')}`);
121
+ }
122
+ const content = {
123
+ languages: { ...(row.content.languages ?? {}), [language]: data },
124
+ };
125
+ const languages = row.languages.includes(language) ? row.languages : [...row.languages, language];
126
+ await tx.execute(`update cms_templates
127
+ set content = ?::jsonb, languages = ?::jsonb, version = version + 1, updated_at = now()
128
+ where id = ?`, [JSON.stringify(content), JSON.stringify(languages), id]);
129
+ });
130
+ await this.invalidateAll();
131
+ return this.get(id);
132
+ }
133
+ async delete(id) {
134
+ const row = await this.findRow(id);
135
+ if (!row)
136
+ throw new HttpError(404, ERROR_CODES.CMS_TEMPLATE_NOT_FOUND, 'CMS Template not found.');
137
+ const refs = await this.references.findTemplateReferences(row.id, row.code);
138
+ if (refs.length > 0) {
139
+ throw new HttpError(409, ERROR_CODES.CMS_REFERENCED, 'CMS Template is referenced.');
140
+ }
141
+ await this.emFactory().execute('delete from cms_templates where id = ?', [id]);
142
+ await this.invalidateAll();
143
+ }
144
+ async findRow(id, em = this.emFactory()) {
145
+ const rows = (await em.execute('select * from cms_templates where id = ?', [
146
+ id,
147
+ ]));
148
+ return rows[0] ?? null;
149
+ }
150
+ async assertCodeAvailable(em, code, salesChannelIds, exceptTemplateId) {
151
+ if (salesChannelIds.length === 0)
152
+ return;
153
+ const placeholders = salesChannelIds.map(() => '?').join(', ');
154
+ const rows = (await em.execute(`select template_id from cms_template_sales_channels
155
+ where code = ? and sales_channel_id in (${placeholders})
156
+ ${exceptTemplateId ? 'and template_id <> ?' : ''}
157
+ limit 1`, exceptTemplateId ? [code, ...salesChannelIds, exceptTemplateId] : [code, ...salesChannelIds]));
158
+ if (rows.length > 0) {
159
+ throw new HttpError(409, ERROR_CODES.CMS_CODE_CONFLICT, 'CMS Template code already exists.');
160
+ }
161
+ }
162
+ async replaceChannelScope(em, templateId, salesChannelIds, code) {
163
+ await em.execute('delete from cms_template_sales_channels where template_id = ?', [
164
+ templateId,
165
+ ]);
166
+ for (const salesChannelId of salesChannelIds) {
167
+ await em.execute(`insert into cms_template_sales_channels (template_id, sales_channel_id, code)
168
+ values (?, ?, ?)`, [templateId, salesChannelId, code]);
169
+ }
170
+ }
171
+ async channelIdsFor(templateId, em = this.emFactory()) {
172
+ const rows = (await em.execute('select sales_channel_id::text as id from cms_template_sales_channels where template_id = ?', [templateId]));
173
+ return rows.map((row) => row.id);
174
+ }
175
+ assertVersion(row, version) {
176
+ if (version !== undefined && version !== row.version) {
177
+ throw new HttpError(409, ERROR_CODES.VERSION_CONFLICT, 'CMS Template was updated concurrently.');
178
+ }
179
+ }
180
+ async toSummary(row) {
181
+ return {
182
+ id: row.id,
183
+ name: row.name,
184
+ code: row.code,
185
+ description: row.description,
186
+ salesChannelIds: await this.channelIdsFor(row.id),
187
+ languages: row.languages,
188
+ version: row.version,
189
+ createdAt: this.iso(row.created_at),
190
+ updatedAt: this.iso(row.updated_at),
191
+ };
192
+ }
193
+ async toDetail(row) {
194
+ return {
195
+ ...(await this.toSummary(row)),
196
+ content: {
197
+ languages: row.content.languages ?? {},
198
+ },
199
+ };
200
+ }
201
+ iso(value) {
202
+ return value instanceof Date ? value.toISOString() : new Date(value).toISOString();
203
+ }
204
+ }
205
+ //# sourceMappingURL=cms-template-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cms-template-service.js","sourceRoot":"","sources":["../../../src/backend/services/cms-template-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export type AssetIdSet = Set<string>;
2
+ export type CodeSet = Set<string>;
3
+ export declare function walkAssetIds(tree: unknown, acc?: AssetIdSet): AssetIdSet;
4
+ export declare function walkBlockEmbeds(tree: unknown, acc?: CodeSet): CodeSet;
5
+ export declare function walkTemplateEmbeds(tree: unknown, acc?: CodeSet): CodeSet;
6
+ export declare function walkUnknownComponents(tree: unknown, knownNames: Set<string>, acc?: Set<string>): Set<string>;
7
+ //# sourceMappingURL=content-tree-walker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-tree-walker.d.ts","sourceRoot":"","sources":["../../../src/backend/services/content-tree-walker.ts"],"names":[],"mappings":"AAkBA,MAAM,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;AACrC,MAAM,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;AAElC,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,GAAE,UAAsB,GAAG,UAAU,CAgBnF;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,GAAE,OAAmB,GAAG,OAAO,CAEhF;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,GAAE,OAAmB,GAAG,OAAO,CAEnF;AAqBD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,GAAE,GAAG,CAAC,MAAM,CAAa,GAAG,GAAG,CAAC,MAAM,CAAC,CAcvH"}
@@ -0,0 +1,89 @@
1
+ // Content tree walker — feature 014 / T024.
2
+ //
3
+ // Walks a Puck-shaped JSON tree and yields:
4
+ // - every `assetId` value found anywhere on `props` (case-insensitive
5
+ // match on the suffix `assetId` so `iconAssetId`, `mainImageAssetId`,
6
+ // etc. are caught too).
7
+ // - every `code` referenced by an `InsertBlock` or `InsertTemplate` node.
8
+ // - every component `type` not in a known-names set.
9
+ //
10
+ // Used by:
11
+ // - the AssetReferenceRegistry's CMS descriptor (asset deletion blocked
12
+ // when an asset is referenced inside content).
13
+ // - the CmsReferenceRegistry (block / template deletion blocked when
14
+ // embedded).
15
+ // - the storefront-resolver (collects every embed code in one walk so
16
+ // the resolver can batch-fetch).
17
+ // - the admin's "missing component" warning surface.
18
+ export function walkAssetIds(tree, acc = new Set()) {
19
+ if (tree === null || tree === undefined)
20
+ return acc;
21
+ if (Array.isArray(tree)) {
22
+ for (const item of tree)
23
+ walkAssetIds(item, acc);
24
+ return acc;
25
+ }
26
+ if (typeof tree !== 'object')
27
+ return acc;
28
+ const obj = tree;
29
+ for (const [key, val] of Object.entries(obj)) {
30
+ if (typeof val === 'string' && /assetId$/i.test(key)) {
31
+ if (val.length > 0)
32
+ acc.add(val);
33
+ }
34
+ else {
35
+ walkAssetIds(val, acc);
36
+ }
37
+ }
38
+ return acc;
39
+ }
40
+ export function walkBlockEmbeds(tree, acc = new Set()) {
41
+ return walkEmbedsByType(tree, 'cms.InsertBlock', acc);
42
+ }
43
+ export function walkTemplateEmbeds(tree, acc = new Set()) {
44
+ return walkEmbedsByType(tree, 'cms.InsertTemplate', acc);
45
+ }
46
+ function walkEmbedsByType(tree, typeName, acc) {
47
+ if (tree === null || tree === undefined)
48
+ return acc;
49
+ if (Array.isArray(tree)) {
50
+ for (const item of tree)
51
+ walkEmbedsByType(item, typeName, acc);
52
+ return acc;
53
+ }
54
+ if (typeof tree !== 'object')
55
+ return acc;
56
+ const obj = tree;
57
+ if (obj['type'] === typeName) {
58
+ const props = obj['props'];
59
+ if (props && typeof props === 'object' && typeof props['code'] === 'string') {
60
+ const code = props['code'];
61
+ if (code.length > 0)
62
+ acc.add(code);
63
+ }
64
+ }
65
+ for (const v of Object.values(obj))
66
+ walkEmbedsByType(v, typeName, acc);
67
+ return acc;
68
+ }
69
+ export function walkUnknownComponents(tree, knownNames, acc = new Set()) {
70
+ if (tree === null || tree === undefined)
71
+ return acc;
72
+ if (Array.isArray(tree)) {
73
+ for (const item of tree)
74
+ walkUnknownComponents(item, knownNames, acc);
75
+ return acc;
76
+ }
77
+ if (typeof tree !== 'object')
78
+ return acc;
79
+ const obj = tree;
80
+ if (typeof obj['type'] === 'string' && obj['props'] && typeof obj['props'] === 'object') {
81
+ const t = obj['type'];
82
+ if (!knownNames.has(t))
83
+ acc.add(t);
84
+ }
85
+ for (const v of Object.values(obj))
86
+ walkUnknownComponents(v, knownNames, acc);
87
+ return acc;
88
+ }
89
+ //# sourceMappingURL=content-tree-walker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-tree-walker.js","sourceRoot":"","sources":["../../../src/backend/services/content-tree-walker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,120 @@
1
+ import type { CmsFieldDescriptor, CmsColorPaletteEntry, CmsPageBuilderDescriptor, PageBuilderBreakpoints, PageBuilderContext } from '@endora-commerce/contracts/cms';
2
+ import type { ModuleManifest } from '@endora-commerce/contracts';
3
+ export type PageBuilderBreakpointsResolver = () => Promise<PageBuilderBreakpoints>;
4
+ export type ColorPaletteResolver = () => Promise<CmsColorPaletteEntry[]>;
5
+ export interface ComponentRegistration {
6
+ ownerModule: string;
7
+ fields: Record<string, CmsFieldDescriptor>;
8
+ /** Optional admin-side palette icon hint. */
9
+ previewIcon?: string;
10
+ /** Contexts where this component is available. Defaults to CMS-only. */
11
+ contexts?: PageBuilderContext[];
12
+ /** Module-relative i18n key for the palette entry's label. */
13
+ labelKey?: string;
14
+ /** Module-relative i18n key for the palette entry's description. */
15
+ descriptionKey?: string;
16
+ /** The declared category key this block sits in. */
17
+ category?: string;
18
+ /** Props a freshly inserted node carries. */
19
+ defaultProps?: Record<string, unknown>;
20
+ /** Which of `fields` accept a per-breakpoint override. */
21
+ responsiveFields?: string[];
22
+ /** Sort order within the category. */
23
+ weight?: number;
24
+ }
25
+ export interface PageBuilderRegistryOptions {
26
+ breakpoints?: PageBuilderBreakpoints;
27
+ /**
28
+ * The composed modules, in the shape both composition roots contribute as
29
+ * `resolvedModuleRegistry` — core manifests plus this deployment's overlay
30
+ * modules. Typed by what this registry reads (feature 075, Phase C).
31
+ */
32
+ manifests?: ReadonlyArray<{
33
+ manifest: ModuleManifest;
34
+ }> | undefined;
35
+ /**
36
+ * **Effective presence — both axes** (Principle XVII, FR-010).
37
+ *
38
+ * Omitted ⇒ every declaring module counts as present, which is the
39
+ * pre-composition path (unit tests, the CI helpers) and not a fall-open: a
40
+ * presence read before the registry cache is loaded throws rather than
41
+ * answering, so an unwired registry cannot be mistaken for a loaded one that
42
+ * found nothing.
43
+ */
44
+ isModulePresent?: ((moduleId: string) => boolean) | undefined;
45
+ }
46
+ /**
47
+ * Raised when two modules declare one block name.
48
+ *
49
+ * **D-31's collision requirement, and the reversal of defect D-d**: the old
50
+ * `register` warned and overwrote, which is last-writer-wins over a *persisted*
51
+ * identifier — one contributor's stored documents silently rendering as
52
+ * another's block. It has never been exercised because there was one
53
+ * contributor; there are now six.
54
+ *
55
+ * **Two contributors, never one registering twice.** The owner is compared, so
56
+ * a module re-declaring its own manifest is idempotent; a name that arrives
57
+ * from a second module id is the collision, and it is the only thing this error
58
+ * is for.
59
+ */
60
+ export declare class DuplicateBlockNameError extends Error {
61
+ constructor(name: string, first: string, second: string);
62
+ }
63
+ export declare class PageBuilderRegistry {
64
+ private readonly components;
65
+ private readonly categories;
66
+ private readonly schemaVersion;
67
+ private readonly breakpoints;
68
+ private readonly isModulePresent;
69
+ private breakpointsResolver?;
70
+ private colorPaletteResolver?;
71
+ constructor(options?: PageBuilderRegistryOptions);
72
+ /**
73
+ * Take one module's `blocks` and `blockCategories` declarations.
74
+ *
75
+ * The owner is the block name's first segment, which `defineModuleManifest`
76
+ * has already refused to let differ from the declaring module's `id`. It is
77
+ * read from the name rather than from the manifest so that the registry and
78
+ * the persisted document agree by construction.
79
+ */
80
+ registerManifest(manifest: ModuleManifest): void;
81
+ setBreakpointsResolver(resolver: PageBuilderBreakpointsResolver): void;
82
+ setColorPaletteResolver(resolver: ColorPaletteResolver): void;
83
+ resolveBreakpoints(): Promise<PageBuilderBreakpoints>;
84
+ isComponentRegistered(name: string): boolean;
85
+ /**
86
+ * Every declared block name, **unfiltered by presence**.
87
+ *
88
+ * This answers "is this string a block name this platform knows", which the
89
+ * reference registries ask when they decide whether a stored node is a known
90
+ * embed. A switched-off module's blocks are still real names in stored
91
+ * documents, so filtering here would make a present document's node look
92
+ * unknown — a different question with a different right answer from the
93
+ * palette's.
94
+ */
95
+ knownNames(): Set<string>;
96
+ getBreakpoints(): PageBuilderBreakpoints;
97
+ /**
98
+ * The metadata view used by `GET /api/v1/admin/cms/page-builder/config`.
99
+ *
100
+ * Filters to the effectively present modules and *then* folds the categories,
101
+ * in that order (`contracts/block-definition.md` §4.1). Both outputs are
102
+ * sorted by a function of the declarations alone, so the response is
103
+ * byte-identical under a re-composition or a reordering of `MODULES` — the
104
+ * D-45 property, which a fold at registration cannot have.
105
+ */
106
+ describe(): Promise<CmsPageBuilderDescriptor>;
107
+ /**
108
+ * Reduce every `(key, context)` group to one served record.
109
+ *
110
+ * `titleKey`, `weight` and `visible` come from **one** winning declaration and
111
+ * never field by field: a title from one module beside a weight from another
112
+ * is a presentation nobody wrote. The order is lowest `weight` first with an
113
+ * absent `weight` sorting after every declared one, ties broken by the
114
+ * declaring module's `id` ascending — a function of the declarations and of
115
+ * nothing else, so it is stable under re-composition
116
+ * (`contracts/block-definition.md` §1.1).
117
+ */
118
+ private foldCategories;
119
+ }
120
+ //# sourceMappingURL=page-builder-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-builder-registry.d.ts","sourceRoot":"","sources":["../../../src/backend/services/page-builder-registry.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAGV,kBAAkB,EAClB,oBAAoB,EACpB,wBAAwB,EACxB,sBAAsB,EACtB,kBAAkB,EACnB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAGjE,MAAM,MAAM,8BAA8B,GAAG,MAAM,OAAO,CAAC,sBAAsB,CAAC,CAAC;AAEnF,MAAM,MAAM,oBAAoB,GAAG,MAAM,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAC;AAEzE,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC3C,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAChC,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6CAA6C;IAC7C,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,0DAA0D;IAC1D,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,sCAAsC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAOD,MAAM,WAAW,0BAA0B;IACzC,WAAW,CAAC,EAAE,sBAAsB,CAAC;IACrC;;;;OAIG;IACH,SAAS,CAAC,EAAE,aAAa,CAAC;QAAE,QAAQ,EAAE,cAAc,CAAA;KAAE,CAAC,GAAG,SAAS,CAAC;IACpE;;;;;;;;OAQG;IACH,eAAe,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,SAAS,CAAC;CAC/D;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,uBAAwB,SAAQ,KAAK;gBACpC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAQxD;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA4C;IACvE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA6B;IACxD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAK;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAyB;IACrD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAgC;IAChE,OAAO,CAAC,mBAAmB,CAAC,CAAiC;IAC7D,OAAO,CAAC,oBAAoB,CAAC,CAAuB;gBAExC,OAAO,GAAE,0BAA+B;IAQpD;;;;;;;OAOG;IACH,gBAAgB,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI;IAgChD,sBAAsB,CAAC,QAAQ,EAAE,8BAA8B,GAAG,IAAI;IAItE,uBAAuB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI;IAIvD,kBAAkB,IAAI,OAAO,CAAC,sBAAsB,CAAC;IAO3D,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI5C;;;;;;;;;OASG;IACH,UAAU,IAAI,GAAG,CAAC,MAAM,CAAC;IAIzB,cAAc,IAAI,sBAAsB;IAIxC;;;;;;;;OAQG;IACG,QAAQ,IAAI,OAAO,CAAC,wBAAwB,CAAC;IA2BnD;;;;;;;;;;OAUG;IACH,OAAO,CAAC,cAAc;CA2BvB"}