@actuate-media/cms-core 0.49.0 → 0.50.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.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=bridge.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge.test.d.ts","sourceRoot":"","sources":["../../../src/sections/__tests__/bridge.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,171 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { layoutTreeToSections } from '../bridge.js';
3
+ import { coerceSections } from '../helpers.js';
4
+ import { isKnownSectionType } from '../registry.js';
5
+ /**
6
+ * WS-A5: the page-builder tree (Model B, `data._layout`) → canonical
7
+ * `PageSection[]` (Model A) bridge. These lock in that existing page-builder
8
+ * content is surfaced through the canonical renderer rather than stranded.
9
+ */
10
+ /** Minimal builder-tree factory helpers (mirror page-builder/types shapes). */
11
+ function block(blockType, data) {
12
+ return { id: `b_${blockType}`, type: 'block', settings: { blockType }, data };
13
+ }
14
+ function column(children) {
15
+ return { id: 'col', type: 'column', settings: { width: 12 }, children };
16
+ }
17
+ function row(children) {
18
+ return { id: 'row', type: 'row', settings: {}, children };
19
+ }
20
+ function section(children, settings = {}) {
21
+ return { id: 'sec', type: 'section', settings, children };
22
+ }
23
+ function page(children) {
24
+ return { id: 'page', type: 'page', children };
25
+ }
26
+ describe('layoutTreeToSections', () => {
27
+ it('maps a hero block to a canonical hero section', () => {
28
+ const tree = page([
29
+ section([
30
+ row([
31
+ column([
32
+ block('hero', {
33
+ title: 'Big headline',
34
+ subtitle: 'Supporting copy',
35
+ ctaText: 'Start',
36
+ ctaLink: '/start',
37
+ }),
38
+ ]),
39
+ ]),
40
+ ]),
41
+ ]);
42
+ const sections = layoutTreeToSections(tree);
43
+ expect(sections).toHaveLength(1);
44
+ expect(sections[0].sectionType).toBe('hero');
45
+ expect(sections[0].content).toMatchObject({
46
+ heading: 'Big headline',
47
+ body: 'Supporting copy',
48
+ primaryButtonLabel: 'Start',
49
+ primaryButtonUrl: '/start',
50
+ });
51
+ });
52
+ it('flattens nested layout into ordered sections (document order preserved)', () => {
53
+ const tree = page([
54
+ section([row([column([block('hero', { title: 'A' })])])]),
55
+ section([
56
+ row([
57
+ column([block('text', { heading: 'B', body: 'b' })]),
58
+ column([block('cta', { heading: 'C', buttonText: 'Go', buttonLink: '/c' })]),
59
+ ]),
60
+ ]),
61
+ ]);
62
+ const sections = layoutTreeToSections(tree);
63
+ expect(sections.map((s) => s.sectionType)).toEqual(['hero', 'text', 'cta']);
64
+ });
65
+ it('degrades unknown/complex block types to a text section that surfaces content', () => {
66
+ const tree = page([
67
+ section([
68
+ row([
69
+ column([
70
+ block('cards', {
71
+ items: [
72
+ { title: 'Card one', description: 'first' },
73
+ { title: 'Card two', description: 'second' },
74
+ ],
75
+ }),
76
+ ]),
77
+ ]),
78
+ ]),
79
+ ]);
80
+ const sections = layoutTreeToSections(tree);
81
+ expect(sections).toHaveLength(1);
82
+ expect(sections[0].sectionType).toBe('text');
83
+ const body = String(sections[0].content.body);
84
+ expect(body).toContain('Card one');
85
+ expect(body).toContain('first');
86
+ expect(body).toContain('Card two');
87
+ });
88
+ it('maps image and gallery blocks to their closest canonical types', () => {
89
+ const tree = page([
90
+ section([
91
+ row([
92
+ column([
93
+ block('image', { src: { url: 'https://x/i.png' }, alt: 'pic', caption: 'cap' }),
94
+ block('gallery', {
95
+ images: [
96
+ { src: 'https://x/1.png', alt: 'one', caption: 'c1' },
97
+ { src: { url: 'https://x/2.png' }, alt: 'two' },
98
+ ],
99
+ }),
100
+ ]),
101
+ ]),
102
+ ]),
103
+ ]);
104
+ const sections = layoutTreeToSections(tree);
105
+ expect(sections.map((s) => s.sectionType)).toEqual(['feature', 'gallery']);
106
+ expect(sections[0].content).toMatchObject({
107
+ imageUrl: 'https://x/i.png',
108
+ imageAlt: 'pic',
109
+ body: 'cap',
110
+ });
111
+ expect(sections[1].content.images).toEqual([
112
+ { url: 'https://x/1.png', alt: 'one', caption: 'c1' },
113
+ { url: 'https://x/2.png', alt: 'two' },
114
+ ]);
115
+ });
116
+ it('propagates the enclosing section anchor + hidden visibility to derived sections', () => {
117
+ const tree = page([
118
+ section([row([column([block('text', { heading: 'H' })])])], {
119
+ htmlId: 'about',
120
+ visibility: 'hidden',
121
+ }),
122
+ ]);
123
+ const [s] = layoutTreeToSections(tree);
124
+ expect(s.settings.anchorId).toBe('about');
125
+ expect(s.visible).toBe(false);
126
+ });
127
+ it('skips savedSectionRef nodes (cannot resolve without a DB lookup)', () => {
128
+ const tree = page([
129
+ { id: 'ref', type: 'savedSectionRef', settings: { refId: 'saved_1' } },
130
+ section([row([column([block('text', { heading: 'Kept' })])])]),
131
+ ]);
132
+ const sections = layoutTreeToSections(tree);
133
+ expect(sections).toHaveLength(1);
134
+ expect(sections[0].content.heading).toBe('Kept');
135
+ });
136
+ it('every produced section is a known, renderable type (survives coerceSections)', () => {
137
+ const tree = page([
138
+ section([
139
+ row([
140
+ column([
141
+ block('hero', { title: 'A' }),
142
+ block('faq', { items: [{ question: 'q', answer: 'a' }] }),
143
+ block('video', { url: 'https://x/v.mp4' }),
144
+ ]),
145
+ ]),
146
+ ]),
147
+ ]);
148
+ const sections = layoutTreeToSections(tree);
149
+ for (const s of sections)
150
+ expect(isKnownSectionType(s.sectionType)).toBe(true);
151
+ // coerceSections drops unknown types — the bridge output must survive it intact.
152
+ expect(coerceSections(sections)).toHaveLength(sections.length);
153
+ });
154
+ it('never throws on malformed/partial input', () => {
155
+ expect(layoutTreeToSections(null)).toEqual([]);
156
+ expect(layoutTreeToSections(undefined)).toEqual([]);
157
+ expect(layoutTreeToSections('not a tree')).toEqual([]);
158
+ expect(layoutTreeToSections({})).toEqual([]);
159
+ expect(layoutTreeToSections([])).toEqual([]);
160
+ expect(layoutTreeToSections({ type: 'page' })).toEqual([]);
161
+ expect(layoutTreeToSections({ type: 'page', children: [null, 42, {}] })).toEqual([]);
162
+ });
163
+ it('tolerates a block placed directly under the page node', () => {
164
+ const tree = page([block('text', { heading: 'Loose', body: 'block' })]);
165
+ const sections = layoutTreeToSections(tree);
166
+ expect(sections).toHaveLength(1);
167
+ expect(sections[0].sectionType).toBe('text');
168
+ expect(sections[0].visible).toBe(true);
169
+ });
170
+ });
171
+ //# sourceMappingURL=bridge.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge.test.js","sourceRoot":"","sources":["../../../src/sections/__tests__/bridge.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { PageSection } from './types.js';
2
+ /**
3
+ * Convert a page-builder `_layout` tree (or any partial/untrusted shape) into a
4
+ * best-effort canonical `PageSection[]`. Returns `[]` for anything it can't
5
+ * read. Never throws.
6
+ */
7
+ export declare function layoutTreeToSections(layout: unknown): PageSection[];
8
+ //# sourceMappingURL=bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../src/sections/bridge.ts"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EAAE,WAAW,EAAkC,MAAM,YAAY,CAAA;AAwK7E;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG,WAAW,EAAE,CAsBnE"}
@@ -0,0 +1,211 @@
1
+ /**
2
+ * Bridge: page-builder tree (Model B, `data._layout`) → canonical flat
3
+ * sections (Model A, `data.sections`).
4
+ *
5
+ * ADR 0001 makes the flat `PageSection[]` array the single public content
6
+ * contract and reframes the recursive page-builder `BlockNode` tree as an
7
+ * optional, admin-only authoring layer. Documents that were authored only in
8
+ * the tree must still render through the canonical `<Sections>` renderer, so
9
+ * this module performs a best-effort, **never-throwing** conversion. No
10
+ * page-builder content is stranded (roadmap WS-A5).
11
+ *
12
+ * Fidelity notes:
13
+ * - The tree's nesting (page → section → container/row/column → block) is
14
+ * flattened to an ordered list of leaf blocks in document order. Each block
15
+ * becomes one canonical section.
16
+ * - Each block's `settings.blockType` is mapped to the closest canonical
17
+ * section type. Unknown/complex block types degrade to a `text` section
18
+ * that surfaces whatever string content the block carried, so content is
19
+ * shown rather than silently dropped.
20
+ * - The enclosing builder section's `htmlId` (anchor) and hidden visibility
21
+ * are propagated. Free-form CSS settings (arbitrary background colors,
22
+ * pixel paddings) are intentionally NOT mapped — they don't translate to
23
+ * the canonical token-based settings and would produce wrong styling.
24
+ * - `savedSectionRef` nodes reference a separate saved-section document and
25
+ * can't be resolved without a DB lookup; they are skipped here. Callers
26
+ * that need them must expand refs before calling this function.
27
+ *
28
+ * This is intentionally DB-free and pure so it runs at read time (the resolve
29
+ * endpoint), in a one-off migration script, or in tests identically.
30
+ */
31
+ import { generateSectionId } from './helpers.js';
32
+ import { SECTION_TYPES } from './registry.js';
33
+ // ─── Defensive readers (the tree arrives as untrusted JSON) ──────────
34
+ function isObj(v) {
35
+ return !!v && typeof v === 'object' && !Array.isArray(v);
36
+ }
37
+ function str(v) {
38
+ return typeof v === 'string' ? v : '';
39
+ }
40
+ /** Extract a URL from a media value that may be a string, `{ url }`, or an id. */
41
+ function mediaUrl(v) {
42
+ if (typeof v === 'string')
43
+ return v;
44
+ if (isObj(v) && typeof v.url === 'string')
45
+ return v.url;
46
+ return '';
47
+ }
48
+ /** Drop empty-string / null / undefined values so defaults aren't clobbered with blanks. */
49
+ function compact(obj) {
50
+ const out = {};
51
+ for (const [k, val] of Object.entries(obj)) {
52
+ if (val === '' || val === null || val === undefined)
53
+ continue;
54
+ out[k] = val;
55
+ }
56
+ return out;
57
+ }
58
+ /**
59
+ * Generic fallback: surface any readable text the block carried as a `text`
60
+ * section so content is never lost when a block type has no clean canonical
61
+ * equivalent (cards, faq, video, form, code, custom blocks…).
62
+ */
63
+ function fallbackTextSection(blockType, data) {
64
+ const parts = [];
65
+ const visit = (value) => {
66
+ if (typeof value === 'string') {
67
+ const t = value.trim();
68
+ if (t)
69
+ parts.push(t);
70
+ }
71
+ else if (Array.isArray(value)) {
72
+ for (const item of value)
73
+ visit(item);
74
+ }
75
+ else if (isObj(value)) {
76
+ for (const v of Object.values(value))
77
+ visit(v);
78
+ }
79
+ };
80
+ visit(data);
81
+ return {
82
+ type: 'text',
83
+ name: SECTION_TYPES.text.name,
84
+ content: compact({ heading: '', body: parts.join('\n\n') }),
85
+ };
86
+ }
87
+ const BLOCK_MAPPERS = {
88
+ hero: (d) => ({
89
+ type: 'hero',
90
+ content: compact({
91
+ heading: str(d.title),
92
+ body: str(d.subtitle),
93
+ primaryButtonLabel: str(d.ctaText),
94
+ primaryButtonUrl: str(d.ctaLink),
95
+ }),
96
+ }),
97
+ text: (d) => ({
98
+ type: 'text',
99
+ content: compact({ heading: str(d.heading), body: str(d.body) }),
100
+ }),
101
+ cta: (d) => ({
102
+ type: 'cta',
103
+ content: compact({
104
+ heading: str(d.heading),
105
+ body: str(d.body),
106
+ buttonLabel: str(d.buttonText),
107
+ buttonUrl: str(d.buttonLink),
108
+ }),
109
+ }),
110
+ image: (d) => ({
111
+ type: 'feature',
112
+ name: 'Image',
113
+ content: compact({
114
+ imageUrl: mediaUrl(d.src),
115
+ imageAlt: str(d.alt),
116
+ body: str(d.caption),
117
+ }),
118
+ }),
119
+ gallery: (d) => ({
120
+ type: 'gallery',
121
+ content: compact({
122
+ images: Array.isArray(d.images)
123
+ ? d.images
124
+ .filter(isObj)
125
+ .map((img) => compact({ url: mediaUrl(img.src), alt: str(img.alt), caption: str(img.caption) }))
126
+ : [],
127
+ }),
128
+ }),
129
+ };
130
+ function mapBlock(blockType, data) {
131
+ const mapper = BLOCK_MAPPERS[blockType];
132
+ return mapper ? mapper(data) : fallbackTextSection(blockType, data);
133
+ }
134
+ /** Read the anchor + visibility a builder `section` node imposes on its blocks. */
135
+ function sectionContext(node) {
136
+ const settings = isObj(node.settings) ? node.settings : {};
137
+ const anchorId = str(settings.htmlId) || undefined;
138
+ const visible = settings.visibility !== 'hidden';
139
+ return { anchorId, visible };
140
+ }
141
+ function childrenOf(node) {
142
+ if (isObj(node) && Array.isArray(node.children))
143
+ return node.children;
144
+ return [];
145
+ }
146
+ function makeSection(mapped, ctx) {
147
+ const def = SECTION_TYPES[mapped.type];
148
+ return {
149
+ id: generateSectionId(),
150
+ sectionType: mapped.type,
151
+ name: mapped.name && mapped.name.trim() ? mapped.name : def.name,
152
+ visible: ctx.visible,
153
+ content: mapped.content,
154
+ settings: {
155
+ ...structuredClone(def.defaultSettings),
156
+ ...(ctx.anchorId ? { anchorId: ctx.anchorId } : {}),
157
+ },
158
+ };
159
+ }
160
+ /** Depth-first collect every leaf `block` node under `node`, in document order. */
161
+ function collectBlocks(node, out, ctx) {
162
+ for (const child of childrenOf(node)) {
163
+ if (!isObj(child))
164
+ continue;
165
+ if (child.type === 'block') {
166
+ const settings = isObj(child.settings) ? child.settings : {};
167
+ const blockType = str(settings.blockType);
168
+ const data = isObj(child.data) ? child.data : {};
169
+ out.push(makeSection(mapBlock(blockType, data), ctx));
170
+ }
171
+ else if (child.type === 'savedSectionRef') {
172
+ // Can't resolve a saved-section reference without a DB lookup — skip.
173
+ continue;
174
+ }
175
+ else {
176
+ collectBlocks(child, out, ctx);
177
+ }
178
+ }
179
+ }
180
+ /**
181
+ * Convert a page-builder `_layout` tree (or any partial/untrusted shape) into a
182
+ * best-effort canonical `PageSection[]`. Returns `[]` for anything it can't
183
+ * read. Never throws.
184
+ */
185
+ export function layoutTreeToSections(layout) {
186
+ if (!isObj(layout))
187
+ return [];
188
+ const sections = [];
189
+ for (const node of childrenOf(layout)) {
190
+ if (!isObj(node))
191
+ continue;
192
+ if (node.type === 'section') {
193
+ collectBlocks(node, sections, sectionContext(node));
194
+ }
195
+ else if (node.type === 'block') {
196
+ // Tolerate trees where a block sits directly under the page.
197
+ const settings = isObj(node.settings) ? node.settings : {};
198
+ sections.push(makeSection(mapBlock(str(settings.blockType), isObj(node.data) ? node.data : {}), {
199
+ visible: true,
200
+ }));
201
+ }
202
+ else if (node.type === 'savedSectionRef') {
203
+ continue;
204
+ }
205
+ else {
206
+ collectBlocks(node, sections, { visible: true });
207
+ }
208
+ }
209
+ return sections;
210
+ }
211
+ //# sourceMappingURL=bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge.js","sourceRoot":"","sources":["../../src/sections/bridge.ts"],"names":[],"mappings":"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"}
@@ -9,5 +9,6 @@
9
9
  export { SECTION_TYPES, SECTION_TYPE_LIST, getSectionType, getSectionTypesForScope, sectionTypeLabel, isKnownSectionType, } from './registry.js';
