@revealui/contracts 1.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.
- package/LICENSE +22 -0
- package/README.md +160 -0
- package/dist/a2a/index.d.ts +383 -0
- package/dist/a2a/index.d.ts.map +1 -0
- package/dist/a2a/index.js +276 -0
- package/dist/a2a/index.js.map +1 -0
- package/dist/actions/action-validator.d.ts +48 -0
- package/dist/actions/action-validator.d.ts.map +1 -0
- package/dist/actions/action-validator.js +288 -0
- package/dist/actions/action-validator.js.map +1 -0
- package/dist/actions/index.d.ts +7 -0
- package/dist/actions/index.d.ts.map +1 -0
- package/dist/actions/index.js +7 -0
- package/dist/actions/index.js.map +1 -0
- package/dist/agents/index.d.ts +628 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +511 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/types.d.ts +22 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +2 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/api/auth.d.ts +60 -0
- package/dist/api/auth.d.ts.map +1 -0
- package/dist/api/auth.js +84 -0
- package/dist/api/auth.js.map +1 -0
- package/dist/api/chat.d.ts +45 -0
- package/dist/api/chat.d.ts.map +1 -0
- package/dist/api/chat.js +55 -0
- package/dist/api/chat.js.map +1 -0
- package/dist/api/gdpr.d.ts +39 -0
- package/dist/api/gdpr.d.ts.map +1 -0
- package/dist/api/gdpr.js +53 -0
- package/dist/api/gdpr.js.map +1 -0
- package/dist/cms/collection.d.ts +108 -0
- package/dist/cms/collection.d.ts.map +1 -0
- package/dist/cms/collection.js +144 -0
- package/dist/cms/collection.js.map +1 -0
- package/dist/cms/compat.d.ts +128 -0
- package/dist/cms/compat.d.ts.map +1 -0
- package/dist/cms/compat.js +141 -0
- package/dist/cms/compat.js.map +1 -0
- package/dist/cms/config-contract.d.ts +278 -0
- package/dist/cms/config-contract.d.ts.map +1 -0
- package/dist/cms/config-contract.js +220 -0
- package/dist/cms/config-contract.js.map +1 -0
- package/dist/cms/config.d.ts +351 -0
- package/dist/cms/config.d.ts.map +1 -0
- package/dist/cms/config.js +50 -0
- package/dist/cms/config.js.map +1 -0
- package/dist/cms/errors.d.ts +122 -0
- package/dist/cms/errors.d.ts.map +1 -0
- package/dist/cms/errors.js +163 -0
- package/dist/cms/errors.js.map +1 -0
- package/dist/cms/extensibility.d.ts +211 -0
- package/dist/cms/extensibility.d.ts.map +1 -0
- package/dist/cms/extensibility.js +313 -0
- package/dist/cms/extensibility.js.map +1 -0
- package/dist/cms/field.d.ts +69 -0
- package/dist/cms/field.d.ts.map +1 -0
- package/dist/cms/field.js +94 -0
- package/dist/cms/field.js.map +1 -0
- package/dist/cms/functions.d.ts +466 -0
- package/dist/cms/functions.d.ts.map +1 -0
- package/dist/cms/functions.js +19 -0
- package/dist/cms/functions.js.map +1 -0
- package/dist/cms/global.d.ts +45 -0
- package/dist/cms/global.d.ts.map +1 -0
- package/dist/cms/global.js +62 -0
- package/dist/cms/global.js.map +1 -0
- package/dist/cms/index.d.ts +23 -0
- package/dist/cms/index.d.ts.map +1 -0
- package/dist/cms/index.js +42 -0
- package/dist/cms/index.js.map +1 -0
- package/dist/cms/structure.d.ts +1601 -0
- package/dist/cms/structure.d.ts.map +1 -0
- package/dist/cms/structure.js +757 -0
- package/dist/cms/structure.js.map +1 -0
- package/dist/content/index.d.ts +1542 -0
- package/dist/content/index.d.ts.map +1 -0
- package/dist/content/index.js +522 -0
- package/dist/content/index.js.map +1 -0
- package/dist/database/bridge.d.ts +177 -0
- package/dist/database/bridge.d.ts.map +1 -0
- package/dist/database/bridge.js +139 -0
- package/dist/database/bridge.js.map +1 -0
- package/dist/database/index.d.ts +8 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js +9 -0
- package/dist/database/index.js.map +1 -0
- package/dist/database/type-bridge.d.ts +178 -0
- package/dist/database/type-bridge.d.ts.map +1 -0
- package/dist/database/type-bridge.js +154 -0
- package/dist/database/type-bridge.js.map +1 -0
- package/dist/entities/agent-context.d.ts +280 -0
- package/dist/entities/agent-context.d.ts.map +1 -0
- package/dist/entities/agent-context.js +390 -0
- package/dist/entities/agent-context.js.map +1 -0
- package/dist/entities/agent-memory.d.ts +661 -0
- package/dist/entities/agent-memory.d.ts.map +1 -0
- package/dist/entities/agent-memory.js +544 -0
- package/dist/entities/agent-memory.js.map +1 -0
- package/dist/entities/board.d.ts +95 -0
- package/dist/entities/board.d.ts.map +1 -0
- package/dist/entities/board.js +99 -0
- package/dist/entities/board.js.map +1 -0
- package/dist/entities/code-provenance.d.ts +270 -0
- package/dist/entities/code-provenance.d.ts.map +1 -0
- package/dist/entities/code-provenance.js +339 -0
- package/dist/entities/code-provenance.js.map +1 -0
- package/dist/entities/index.d.ts +22 -0
- package/dist/entities/index.d.ts.map +1 -0
- package/dist/entities/index.js +22 -0
- package/dist/entities/index.js.map +1 -0
- package/dist/entities/media.d.ts +485 -0
- package/dist/entities/media.d.ts.map +1 -0
- package/dist/entities/media.js +606 -0
- package/dist/entities/media.js.map +1 -0
- package/dist/entities/page-revision.d.ts +390 -0
- package/dist/entities/page-revision.d.ts.map +1 -0
- package/dist/entities/page-revision.js +406 -0
- package/dist/entities/page-revision.js.map +1 -0
- package/dist/entities/page.d.ts +2349 -0
- package/dist/entities/page.d.ts.map +1 -0
- package/dist/entities/page.js +377 -0
- package/dist/entities/page.js.map +1 -0
- package/dist/entities/post.d.ts +619 -0
- package/dist/entities/post.d.ts.map +1 -0
- package/dist/entities/post.js +555 -0
- package/dist/entities/post.js.map +1 -0
- package/dist/entities/price.d.ts +772 -0
- package/dist/entities/price.d.ts.map +1 -0
- package/dist/entities/price.js +308 -0
- package/dist/entities/price.js.map +1 -0
- package/dist/entities/product.d.ts +753 -0
- package/dist/entities/product.d.ts.map +1 -0
- package/dist/entities/product.js +307 -0
- package/dist/entities/product.js.map +1 -0
- package/dist/entities/session.d.ts +222 -0
- package/dist/entities/session.d.ts.map +1 -0
- package/dist/entities/session.js +253 -0
- package/dist/entities/session.js.map +1 -0
- package/dist/entities/site.d.ts +387 -0
- package/dist/entities/site.d.ts.map +1 -0
- package/dist/entities/site.js +348 -0
- package/dist/entities/site.js.map +1 -0
- package/dist/entities/ticket-comment.d.ts +49 -0
- package/dist/entities/ticket-comment.d.ts.map +1 -0
- package/dist/entities/ticket-comment.js +58 -0
- package/dist/entities/ticket-comment.js.map +1 -0
- package/dist/entities/ticket-label.d.ts +64 -0
- package/dist/entities/ticket-label.d.ts.map +1 -0
- package/dist/entities/ticket-label.js +77 -0
- package/dist/entities/ticket-label.js.map +1 -0
- package/dist/entities/ticket.d.ts +204 -0
- package/dist/entities/ticket.d.ts.map +1 -0
- package/dist/entities/ticket.js +205 -0
- package/dist/entities/ticket.js.map +1 -0
- package/dist/entities/user.d.ts +336 -0
- package/dist/entities/user.d.ts.map +1 -0
- package/dist/entities/user.js +255 -0
- package/dist/entities/user.js.map +1 -0
- package/dist/foundation/contract.d.ts +221 -0
- package/dist/foundation/contract.d.ts.map +1 -0
- package/dist/foundation/contract.js +133 -0
- package/dist/foundation/contract.js.map +1 -0
- package/dist/foundation/index.d.ts +7 -0
- package/dist/foundation/index.d.ts.map +1 -0
- package/dist/foundation/index.js +7 -0
- package/dist/foundation/index.js.map +1 -0
- package/dist/generated/contracts.d.ts +1514 -0
- package/dist/generated/contracts.d.ts.map +1 -0
- package/dist/generated/contracts.js +959 -0
- package/dist/generated/contracts.js.map +1 -0
- package/dist/generated/database.d.ts +48 -0
- package/dist/generated/database.d.ts.map +1 -0
- package/dist/generated/database.js +17 -0
- package/dist/generated/database.js.map +1 -0
- package/dist/generated/zod-schemas.d.ts +14793 -0
- package/dist/generated/zod-schemas.d.ts.map +1 -0
- package/dist/generated/zod-schemas.js +547 -0
- package/dist/generated/zod-schemas.js.map +1 -0
- package/dist/index.d.ts +50 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +81 -0
- package/dist/index.js.map +1 -0
- package/dist/representation/index.d.ts +304 -0
- package/dist/representation/index.d.ts.map +1 -0
- package/dist/representation/index.js +280 -0
- package/dist/representation/index.js.map +1 -0
- package/package.json +117 -0
|
@@ -0,0 +1,555 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Post Entity Contract
|
|
3
|
+
*
|
|
4
|
+
* Manages blog posts and articles with publishing workflow, content management,
|
|
5
|
+
* and SEO optimization. Posts support Lexical editor content, featured images,
|
|
6
|
+
* categories, and publication scheduling.
|
|
7
|
+
*
|
|
8
|
+
* Business Rules:
|
|
9
|
+
* - Slug must be unique across all posts
|
|
10
|
+
* - Status values: draft, published, archived
|
|
11
|
+
* - Published flag mirrors published status
|
|
12
|
+
* - publishedAt timestamp set when publishing
|
|
13
|
+
* - Content stored as Lexical editor JSON
|
|
14
|
+
* - Categories stored as string array
|
|
15
|
+
* - Author cascades to null on user deletion
|
|
16
|
+
*/
|
|
17
|
+
import { z } from 'zod/v4';
|
|
18
|
+
// =============================================================================
|
|
19
|
+
// Constants
|
|
20
|
+
// =============================================================================
|
|
21
|
+
export const POST_SCHEMA_VERSION = 1;
|
|
22
|
+
// Post status values
|
|
23
|
+
export const POST_STATUSES = ['draft', 'published', 'archived'];
|
|
24
|
+
// Lexical editor node types
|
|
25
|
+
export const LEXICAL_NODE_TYPES = [
|
|
26
|
+
'paragraph',
|
|
27
|
+
'heading',
|
|
28
|
+
'list',
|
|
29
|
+
'listitem',
|
|
30
|
+
'quote',
|
|
31
|
+
'code',
|
|
32
|
+
'text',
|
|
33
|
+
'link',
|
|
34
|
+
'image',
|
|
35
|
+
];
|
|
36
|
+
// Post limits
|
|
37
|
+
export const POST_LIMITS = {
|
|
38
|
+
MIN_TITLE_LENGTH: 1,
|
|
39
|
+
MAX_TITLE_LENGTH: 200,
|
|
40
|
+
MIN_SLUG_LENGTH: 1,
|
|
41
|
+
MAX_SLUG_LENGTH: 200,
|
|
42
|
+
MAX_EXCERPT_LENGTH: 500,
|
|
43
|
+
MAX_CATEGORIES: 10,
|
|
44
|
+
};
|
|
45
|
+
// =============================================================================
|
|
46
|
+
// Base Schemas
|
|
47
|
+
// =============================================================================
|
|
48
|
+
/**
|
|
49
|
+
* Lexical editor content schema (simplified)
|
|
50
|
+
*/
|
|
51
|
+
export const LexicalContentSchema = z.object({
|
|
52
|
+
root: z.object({
|
|
53
|
+
children: z.array(z.unknown()),
|
|
54
|
+
direction: z.enum(['ltr', 'rtl']).optional(),
|
|
55
|
+
format: z.string().optional(),
|
|
56
|
+
indent: z.number().optional(),
|
|
57
|
+
type: z.string(),
|
|
58
|
+
version: z.number().optional(),
|
|
59
|
+
}),
|
|
60
|
+
});
|
|
61
|
+
/**
|
|
62
|
+
* Post meta (SEO) schema
|
|
63
|
+
*/
|
|
64
|
+
export const PostMetaSchema = z.object({
|
|
65
|
+
title: z.string().optional(),
|
|
66
|
+
description: z.string().optional(),
|
|
67
|
+
keywords: z.array(z.string()).optional(),
|
|
68
|
+
ogImage: z.string().optional(),
|
|
69
|
+
ogTitle: z.string().optional(),
|
|
70
|
+
ogDescription: z.string().optional(),
|
|
71
|
+
twitterCard: z.enum(['summary', 'summary_large_image', 'app', 'player']).optional(),
|
|
72
|
+
canonicalUrl: z.string().optional(),
|
|
73
|
+
noIndex: z.boolean().optional(),
|
|
74
|
+
noFollow: z.boolean().optional(),
|
|
75
|
+
});
|
|
76
|
+
// =============================================================================
|
|
77
|
+
// Base Post Schema
|
|
78
|
+
// =============================================================================
|
|
79
|
+
/**
|
|
80
|
+
* Post object schema
|
|
81
|
+
*/
|
|
82
|
+
export const PostObjectSchema = z.object({
|
|
83
|
+
id: z.string().min(1),
|
|
84
|
+
schemaVersion: z.string().default(String(POST_SCHEMA_VERSION)),
|
|
85
|
+
title: z
|
|
86
|
+
.string()
|
|
87
|
+
.min(POST_LIMITS.MIN_TITLE_LENGTH, 'Title is required')
|
|
88
|
+
.max(POST_LIMITS.MAX_TITLE_LENGTH, `Title cannot exceed ${POST_LIMITS.MAX_TITLE_LENGTH} characters`),
|
|
89
|
+
slug: z
|
|
90
|
+
.string()
|
|
91
|
+
.min(POST_LIMITS.MIN_SLUG_LENGTH, 'Slug is required')
|
|
92
|
+
.max(POST_LIMITS.MAX_SLUG_LENGTH, `Slug cannot exceed ${POST_LIMITS.MAX_SLUG_LENGTH} characters`)
|
|
93
|
+
.regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/, 'Slug must be lowercase with hyphens'),
|
|
94
|
+
excerpt: z.string().max(POST_LIMITS.MAX_EXCERPT_LENGTH).nullable().optional(),
|
|
95
|
+
content: LexicalContentSchema.nullable().optional(),
|
|
96
|
+
featuredImageId: z.string().nullable().optional(),
|
|
97
|
+
authorId: z.string().nullable().optional(),
|
|
98
|
+
status: z.enum(POST_STATUSES),
|
|
99
|
+
published: z.boolean().default(false),
|
|
100
|
+
meta: PostMetaSchema.nullable().optional(),
|
|
101
|
+
categories: z.array(z.string()).max(POST_LIMITS.MAX_CATEGORIES).default([]),
|
|
102
|
+
createdAt: z.date(),
|
|
103
|
+
updatedAt: z.date(),
|
|
104
|
+
publishedAt: z.date().nullable().optional(),
|
|
105
|
+
});
|
|
106
|
+
/**
|
|
107
|
+
* Post schema with validation rules
|
|
108
|
+
*/
|
|
109
|
+
export const PostBaseSchema = PostObjectSchema.refine((data) => {
|
|
110
|
+
// If published, must have publishedAt timestamp
|
|
111
|
+
if (data.status === 'published' && data.published) {
|
|
112
|
+
return data.publishedAt !== null && data.publishedAt !== undefined;
|
|
113
|
+
}
|
|
114
|
+
return true;
|
|
115
|
+
}, {
|
|
116
|
+
message: 'Published posts must have a publishedAt timestamp',
|
|
117
|
+
path: ['publishedAt'],
|
|
118
|
+
}).refine((data) => {
|
|
119
|
+
// Published flag should match status
|
|
120
|
+
if (data.status === 'published') {
|
|
121
|
+
return data.published === true;
|
|
122
|
+
}
|
|
123
|
+
if (data.status === 'draft' || data.status === 'archived') {
|
|
124
|
+
return data.published === false;
|
|
125
|
+
}
|
|
126
|
+
return true;
|
|
127
|
+
}, {
|
|
128
|
+
message: 'Published flag must match status',
|
|
129
|
+
path: ['published'],
|
|
130
|
+
});
|
|
131
|
+
export const PostSchema = PostBaseSchema;
|
|
132
|
+
// =============================================================================
|
|
133
|
+
// Insert Schema
|
|
134
|
+
// =============================================================================
|
|
135
|
+
/**
|
|
136
|
+
* Schema for creating new posts
|
|
137
|
+
*/
|
|
138
|
+
export const PostInsertSchema = PostObjectSchema.omit({
|
|
139
|
+
createdAt: true,
|
|
140
|
+
updatedAt: true,
|
|
141
|
+
}).extend({
|
|
142
|
+
createdAt: z.date().optional(),
|
|
143
|
+
updatedAt: z.date().optional(),
|
|
144
|
+
});
|
|
145
|
+
// =============================================================================
|
|
146
|
+
// Status Helpers
|
|
147
|
+
// =============================================================================
|
|
148
|
+
/**
|
|
149
|
+
* Check if post is draft
|
|
150
|
+
*/
|
|
151
|
+
export function isDraft(post) {
|
|
152
|
+
return post.status === 'draft';
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Check if post is published
|
|
156
|
+
*/
|
|
157
|
+
export function isPublished(post) {
|
|
158
|
+
return post.status === 'published' && post.published === true;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Check if post is archived
|
|
162
|
+
*/
|
|
163
|
+
export function isArchived(post) {
|
|
164
|
+
return post.status === 'archived';
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Check if post is publishable (has required fields)
|
|
168
|
+
*/
|
|
169
|
+
export function isPublishable(post) {
|
|
170
|
+
return (post.title.length > 0 &&
|
|
171
|
+
post.slug.length > 0 &&
|
|
172
|
+
post.content !== null &&
|
|
173
|
+
post.content !== undefined);
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Get status display label
|
|
177
|
+
*/
|
|
178
|
+
export function getStatusLabel(status) {
|
|
179
|
+
const labels = {
|
|
180
|
+
draft: 'Draft',
|
|
181
|
+
published: 'Published',
|
|
182
|
+
archived: 'Archived',
|
|
183
|
+
};
|
|
184
|
+
return labels[status];
|
|
185
|
+
}
|
|
186
|
+
// =============================================================================
|
|
187
|
+
// Publishing Helpers
|
|
188
|
+
// =============================================================================
|
|
189
|
+
/**
|
|
190
|
+
* Create publish update
|
|
191
|
+
*/
|
|
192
|
+
export function createPublishUpdate() {
|
|
193
|
+
return {
|
|
194
|
+
status: 'published',
|
|
195
|
+
published: true,
|
|
196
|
+
publishedAt: new Date(),
|
|
197
|
+
updatedAt: new Date(),
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Create unpublish update
|
|
202
|
+
*/
|
|
203
|
+
export function createUnpublishUpdate() {
|
|
204
|
+
return {
|
|
205
|
+
status: 'draft',
|
|
206
|
+
published: false,
|
|
207
|
+
updatedAt: new Date(),
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Create archive update
|
|
212
|
+
*/
|
|
213
|
+
export function createArchiveUpdate() {
|
|
214
|
+
return {
|
|
215
|
+
status: 'archived',
|
|
216
|
+
published: false,
|
|
217
|
+
updatedAt: new Date(),
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Create restore update (from archive)
|
|
222
|
+
*/
|
|
223
|
+
export function createRestoreUpdate() {
|
|
224
|
+
return {
|
|
225
|
+
status: 'draft',
|
|
226
|
+
published: false,
|
|
227
|
+
updatedAt: new Date(),
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
// =============================================================================
|
|
231
|
+
// Content Helpers
|
|
232
|
+
// =============================================================================
|
|
233
|
+
/**
|
|
234
|
+
* Check if post has content
|
|
235
|
+
*/
|
|
236
|
+
export function hasContent(post) {
|
|
237
|
+
return post.content !== null && post.content !== undefined;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Check if post has excerpt
|
|
241
|
+
*/
|
|
242
|
+
export function hasExcerpt(post) {
|
|
243
|
+
return post.excerpt !== null && post.excerpt !== undefined && post.excerpt.length > 0;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Check if post has featured image
|
|
247
|
+
*/
|
|
248
|
+
export function hasFeaturedImage(post) {
|
|
249
|
+
return post.featuredImageId !== null && post.featuredImageId !== undefined;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Estimate reading time in minutes
|
|
253
|
+
*/
|
|
254
|
+
export function estimateReadingTime(post) {
|
|
255
|
+
if (!hasContent(post))
|
|
256
|
+
return 0;
|
|
257
|
+
// Rough estimate: 200 words per minute
|
|
258
|
+
const wordCount = estimateWordCount(post);
|
|
259
|
+
return Math.max(1, Math.ceil(wordCount / 200));
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Estimate word count from content
|
|
263
|
+
*/
|
|
264
|
+
export function estimateWordCount(post) {
|
|
265
|
+
if (!hasContent(post))
|
|
266
|
+
return 0;
|
|
267
|
+
// Count words in title
|
|
268
|
+
let wordCount = post.title.split(/\s+/).length;
|
|
269
|
+
// Count words in excerpt
|
|
270
|
+
if (hasExcerpt(post)) {
|
|
271
|
+
wordCount += (post.excerpt ?? '').split(/\s+/).length;
|
|
272
|
+
}
|
|
273
|
+
// Rough estimate from content JSON
|
|
274
|
+
if (post.content) {
|
|
275
|
+
const contentText = JSON.stringify(post.content.root.children);
|
|
276
|
+
wordCount += contentText.split(/\s+/).length / 2; // Rough estimate
|
|
277
|
+
}
|
|
278
|
+
return Math.floor(wordCount);
|
|
279
|
+
}
|
|
280
|
+
// =============================================================================
|
|
281
|
+
// Author Helpers
|
|
282
|
+
// =============================================================================
|
|
283
|
+
/**
|
|
284
|
+
* Check if post has author
|
|
285
|
+
*/
|
|
286
|
+
export function hasAuthor(post) {
|
|
287
|
+
return post.authorId !== null && post.authorId !== undefined;
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Check if post is authored by specific user
|
|
291
|
+
*/
|
|
292
|
+
export function isAuthoredBy(post, userId) {
|
|
293
|
+
return post.authorId === userId;
|
|
294
|
+
}
|
|
295
|
+
// =============================================================================
|
|
296
|
+
// Category Helpers
|
|
297
|
+
// =============================================================================
|
|
298
|
+
/**
|
|
299
|
+
* Check if post has categories
|
|
300
|
+
*/
|
|
301
|
+
export function hasCategories(post) {
|
|
302
|
+
return post.categories.length > 0;
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Check if post has specific category
|
|
306
|
+
*/
|
|
307
|
+
export function hasCategory(post, category) {
|
|
308
|
+
return post.categories.includes(category);
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Add category to post
|
|
312
|
+
*/
|
|
313
|
+
export function addCategory(post, category) {
|
|
314
|
+
if (hasCategory(post, category))
|
|
315
|
+
return post.categories;
|
|
316
|
+
if (post.categories.length >= POST_LIMITS.MAX_CATEGORIES) {
|
|
317
|
+
throw new Error(`Cannot exceed ${POST_LIMITS.MAX_CATEGORIES} categories`);
|
|
318
|
+
}
|
|
319
|
+
return [...post.categories, category];
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Remove category from post
|
|
323
|
+
*/
|
|
324
|
+
export function removeCategory(post, category) {
|
|
325
|
+
return post.categories.filter((c) => c !== category);
|
|
326
|
+
}
|
|
327
|
+
// =============================================================================
|
|
328
|
+
// SEO Helpers
|
|
329
|
+
// =============================================================================
|
|
330
|
+
/**
|
|
331
|
+
* Check if post has SEO meta
|
|
332
|
+
*/
|
|
333
|
+
export function hasMeta(post) {
|
|
334
|
+
return post.meta !== null && post.meta !== undefined;
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Get effective SEO title (meta.title or post.title)
|
|
338
|
+
*/
|
|
339
|
+
export function getEffectiveSeoTitle(post) {
|
|
340
|
+
return post.meta?.title ?? post.title;
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Get effective SEO description (meta.description or excerpt)
|
|
344
|
+
*/
|
|
345
|
+
export function getEffectiveSeoDescription(post) {
|
|
346
|
+
return post.meta?.description ?? post.excerpt ?? null;
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Check if post is indexed by search engines
|
|
350
|
+
*/
|
|
351
|
+
export function isIndexable(post) {
|
|
352
|
+
return !(post.meta?.noIndex === true);
|
|
353
|
+
}
|
|
354
|
+
// =============================================================================
|
|
355
|
+
// Slug Helpers
|
|
356
|
+
// =============================================================================
|
|
357
|
+
/**
|
|
358
|
+
* Generate slug from title
|
|
359
|
+
*/
|
|
360
|
+
export function generateSlug(title) {
|
|
361
|
+
return title
|
|
362
|
+
.toLowerCase()
|
|
363
|
+
.trim()
|
|
364
|
+
.replace(/[^\w\s-]/g, '') // Remove special chars
|
|
365
|
+
.replace(/[\s_-]+/g, '-') // Replace spaces and underscores with hyphens
|
|
366
|
+
.replace(/^-+|-+$/g, '') // Remove leading/trailing hyphens
|
|
367
|
+
.slice(0, POST_LIMITS.MAX_SLUG_LENGTH);
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Validate slug format
|
|
371
|
+
*/
|
|
372
|
+
export function isValidSlug(slug) {
|
|
373
|
+
return /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(slug);
|
|
374
|
+
}
|
|
375
|
+
// =============================================================================
|
|
376
|
+
// Timing Helpers
|
|
377
|
+
// =============================================================================
|
|
378
|
+
/**
|
|
379
|
+
* Get post age in milliseconds
|
|
380
|
+
*/
|
|
381
|
+
export function getPostAge(post) {
|
|
382
|
+
return Date.now() - post.createdAt.getTime();
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* Get post age in days
|
|
386
|
+
*/
|
|
387
|
+
export function getPostAgeInDays(post) {
|
|
388
|
+
return Math.floor(getPostAge(post) / (1000 * 60 * 60 * 24));
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Get time since last update in milliseconds
|
|
392
|
+
*/
|
|
393
|
+
export function getTimeSinceUpdate(post) {
|
|
394
|
+
return Date.now() - post.updatedAt.getTime();
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Get time since publication in milliseconds
|
|
398
|
+
*/
|
|
399
|
+
export function getTimeSincePublication(post) {
|
|
400
|
+
if (!post.publishedAt)
|
|
401
|
+
return null;
|
|
402
|
+
return Date.now() - post.publishedAt.getTime();
|
|
403
|
+
}
|
|
404
|
+
/**
|
|
405
|
+
* Check if post is recent (< 7 days old)
|
|
406
|
+
*/
|
|
407
|
+
export function isRecentPost(post, daysThreshold = 7) {
|
|
408
|
+
return getPostAgeInDays(post) < daysThreshold;
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Check if post was recently updated (< 24 hours)
|
|
412
|
+
*/
|
|
413
|
+
export function isRecentlyUpdated(post, hoursThreshold = 24) {
|
|
414
|
+
const hoursSinceUpdate = getTimeSinceUpdate(post) / (1000 * 60 * 60);
|
|
415
|
+
return hoursSinceUpdate < hoursThreshold;
|
|
416
|
+
}
|
|
417
|
+
// =============================================================================
|
|
418
|
+
// Post Creation
|
|
419
|
+
// =============================================================================
|
|
420
|
+
/**
|
|
421
|
+
* Create post insert data
|
|
422
|
+
*/
|
|
423
|
+
export function createPostInsert(title, slug, options) {
|
|
424
|
+
const now = new Date();
|
|
425
|
+
const status = options?.status ?? 'draft';
|
|
426
|
+
return {
|
|
427
|
+
id: options?.id ?? crypto.randomUUID(),
|
|
428
|
+
schemaVersion: String(POST_SCHEMA_VERSION),
|
|
429
|
+
title,
|
|
430
|
+
slug,
|
|
431
|
+
excerpt: options?.excerpt ?? null,
|
|
432
|
+
content: options?.content ?? null,
|
|
433
|
+
featuredImageId: options?.featuredImageId ?? null,
|
|
434
|
+
authorId: options?.authorId ?? null,
|
|
435
|
+
status,
|
|
436
|
+
published: status === 'published',
|
|
437
|
+
meta: options?.meta ?? null,
|
|
438
|
+
categories: options?.categories ?? [],
|
|
439
|
+
createdAt: now,
|
|
440
|
+
updatedAt: now,
|
|
441
|
+
publishedAt: status === 'published' ? now : null,
|
|
442
|
+
};
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* Update post data
|
|
446
|
+
*/
|
|
447
|
+
export function updatePost(updates) {
|
|
448
|
+
const result = {
|
|
449
|
+
updatedAt: new Date(),
|
|
450
|
+
};
|
|
451
|
+
if (updates.title !== undefined)
|
|
452
|
+
result.title = updates.title;
|
|
453
|
+
if (updates.slug !== undefined)
|
|
454
|
+
result.slug = updates.slug;
|
|
455
|
+
if (updates.excerpt !== undefined)
|
|
456
|
+
result.excerpt = updates.excerpt;
|
|
457
|
+
if (updates.content !== undefined)
|
|
458
|
+
result.content = updates.content;
|
|
459
|
+
if (updates.featuredImageId !== undefined)
|
|
460
|
+
result.featuredImageId = updates.featuredImageId;
|
|
461
|
+
if (updates.meta !== undefined)
|
|
462
|
+
result.meta = updates.meta;
|
|
463
|
+
if (updates.categories !== undefined)
|
|
464
|
+
result.categories = updates.categories;
|
|
465
|
+
return result;
|
|
466
|
+
}
|
|
467
|
+
/**
|
|
468
|
+
* Convert post to format with computed fields
|
|
469
|
+
*/
|
|
470
|
+
export function postToHuman(post) {
|
|
471
|
+
return {
|
|
472
|
+
...post,
|
|
473
|
+
_computed: {
|
|
474
|
+
isDraft: isDraft(post),
|
|
475
|
+
isPublished: isPublished(post),
|
|
476
|
+
isArchived: isArchived(post),
|
|
477
|
+
isPublishable: isPublishable(post),
|
|
478
|
+
hasContent: hasContent(post),
|
|
479
|
+
hasExcerpt: hasExcerpt(post),
|
|
480
|
+
hasFeaturedImage: hasFeaturedImage(post),
|
|
481
|
+
hasAuthor: hasAuthor(post),
|
|
482
|
+
hasCategories: hasCategories(post),
|
|
483
|
+
hasMeta: hasMeta(post),
|
|
484
|
+
isIndexable: isIndexable(post),
|
|
485
|
+
estimatedWordCount: estimateWordCount(post),
|
|
486
|
+
estimatedReadingTime: estimateReadingTime(post),
|
|
487
|
+
ageInDays: getPostAgeInDays(post),
|
|
488
|
+
isRecent: isRecentPost(post),
|
|
489
|
+
isRecentlyUpdated: isRecentlyUpdated(post),
|
|
490
|
+
effectiveSeoTitle: getEffectiveSeoTitle(post),
|
|
491
|
+
effectiveSeoDescription: getEffectiveSeoDescription(post),
|
|
492
|
+
},
|
|
493
|
+
};
|
|
494
|
+
}
|
|
495
|
+
/**
|
|
496
|
+
* Convert post to agent-compatible format
|
|
497
|
+
*/
|
|
498
|
+
export function postToAgent(post) {
|
|
499
|
+
return {
|
|
500
|
+
...post,
|
|
501
|
+
metadata: {
|
|
502
|
+
status: post.status,
|
|
503
|
+
published: post.published,
|
|
504
|
+
hasContent: hasContent(post),
|
|
505
|
+
wordCount: estimateWordCount(post),
|
|
506
|
+
readingTimeMinutes: estimateReadingTime(post),
|
|
507
|
+
categoryCount: post.categories.length,
|
|
508
|
+
ageMs: getPostAge(post),
|
|
509
|
+
timeSincePublicationMs: getTimeSincePublication(post),
|
|
510
|
+
isIndexable: isIndexable(post),
|
|
511
|
+
},
|
|
512
|
+
};
|
|
513
|
+
}
|
|
514
|
+
/**
|
|
515
|
+
* Zod schema for post with computed fields
|
|
516
|
+
*/
|
|
517
|
+
export const PostWithComputedSchema = PostSchema.and(z.object({
|
|
518
|
+
_computed: z.object({
|
|
519
|
+
isDraft: z.boolean(),
|
|
520
|
+
isPublished: z.boolean(),
|
|
521
|
+
isArchived: z.boolean(),
|
|
522
|
+
isPublishable: z.boolean(),
|
|
523
|
+
hasContent: z.boolean(),
|
|
524
|
+
hasExcerpt: z.boolean(),
|
|
525
|
+
hasFeaturedImage: z.boolean(),
|
|
526
|
+
hasAuthor: z.boolean(),
|
|
527
|
+
hasCategories: z.boolean(),
|
|
528
|
+
hasMeta: z.boolean(),
|
|
529
|
+
isIndexable: z.boolean(),
|
|
530
|
+
estimatedWordCount: z.number().int(),
|
|
531
|
+
estimatedReadingTime: z.number().int(),
|
|
532
|
+
ageInDays: z.number(),
|
|
533
|
+
isRecent: z.boolean(),
|
|
534
|
+
isRecentlyUpdated: z.boolean(),
|
|
535
|
+
effectiveSeoTitle: z.string(),
|
|
536
|
+
effectiveSeoDescription: z.string().nullable(),
|
|
537
|
+
}),
|
|
538
|
+
}));
|
|
539
|
+
/**
|
|
540
|
+
* Zod schema for post with agent metadata
|
|
541
|
+
*/
|
|
542
|
+
export const PostAgentSchema = PostSchema.and(z.object({
|
|
543
|
+
metadata: z.object({
|
|
544
|
+
status: z.enum(POST_STATUSES),
|
|
545
|
+
published: z.boolean(),
|
|
546
|
+
hasContent: z.boolean(),
|
|
547
|
+
wordCount: z.number().int(),
|
|
548
|
+
readingTimeMinutes: z.number().int(),
|
|
549
|
+
categoryCount: z.number().int(),
|
|
550
|
+
ageMs: z.number(),
|
|
551
|
+
timeSincePublicationMs: z.number().nullable(),
|
|
552
|
+
isIndexable: z.boolean(),
|
|
553
|
+
}),
|
|
554
|
+
}));
|
|
555
|
+
//# sourceMappingURL=post.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"post.js","sourceRoot":"","sources":["../../src/entities/post.ts"],"names":[],"mappings":"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"}
|