@actuate-media/cms-core 0.5.0 → 0.9.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.
Files changed (96) hide show
  1. package/dist/api/handlers.d.ts.map +1 -1
  2. package/dist/api/handlers.js +797 -0
  3. package/dist/api/handlers.js.map +1 -1
  4. package/dist/auth/index.d.ts +2 -0
  5. package/dist/auth/index.d.ts.map +1 -1
  6. package/dist/auth/index.js +1 -0
  7. package/dist/auth/index.js.map +1 -1
  8. package/dist/auth/reset-email.d.ts +10 -0
  9. package/dist/auth/reset-email.d.ts.map +1 -0
  10. package/dist/auth/reset-email.js +30 -0
  11. package/dist/auth/reset-email.js.map +1 -0
  12. package/dist/auth/reset.d.ts +35 -0
  13. package/dist/auth/reset.d.ts.map +1 -0
  14. package/dist/auth/reset.js +83 -0
  15. package/dist/auth/reset.js.map +1 -0
  16. package/dist/config/types.d.ts +3 -0
  17. package/dist/config/types.d.ts.map +1 -1
  18. package/dist/config/types.js +0 -1
  19. package/dist/config/types.js.map +1 -1
  20. package/dist/index.d.ts +2 -0
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +2 -0
  23. package/dist/index.js.map +1 -1
  24. package/dist/page-builder/__tests__/a11y-fix.test.d.ts +2 -0
  25. package/dist/page-builder/__tests__/a11y-fix.test.d.ts.map +1 -0
  26. package/dist/page-builder/__tests__/a11y-fix.test.js +246 -0
  27. package/dist/page-builder/__tests__/a11y-fix.test.js.map +1 -0
  28. package/dist/page-builder/__tests__/blocks.test.d.ts +2 -0
  29. package/dist/page-builder/__tests__/blocks.test.d.ts.map +1 -0
  30. package/dist/page-builder/__tests__/blocks.test.js +87 -0
  31. package/dist/page-builder/__tests__/blocks.test.js.map +1 -0
  32. package/dist/page-builder/__tests__/design-scorer.test.d.ts +2 -0
  33. package/dist/page-builder/__tests__/design-scorer.test.d.ts.map +1 -0
  34. package/dist/page-builder/__tests__/design-scorer.test.js +268 -0
  35. package/dist/page-builder/__tests__/design-scorer.test.js.map +1 -0
  36. package/dist/page-builder/__tests__/schema.test.d.ts +2 -0
  37. package/dist/page-builder/__tests__/schema.test.d.ts.map +1 -0
  38. package/dist/page-builder/__tests__/schema.test.js +191 -0
  39. package/dist/page-builder/__tests__/schema.test.js.map +1 -0
  40. package/dist/page-builder/__tests__/seo-analyzer.test.d.ts +2 -0
  41. package/dist/page-builder/__tests__/seo-analyzer.test.d.ts.map +1 -0
  42. package/dist/page-builder/__tests__/seo-analyzer.test.js +332 -0
  43. package/dist/page-builder/__tests__/seo-analyzer.test.js.map +1 -0
  44. package/dist/page-builder/__tests__/tree.test.d.ts +2 -0
  45. package/dist/page-builder/__tests__/tree.test.d.ts.map +1 -0
  46. package/dist/page-builder/__tests__/tree.test.js +257 -0
  47. package/dist/page-builder/__tests__/tree.test.js.map +1 -0
  48. package/dist/page-builder/a11y-fix.d.ts +20 -0
  49. package/dist/page-builder/a11y-fix.d.ts.map +1 -0
  50. package/dist/page-builder/a11y-fix.js +182 -0
  51. package/dist/page-builder/a11y-fix.js.map +1 -0
  52. package/dist/page-builder/ai-pipeline.d.ts +43 -0
  53. package/dist/page-builder/ai-pipeline.d.ts.map +1 -0
  54. package/dist/page-builder/ai-pipeline.js +167 -0
  55. package/dist/page-builder/ai-pipeline.js.map +1 -0
  56. package/dist/page-builder/blocks.d.ts +10 -0
  57. package/dist/page-builder/blocks.d.ts.map +1 -0
  58. package/dist/page-builder/blocks.js +252 -0
  59. package/dist/page-builder/blocks.js.map +1 -0
  60. package/dist/page-builder/design-scorer.d.ts +27 -0
  61. package/dist/page-builder/design-scorer.d.ts.map +1 -0
  62. package/dist/page-builder/design-scorer.js +404 -0
  63. package/dist/page-builder/design-scorer.js.map +1 -0
  64. package/dist/page-builder/index.d.ts +18 -0
  65. package/dist/page-builder/index.d.ts.map +1 -0
  66. package/dist/page-builder/index.js +20 -0
  67. package/dist/page-builder/index.js.map +1 -0
  68. package/dist/page-builder/schema.d.ts +107 -0
  69. package/dist/page-builder/schema.d.ts.map +1 -0
  70. package/dist/page-builder/schema.js +90 -0
  71. package/dist/page-builder/schema.js.map +1 -0
  72. package/dist/page-builder/seo-analyzer.d.ts +61 -0
  73. package/dist/page-builder/seo-analyzer.d.ts.map +1 -0
  74. package/dist/page-builder/seo-analyzer.js +582 -0
  75. package/dist/page-builder/seo-analyzer.js.map +1 -0
  76. package/dist/page-builder/templates.d.ts +9 -0
  77. package/dist/page-builder/templates.d.ts.map +1 -0
  78. package/dist/page-builder/templates.js +401 -0
  79. package/dist/page-builder/templates.js.map +1 -0
  80. package/dist/page-builder/tree.d.ts +17 -0
  81. package/dist/page-builder/tree.d.ts.map +1 -0
  82. package/dist/page-builder/tree.js +160 -0
  83. package/dist/page-builder/tree.js.map +1 -0
  84. package/dist/page-builder/types.d.ts +112 -0
  85. package/dist/page-builder/types.d.ts.map +1 -0
  86. package/dist/page-builder/types.js +4 -0
  87. package/dist/page-builder/types.js.map +1 -0
  88. package/dist/page-builder/validate.d.ts +6 -0
  89. package/dist/page-builder/validate.d.ts.map +1 -0
  90. package/dist/page-builder/validate.js +87 -0
  91. package/dist/page-builder/validate.js.map +1 -0
  92. package/package.json +6 -1
  93. package/prisma/migrations/0004_script_tags/migration.sql +21 -0
  94. package/prisma/migrations/0005_password_reset_tokens/migration.sql +20 -0
  95. package/prisma/migrations/0006_page_builder/migration.sql +38 -0
  96. package/prisma/schema.prisma +75 -11
