@growth-labs/cms 0.1.0 → 0.1.2

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 (68) hide show
  1. package/README.md +13 -4
  2. package/dist/engine/publisher.d.ts +14 -3
  3. package/dist/engine/publisher.d.ts.map +1 -1
  4. package/dist/engine/publisher.js +11 -5
  5. package/dist/engine/publisher.js.map +1 -1
  6. package/dist/routes/content.d.ts +1 -1
  7. package/dist/routes/content.d.ts.map +1 -1
  8. package/dist/routes/content.js +30 -23
  9. package/dist/routes/content.js.map +1 -1
  10. package/dist/schema/insights-ingest.d.ts +16 -16
  11. package/dist/schema/migrations.d.ts +5 -3
  12. package/dist/schema/migrations.d.ts.map +1 -1
  13. package/dist/schema/migrations.js +148 -4
  14. package/dist/schema/migrations.js.map +1 -1
  15. package/dist/schema/types.d.ts +2 -2
  16. package/dist/schema/types.d.ts.map +1 -1
  17. package/dist/ui/commands.d.ts +2 -1
  18. package/dist/ui/commands.d.ts.map +1 -1
  19. package/dist/ui/commands.js +1 -2
  20. package/dist/ui/commands.js.map +1 -1
  21. package/dist/ui/components/SharePickers.d.ts.map +1 -1
  22. package/dist/ui/components/SharePickers.js +11 -7
  23. package/dist/ui/components/SharePickers.js.map +1 -1
  24. package/dist/ui/editor/ContentForm.d.ts +1 -1
  25. package/dist/ui/editor/ContentForm.d.ts.map +1 -1
  26. package/dist/ui/editor/ContentForm.js +5 -5
  27. package/dist/ui/editor/ContentForm.js.map +1 -1
  28. package/dist/ui/editor/content-payload.js +2 -2
  29. package/dist/ui/editor/content-payload.js.map +1 -1
  30. package/dist/ui/preview/draft-page.js +5 -4
  31. package/dist/ui/preview/draft-page.js.map +1 -1
  32. package/dist/ui/screens/EditorScreen.d.ts.map +1 -1
  33. package/dist/ui/screens/EditorScreen.js +4 -1
  34. package/dist/ui/screens/EditorScreen.js.map +1 -1
  35. package/dist/ui/screens/LibraryScreen.d.ts.map +1 -1
  36. package/dist/ui/screens/LibraryScreen.js +6 -3
  37. package/dist/ui/screens/LibraryScreen.js.map +1 -1
  38. package/dist/ui/screens/SocialShareScreen.d.ts.map +1 -1
  39. package/dist/ui/screens/SocialShareScreen.js +4 -3
  40. package/dist/ui/screens/SocialShareScreen.js.map +1 -1
  41. package/dist/ui/screens/content-view.d.ts +2 -1
  42. package/dist/ui/screens/content-view.d.ts.map +1 -1
  43. package/dist/ui/screens/content-view.js.map +1 -1
  44. package/dist/ui/screens/public-url.d.ts.map +1 -1
  45. package/dist/ui/screens/public-url.js +2 -0
  46. package/dist/ui/screens/public-url.js.map +1 -1
  47. package/dist/ui/screens/social-share-data.d.ts +2 -2
  48. package/dist/ui/screens/social-share-data.d.ts.map +1 -1
  49. package/dist/ui/screens/social-share-data.js +3 -12
  50. package/dist/ui/screens/social-share-data.js.map +1 -1
  51. package/migrations/0001_create_cms_tables.sql +4 -4
  52. package/migrations/0017_content_pages.sql +138 -0
  53. package/package.json +1 -1
  54. package/src/engine/publisher.ts +45 -9
  55. package/src/routes/content.ts +40 -26
  56. package/src/schema/migrations.ts +148 -4
  57. package/src/schema/types.ts +2 -2
  58. package/src/ui/commands.ts +3 -1
  59. package/src/ui/components/SharePickers.tsx +13 -10
  60. package/src/ui/editor/ContentForm.tsx +7 -7
  61. package/src/ui/editor/content-payload.ts +2 -2
  62. package/src/ui/preview/draft-page.tsx +7 -4
  63. package/src/ui/screens/EditorScreen.tsx +13 -7
  64. package/src/ui/screens/LibraryScreen.tsx +6 -3
  65. package/src/ui/screens/SocialShareScreen.tsx +4 -2
  66. package/src/ui/screens/content-view.ts +3 -1
  67. package/src/ui/screens/public-url.ts +2 -0
  68. package/src/ui/screens/social-share-data.ts +4 -13
