@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.
- package/LICENSE +21 -0
- package/README.md +65 -2
- package/dist/admin/api/cms-client.d.ts +77 -0
- package/dist/admin/api/cms-client.d.ts.map +1 -0
- package/dist/admin/api/cms-client.js +162 -0
- package/dist/admin/api/cms-client.js.map +1 -0
- package/dist/admin/components/AdminCatalogPreviewProvider.d.ts +6 -0
- package/dist/admin/components/AdminCatalogPreviewProvider.d.ts.map +1 -0
- package/dist/admin/components/AdminCatalogPreviewProvider.js +74 -0
- package/dist/admin/components/AdminCatalogPreviewProvider.js.map +1 -0
- package/dist/admin/components/AdminCmsAssetProvider.d.ts +9 -0
- package/dist/admin/components/AdminCmsAssetProvider.d.ts.map +1 -0
- package/dist/admin/components/AdminCmsAssetProvider.js +50 -0
- package/dist/admin/components/AdminCmsAssetProvider.js.map +1 -0
- package/dist/admin/components/BackgroundFields.d.ts +4 -0
- package/dist/admin/components/BackgroundFields.d.ts.map +1 -0
- package/dist/admin/components/BackgroundFields.js +40 -0
- package/dist/admin/components/BackgroundFields.js.map +1 -0
- package/dist/admin/components/ButtonLinkFields.d.ts +6 -0
- package/dist/admin/components/ButtonLinkFields.d.ts.map +1 -0
- package/dist/admin/components/ButtonLinkFields.js +127 -0
- package/dist/admin/components/ButtonLinkFields.js.map +1 -0
- package/dist/admin/components/CarouselPreviewNav.d.ts +12 -0
- package/dist/admin/components/CarouselPreviewNav.d.ts.map +1 -0
- package/dist/admin/components/CarouselPreviewNav.js +31 -0
- package/dist/admin/components/CarouselPreviewNav.js.map +1 -0
- package/dist/admin/components/CmsContentEditorLayout.d.ts +12 -0
- package/dist/admin/components/CmsContentEditorLayout.d.ts.map +1 -0
- package/dist/admin/components/CmsContentEditorLayout.js +9 -0
- package/dist/admin/components/CmsContentEditorLayout.js.map +1 -0
- package/dist/admin/components/ComponentDragHandle.d.ts +6 -0
- package/dist/admin/components/ComponentDragHandle.d.ts.map +1 -0
- package/dist/admin/components/ComponentDragHandle.js +119 -0
- package/dist/admin/components/ComponentDragHandle.js.map +1 -0
- package/dist/admin/components/ContentSliderActionBarExtras.d.ts +6 -0
- package/dist/admin/components/ContentSliderActionBarExtras.d.ts.map +1 -0
- package/dist/admin/components/ContentSliderActionBarExtras.js +109 -0
- package/dist/admin/components/ContentSliderActionBarExtras.js.map +1 -0
- package/dist/admin/components/HookBlockAttachmentsPanel.d.ts +9 -0
- package/dist/admin/components/HookBlockAttachmentsPanel.d.ts.map +1 -0
- package/dist/admin/components/HookBlockAttachmentsPanel.js +137 -0
- package/dist/admin/components/HookBlockAttachmentsPanel.js.map +1 -0
- package/dist/admin/components/PageBuilderActionBar.d.ts +10 -0
- package/dist/admin/components/PageBuilderActionBar.d.ts.map +1 -0
- package/dist/admin/components/PageBuilderActionBar.js +118 -0
- package/dist/admin/components/PageBuilderActionBar.js.map +1 -0
- package/dist/admin/components/PageBuilderDrawer.d.ts +16 -0
- package/dist/admin/components/PageBuilderDrawer.d.ts.map +1 -0
- package/dist/admin/components/PageBuilderDrawer.js +53 -0
- package/dist/admin/components/PageBuilderDrawer.js.map +1 -0
- package/dist/admin/components/PageBuilderEditor.d.ts +45 -0
- package/dist/admin/components/PageBuilderEditor.d.ts.map +1 -0
- package/dist/admin/components/PageBuilderEditor.js +632 -0
- package/dist/admin/components/PageBuilderEditor.js.map +1 -0
- package/dist/admin/components/PuckActionGuard.d.ts +12 -0
- package/dist/admin/components/PuckActionGuard.d.ts.map +1 -0
- package/dist/admin/components/PuckActionGuard.js +30 -0
- package/dist/admin/components/PuckActionGuard.js.map +1 -0
- package/dist/admin/components/RowLayoutPicker.d.ts +8 -0
- package/dist/admin/components/RowLayoutPicker.d.ts.map +1 -0
- package/dist/admin/components/RowLayoutPicker.js +17 -0
- package/dist/admin/components/RowLayoutPicker.js.map +1 -0
- package/dist/admin/components/SliderPreviewActionBarExtras.d.ts +6 -0
- package/dist/admin/components/SliderPreviewActionBarExtras.d.ts.map +1 -0
- package/dist/admin/components/SliderPreviewActionBarExtras.js +32 -0
- package/dist/admin/components/SliderPreviewActionBarExtras.js.map +1 -0
- package/dist/admin/components/admin-catalog-preview-map.d.ts +17 -0
- package/dist/admin/components/admin-catalog-preview-map.d.ts.map +1 -0
- package/dist/admin/components/admin-catalog-preview-map.js +18 -0
- package/dist/admin/components/admin-catalog-preview-map.js.map +1 -0
- package/dist/admin/components/build-viewports.d.ts +23 -0
- package/dist/admin/components/build-viewports.d.ts.map +1 -0
- package/dist/admin/components/build-viewports.js +23 -0
- package/dist/admin/components/build-viewports.js.map +1 -0
- package/dist/admin/components/cms-template-layout.d.ts +16 -0
- package/dist/admin/components/cms-template-layout.d.ts.map +1 -0
- package/dist/admin/components/cms-template-layout.js +53 -0
- package/dist/admin/components/cms-template-layout.js.map +1 -0
- package/dist/admin/components/page-builder-i18n.d.ts +27 -0
- package/dist/admin/components/page-builder-i18n.d.ts.map +1 -0
- package/dist/admin/components/page-builder-i18n.js +34 -0
- package/dist/admin/components/page-builder-i18n.js.map +1 -0
- package/dist/admin/components/puck-safe.d.ts +10 -0
- package/dist/admin/components/puck-safe.d.ts.map +1 -0
- package/dist/admin/components/puck-safe.js +22 -0
- package/dist/admin/components/puck-safe.js.map +1 -0
- package/dist/admin/components/scope-utils.d.ts +4 -0
- package/dist/admin/components/scope-utils.d.ts.map +1 -0
- package/dist/admin/components/scope-utils.js +7 -0
- package/dist/admin/components/scope-utils.js.map +1 -0
- package/dist/admin/editors/BlockEditor.d.ts +9 -0
- package/dist/admin/editors/BlockEditor.d.ts.map +1 -0
- package/dist/admin/editors/BlockEditor.js +217 -0
- package/dist/admin/editors/BlockEditor.js.map +1 -0
- package/dist/admin/editors/PageEditor.d.ts +9 -0
- package/dist/admin/editors/PageEditor.d.ts.map +1 -0
- package/dist/admin/editors/PageEditor.js +316 -0
- package/dist/admin/editors/PageEditor.js.map +1 -0
- package/dist/admin/editors/TemplateEditor.d.ts +9 -0
- package/dist/admin/editors/TemplateEditor.d.ts.map +1 -0
- package/dist/admin/editors/TemplateEditor.js +180 -0
- package/dist/admin/editors/TemplateEditor.js.map +1 -0
- package/dist/admin/index.d.ts +38 -0
- package/dist/admin/index.d.ts.map +1 -0
- package/dist/admin/index.js +144 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/admin/pages/BlocksListPage.d.ts +9 -0
- package/dist/admin/pages/BlocksListPage.d.ts.map +1 -0
- package/dist/admin/pages/BlocksListPage.js +47 -0
- package/dist/admin/pages/BlocksListPage.js.map +1 -0
- package/dist/admin/pages/HooksPage.d.ts +9 -0
- package/dist/admin/pages/HooksPage.d.ts.map +1 -0
- package/dist/admin/pages/HooksPage.js +41 -0
- package/dist/admin/pages/HooksPage.js.map +1 -0
- package/dist/admin/pages/PagesListPage.d.ts +9 -0
- package/dist/admin/pages/PagesListPage.d.ts.map +1 -0
- package/dist/admin/pages/PagesListPage.js +51 -0
- package/dist/admin/pages/PagesListPage.js.map +1 -0
- package/dist/admin/pages/TemplatesListPage.d.ts +9 -0
- package/dist/admin/pages/TemplatesListPage.d.ts.map +1 -0
- package/dist/admin/pages/TemplatesListPage.js +47 -0
- package/dist/admin/pages/TemplatesListPage.js.map +1 -0
- package/dist/admin-ui/index.d.ts +90 -0
- package/dist/admin-ui/index.d.ts.map +1 -0
- package/dist/admin-ui/index.js +89 -0
- package/dist/admin-ui/index.js.map +1 -0
- package/dist/backend/cli/block-names.d.ts +92 -0
- package/dist/backend/cli/block-names.d.ts.map +1 -0
- package/dist/backend/cli/block-names.js +132 -0
- package/dist/backend/cli/block-names.js.map +1 -0
- package/dist/backend/entities/cms-block.entity.d.ts +20 -0
- package/dist/backend/entities/cms-block.entity.d.ts.map +1 -0
- package/dist/backend/entities/cms-block.entity.js +77 -0
- package/dist/backend/entities/cms-block.entity.js.map +1 -0
- package/dist/backend/entities/cms-hook-block-attachment.entity.d.ts +15 -0
- package/dist/backend/entities/cms-hook-block-attachment.entity.d.ts.map +1 -0
- package/dist/backend/entities/cms-hook-block-attachment.entity.js +46 -0
- package/dist/backend/entities/cms-hook-block-attachment.entity.js.map +1 -0
- package/dist/backend/entities/cms-hook.entity.d.ts +20 -0
- package/dist/backend/entities/cms-hook.entity.d.ts.map +1 -0
- package/dist/backend/entities/cms-hook.entity.js +73 -0
- package/dist/backend/entities/cms-hook.entity.js.map +1 -0
- package/dist/backend/entities/cms-page.entity.d.ts +43 -0
- package/dist/backend/entities/cms-page.entity.d.ts.map +1 -0
- package/dist/backend/entities/cms-page.entity.js +140 -0
- package/dist/backend/entities/cms-page.entity.js.map +1 -0
- package/dist/backend/entities/cms-template.entity.d.ts +20 -0
- package/dist/backend/entities/cms-template.entity.d.ts.map +1 -0
- package/dist/backend/entities/cms-template.entity.js +73 -0
- package/dist/backend/entities/cms-template.entity.js.map +1 -0
- package/dist/backend/index.d.ts +157 -0
- package/dist/backend/index.d.ts.map +1 -0
- package/dist/backend/index.js +317 -0
- package/dist/backend/index.js.map +1 -0
- package/dist/backend/plugin.d.ts +81 -0
- package/dist/backend/plugin.d.ts.map +1 -0
- package/dist/backend/plugin.js +81 -0
- package/dist/backend/plugin.js.map +1 -0
- package/dist/backend/routes.admin.d.ts +19 -0
- package/dist/backend/routes.admin.d.ts.map +1 -0
- package/dist/backend/routes.admin.js +164 -0
- package/dist/backend/routes.admin.js.map +1 -0
- package/dist/backend/routes.storefront.d.ts +6 -0
- package/dist/backend/routes.storefront.d.ts.map +1 -0
- package/dist/backend/routes.storefront.js +89 -0
- package/dist/backend/routes.storefront.js.map +1 -0
- package/dist/backend/services/asset-embed-resolver.d.ts +17 -0
- package/dist/backend/services/asset-embed-resolver.d.ts.map +1 -0
- package/dist/backend/services/asset-embed-resolver.js +40 -0
- package/dist/backend/services/asset-embed-resolver.js.map +1 -0
- package/dist/backend/services/asset-references.d.ts +4 -0
- package/dist/backend/services/asset-references.d.ts.map +1 -0
- package/dist/backend/services/asset-references.js +55 -0
- package/dist/backend/services/asset-references.js.map +1 -0
- package/dist/backend/services/cms-block-read-port.d.ts +27 -0
- package/dist/backend/services/cms-block-read-port.d.ts.map +1 -0
- package/dist/backend/services/cms-block-read-port.js +50 -0
- package/dist/backend/services/cms-block-read-port.js.map +1 -0
- package/dist/backend/services/cms-block-seed-port.d.ts +31 -0
- package/dist/backend/services/cms-block-seed-port.d.ts.map +1 -0
- package/dist/backend/services/cms-block-seed-port.js +68 -0
- package/dist/backend/services/cms-block-seed-port.js.map +1 -0
- package/dist/backend/services/cms-block-service.d.ts +38 -0
- package/dist/backend/services/cms-block-service.d.ts.map +1 -0
- package/dist/backend/services/cms-block-service.js +218 -0
- package/dist/backend/services/cms-block-service.js.map +1 -0
- package/dist/backend/services/cms-cache.d.ts +54 -0
- package/dist/backend/services/cms-cache.d.ts.map +1 -0
- package/dist/backend/services/cms-cache.js +113 -0
- package/dist/backend/services/cms-cache.js.map +1 -0
- package/dist/backend/services/cms-hook-service.d.ts +35 -0
- package/dist/backend/services/cms-hook-service.d.ts.map +1 -0
- package/dist/backend/services/cms-hook-service.js +216 -0
- package/dist/backend/services/cms-hook-service.js.map +1 -0
- package/dist/backend/services/cms-language-reference.d.ts +11 -0
- package/dist/backend/services/cms-language-reference.d.ts.map +1 -0
- package/dist/backend/services/cms-language-reference.js +26 -0
- package/dist/backend/services/cms-language-reference.js.map +1 -0
- package/dist/backend/services/cms-page-read-port.d.ts +23 -0
- package/dist/backend/services/cms-page-read-port.d.ts.map +1 -0
- package/dist/backend/services/cms-page-read-port.js +54 -0
- package/dist/backend/services/cms-page-read-port.js.map +1 -0
- package/dist/backend/services/cms-page-service.d.ts +104 -0
- package/dist/backend/services/cms-page-service.d.ts.map +1 -0
- package/dist/backend/services/cms-page-service.js +468 -0
- package/dist/backend/services/cms-page-service.js.map +1 -0
- package/dist/backend/services/cms-reference-registry.d.ts +30 -0
- package/dist/backend/services/cms-reference-registry.d.ts.map +1 -0
- package/dist/backend/services/cms-reference-registry.js +98 -0
- package/dist/backend/services/cms-reference-registry.js.map +1 -0
- package/dist/backend/services/cms-template-service.d.ts +37 -0
- package/dist/backend/services/cms-template-service.d.ts.map +1 -0
- package/dist/backend/services/cms-template-service.js +205 -0
- package/dist/backend/services/cms-template-service.js.map +1 -0
- package/dist/backend/services/content-tree-walker.d.ts +7 -0
- package/dist/backend/services/content-tree-walker.d.ts.map +1 -0
- package/dist/backend/services/content-tree-walker.js +89 -0
- package/dist/backend/services/content-tree-walker.js.map +1 -0
- package/dist/backend/services/page-builder-registry.d.ts +120 -0
- package/dist/backend/services/page-builder-registry.d.ts.map +1 -0
- package/dist/backend/services/page-builder-registry.js +220 -0
- package/dist/backend/services/page-builder-registry.js.map +1 -0
- package/dist/backend/services/seed-hooks.d.ts +22 -0
- package/dist/backend/services/seed-hooks.d.ts.map +1 -0
- package/dist/backend/services/seed-hooks.js +94 -0
- package/dist/backend/services/seed-hooks.js.map +1 -0
- package/dist/backend/services/storefront-resolver.d.ts +71 -0
- package/dist/backend/services/storefront-resolver.d.ts.map +1 -0
- package/dist/backend/services/storefront-resolver.js +329 -0
- package/dist/backend/services/storefront-resolver.js.map +1 -0
- package/dist/manifest.d.ts +225 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +695 -0
- package/dist/manifest.js.map +1 -0
- package/dist/migrations/20260425T162418_cms_pages_init.d.ts +10 -0
- package/dist/migrations/20260425T162418_cms_pages_init.d.ts.map +1 -0
- package/dist/migrations/20260425T162418_cms_pages_init.js +30 -0
- package/dist/migrations/20260425T162418_cms_pages_init.js.map +1 -0
- package/dist/migrations/20260505T130214_cms_init.d.ts +28 -0
- package/dist/migrations/20260505T130214_cms_init.d.ts.map +1 -0
- package/dist/migrations/20260505T130214_cms_init.js +332 -0
- package/dist/migrations/20260505T130214_cms_init.js.map +1 -0
- package/dist/migrations/20260903T101741_cms_namespace_block_names.d.ts +6 -0
- package/dist/migrations/20260903T101741_cms_namespace_block_names.d.ts.map +1 -0
- package/dist/migrations/20260903T101741_cms_namespace_block_names.js +60 -0
- package/dist/migrations/20260903T101741_cms_namespace_block_names.js.map +1 -0
- package/dist/migrations/20260912T094733_cms_sales_channel_cms_pages.d.ts +27 -0
- package/dist/migrations/20260912T094733_cms_sales_channel_cms_pages.d.ts.map +1 -0
- package/dist/migrations/20260912T094733_cms_sales_channel_cms_pages.js +44 -0
- package/dist/migrations/20260912T094733_cms_sales_channel_cms_pages.js.map +1 -0
- package/dist/migrations/20260912T125709_cms_page_body_asset_ref_index.d.ts +32 -0
- package/dist/migrations/20260912T125709_cms_page_body_asset_ref_index.d.ts.map +1 -0
- package/dist/migrations/20260912T125709_cms_page_body_asset_ref_index.js +36 -0
- package/dist/migrations/20260912T125709_cms_page_body_asset_ref_index.js.map +1 -0
- package/dist/migrations/index.d.ts +31 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +37 -0
- package/dist/migrations/index.js.map +1 -0
- package/docs/cms/extending-page-builder.md +256 -0
- package/docs/cms/index.md +233 -0
- package/i18n/en.json +231 -0
- package/i18n/pl.json +231 -0
- package/package.json +125 -3
- 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"}
|