@prenta/core 8.9.2 → 8.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.
Files changed (290) hide show
  1. package/CHANGELOG.md +96 -0
  2. package/dist/actions.d.ts +25 -0
  3. package/dist/actions.d.ts.map +1 -1
  4. package/dist/actions.js +51 -4
  5. package/dist/actions.js.map +1 -1
  6. package/dist/ai/batch-links.d.ts +105 -0
  7. package/dist/ai/batch-links.d.ts.map +1 -0
  8. package/dist/ai/batch-links.js +667 -0
  9. package/dist/ai/batch-links.js.map +1 -0
  10. package/dist/ai/batch-list.d.ts +127 -4
  11. package/dist/ai/batch-list.d.ts.map +1 -1
  12. package/dist/ai/batch-list.js +250 -14
  13. package/dist/ai/batch-list.js.map +1 -1
  14. package/dist/ai/providers/http.d.ts +4 -0
  15. package/dist/ai/providers/http.d.ts.map +1 -1
  16. package/dist/ai/providers/http.js +9 -8
  17. package/dist/ai/providers/http.js.map +1 -1
  18. package/dist/ai/tasks/editor-text.d.ts +39 -0
  19. package/dist/ai/tasks/editor-text.d.ts.map +1 -0
  20. package/dist/ai/tasks/editor-text.js +45 -0
  21. package/dist/ai/tasks/editor-text.js.map +1 -0
  22. package/dist/ai/tasks/link-embeddings.d.ts +22 -0
  23. package/dist/ai/tasks/link-embeddings.d.ts.map +1 -1
  24. package/dist/ai/tasks/link-embeddings.js +24 -10
  25. package/dist/ai/tasks/link-embeddings.js.map +1 -1
  26. package/dist/ai/usage.d.ts +7 -0
  27. package/dist/ai/usage.d.ts.map +1 -1
  28. package/dist/ai/usage.js +11 -0
  29. package/dist/ai/usage.js.map +1 -1
  30. package/dist/api/guarded-db.d.ts +6 -0
  31. package/dist/api/guarded-db.d.ts.map +1 -1
  32. package/dist/api/guarded-db.js +13 -1
  33. package/dist/api/guarded-db.js.map +1 -1
  34. package/dist/api/handlers.d.ts.map +1 -1
  35. package/dist/api/handlers.js +2 -0
  36. package/dist/api/handlers.js.map +1 -1
  37. package/dist/api/openapi.d.ts.map +1 -1
  38. package/dist/api/openapi.js +47 -0
  39. package/dist/api/openapi.js.map +1 -1
  40. package/dist/api/route-helpers/forms.d.ts.map +1 -1
  41. package/dist/api/route-helpers/forms.js +7 -1
  42. package/dist/api/route-helpers/forms.js.map +1 -1
  43. package/dist/api/routes/ai-authoring.d.ts.map +1 -1
  44. package/dist/api/routes/ai-authoring.js +1 -0
  45. package/dist/api/routes/ai-authoring.js.map +1 -1
  46. package/dist/api/routes/ai-seo.d.ts.map +1 -1
  47. package/dist/api/routes/ai-seo.js +20 -18
  48. package/dist/api/routes/ai-seo.js.map +1 -1
  49. package/dist/api/routes/media.d.ts.map +1 -1
  50. package/dist/api/routes/media.js +3 -1
  51. package/dist/api/routes/media.js.map +1 -1
  52. package/dist/api/routes/scheduling.d.ts.map +1 -1
  53. package/dist/api/routes/scheduling.js +33 -2
  54. package/dist/api/routes/scheduling.js.map +1 -1
  55. package/dist/appearance/color.d.ts +17 -0
  56. package/dist/appearance/color.d.ts.map +1 -1
  57. package/dist/appearance/color.js +162 -1
  58. package/dist/appearance/color.js.map +1 -1
  59. package/dist/appearance/index.d.ts +3 -3
  60. package/dist/appearance/index.d.ts.map +1 -1
  61. package/dist/appearance/index.js +2 -2
  62. package/dist/appearance/index.js.map +1 -1
  63. package/dist/appearance/resolve.d.ts.map +1 -1
  64. package/dist/appearance/resolve.js +4 -2
  65. package/dist/appearance/resolve.js.map +1 -1
  66. package/dist/appearance/theme-tokens.d.ts +60 -11
  67. package/dist/appearance/theme-tokens.d.ts.map +1 -1
  68. package/dist/appearance/theme-tokens.js +184 -175
  69. package/dist/appearance/theme-tokens.js.map +1 -1
  70. package/dist/appearance/types.d.ts +16 -2
  71. package/dist/appearance/types.d.ts.map +1 -1
  72. package/dist/astro-site.d.ts +1 -11
  73. package/dist/astro-site.d.ts.map +1 -1
  74. package/dist/astro-site.js +4 -0
  75. package/dist/astro-site.js.map +1 -1
  76. package/dist/auth/team.d.ts +1 -0
  77. package/dist/auth/team.d.ts.map +1 -1
  78. package/dist/auth/team.js +1 -1
  79. package/dist/auth/team.js.map +1 -1
  80. package/dist/cache/http.d.ts +20 -0
  81. package/dist/cache/http.d.ts.map +1 -1
  82. package/dist/cache/http.js +42 -0
  83. package/dist/cache/http.js.map +1 -1
  84. package/dist/chrome/announcement.d.ts +30 -0
  85. package/dist/chrome/announcement.d.ts.map +1 -0
  86. package/dist/chrome/announcement.js +190 -0
  87. package/dist/chrome/announcement.js.map +1 -0
  88. package/dist/chrome/codegen.d.ts +17 -0
  89. package/dist/chrome/codegen.d.ts.map +1 -0
  90. package/dist/chrome/codegen.js +96 -0
  91. package/dist/chrome/codegen.js.map +1 -0
  92. package/dist/chrome/contract.d.ts +142 -0
  93. package/dist/chrome/contract.d.ts.map +1 -0
  94. package/dist/chrome/contract.js +2 -0
  95. package/dist/chrome/contract.js.map +1 -0
  96. package/dist/chrome/memory-store.d.ts +15 -0
  97. package/dist/chrome/memory-store.d.ts.map +1 -0
  98. package/dist/chrome/memory-store.js +54 -0
  99. package/dist/chrome/memory-store.js.map +1 -0
  100. package/dist/chrome/parse.d.ts +36 -0
  101. package/dist/chrome/parse.d.ts.map +1 -0
  102. package/dist/chrome/parse.js +277 -0
  103. package/dist/chrome/parse.js.map +1 -0
  104. package/dist/chrome/prisma-store.d.ts +11 -0
  105. package/dist/chrome/prisma-store.d.ts.map +1 -0
  106. package/dist/chrome/prisma-store.js +48 -0
  107. package/dist/chrome/prisma-store.js.map +1 -0
  108. package/dist/chrome/public.d.ts +22 -0
  109. package/dist/chrome/public.d.ts.map +1 -0
  110. package/dist/chrome/public.js +181 -0
  111. package/dist/chrome/public.js.map +1 -0
  112. package/dist/chrome/resolve.d.ts +36 -0
  113. package/dist/chrome/resolve.d.ts.map +1 -0
  114. package/dist/chrome/resolve.js +165 -0
  115. package/dist/chrome/resolve.js.map +1 -0
  116. package/dist/chrome/revalidate.d.ts +9 -0
  117. package/dist/chrome/revalidate.d.ts.map +1 -0
  118. package/dist/chrome/revalidate.js +51 -0
  119. package/dist/chrome/revalidate.js.map +1 -0
  120. package/dist/chrome/routes.d.ts +14 -0
  121. package/dist/chrome/routes.d.ts.map +1 -0
  122. package/dist/chrome/routes.js +306 -0
  123. package/dist/chrome/routes.js.map +1 -0
  124. package/dist/chrome/schema.d.ts +231 -0
  125. package/dist/chrome/schema.d.ts.map +1 -0
  126. package/dist/chrome/schema.js +73 -0
  127. package/dist/chrome/schema.js.map +1 -0
  128. package/dist/chrome/service.d.ts +76 -0
  129. package/dist/chrome/service.d.ts.map +1 -0
  130. package/dist/chrome/service.js +286 -0
  131. package/dist/chrome/service.js.map +1 -0
  132. package/dist/chrome/settings.d.ts +14 -0
  133. package/dist/chrome/settings.d.ts.map +1 -0
  134. package/dist/chrome/settings.js +142 -0
  135. package/dist/chrome/settings.js.map +1 -0
  136. package/dist/chrome/store.d.ts +48 -0
  137. package/dist/chrome/store.d.ts.map +1 -0
  138. package/dist/chrome/store.js +26 -0
  139. package/dist/chrome/store.js.map +1 -0
  140. package/dist/chrome/values.d.ts +98 -0
  141. package/dist/chrome/values.d.ts.map +1 -0
  142. package/dist/chrome/values.js +491 -0
  143. package/dist/chrome/values.js.map +1 -0
  144. package/dist/config/define.d.ts +2 -0
  145. package/dist/config/define.d.ts.map +1 -1
  146. package/dist/config/define.js +2 -0
  147. package/dist/config/define.js.map +1 -1
  148. package/dist/db/model-types.d.ts +62 -0
  149. package/dist/db/model-types.d.ts.map +1 -1
  150. package/dist/forms/attribution-settings.d.ts +23 -0
  151. package/dist/forms/attribution-settings.d.ts.map +1 -0
  152. package/dist/forms/attribution-settings.js +42 -0
  153. package/dist/forms/attribution-settings.js.map +1 -0
  154. package/dist/forms/attribution.d.ts +5 -1
  155. package/dist/forms/attribution.d.ts.map +1 -1
  156. package/dist/forms/attribution.js +6 -4
  157. package/dist/forms/attribution.js.map +1 -1
  158. package/dist/forms/client-validation.d.ts.map +1 -1
  159. package/dist/forms/client-validation.js +3 -0
  160. package/dist/forms/client-validation.js.map +1 -1
  161. package/dist/forms/form-model.d.ts +109 -0
  162. package/dist/forms/form-model.d.ts.map +1 -0
  163. package/dist/forms/form-model.js +192 -0
  164. package/dist/forms/form-model.js.map +1 -0
  165. package/dist/forms/index.d.ts +2 -2
  166. package/dist/forms/index.d.ts.map +1 -1
  167. package/dist/forms/index.js +1 -1
  168. package/dist/forms/index.js.map +1 -1
  169. package/dist/forms/service.d.ts +19 -1
  170. package/dist/forms/service.d.ts.map +1 -1
  171. package/dist/forms/service.js +152 -0
  172. package/dist/forms/service.js.map +1 -1
  173. package/dist/forms/spam.d.ts +0 -12
  174. package/dist/forms/spam.d.ts.map +1 -1
  175. package/dist/forms/spam.js +30 -0
  176. package/dist/forms/spam.js.map +1 -1
  177. package/dist/forms/submission.d.ts +7 -0
  178. package/dist/forms/submission.d.ts.map +1 -1
  179. package/dist/forms/submission.js +33 -0
  180. package/dist/forms/submission.js.map +1 -1
  181. package/dist/forms/types.d.ts +26 -1
  182. package/dist/forms/types.d.ts.map +1 -1
  183. package/dist/forms/types.js +9 -1
  184. package/dist/forms/types.js.map +1 -1
  185. package/dist/generated/browser.d.ts +35 -3
  186. package/dist/generated/client.d.ts +35 -3
  187. package/dist/generated/internal/class.d.ts +44 -0
  188. package/dist/generated/internal/class.js +4 -4
  189. package/dist/generated/internal/prismaNamespace.d.ts +403 -1
  190. package/dist/generated/internal/prismaNamespace.js +95 -1
  191. package/dist/generated/internal/prismaNamespaceBrowser.d.ts +102 -0
  192. package/dist/generated/internal/prismaNamespaceBrowser.js +95 -1
  193. package/dist/generated/models/ChromeRegion.d.ts +1203 -0
  194. package/dist/generated/models/ChromeRegion.js +1 -0
  195. package/dist/generated/models/Job.d.ts +732 -5
  196. package/dist/generated/models/JobEvent.d.ts +1339 -0
  197. package/dist/generated/models/JobEvent.js +1 -0
  198. package/dist/generated/models/JobReviewItem.d.ts +1470 -0
  199. package/dist/generated/models/JobReviewItem.js +1 -0
  200. package/dist/generated/models/SystemSetting.d.ts +952 -0
  201. package/dist/generated/models/SystemSetting.js +1 -0
  202. package/dist/generated/models.d.ts +4 -0
  203. package/dist/index.d.ts +12 -5
  204. package/dist/index.d.ts.map +1 -1
  205. package/dist/index.js +8 -3
  206. package/dist/index.js.map +1 -1
  207. package/dist/jobs/batch-ai.d.ts +53 -0
  208. package/dist/jobs/batch-ai.d.ts.map +1 -0
  209. package/dist/jobs/batch-ai.js +314 -0
  210. package/dist/jobs/batch-ai.js.map +1 -0
  211. package/dist/jobs/contract.d.ts +186 -0
  212. package/dist/jobs/contract.d.ts.map +1 -0
  213. package/dist/jobs/contract.js +2 -0
  214. package/dist/jobs/contract.js.map +1 -0
  215. package/dist/jobs/error-text.d.ts +23 -0
  216. package/dist/jobs/error-text.d.ts.map +1 -0
  217. package/dist/jobs/error-text.js +110 -0
  218. package/dist/jobs/error-text.js.map +1 -0
  219. package/dist/jobs/handlers.d.ts.map +1 -1
  220. package/dist/jobs/handlers.js +48 -7
  221. package/dist/jobs/handlers.js.map +1 -1
  222. package/dist/jobs/memory-store.d.ts +26 -2
  223. package/dist/jobs/memory-store.d.ts.map +1 -1
  224. package/dist/jobs/memory-store.js +157 -3
  225. package/dist/jobs/memory-store.js.map +1 -1
  226. package/dist/jobs/outcomes.d.ts +46 -0
  227. package/dist/jobs/outcomes.d.ts.map +1 -0
  228. package/dist/jobs/outcomes.js +251 -0
  229. package/dist/jobs/outcomes.js.map +1 -0
  230. package/dist/jobs/prisma-store.d.ts +14 -2
  231. package/dist/jobs/prisma-store.d.ts.map +1 -1
  232. package/dist/jobs/prisma-store.js +257 -15
  233. package/dist/jobs/prisma-store.js.map +1 -1
  234. package/dist/jobs/queue.d.ts +62 -2
  235. package/dist/jobs/queue.d.ts.map +1 -1
  236. package/dist/jobs/queue.js +412 -36
  237. package/dist/jobs/queue.js.map +1 -1
  238. package/dist/jobs/retention.d.ts +11 -0
  239. package/dist/jobs/retention.d.ts.map +1 -0
  240. package/dist/jobs/retention.js +18 -0
  241. package/dist/jobs/retention.js.map +1 -0
  242. package/dist/jobs/review.d.ts +111 -0
  243. package/dist/jobs/review.d.ts.map +1 -0
  244. package/dist/jobs/review.js +461 -0
  245. package/dist/jobs/review.js.map +1 -0
  246. package/dist/jobs/routes.d.ts.map +1 -1
  247. package/dist/jobs/routes.js +491 -16
  248. package/dist/jobs/routes.js.map +1 -1
  249. package/dist/jobs/serialize.d.ts +40 -0
  250. package/dist/jobs/serialize.d.ts.map +1 -0
  251. package/dist/jobs/serialize.js +270 -0
  252. package/dist/jobs/serialize.js.map +1 -0
  253. package/dist/jobs/types.d.ts +141 -2
  254. package/dist/jobs/types.d.ts.map +1 -1
  255. package/dist/jobs/worker-status.d.ts +27 -0
  256. package/dist/jobs/worker-status.d.ts.map +1 -0
  257. package/dist/jobs/worker-status.js +66 -0
  258. package/dist/jobs/worker-status.js.map +1 -0
  259. package/dist/media/optimize.d.ts.map +1 -1
  260. package/dist/media/optimize.js +4 -2
  261. package/dist/media/optimize.js.map +1 -1
  262. package/dist/next-site.d.ts +1 -0
  263. package/dist/next-site.d.ts.map +1 -1
  264. package/dist/next-site.js +3 -0
  265. package/dist/next-site.js.map +1 -1
  266. package/dist/seo/audit-runner.d.ts.map +1 -1
  267. package/dist/seo/audit-runner.js +23 -2
  268. package/dist/seo/audit-runner.js.map +1 -1
  269. package/dist/seo/issue-fix-link-insert.d.ts +11 -0
  270. package/dist/seo/issue-fix-link-insert.d.ts.map +1 -1
  271. package/dist/seo/issue-fix-link-insert.js +122 -8
  272. package/dist/seo/issue-fix-link-insert.js.map +1 -1
  273. package/dist/server-site.d.ts.map +1 -1
  274. package/dist/server-site.js +15 -0
  275. package/dist/server-site.js.map +1 -1
  276. package/dist/site.d.ts +8 -0
  277. package/dist/site.d.ts.map +1 -1
  278. package/dist/site.js +6 -0
  279. package/dist/site.js.map +1 -1
  280. package/dist/webhooks/index.d.ts +3 -1
  281. package/dist/webhooks/index.d.ts.map +1 -1
  282. package/dist/webhooks/index.js.map +1 -1
  283. package/package.json +6 -1
  284. package/prisma/migrations/0025_job_cancel_review/down.sql +60 -0
  285. package/prisma/migrations/0025_job_cancel_review/migration.sql +56 -0
  286. package/prisma/migrations/0026_job_creator_system_settings/down.sql +30 -0
  287. package/prisma/migrations/0026_job_creator_system_settings/migration.sql +14 -0
  288. package/prisma/migrations/0027_chrome_regions/down.sql +24 -0
  289. package/prisma/migrations/0027_chrome_regions/migration.sql +16 -0
  290. package/prisma/schema.prisma +105 -15
