@prenta/core 8.9.2 → 8.11.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 (294) hide show
  1. package/CHANGELOG.md +105 -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 +103 -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 +161 -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/overrides.d.ts +25 -0
  101. package/dist/chrome/overrides.d.ts.map +1 -0
  102. package/dist/chrome/overrides.js +180 -0
  103. package/dist/chrome/overrides.js.map +1 -0
  104. package/dist/chrome/parse.d.ts +36 -0
  105. package/dist/chrome/parse.d.ts.map +1 -0
  106. package/dist/chrome/parse.js +277 -0
  107. package/dist/chrome/parse.js.map +1 -0
  108. package/dist/chrome/prisma-store.d.ts +11 -0
  109. package/dist/chrome/prisma-store.d.ts.map +1 -0
  110. package/dist/chrome/prisma-store.js +48 -0
  111. package/dist/chrome/prisma-store.js.map +1 -0
  112. package/dist/chrome/public.d.ts +22 -0
  113. package/dist/chrome/public.d.ts.map +1 -0
  114. package/dist/chrome/public.js +181 -0
  115. package/dist/chrome/public.js.map +1 -0
  116. package/dist/chrome/resolve.d.ts +36 -0
  117. package/dist/chrome/resolve.d.ts.map +1 -0
  118. package/dist/chrome/resolve.js +165 -0
  119. package/dist/chrome/resolve.js.map +1 -0
  120. package/dist/chrome/revalidate.d.ts +9 -0
  121. package/dist/chrome/revalidate.d.ts.map +1 -0
  122. package/dist/chrome/revalidate.js +51 -0
  123. package/dist/chrome/revalidate.js.map +1 -0
  124. package/dist/chrome/routes.d.ts +14 -0
  125. package/dist/chrome/routes.d.ts.map +1 -0
  126. package/dist/chrome/routes.js +349 -0
  127. package/dist/chrome/routes.js.map +1 -0
  128. package/dist/chrome/schema.d.ts +231 -0
  129. package/dist/chrome/schema.d.ts.map +1 -0
  130. package/dist/chrome/schema.js +73 -0
  131. package/dist/chrome/schema.js.map +1 -0
  132. package/dist/chrome/service.d.ts +76 -0
  133. package/dist/chrome/service.d.ts.map +1 -0
  134. package/dist/chrome/service.js +286 -0
  135. package/dist/chrome/service.js.map +1 -0
  136. package/dist/chrome/settings.d.ts +14 -0
  137. package/dist/chrome/settings.d.ts.map +1 -0
  138. package/dist/chrome/settings.js +142 -0
  139. package/dist/chrome/settings.js.map +1 -0
  140. package/dist/chrome/store.d.ts +48 -0
  141. package/dist/chrome/store.d.ts.map +1 -0
  142. package/dist/chrome/store.js +26 -0
  143. package/dist/chrome/store.js.map +1 -0
  144. package/dist/chrome/values.d.ts +98 -0
  145. package/dist/chrome/values.d.ts.map +1 -0
  146. package/dist/chrome/values.js +491 -0
  147. package/dist/chrome/values.js.map +1 -0
  148. package/dist/config/define.d.ts +2 -0
  149. package/dist/config/define.d.ts.map +1 -1
  150. package/dist/config/define.js +2 -0
  151. package/dist/config/define.js.map +1 -1
  152. package/dist/db/model-types.d.ts +62 -0
  153. package/dist/db/model-types.d.ts.map +1 -1
  154. package/dist/forms/attribution-settings.d.ts +23 -0
  155. package/dist/forms/attribution-settings.d.ts.map +1 -0
  156. package/dist/forms/attribution-settings.js +42 -0
  157. package/dist/forms/attribution-settings.js.map +1 -0
  158. package/dist/forms/attribution.d.ts +5 -1
  159. package/dist/forms/attribution.d.ts.map +1 -1
  160. package/dist/forms/attribution.js +6 -4
  161. package/dist/forms/attribution.js.map +1 -1
  162. package/dist/forms/client-validation.d.ts.map +1 -1
  163. package/dist/forms/client-validation.js +3 -0
  164. package/dist/forms/client-validation.js.map +1 -1
  165. package/dist/forms/form-model.d.ts +109 -0
  166. package/dist/forms/form-model.d.ts.map +1 -0
  167. package/dist/forms/form-model.js +192 -0
  168. package/dist/forms/form-model.js.map +1 -0
  169. package/dist/forms/index.d.ts +2 -2
  170. package/dist/forms/index.d.ts.map +1 -1
  171. package/dist/forms/index.js +1 -1
  172. package/dist/forms/index.js.map +1 -1
  173. package/dist/forms/service.d.ts +19 -1
  174. package/dist/forms/service.d.ts.map +1 -1
  175. package/dist/forms/service.js +152 -0
  176. package/dist/forms/service.js.map +1 -1
  177. package/dist/forms/spam.d.ts +0 -12
  178. package/dist/forms/spam.d.ts.map +1 -1
  179. package/dist/forms/spam.js +30 -0
  180. package/dist/forms/spam.js.map +1 -1
  181. package/dist/forms/submission.d.ts +7 -0
  182. package/dist/forms/submission.d.ts.map +1 -1
  183. package/dist/forms/submission.js +33 -0
  184. package/dist/forms/submission.js.map +1 -1
  185. package/dist/forms/types.d.ts +26 -1
  186. package/dist/forms/types.d.ts.map +1 -1
  187. package/dist/forms/types.js +9 -1
  188. package/dist/forms/types.js.map +1 -1
  189. package/dist/generated/browser.d.ts +35 -3
  190. package/dist/generated/client.d.ts +35 -3
  191. package/dist/generated/internal/class.d.ts +44 -0
  192. package/dist/generated/internal/class.js +4 -4
  193. package/dist/generated/internal/prismaNamespace.d.ts +403 -1
  194. package/dist/generated/internal/prismaNamespace.js +95 -1
  195. package/dist/generated/internal/prismaNamespaceBrowser.d.ts +102 -0
  196. package/dist/generated/internal/prismaNamespaceBrowser.js +95 -1
  197. package/dist/generated/models/ChromeRegion.d.ts +1203 -0
  198. package/dist/generated/models/ChromeRegion.js +1 -0
  199. package/dist/generated/models/Job.d.ts +732 -5
  200. package/dist/generated/models/JobEvent.d.ts +1339 -0
  201. package/dist/generated/models/JobEvent.js +1 -0
  202. package/dist/generated/models/JobReviewItem.d.ts +1470 -0
  203. package/dist/generated/models/JobReviewItem.js +1 -0
  204. package/dist/generated/models/SystemSetting.d.ts +952 -0
  205. package/dist/generated/models/SystemSetting.js +1 -0
  206. package/dist/generated/models.d.ts +4 -0
  207. package/dist/index.d.ts +12 -5
  208. package/dist/index.d.ts.map +1 -1
  209. package/dist/index.js +8 -3
  210. package/dist/index.js.map +1 -1
  211. package/dist/jobs/batch-ai.d.ts +53 -0
  212. package/dist/jobs/batch-ai.d.ts.map +1 -0
  213. package/dist/jobs/batch-ai.js +314 -0
  214. package/dist/jobs/batch-ai.js.map +1 -0
  215. package/dist/jobs/contract.d.ts +193 -0
  216. package/dist/jobs/contract.d.ts.map +1 -0
  217. package/dist/jobs/contract.js +2 -0
  218. package/dist/jobs/contract.js.map +1 -0
  219. package/dist/jobs/error-text.d.ts +23 -0
  220. package/dist/jobs/error-text.d.ts.map +1 -0
  221. package/dist/jobs/error-text.js +110 -0
  222. package/dist/jobs/error-text.js.map +1 -0
  223. package/dist/jobs/handlers.d.ts.map +1 -1
  224. package/dist/jobs/handlers.js +48 -7
  225. package/dist/jobs/handlers.js.map +1 -1
  226. package/dist/jobs/memory-store.d.ts +26 -2
  227. package/dist/jobs/memory-store.d.ts.map +1 -1
  228. package/dist/jobs/memory-store.js +157 -3
  229. package/dist/jobs/memory-store.js.map +1 -1
  230. package/dist/jobs/outcomes.d.ts +46 -0
  231. package/dist/jobs/outcomes.d.ts.map +1 -0
  232. package/dist/jobs/outcomes.js +251 -0
  233. package/dist/jobs/outcomes.js.map +1 -0
  234. package/dist/jobs/prisma-store.d.ts +14 -2
  235. package/dist/jobs/prisma-store.d.ts.map +1 -1
  236. package/dist/jobs/prisma-store.js +257 -15
  237. package/dist/jobs/prisma-store.js.map +1 -1
  238. package/dist/jobs/queue.d.ts +62 -2
  239. package/dist/jobs/queue.d.ts.map +1 -1
  240. package/dist/jobs/queue.js +412 -36
  241. package/dist/jobs/queue.js.map +1 -1
  242. package/dist/jobs/retention.d.ts +11 -0
  243. package/dist/jobs/retention.d.ts.map +1 -0
  244. package/dist/jobs/retention.js +18 -0
  245. package/dist/jobs/retention.js.map +1 -0
  246. package/dist/jobs/review.d.ts +111 -0
  247. package/dist/jobs/review.d.ts.map +1 -0
  248. package/dist/jobs/review.js +461 -0
  249. package/dist/jobs/review.js.map +1 -0
  250. package/dist/jobs/routes.d.ts.map +1 -1
  251. package/dist/jobs/routes.js +491 -16
  252. package/dist/jobs/routes.js.map +1 -1
  253. package/dist/jobs/serialize.d.ts +40 -0
  254. package/dist/jobs/serialize.d.ts.map +1 -0
  255. package/dist/jobs/serialize.js +275 -0
  256. package/dist/jobs/serialize.js.map +1 -0
  257. package/dist/jobs/types.d.ts +141 -2
  258. package/dist/jobs/types.d.ts.map +1 -1
  259. package/dist/jobs/worker-status.d.ts +27 -0
  260. package/dist/jobs/worker-status.d.ts.map +1 -0
  261. package/dist/jobs/worker-status.js +66 -0
  262. package/dist/jobs/worker-status.js.map +1 -0
  263. package/dist/media/optimize.d.ts.map +1 -1
  264. package/dist/media/optimize.js +4 -2
  265. package/dist/media/optimize.js.map +1 -1
  266. package/dist/next-site.d.ts +1 -0
  267. package/dist/next-site.d.ts.map +1 -1
  268. package/dist/next-site.js +3 -0
  269. package/dist/next-site.js.map +1 -1
  270. package/dist/seo/audit-runner.d.ts.map +1 -1
  271. package/dist/seo/audit-runner.js +23 -2
  272. package/dist/seo/audit-runner.js.map +1 -1
  273. package/dist/seo/issue-fix-link-insert.d.ts +11 -0
  274. package/dist/seo/issue-fix-link-insert.d.ts.map +1 -1
  275. package/dist/seo/issue-fix-link-insert.js +122 -8
  276. package/dist/seo/issue-fix-link-insert.js.map +1 -1
  277. package/dist/server-site.d.ts.map +1 -1
  278. package/dist/server-site.js +15 -0
  279. package/dist/server-site.js.map +1 -1
  280. package/dist/site.d.ts +8 -0
  281. package/dist/site.d.ts.map +1 -1
  282. package/dist/site.js +6 -0
  283. package/dist/site.js.map +1 -1
  284. package/dist/webhooks/index.d.ts +3 -1
  285. package/dist/webhooks/index.d.ts.map +1 -1
  286. package/dist/webhooks/index.js.map +1 -1
  287. package/package.json +6 -1
  288. package/prisma/migrations/0025_job_cancel_review/down.sql +60 -0
  289. package/prisma/migrations/0025_job_cancel_review/migration.sql +56 -0
  290. package/prisma/migrations/0026_job_creator_system_settings/down.sql +30 -0
  291. package/prisma/migrations/0026_job_creator_system_settings/migration.sql +14 -0
  292. package/prisma/migrations/0027_chrome_regions/down.sql +24 -0
  293. package/prisma/migrations/0027_chrome_regions/migration.sql +16 -0
  294. package/prisma/schema.prisma +105 -15
