@actuate-media/cms-core 0.7.0 → 0.10.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/dist/__tests__/actions/document-crud.test.js +13 -1
- package/dist/__tests__/actions/document-crud.test.js.map +1 -1
- package/dist/__tests__/next.test.d.ts +2 -0
- package/dist/__tests__/next.test.d.ts.map +1 -0
- package/dist/__tests__/next.test.js +67 -0
- package/dist/__tests__/next.test.js.map +1 -0
- package/dist/__tests__/site.test.d.ts +2 -0
- package/dist/__tests__/site.test.d.ts.map +1 -0
- package/dist/__tests__/site.test.js +68 -0
- package/dist/__tests__/site.test.js.map +1 -0
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +6 -1
- package/dist/actions.js.map +1 -1
- package/dist/api/handlers.d.ts.map +1 -1
- package/dist/api/handlers.js +530 -0
- package/dist/api/handlers.js.map +1 -1
- package/dist/config/types.d.ts +3 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +0 -1
- package/dist/config/types.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/next.d.ts +3 -1
- package/dist/next.d.ts.map +1 -1
- package/dist/next.js +2 -1
- package/dist/next.js.map +1 -1
- package/dist/page-builder/__tests__/a11y-fix.test.d.ts +2 -0
- package/dist/page-builder/__tests__/a11y-fix.test.d.ts.map +1 -0
- package/dist/page-builder/__tests__/a11y-fix.test.js +246 -0
- package/dist/page-builder/__tests__/a11y-fix.test.js.map +1 -0
- package/dist/page-builder/__tests__/blocks.test.d.ts +2 -0
- package/dist/page-builder/__tests__/blocks.test.d.ts.map +1 -0
- package/dist/page-builder/__tests__/blocks.test.js +87 -0
- package/dist/page-builder/__tests__/blocks.test.js.map +1 -0
- package/dist/page-builder/__tests__/design-scorer.test.d.ts +2 -0
- package/dist/page-builder/__tests__/design-scorer.test.d.ts.map +1 -0
- package/dist/page-builder/__tests__/design-scorer.test.js +268 -0
- package/dist/page-builder/__tests__/design-scorer.test.js.map +1 -0
- package/dist/page-builder/__tests__/schema.test.d.ts +2 -0
- package/dist/page-builder/__tests__/schema.test.d.ts.map +1 -0
- package/dist/page-builder/__tests__/schema.test.js +191 -0
- package/dist/page-builder/__tests__/schema.test.js.map +1 -0
- package/dist/page-builder/__tests__/seo-analyzer.test.d.ts +2 -0
- package/dist/page-builder/__tests__/seo-analyzer.test.d.ts.map +1 -0
- package/dist/page-builder/__tests__/seo-analyzer.test.js +332 -0
- package/dist/page-builder/__tests__/seo-analyzer.test.js.map +1 -0
- package/dist/page-builder/__tests__/tree.test.d.ts +2 -0
- package/dist/page-builder/__tests__/tree.test.d.ts.map +1 -0
- package/dist/page-builder/__tests__/tree.test.js +257 -0
- package/dist/page-builder/__tests__/tree.test.js.map +1 -0
- package/dist/page-builder/a11y-fix.d.ts +20 -0
- package/dist/page-builder/a11y-fix.d.ts.map +1 -0
- package/dist/page-builder/a11y-fix.js +182 -0
- package/dist/page-builder/a11y-fix.js.map +1 -0
- package/dist/page-builder/ai-pipeline.d.ts +43 -0
- package/dist/page-builder/ai-pipeline.d.ts.map +1 -0
- package/dist/page-builder/ai-pipeline.js +167 -0
- package/dist/page-builder/ai-pipeline.js.map +1 -0
- package/dist/page-builder/blocks.d.ts +10 -0
- package/dist/page-builder/blocks.d.ts.map +1 -0
- package/dist/page-builder/blocks.js +252 -0
- package/dist/page-builder/blocks.js.map +1 -0
- package/dist/page-builder/design-scorer.d.ts +27 -0
- package/dist/page-builder/design-scorer.d.ts.map +1 -0
- package/dist/page-builder/design-scorer.js +404 -0
- package/dist/page-builder/design-scorer.js.map +1 -0
- package/dist/page-builder/index.d.ts +18 -0
- package/dist/page-builder/index.d.ts.map +1 -0
- package/dist/page-builder/index.js +20 -0
- package/dist/page-builder/index.js.map +1 -0
- package/dist/page-builder/schema.d.ts +107 -0
- package/dist/page-builder/schema.d.ts.map +1 -0
- package/dist/page-builder/schema.js +90 -0
- package/dist/page-builder/schema.js.map +1 -0
- package/dist/page-builder/seo-analyzer.d.ts +61 -0
- package/dist/page-builder/seo-analyzer.d.ts.map +1 -0
- package/dist/page-builder/seo-analyzer.js +582 -0
- package/dist/page-builder/seo-analyzer.js.map +1 -0
- package/dist/page-builder/templates.d.ts +9 -0
- package/dist/page-builder/templates.d.ts.map +1 -0
- package/dist/page-builder/templates.js +401 -0
- package/dist/page-builder/templates.js.map +1 -0
- package/dist/page-builder/tree.d.ts +17 -0
- package/dist/page-builder/tree.d.ts.map +1 -0
- package/dist/page-builder/tree.js +160 -0
- package/dist/page-builder/tree.js.map +1 -0
- package/dist/page-builder/types.d.ts +112 -0
- package/dist/page-builder/types.d.ts.map +1 -0
- package/dist/page-builder/types.js +4 -0
- package/dist/page-builder/types.js.map +1 -0
- package/dist/page-builder/validate.d.ts +6 -0
- package/dist/page-builder/validate.d.ts.map +1 -0
- package/dist/page-builder/validate.js +87 -0
- package/dist/page-builder/validate.js.map +1 -0
- package/dist/site.d.ts +51 -0
- package/dist/site.d.ts.map +1 -0
- package/dist/site.js +101 -0
- package/dist/site.js.map +1 -0
- package/package.json +14 -4
- package/prisma/migrations/0006_page_builder/migration.sql +38 -0
- package/prisma/schema.prisma +31 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import type { FieldDefinition } from '../config/types.js';
|
|
2
|
+
export interface SectionSettings {
|
|
3
|
+
background?: string;
|
|
4
|
+
backgroundImage?: string;
|
|
5
|
+
backgroundGradient?: string;
|
|
6
|
+
paddingTop?: string;
|
|
7
|
+
paddingBottom?: string;
|
|
8
|
+
marginTop?: string;
|
|
9
|
+
marginBottom?: string;
|
|
10
|
+
visibility?: 'visible' | 'hidden';
|
|
11
|
+
htmlId?: string;
|
|
12
|
+
htmlClass?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface ContainerSettings {
|
|
15
|
+
maxWidth?: string;
|
|
16
|
+
alignment?: 'left' | 'center' | 'right';
|
|
17
|
+
padding?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface RowSettings {
|
|
20
|
+
gap?: string;
|
|
21
|
+
verticalAlign?: 'top' | 'center' | 'bottom' | 'stretch';
|
|
22
|
+
reverseOnMobile?: boolean;
|
|
23
|
+
wrapOnMobile?: boolean;
|
|
24
|
+
}
|
|
25
|
+
export interface ColumnSettings {
|
|
26
|
+
width: number;
|
|
27
|
+
verticalAlign?: 'top' | 'center' | 'bottom';
|
|
28
|
+
padding?: string;
|
|
29
|
+
background?: string;
|
|
30
|
+
}
|
|
31
|
+
export interface BlockSettings {
|
|
32
|
+
blockType: string;
|
|
33
|
+
variant?: string;
|
|
34
|
+
}
|
|
35
|
+
export interface SavedSectionRefSettings {
|
|
36
|
+
refId: string;
|
|
37
|
+
}
|
|
38
|
+
export interface ResponsiveOverrides {
|
|
39
|
+
mobile?: Record<string, unknown>;
|
|
40
|
+
tablet?: Record<string, unknown>;
|
|
41
|
+
}
|
|
42
|
+
interface BaseNode {
|
|
43
|
+
id: string;
|
|
44
|
+
responsive?: ResponsiveOverrides;
|
|
45
|
+
}
|
|
46
|
+
export interface PageNode extends BaseNode {
|
|
47
|
+
type: 'page';
|
|
48
|
+
children: (SectionNode | SavedSectionRefNode)[];
|
|
49
|
+
}
|
|
50
|
+
export interface SectionNode extends BaseNode {
|
|
51
|
+
type: 'section';
|
|
52
|
+
settings: SectionSettings;
|
|
53
|
+
children: (ContainerNode | RowNode)[];
|
|
54
|
+
}
|
|
55
|
+
export interface ContainerNode extends BaseNode {
|
|
56
|
+
type: 'container';
|
|
57
|
+
settings: ContainerSettings;
|
|
58
|
+
children: RowNode[];
|
|
59
|
+
}
|
|
60
|
+
export interface RowNode extends BaseNode {
|
|
61
|
+
type: 'row';
|
|
62
|
+
settings: RowSettings;
|
|
63
|
+
children: ColumnNode[];
|
|
64
|
+
}
|
|
65
|
+
export interface ColumnNode extends BaseNode {
|
|
66
|
+
type: 'column';
|
|
67
|
+
settings: ColumnSettings;
|
|
68
|
+
children: (BlockNode | ContainerNode)[];
|
|
69
|
+
}
|
|
70
|
+
export interface BlockNode extends BaseNode {
|
|
71
|
+
type: 'block';
|
|
72
|
+
settings: BlockSettings;
|
|
73
|
+
data: Record<string, unknown>;
|
|
74
|
+
}
|
|
75
|
+
export interface SavedSectionRefNode extends BaseNode {
|
|
76
|
+
type: 'savedSectionRef';
|
|
77
|
+
settings: SavedSectionRefSettings;
|
|
78
|
+
}
|
|
79
|
+
export type BuilderNode = PageNode | SectionNode | ContainerNode | RowNode | ColumnNode | BlockNode | SavedSectionRefNode;
|
|
80
|
+
export type NodeType = BuilderNode['type'];
|
|
81
|
+
export interface VariantDefinition {
|
|
82
|
+
name: string;
|
|
83
|
+
label: string;
|
|
84
|
+
description: string;
|
|
85
|
+
thumbnail?: string;
|
|
86
|
+
defaultSettings?: Record<string, unknown>;
|
|
87
|
+
defaultData?: Record<string, unknown>;
|
|
88
|
+
}
|
|
89
|
+
export interface BlockTypeDefinition {
|
|
90
|
+
type: string;
|
|
91
|
+
label: string;
|
|
92
|
+
icon: string;
|
|
93
|
+
description?: string;
|
|
94
|
+
variants: VariantDefinition[];
|
|
95
|
+
fields: Record<string, FieldDefinition>;
|
|
96
|
+
defaultData?: Record<string, unknown>;
|
|
97
|
+
}
|
|
98
|
+
export interface PreviewTheme {
|
|
99
|
+
fontFamily?: string;
|
|
100
|
+
headingFontFamily?: string;
|
|
101
|
+
primaryColor?: string;
|
|
102
|
+
secondaryColor?: string;
|
|
103
|
+
borderRadius?: string;
|
|
104
|
+
}
|
|
105
|
+
export interface PageBuilderConfig {
|
|
106
|
+
blocks?: BlockTypeDefinition[];
|
|
107
|
+
previewTheme?: PreviewTheme;
|
|
108
|
+
}
|
|
109
|
+
export type ParentNode = PageNode | SectionNode | ContainerNode | RowNode | ColumnNode;
|
|
110
|
+
export declare function hasChildren(node: BuilderNode): node is ParentNode;
|
|
111
|
+
export {};
|
|
112
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/page-builder/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/page-builder/types.ts"],"names":[],"mappings":"AAuJA,MAAM,UAAU,WAAW,CAAC,IAAiB;IAC3C,OAAO,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,iBAAiB,CAAA;AACjE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/page-builder/validate.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,EAAE,MAAM,EAAE,CAAA;CACjB;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,oBAAoB,CA8BhE"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { pageNodeSchema } from './schema.js';
|
|
2
|
+
const MAX_DEPTH = 9;
|
|
3
|
+
export function validateTree(tree) {
|
|
4
|
+
const errors = [];
|
|
5
|
+
if (tree === null ||
|
|
6
|
+
tree === undefined ||
|
|
7
|
+
typeof tree !== 'object' ||
|
|
8
|
+
!('type' in tree) ||
|
|
9
|
+
tree.type !== 'page') {
|
|
10
|
+
errors.push('Root node must be of type "page"');
|
|
11
|
+
return { valid: false, errors };
|
|
12
|
+
}
|
|
13
|
+
const result = pageNodeSchema.safeParse(tree);
|
|
14
|
+
if (!result.success) {
|
|
15
|
+
for (const issue of result.error.issues) {
|
|
16
|
+
const path = issue.path.length > 0 ? ` at ${issue.path.join('.')}` : '';
|
|
17
|
+
errors.push(`${issue.message}${path}`);
|
|
18
|
+
}
|
|
19
|
+
return { valid: false, errors };
|
|
20
|
+
}
|
|
21
|
+
const pageNode = tree;
|
|
22
|
+
checkColumnWidths(pageNode, errors);
|
|
23
|
+
checkDepth(pageNode, 1, errors);
|
|
24
|
+
checkBlockNoChildren(pageNode, errors);
|
|
25
|
+
checkNestingRules(pageNode, errors);
|
|
26
|
+
return { valid: errors.length === 0, errors };
|
|
27
|
+
}
|
|
28
|
+
function checkColumnWidths(node, errors) {
|
|
29
|
+
if (!node || typeof node !== 'object')
|
|
30
|
+
return;
|
|
31
|
+
const n = node;
|
|
32
|
+
if (n.type === 'row' && Array.isArray(n.children)) {
|
|
33
|
+
const columns = n.children;
|
|
34
|
+
const sum = columns.reduce((acc, col) => acc + (col.settings?.width ?? 0), 0);
|
|
35
|
+
if (sum !== 12) {
|
|
36
|
+
errors.push(`Row "${n.id}" columns sum to ${sum}, expected 12`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if ('children' in n && Array.isArray(n.children)) {
|
|
40
|
+
for (const child of n.children) {
|
|
41
|
+
checkColumnWidths(child, errors);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function checkDepth(node, depth, errors) {
|
|
46
|
+
if (!node || typeof node !== 'object')
|
|
47
|
+
return;
|
|
48
|
+
const n = node;
|
|
49
|
+
if (depth > MAX_DEPTH) {
|
|
50
|
+
errors.push(`Maximum nesting depth of ${MAX_DEPTH} exceeded at node "${n.id}"`);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
if ('children' in n && Array.isArray(n.children)) {
|
|
54
|
+
for (const child of n.children) {
|
|
55
|
+
checkDepth(child, depth + 1, errors);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function checkBlockNoChildren(node, errors) {
|
|
60
|
+
if (!node || typeof node !== 'object')
|
|
61
|
+
return;
|
|
62
|
+
const n = node;
|
|
63
|
+
if (n.type === 'block' &&
|
|
64
|
+
'children' in n &&
|
|
65
|
+
Array.isArray(n.children) &&
|
|
66
|
+
n.children.length > 0) {
|
|
67
|
+
errors.push(`Block node "${n.id}" must not have children`);
|
|
68
|
+
}
|
|
69
|
+
if ('children' in n && Array.isArray(n.children)) {
|
|
70
|
+
for (const child of n.children) {
|
|
71
|
+
checkBlockNoChildren(child, errors);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function checkNestingRules(node, errors) {
|
|
76
|
+
if (!node || typeof node !== 'object')
|
|
77
|
+
return;
|
|
78
|
+
const n = node;
|
|
79
|
+
if (n.type === 'page' && Array.isArray(n.children)) {
|
|
80
|
+
for (const child of n.children) {
|
|
81
|
+
if (child.type !== 'section' && child.type !== 'savedSectionRef') {
|
|
82
|
+
errors.push(`Page node can only contain section or savedSectionRef children, found "${child.type}" ("${child.id}")`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/page-builder/validate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE5C,MAAM,SAAS,GAAG,CAAC,CAAA;AAOnB,MAAM,UAAU,YAAY,CAAC,IAAa;IACxC,MAAM,MAAM,GAAa,EAAE,CAAA;IAE3B,IACE,IAAI,KAAK,IAAI;QACb,IAAI,KAAK,SAAS;QAClB,OAAO,IAAI,KAAK,QAAQ;QACxB,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC;QAChB,IAA0B,CAAC,IAAI,KAAK,MAAM,EAC3C,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAA;QAC/C,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAA;IACjC,CAAC;IAED,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;IAC7C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACxC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;YACvE,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC,CAAA;QACxC,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAA;IACjC,CAAC;IAED,MAAM,QAAQ,GAAG,IAAgB,CAAA;IACjC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;IACnC,UAAU,CAAC,QAAQ,EAAE,CAAC,EAAE,MAAM,CAAC,CAAA;IAC/B,oBAAoB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;IACtC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;IAEnC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;AAC/C,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAa,EAAE,MAAgB;IACxD,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAM;IAC7C,MAAM,CAAC,GAAG,IAA+B,CAAA;IAEzC,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClD,MAAM,OAAO,GAAG,CAAC,CAAC,QAAoD,CAAA;QACtE,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QAC7E,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CACT,QAAS,CAAqB,CAAC,EAAE,oBAAoB,GAAG,eAAe,CACxE,CAAA;QACH,CAAC;IACH,CAAC;IAED,IAAI,UAAU,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjD,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC,QAAqB,EAAE,CAAC;YAC5C,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QAClC,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,IAAa,EAAE,KAAa,EAAE,MAAgB;IAChE,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAM;IAC7C,MAAM,CAAC,GAAG,IAA+B,CAAA;IAEzC,IAAI,KAAK,GAAG,SAAS,EAAE,CAAC;QACtB,MAAM,CAAC,IAAI,CACT,4BAA4B,SAAS,sBAAuB,CAAqB,CAAC,EAAE,GAAG,CACxF,CAAA;QACD,OAAM;IACR,CAAC;IAED,IAAI,UAAU,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjD,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC,QAAqB,EAAE,CAAC;YAC5C,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,MAAM,CAAC,CAAA;QACtC,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAa,EAAE,MAAgB;IAC3D,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAM;IAC7C,MAAM,CAAC,GAAG,IAA+B,CAAA;IAEzC,IACE,CAAC,CAAC,IAAI,KAAK,OAAO;QAClB,UAAU,IAAI,CAAC;QACf,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;QACxB,CAAC,CAAC,QAAsB,CAAC,MAAM,GAAG,CAAC,EACpC,CAAC;QACD,MAAM,CAAC,IAAI,CACT,eAAgB,CAAqB,CAAC,EAAE,0BAA0B,CACnE,CAAA;IACH,CAAC;IAED,IAAI,UAAU,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjD,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC,QAAqB,EAAE,CAAC;YAC5C,oBAAoB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QACrC,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAa,EAAE,MAAgB;IACxD,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAM;IAC7C,MAAM,CAAC,GAAG,IAA+B,CAAA;IAEzC,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnD,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC,QAAiD,EAAE,CAAC;YACxE,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;gBACjE,MAAM,CAAC,IAAI,CACT,0EAA0E,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,EAAE,IAAI,CACxG,CAAA;YACH,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
|
package/dist/site.d.ts
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
export interface SiteClientOptions {
|
|
2
|
+
baseUrl?: string;
|
|
3
|
+
apiPath?: string;
|
|
4
|
+
apiKey?: string;
|
|
5
|
+
fetch?: typeof fetch;
|
|
6
|
+
}
|
|
7
|
+
export interface LayoutVariant<T = Record<string, unknown>> {
|
|
8
|
+
id: string;
|
|
9
|
+
collection: string;
|
|
10
|
+
data: T;
|
|
11
|
+
}
|
|
12
|
+
export interface ResolveResult<T = Record<string, unknown>> {
|
|
13
|
+
data: {
|
|
14
|
+
id: string;
|
|
15
|
+
collection: string;
|
|
16
|
+
data: T;
|
|
17
|
+
status?: string;
|
|
18
|
+
publishedAt?: string | null;
|
|
19
|
+
structuredData?: unknown;
|
|
20
|
+
};
|
|
21
|
+
layout?: Record<string, LayoutVariant>;
|
|
22
|
+
}
|
|
23
|
+
export interface ResolvedMedia {
|
|
24
|
+
id?: string;
|
|
25
|
+
url: string;
|
|
26
|
+
alt: string | null;
|
|
27
|
+
title: string | null;
|
|
28
|
+
width: number | null;
|
|
29
|
+
height: number | null;
|
|
30
|
+
storageKey: string | null;
|
|
31
|
+
}
|
|
32
|
+
export type MediaInput = string | {
|
|
33
|
+
id?: unknown;
|
|
34
|
+
url?: unknown;
|
|
35
|
+
alt?: unknown;
|
|
36
|
+
title?: unknown;
|
|
37
|
+
width?: unknown;
|
|
38
|
+
height?: unknown;
|
|
39
|
+
storageKey?: unknown;
|
|
40
|
+
} | null | undefined;
|
|
41
|
+
export interface ResolveMediaOptions {
|
|
42
|
+
resolveById?: (id: string) => Promise<MediaInput>;
|
|
43
|
+
}
|
|
44
|
+
export interface SiteClient {
|
|
45
|
+
getGlobal<T = Record<string, unknown>>(slug: string): Promise<T | null>;
|
|
46
|
+
resolveDocument<T = Record<string, unknown>>(path: string): Promise<ResolveResult<T> | null>;
|
|
47
|
+
}
|
|
48
|
+
export declare function createSiteClient(options?: SiteClientOptions): SiteClient;
|
|
49
|
+
export declare function normalizeMedia(value: MediaInput): ResolvedMedia | null;
|
|
50
|
+
export declare function resolveMedia(value: MediaInput, options?: ResolveMediaOptions): Promise<ResolvedMedia | null>;
|
|
51
|
+
//# sourceMappingURL=site.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"site.d.ts","sourceRoot":"","sources":["../src/site.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAED,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACxD,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,CAAC,CAAC;CACT;AAED,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACxD,IAAI,EAAE;QACJ,EAAE,EAAE,MAAM,CAAC;QACX,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,EAAE,CAAC,CAAC;QACR,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;KAC1B,CAAC;IACF,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,MAAM,UAAU,GAClB,MAAM,GACN;IACE,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,GACD,IAAI,GACJ,SAAS,CAAC;AAEd,MAAM,WAAW,mBAAmB;IAClC,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;CACnD;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACxE,eAAe,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;CAC9F;AA+BD,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,iBAAsB,GAAG,UAAU,CA0B5E;AAkBD,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,aAAa,GAAG,IAAI,CA4BtE;AAED,wBAAsB,YAAY,CAChC,KAAK,EAAE,UAAU,EACjB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAU/B"}
|
package/dist/site.js
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
const DEFAULT_API_PATH = '/api/cms';
|
|
2
|
+
function trimTrailingSlash(value) {
|
|
3
|
+
return value.replace(/\/+$/, '');
|
|
4
|
+
}
|
|
5
|
+
function normalizeApiPath(apiPath) {
|
|
6
|
+
const path = apiPath.startsWith('/') ? apiPath : `/${apiPath}`;
|
|
7
|
+
return trimTrailingSlash(path);
|
|
8
|
+
}
|
|
9
|
+
function buildBaseUrl(baseUrl, apiPath) {
|
|
10
|
+
const origin = trimTrailingSlash(baseUrl ?? '');
|
|
11
|
+
return `${origin}${normalizeApiPath(apiPath ?? DEFAULT_API_PATH)}`;
|
|
12
|
+
}
|
|
13
|
+
async function readApiData(response) {
|
|
14
|
+
if (response.status === 404)
|
|
15
|
+
return null;
|
|
16
|
+
if (!response.ok) {
|
|
17
|
+
throw new Error(`Actuate CMS API error: ${response.status} ${response.statusText}`);
|
|
18
|
+
}
|
|
19
|
+
const body = await response.json();
|
|
20
|
+
if (body && typeof body === 'object' && 'data' in body) {
|
|
21
|
+
return body.data ?? null;
|
|
22
|
+
}
|
|
23
|
+
return body;
|
|
24
|
+
}
|
|
25
|
+
export function createSiteClient(options = {}) {
|
|
26
|
+
const fetchImpl = options.fetch ?? fetch;
|
|
27
|
+
const apiBase = buildBaseUrl(options.baseUrl, options.apiPath);
|
|
28
|
+
const headers = {
|
|
29
|
+
'Content-Type': 'application/json',
|
|
30
|
+
};
|
|
31
|
+
if (options.apiKey) {
|
|
32
|
+
headers.Authorization = `Bearer ${options.apiKey}`;
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
async getGlobal(slug) {
|
|
36
|
+
const response = await fetchImpl(`${apiBase}/globals/${encodeURIComponent(slug)}`, { headers });
|
|
37
|
+
return readApiData(response);
|
|
38
|
+
},
|
|
39
|
+
async resolveDocument(path) {
|
|
40
|
+
const response = await fetchImpl(`${apiBase}/resolve?path=${encodeURIComponent(path)}`, { headers });
|
|
41
|
+
if (response.status === 404)
|
|
42
|
+
return null;
|
|
43
|
+
if (!response.ok) {
|
|
44
|
+
throw new Error(`Actuate CMS API error: ${response.status} ${response.statusText}`);
|
|
45
|
+
}
|
|
46
|
+
return response.json();
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function asString(value) {
|
|
51
|
+
return typeof value === 'string' && value.length > 0 ? value : undefined;
|
|
52
|
+
}
|
|
53
|
+
function asNullableString(value) {
|
|
54
|
+
return typeof value === 'string' ? value : null;
|
|
55
|
+
}
|
|
56
|
+
function asNullableNumber(value) {
|
|
57
|
+
return typeof value === 'number' && Number.isFinite(value) ? value : null;
|
|
58
|
+
}
|
|
59
|
+
function looksLikeUrl(value) {
|
|
60
|
+
return value.startsWith('/') || /^https?:\/\//i.test(value) || value.startsWith('data:');
|
|
61
|
+
}
|
|
62
|
+
export function normalizeMedia(value) {
|
|
63
|
+
if (!value)
|
|
64
|
+
return null;
|
|
65
|
+
if (typeof value === 'string') {
|
|
66
|
+
if (!looksLikeUrl(value))
|
|
67
|
+
return null;
|
|
68
|
+
return {
|
|
69
|
+
url: value,
|
|
70
|
+
alt: null,
|
|
71
|
+
title: null,
|
|
72
|
+
width: null,
|
|
73
|
+
height: null,
|
|
74
|
+
storageKey: null,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
const url = asString(value.url);
|
|
78
|
+
if (!url)
|
|
79
|
+
return null;
|
|
80
|
+
const id = asString(value.id);
|
|
81
|
+
return {
|
|
82
|
+
...(id ? { id } : {}),
|
|
83
|
+
url,
|
|
84
|
+
alt: asNullableString(value.alt),
|
|
85
|
+
title: asNullableString(value.title),
|
|
86
|
+
width: asNullableNumber(value.width),
|
|
87
|
+
height: asNullableNumber(value.height),
|
|
88
|
+
storageKey: asNullableString(value.storageKey),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
export async function resolveMedia(value, options = {}) {
|
|
92
|
+
const normalized = normalizeMedia(value);
|
|
93
|
+
if (normalized)
|
|
94
|
+
return normalized;
|
|
95
|
+
if (typeof value === 'string' && options.resolveById) {
|
|
96
|
+
const resolved = await options.resolveById(value);
|
|
97
|
+
return normalizeMedia(resolved);
|
|
98
|
+
}
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=site.js.map
|
package/dist/site.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"site.js","sourceRoot":"","sources":["../src/site.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@actuate-media/cms-core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "https://github.com/actuate-media/actuatecms.git",
|
|
@@ -29,6 +29,11 @@
|
|
|
29
29
|
"import": "./dist/client.js",
|
|
30
30
|
"default": "./dist/client.js"
|
|
31
31
|
},
|
|
32
|
+
"./site": {
|
|
33
|
+
"types": "./dist/site.d.ts",
|
|
34
|
+
"import": "./dist/site.js",
|
|
35
|
+
"default": "./dist/site.js"
|
|
36
|
+
},
|
|
32
37
|
"./next": {
|
|
33
38
|
"types": "./dist/next.d.ts",
|
|
34
39
|
"import": "./dist/next.js",
|
|
@@ -49,6 +54,11 @@
|
|
|
49
54
|
"import": "./dist/api/index.js",
|
|
50
55
|
"default": "./dist/api/index.js"
|
|
51
56
|
},
|
|
57
|
+
"./page-builder": {
|
|
58
|
+
"types": "./dist/page-builder/index.d.ts",
|
|
59
|
+
"import": "./dist/page-builder/index.js",
|
|
60
|
+
"default": "./dist/page-builder/index.js"
|
|
61
|
+
},
|
|
52
62
|
"./generated/client": {
|
|
53
63
|
"types": "./generated/client.d.ts",
|
|
54
64
|
"import": "./generated/client.js",
|
|
@@ -58,13 +68,13 @@
|
|
|
58
68
|
},
|
|
59
69
|
"dependencies": {
|
|
60
70
|
"@prisma/adapter-pg": "^7.6.0",
|
|
61
|
-
"@prisma/client": "^7.
|
|
71
|
+
"@prisma/client": "^7.8.0",
|
|
62
72
|
"arctic": "^3.5.0",
|
|
63
73
|
"graphql": "^16.13.2",
|
|
64
74
|
"graphql-yoga": "^5.19.0",
|
|
65
75
|
"jose": "^6.0.0",
|
|
66
76
|
"pg": "^8.20.0",
|
|
67
|
-
"sanitize-html": "^2.17.
|
|
77
|
+
"sanitize-html": "^2.17.3",
|
|
68
78
|
"sharp": "^0.34.5",
|
|
69
79
|
"zod": "^3.23.0"
|
|
70
80
|
},
|
|
@@ -72,7 +82,7 @@
|
|
|
72
82
|
"@types/sanitize-html": "^2.16.1",
|
|
73
83
|
"@types/sharp": "^0.32.0",
|
|
74
84
|
"dotenv": "^17.3.1",
|
|
75
|
-
"prisma": "^7.
|
|
85
|
+
"prisma": "^7.8.0",
|
|
76
86
|
"tsx": "^4.0.0",
|
|
77
87
|
"typescript": "^5.7.0",
|
|
78
88
|
"vitest": "^3.0.0"
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
-- CreateTable
|
|
2
|
+
CREATE TABLE "actuate_page_templates" (
|
|
3
|
+
"id" TEXT NOT NULL,
|
|
4
|
+
"name" TEXT NOT NULL,
|
|
5
|
+
"description" TEXT,
|
|
6
|
+
"category" TEXT NOT NULL DEFAULT 'content',
|
|
7
|
+
"tree" JSONB NOT NULL,
|
|
8
|
+
"thumbnail" TEXT,
|
|
9
|
+
"builtIn" BOOLEAN NOT NULL DEFAULT false,
|
|
10
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
11
|
+
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
12
|
+
|
|
13
|
+
CONSTRAINT "actuate_page_templates_pkey" PRIMARY KEY ("id")
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
-- CreateTable
|
|
17
|
+
CREATE TABLE "actuate_saved_sections" (
|
|
18
|
+
"id" TEXT NOT NULL,
|
|
19
|
+
"name" TEXT NOT NULL,
|
|
20
|
+
"description" TEXT,
|
|
21
|
+
"category" TEXT NOT NULL DEFAULT 'content',
|
|
22
|
+
"tree" JSONB NOT NULL,
|
|
23
|
+
"thumbnail" TEXT,
|
|
24
|
+
"usageCount" INTEGER NOT NULL DEFAULT 0,
|
|
25
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
26
|
+
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
27
|
+
|
|
28
|
+
CONSTRAINT "actuate_saved_sections_pkey" PRIMARY KEY ("id")
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
-- CreateIndex
|
|
32
|
+
CREATE INDEX "actuate_page_templates_category_idx" ON "actuate_page_templates"("category");
|
|
33
|
+
|
|
34
|
+
-- CreateIndex
|
|
35
|
+
CREATE INDEX "actuate_page_templates_builtIn_idx" ON "actuate_page_templates"("builtIn");
|
|
36
|
+
|
|
37
|
+
-- CreateIndex
|
|
38
|
+
CREATE INDEX "actuate_saved_sections_category_idx" ON "actuate_saved_sections"("category");
|
package/prisma/schema.prisma
CHANGED
|
@@ -516,3 +516,34 @@ model ScriptTag {
|
|
|
516
516
|
@@index([placement])
|
|
517
517
|
@@map("actuate_script_tags")
|
|
518
518
|
}
|
|
519
|
+
|
|
520
|
+
model PageTemplate {
|
|
521
|
+
id String @id @default(cuid())
|
|
522
|
+
name String
|
|
523
|
+
description String?
|
|
524
|
+
category String @default("content")
|
|
525
|
+
tree Json
|
|
526
|
+
thumbnail String?
|
|
527
|
+
builtIn Boolean @default(false)
|
|
528
|
+
createdAt DateTime @default(now())
|
|
529
|
+
updatedAt DateTime @updatedAt
|
|
530
|
+
|
|
531
|
+
@@index([category])
|
|
532
|
+
@@index([builtIn])
|
|
533
|
+
@@map("actuate_page_templates")
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
model SavedSection {
|
|
537
|
+
id String @id @default(cuid())
|
|
538
|
+
name String
|
|
539
|
+
description String?
|
|
540
|
+
category String @default("content")
|
|
541
|
+
tree Json
|
|
542
|
+
thumbnail String?
|
|
543
|
+
usageCount Int @default(0)
|
|
544
|
+
createdAt DateTime @default(now())
|
|
545
|
+
updatedAt DateTime @updatedAt
|
|
546
|
+
|
|
547
|
+
@@index([category])
|
|
548
|
+
@@map("actuate_saved_sections")
|
|
549
|
+
}
|