@@ -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,4 @@
1
+ export function hasChildren(node) {
2
+ return node.type !== 'block' && node.type !== 'savedSectionRef';
3
+ }
4
+ //# sourceMappingURL=types.js.map
@@ -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,6 @@
1
+ export interface TreeValidationResult {
2
+ valid: boolean;
3
+ errors: string[];
4
+ }
5
+ export declare function validateTree(tree: unknown): TreeValidationResult;
6
+ //# sourceMappingURL=validate.d.ts.map
@@ -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":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@actuate-media/cms-core",
3
- "version": "0.5.0",
3
+ "version": "0.9.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/actuate-media/actuatecms.git",
@@ -49,6 +49,11 @@
49
49
  "import": "./dist/api/index.js",
50
50
  "default": "./dist/api/index.js"
51
51
  },
52
+ "./page-builder": {
53
+ "types": "./dist/page-builder/index.d.ts",
54
+ "import": "./dist/page-builder/index.js",
55
+ "default": "./dist/page-builder/index.js"
56
+ },
52
57
  "./generated/client": {
53
58
  "types": "./generated/client.d.ts",
54
59
  "import": "./generated/client.js",
@@ -0,0 +1,21 @@
1
+ -- CreateTable
2
+ CREATE TABLE "actuate_script_tags" (
3
+ "id" TEXT NOT NULL,
4
+ "name" TEXT NOT NULL,
5
+ "code" TEXT NOT NULL,
6
+ "placement" TEXT NOT NULL,
7
+ "scope" TEXT NOT NULL,
8
+ "targetPaths" TEXT[],
9
+ "priority" INTEGER NOT NULL DEFAULT 100,
10
+ "enabled" BOOLEAN NOT NULL DEFAULT true,
11
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
12
+ "updatedAt" TIMESTAMP(3) NOT NULL,
13
+
14
+ CONSTRAINT "actuate_script_tags_pkey" PRIMARY KEY ("id")
15
+ );
16
+
17
+ -- CreateIndex
18
+ CREATE INDEX "actuate_script_tags_enabled_idx" ON "actuate_script_tags"("enabled");
19
+
20
+ -- CreateIndex
21
+ CREATE INDEX "actuate_script_tags_placement_idx" ON "actuate_script_tags"("placement");
@@ -0,0 +1,20 @@
1
+ -- CreateTable
2
+ CREATE TABLE "actuate_password_reset_tokens" (
3
+ "id" TEXT NOT NULL,
4
+ "userId" TEXT NOT NULL,
5
+ "tokenHash" TEXT NOT NULL,
6
+ "expiresAt" TIMESTAMP(3) NOT NULL,
7
+ "usedAt" TIMESTAMP(3),
8
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
9
+
10
+ CONSTRAINT "actuate_password_reset_tokens_pkey" PRIMARY KEY ("id")
11
+ );
12
+
13
+ -- CreateIndex
14
+ CREATE INDEX "actuate_password_reset_tokens_tokenHash_idx" ON "actuate_password_reset_tokens"("tokenHash");
15
+
16
+ -- CreateIndex
17
+ CREATE INDEX "actuate_password_reset_tokens_userId_idx" ON "actuate_password_reset_tokens"("userId");
18
+
19
+ -- AddForeignKey
20
+ ALTER TABLE "actuate_password_reset_tokens" ADD CONSTRAINT "actuate_password_reset_tokens_userId_fkey" FOREIGN KEY ("userId") REFERENCES "actuate_users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
@@ -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");
@@ -129,17 +129,18 @@ model User {
129
129
  createdAt DateTime @default(now())
130
130
  updatedAt DateTime @updatedAt
131
131
 
132
- sessions Session[]
133
- oauthAccounts OAuthAccount[]
134
- apiKeys ApiKey[]
135
- documents Document[] @relation("CreatedDocuments")
136
- updatedDocuments Document[] @relation("UpdatedDocuments")
137
- versions Version[]
138
- media Media[]
139
- contentLocks ContentLock[]
140
- notifications InAppNotification[]
141
- contentTemplates ContentTemplate[]
142
- workflowAssigned WorkflowState[]
132
+ sessions Session[]
133
+ oauthAccounts OAuthAccount[]
134
+ apiKeys ApiKey[]
135
+ documents Document[] @relation("CreatedDocuments")
136
+ updatedDocuments Document[] @relation("UpdatedDocuments")
137
+ versions Version[]
138
+ media Media[]
139
+ contentLocks ContentLock[]
140
+ notifications InAppNotification[]
141
+ contentTemplates ContentTemplate[]
142
+ workflowAssigned WorkflowState[]
143
+ passwordResetTokens PasswordResetToken[]
143
144
 
144
145
  @@map("actuate_users")
145
146
  }
@@ -483,3 +484,66 @@ model WebhookDeliveryLog {
483
484
  @@index([nextRetryAt])
484
485
  @@map("actuate_webhook_deliveries")
485
486
  }
487
+
488
+ model PasswordResetToken {
489
+ id String @id @default(cuid())
490
+ userId String
491
+ tokenHash String
492
+ expiresAt DateTime
493
+ usedAt DateTime?
494
+ createdAt DateTime @default(now())
495
+
496
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
497
+
498
+ @@index([tokenHash])
499
+ @@index([userId])
500
+ @@map("actuate_password_reset_tokens")
501
+ }
502
+
503
+ model ScriptTag {
504
+ id String @id @default(cuid())
505
+ name String
506
+ code String @db.Text
507
+ placement String
508
+ scope String
509
+ targetPaths String[]
510
+ priority Int @default(100)
511
+ enabled Boolean @default(true)
512
+ createdAt DateTime @default(now())
513
+ updatedAt DateTime @updatedAt
514
+
515
+ @@index([enabled])
516
+ @@index([placement])
517
+ @@map("actuate_script_tags")
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
+ }