10
10
  export { generateSectionId, createSection, buildSection, addSection, removeSection, duplicateSection, toggleSectionVisibility, setSectionVisibility, moveSection, reorderSections, updateSectionContent, updateSectionSettings, updateSectionMeta, coerceSections, defaultPostHeader, coercePostHeader, computeReadingTime, createPostTemplate, coercePostTemplate, } from './helpers.js';
11
11
  export { validateSectionContent } from './validate.js';
12
+ export { layoutTreeToSections } from './bridge.js';
12
13
  export type { SectionTypeId, SectionScope, SectionFieldType, SectionFieldDef, SectionSettings, SectionTypeDef, PageSection, PostHeaderConfig, PostTemplate, SectionValidationIssue, SectionValidationResult, } from './types.js';
13
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sections/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,uBAAuB,EACvB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,eAAe,CAAA;AAEtB,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,uBAAuB,EACvB,oBAAoB,EACpB,WAAW,EACX,eAAe,EACf,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,cAAc,CAAA;AAErB,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AAEtD,YAAY,EACV,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,YAAY,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sections/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,uBAAuB,EACvB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,eAAe,CAAA;AAEtB,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,uBAAuB,EACvB,oBAAoB,EACpB,WAAW,EACX,eAAe,EACf,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,cAAc,CAAA;AAErB,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AAEtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAElD,YAAY,EACV,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,YAAY,CAAA"}
@@ -9,4 +9,5 @@
9
9
  export { SECTION_TYPES, SECTION_TYPE_LIST, getSectionType, getSectionTypesForScope, sectionTypeLabel, isKnownSectionType, } from './registry.js';
10
10
  export { generateSectionId, createSection, buildSection, addSection, removeSection, duplicateSection, toggleSectionVisibility, setSectionVisibility, moveSection, reorderSections, updateSectionContent, updateSectionSettings, updateSectionMeta, coerceSections, defaultPostHeader, coercePostHeader, computeReadingTime, createPostTemplate, coercePostTemplate, } from './helpers.js';
11
11
  export { validateSectionContent } from './validate.js';
12
+ export { layoutTreeToSections } from './bridge.js';
12
13
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sections/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,uBAAuB,EACvB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,eAAe,CAAA;AAEtB,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,uBAAuB,EACvB,oBAAoB,EACpB,WAAW,EACX,eAAe,EACf,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,cAAc,CAAA;AAErB,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sections/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,uBAAuB,EACvB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,eAAe,CAAA;AAEtB,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,uBAAuB,EACvB,oBAAoB,EACpB,WAAW,EACX,eAAe,EACf,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,cAAc,CAAA;AAErB,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AAEtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@actuate-media/cms-core",
3
- "version": "0.49.0",
3
+ "version": "0.50.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/actuate-media/actuatecms.git",