@@ -1 +1 @@
1
- {"version":3,"file":"social-share-data.js","sourceRoot":"","sources":["../../../src/ui/screens/social-share-data.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"social-share-data.js","sourceRoot":"","sources":["../../../src/ui/screens/social-share-data.ts"],"names":[],"mappings":"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"}
@@ -21,13 +21,13 @@
21
21
  -- (`publish_tz='Europe/Paris'`, `media_assets.site_id='fronts'`); they are kept
22
22
  -- as DEFAULTs only to match prod exactly.
23
23
 
24
- -- content_items — core. type CHECK includes 'newsletter' (prod 0024); status
25
- -- draft/scheduled/published/archived; visibility free/premium. `channel` and
24
+ -- content_items — core. type CHECK includes 'newsletter' and 'page'; status
25
+ -- draft/scheduled/review/published/archived; visibility free/premium. `channel` and
26
26
  -- `primary_topic` are theme-token taxonomy.
27
27
  CREATE TABLE content_items (
28
28
  id TEXT PRIMARY KEY,
29
- type TEXT NOT NULL CHECK (type IN ('article','video','podcast','newsletter')),
30
- status TEXT NOT NULL CHECK (status IN ('draft','scheduled','published','archived')),
29
+ type TEXT NOT NULL CHECK (type IN ('article','video','podcast','newsletter','page')),
30
+ status TEXT NOT NULL CHECK (status IN ('draft','scheduled','review','published','archived')),
31
31
  visibility TEXT NOT NULL CHECK (visibility IN ('free','premium')),
32
32
  slug TEXT NOT NULL UNIQUE,
33
33
  title TEXT NOT NULL,
@@ -0,0 +1,138 @@
1
+ -- 0017_content_pages: rebuild content_items with widened type CHECK for pages.
2
+ PRAGMA defer_foreign_keys = ON;
3
+ CREATE TABLE IF NOT EXISTS _cms0017_bk_content_items AS SELECT
4
+ id, type, status, visibility, slug, title, seo_title, description, excerpt,
5
+ byline, channel, primary_topic, featured, author_id, hero_image_id,
6
+ hero_image_alt, hero_image_caption, social_image_id, canonical_url,
7
+ publish_at, published_at, created_at, updated_at, publish_tz,
8
+ ai_locked_fields, published_revision_id, deleted_at, board_position,
9
+ seo_score, seo_focus_keyword, ai_og_image_id
10
+ FROM content_items;
11
+ DROP TABLE IF EXISTS content_items_new;
12
+ CREATE TABLE content_items_new (
13
+ id TEXT PRIMARY KEY,
14
+ type TEXT NOT NULL CHECK (type IN ('article','video','podcast','newsletter','page')),
15
+ status TEXT NOT NULL CHECK (status IN ('draft','scheduled','review','published','archived')),
16
+ visibility TEXT NOT NULL CHECK (visibility IN ('free','premium')),
17
+ slug TEXT NOT NULL UNIQUE,
18
+ title TEXT NOT NULL,
19
+ seo_title TEXT,
20
+ description TEXT,
21
+ excerpt TEXT,
22
+ byline TEXT,
23
+ channel TEXT,
24
+ primary_topic TEXT,
25
+ featured INTEGER NOT NULL DEFAULT 0,
26
+ author_id TEXT,
27
+ hero_image_id TEXT,
28
+ hero_image_alt TEXT,
29
+ hero_image_caption TEXT,
30
+ social_image_id TEXT,
31
+ canonical_url TEXT,
32
+ publish_at INTEGER,
33
+ published_at INTEGER,
34
+ created_at INTEGER NOT NULL DEFAULT (unixepoch()),
35
+ updated_at INTEGER NOT NULL DEFAULT (unixepoch()),
36
+ publish_tz TEXT NOT NULL DEFAULT 'Europe/Paris',
37
+ ai_locked_fields TEXT NOT NULL DEFAULT '[]',
38
+ published_revision_id TEXT,
39
+ deleted_at INTEGER,
40
+ board_position INTEGER,
41
+ seo_score INTEGER,
42
+ seo_focus_keyword TEXT,
43
+ ai_og_image_id TEXT,
44
+ FOREIGN KEY (author_id) REFERENCES authors(id)
45
+ );
46
+ INSERT INTO content_items_new (
47
+ id, type, status, visibility, slug, title, seo_title, description, excerpt,
48
+ byline, channel, primary_topic, featured, author_id, hero_image_id,
49
+ hero_image_alt, hero_image_caption, social_image_id, canonical_url,
50
+ publish_at, published_at, created_at, updated_at, publish_tz,
51
+ ai_locked_fields, published_revision_id, deleted_at, board_position,
52
+ seo_score, seo_focus_keyword, ai_og_image_id
53
+ ) SELECT
54
+ id, type, status, visibility, slug, title, seo_title, description, excerpt,
55
+ byline, channel, primary_topic, featured, author_id, hero_image_id,
56
+ hero_image_alt, hero_image_caption, social_image_id, canonical_url,
57
+ publish_at, published_at, created_at, updated_at, publish_tz,
58
+ ai_locked_fields, published_revision_id, deleted_at, board_position,
59
+ seo_score, seo_focus_keyword, ai_og_image_id
60
+ FROM _cms0017_bk_content_items;
61
+ CREATE TABLE IF NOT EXISTS _cms0017_bk_article_content AS SELECT * FROM article_content;
62
+ CREATE TABLE IF NOT EXISTS _cms0017_bk_video_content AS SELECT * FROM video_content;
63
+ CREATE TABLE IF NOT EXISTS _cms0017_bk_podcast_content AS SELECT * FROM podcast_content;
64
+ CREATE TABLE IF NOT EXISTS _cms0017_bk_content_revisions AS SELECT * FROM content_revisions;
65
+ CREATE TABLE IF NOT EXISTS _cms0017_bk_content_tag_links AS SELECT * FROM content_tag_links;
66
+ CREATE TABLE IF NOT EXISTS _cms0017_bk_content_relations AS SELECT * FROM content_relations;
67
+ CREATE TABLE IF NOT EXISTS _cms0017_bk_content_contributors AS SELECT * FROM content_contributors;
68
+ CREATE TABLE IF NOT EXISTS _cms0017_bk_content_slug_redirects AS SELECT * FROM content_slug_redirects;
69
+ CREATE TABLE IF NOT EXISTS content_items (
70
+ id TEXT PRIMARY KEY,
71
+ type TEXT NOT NULL CHECK (type IN ('article','video','podcast','newsletter','page')),
72
+ status TEXT NOT NULL CHECK (status IN ('draft','scheduled','review','published','archived')),
73
+ visibility TEXT NOT NULL CHECK (visibility IN ('free','premium')),
74
+ slug TEXT NOT NULL UNIQUE,
75
+ title TEXT NOT NULL,
76
+ seo_title TEXT,
77
+ description TEXT,
78
+ excerpt TEXT,
79
+ byline TEXT,
80
+ channel TEXT,
81
+ primary_topic TEXT,
82
+ featured INTEGER NOT NULL DEFAULT 0,
83
+ author_id TEXT,
84
+ hero_image_id TEXT,
85
+ hero_image_alt TEXT,
86
+ hero_image_caption TEXT,
87
+ social_image_id TEXT,
88
+ canonical_url TEXT,
89
+ publish_at INTEGER,
90
+ published_at INTEGER,
91
+ created_at INTEGER NOT NULL DEFAULT (unixepoch()),
92
+ updated_at INTEGER NOT NULL DEFAULT (unixepoch()),
93
+ publish_tz TEXT NOT NULL DEFAULT 'Europe/Paris',
94
+ ai_locked_fields TEXT NOT NULL DEFAULT '[]',
95
+ published_revision_id TEXT,
96
+ deleted_at INTEGER,
97
+ board_position INTEGER,
98
+ seo_score INTEGER,
99
+ seo_focus_keyword TEXT,
100
+ ai_og_image_id TEXT,
101
+ FOREIGN KEY (author_id) REFERENCES authors(id)
102
+ );
103
+ DELETE FROM article_content;
104
+ DELETE FROM video_content;
105
+ DELETE FROM podcast_content;
106
+ DELETE FROM content_revisions;
107
+ DELETE FROM content_tag_links;
108
+ DELETE FROM content_relations;
109
+ DELETE FROM content_contributors;
110
+ DELETE FROM content_slug_redirects;
111
+ DROP TABLE IF EXISTS content_items;
112
+ ALTER TABLE content_items_new RENAME TO content_items;
113
+ INSERT INTO article_content SELECT * FROM _cms0017_bk_article_content;
114
+ INSERT INTO video_content SELECT * FROM _cms0017_bk_video_content;
115
+ INSERT INTO podcast_content SELECT * FROM _cms0017_bk_podcast_content;
116
+ INSERT INTO content_revisions SELECT * FROM _cms0017_bk_content_revisions;
117
+ INSERT INTO content_tag_links SELECT * FROM _cms0017_bk_content_tag_links;
118
+ INSERT INTO content_relations SELECT * FROM _cms0017_bk_content_relations;
119
+ INSERT INTO content_contributors SELECT * FROM _cms0017_bk_content_contributors;
120
+ INSERT INTO content_slug_redirects SELECT * FROM _cms0017_bk_content_slug_redirects;
121
+ DROP TABLE _cms0017_bk_article_content;
122
+ DROP TABLE _cms0017_bk_video_content;
123
+ DROP TABLE _cms0017_bk_podcast_content;
124
+ DROP TABLE _cms0017_bk_content_revisions;
125
+ DROP TABLE _cms0017_bk_content_tag_links;
126
+ DROP TABLE _cms0017_bk_content_relations;
127
+ DROP TABLE _cms0017_bk_content_contributors;
128
+ DROP TABLE _cms0017_bk_content_slug_redirects;
129
+ DROP TABLE _cms0017_bk_content_items;
130
+ CREATE INDEX IF NOT EXISTS idx_content_items_status ON content_items(status);
131
+ CREATE INDEX IF NOT EXISTS idx_content_items_type ON content_items(type);
132
+ CREATE INDEX IF NOT EXISTS idx_content_items_publish_at ON content_items(publish_at DESC);
133
+ CREATE INDEX IF NOT EXISTS idx_content_items_channel ON content_items(channel);
134
+ CREATE INDEX IF NOT EXISTS idx_content_items_author_id ON content_items(author_id);
135
+ CREATE INDEX IF NOT EXISTS idx_content_items_topic_status_type_published
136
+ ON content_items(primary_topic, status, type, published_at DESC);
137
+ CREATE INDEX IF NOT EXISTS idx_content_items_published_at ON content_items(published_at DESC);
138
+ CREATE INDEX IF NOT EXISTS idx_content_items_deleted_at ON content_items(deleted_at);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@growth-labs/cms",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "type": "module",
5
5
  "types": "./dist/index.d.ts",
6
6
  "exports": {
@@ -19,12 +19,17 @@
19
19
  // timestamps; the video copy hard-codes `processing_state = 'ready'` so a
20
20
  // duplicate is NOT re-queued to Foundry. Any future `content_items` column
21
21
  // addition requires a matching edit here or the duplicate silently drops it.
22
+ import type { ContentType } from '../schema/types.js'
22
23
  import type { D1Database } from './d1.js'
23
24
  import { evaluateArticleBody, type PublishGuardOutcome } from './publish-guard.js'
24
25
  import { slugify } from './slug.js'
25
26
 
26
- type ContentType = 'article' | 'video' | 'podcast' | 'newsletter'
27
27
  type ContentVisibility = 'free' | 'premium'
28
+ type BodyBackedContentType = 'article' | 'newsletter' | 'page'
29
+
30
+ function isBodyBackedContentType(type: ContentType): type is BodyBackedContentType {
31
+ return type === 'article' || type === 'newsletter' || type === 'page'
32
+ }
28
33
 
29
34
  /**
30
35
  * The processing_state a freshly created video starts in. Mirrors
@@ -137,10 +142,39 @@ export interface NewsletterInput extends BaseContentInput {
137
142
  }
138
143
  }
139
144
 
140
- export type CreateContentInput = ArticleInput | VideoInput | PodcastInput | NewsletterInput
145
+ export interface PageInput extends BaseContentInput {
146
+ type: 'page'
147
+ content: {
148
+ bodyMarkdown: string
149
+ bodyHtml?: string | null
150
+ subtitle?: string | null
151
+ wordCount?: number | null
152
+ readTimeMinutes?: number | null
153
+ editorTakeaways?: string[] | null
154
+ }
155
+ }
156
+
157
+ export type CreateContentInput =
158
+ | ArticleInput
159
+ | VideoInput
160
+ | PodcastInput
161
+ | NewsletterInput
162
+ | PageInput
163
+
164
+ type BodyBackedContentInput = ArticleInput | NewsletterInput | PageInput
165
+
166
+ function isBodyBackedContentInput(input: CreateContentInput): input is BodyBackedContentInput {
167
+ return isBodyBackedContentType(input.type)
168
+ }
141
169
 
142
170
  export interface UpdateContentInput extends Partial<BaseContentInput> {
143
- content?: Partial<ArticleInput['content'] | VideoInput['content'] | PodcastInput['content']>
171
+ content?: Partial<
172
+ | ArticleInput['content']
173
+ | VideoInput['content']
174
+ | PodcastInput['content']
175
+ | NewsletterInput['content']
176
+ | PageInput['content']
177
+ >
144
178
  relations?: Array<{
145
179
  relatedId: string
146
180
  rank: number
@@ -342,7 +376,7 @@ export async function createContent(
342
376
  )
343
377
  .run()
344
378
 
345
- if (input.type === 'article' || input.type === 'newsletter') {
379
+ if (isBodyBackedContentInput(input)) {
346
380
  const wc = input.content.wordCount ?? countWords(input.content.bodyMarkdown)
347
381
  const rt = input.content.readTimeMinutes ?? estimateReadTime(wc)
348
382
  await db
@@ -530,7 +564,7 @@ export async function updateContentItem(
530
564
  }
531
565
 
532
566
  if (input.content) {
533
- if (existing.type === 'article' || existing.type === 'newsletter') {
567
+ if (isBodyBackedContentType(existing.type)) {
534
568
  const current = await db
535
569
  .prepare(
536
570
  `
@@ -551,7 +585,9 @@ export async function updateContentItem(
551
585
  }>()
552
586
  if (!current) return { slug }
553
587
 
554
- const articleContent = input.content as Partial<ArticleInput['content']>
588
+ const articleContent = input.content as Partial<
589
+ ArticleInput['content'] | NewsletterInput['content'] | PageInput['content']
590
+ >
555
591
  const bodyMarkdownProvided = hasOwn(articleContent, 'bodyMarkdown')
556
592
  const wordCountProvided = hasOwn(articleContent, 'wordCount')
557
593
  const readTimeProvided = hasOwn(articleContent, 'readTimeMinutes')
@@ -779,7 +815,7 @@ export async function evaluateContentBodyForPublish(
779
815
  body_html: string | null
780
816
  }>()
781
817
 
782
- if (!row || (row.type !== 'article' && row.type !== 'newsletter')) {
818
+ if (!row || !isBodyBackedContentType(row.type)) {
783
819
  return null
784
820
  }
785
821
 
@@ -906,7 +942,7 @@ export async function duplicateContentItem(
906
942
  .bind(newId, newSlug, sourceId)
907
943
  .run()
908
944
 
909
- if (source.type === 'article' || source.type === 'newsletter') {
945
+ if (isBodyBackedContentType(source.type)) {
910
946
  // INSERT…SELECT copy #2 — article_content. Body + editor takeaways + the
911
947
  // generated faq_json carry across so the duplicate keeps its SEO/FAQ work.
912
948
  await db
@@ -988,7 +1024,7 @@ export async function getContentSnapshot(
988
1024
  const type = base.type as ContentType
989
1025
  let content: Record<string, unknown> | null = null
990
1026
 
991
- if (type === 'article' || type === 'newsletter') {
1027
+ if (isBodyBackedContentType(type)) {
992
1028
  content = await db
993
1029
  .prepare('SELECT * FROM article_content WHERE content_id = ? LIMIT 1')
994
1030
  .bind(contentId)
@@ -126,7 +126,7 @@ export interface ContentRouteConfig extends CmsRouteConfig {
126
126
  const PUBLISH_TIMEZONE_FALLBACK = 'Europe/Paris'
127
127
  const LOCAL_DATE_TIME_RE = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})$/
128
128
 
129
- type ContentType = 'article' | 'video' | 'podcast' | 'newsletter'
129
+ type ContentType = 'article' | 'video' | 'podcast' | 'newsletter' | 'page'
130
130
 
131
131
  /**
132
132
  * Map a content `action` verb (the ?action= query value) to the capability the
@@ -157,15 +157,18 @@ function mapActionToCapability(action: string | null, type: ContentType): Conten
157
157
  }
158
158
  }
159
159
 
160
- const parseTypes = (value: string | null): ContentType[] | undefined => {
161
- if (!value) return undefined
162
- const allowed: ContentType[] = ['article', 'video', 'podcast', 'newsletter']
160
+ const parseTypes = (
161
+ value: string | null,
162
+ ): { ok: true; types: ContentType[] | undefined } | { ok: false; invalidTypes: string[] } => {
163
+ if (!value) return { ok: true, types: undefined }
164
+ const allowed: ContentType[] = ['article', 'video', 'podcast', 'newsletter', 'page']
163
165
  const parts = value
164
166
  .split(',')
165
167
  .map((item) => item.trim())
166
- .filter(Boolean) as ContentType[]
167
- const filtered = parts.filter((part) => allowed.includes(part))
168
- return filtered.length > 0 ? filtered : undefined
168
+ .filter(Boolean)
169
+ const invalidTypes = parts.filter((part) => !allowed.includes(part as ContentType))
170
+ if (invalidTypes.length > 0) return { ok: false, invalidTypes }
171
+ return { ok: true, types: parts.length > 0 ? (parts as ContentType[]) : undefined }
169
172
  }
170
173
 
171
174
  const parseStatus = (value: string | null): ContentStatus | undefined => {
@@ -214,6 +217,15 @@ function slugEnum(values: readonly string[] | null) {
214
217
  : z.string().min(1)
215
218
  }
216
219
 
220
+ const BodyContentCreateSchema = z.object({
221
+ bodyMarkdown: z.string().min(1),
222
+ bodyHtml: z.string().optional().nullable(),
223
+ subtitle: z.string().optional().nullable(),
224
+ wordCount: z.number().int().optional().nullable(),
225
+ readTimeMinutes: z.number().int().optional().nullable(),
226
+ editorTakeaways: z.array(z.string().min(1)).max(4).optional().nullable(),
227
+ })
228
+
217
229
  function buildSchemas(resolved: ReturnType<typeof resolveConfig>) {
218
230
  const category = slugEnum(resolved.primaryCategorySlugs)
219
231
  const topic = slugEnum(resolved.primaryTopicSlugs)
@@ -241,14 +253,7 @@ function buildSchemas(resolved: ReturnType<typeof resolveConfig>) {
241
253
  const CreateSchema = z.discriminatedUnion('type', [
242
254
  BaseSchema.extend({
243
255
  type: z.literal('article'),
244
- content: z.object({
245
- bodyMarkdown: z.string().min(1),
246
- bodyHtml: z.string().optional().nullable(),
247
- subtitle: z.string().optional().nullable(),
248
- wordCount: z.number().int().optional().nullable(),
249
- readTimeMinutes: z.number().int().optional().nullable(),
250
- editorTakeaways: z.array(z.string().min(1)).max(4).optional().nullable(),
251
- }),
256
+ content: BodyContentCreateSchema,
252
257
  }),
253
258
  BaseSchema.extend({
254
259
  type: z.literal('video'),
@@ -275,14 +280,11 @@ function buildSchemas(resolved: ReturnType<typeof resolveConfig>) {
275
280
  }),
276
281
  BaseSchema.extend({
277
282
  type: z.literal('newsletter'),
278
- content: z.object({
279
- bodyMarkdown: z.string().min(1),
280
- bodyHtml: z.string().optional().nullable(),
281
- subtitle: z.string().optional().nullable(),
282
- wordCount: z.number().int().optional().nullable(),
283
- readTimeMinutes: z.number().int().optional().nullable(),
284
- editorTakeaways: z.array(z.string().min(1)).max(4).optional().nullable(),
285
- }),
283
+ content: BodyContentCreateSchema,
284
+ }),
285
+ BaseSchema.extend({
286
+ type: z.literal('page'),
287
+ content: BodyContentCreateSchema,
286
288
  }),
287
289
  ])
288
290
 
@@ -348,6 +350,7 @@ function getContentUpdateSchema(type: string) {
348
350
  switch (type) {
349
351
  case 'article':
350
352
  case 'newsletter':
353
+ case 'page':
351
354
  return ArticleContentUpdateSchema
352
355
  case 'video':
353
356
  return VideoContentUpdateSchema
@@ -521,7 +524,7 @@ function parseLocalDateTimeInZoneToUnixSeconds(value: string, timeZone: string):
521
524
  // --- read-side payload helpers (ported verbatim) --------------------------
522
525
 
523
526
  async function getContentPayload(ctx: RouteContext, type: string, id: string) {
524
- if (type === 'article' || type === 'newsletter') {
527
+ if (type === 'article' || type === 'newsletter' || type === 'page') {
525
528
  return ctx.db
526
529
  .prepare(
527
530
  `SELECT body_markdown, body_html, word_count, read_time_minutes, subtitle,
@@ -760,7 +763,14 @@ export function createContentRoutes(config: ContentRouteConfig): ContentRouteHan
760
763
  const url = new URL(ctx.request.url)
761
764
  const limit = Math.min(Number(url.searchParams.get('limit') || '20'), 50)
762
765
  const status = parseStatus(url.searchParams.get('status'))
763
- const types = parseTypes(url.searchParams.get('types'))
766
+ const parsedTypes = parseTypes(url.searchParams.get('types'))
767
+ if (!parsedTypes.ok) {
768
+ return json(
769
+ { error: 'Invalid content type filter', invalidTypes: parsedTypes.invalidTypes },
770
+ 400,
771
+ )
772
+ }
773
+ const types = parsedTypes.types
764
774
  const cursor = parseCursor(url.searchParams.get('cursor'))
765
775
  const q = url.searchParams.get('q') || null
766
776
  const author = url.searchParams.get('author') || null
@@ -1080,7 +1090,11 @@ export function createContentRoutes(config: ContentRouteConfig): ContentRouteHan
1080
1090
  // the same check but allow empty bodies (the auto-save path needs to
1081
1091
  // persist work in progress); publish-time validation rejects empty
1082
1092
  // bodies separately.
1083
- if (existing.type === 'article' || existing.type === 'newsletter') {
1093
+ if (
1094
+ existing.type === 'article' ||
1095
+ existing.type === 'newsletter' ||
1096
+ existing.type === 'page'
1097
+ ) {
1084
1098
  const articleContent = contentParsed.data as {
1085
1099
  bodyMarkdown?: string
1086
1100
  bodyHtml?: string | null
@@ -22,8 +22,8 @@
22
22
  export const CMS_MIGRATION_SQL = `
23
23
  CREATE TABLE content_items (
24
24
  id TEXT PRIMARY KEY,
25
- type TEXT NOT NULL CHECK (type IN ('article','video','podcast','newsletter')),
26
- status TEXT NOT NULL CHECK (status IN ('draft','scheduled','published','archived')),
25
+ type TEXT NOT NULL CHECK (type IN ('article','video','podcast','newsletter','page')),
26
+ status TEXT NOT NULL CHECK (status IN ('draft','scheduled','review','published','archived')),
27
27
  visibility TEXT NOT NULL CHECK (visibility IN ('free','premium')),
28
28
  slug TEXT NOT NULL UNIQUE,
29
29
  title TEXT NOT NULL,
@@ -216,8 +216,10 @@ interface D1Like {
216
216
  * the parent rebuild, then restores the children from the stash. The explicit
217
217
  * DELETE/restore is the load-bearing, FK-action-independent fix; the prepended
218
218
  * `PRAGMA defer_foreign_keys = ON` is defense-in-depth only (it does not reliably
219
- * span the per-statement exec runner). On an empty DB the stash/delete/restore is
220
- * a no-op and the temp tables are dropped, so the net table set is unchanged.
219
+ * span the per-statement exec runner). Do not add SQL `BEGIN`/`COMMIT` here:
220
+ * D1's JavaScript API rejects explicit transaction statements and requires its
221
+ * storage transaction API instead. On an empty DB the stash/delete/restore is a
222
+ * no-op and the temp tables are dropped, so the net table set is unchanged.
221
223
  */
222
224
  export const CMS_MIGRATIONS_0002_PLUS: { id: string; sql: string }[] = [
223
225
  {
@@ -569,6 +571,148 @@ CREATE TABLE content_insight_dismissals (
569
571
  dismissed_by TEXT,
570
572
  PRIMARY KEY (site_id, intent_key)
571
573
  );
574
+ `,
575
+ },
576
+ {
577
+ id: '0017_content_pages',
578
+ sql: `
579
+ PRAGMA defer_foreign_keys = ON;
580
+ CREATE TABLE IF NOT EXISTS _cms0017_bk_content_items AS SELECT
581
+ id, type, status, visibility, slug, title, seo_title, description, excerpt,
582
+ byline, channel, primary_topic, featured, author_id, hero_image_id,
583
+ hero_image_alt, hero_image_caption, social_image_id, canonical_url,
584
+ publish_at, published_at, created_at, updated_at, publish_tz,
585
+ ai_locked_fields, published_revision_id, deleted_at, board_position,
586
+ seo_score, seo_focus_keyword, ai_og_image_id
587
+ FROM content_items;
588
+ DROP TABLE IF EXISTS content_items_new;
589
+ CREATE TABLE content_items_new (
590
+ id TEXT PRIMARY KEY,
591
+ type TEXT NOT NULL CHECK (type IN ('article','video','podcast','newsletter','page')),
592
+ status TEXT NOT NULL CHECK (status IN ('draft','scheduled','review','published','archived')),
593
+ visibility TEXT NOT NULL CHECK (visibility IN ('free','premium')),
594
+ slug TEXT NOT NULL UNIQUE,
595
+ title TEXT NOT NULL,
596
+ seo_title TEXT,
597
+ description TEXT,
598
+ excerpt TEXT,
599
+ byline TEXT,
600
+ channel TEXT,
601
+ primary_topic TEXT,
602
+ featured INTEGER NOT NULL DEFAULT 0,
603
+ author_id TEXT,
604
+ hero_image_id TEXT,
605
+ hero_image_alt TEXT,
606
+ hero_image_caption TEXT,
607
+ social_image_id TEXT,
608
+ canonical_url TEXT,
609
+ publish_at INTEGER,
610
+ published_at INTEGER,
611
+ created_at INTEGER NOT NULL DEFAULT (unixepoch()),
612
+ updated_at INTEGER NOT NULL DEFAULT (unixepoch()),
613
+ publish_tz TEXT NOT NULL DEFAULT 'Europe/Paris',
614
+ ai_locked_fields TEXT NOT NULL DEFAULT '[]',
615
+ published_revision_id TEXT,
616
+ deleted_at INTEGER,
617
+ board_position INTEGER,
618
+ seo_score INTEGER,
619
+ seo_focus_keyword TEXT,
620
+ ai_og_image_id TEXT,
621
+ FOREIGN KEY (author_id) REFERENCES authors(id)
622
+ );
623
+ INSERT INTO content_items_new (
624
+ id, type, status, visibility, slug, title, seo_title, description, excerpt,
625
+ byline, channel, primary_topic, featured, author_id, hero_image_id,
626
+ hero_image_alt, hero_image_caption, social_image_id, canonical_url,
627
+ publish_at, published_at, created_at, updated_at, publish_tz,
628
+ ai_locked_fields, published_revision_id, deleted_at, board_position,
629
+ seo_score, seo_focus_keyword, ai_og_image_id
630
+ ) SELECT
631
+ id, type, status, visibility, slug, title, seo_title, description, excerpt,
632
+ byline, channel, primary_topic, featured, author_id, hero_image_id,
633
+ hero_image_alt, hero_image_caption, social_image_id, canonical_url,
634
+ publish_at, published_at, created_at, updated_at, publish_tz,
635
+ ai_locked_fields, published_revision_id, deleted_at, board_position,
636
+ seo_score, seo_focus_keyword, ai_og_image_id
637
+ FROM _cms0017_bk_content_items;
638
+ CREATE TABLE IF NOT EXISTS _cms0017_bk_article_content AS SELECT * FROM article_content;
639
+ CREATE TABLE IF NOT EXISTS _cms0017_bk_video_content AS SELECT * FROM video_content;
640
+ CREATE TABLE IF NOT EXISTS _cms0017_bk_podcast_content AS SELECT * FROM podcast_content;
641
+ CREATE TABLE IF NOT EXISTS _cms0017_bk_content_revisions AS SELECT * FROM content_revisions;
642
+ CREATE TABLE IF NOT EXISTS _cms0017_bk_content_tag_links AS SELECT * FROM content_tag_links;
643
+ CREATE TABLE IF NOT EXISTS _cms0017_bk_content_relations AS SELECT * FROM content_relations;
644
+ CREATE TABLE IF NOT EXISTS _cms0017_bk_content_contributors AS SELECT * FROM content_contributors;
645
+ CREATE TABLE IF NOT EXISTS _cms0017_bk_content_slug_redirects AS SELECT * FROM content_slug_redirects;
646
+ CREATE TABLE IF NOT EXISTS content_items (
647
+ id TEXT PRIMARY KEY,
648
+ type TEXT NOT NULL CHECK (type IN ('article','video','podcast','newsletter','page')),
649
+ status TEXT NOT NULL CHECK (status IN ('draft','scheduled','review','published','archived')),
650
+ visibility TEXT NOT NULL CHECK (visibility IN ('free','premium')),
651
+ slug TEXT NOT NULL UNIQUE,
652
+ title TEXT NOT NULL,
653
+ seo_title TEXT,
654
+ description TEXT,
655
+ excerpt TEXT,
656
+ byline TEXT,
657
+ channel TEXT,
658
+ primary_topic TEXT,
659
+ featured INTEGER NOT NULL DEFAULT 0,
660
+ author_id TEXT,
661
+ hero_image_id TEXT,
662
+ hero_image_alt TEXT,
663
+ hero_image_caption TEXT,
664
+ social_image_id TEXT,
665
+ canonical_url TEXT,
666
+ publish_at INTEGER,
667
+ published_at INTEGER,
668
+ created_at INTEGER NOT NULL DEFAULT (unixepoch()),
669
+ updated_at INTEGER NOT NULL DEFAULT (unixepoch()),
670
+ publish_tz TEXT NOT NULL DEFAULT 'Europe/Paris',
671
+ ai_locked_fields TEXT NOT NULL DEFAULT '[]',
672
+ published_revision_id TEXT,
673
+ deleted_at INTEGER,
674
+ board_position INTEGER,
675
+ seo_score INTEGER,
676
+ seo_focus_keyword TEXT,
677
+ ai_og_image_id TEXT,
678
+ FOREIGN KEY (author_id) REFERENCES authors(id)
679
+ );
680
+ DELETE FROM article_content;
681
+ DELETE FROM video_content;
682
+ DELETE FROM podcast_content;
683
+ DELETE FROM content_revisions;
684
+ DELETE FROM content_tag_links;
685
+ DELETE FROM content_relations;
686
+ DELETE FROM content_contributors;
687
+ DELETE FROM content_slug_redirects;
688
+ DROP TABLE IF EXISTS content_items;
689
+ ALTER TABLE content_items_new RENAME TO content_items;
690
+ INSERT INTO article_content SELECT * FROM _cms0017_bk_article_content;
691
+ INSERT INTO video_content SELECT * FROM _cms0017_bk_video_content;
692
+ INSERT INTO podcast_content SELECT * FROM _cms0017_bk_podcast_content;
693
+ INSERT INTO content_revisions SELECT * FROM _cms0017_bk_content_revisions;
694
+ INSERT INTO content_tag_links SELECT * FROM _cms0017_bk_content_tag_links;
695
+ INSERT INTO content_relations SELECT * FROM _cms0017_bk_content_relations;
696
+ INSERT INTO content_contributors SELECT * FROM _cms0017_bk_content_contributors;
697
+ INSERT INTO content_slug_redirects SELECT * FROM _cms0017_bk_content_slug_redirects;
698
+ DROP TABLE _cms0017_bk_article_content;
699
+ DROP TABLE _cms0017_bk_video_content;
700
+ DROP TABLE _cms0017_bk_podcast_content;
701
+ DROP TABLE _cms0017_bk_content_revisions;
702
+ DROP TABLE _cms0017_bk_content_tag_links;
703
+ DROP TABLE _cms0017_bk_content_relations;
704
+ DROP TABLE _cms0017_bk_content_contributors;
705
+ DROP TABLE _cms0017_bk_content_slug_redirects;
706
+ DROP TABLE _cms0017_bk_content_items;
707
+ CREATE INDEX IF NOT EXISTS idx_content_items_status ON content_items(status);
708
+ CREATE INDEX IF NOT EXISTS idx_content_items_type ON content_items(type);
709
+ CREATE INDEX IF NOT EXISTS idx_content_items_publish_at ON content_items(publish_at DESC);
710
+ CREATE INDEX IF NOT EXISTS idx_content_items_channel ON content_items(channel);
711
+ CREATE INDEX IF NOT EXISTS idx_content_items_author_id ON content_items(author_id);
712
+ CREATE INDEX IF NOT EXISTS idx_content_items_topic_status_type_published
713
+ ON content_items(primary_topic, status, type, published_at DESC);
714
+ CREATE INDEX IF NOT EXISTS idx_content_items_published_at ON content_items(published_at DESC);
715
+ CREATE INDEX IF NOT EXISTS idx_content_items_deleted_at ON content_items(deleted_at);
572
716
  `,
573
717
  },
574
718
  ]
@@ -9,8 +9,8 @@
9
9
  // Nullability: a column declared NOT NULL maps to a required, non-nullable
10
10
  // field; a nullable column maps to `T | null` (D1 returns SQL NULL as JS null).
11
11
 
12
- /** content_items.type CHECK domain (includes 'newsletter' per prod 0024). */
13
- export type ContentType = 'article' | 'video' | 'podcast' | 'newsletter'
12
+ /** content_items.type CHECK domain. */
13
+ export type ContentType = 'article' | 'video' | 'podcast' | 'newsletter' | 'page'
14
14
 
15
15
  /** content_items.status CHECK domain. */
16
16
  export type ContentStatus = 'draft' | 'scheduled' | 'review' | 'published' | 'archived'