@@ -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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"}
@@ -0,0 +1,76 @@
1
+ import type { Announcement, ChromeOrphan, ChromeSchemaReadResult, ChromeSyncStatus, RegionSchema } from './contract.js';
2
+ import type { SchemaReadInput } from './parse.js';
3
+ import { type ChromeRegionName } from './schema.js';
4
+ import { type ChromeRow, type ChromeStore } from './store.js';
5
+ export type ChromeFailure = {
6
+ ok: false;
7
+ status: 400 | 404 | 409 | 412;
8
+ error: string;
9
+ };
10
+ /**
11
+ * ETag for `GET /chrome/:region`, over what the editor sees: the schema, the
12
+ * values and the live orphans. A cron purge of expired orphans doesn't change it.
13
+ */
14
+ export declare function regionEtag(row: ChromeRow, now: Date): string;
15
+ /** ETag for `GET /chrome/announcement`, over its content only, so a schedule tick doesn't change it. */
16
+ export declare function announcementEtag(announcement: Announcement): string;
17
+ /** `If-Match` as sent, or null for no precondition. A `*` always matches. */
18
+ export declare function readIfMatch(request: Request): string | null;
19
+ export interface ChromeSchemaView {
20
+ regions: RegionSchema[];
21
+ sync: ChromeSyncStatus;
22
+ }
23
+ export declare function getChromeSchema(store: ChromeStore): Promise<ChromeSchemaView>;
24
+ /**
25
+ * Store a pushed schema and fit each region's values to it. A region the push
26
+ * leaves out loses its schema (the site falls back to layout variants) and its
27
+ * values become orphans, which come back if the region does within 30 days.
28
+ */
29
+ export declare function readChromeSchema(store: ChromeStore, input: SchemaReadInput, options: {
30
+ userId: string | null;
31
+ now: Date;
32
+ }): Promise<ChromeSchemaReadResult | ChromeFailure>;
33
+ export interface RegionView {
34
+ row: ChromeRow;
35
+ schema: RegionSchema;
36
+ variant: string;
37
+ orphans: ChromeOrphan[];
38
+ }
39
+ export declare function getRegion(store: ChromeStore, region: ChromeRegionName, now: Date): Promise<RegionView | ChromeFailure>;
40
+ /** `PUT /chrome/:region`: replace the variant and field values. Orphans are kept. */
41
+ export declare function saveRegion(store: ChromeStore, region: ChromeRegionName, body: unknown, options: {
42
+ userId: string;
43
+ ifMatch: string | null;
44
+ now: Date;
45
+ }): Promise<RegionView | ChromeFailure>;
46
+ /** `DELETE /chrome/:region/orphans/:key`, the orphan notice's "Remove now". */
47
+ export declare function removeOrphan(store: ChromeStore, region: ChromeRegionName, key: string, options: {
48
+ userId: string;
49
+ now: Date;
50
+ }): Promise<RegionView | ChromeFailure>;
51
+ /** Cleanup cron: drop orphans older than 30 days. A row that changes meanwhile waits for the next run. */
52
+ export declare function purgeExpiredOrphans(store: ChromeStore, now: Date): Promise<number>;
53
+ export interface AnnouncementView {
54
+ announcement: Announcement;
55
+ row: ChromeRow | null;
56
+ }
57
+ export declare function getAnnouncement(store: ChromeStore): Promise<AnnouncementView>;
58
+ /** `PUT /chrome/announcement`. A boundary already past counts as fired, since the save revalidates. */
59
+ export declare function saveAnnouncement(store: ChromeStore, body: unknown, options: {
60
+ userId: string;
61
+ ifMatch: string | null;
62
+ now: Date;
63
+ }): Promise<AnnouncementView | ChromeFailure>;
64
+ /**
65
+ * Publish cron: revalidate the site when a scheduled announcement starts or
66
+ * ends. The webhook goes first and the boundary is marked after, so a crash
67
+ * in between fires it again on the next tick rather than never. Overlapping
68
+ * ticks can both fire; a second `chrome.updated` is harmless.
69
+ */
70
+ export declare function processAnnouncementSchedule(store: ChromeStore, options: {
71
+ now: Date;
72
+ revalidate: (region: string) => Promise<void>;
73
+ }): Promise<{
74
+ fired: Array<'start' | 'end'>;
75
+ }>;
76
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/chrome/service.ts"],"names":[],"mappings":"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"}