@cmssy/core 14.1.0 → 15.0.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.
@@ -58,7 +58,7 @@ interface CmssyClient {
58
58
  }
59
59
  declare function createCmssyClient(input: CmssyClientConfig): CmssyClient;
60
60
 
61
- declare const PROTOCOL_VERSION = 2;
61
+ declare const PROTOCOL_VERSION = 3;
62
62
 
63
63
  declare const SHORTCUT_ACTIONS: readonly ["undo", "redo", "save", "duplicate", "delete", "escape"];
64
64
  type ShortcutAction = (typeof SHORTCUT_ACTIONS)[number];
@@ -69,7 +69,7 @@ interface ReadyMessage {
69
69
  id: string;
70
70
  type: string;
71
71
  bounds: BlockRect;
72
- layoutPosition?: string;
72
+ layoutRegion?: string;
73
73
  }>;
74
74
  schemas: Record<string, BlockSchema>;
75
75
  blockMeta?: Record<string, BlockMeta>;
@@ -85,7 +85,7 @@ interface ClickMessage {
85
85
  type: "cmssy:click";
86
86
  blockId: string;
87
87
  rect: BlockRect;
88
- layoutPosition?: string;
88
+ layoutRegion?: string;
89
89
  }
90
90
  interface DeselectMessage {
91
91
  type: "cmssy:deselect";
@@ -128,7 +128,7 @@ interface PatchMessage {
128
128
  content: Record<string, unknown>;
129
129
  style?: Record<string, unknown>;
130
130
  advanced?: Record<string, unknown>;
131
- layoutPosition?: string;
131
+ layoutRegion?: string;
132
132
  }
133
133
  interface ParentReadyMessage {
134
134
  type: "cmssy:parent-ready";
@@ -58,7 +58,7 @@ interface CmssyClient {
58
58
  }
59
59
  declare function createCmssyClient(input: CmssyClientConfig): CmssyClient;
60
60
 
61
- declare const PROTOCOL_VERSION = 2;
61
+ declare const PROTOCOL_VERSION = 3;
62
62
 
63
63
  declare const SHORTCUT_ACTIONS: readonly ["undo", "redo", "save", "duplicate", "delete", "escape"];
64
64
  type ShortcutAction = (typeof SHORTCUT_ACTIONS)[number];
@@ -69,7 +69,7 @@ interface ReadyMessage {
69
69
  id: string;
70
70
  type: string;
71
71
  bounds: BlockRect;
72
- layoutPosition?: string;
72
+ layoutRegion?: string;
73
73
  }>;
74
74
  schemas: Record<string, BlockSchema>;
75
75
  blockMeta?: Record<string, BlockMeta>;
@@ -85,7 +85,7 @@ interface ClickMessage {
85
85
  type: "cmssy:click";
86
86
  blockId: string;
87
87
  rect: BlockRect;
88
- layoutPosition?: string;
88
+ layoutRegion?: string;
89
89
  }
90
90
  interface DeselectMessage {
91
91
  type: "cmssy:deselect";
@@ -128,7 +128,7 @@ interface PatchMessage {
128
128
  content: Record<string, unknown>;
129
129
  style?: Record<string, unknown>;
130
130
  advanced?: Record<string, unknown>;
131
- layoutPosition?: string;
131
+ layoutRegion?: string;
132
132
  }
133
133
  interface ParentReadyMessage {
134
134
  type: "cmssy:parent-ready";
package/dist/index.cjs CHANGED
@@ -619,6 +619,62 @@ function defineCmssyLayout(layout) {
619
619
  return { regions };
620
620
  }
621
621
 
622
+ // src/manifest.ts
623
+ function propsToSchema(props) {
624
+ const schema = {};
625
+ for (const [key, def] of Object.entries(props)) {
626
+ schema[key] = { ...def, label: def.label || key };
627
+ }
628
+ return schema;
629
+ }
630
+ function blocksToSchemas(blocks) {
631
+ const out = /* @__PURE__ */ Object.create(null);
632
+ for (const block of blocks) out[block.type] = propsToSchema(block.props);
633
+ return out;
634
+ }
635
+ function blocksToMeta(blocks, defaults = {}) {
636
+ const out = /* @__PURE__ */ Object.create(null);
637
+ for (const block of blocks) {
638
+ const category = block.category ?? defaults.category;
639
+ out[block.type] = {
640
+ label: block.label ?? block.type,
641
+ ...category ? { category } : {},
642
+ ...block.icon ? { icon: block.icon } : {},
643
+ ...block.layoutRegions ? { layoutRegions: block.layoutRegions } : {},
644
+ ...block.description ? { description: block.description } : {}
645
+ };
646
+ }
647
+ return out;
648
+ }
649
+ function layoutRegionsToBridge(regions) {
650
+ return regions.map(
651
+ (region) => region.settings ? { ...region, settings: propsToSchema(region.settings) } : { ...region }
652
+ );
653
+ }
654
+ function registryToManifestBlocks(schemas, blockMeta) {
655
+ return Object.entries(schemas).sort(([a], [b]) => a.localeCompare(b)).map(([type, schema]) => {
656
+ const meta = blockMeta?.[type];
657
+ return {
658
+ type,
659
+ label: meta?.label || type,
660
+ ...meta?.category ? { category: meta.category } : {},
661
+ ...meta?.icon ? { icon: meta.icon } : {},
662
+ ...meta?.description ? { description: meta.description } : {},
663
+ ...meta?.layoutRegions?.length ? { layoutRegions: meta.layoutRegions } : {},
664
+ schema
665
+ };
666
+ });
667
+ }
668
+ function buildBlockManifest(blocks, options = {}) {
669
+ return {
670
+ blocks: registryToManifestBlocks(
671
+ blocksToSchemas(blocks),
672
+ blocksToMeta(blocks, { category: options.category })
673
+ ),
674
+ regions: options.regions ? layoutRegionsToBridge(options.regions) : null
675
+ };
676
+ }
677
+
622
678
  // src/data/localize-href.ts
623
679
  var PROTOCOL_OR_RELATIVE = /^([a-z][a-z0-9+.-]*:|\/\/)/i;
624
680
  function isExternalHref(href) {
@@ -708,7 +764,7 @@ function splitLocaleFromPath(path, siteLocales) {
708
764
  var CMSSY_LOCALE_HEADER = "x-cmssy-locale";
709
765
 
710
766
  // src/bridge/protocol.ts
711
- var PROTOCOL_VERSION = 2;
767
+ var PROTOCOL_VERSION = 3;
712
768
  var SHORTCUT_ACTIONS = [
713
769
  "undo",
714
770
  "redo",
@@ -766,7 +822,7 @@ function parseEditorMessage(data, origin, expectedOrigin) {
766
822
  protocolVersion: PROTOCOL_VERSION,
767
823
  ...isObject(data.style) ? { style: data.style } : {},
768
824
  ...isObject(data.advanced) ? { advanced: data.advanced } : {},
769
- ...typeof data.layoutPosition === "string" ? { layoutPosition: data.layoutPosition } : {}
825
+ ...typeof data.layoutRegion === "string" ? { layoutRegion: data.layoutRegion } : {}
770
826
  } : null;
771
827
  case "cmssy:parent-ready":
772
828
  return data.protocolVersion === PROTOCOL_VERSION ? { type: "cmssy:parent-ready", protocolVersion: PROTOCOL_VERSION } : null;
@@ -1009,6 +1065,9 @@ exports.DEFAULT_CMSSY_EDITOR_ORIGINS = DEFAULT_CMSSY_EDITOR_ORIGINS;
1009
1065
  exports.PROTOCOL_VERSION = PROTOCOL_VERSION;
1010
1066
  exports.SHORTCUT_ACTIONS = SHORTCUT_ACTIONS;
1011
1067
  exports.applyCmssyCsp = applyCmssyCsp;
1068
+ exports.blocksToMeta = blocksToMeta;
1069
+ exports.blocksToSchemas = blocksToSchemas;
1070
+ exports.buildBlockManifest = buildBlockManifest;
1012
1071
  exports.createCmssyClient = createCmssyClient;
1013
1072
  exports.defineCmssyConfig = defineCmssyConfig;
1014
1073
  exports.defineCmssyLayout = defineCmssyLayout;
@@ -1016,6 +1075,7 @@ exports.fields = fields;
1016
1075
  exports.graphqlRequest = graphqlRequest;
1017
1076
  exports.isProtocolCompatible = isProtocolCompatible;
1018
1077
  exports.isVerifiedEditUrl = isVerifiedEditUrl;
1078
+ exports.layoutRegionsToBridge = layoutRegionsToBridge;
1019
1079
  exports.localizeHref = localizeHref;
1020
1080
  exports.mediaAlt = mediaAlt;
1021
1081
  exports.mediaUrl = mediaUrl;
@@ -1023,6 +1083,8 @@ exports.mediaUrls = mediaUrls;
1023
1083
  exports.normalizeOrigin = normalizeOrigin;
1024
1084
  exports.parseEditorMessage = parseEditorMessage;
1025
1085
  exports.postToEditor = postToEditor;
1086
+ exports.propsToSchema = propsToSchema;
1087
+ exports.registryToManifestBlocks = registryToManifestBlocks;
1026
1088
  exports.resolveCmssyLocale = resolveCmssyLocale;
1027
1089
  exports.resolveEditorOrigin = resolveEditorOrigin;
1028
1090
  exports.verifyCmssyWebhook = verifyCmssyWebhook;
package/dist/index.d.cts CHANGED
@@ -1,9 +1,9 @@
1
- export { A as AppToEditorMessage, B as BoundsMessage, C as ClickMessage, a as CmssyClient, b as CmssyConfig, c as CmssyCspOptions, d as CmssyEnvConfig, e as CmssyLayout, f as CmssyRegion, g as CmssyRegionOf, h as CmssyRegionSettings, i as CmssyRegionSettingsOf, j as CmssyTypedDocument, D as DEFAULT_CMSSY_EDITOR_ORIGINS, E as EditorToAppMessage, I as InvisibleBlock, k as InvisibleBlocksMessage, P as PROTOCOL_VERSION, l as ParentReadyMessage, m as PatchMessage, n as PostTarget, Q as QueryScopedOptions, R as ReadyMessage, S as SHORTCUT_ACTIONS, o as SelectMessage, p as ShortcutAction, q as ShortcutMessage, V as ViewportMessage, r as applyCmssyCsp, s as createCmssyClient, t as defineCmssyConfig, u as defineCmssyLayout, v as isProtocolCompatible, w as normalizeOrigin, x as parseEditorMessage, y as postToEditor, z as resolveEditorOrigin } from './csp-CY7ssZsh.cjs';
1
+ export { A as AppToEditorMessage, B as BoundsMessage, C as ClickMessage, a as CmssyClient, b as CmssyConfig, c as CmssyCspOptions, d as CmssyEnvConfig, e as CmssyLayout, f as CmssyRegion, g as CmssyRegionOf, h as CmssyRegionSettings, i as CmssyRegionSettingsOf, j as CmssyTypedDocument, D as DEFAULT_CMSSY_EDITOR_ORIGINS, E as EditorToAppMessage, I as InvisibleBlock, k as InvisibleBlocksMessage, P as PROTOCOL_VERSION, l as ParentReadyMessage, m as PatchMessage, n as PostTarget, Q as QueryScopedOptions, R as ReadyMessage, S as SHORTCUT_ACTIONS, o as SelectMessage, p as ShortcutAction, q as ShortcutMessage, V as ViewportMessage, r as applyCmssyCsp, s as createCmssyClient, t as defineCmssyConfig, u as defineCmssyLayout, v as isProtocolCompatible, w as normalizeOrigin, x as parseEditorMessage, y as postToEditor, z as resolveEditorOrigin } from './csp-BHjoSZ2p.cjs';
2
2
  export { C as CMSSY_LOCALE_HEADER, G as GraphqlRequestOptions, g as graphqlRequest, l as localizeHref, r as resolveCmssyLocale } from './locale-JyBHqpAQ.cjs';
3
3
  export { C as CMSSY_RATE_LIMIT_WINDOW_MS, a as CMSSY_RETRY_MODES, b as CmssyRequestError, c as CmssyRetryMode, D as DEFAULT_CMSSY_API_URL, F as FetchLike, d as FetchLikeResponse, e as FetchPageOptions, R as RetryOption, f as RetryPolicy } from './content-client-65N8ZRq9.cjs';
4
4
  import * as _cmssy_types from '@cmssy/types';
5
- import { FieldOptions, TypedField, ResolvedMediaValue, PageRef, BlockPropsSchema, InferBlockContent, RelationMode, CmssyModelRecord, ResolvedMedia, VerifyCmssyWebhookOptions, CmssyWebhookEvent } from '@cmssy/types';
6
- export { BlockMeta, BlockPropsSchema, BlockRect, BlockSchema, BuildBlockContextExtra, CmssyBlockAuthContext, CmssyBlockContext, CmssyBlockMember, CmssyBlockPage, CmssyBlockWorkspace, CmssyBranding, CmssyClientConfig, CmssyFormDefinition, CmssyFormField, CmssyFormSettings, CmssyFormSubmitResponse, CmssyLayoutGroup, CmssyLocaleContext, CmssyLocalizedValue, CmssyModelDefinition, CmssyModelRecord, CmssyPageData, CmssyPageMeta, CmssyPageSummary, CmssyRecordList, CmssySiteConfig, CmssyWebhookEvent, CmssyWebhookOrder, FieldCondition, FieldConditionGroup, FieldConditionLogic, FieldControl, FieldDefinition, FieldOptions, FieldType, InferBlockContent, LayoutPosition, LayoutRegion, RawBlock, RawLayoutBlock, SubmitFormInput, TypedField, VerifyCmssyWebhookOptions, evaluateFieldConditionGroup } from '@cmssy/types';
5
+ import { FieldOptions, TypedField, ResolvedMediaValue, PageRef, BlockPropsSchema, InferBlockContent, RelationMode, CmssyModelRecord, ResolvedMedia, BlockSchema, LayoutRegion, FieldDefinition, BlockMeta, VerifyCmssyWebhookOptions, CmssyWebhookEvent } from '@cmssy/types';
6
+ export { BlockMeta, BlockPropsSchema, BlockRect, BlockSchema, BuildBlockContextExtra, CmssyBlockAuthContext, CmssyBlockContext, CmssyBlockMember, CmssyBlockPage, CmssyBlockWorkspace, CmssyBranding, CmssyClientConfig, CmssyFormDefinition, CmssyFormField, CmssyFormSettings, CmssyFormSubmitResponse, CmssyLayoutGroup, CmssyLocaleContext, CmssyLocalizedValue, CmssyModelDefinition, CmssyModelRecord, CmssyPageData, CmssyPageMeta, CmssyPageSummary, CmssyRecordList, CmssySiteConfig, CmssyWebhookEvent, CmssyWebhookOrder, FieldCondition, FieldConditionGroup, FieldConditionLogic, FieldControl, FieldDefinition, FieldOptions, FieldType, InferBlockContent, LayoutRegion, LayoutRegionId, RawBlock, RawLayoutBlock, SubmitFormInput, TypedField, VerifyCmssyWebhookOptions, evaluateFieldConditionGroup } from '@cmssy/types';
7
7
 
8
8
  /**
9
9
  * Whether the content is guaranteed to carry the field. Only `required` says
@@ -79,6 +79,40 @@ declare function mediaUrl(value: MediaLike): string | null;
79
79
  declare function mediaUrls(value: readonly MediaLike[] | null | undefined): string[];
80
80
  declare function mediaAlt(value: MediaLike): string | undefined;
81
81
 
82
+ interface BlockManifestSource {
83
+ type: string;
84
+ label?: string;
85
+ category?: string;
86
+ icon?: string;
87
+ layoutRegions?: string[];
88
+ description?: string;
89
+ props: Record<string, FieldDefinition>;
90
+ }
91
+ interface BlockManifestBlock {
92
+ type: string;
93
+ label: string;
94
+ category?: string;
95
+ icon?: string;
96
+ description?: string;
97
+ layoutRegions?: string[];
98
+ schema: BlockSchema;
99
+ }
100
+ interface BlockManifest {
101
+ blocks: BlockManifestBlock[];
102
+ regions: LayoutRegion[] | null;
103
+ }
104
+ declare function propsToSchema(props: BlockPropsSchema): BlockSchema;
105
+ declare function blocksToSchemas(blocks: readonly BlockManifestSource[]): Record<string, BlockSchema>;
106
+ declare function blocksToMeta(blocks: readonly BlockManifestSource[], defaults?: {
107
+ category?: string;
108
+ }): Record<string, BlockMeta>;
109
+ declare function layoutRegionsToBridge(regions: readonly LayoutRegion[]): LayoutRegion[];
110
+ declare function registryToManifestBlocks(schemas: Record<string, BlockSchema>, blockMeta: Record<string, BlockMeta> | null): BlockManifestBlock[];
111
+ declare function buildBlockManifest(blocks: readonly BlockManifestSource[], options?: {
112
+ category?: string;
113
+ regions?: readonly LayoutRegion[] | null;
114
+ }): BlockManifest;
115
+
82
116
  declare const CMSSY_EDIT_HEADER = "x-cmssy-edit";
83
117
  declare const CMSSY_EDIT_QUERY_PARAM = "cmssyEdit";
84
118
  declare const CMSSY_SECRET_QUERY_PARAM = "cmssySecret";
@@ -97,4 +131,4 @@ declare class CmssyWebhookError extends Error {
97
131
  }
98
132
  declare function verifyCmssyWebhook(options: VerifyCmssyWebhookOptions): Promise<CmssyWebhookEvent>;
99
133
 
100
- export { CMSSY_EDIT_HEADER, CMSSY_EDIT_QUERY_PARAM, CMSSY_SECRET_QUERY_PARAM, CmssyWebhookError, type MediaLike, fields, isVerifiedEditUrl, mediaAlt, mediaUrl, mediaUrls, verifyCmssyWebhook };
134
+ export { type BlockManifest, type BlockManifestBlock, type BlockManifestSource, CMSSY_EDIT_HEADER, CMSSY_EDIT_QUERY_PARAM, CMSSY_SECRET_QUERY_PARAM, CmssyWebhookError, type MediaLike, blocksToMeta, blocksToSchemas, buildBlockManifest, fields, isVerifiedEditUrl, layoutRegionsToBridge, mediaAlt, mediaUrl, mediaUrls, propsToSchema, registryToManifestBlocks, verifyCmssyWebhook };
package/dist/index.d.ts CHANGED
@@ -1,9 +1,9 @@
1
- export { A as AppToEditorMessage, B as BoundsMessage, C as ClickMessage, a as CmssyClient, b as CmssyConfig, c as CmssyCspOptions, d as CmssyEnvConfig, e as CmssyLayout, f as CmssyRegion, g as CmssyRegionOf, h as CmssyRegionSettings, i as CmssyRegionSettingsOf, j as CmssyTypedDocument, D as DEFAULT_CMSSY_EDITOR_ORIGINS, E as EditorToAppMessage, I as InvisibleBlock, k as InvisibleBlocksMessage, P as PROTOCOL_VERSION, l as ParentReadyMessage, m as PatchMessage, n as PostTarget, Q as QueryScopedOptions, R as ReadyMessage, S as SHORTCUT_ACTIONS, o as SelectMessage, p as ShortcutAction, q as ShortcutMessage, V as ViewportMessage, r as applyCmssyCsp, s as createCmssyClient, t as defineCmssyConfig, u as defineCmssyLayout, v as isProtocolCompatible, w as normalizeOrigin, x as parseEditorMessage, y as postToEditor, z as resolveEditorOrigin } from './csp-DLCKZAyi.js';
1
+ export { A as AppToEditorMessage, B as BoundsMessage, C as ClickMessage, a as CmssyClient, b as CmssyConfig, c as CmssyCspOptions, d as CmssyEnvConfig, e as CmssyLayout, f as CmssyRegion, g as CmssyRegionOf, h as CmssyRegionSettings, i as CmssyRegionSettingsOf, j as CmssyTypedDocument, D as DEFAULT_CMSSY_EDITOR_ORIGINS, E as EditorToAppMessage, I as InvisibleBlock, k as InvisibleBlocksMessage, P as PROTOCOL_VERSION, l as ParentReadyMessage, m as PatchMessage, n as PostTarget, Q as QueryScopedOptions, R as ReadyMessage, S as SHORTCUT_ACTIONS, o as SelectMessage, p as ShortcutAction, q as ShortcutMessage, V as ViewportMessage, r as applyCmssyCsp, s as createCmssyClient, t as defineCmssyConfig, u as defineCmssyLayout, v as isProtocolCompatible, w as normalizeOrigin, x as parseEditorMessage, y as postToEditor, z as resolveEditorOrigin } from './csp-COFMUmsq.js';
2
2
  export { C as CMSSY_LOCALE_HEADER, G as GraphqlRequestOptions, g as graphqlRequest, l as localizeHref, r as resolveCmssyLocale } from './locale-D9KI4bND.js';
3
3
  export { C as CMSSY_RATE_LIMIT_WINDOW_MS, a as CMSSY_RETRY_MODES, b as CmssyRequestError, c as CmssyRetryMode, D as DEFAULT_CMSSY_API_URL, F as FetchLike, d as FetchLikeResponse, e as FetchPageOptions, R as RetryOption, f as RetryPolicy } from './content-client-65N8ZRq9.js';
4
4
  import * as _cmssy_types from '@cmssy/types';
5
- import { FieldOptions, TypedField, ResolvedMediaValue, PageRef, BlockPropsSchema, InferBlockContent, RelationMode, CmssyModelRecord, ResolvedMedia, VerifyCmssyWebhookOptions, CmssyWebhookEvent } from '@cmssy/types';
6
- export { BlockMeta, BlockPropsSchema, BlockRect, BlockSchema, BuildBlockContextExtra, CmssyBlockAuthContext, CmssyBlockContext, CmssyBlockMember, CmssyBlockPage, CmssyBlockWorkspace, CmssyBranding, CmssyClientConfig, CmssyFormDefinition, CmssyFormField, CmssyFormSettings, CmssyFormSubmitResponse, CmssyLayoutGroup, CmssyLocaleContext, CmssyLocalizedValue, CmssyModelDefinition, CmssyModelRecord, CmssyPageData, CmssyPageMeta, CmssyPageSummary, CmssyRecordList, CmssySiteConfig, CmssyWebhookEvent, CmssyWebhookOrder, FieldCondition, FieldConditionGroup, FieldConditionLogic, FieldControl, FieldDefinition, FieldOptions, FieldType, InferBlockContent, LayoutPosition, LayoutRegion, RawBlock, RawLayoutBlock, SubmitFormInput, TypedField, VerifyCmssyWebhookOptions, evaluateFieldConditionGroup } from '@cmssy/types';
5
+ import { FieldOptions, TypedField, ResolvedMediaValue, PageRef, BlockPropsSchema, InferBlockContent, RelationMode, CmssyModelRecord, ResolvedMedia, BlockSchema, LayoutRegion, FieldDefinition, BlockMeta, VerifyCmssyWebhookOptions, CmssyWebhookEvent } from '@cmssy/types';
6
+ export { BlockMeta, BlockPropsSchema, BlockRect, BlockSchema, BuildBlockContextExtra, CmssyBlockAuthContext, CmssyBlockContext, CmssyBlockMember, CmssyBlockPage, CmssyBlockWorkspace, CmssyBranding, CmssyClientConfig, CmssyFormDefinition, CmssyFormField, CmssyFormSettings, CmssyFormSubmitResponse, CmssyLayoutGroup, CmssyLocaleContext, CmssyLocalizedValue, CmssyModelDefinition, CmssyModelRecord, CmssyPageData, CmssyPageMeta, CmssyPageSummary, CmssyRecordList, CmssySiteConfig, CmssyWebhookEvent, CmssyWebhookOrder, FieldCondition, FieldConditionGroup, FieldConditionLogic, FieldControl, FieldDefinition, FieldOptions, FieldType, InferBlockContent, LayoutRegion, LayoutRegionId, RawBlock, RawLayoutBlock, SubmitFormInput, TypedField, VerifyCmssyWebhookOptions, evaluateFieldConditionGroup } from '@cmssy/types';
7
7
 
8
8
  /**
9
9
  * Whether the content is guaranteed to carry the field. Only `required` says
@@ -79,6 +79,40 @@ declare function mediaUrl(value: MediaLike): string | null;
79
79
  declare function mediaUrls(value: readonly MediaLike[] | null | undefined): string[];
80
80
  declare function mediaAlt(value: MediaLike): string | undefined;
81
81
 
82
+ interface BlockManifestSource {
83
+ type: string;
84
+ label?: string;
85
+ category?: string;
86
+ icon?: string;
87
+ layoutRegions?: string[];
88
+ description?: string;
89
+ props: Record<string, FieldDefinition>;
90
+ }
91
+ interface BlockManifestBlock {
92
+ type: string;
93
+ label: string;
94
+ category?: string;
95
+ icon?: string;
96
+ description?: string;
97
+ layoutRegions?: string[];
98
+ schema: BlockSchema;
99
+ }
100
+ interface BlockManifest {
101
+ blocks: BlockManifestBlock[];
102
+ regions: LayoutRegion[] | null;
103
+ }
104
+ declare function propsToSchema(props: BlockPropsSchema): BlockSchema;
105
+ declare function blocksToSchemas(blocks: readonly BlockManifestSource[]): Record<string, BlockSchema>;
106
+ declare function blocksToMeta(blocks: readonly BlockManifestSource[], defaults?: {
107
+ category?: string;
108
+ }): Record<string, BlockMeta>;
109
+ declare function layoutRegionsToBridge(regions: readonly LayoutRegion[]): LayoutRegion[];
110
+ declare function registryToManifestBlocks(schemas: Record<string, BlockSchema>, blockMeta: Record<string, BlockMeta> | null): BlockManifestBlock[];
111
+ declare function buildBlockManifest(blocks: readonly BlockManifestSource[], options?: {
112
+ category?: string;
113
+ regions?: readonly LayoutRegion[] | null;
114
+ }): BlockManifest;
115
+
82
116
  declare const CMSSY_EDIT_HEADER = "x-cmssy-edit";
83
117
  declare const CMSSY_EDIT_QUERY_PARAM = "cmssyEdit";
84
118
  declare const CMSSY_SECRET_QUERY_PARAM = "cmssySecret";
@@ -97,4 +131,4 @@ declare class CmssyWebhookError extends Error {
97
131
  }
98
132
  declare function verifyCmssyWebhook(options: VerifyCmssyWebhookOptions): Promise<CmssyWebhookEvent>;
99
133
 
100
- export { CMSSY_EDIT_HEADER, CMSSY_EDIT_QUERY_PARAM, CMSSY_SECRET_QUERY_PARAM, CmssyWebhookError, type MediaLike, fields, isVerifiedEditUrl, mediaAlt, mediaUrl, mediaUrls, verifyCmssyWebhook };
134
+ export { type BlockManifest, type BlockManifestBlock, type BlockManifestSource, CMSSY_EDIT_HEADER, CMSSY_EDIT_QUERY_PARAM, CMSSY_SECRET_QUERY_PARAM, CmssyWebhookError, type MediaLike, blocksToMeta, blocksToSchemas, buildBlockManifest, fields, isVerifiedEditUrl, layoutRegionsToBridge, mediaAlt, mediaUrl, mediaUrls, propsToSchema, registryToManifestBlocks, verifyCmssyWebhook };
package/dist/index.js CHANGED
@@ -618,6 +618,62 @@ function defineCmssyLayout(layout) {
618
618
  return { regions };
619
619
  }
620
620
 
621
+ // src/manifest.ts
622
+ function propsToSchema(props) {
623
+ const schema = {};
624
+ for (const [key, def] of Object.entries(props)) {
625
+ schema[key] = { ...def, label: def.label || key };
626
+ }
627
+ return schema;
628
+ }
629
+ function blocksToSchemas(blocks) {
630
+ const out = /* @__PURE__ */ Object.create(null);
631
+ for (const block of blocks) out[block.type] = propsToSchema(block.props);
632
+ return out;
633
+ }
634
+ function blocksToMeta(blocks, defaults = {}) {
635
+ const out = /* @__PURE__ */ Object.create(null);
636
+ for (const block of blocks) {
637
+ const category = block.category ?? defaults.category;
638
+ out[block.type] = {
639
+ label: block.label ?? block.type,
640
+ ...category ? { category } : {},
641
+ ...block.icon ? { icon: block.icon } : {},
642
+ ...block.layoutRegions ? { layoutRegions: block.layoutRegions } : {},
643
+ ...block.description ? { description: block.description } : {}
644
+ };
645
+ }
646
+ return out;
647
+ }
648
+ function layoutRegionsToBridge(regions) {
649
+ return regions.map(
650
+ (region) => region.settings ? { ...region, settings: propsToSchema(region.settings) } : { ...region }
651
+ );
652
+ }
653
+ function registryToManifestBlocks(schemas, blockMeta) {
654
+ return Object.entries(schemas).sort(([a], [b]) => a.localeCompare(b)).map(([type, schema]) => {
655
+ const meta = blockMeta?.[type];
656
+ return {
657
+ type,
658
+ label: meta?.label || type,
659
+ ...meta?.category ? { category: meta.category } : {},
660
+ ...meta?.icon ? { icon: meta.icon } : {},
661
+ ...meta?.description ? { description: meta.description } : {},
662
+ ...meta?.layoutRegions?.length ? { layoutRegions: meta.layoutRegions } : {},
663
+ schema
664
+ };
665
+ });
666
+ }
667
+ function buildBlockManifest(blocks, options = {}) {
668
+ return {
669
+ blocks: registryToManifestBlocks(
670
+ blocksToSchemas(blocks),
671
+ blocksToMeta(blocks, { category: options.category })
672
+ ),
673
+ regions: options.regions ? layoutRegionsToBridge(options.regions) : null
674
+ };
675
+ }
676
+
621
677
  // src/data/localize-href.ts
622
678
  var PROTOCOL_OR_RELATIVE = /^([a-z][a-z0-9+.-]*:|\/\/)/i;
623
679
  function isExternalHref(href) {
@@ -707,7 +763,7 @@ function splitLocaleFromPath(path, siteLocales) {
707
763
  var CMSSY_LOCALE_HEADER = "x-cmssy-locale";
708
764
 
709
765
  // src/bridge/protocol.ts
710
- var PROTOCOL_VERSION = 2;
766
+ var PROTOCOL_VERSION = 3;
711
767
  var SHORTCUT_ACTIONS = [
712
768
  "undo",
713
769
  "redo",
@@ -765,7 +821,7 @@ function parseEditorMessage(data, origin, expectedOrigin) {
765
821
  protocolVersion: PROTOCOL_VERSION,
766
822
  ...isObject(data.style) ? { style: data.style } : {},
767
823
  ...isObject(data.advanced) ? { advanced: data.advanced } : {},
768
- ...typeof data.layoutPosition === "string" ? { layoutPosition: data.layoutPosition } : {}
824
+ ...typeof data.layoutRegion === "string" ? { layoutRegion: data.layoutRegion } : {}
769
825
  } : null;
770
826
  case "cmssy:parent-ready":
771
827
  return data.protocolVersion === PROTOCOL_VERSION ? { type: "cmssy:parent-ready", protocolVersion: PROTOCOL_VERSION } : null;
@@ -991,4 +1047,4 @@ async function verifyCmssyWebhook(options) {
991
1047
  return parsed;
992
1048
  }
993
1049
 
994
- export { CMSSY_EDIT_HEADER, CMSSY_EDIT_QUERY_PARAM, CMSSY_LOCALE_HEADER, CMSSY_RATE_LIMIT_WINDOW_MS, CMSSY_RETRY_MODES, CMSSY_SECRET_QUERY_PARAM, CmssyRequestError, CmssyWebhookError, DEFAULT_CMSSY_API_URL, DEFAULT_CMSSY_EDITOR_ORIGINS, PROTOCOL_VERSION, SHORTCUT_ACTIONS, applyCmssyCsp, createCmssyClient, defineCmssyConfig, defineCmssyLayout, fields, graphqlRequest, isProtocolCompatible, isVerifiedEditUrl, localizeHref, mediaAlt, mediaUrl, mediaUrls, normalizeOrigin, parseEditorMessage, postToEditor, resolveCmssyLocale, resolveEditorOrigin, verifyCmssyWebhook };
1050
+ export { CMSSY_EDIT_HEADER, CMSSY_EDIT_QUERY_PARAM, CMSSY_LOCALE_HEADER, CMSSY_RATE_LIMIT_WINDOW_MS, CMSSY_RETRY_MODES, CMSSY_SECRET_QUERY_PARAM, CmssyRequestError, CmssyWebhookError, DEFAULT_CMSSY_API_URL, DEFAULT_CMSSY_EDITOR_ORIGINS, PROTOCOL_VERSION, SHORTCUT_ACTIONS, applyCmssyCsp, blocksToMeta, blocksToSchemas, buildBlockManifest, createCmssyClient, defineCmssyConfig, defineCmssyLayout, fields, graphqlRequest, isProtocolCompatible, isVerifiedEditUrl, layoutRegionsToBridge, localizeHref, mediaAlt, mediaUrl, mediaUrls, normalizeOrigin, parseEditorMessage, postToEditor, propsToSchema, registryToManifestBlocks, resolveCmssyLocale, resolveEditorOrigin, verifyCmssyWebhook };
package/dist/internal.cjs CHANGED
@@ -257,7 +257,7 @@ var PUBLIC_PAGE_LAYOUTS_QUERY = `query PublicPageLayouts($workspaceSlug: String!
257
257
  public {
258
258
  page {
259
259
  layouts(workspaceSlug: $workspaceSlug, pageSlug: $pageSlug, previewSecret: $previewSecret) {
260
- position
260
+ region
261
261
  blocks { id type content style advanced order isActive }
262
262
  settings
263
263
  }
@@ -1282,7 +1282,7 @@ var CMSSY_DELIVERY_OPERATIONS = [
1282
1282
  document: PUBLIC_PAGE_META_QUERY
1283
1283
  },
1284
1284
  {
1285
- purpose: "Header, footer and the other layout positions for a page.",
1285
+ purpose: "Header, footer and the other layout regions for a page.",
1286
1286
  document: PUBLIC_PAGE_LAYOUTS_QUERY
1287
1287
  },
1288
1288
  {
@@ -3,8 +3,8 @@ import { CmssyFormDefinition, BuildBlockContextExtra, CmssyBlockContext, CmssyCl
3
3
  export { CmssySiteLocales } from '@cmssy/types';
4
4
  import { G as GraphqlRequestOptions } from './locale-JyBHqpAQ.cjs';
5
5
  export { C as CMSSY_LOCALE_HEADER, a as localeForPath, b as localeForPathname, l as localizeHref, c as resolveSiteLocales, s as splitCmssyLocale, d as splitLocaleFromPath } from './locale-JyBHqpAQ.cjs';
6
- import { Q as QueryScopedOptions } from './csp-CY7ssZsh.cjs';
7
- export { F as cmssyCspHeaders, G as isDevelopment, H as layoutRegionIds, J as resolveInitialTarget, K as toCspOrigin } from './csp-CY7ssZsh.cjs';
6
+ import { Q as QueryScopedOptions } from './csp-BHjoSZ2p.cjs';
7
+ export { F as cmssyCspHeaders, G as isDevelopment, H as layoutRegionIds, J as resolveInitialTarget, K as toCspOrigin } from './csp-BHjoSZ2p.cjs';
8
8
  export { localizedPath } from './internal/locale.cjs';
9
9
 
10
10
  declare const SITE_CONFIG_QUERY = "query PublicSiteConfig($workspaceSlug: String!) {\n public {\n siteConfig(workspaceSlug: $workspaceSlug) {\n id\n workspaceId\n siteName\n defaultLanguage\n enabledLanguages\n enabledFeatures\n notFoundPageId\n previewUrl\n branding {\n brandName\n logoUrl\n logoDarkUrl\n faviconUrl\n ogImageUrl\n }\n }\n }\n}";
@@ -3,8 +3,8 @@ import { CmssyFormDefinition, BuildBlockContextExtra, CmssyBlockContext, CmssyCl
3
3
  export { CmssySiteLocales } from '@cmssy/types';
4
4
  import { G as GraphqlRequestOptions } from './locale-D9KI4bND.js';
5
5
  export { C as CMSSY_LOCALE_HEADER, a as localeForPath, b as localeForPathname, l as localizeHref, c as resolveSiteLocales, s as splitCmssyLocale, d as splitLocaleFromPath } from './locale-D9KI4bND.js';
6
- import { Q as QueryScopedOptions } from './csp-DLCKZAyi.js';
7
- export { F as cmssyCspHeaders, G as isDevelopment, H as layoutRegionIds, J as resolveInitialTarget, K as toCspOrigin } from './csp-DLCKZAyi.js';
6
+ import { Q as QueryScopedOptions } from './csp-COFMUmsq.js';
7
+ export { F as cmssyCspHeaders, G as isDevelopment, H as layoutRegionIds, J as resolveInitialTarget, K as toCspOrigin } from './csp-COFMUmsq.js';
8
8
  export { localizedPath } from './internal/locale.js';
9
9
 
10
10
  declare const SITE_CONFIG_QUERY = "query PublicSiteConfig($workspaceSlug: String!) {\n public {\n siteConfig(workspaceSlug: $workspaceSlug) {\n id\n workspaceId\n siteName\n defaultLanguage\n enabledLanguages\n enabledFeatures\n notFoundPageId\n previewUrl\n branding {\n brandName\n logoUrl\n logoDarkUrl\n faviconUrl\n ogImageUrl\n }\n }\n }\n}";
package/dist/internal.js CHANGED
@@ -255,7 +255,7 @@ var PUBLIC_PAGE_LAYOUTS_QUERY = `query PublicPageLayouts($workspaceSlug: String!
255
255
  public {
256
256
  page {
257
257
  layouts(workspaceSlug: $workspaceSlug, pageSlug: $pageSlug, previewSecret: $previewSecret) {
258
- position
258
+ region
259
259
  blocks { id type content style advanced order isActive }
260
260
  settings
261
261
  }
@@ -1280,7 +1280,7 @@ var CMSSY_DELIVERY_OPERATIONS = [
1280
1280
  document: PUBLIC_PAGE_META_QUERY
1281
1281
  },
1282
1282
  {
1283
- purpose: "Header, footer and the other layout positions for a page.",
1283
+ purpose: "Header, footer and the other layout regions for a page.",
1284
1284
  document: PUBLIC_PAGE_LAYOUTS_QUERY
1285
1285
  },
1286
1286
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cmssy/core",
3
- "version": "14.1.0",
3
+ "version": "15.0.0",
4
4
  "description": "Framework-agnostic cmssy gateway: GraphQL client, block/field system, editor protocol. No React, no Next.",
5
5
  "keywords": [
6
6
  "cmssy",
@@ -87,7 +87,7 @@
87
87
  "vitest": "^2.1.0"
88
88
  },
89
89
  "dependencies": {
90
- "@cmssy/types": "0.39.0",
90
+ "@cmssy/types": "0.40.0",
91
91
  "jose": "^6.2.3"
92
92
  },
93
93
  "scripts": {