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