@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,46 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { Entity, OptionalProps, PrimaryKey, Property } from '@mikro-orm/core';
11
+ import { GlobalEntity } from '@endora-commerce/platform/tenancy';
12
+ /**
13
+ * CmsHookBlockAttachment — orderable many-to-many between Hooks and
14
+ * Blocks. The composite PK (hookId, blockId) prevents the same Block
15
+ * from being attached twice to the same Hook; `position` drives the
16
+ * storefront's render order (ASC).
17
+ */
18
+ let CmsHookBlockAttachment = class CmsHookBlockAttachment {
19
+ [OptionalProps];
20
+ hookId;
21
+ blockId;
22
+ position = 0;
23
+ createdAt = new Date();
24
+ };
25
+ __decorate([
26
+ PrimaryKey({ type: 'uuid' }),
27
+ __metadata("design:type", String)
28
+ ], CmsHookBlockAttachment.prototype, "hookId", void 0);
29
+ __decorate([
30
+ PrimaryKey({ type: 'uuid' }),
31
+ __metadata("design:type", String)
32
+ ], CmsHookBlockAttachment.prototype, "blockId", void 0);
33
+ __decorate([
34
+ Property({ type: 'integer' }),
35
+ __metadata("design:type", Number)
36
+ ], CmsHookBlockAttachment.prototype, "position", void 0);
37
+ __decorate([
38
+ Property({ type: 'datetime', onCreate: () => new Date() }),
39
+ __metadata("design:type", Date)
40
+ ], CmsHookBlockAttachment.prototype, "createdAt", void 0);
41
+ CmsHookBlockAttachment = __decorate([
42
+ GlobalEntity(),
43
+ Entity({ tableName: 'cms_hook_block_attachments' })
44
+ ], CmsHookBlockAttachment);
45
+ export { CmsHookBlockAttachment };
46
+ //# sourceMappingURL=cms-hook-block-attachment.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cms-hook-block-attachment.entity.js","sourceRoot":"","sources":["../../../src/backend/entities/cms-hook-block-attachment.entity.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAEjE;;;;;GAKG;AAGI,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;IACjC,CAAC,aAAa,CAAC,CAA4B;IAG3C,MAAM,CAAU;IAGhB,OAAO,CAAU;IAGjB,QAAQ,GAAW,CAAC,CAAC;IAGrB,SAAS,GAAS,IAAI,IAAI,EAAE,CAAC;CAC9B,CAAA;AAVC;IADC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;sDACb;AAGhB;IADC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;uDACZ;AAGjB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;wDACT;AAGrB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;8BAChD,IAAI;yDAAc;AAblB,sBAAsB;IAFlC,YAAY,EAAE;IACd,MAAM,CAAC,EAAE,SAAS,EAAE,4BAA4B,EAAE,CAAC;GACvC,sBAAsB,CAclC"}
@@ -0,0 +1,20 @@
1
+ import { OptionalProps } from '@mikro-orm/core';
2
+ /**
3
+ * CmsHook — named storefront insertion point. The 23 seeded codes carry
4
+ * `isSystem=true` and cannot be deleted (research R8). Admin-created
5
+ * Hooks are fully editable + deletable. Code is globally unique (the
6
+ * storefront contract is keyed by code) and immutable after creation.
7
+ */
8
+ export declare class CmsHook {
9
+ [OptionalProps]?: 'id' | 'createdAt' | 'updatedAt' | 'active' | 'description' | 'isSystem' | 'version';
10
+ id: string;
11
+ name: string;
12
+ code: string;
13
+ active: boolean;
14
+ description?: string | null;
15
+ isSystem: boolean;
16
+ version: number;
17
+ createdAt: Date;
18
+ updatedAt: Date;
19
+ }
20
+ //# sourceMappingURL=cms-hook.entity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cms-hook.entity.d.ts","sourceRoot":"","sources":["../../../src/backend/entities/cms-hook.entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,aAAa,EAAgC,MAAM,iBAAiB,CAAC;AAItF;;;;;GAKG;AACH,qBAEa,OAAO;IAClB,CAAC,aAAa,CAAC,CAAC,EACZ,IAAI,GACJ,WAAW,GACX,WAAW,GACX,QAAQ,GACR,aAAa,GACb,UAAU,GACV,SAAS,CAAC;IAGd,EAAE,EAAE,MAAM,CAAgB;IAG1B,IAAI,EAAG,MAAM,CAAC;IAId,IAAI,EAAG,MAAM,CAAC;IAGd,MAAM,EAAE,OAAO,CAAQ;IAGvB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAG5B,QAAQ,EAAE,OAAO,CAAS;IAG1B,OAAO,EAAE,MAAM,CAAK;IAGpB,SAAS,EAAE,IAAI,CAAc;IAG7B,SAAS,EAAE,IAAI,CAAc;CAC9B"}
@@ -0,0 +1,73 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { Entity, OptionalProps, PrimaryKey, Property, Unique } from '@mikro-orm/core';
11
+ import { GlobalEntity } from '@endora-commerce/platform/tenancy';
12
+ import { randomUUID } from 'crypto';
13
+ /**
14
+ * CmsHook — named storefront insertion point. The 23 seeded codes carry
15
+ * `isSystem=true` and cannot be deleted (research R8). Admin-created
16
+ * Hooks are fully editable + deletable. Code is globally unique (the
17
+ * storefront contract is keyed by code) and immutable after creation.
18
+ */
19
+ let CmsHook = class CmsHook {
20
+ [OptionalProps];
21
+ id = randomUUID();
22
+ name;
23
+ code;
24
+ active = true;
25
+ description;
26
+ isSystem = false;
27
+ version = 1;
28
+ createdAt = new Date();
29
+ updatedAt = new Date();
30
+ };
31
+ __decorate([
32
+ PrimaryKey({ type: 'uuid' }),
33
+ __metadata("design:type", String)
34
+ ], CmsHook.prototype, "id", void 0);
35
+ __decorate([
36
+ Property({ type: 'string', length: 200 }),
37
+ __metadata("design:type", String)
38
+ ], CmsHook.prototype, "name", void 0);
39
+ __decorate([
40
+ Property({ type: 'string', length: 180 }),
41
+ Unique(),
42
+ __metadata("design:type", String)
43
+ ], CmsHook.prototype, "code", void 0);
44
+ __decorate([
45
+ Property({ type: 'boolean' }),
46
+ __metadata("design:type", Boolean)
47
+ ], CmsHook.prototype, "active", void 0);
48
+ __decorate([
49
+ Property({ type: 'text', nullable: true }),
50
+ __metadata("design:type", Object)
51
+ ], CmsHook.prototype, "description", void 0);
52
+ __decorate([
53
+ Property({ type: 'boolean' }),
54
+ __metadata("design:type", Boolean)
55
+ ], CmsHook.prototype, "isSystem", void 0);
56
+ __decorate([
57
+ Property({ type: 'integer' }),
58
+ __metadata("design:type", Number)
59
+ ], CmsHook.prototype, "version", void 0);
60
+ __decorate([
61
+ Property({ type: 'datetime', onCreate: () => new Date() }),
62
+ __metadata("design:type", Date)
63
+ ], CmsHook.prototype, "createdAt", void 0);
64
+ __decorate([
65
+ Property({ type: 'datetime', onUpdate: () => new Date() }),
66
+ __metadata("design:type", Date)
67
+ ], CmsHook.prototype, "updatedAt", void 0);
68
+ CmsHook = __decorate([
69
+ GlobalEntity(),
70
+ Entity({ tableName: 'cms_hooks' })
71
+ ], CmsHook);
72
+ export { CmsHook };
73
+ //# sourceMappingURL=cms-hook.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cms-hook.entity.js","sourceRoot":"","sources":["../../../src/backend/entities/cms-hook.entity.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACtF,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC;;;;;GAKG;AAGI,IAAM,OAAO,GAAb,MAAM,OAAO;IAClB,CAAC,aAAa,CAAC,CAOD;IAGd,EAAE,GAAW,UAAU,EAAE,CAAC;IAG1B,IAAI,CAAU;IAId,IAAI,CAAU;IAGd,MAAM,GAAY,IAAI,CAAC;IAGvB,WAAW,CAAiB;IAG5B,QAAQ,GAAY,KAAK,CAAC;IAG1B,OAAO,GAAW,CAAC,CAAC;IAGpB,SAAS,GAAS,IAAI,IAAI,EAAE,CAAC;IAG7B,SAAS,GAAS,IAAI,IAAI,EAAE,CAAC;CAC9B,CAAA;AA1BC;IADC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;mCACH;AAG1B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;qCAC5B;AAId;IAFC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IACzC,MAAM,EAAE;;qCACK;AAGd;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;uCACP;AAGvB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;4CACf;AAG5B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;yCACJ;AAG1B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;wCACV;AAGpB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;8BAChD,IAAI;0CAAc;AAG7B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;8BAChD,IAAI;0CAAc;AApClB,OAAO;IAFnB,YAAY,EAAE;IACd,MAAM,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;GACtB,OAAO,CAqCnB"}
@@ -0,0 +1,43 @@
1
+ import { OptionalProps } from '@mikro-orm/core';
2
+ /**
3
+ * CmsPage — feature 014 successor to the pre-014 cms_pages entity. Adds
4
+ * Page Builder–driven content (per language), sales-channel + language
5
+ * scope, slug-based routing (per channel), and a draft/published/archived
6
+ * lifecycle inherited from the legacy module. The legacy `path`, `title`,
7
+ * and `body` columns are retained for one release as legacy mirrors —
8
+ * new code reads `slug`, `name`, and `content`.
9
+ */
10
+ export declare class CmsPage {
11
+ [OptionalProps]?: 'id' | 'createdAt' | 'updatedAt' | 'status' | 'publishedAt' | 'archivedAt' | 'name' | 'slug' | 'active' | 'description' | 'metaTitle' | 'metaDescription' | 'metaKeywords' | 'content' | 'languages' | 'version';
12
+ id: string;
13
+ /**
14
+ * @deprecated Use `slug`. Retained for one release while pre-014 imports settle.
15
+ */
16
+ path: string;
17
+ status: 'draft' | 'published' | 'archived';
18
+ /** @deprecated Use `name` + `metaTitle`. Retained for one release. */
19
+ title: Record<string, string>;
20
+ /** @deprecated Use `content`. Retained for one release for the asset-ref scan's legacy fallback. */
21
+ body: Record<string, string>;
22
+ publishedAt?: Date | null;
23
+ archivedAt?: Date | null;
24
+ createdAt: Date;
25
+ updatedAt: Date;
26
+ name: string;
27
+ slug: string;
28
+ active: boolean;
29
+ description?: string | null;
30
+ metaTitle?: Record<string, string> | null;
31
+ metaDescription?: Record<string, string> | null;
32
+ metaKeywords?: Record<string, string> | null;
33
+ /**
34
+ * Page Builder content envelope: `{ languages: { <lang>: <PuckTree> } }`.
35
+ * Treated as opaque JSONB at this layer; the in-process content walkers
36
+ * inspect specific shapes at the service layer.
37
+ */
38
+ content: Record<string, unknown>;
39
+ /** Array of BCP-47 language codes the page supports. */
40
+ languages: string[];
41
+ version: number;
42
+ }
43
+ //# sourceMappingURL=cms-page.entity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cms-page.entity.d.ts","sourceRoot":"","sources":["../../../src/backend/entities/cms-page.entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,aAAa,EAAgC,MAAM,iBAAiB,CAAC;AAI7F;;;;;;;GAOG;AACH,qBAEa,OAAO;IAClB,CAAC,aAAa,CAAC,CAAC,EACZ,IAAI,GACJ,WAAW,GACX,WAAW,GACX,QAAQ,GACR,aAAa,GACb,YAAY,GACZ,MAAM,GACN,MAAM,GACN,QAAQ,GACR,aAAa,GACb,WAAW,GACX,iBAAiB,GACjB,cAAc,GACd,SAAS,GACT,WAAW,GACX,SAAS,CAAC;IAGd,EAAE,EAAE,MAAM,CAAgB;IAE1B;;OAEG;IAIH,IAAI,EAAG,MAAM,CAAC;IAId,MAAM,EAAE,OAAO,GAAG,WAAW,GAAG,UAAU,CAAW;IAErD,sEAAsE;IAEtE,KAAK,EAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE/B,oGAAoG;IAEpG,IAAI,EAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAG9B,WAAW,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAG1B,UAAU,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAGzB,SAAS,EAAE,IAAI,CAAc;IAG7B,SAAS,EAAE,IAAI,CAAc;IAK7B,IAAI,EAAE,MAAM,CAAM;IAIlB,IAAI,EAAE,MAAM,CAAM;IAGlB,MAAM,EAAE,OAAO,CAAQ;IAGvB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAG5B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAG1C,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAGhD,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAE7C;;;;OAIG;IAEH,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAqB;IAErD,wDAAwD;IAExD,SAAS,EAAE,MAAM,EAAE,CAAM;IAGzB,OAAO,EAAE,MAAM,CAAK;CACrB"}
@@ -0,0 +1,140 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { Entity, Index, OptionalProps, PrimaryKey, Property, Unique } from '@mikro-orm/core';
11
+ import { GlobalEntity } from '@endora-commerce/platform/tenancy';
12
+ import { randomUUID } from 'crypto';
13
+ /**
14
+ * CmsPage — feature 014 successor to the pre-014 cms_pages entity. Adds
15
+ * Page Builder–driven content (per language), sales-channel + language
16
+ * scope, slug-based routing (per channel), and a draft/published/archived
17
+ * lifecycle inherited from the legacy module. The legacy `path`, `title`,
18
+ * and `body` columns are retained for one release as legacy mirrors —
19
+ * new code reads `slug`, `name`, and `content`.
20
+ */
21
+ let CmsPage = class CmsPage {
22
+ [OptionalProps];
23
+ id = randomUUID();
24
+ /**
25
+ * @deprecated Use `slug`. Retained for one release while pre-014 imports settle.
26
+ */
27
+ path;
28
+ status = 'draft';
29
+ /** @deprecated Use `name` + `metaTitle`. Retained for one release. */
30
+ title;
31
+ /** @deprecated Use `content`. Retained for one release for the asset-ref scan's legacy fallback. */
32
+ body;
33
+ publishedAt;
34
+ archivedAt;
35
+ createdAt = new Date();
36
+ updatedAt = new Date();
37
+ // ── Feature 014 fields ──────────────────────────────────────────────
38
+ name = '';
39
+ slug = '';
40
+ active = true;
41
+ description;
42
+ metaTitle;
43
+ metaDescription;
44
+ metaKeywords;
45
+ /**
46
+ * Page Builder content envelope: `{ languages: { <lang>: <PuckTree> } }`.
47
+ * Treated as opaque JSONB at this layer; the in-process content walkers
48
+ * inspect specific shapes at the service layer.
49
+ */
50
+ content = { languages: {} };
51
+ /** Array of BCP-47 language codes the page supports. */
52
+ languages = [];
53
+ version = 1;
54
+ };
55
+ __decorate([
56
+ PrimaryKey({ type: 'uuid' }),
57
+ __metadata("design:type", String)
58
+ ], CmsPage.prototype, "id", void 0);
59
+ __decorate([
60
+ Property({ type: 'string', length: 180 }),
61
+ Unique(),
62
+ Index(),
63
+ __metadata("design:type", String)
64
+ ], CmsPage.prototype, "path", void 0);
65
+ __decorate([
66
+ Property({ type: 'string', length: 16 }),
67
+ Index(),
68
+ __metadata("design:type", String)
69
+ ], CmsPage.prototype, "status", void 0);
70
+ __decorate([
71
+ Property({ type: 'json' }),
72
+ __metadata("design:type", Object)
73
+ ], CmsPage.prototype, "title", void 0);
74
+ __decorate([
75
+ Property({ type: 'json' }),
76
+ __metadata("design:type", Object)
77
+ ], CmsPage.prototype, "body", void 0);
78
+ __decorate([
79
+ Property({ type: 'datetime', nullable: true }),
80
+ __metadata("design:type", Object)
81
+ ], CmsPage.prototype, "publishedAt", void 0);
82
+ __decorate([
83
+ Property({ type: 'datetime', nullable: true }),
84
+ __metadata("design:type", Object)
85
+ ], CmsPage.prototype, "archivedAt", void 0);
86
+ __decorate([
87
+ Property({ type: 'datetime', onCreate: () => new Date() }),
88
+ __metadata("design:type", Date)
89
+ ], CmsPage.prototype, "createdAt", void 0);
90
+ __decorate([
91
+ Property({ type: 'datetime', onUpdate: () => new Date() }),
92
+ __metadata("design:type", Date)
93
+ ], CmsPage.prototype, "updatedAt", void 0);
94
+ __decorate([
95
+ Property({ type: 'string', length: 200 }),
96
+ __metadata("design:type", String)
97
+ ], CmsPage.prototype, "name", void 0);
98
+ __decorate([
99
+ Property({ type: 'string', length: 180 }),
100
+ Index(),
101
+ __metadata("design:type", String)
102
+ ], CmsPage.prototype, "slug", void 0);
103
+ __decorate([
104
+ Property({ type: 'boolean' }),
105
+ __metadata("design:type", Boolean)
106
+ ], CmsPage.prototype, "active", void 0);
107
+ __decorate([
108
+ Property({ type: 'text', nullable: true }),
109
+ __metadata("design:type", Object)
110
+ ], CmsPage.prototype, "description", void 0);
111
+ __decorate([
112
+ Property({ type: 'json', nullable: true }),
113
+ __metadata("design:type", Object)
114
+ ], CmsPage.prototype, "metaTitle", void 0);
115
+ __decorate([
116
+ Property({ type: 'json', nullable: true }),
117
+ __metadata("design:type", Object)
118
+ ], CmsPage.prototype, "metaDescription", void 0);
119
+ __decorate([
120
+ Property({ type: 'json', nullable: true }),
121
+ __metadata("design:type", Object)
122
+ ], CmsPage.prototype, "metaKeywords", void 0);
123
+ __decorate([
124
+ Property({ type: 'json' }),
125
+ __metadata("design:type", Object)
126
+ ], CmsPage.prototype, "content", void 0);
127
+ __decorate([
128
+ Property({ type: 'json' }),
129
+ __metadata("design:type", Array)
130
+ ], CmsPage.prototype, "languages", void 0);
131
+ __decorate([
132
+ Property({ type: 'integer' }),
133
+ __metadata("design:type", Number)
134
+ ], CmsPage.prototype, "version", void 0);
135
+ CmsPage = __decorate([
136
+ GlobalEntity(),
137
+ Entity({ tableName: 'cms_pages' })
138
+ ], CmsPage);
139
+ export { CmsPage };
140
+ //# sourceMappingURL=cms-page.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cms-page.entity.js","sourceRoot":"","sources":["../../../src/backend/entities/cms-page.entity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { OptionalProps } from '@mikro-orm/core';
2
+ /**
3
+ * CmsTemplate — reusable Page Builder fragment embedded in Pages by `code`
4
+ * via the `InsertTemplate` component. Differs from CmsBlock by having no
5
+ * `active` flag (FR-006); its visibility is governed entirely by its
6
+ * channel/language scope and by who references it.
7
+ */
8
+ export declare class CmsTemplate {
9
+ [OptionalProps]?: 'id' | 'createdAt' | 'updatedAt' | 'description' | 'content' | 'languages' | 'version';
10
+ id: string;
11
+ name: string;
12
+ code: string;
13
+ description?: string | null;
14
+ content: Record<string, unknown>;
15
+ languages: string[];
16
+ version: number;
17
+ createdAt: Date;
18
+ updatedAt: Date;
19
+ }
20
+ //# sourceMappingURL=cms-template.entity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cms-template.entity.d.ts","sourceRoot":"","sources":["../../../src/backend/entities/cms-template.entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,aAAa,EAAwB,MAAM,iBAAiB,CAAC;AAIrF;;;;;GAKG;AACH,qBAEa,WAAW;IACtB,CAAC,aAAa,CAAC,CAAC,EACZ,IAAI,GACJ,WAAW,GACX,WAAW,GACX,aAAa,GACb,SAAS,GACT,WAAW,GACX,SAAS,CAAC;IAGd,EAAE,EAAE,MAAM,CAAgB;IAG1B,IAAI,EAAG,MAAM,CAAC;IAId,IAAI,EAAG,MAAM,CAAC;IAGd,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAG5B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAqB;IAGrD,SAAS,EAAE,MAAM,EAAE,CAAM;IAGzB,OAAO,EAAE,MAAM,CAAK;IAGpB,SAAS,EAAE,IAAI,CAAc;IAG7B,SAAS,EAAE,IAAI,CAAc;CAC9B"}
@@ -0,0 +1,73 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { Entity, Index, OptionalProps, PrimaryKey, Property } from '@mikro-orm/core';
11
+ import { GlobalEntity } from '@endora-commerce/platform/tenancy';
12
+ import { randomUUID } from 'crypto';
13
+ /**
14
+ * CmsTemplate — reusable Page Builder fragment embedded in Pages by `code`
15
+ * via the `InsertTemplate` component. Differs from CmsBlock by having no
16
+ * `active` flag (FR-006); its visibility is governed entirely by its
17
+ * channel/language scope and by who references it.
18
+ */
19
+ let CmsTemplate = class CmsTemplate {
20
+ [OptionalProps];
21
+ id = randomUUID();
22
+ name;
23
+ code;
24
+ description;
25
+ content = { languages: {} };
26
+ languages = [];
27
+ version = 1;
28
+ createdAt = new Date();
29
+ updatedAt = new Date();
30
+ };
31
+ __decorate([
32
+ PrimaryKey({ type: 'uuid' }),
33
+ __metadata("design:type", String)
34
+ ], CmsTemplate.prototype, "id", void 0);
35
+ __decorate([
36
+ Property({ type: 'string', length: 200 }),
37
+ __metadata("design:type", String)
38
+ ], CmsTemplate.prototype, "name", void 0);
39
+ __decorate([
40
+ Property({ type: 'string', length: 180 }),
41
+ Index(),
42
+ __metadata("design:type", String)
43
+ ], CmsTemplate.prototype, "code", void 0);
44
+ __decorate([
45
+ Property({ type: 'text', nullable: true }),
46
+ __metadata("design:type", Object)
47
+ ], CmsTemplate.prototype, "description", void 0);
48
+ __decorate([
49
+ Property({ type: 'json' }),
50
+ __metadata("design:type", Object)
51
+ ], CmsTemplate.prototype, "content", void 0);
52
+ __decorate([
53
+ Property({ type: 'json' }),
54
+ __metadata("design:type", Array)
55
+ ], CmsTemplate.prototype, "languages", void 0);
56
+ __decorate([
57
+ Property({ type: 'integer' }),
58
+ __metadata("design:type", Number)
59
+ ], CmsTemplate.prototype, "version", void 0);
60
+ __decorate([
61
+ Property({ type: 'datetime', onCreate: () => new Date() }),
62
+ __metadata("design:type", Date)
63
+ ], CmsTemplate.prototype, "createdAt", void 0);
64
+ __decorate([
65
+ Property({ type: 'datetime', onUpdate: () => new Date() }),
66
+ __metadata("design:type", Date)
67
+ ], CmsTemplate.prototype, "updatedAt", void 0);
68
+ CmsTemplate = __decorate([
69
+ GlobalEntity(),
70
+ Entity({ tableName: 'cms_templates' })
71
+ ], CmsTemplate);
72
+ export { CmsTemplate };
73
+ //# sourceMappingURL=cms-template.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cms-template.entity.js","sourceRoot":"","sources":["../../../src/backend/entities/cms-template.entity.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACrF,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC;;;;;GAKG;AAGI,IAAM,WAAW,GAAjB,MAAM,WAAW;IACtB,CAAC,aAAa,CAAC,CAOD;IAGd,EAAE,GAAW,UAAU,EAAE,CAAC;IAG1B,IAAI,CAAU;IAId,IAAI,CAAU;IAGd,WAAW,CAAiB;IAG5B,OAAO,GAA4B,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAGrD,SAAS,GAAa,EAAE,CAAC;IAGzB,OAAO,GAAW,CAAC,CAAC;IAGpB,SAAS,GAAS,IAAI,IAAI,EAAE,CAAC;IAG7B,SAAS,GAAS,IAAI,IAAI,EAAE,CAAC;CAC9B,CAAA;AA1BC;IADC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;uCACH;AAG1B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;yCAC5B;AAId;IAFC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IACzC,KAAK,EAAE;;yCACM;AAGd;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;gDACf;AAG5B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;4CAC0B;AAGrD;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;8CACF;AAGzB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;4CACV;AAGpB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;8BAChD,IAAI;8CAAc;AAG7B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;8BAChD,IAAI;8CAAc;AApClB,WAAW;IAFvB,YAAY,EAAE;IACd,MAAM,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC;GAC1B,WAAW,CAqCvB"}
@@ -0,0 +1,157 @@
1
+ import type { EntityManager } from '@mikro-orm/postgresql';
2
+ import type { Redis } from 'ioredis';
3
+ import { z } from 'zod';
4
+ import type { ChannelMemberEntityType } from '@endora-commerce/contracts';
5
+ import { type AssetReferenceRegistryPort, type ModuleManifest } from '@endora-commerce/contracts';
6
+ import { type ModuleContext } from '@endora-commerce/platform/kernel';
7
+ import type { RequireAdminFactory } from '@endora-commerce/platform/kernel';
8
+ import { cmsModule } from './plugin.js';
9
+ import type { CmsAssetResolver } from './services/storefront-resolver.js';
10
+ import { CmsBlock } from './entities/cms-block.entity.js';
11
+ import { CmsHookBlockAttachment } from './entities/cms-hook-block-attachment.entity.js';
12
+ import { CmsHook } from './entities/cms-hook.entity.js';
13
+ import { CmsPage } from './entities/cms-page.entity.js';
14
+ import { CmsTemplate } from './entities/cms-template.entity.js';
15
+ /**
16
+ * `cms` — the endpoint that only worked in production (feature 072, wave 1,
17
+ * T093).
18
+ *
19
+ * The module exposed four late-bound setters — page-builder breakpoints, the
20
+ * colour-palette reader, the colour-palette writer, the asset resolver — and
21
+ * `composition.ts` called all four after constructing it. `test-server.ts`
22
+ * called **none** of them. So `PUT /api/v1/admin/cms/page-builder/color-palette`,
23
+ * whose handler is
24
+ *
25
+ * const writer = deps.getColorPaletteWriter?.();
26
+ * if (!writer) throw new Error('Color palette writer is not configured.');
27
+ *
28
+ * answered 500 under every test run since it shipped, and nothing noticed
29
+ * because nothing called it. The two read resolvers were worse than that,
30
+ * because they do not throw: breakpoints fell back to the env defaults and the
31
+ * palette to `[]`, so the harness saw a plausible answer rather than a wrong
32
+ * one.
33
+ *
34
+ * **The setters are gone rather than moved.** The three settings-backed ones
35
+ * read `settingsReadPort` / `settingsAdminService` / `settingsChannelResolver`,
36
+ * all of which are registrations any composition has, and the setting codes are
37
+ * this module's own — so there was never a reason for a root to own that
38
+ * wiring. Resolving them here means there is no setter left for a composition
39
+ * to forget. `test/contract/cms/page-builder-color-palette.contract.test.ts`
40
+ * covers the endpoint that could not previously be covered.
41
+ *
42
+ * **The channel the settings are read from changes, deliberately.** The root
43
+ * read `process.env['ORGANIZATIONS_SETTINGS_CHANNEL_ID'] ?? 'default'` directly
44
+ * for these three, while four other sites had already been consolidated onto
45
+ * `settingsChannelResolver` — the system-default sales channel, falling back to
46
+ * that same env value. Constitution XII says channel-scoped reads go through
47
+ * the sanctioned accessor rather than a hand-rolled one, and the raw env read
48
+ * is exactly the hand-rolled form. The palette is written with
49
+ * `setValueForAllChannels`, so both spellings find the value; this makes the
50
+ * read agree with the rest of the platform.
51
+ *
52
+ * **The asset resolver stayed a contribution, and no longer does**
53
+ * (`specs/110-instance-repository/` T118c). The reasoning written here was that
54
+ * it reaches into `assets_library`'s service and which modules a deployment
55
+ * ships is a root's business — true of the *decision* and not of the *wiring*.
56
+ * `assets_library` publishes `assetsLibraryPort`, so the reach is a declared
57
+ * edge this module can hold itself, and holding it removes the thing the
58
+ * argument never accounted for: the root's closure was a raw hold on another
59
+ * module's service, and only **one** of the two roots ever contributed it. The
60
+ * registration is still read through the cradle *per call*, so a deployment
61
+ * that decorates the name is honoured wherever it does so.
62
+ *
63
+ * `requireAdmin` becomes required. It was optional here and the routes
64
+ * defaulted it to `?? (async () => {})` — a permission gate whose absent form
65
+ * is open. Both roots passed one, so nothing was open; this is the seventh time
66
+ * in this wave that shape has been removed rather than the seventh outage.
67
+ *
68
+ * `cacheOptions` was an option no caller ever passed. It does not reappear.
69
+ */
70
+ type CmsResult = ReturnType<typeof cmsModule>;
71
+ export interface CmsCradle {
72
+ /**
73
+ * Feature 120 (FR-015) — the platform's channel-bridge registry, resolved by
74
+ * **container name** rather than imported. The shape is the narrow one this
75
+ * module needs, which is what `ctx.cradle<C>()` asks an author to declare;
76
+ * the registry itself is the kernel's and is published on no barrel.
77
+ */
78
+ readonly salesChannelBridgeRegistry: {
79
+ register(bridge: {
80
+ entityType: ChannelMemberEntityType;
81
+ table: string;
82
+ entityIdColumn: string;
83
+ }): void;
84
+ };
85
+ readonly emFactory: () => EntityManager;
86
+ readonly redis: Redis;
87
+ readonly requireAdmin: RequireAdminFactory;
88
+ readonly settingsReadPort: {
89
+ /**
90
+ * `channelId` is `null` for a platform-wide read — `SettingsReadPort`'s own
91
+ * spelling (D-41), which the reserved-segments resolver below uses because
92
+ * the deployment's route table is not a per-channel fact.
93
+ */
94
+ get<T>(code: string, channelId: string | null, schema: z.ZodType<T>): Promise<T>;
95
+ };
96
+ readonly settingsAdminService: {
97
+ setValueForAllChannels(code: string, value: unknown, expectedVersion: string | null, actor: unknown): Promise<unknown>;
98
+ };
99
+ readonly settingsChannelResolver: () => Promise<string>;
100
+ /**
101
+ * How an embedded asset id becomes the detail a storefront response carries.
102
+ * This module's own registration over `assetsLibraryPort` since T118c — see
103
+ * the note on the registration itself.
104
+ */
105
+ readonly cmsAssetResolver: CmsAssetResolver;
106
+ /**
107
+ * Owned by `assets_library`: the registry that refuses to delete an asset a
108
+ * page, block or template embeds. Typed by the contract shape rather than by
109
+ * the owner's class (feature 075, Phase C) — this module contributes a
110
+ * descriptor and never touches anything else the class has.
111
+ */
112
+ readonly assetReferenceRegistry: AssetReferenceRegistryPort;
113
+ /**
114
+ * Core manifests + this deployment's overlay modules (feature 057), from
115
+ * which the Page Builder registry takes every block and category declaration
116
+ * (feature 096, T209).
117
+ *
118
+ * Typed by what this module reads rather than by `_lifecycle`'s
119
+ * `RegisteredManifestEntry`, in the idiom `admin_roles` established for the
120
+ * permission catalogue: the entries a root contributes carry a `filePath` and
121
+ * the install hooks too, and none of that is this module's business.
122
+ */
123
+ readonly resolvedModuleRegistry: ReadonlyArray<{
124
+ manifest: ModuleManifest;
125
+ }>;
126
+ readonly cms: CmsResult;
127
+ readonly cmsReferenceRegistry: CmsResult['handle']['referenceRegistry'];
128
+ }
129
+ export declare function registerModule(ctx: ModuleContext): void;
130
+ /**
131
+ * The module's persisted entity classes, on the `./backend` subpath, as one
132
+ * array and **no named class export** (D-168).
133
+ *
134
+ * This is the shape the platform reads when the package is *installed*: the
135
+ * boot-time loader (`src/packages/package-runtime.ts`, `exported['entities']`)
136
+ * and the static declaration reader (`scripts/lib/package-declarations.ts`),
137
+ * which is the third source of `check:module-boundary`'s `table→owner` map and
138
+ * the package pass of `check-entity-tenant-classification`. A missing array is
139
+ * answered with `[]` — zero entities registered, no error anywhere.
140
+ */
141
+ export declare const entities: (typeof CmsBlock | typeof CmsPage | typeof CmsHook | typeof CmsHookBlockAttachment | typeof CmsTemplate)[];
142
+ /**
143
+ * The sales-channel membership bridge this module owns (feature 120, FR-015).
144
+ *
145
+ * Exported as well as registered because the owning module is the only honest
146
+ * source for it: a caller that composes no platform — the bare-database test
147
+ * harness, which constructs the kernel's membership service directly — declares
148
+ * these from here rather than from a list of nine it keeps itself, which is
149
+ * exactly the total map this feature deleted.
150
+ */
151
+ export declare const salesChannelBridges: ReadonlyArray<{
152
+ readonly entityType: ChannelMemberEntityType;
153
+ readonly table: string;
154
+ readonly entityIdColumn: string;
155
+ }>;
156
+ export {};
157
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/backend/index.ts"],"names":[],"mappings":"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"}