@@ -0,0 +1,306 @@
1
+ import { guardedDb } from '../api/guarded-db.js';
2
+ import { ADMIN_ROLES, errorResponse, internalError, json, jsonWithCache, requireAuth, requireGlobalScope, requireRole, requireStaffAccess, } from '../api/route-helpers.js';
3
+ import { cachedRead } from '../cache/http.js';
4
+ import { getPrentaConfig } from '../config/runtime.js';
5
+ import { loadUserRefs } from '../jobs/serialize.js';
6
+ import { logEvent } from '../security/audit.js';
7
+ import { parseSchemaRead } from './parse.js';
8
+ import { PrismaChromeStore } from './prisma-store.js';
9
+ import { chromeReadTags, loadPublicChrome, normalizeChromePath } from './public.js';
10
+ import { revalidateChrome } from './revalidate.js';
11
+ import { CHROME_REGIONS } from './schema.js';
12
+ import { announcementEtag, getAnnouncement, getChromeSchema, getRegion, readChromeSchema, readIfMatch, regionEtag, removeOrphan, saveAnnouncement, saveRegion, } from './service.js';
13
+ import { getChromeSettings, saveChromeSettings } from './settings.js';
14
+ /** The API key global scope that covers `/chrome/*`. */
15
+ const CHROME_SCOPE = 'chrome';
16
+ /** Who can save chrome: a save is live at once, so the roles that can publish. */
17
+ const EDIT_ROLES = new Set(['OWNER', 'ADMIN', 'EDITOR']);
18
+ function isFailure(value) {
19
+ return typeof value === 'object' && value !== null && value.ok === false;
20
+ }
21
+ function failure(result) {
22
+ return errorResponse(result.error, result.status);
23
+ }
24
+ function withHeader(response, name, value) {
25
+ response.headers.set(name, value);
26
+ return response;
27
+ }
28
+ function regionParam(value) {
29
+ return CHROME_REGIONS.includes(value ?? '')
30
+ ? value
31
+ : null;
32
+ }
33
+ function decodeParam(value) {
34
+ try {
35
+ return decodeURIComponent(value ?? '');
36
+ }
37
+ catch {
38
+ return value ?? '';
39
+ }
40
+ }
41
+ async function readSession(request) {
42
+ const auth = await requireAuth(request);
43
+ if (auth.error)
44
+ return auth.error;
45
+ return requireGlobalScope(auth.session, CHROME_SCOPE) ?? auth.session;
46
+ }
47
+ async function writeSession(request, roles) {
48
+ const session = await readSession(request);
49
+ if (session instanceof Response)
50
+ return session;
51
+ // An API key's actions must allow the method, as on every other staff write.
52
+ return requireStaffAccess(session, request) ?? requireRole(session.role, roles) ?? session;
53
+ }
54
+ function serializeRegion(region, view, refs) {
55
+ const { row } = view;
56
+ return {
57
+ region,
58
+ variant: view.variant,
59
+ fields: row.values,
60
+ orphans: view.orphans,
61
+ updatedBy: row.updatedById ? (refs.get(row.updatedById) ?? null) : null,
62
+ updatedAt: row.updatedAt ? row.updatedAt.toISOString() : null,
63
+ };
64
+ }
65
+ function weakMatch(header, etag) {
66
+ if (!header)
67
+ return false;
68
+ return header.split(',').some((tag) => {
69
+ const value = tag.trim();
70
+ return value === '*' || value === etag || value.replace(/^W\//, '') === etag.replace(/^W\//, '');
71
+ });
72
+ }
73
+ export function registerChromeRoutes(router) {
74
+ const db = guardedDb;
75
+ const store = () => new PrismaChromeStore(db());
76
+ async function regionResponse(region, view, now) {
77
+ const refs = await loadUserRefs(db(), view.row.updatedById ? [view.row.updatedById] : []);
78
+ return withHeader(json({ data: serializeRegion(region, view, refs) }), 'ETag', regionEtag(view.row, now));
79
+ }
80
+ router.get('/chrome/schema', async (request) => {
81
+ try {
82
+ const session = await readSession(request);
83
+ if (session instanceof Response)
84
+ return session;
85
+ return json({ data: await getChromeSchema(store()) });
86
+ }
87
+ catch (err) {
88
+ return internalError(err, 'chrome schema');
89
+ }
90
+ });
91
+ router.put('/chrome/schema', async (request) => {
92
+ try {
93
+ const session = await writeSession(request, ADMIN_ROLES);
94
+ if (session instanceof Response)
95
+ return session;
96
+ const body = await request.json().catch(() => null);
97
+ const input = parseSchemaRead(body);
98
+ if (!input.ok)
99
+ return errorResponse(input.error, 400);
100
+ const result = await readChromeSchema(store(), input.value, {
101
+ userId: session.userId,
102
+ now: new Date(),
103
+ });
104
+ if (isFailure(result)) {
105
+ // A region before the one that failed may already be written, and pushing
106
+ // again won't see it as changed. Revalidating an unchanged region is harmless.
107
+ for (const region of CHROME_REGIONS)
108
+ await revalidateChrome(region);
109
+ return failure(result);
110
+ }
111
+ for (const region of result.regions) {
112
+ if (region.changed)
113
+ await revalidateChrome(region.region);
114
+ }
115
+ await logEvent({
116
+ event: 'settings_changed',
117
+ userId: session.userId,
118
+ details: {
119
+ action: 'chrome_schema_read',
120
+ commit: result.source.commit,
121
+ regions: result.regions.filter((region) => region.changed).map((region) => region.region),
122
+ },
123
+ });
124
+ return json({ data: result });
125
+ }
126
+ catch (err) {
127
+ return internalError(err, 'chrome schema read');
128
+ }
129
+ });
130
+ router.get('/chrome/settings', async (request) => {
131
+ try {
132
+ const session = await readSession(request);
133
+ if (session instanceof Response)
134
+ return session;
135
+ return json({
136
+ data: await getChromeSettings(db(), { admin: ADMIN_ROLES.has(session.role) }),
137
+ });
138
+ }
139
+ catch (err) {
140
+ return internalError(err, 'chrome settings');
141
+ }
142
+ });
143
+ router.put('/chrome/settings', async (request) => {
144
+ try {
145
+ const session = await writeSession(request, ADMIN_ROLES);
146
+ if (session instanceof Response)
147
+ return session;
148
+ const body = await request.json().catch(() => null);
149
+ const result = await saveChromeSettings(db(), body);
150
+ if (isFailure(result))
151
+ return failure(result);
152
+ await logEvent({
153
+ event: 'settings_changed',
154
+ userId: session.userId,
155
+ details: {
156
+ action: 'chrome_settings_changed',
157
+ revalidateUrl: result.settings.revalidateUrl,
158
+ },
159
+ });
160
+ return json({
161
+ data: { ...result.settings, ...(result.secret ? { secret: result.secret } : {}) },
162
+ });
163
+ }
164
+ catch (err) {
165
+ return internalError(err, 'chrome settings save');
166
+ }
167
+ });
168
+ router.get('/chrome/announcement', async (request) => {
169
+ try {
170
+ const session = await readSession(request);
171
+ if (session instanceof Response)
172
+ return session;
173
+ const { announcement } = await getAnnouncement(store());
174
+ return withHeader(json({ data: announcement }), 'ETag', announcementEtag(announcement));
175
+ }
176
+ catch (err) {
177
+ return internalError(err, 'chrome announcement');
178
+ }
179
+ });
180
+ router.put('/chrome/announcement', async (request) => {
181
+ try {
182
+ const session = await writeSession(request, EDIT_ROLES);
183
+ if (session instanceof Response)
184
+ return session;
185
+ const body = await request.json().catch(() => null);
186
+ const result = await saveAnnouncement(store(), body, {
187
+ userId: session.userId,
188
+ ifMatch: readIfMatch(request),
189
+ now: new Date(),
190
+ });
191
+ if (isFailure(result))
192
+ return failure(result);
193
+ await revalidateChrome('announcement');
194
+ return withHeader(json({ data: result.announcement }), 'ETag', announcementEtag(result.announcement));
195
+ }
196
+ catch (err) {
197
+ return internalError(err, 'chrome announcement save');
198
+ }
199
+ });
200
+ router.get('/chrome/:region', async (request, params) => {
201
+ try {
202
+ const session = await readSession(request);
203
+ if (session instanceof Response)
204
+ return session;
205
+ const region = regionParam(params.region);
206
+ if (!region)
207
+ return errorResponse('Unknown chrome region', 404);
208
+ const now = new Date();
209
+ const view = await getRegion(store(), region, now);
210
+ if (isFailure(view))
211
+ return failure(view);
212
+ return regionResponse(region, view, now);
213
+ }
214
+ catch (err) {
215
+ return internalError(err, 'chrome region');
216
+ }
217
+ });
218
+ router.put('/chrome/:region', async (request, params) => {
219
+ try {
220
+ const session = await writeSession(request, EDIT_ROLES);
221
+ if (session instanceof Response)
222
+ return session;
223
+ const region = regionParam(params.region);
224
+ if (!region)
225
+ return errorResponse('Unknown chrome region', 404);
226
+ const body = await request.json().catch(() => null);
227
+ const now = new Date();
228
+ const view = await saveRegion(store(), region, body, {
229
+ userId: session.userId,
230
+ ifMatch: readIfMatch(request),
231
+ now,
232
+ });
233
+ if (isFailure(view))
234
+ return failure(view);
235
+ await revalidateChrome(region);
236
+ return regionResponse(region, view, now);
237
+ }
238
+ catch (err) {
239
+ return internalError(err, 'chrome region save');
240
+ }
241
+ });
242
+ router.delete('/chrome/:region/orphans/:key', async (request, params) => {
243
+ try {
244
+ const session = await writeSession(request, EDIT_ROLES);
245
+ if (session instanceof Response)
246
+ return session;
247
+ const region = regionParam(params.region);
248
+ if (!region)
249
+ return errorResponse('Unknown chrome region', 404);
250
+ const now = new Date();
251
+ const view = await removeOrphan(store(), region, decodeParam(params.key), {
252
+ userId: session.userId,
253
+ now,
254
+ });
255
+ if (isFailure(view))
256
+ return failure(view);
257
+ // Orphans never reach the site, so there is nothing to revalidate.
258
+ return regionResponse(region, view, now);
259
+ }
260
+ catch (err) {
261
+ return internalError(err, 'chrome orphan remove');
262
+ }
263
+ });
264
+ // Public, for the site: site defaults, page overrides and the announcement
265
+ // schedule, resolved for one path. Cached like the other public reads, with
266
+ // an ETag so an unchanged chrome answers 304.
267
+ router.get('/public/chrome', async (request) => {
268
+ try {
269
+ const path = normalizeChromePath(new URL(request.url).searchParams.get('path'));
270
+ if (!path) {
271
+ return errorResponse('Send the page path, like ?path=/about', 400);
272
+ }
273
+ const config = getPrentaConfig();
274
+ return cachedRead(request, {
275
+ cache: config?.cache,
276
+ tags: chromeReadTags(config ?? null, path),
277
+ wrap: (payload, req) => {
278
+ const body = payload;
279
+ const etag = body.data.etag;
280
+ if (weakMatch(req.headers.get('if-none-match'), etag)) {
281
+ const notModified = new Response(null, { status: 304 });
282
+ const cacheControl = jsonWithCache(null, req).headers.get('Cache-Control');
283
+ if (cacheControl)
284
+ notModified.headers.set('Cache-Control', cacheControl);
285
+ notModified.headers.set('ETag', etag);
286
+ return notModified;
287
+ }
288
+ return withHeader(jsonWithCache(body, req), 'ETag', etag);
289
+ },
290
+ build: async () => ({
291
+ data: await loadPublicChrome({
292
+ db: db(),
293
+ store: store(),
294
+ config: config ?? null,
295
+ path,
296
+ now: new Date(),
297
+ }),
298
+ }),
299
+ });
300
+ }
301
+ catch (err) {
302
+ return internalError(err, 'public chrome');
303
+ }
304
+ });
305
+ }
306
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/chrome/routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,231 @@
1
+ /**
2
+ * Code-first site chrome (DATA_CONTRACTS §2). A site declares what editors may
3
+ * change in its header and footer with `defineRegion` and the `field.*`
4
+ * builders, imported from `@prenta/core/config`:
5
+ *
6
+ * export const header = defineRegion('header', {
7
+ * component: './src/components/site/Header.astro',
8
+ * variants: { default: 'Logo left, menu right', minimal: 'Logo + CTA' },
9
+ * fields: { menu: field.menu({ default: 'main' }), cta: field.link({ optional: true }) },
10
+ * })
11
+ *
12
+ * Markup stays in the site's components. `prenta push chrome` sends the
13
+ * serialized schema to the CMS on deploy, and the saved values are typed per
14
+ * region: `RegionFieldValues<typeof header>` for what the CMS stores,
15
+ * `ChromeFieldsOf<typeof header>` for what `getChrome` returns.
16
+ *
17
+ * This module has no runtime dependencies, so a site can import it anywhere.
18
+ */
19
+ import type { ResolvedLogo } from '../appearance/types.js';
20
+ import type { PublicNavItem } from '../site.js';
21
+ /** The regions a site can define. The announcement bar is CMS-owned. */
22
+ export declare const CHROME_REGIONS: readonly ["header", "footer"];
23
+ export type ChromeRegionName = (typeof CHROME_REGIONS)[number];
24
+ /** Options every field takes. */
25
+ export interface FieldCommon {
26
+ label?: string;
27
+ help?: string;
28
+ /** The key this field had before. Its saved value moves over on the next schema read. */
29
+ renamedFrom?: string;
30
+ }
31
+ /** Read-only. The value comes from Settings > Brand. */
32
+ export interface BrandFieldDef extends FieldCommon {
33
+ type: 'brand';
34
+ key: 'logo' | 'name';
35
+ }
36
+ /** A menu, by its slug. `list` picks up to `max` menus (footer columns). */
37
+ export interface MenuFieldDef extends FieldCommon {
38
+ type: 'menu';
39
+ optional?: boolean;
40
+ list?: boolean;
41
+ max?: number;
42
+ default?: string;
43
+ }
44
+ export interface LinkFieldDef extends FieldCommon {
45
+ type: 'link';
46
+ optional?: boolean;
47
+ }
48
+ export interface TextFieldDef extends FieldCommon {
49
+ type: 'text';
50
+ optional?: boolean;
51
+ format?: 'tel' | 'email';
52
+ /** Placeholders the CMS fills in, such as `{year}`. */
53
+ tokens?: readonly string[];
54
+ max?: number;
55
+ }
56
+ export interface TextareaFieldDef extends FieldCommon {
57
+ type: 'textarea';
58
+ max?: number;
59
+ }
60
+ export interface SelectFieldDef<O extends string = string> extends FieldCommon {
61
+ type: 'select';
62
+ options: readonly O[];
63
+ default?: O;
64
+ }
65
+ export interface BooleanFieldDef extends FieldCommon {
66
+ type: 'boolean';
67
+ default?: boolean;
68
+ }
69
+ /** A list of `{ platform, url }` links. */
70
+ export interface SocialFieldDef extends FieldCommon {
71
+ type: 'social';
72
+ }
73
+ export type FieldDef = BrandFieldDef | MenuFieldDef | LinkFieldDef | TextFieldDef | TextareaFieldDef | SelectFieldDef | BooleanFieldDef | SocialFieldDef;
74
+ export type FieldType = FieldDef['type'];
75
+ export interface RegionDefinition<N extends ChromeRegionName = ChromeRegionName, V extends string = string, F extends Record<string, FieldDef> = Record<string, FieldDef>> {
76
+ region: N;
77
+ /** Path of the component that renders the region, shown in the CMS. */
78
+ component: string;
79
+ /** Variant id → label. The first one is the site default until an editor picks another. */
80
+ variants: Record<V, string>;
81
+ fields: F;
82
+ }
83
+ type Options<T extends FieldDef> = Omit<T, 'type'>;
84
+ /** A builder called without options. */
85
+ type NoOptions = Record<never, never>;
86
+ /**
87
+ * Field builders. Each keeps its options as literal types, so
88
+ * `field.link({ optional: true })` stores `{ on, label, url }` and
89
+ * `field.select(['dark', 'light'])` stores `'dark' | 'light'`.
90
+ */
91
+ export declare const field: {
92
+ brand<const K extends BrandFieldDef["key"]>(key: K, options?: FieldCommon): {
93
+ type: "brand";
94
+ key: K;
95
+ };
96
+ menu<const O extends Options<MenuFieldDef> = NoOptions>(options?: O): {
97
+ type: "menu";
98
+ } & O;
99
+ link<const O extends Options<LinkFieldDef> = NoOptions>(options?: O): {
100
+ type: "link";
101
+ } & O;
102
+ text<const O extends Options<TextFieldDef> = NoOptions>(options?: O): {
103
+ type: "text";
104
+ } & O;
105
+ textarea<const O extends Options<TextareaFieldDef> = NoOptions>(options?: O): {
106
+ type: "textarea";
107
+ } & O;
108
+ select<const T extends string, const O extends Omit<Options<SelectFieldDef<T>>, "options" | "default"> & {
109
+ default?: NoInfer<T>;
110
+ } = NoOptions>(options: readonly T[], extra?: O): {
111
+ type: "select";
112
+ options: T[];
113
+ } & O;
114
+ boolean<const O extends Options<BooleanFieldDef> = NoOptions>(options?: O): {
115
+ type: "boolean";
116
+ } & O;
117
+ social<const O extends Options<SocialFieldDef> = NoOptions>(options?: O): {
118
+ type: "social";
119
+ } & O;
120
+ };
121
+ /**
122
+ * Declare an editable region. The returned object is plain data plus a hidden
123
+ * marker, so `prenta push chrome` can find every region a config exports.
124
+ */
125
+ export declare function defineRegion<const N extends ChromeRegionName, const V extends string, const F extends Record<string, FieldDef>>(name: N, definition: {
126
+ component: string;
127
+ variants: Record<V, string>;
128
+ fields: F;
129
+ }): RegionDefinition<N, V, F>;
130
+ /** Whether a value came from `defineRegion`. */
131
+ export declare function isRegionDefinition(value: unknown): value is RegionDefinition;
132
+ /** The plain JSON `prenta push chrome` sends for one region (`PUT /chrome/schema`). */
133
+ export declare function serializeRegion(definition: RegionDefinition): {
134
+ region: ChromeRegionName;
135
+ component: string;
136
+ variants: Record<string, string>;
137
+ fields: Record<string, FieldDef>;
138
+ };
139
+ export interface ChromeLinkValue {
140
+ label: string;
141
+ url: string;
142
+ }
143
+ export interface ChromeSocialLink {
144
+ platform: string;
145
+ url: string;
146
+ }
147
+ /** How an optional field is stored: a switch next to its value. */
148
+ export type Toggle<T> = {
149
+ on: boolean;
150
+ } & T;
151
+ /** What the CMS stores for one field. Brand fields store nothing. */
152
+ export type StoredFieldValue<F extends FieldDef> = F extends {
153
+ type: 'menu';
154
+ list: true;
155
+ } ? string[] : F extends {
156
+ type: 'menu';
157
+ optional: true;
158
+ } ? Toggle<{
159
+ value: string;
160
+ }> : F extends {
161
+ type: 'menu';
162
+ } ? string : F extends {
163
+ type: 'link';
164
+ optional: true;
165
+ } ? Toggle<ChromeLinkValue> : F extends {
166
+ type: 'link';
167
+ } ? ChromeLinkValue : F extends {
168
+ type: 'text';
169
+ optional: true;
170
+ } ? Toggle<{
171
+ value: string;
172
+ }> : F extends {
173
+ type: 'text' | 'textarea';
174
+ } ? string : F extends {
175
+ type: 'select';
176
+ options: readonly (infer O extends string)[];
177
+ } ? O : F extends {
178
+ type: 'boolean';
179
+ } ? boolean : F extends {
180
+ type: 'social';
181
+ } ? ChromeSocialLink[] : never;
182
+ type FieldsOf<R extends RegionDefinition> = R['fields'];
183
+ /** `RegionValues.fields` for one region: every editable field, each optional. */
184
+ export type RegionFieldValues<R extends RegionDefinition> = {
185
+ [K in keyof FieldsOf<R> as FieldsOf<R>[K] extends {
186
+ type: 'brand';
187
+ } ? never : K]?: StoredFieldValue<FieldsOf<R>[K]>;
188
+ };
189
+ /** A menu as the site receives it. `id` is the menu's slug. */
190
+ export interface ChromeMenu {
191
+ id: string;
192
+ name: string;
193
+ items: PublicNavItem[];
194
+ }
195
+ /** What `getChrome` returns for one field. */
196
+ export type PublicFieldValue<F extends FieldDef> = F extends {
197
+ type: 'brand';
198
+ key: 'logo';
199
+ } ? ResolvedLogo | null : F extends {
200
+ type: 'brand';
201
+ } ? string : F extends {
202
+ type: 'menu';
203
+ list: true;
204
+ } ? ChromeMenu[] : F extends {
205
+ type: 'menu';
206
+ } ? ChromeMenu | null : F extends {
207
+ type: 'link';
208
+ } ? ChromeLinkValue | null : F extends {
209
+ type: 'text';
210
+ optional: true;
211
+ } ? string | null : F extends {
212
+ type: 'text' | 'textarea';
213
+ } ? string : F extends {
214
+ type: 'select';
215
+ options: readonly (infer O extends string)[];
216
+ } ? O : F extends {
217
+ type: 'boolean';
218
+ } ? boolean : F extends {
219
+ type: 'social';
220
+ } ? ChromeSocialLink[] : never;
221
+ /** The `fields` a site receives for one region. */
222
+ export type ChromeFieldsOf<R extends RegionDefinition> = {
223
+ [K in keyof FieldsOf<R>]: PublicFieldValue<FieldsOf<R>[K]>;
224
+ };
225
+ /** A region as `getChrome` returns it. */
226
+ export interface ResolvedRegion<R extends RegionDefinition = RegionDefinition> {
227
+ variant: Extract<keyof R['variants'], string>;
228
+ fields: ChromeFieldsOf<R>;
229
+ }
230
+ export {};
231
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/chrome/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ /** The regions a site can define. The announcement bar is CMS-owned. */
2
+ export const CHROME_REGIONS = ['header', 'footer'];
3
+ /** Copy only the options that were set, so the serialized schema stays small and stable. */
4
+ function defined(type, options) {
5
+ const out = { type };
6
+ for (const [key, value] of Object.entries(options ?? {})) {
7
+ if (value !== undefined)
8
+ out[key] = Array.isArray(value) ? [...value] : value;
9
+ }
10
+ return out;
11
+ }
12
+ /**
13
+ * Field builders. Each keeps its options as literal types, so
14
+ * `field.link({ optional: true })` stores `{ on, label, url }` and
15
+ * `field.select(['dark', 'light'])` stores `'dark' | 'light'`.
16
+ */
17
+ export const field = {
18
+ brand(key, options) {
19
+ return { ...defined('brand', options), key };
20
+ },
21
+ menu(options) {
22
+ return defined('menu', options);
23
+ },
24
+ link(options) {
25
+ return defined('link', options);
26
+ },
27
+ text(options) {
28
+ return defined('text', options);
29
+ },
30
+ textarea(options) {
31
+ return defined('textarea', options);
32
+ },
33
+ select(options, extra) {
34
+ return { ...defined('select', extra), options: [...options] };
35
+ },
36
+ boolean(options) {
37
+ return defined('boolean', options);
38
+ },
39
+ social(options) {
40
+ return defined('social', options);
41
+ },
42
+ };
43
+ const REGION_BRAND = Symbol.for('prenta.chrome.region');
44
+ /**
45
+ * Declare an editable region. The returned object is plain data plus a hidden
46
+ * marker, so `prenta push chrome` can find every region a config exports.
47
+ */
48
+ export function defineRegion(name, definition) {
49
+ const region = {
50
+ region: name,
51
+ component: definition.component,
52
+ variants: { ...definition.variants },
53
+ fields: { ...definition.fields },
54
+ };
55
+ Object.defineProperty(region, REGION_BRAND, { value: true });
56
+ return region;
57
+ }
58
+ /** Whether a value came from `defineRegion`. */
59
+ export function isRegionDefinition(value) {
60
+ return (typeof value === 'object' &&
61
+ value !== null &&
62
+ value[REGION_BRAND] === true);
63
+ }
64
+ /** The plain JSON `prenta push chrome` sends for one region (`PUT /chrome/schema`). */
65
+ export function serializeRegion(definition) {
66
+ return JSON.parse(JSON.stringify({
67
+ region: definition.region,
68
+ component: definition.component,
69
+ variants: definition.variants,
70
+ fields: definition.fields,
71
+ }));
72
+ }
73
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/chrome/schema.ts"],"names":[],"mappings":"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"}