@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,329 @@
1
+ import { walkAssetIds, walkBlockEmbeds, walkTemplateEmbeds } from './content-tree-walker.js';
2
+ /** Recursion depth cap for InsertBlock/InsertTemplate inlining (per data-model.md / T082). */
3
+ const EMBED_DEPTH_CAP = 3;
4
+ /**
5
+ * How many published pages one channel's index answers with.
6
+ *
7
+ * A bound rather than a page size: the caller is a sitemap, Google's own
8
+ * ceiling is 50 000 URLs per file, and the storefront already caps its product
9
+ * enumeration at 5 000 for the same reason. A shop with more CMS pages than
10
+ * this has a sitemap-index problem rather than a listing problem, and adding a
11
+ * cursor before one exists would be a paging protocol with no reader.
12
+ */
13
+ const PAGE_INDEX_LIMIT = 5000;
14
+ function toChannelRow(channel) {
15
+ return { id: channel.id, code: channel.code, default_language: channel.defaultLanguage };
16
+ }
17
+ export class StorefrontResolver {
18
+ emFactory;
19
+ cache;
20
+ assetResolver = null;
21
+ constructor(emFactory, cache) {
22
+ this.emFactory = emFactory;
23
+ this.cache = cache;
24
+ }
25
+ setAssetResolver(resolver) {
26
+ this.assetResolver = resolver;
27
+ }
28
+ async resolveAssetsForTrees(trees) {
29
+ const resolver = this.assetResolver;
30
+ if (!resolver)
31
+ return {};
32
+ const ids = new Set();
33
+ for (const tree of trees)
34
+ walkAssetIds(tree, ids);
35
+ if (ids.size === 0)
36
+ return {};
37
+ const assets = {};
38
+ await Promise.all(Array.from(ids).map(async (assetId) => {
39
+ const resolved = await resolver(assetId);
40
+ if (resolved)
41
+ assets[assetId] = resolved;
42
+ }));
43
+ return assets;
44
+ }
45
+ async resolvePageBySlug(input) {
46
+ const em = this.emFactory();
47
+ const channel = toChannelRow(input.resolvedChannel);
48
+ const cacheLanguage = input.language ?? channel.default_language;
49
+ if (this.cache) {
50
+ const cached = await this.cache.getPage(input.slug, channel.code, cacheLanguage);
51
+ if (cached)
52
+ return cached;
53
+ }
54
+ const rows = (await em.execute(`select p.*
55
+ from cms_pages p
56
+ join cms_page_sales_channels cpsc on cpsc.page_id = p.id
57
+ where cpsc.sales_channel_id = ?
58
+ and cpsc.slug = ?
59
+ and p.status = 'published'
60
+ and p.active = true
61
+ limit 1`, [channel.id, input.slug]));
62
+ const page = rows[0];
63
+ if (!page)
64
+ return null;
65
+ const language = this.resolveLanguage(page, input.language, channel.default_language);
66
+ if (!language)
67
+ return null;
68
+ const data = page.content.languages?.[language] ?? {};
69
+ const embeds = await this.inlineEmbeds(em, channel, language, data);
70
+ const embedTrees = [
71
+ data,
72
+ ...Object.values(embeds.blocks).map((b) => b.content.data),
73
+ ...Object.values(embeds.templates).map((t) => t.content.data),
74
+ ];
75
+ const assets = await this.resolveAssetsForTrees(embedTrees);
76
+ const resolved = {
77
+ id: page.id,
78
+ slug: page.slug,
79
+ name: page.name,
80
+ language,
81
+ meta: {
82
+ title: page.meta_title?.[language] ?? null,
83
+ description: page.meta_description?.[language] ?? null,
84
+ keywords: page.meta_keywords?.[language] ?? null,
85
+ },
86
+ content: {
87
+ data,
88
+ },
89
+ embeds,
90
+ assets,
91
+ };
92
+ if (this.cache) {
93
+ await this.cache.setPage(input.slug, channel.code, cacheLanguage, resolved);
94
+ }
95
+ return resolved;
96
+ }
97
+ /**
98
+ * Every published page of one sales channel, at the slug that channel serves
99
+ * it under (feature 105, FR-021; `contracts/cms-page-url.md` §4.1).
100
+ *
101
+ * The join is `resolvePageBySlug`'s, minus the slug predicate: same table,
102
+ * same three conditions — the channel binding, `status = 'published'` and
103
+ * `active = true` — so a page this answer names is a page that endpoint
104
+ * serves, and a page it omits is one that would 404. A sitemap built from a
105
+ * looser query would advertise a URL the shop refuses, which is the state §4.1
106
+ * exists to make unreachable.
107
+ *
108
+ * The slug comes off `cms_page_sales_channels`, never off `cms_pages`: the
109
+ * address is per channel (Constitution XII), and the page row's own column is
110
+ * one value shared by all of them.
111
+ *
112
+ * Uncached, deliberately. `CmsCache` keys a page by `(slug, channel, language)`
113
+ * and is invalidated per slug on write, so an index cached beside it would
114
+ * survive every invalidation the module performs and go stale on the first
115
+ * publish. The read is one indexed join per sitemap build, which Next's own
116
+ * route cache already sits in front of.
117
+ */
118
+ async listPublishedPages(input) {
119
+ const em = this.emFactory();
120
+ const rows = (await em.execute(`select cpsc.slug as slug, p.updated_at as updated_at
121
+ from cms_pages p
122
+ join cms_page_sales_channels cpsc on cpsc.page_id = p.id
123
+ where cpsc.sales_channel_id = ?
124
+ and p.status = 'published'
125
+ and p.active = true
126
+ order by cpsc.slug asc
127
+ limit ${PAGE_INDEX_LIMIT}`, [input.resolvedChannel.id]));
128
+ return rows.map((row) => ({
129
+ slug: row.slug,
130
+ updatedAt: new Date(row.updated_at).toISOString(),
131
+ }));
132
+ }
133
+ async resolveBlockByCode(input) {
134
+ const em = this.emFactory();
135
+ const channel = toChannelRow(input.resolvedChannel);
136
+ const cacheLanguage = input.language ?? channel.default_language;
137
+ if (this.cache) {
138
+ const cached = await this.cache.getBlock(input.code, channel.code, cacheLanguage);
139
+ if (cached)
140
+ return cached;
141
+ }
142
+ const rows = (await em.execute(`select b.*
143
+ from cms_blocks b
144
+ join cms_block_sales_channels cbsc on cbsc.block_id = b.id
145
+ where cbsc.sales_channel_id = ?
146
+ and cbsc.code = ?
147
+ and b.active = true
148
+ limit 1`, [channel.id, input.code]));
149
+ const block = rows[0];
150
+ if (!block)
151
+ return null;
152
+ const language = this.resolveLanguage(block, input.language, channel.default_language);
153
+ if (!language)
154
+ return null;
155
+ const resolved = {
156
+ id: block.id,
157
+ code: block.code,
158
+ language,
159
+ content: {
160
+ data: block.content.languages?.[language] ?? {},
161
+ },
162
+ };
163
+ if (this.cache) {
164
+ await this.cache.setBlock(input.code, channel.code, cacheLanguage, resolved);
165
+ }
166
+ return resolved;
167
+ }
168
+ async resolveHookByCode(input) {
169
+ const em = this.emFactory();
170
+ const channel = toChannelRow(input.resolvedChannel);
171
+ const cacheLanguage = input.language ?? channel.default_language;
172
+ if (this.cache) {
173
+ const cached = await this.cache.getHook(input.code, channel.code, cacheLanguage);
174
+ if (cached)
175
+ return cached;
176
+ }
177
+ const hookRows = (await em.execute(`select id::text, code, active
178
+ from cms_hooks
179
+ where code = ?
180
+ limit 1`, [input.code]));
181
+ const hook = hookRows[0];
182
+ if (!hook)
183
+ return null;
184
+ if (!hook.active) {
185
+ const empty = { hookCode: hook.code, blocks: [] };
186
+ if (this.cache)
187
+ await this.cache.setHook(input.code, channel.code, cacheLanguage, empty);
188
+ return empty;
189
+ }
190
+ const scopedRows = (await em.execute(`select 1
191
+ from cms_hook_sales_channels
192
+ where hook_id = ? and sales_channel_id = ?
193
+ limit 1`, [hook.id, channel.id]));
194
+ if (scopedRows.length === 0) {
195
+ const empty = { hookCode: hook.code, blocks: [] };
196
+ if (this.cache)
197
+ await this.cache.setHook(input.code, channel.code, cacheLanguage, empty);
198
+ return empty;
199
+ }
200
+ const blockRows = (await em.execute(`select b.*
201
+ from cms_hook_block_attachments a
202
+ join cms_blocks b on b.id = a.block_id
203
+ join cms_block_sales_channels cbsc on cbsc.block_id = b.id
204
+ where a.hook_id = ?
205
+ and cbsc.sales_channel_id = ?
206
+ and b.active = true
207
+ order by a.position asc, a.block_id asc`, [hook.id, channel.id]));
208
+ const blocks = [];
209
+ for (const block of blockRows) {
210
+ const language = this.resolveLanguage(block, input.language, channel.default_language);
211
+ if (!language)
212
+ continue;
213
+ blocks.push({
214
+ id: block.id,
215
+ code: block.code,
216
+ language,
217
+ content: {
218
+ data: block.content.languages?.[language] ?? {},
219
+ },
220
+ });
221
+ }
222
+ const resolved = { hookCode: hook.code, blocks };
223
+ if (this.cache) {
224
+ await this.cache.setHook(input.code, channel.code, cacheLanguage, resolved);
225
+ }
226
+ return resolved;
227
+ }
228
+ /**
229
+ * Recursively inlines InsertBlock / InsertTemplate references found in the
230
+ * supplied Page Builder data tree. Capped at EMBED_DEPTH_CAP levels —
231
+ * cycles or deeper graphs degrade to placeholders rendered admin-side.
232
+ */
233
+ async inlineEmbeds(em, channel, language, rootData) {
234
+ const resolvedBlocks = {};
235
+ const resolvedTemplates = {};
236
+ const visit = async (data, depth) => {
237
+ if (depth > EMBED_DEPTH_CAP)
238
+ return;
239
+ const blockCodes = Array.from(walkBlockEmbeds(data)).filter((code) => !(code in resolvedBlocks));
240
+ const templateCodes = Array.from(walkTemplateEmbeds(data)).filter((code) => !(code in resolvedTemplates));
241
+ const blocks = blockCodes.length > 0
242
+ ? await this.fetchBlocksByCodes(em, channel, blockCodes)
243
+ : [];
244
+ const templates = templateCodes.length > 0
245
+ ? await this.fetchTemplatesByCodes(em, channel, templateCodes)
246
+ : [];
247
+ const nextLayer = [];
248
+ for (const block of blocks) {
249
+ const blockLanguage = this.resolveLanguage(block, language, channel.default_language);
250
+ if (!blockLanguage)
251
+ continue;
252
+ const blockData = block.content.languages?.[blockLanguage] ?? {};
253
+ resolvedBlocks[block.code] = {
254
+ id: block.id,
255
+ code: block.code,
256
+ language: blockLanguage,
257
+ content: {
258
+ data: blockData,
259
+ },
260
+ };
261
+ nextLayer.push(blockData);
262
+ }
263
+ for (const template of templates) {
264
+ const templateLanguage = this.resolveLanguage(template, language, channel.default_language);
265
+ if (!templateLanguage)
266
+ continue;
267
+ const templateData = template.content.languages?.[templateLanguage] ?? {};
268
+ resolvedTemplates[template.code] = {
269
+ id: template.id,
270
+ code: template.code,
271
+ language: templateLanguage,
272
+ content: {
273
+ data: templateData,
274
+ },
275
+ };
276
+ nextLayer.push(templateData);
277
+ }
278
+ for (const child of nextLayer) {
279
+ await visit(child, depth + 1);
280
+ }
281
+ };
282
+ await visit(rootData, 1);
283
+ return { blocks: resolvedBlocks, templates: resolvedTemplates };
284
+ }
285
+ async fetchBlocksByCodes(em, channel, codes) {
286
+ if (codes.length === 0)
287
+ return [];
288
+ const placeholders = codes.map(() => '?').join(', ');
289
+ return (await em.execute(`select b.*
290
+ from cms_blocks b
291
+ join cms_block_sales_channels cbsc on cbsc.block_id = b.id
292
+ where cbsc.sales_channel_id = ?
293
+ and cbsc.code in (${placeholders})
294
+ and b.active = true`, [channel.id, ...codes]));
295
+ }
296
+ async fetchTemplatesByCodes(em, channel, codes) {
297
+ if (codes.length === 0)
298
+ return [];
299
+ const placeholders = codes.map(() => '?').join(', ');
300
+ return (await em.execute(`select t.*
301
+ from cms_templates t
302
+ join cms_template_sales_channels ctsc on ctsc.template_id = t.id
303
+ where ctsc.sales_channel_id = ?
304
+ and ctsc.code in (${placeholders})`, [channel.id, ...codes]));
305
+ }
306
+ resolveLanguage(page, requested, channelDefault) {
307
+ const available = page.content.languages ?? {};
308
+ const hasContent = (lang) => page.languages.includes(lang) && available[lang] !== undefined;
309
+ if (requested && hasContent(requested)) {
310
+ return requested;
311
+ }
312
+ if (hasContent(channelDefault)) {
313
+ return channelDefault;
314
+ }
315
+ // Final fallback: render in whatever language actually carries content so a
316
+ // published, channel-assigned page still resolves instead of 404-ing. This
317
+ // covers pages authored only in a non-default language (e.g. en-US content
318
+ // on a pl-PL-default channel) — without it, selecting such a page as the
319
+ // storefront home page silently falls back to the built-in landing page.
320
+ const firstDeclaredWithContent = page.languages.find((lang) => available[lang] !== undefined);
321
+ if (firstDeclaredWithContent) {
322
+ return firstDeclaredWithContent;
323
+ }
324
+ // Last resort for legacy data whose content keys are not mirrored in the
325
+ // `languages` array: fall back to the first populated content language.
326
+ return Object.keys(available)[0] ?? null;
327
+ }
328
+ }
329
+ //# sourceMappingURL=storefront-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storefront-resolver.js","sourceRoot":"","sources":["../../../src/backend/services/storefront-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,225 @@
1
+ import { type ModuleCliCommand } from '@endora-commerce/contracts';
2
+ import type { ModuleContext } from '@endora-commerce/platform/kernel';
3
+ import { type PageBuilderBreakpoints } from '@endora-commerce/page-builder-core/types/responsive';
4
+ export declare const CMS_PAGE_BUILDER_SETTING_CODES: {
5
+ readonly BREAKPOINT_TABLET_MIN: "cms.page_builder.breakpoint.tablet_min";
6
+ readonly BREAKPOINT_DESKTOP_MIN: "cms.page_builder.breakpoint.desktop_min";
7
+ readonly COLOR_PALETTE: "cms.page_builder.color_palette";
8
+ };
9
+ /**
10
+ * The deployment's reserved first path segments
11
+ * (`specs/105-cms-root-page-urls/` FR-031/FR-032;
12
+ * `contracts/cms-page-url.md` §5.2).
13
+ *
14
+ * A CMS page lives at the storefront root, `/{slug}`, so a page slugged
15
+ * `cart` saves, publishes and is never served: a root catch-all is Next's
16
+ * lowest-priority match and the storefront's own `/cart` wins. Nothing here
17
+ * creates that precedence and nothing may (§5.0) — this value is what lets the
18
+ * module tell the operator *before* the page disappears.
19
+ *
20
+ * **The value is the deployment's and the default is empty**, which is not a
21
+ * gap left open. The set is a fact about a *storefront's route table*; a
22
+ * headless backend serves storefronts it did not build, so a list shipped in
23
+ * `cms` would be a derived fact about a consumer written into the owner — stale
24
+ * the first time any client adds a route, and stale in the direction that fails
25
+ * open. The reference storefront publishes its own segments as
26
+ * `RESERVED_TOP_LEVEL_SEGMENTS` (`storefront/app/reserved-segments.ts`),
27
+ * reconciled against its route tree by `check:storefront-indexability`, and a
28
+ * deployment copies its value from there.
29
+ */
30
+ export declare const CMS_SETTING_CODES: {
31
+ readonly RESERVED_SLUG_SEGMENTS: "cms.reserved_slug_segments";
32
+ };
33
+ export declare const cmsSettingsManifest: {
34
+ moduleCode: string;
35
+ groups: {
36
+ code: string;
37
+ name: string;
38
+ salesChannelCodes?: string[] | undefined;
39
+ isSystemProtected?: boolean | undefined;
40
+ }[];
41
+ settings: {
42
+ code: string;
43
+ name: string;
44
+ valueType: "string" | "number" | "boolean" | "json" | "string_list" | "secret" | "credential_ref";
45
+ defaultValue: unknown;
46
+ description?: string | undefined;
47
+ groupCode?: string | undefined;
48
+ previousDefaultValues?: unknown[] | undefined;
49
+ salesChannelCodes?: string[] | undefined;
50
+ enumOptions?: string[] | undefined;
51
+ configurationType?: string | undefined;
52
+ hidden?: boolean | undefined;
53
+ }[];
54
+ };
55
+ export declare const manifest: {
56
+ id: string;
57
+ name: string;
58
+ version: string;
59
+ dependencies: string[];
60
+ description?: string | undefined;
61
+ acknowledgedDependencies?: {
62
+ moduleId: string;
63
+ port: string;
64
+ reason: string;
65
+ }[] | undefined;
66
+ nonBindingDependencies?: {
67
+ moduleId: string;
68
+ name: string;
69
+ kind: "contributes-to" | "degrades-without" | "refuses-without";
70
+ reason: string;
71
+ whenAbsent?: string | undefined;
72
+ }[] | undefined;
73
+ activation?: {
74
+ settingCode: string;
75
+ default: boolean;
76
+ } | {
77
+ nonDeactivatable: true;
78
+ reason: string;
79
+ } | undefined;
80
+ settings?: {
81
+ moduleCode: string;
82
+ groups: {
83
+ code: string;
84
+ name: string;
85
+ salesChannelCodes?: string[] | undefined;
86
+ isSystemProtected?: boolean | undefined;
87
+ }[];
88
+ settings: {
89
+ code: string;
90
+ name: string;
91
+ valueType: "string" | "number" | "boolean" | "json" | "string_list" | "secret" | "credential_ref";
92
+ defaultValue: unknown;
93
+ description?: string | undefined;
94
+ groupCode?: string | undefined;
95
+ previousDefaultValues?: unknown[] | undefined;
96
+ salesChannelCodes?: string[] | undefined;
97
+ enumOptions?: string[] | undefined;
98
+ configurationType?: string | undefined;
99
+ hidden?: boolean | undefined;
100
+ }[];
101
+ } | undefined;
102
+ i18n?: {
103
+ bundlesDir: string;
104
+ } | undefined;
105
+ docs?: false | {
106
+ dir: string;
107
+ } | undefined;
108
+ demo?: false | {
109
+ summary: string;
110
+ seed: (context: import("@endora-commerce/contracts").ModuleDemoContext<never>) => Promise<import("@endora-commerce/contracts").DemoSeedResult>;
111
+ reset: (context: import("@endora-commerce/contracts").ModuleDemoContext<never>) => Promise<import("@endora-commerce/contracts").DemoResetResult>;
112
+ after?: readonly string[] | undefined;
113
+ package?: string | undefined;
114
+ } | undefined;
115
+ actions?: {
116
+ id: string;
117
+ labelKey: string;
118
+ icon: "Plus" | "Sparkles" | "Settings" | "Search" | "Boxes" | "Layers" | "Menu" | "PlusCircle" | "PlusSquare" | "FilePlus" | "FolderPlus" | "Upload" | "FileUp" | "CloudUpload" | "Download" | "FileDown" | "FileText" | "BookOpen" | "Rss" | "Package" | "Tag" | "ShoppingCart" | "Receipt" | "CreditCard" | "Users" | "UserPlus" | "Inbox" | "ListChecks" | "ClipboardList" | "Image" | "Video" | "LayoutDashboard" | "PanelLeft" | "KeyRound" | "ShieldCheck" | "Edit" | "Archive" | "Box" | "Truck" | "CircleDollarSign" | "Activity" | "LineChart" | "Smartphone" | "Webhook" | "Scale" | "PlugZap" | "PercentDiamond" | "Newspaper" | "Languages" | "Eraser" | "Warehouse" | "TrendingDown" | "Bell" | "PackageOpen" | "Building2" | "Store" | "ClipboardCheck";
119
+ targetRoute: string;
120
+ keywords: string[];
121
+ weight: number;
122
+ descriptionKey?: string | undefined;
123
+ requiredPermission?: string | undefined;
124
+ }[] | undefined;
125
+ permissions?: {
126
+ code: string;
127
+ label: string;
128
+ module?: string | undefined;
129
+ description?: string | undefined;
130
+ requires?: string[] | undefined;
131
+ }[] | undefined;
132
+ transactionalEmails?: {
133
+ code: string;
134
+ name: string;
135
+ variables: {
136
+ key: string;
137
+ label: string;
138
+ sampleValue?: string | undefined;
139
+ description?: string | undefined;
140
+ }[];
141
+ description?: string | undefined;
142
+ group?: string | undefined;
143
+ }[] | undefined;
144
+ capabilities?: string[] | undefined;
145
+ exclusiveCapabilities?: {
146
+ key: string;
147
+ errorCode: string;
148
+ }[] | undefined;
149
+ errorCodes?: {
150
+ code: string;
151
+ tokens?: string[] | undefined;
152
+ }[] | undefined;
153
+ blocks?: {
154
+ name: string;
155
+ labelKey: string;
156
+ category: string;
157
+ contexts: ("cms" | "newsletter" | "invoice" | "email")[];
158
+ fields: Record<string, {
159
+ type: "number" | "object" | "array" | "text" | "textarea" | "select" | "radio" | "external" | "uuid" | "richtext";
160
+ label?: string | undefined;
161
+ required?: boolean | undefined;
162
+ options?: {
163
+ label: string;
164
+ value: string | number;
165
+ }[] | undefined;
166
+ refKind?: string | undefined;
167
+ }>;
168
+ descriptionKey?: string | undefined;
169
+ defaultProps?: Record<string, unknown> | undefined;
170
+ responsiveFields?: string[] | undefined;
171
+ previewIcon?: string | undefined;
172
+ weight?: number | undefined;
173
+ }[] | undefined;
174
+ blockCategories?: {
175
+ key: string;
176
+ titleKey: string;
177
+ contexts: ("cms" | "newsletter" | "invoice" | "email")[];
178
+ weight?: number | undefined;
179
+ visible?: boolean | undefined;
180
+ }[] | undefined;
181
+ env?: {
182
+ name: string;
183
+ describes: {
184
+ en: string;
185
+ pl: string;
186
+ };
187
+ requirement: {
188
+ kind: "required";
189
+ } | {
190
+ kind: "requiredWhen";
191
+ input: string;
192
+ equals: string;
193
+ } | {
194
+ kind: "optional";
195
+ without: {
196
+ en: string;
197
+ pl: string;
198
+ };
199
+ };
200
+ secret: boolean;
201
+ generable: boolean;
202
+ owner: {
203
+ kind: "platform";
204
+ } | {
205
+ kind: "application";
206
+ application: "admin" | "backend" | "storefront";
207
+ } | {
208
+ kind: "module";
209
+ moduleId: string;
210
+ };
211
+ consumers: ("admin" | "backend" | "storefront")[];
212
+ addressOf: "admin" | "backend" | "storefront" | null;
213
+ }[] | undefined;
214
+ };
215
+ export declare function resolvePageBuilderBreakpointsFromEnv(): PageBuilderBreakpoints;
216
+ /**
217
+ * The operator's pre-flight report for the block-name migration (feature 096,
218
+ * T410; `contracts/block-name-migration.md` §7).
219
+ *
220
+ * The body is `await import()`ed so the generated manifest index stays light —
221
+ * this file is loaded by every check and every composition, and the report pulls
222
+ * in the frozen rename map and the structural walk.
223
+ */
224
+ export declare const cliCommands: ReadonlyArray<ModuleCliCommand<ModuleContext>>;
225
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAuB,KAAK,sBAAsB,EAAE,MAAM,qDAAqD,CAAC;AAEvH,eAAO,MAAM,8BAA8B;;;;CAIjC,CAAC;AAEX;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,iBAAiB;;CAEpB,CAAC;AA4DX,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;CAAW,CAAC;AAE5C,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAukBnB,CAAC;AAEH,wBAAgB,oCAAoC,IAAI,sBAAsB,CAS7E;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,EAAE,aAAa,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAQtE,CAAC"}