@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 @@
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/chrome/parse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { PrentaDB } from '../db/client-types.js';
2
+ import { type ChromeRow, type ChromeRowPatch, type ChromeStore, type ChromeWriteOptions } from './store.js';
3
+ export declare class PrismaChromeStore implements ChromeStore {
4
+ private readonly db;
5
+ constructor(db: PrentaDB);
6
+ get(region: string): Promise<ChromeRow | null>;
7
+ list(): Promise<ChromeRow[]>;
8
+ ensure(region: string, now: Date): Promise<void>;
9
+ update(row: ChromeRow, patch: ChromeRowPatch, now: Date, options?: ChromeWriteOptions): Promise<ChromeRow | null>;
10
+ }
11
+ //# sourceMappingURL=prisma-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma-store.d.ts","sourceRoot":"","sources":["../../src/chrome/prisma-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAErD,OAAO,EAGL,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACxB,MAAM,YAAY,CAAA;AAkCnB,qBAAa,iBAAkB,YAAW,WAAW;IACvC,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ;IAEnC,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAK9C,IAAI,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAK5B,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAOhD,MAAM,CACV,GAAG,EAAE,SAAS,EACd,KAAK,EAAE,cAAc,EACrB,GAAG,EAAE,IAAI,EACT,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;CAS7B"}
@@ -0,0 +1,48 @@
1
+ import { patchedRow, writtenAt, } from './store.js';
2
+ function toRow(raw) {
3
+ const values = raw.values;
4
+ return {
5
+ region: raw.region,
6
+ schema: raw.schema ?? null,
7
+ schemaHash: raw.schemaHash ?? null,
8
+ variant: raw.variant ?? null,
9
+ values: typeof values === 'object' && values !== null && !Array.isArray(values)
10
+ ? values
11
+ : {},
12
+ orphans: Array.isArray(raw.orphans) ? raw.orphans : [],
13
+ state: raw.state ?? null,
14
+ version: typeof raw.version === 'number' ? raw.version : 0,
15
+ updatedById: raw.updatedById ?? null,
16
+ updatedAt: raw.updatedAt ? new Date(raw.updatedAt) : null,
17
+ };
18
+ }
19
+ export class PrismaChromeStore {
20
+ db;
21
+ constructor(db) {
22
+ this.db = db;
23
+ }
24
+ async get(region) {
25
+ const row = await this.db.chromeRegion.findUnique({ where: { region } });
26
+ return row ? toRow(row) : null;
27
+ }
28
+ async list() {
29
+ const rows = await this.db.chromeRegion.findMany({ orderBy: { region: 'asc' } });
30
+ return rows.map(toRow);
31
+ }
32
+ async ensure(region, now) {
33
+ await this.db.chromeRegion.createMany({
34
+ data: [{ region, values: {}, orphans: [], version: 0, updatedAt: now }],
35
+ skipDuplicates: true,
36
+ });
37
+ }
38
+ async update(row, patch, now, options) {
39
+ const { count } = await this.db.chromeRegion.updateMany({
40
+ where: { region: row.region, version: row.version },
41
+ // A JS null clears a nullable Json column on Prisma 7.
42
+ // `updatedAt` is always sent, so Prisma's @updatedAt doesn't move it on a `touch: false` write.
43
+ data: { ...patch, version: row.version + 1, updatedAt: writtenAt(row, now, options) },
44
+ });
45
+ return count === 1 ? patchedRow(row, patch, now, options) : null;
46
+ }
47
+ }
48
+ //# sourceMappingURL=prisma-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma-store.js","sourceRoot":"","sources":["../../src/chrome/prisma-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { PrentaCMSConfig } from '../config/types.js';
2
+ import type { PrentaDB } from '../db/client-types.js';
3
+ import type { PublicChrome } from './contract.js';
4
+ import { type ChromeStore } from './store.js';
5
+ /** `/x/y/` → `/x/y`. Null for anything that isn't a site path. */
6
+ export declare function normalizeChromePath(value: string | null | undefined): string | null;
7
+ /**
8
+ * Cache tags for `/public/chrome?path=`: the shared chrome set, plus the
9
+ * collection of every page whose override it reads. An ancestor can live in
10
+ * another collection than the page (`/blog` in pages, `/blog/hello` in posts).
11
+ */
12
+ export declare function chromeReadTags(config: Pick<PrentaCMSConfig, 'collections'> | null, path: string): string[];
13
+ export interface LoadPublicChromeOptions {
14
+ db: PrentaDB;
15
+ store: ChromeStore;
16
+ config: Pick<PrentaCMSConfig, 'collections'> | null;
17
+ path: string;
18
+ now: Date;
19
+ }
20
+ /** Everything the site gets for one path. */
21
+ export declare function loadPublicChrome(options: LoadPublicChromeOptions): Promise<PublicChrome>;
22
+ //# sourceMappingURL=public.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../src/chrome/public.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAIrD,OAAO,KAAK,EAEV,YAAY,EAGb,MAAM,eAAe,CAAA;AAUtB,OAAO,EAAoB,KAAK,WAAW,EAAE,MAAM,YAAY,CAAA;AAG/D,kEAAkE;AAClE,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAMnF;AAyCD;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC,GAAG,IAAI,EACnD,IAAI,EAAE,MAAM,GACX,MAAM,EAAE,CAKV;AA6FD,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,QAAQ,CAAA;IACZ,KAAK,EAAE,WAAW,CAAA;IAClB,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC,GAAG,IAAI,CAAA;IACnD,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,IAAI,CAAA;CACV;AAED,6CAA6C;AAC7C,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,YAAY,CAAC,CAqD9F"}
@@ -0,0 +1,181 @@
1
+ import { chromeCacheTags, chromePagePaths } from '../cache/http.js';
2
+ import { matchPathToCollection } from '../seo/resolve-path.js';
3
+ import { coercePublicNavItems } from '../site.js';
4
+ import { readAnnouncement, toPublicAnnouncement } from './announcement.js';
5
+ import { effectiveRegion, menuSlugs, publicRegion, readRegionOverride, withEtag, } from './resolve.js';
6
+ import { CHROME_REGIONS } from './schema.js';
7
+ import { ANNOUNCEMENT_ROW } from './store.js';
8
+ import { fromStoredSchema, isRecord } from './values.js';
9
+ /** `/x/y/` → `/x/y`. Null for anything that isn't a site path. */
10
+ export function normalizeChromePath(value) {
11
+ if (typeof value !== 'string')
12
+ return null;
13
+ const trimmed = value.trim();
14
+ if (!trimmed.startsWith('/') || trimmed.startsWith('//') || trimmed.length > 2048)
15
+ return null;
16
+ if (/[\s?#]/.test(trimmed))
17
+ return null;
18
+ return trimmed.replace(/\/+$/, '') || '/';
19
+ }
20
+ function overridesOf(data) {
21
+ const layout = isRecord(data) && isRecord(data._layout) ? data._layout : {};
22
+ const out = {};
23
+ for (const region of CHROME_REGIONS) {
24
+ const override = readRegionOverride(layout[region]);
25
+ if (override !== undefined)
26
+ out[region] = override;
27
+ }
28
+ return out;
29
+ }
30
+ function pageRef(config, path) {
31
+ const match = matchPathToCollection(config, path);
32
+ if (!match)
33
+ return null;
34
+ return { collection: match.collection, slugs: match.isRoot ? ['home', 'index'] : [match.slug] };
35
+ }
36
+ /** The page first, then its ancestors nearest first, so the first override found wins. */
37
+ function pageRefs(config, path) {
38
+ const refs = [];
39
+ for (const [index, pagePath] of chromePagePaths(path).entries()) {
40
+ const ref = pageRef(config, pagePath);
41
+ if (ref)
42
+ refs.push({ ref, isPage: index === 0 });
43
+ }
44
+ return refs;
45
+ }
46
+ /**
47
+ * Cache tags for `/public/chrome?path=`: the shared chrome set, plus the
48
+ * collection of every page whose override it reads. An ancestor can live in
49
+ * another collection than the page (`/blog` in pages, `/blog/hello` in posts).
50
+ */
51
+ export function chromeReadTags(config, path) {
52
+ return chromeCacheTags(path, pageRefs(config, path).map(({ ref }) => ref.collection));
53
+ }
54
+ /**
55
+ * The page's own overrides and, per region, the nearest ancestor's. The root
56
+ * page is nobody's ancestor: the site default covers every page already.
57
+ */
58
+ async function loadPageOverrides(db, config, path) {
59
+ const refs = pageRefs(config, path);
60
+ if (refs.length === 0)
61
+ return { page: {}, ancestor: {} };
62
+ const docs = (await db.document.findMany({
63
+ where: {
64
+ deletedAt: null,
65
+ status: 'PUBLISHED',
66
+ OR: refs.map(({ ref }) => ({
67
+ collection: ref.collection,
68
+ OR: [
69
+ { slug: { in: ref.slugs } },
70
+ ...ref.slugs.map((slug) => ({ data: { path: ['slug'], equals: slug } })),
71
+ ],
72
+ })),
73
+ },
74
+ select: { collection: true, slug: true, data: true },
75
+ }));
76
+ const find = (ref) => docs.find((doc) => doc.collection === ref.collection && ref.slugs.includes(doc.slug ?? '')) ??
77
+ docs.find((doc) => doc.collection === ref.collection &&
78
+ isRecord(doc.data) &&
79
+ typeof doc.data.slug === 'string' &&
80
+ ref.slugs.includes(doc.data.slug));
81
+ let page = {};
82
+ const ancestor = {};
83
+ for (const { ref, isPage } of refs) {
84
+ const doc = find(ref);
85
+ if (!doc)
86
+ continue;
87
+ const overrides = overridesOf(doc.data);
88
+ if (isPage) {
89
+ page = overrides;
90
+ continue;
91
+ }
92
+ for (const region of CHROME_REGIONS) {
93
+ if (ancestor[region] === undefined && overrides[region] !== undefined) {
94
+ ancestor[region] = overrides[region];
95
+ }
96
+ }
97
+ }
98
+ return { page, ancestor };
99
+ }
100
+ /** Menus by slug, with the rules `/public/navigations/:slug` uses: any status but ARCHIVED. */
101
+ async function loadMenus(db, slugs) {
102
+ const menus = new Map();
103
+ if (slugs.length === 0)
104
+ return menus;
105
+ const docs = (await db.document.findMany({
106
+ where: {
107
+ collection: 'navigations',
108
+ deletedAt: null,
109
+ status: { not: 'ARCHIVED' },
110
+ OR: [
111
+ { slug: { in: slugs } },
112
+ ...slugs.map((slug) => ({ data: { path: ['slug'], equals: slug } })),
113
+ ],
114
+ },
115
+ orderBy: { updatedAt: 'desc' },
116
+ }));
117
+ for (const doc of docs) {
118
+ const data = isRecord(doc.data) ? doc.data : {};
119
+ const slug = typeof data.slug === 'string' && data.slug ? data.slug : doc.slug;
120
+ if (!slug || !slugs.includes(slug) || menus.has(slug))
121
+ continue;
122
+ menus.set(slug, {
123
+ id: slug,
124
+ name: typeof data.name === 'string' ? data.name : (doc.title ?? ''),
125
+ items: coercePublicNavItems(data.items),
126
+ });
127
+ }
128
+ return menus;
129
+ }
130
+ async function loadBrand(db) {
131
+ const { resolveBrand } = await import('../appearance/index.js');
132
+ const brand = await resolveBrand(db, null);
133
+ return { logo: brand.public.primary, name: brand.siteTitle ?? '' };
134
+ }
135
+ /** Everything the site gets for one path. */
136
+ export async function loadPublicChrome(options) {
137
+ const { db, store, config, path, now } = options;
138
+ const rows = await store.list();
139
+ const byRegion = new Map(rows.map((row) => [row.region, row]));
140
+ const schemas = new Map();
141
+ for (const region of CHROME_REGIONS) {
142
+ const schema = fromStoredSchema(region, byRegion.get(region)?.schema);
143
+ if (schema)
144
+ schemas.set(region, schema);
145
+ }
146
+ const resolved = new Map();
147
+ if (schemas.size > 0) {
148
+ const { page, ancestor } = await loadPageOverrides(db, config, path);
149
+ for (const [region, schema] of schemas) {
150
+ const row = byRegion.get(region);
151
+ resolved.set(region, effectiveRegion(schema, { variant: row?.variant ?? null, values: row?.values ?? {} }, [
152
+ ancestor[region],
153
+ page[region],
154
+ ]));
155
+ }
156
+ }
157
+ const slugs = new Set();
158
+ let needsBrand = false;
159
+ for (const [region, effective] of resolved) {
160
+ if (!effective)
161
+ continue;
162
+ const schema = schemas.get(region);
163
+ for (const slug of menuSlugs(schema, effective.values))
164
+ slugs.add(slug);
165
+ if (Object.values(schema.fields).some((def) => def.type === 'brand'))
166
+ needsBrand = true;
167
+ }
168
+ const [menus, brand] = await Promise.all([
169
+ loadMenus(db, [...slugs]),
170
+ needsBrand ? loadBrand(db) : Promise.resolve({ logo: null, name: '' }),
171
+ ]);
172
+ const body = { announcement: null };
173
+ for (const [region, effective] of resolved) {
174
+ body[region] = effective
175
+ ? publicRegion(schemas.get(region), effective, { menus, brand, now })
176
+ : null;
177
+ }
178
+ body.announcement = toPublicAnnouncement(readAnnouncement(byRegion.get(ANNOUNCEMENT_ROW)?.values), now);
179
+ return withEtag(body);
180
+ }
181
+ //# sourceMappingURL=public.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public.js","sourceRoot":"","sources":["../../src/chrome/public.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { ResolvedLogo } from '../appearance/types.js';
2
+ import type { ChromeRegionOverride, PublicAnnouncement, PublicChrome, PublicChromeRegion, RegionSchema } from './contract.js';
3
+ import type { ChromeMenu } from './schema.js';
4
+ /** A region's variant and stored-format values after overrides. */
5
+ export interface EffectiveRegion {
6
+ variant: string;
7
+ values: Record<string, unknown>;
8
+ }
9
+ /** Read one region's override from a page's `_layout`. Strings are legacy variant-document ids, not overrides. */
10
+ export declare function readRegionOverride(value: unknown): ChromeRegionOverride | null | undefined;
11
+ /**
12
+ * Apply the overrides in order (nearest ancestor, then the page) over the
13
+ * site default. `undefined` means "no override at this level".
14
+ */
15
+ export declare function effectiveRegion(schema: Pick<RegionSchema, 'variants' | 'fields'>, site: {
16
+ variant: string | null;
17
+ values: Record<string, unknown>;
18
+ }, overrides: Array<ChromeRegionOverride | null | undefined>): EffectiveRegion | null;
19
+ /** The menu slugs a region's values point at, defaults included. */
20
+ export declare function menuSlugs(schema: Pick<RegionSchema, 'fields'>, values: Record<string, unknown>): string[];
21
+ export interface PublicFieldContext {
22
+ menus: ReadonlyMap<string, ChromeMenu>;
23
+ brand: {
24
+ logo: ResolvedLogo | null;
25
+ name: string;
26
+ };
27
+ now: Date;
28
+ }
29
+ /** A region as the site receives it, every field filled in, in schema order. */
30
+ export declare function publicRegion(schema: Pick<RegionSchema, 'fields'>, region: EffectiveRegion, ctx: PublicFieldContext): PublicChromeRegion;
31
+ export declare function withEtag(body: {
32
+ header?: PublicChromeRegion | null;
33
+ footer?: PublicChromeRegion | null;
34
+ announcement: PublicAnnouncement | null;
35
+ }): PublicChrome;
36
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/chrome/resolve.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,KAAK,EACV,oBAAoB,EACpB,kBAAkB,EAClB,YAAY,EACZ,kBAAkB,EAClB,YAAY,EACb,MAAM,eAAe,CAAA;AACtB,OAAO,KAAK,EAAE,UAAU,EAAY,MAAM,aAAa,CAAA;AAUvD,mEAAmE;AACnE,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAChC;AAED,kHAAkH;AAClH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,oBAAoB,GAAG,IAAI,GAAG,SAAS,CAO1F;AAqBD;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,UAAU,GAAG,QAAQ,CAAC,EACjD,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,EACjE,SAAS,EAAE,KAAK,CAAC,oBAAoB,GAAG,IAAI,GAAG,SAAS,CAAC,GACxD,eAAe,GAAG,IAAI,CAsBxB;AAED,oEAAoE;AACpE,wBAAgB,SAAS,CACvB,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,EACpC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,MAAM,EAAE,CAkBV;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IACtC,KAAK,EAAE;QAAE,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IAClD,GAAG,EAAE,IAAI,CAAA;CACV;AA2DD,gFAAgF;AAChF,wBAAgB,YAAY,CAC1B,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,EACpC,MAAM,EAAE,eAAe,EACvB,GAAG,EAAE,kBAAkB,GACtB,kBAAkB,CAMpB;AAQD,wBAAgB,QAAQ,CAAC,IAAI,EAAE;IAC7B,MAAM,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAA;IAClC,MAAM,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAA;IAClC,YAAY,EAAE,kBAAkB,GAAG,IAAI,CAAA;CACxC,GAAG,YAAY,CAEf"}
@@ -0,0 +1,165 @@
1
+ /**
2
+ * What `/public/chrome` sends for a path. A region resolves in three steps,
3
+ * each over the last: the site default, the nearest ancestor page's override,
4
+ * then the page's own. An override of `null` hides the region; a later
5
+ * override that isn't null shows it again.
6
+ */
7
+ import { createHash } from 'node:crypto';
8
+ import { cleanFieldValue, effectiveVariant, hasVariant, isRecord, ownField, ownValue, } from './values.js';
9
+ /** Read one region's override from a page's `_layout`. Strings are legacy variant-document ids, not overrides. */
10
+ export function readRegionOverride(value) {
11
+ if (value === null)
12
+ return null;
13
+ if (!isRecord(value))
14
+ return undefined;
15
+ const out = {};
16
+ if (typeof value.variant === 'string')
17
+ out.variant = value.variant;
18
+ if (isRecord(value.fields))
19
+ out.fields = value.fields;
20
+ return out;
21
+ }
22
+ /**
23
+ * Keep the values that fit their field and pass a save's checks; the rest are
24
+ * ignored. Page overrides come from `_layout`, which no chrome save checked,
25
+ * so a `javascript:` link or an over-long text there never reaches the site.
26
+ */
27
+ function fittingValues(schema, values) {
28
+ const out = {};
29
+ for (const [key, value] of Object.entries(values ?? {})) {
30
+ const def = ownField(schema, key);
31
+ if (!def)
32
+ continue;
33
+ const fit = cleanFieldValue(def, value);
34
+ if (fit.ok)
35
+ out[key] = fit.value;
36
+ }
37
+ return out;
38
+ }
39
+ /**
40
+ * Apply the overrides in order (nearest ancestor, then the page) over the
41
+ * site default. `undefined` means "no override at this level".
42
+ */
43
+ export function effectiveRegion(schema, site, overrides) {
44
+ const base = {
45
+ variant: effectiveVariant(schema, site.variant),
46
+ values: fittingValues(schema, site.values),
47
+ };
48
+ let current = base;
49
+ for (const override of overrides) {
50
+ if (override === undefined)
51
+ continue;
52
+ if (override === null) {
53
+ current = null;
54
+ continue;
55
+ }
56
+ const from = current ?? base;
57
+ current = {
58
+ variant: override.variant !== undefined && hasVariant(schema, override.variant)
59
+ ? override.variant
60
+ : from.variant,
61
+ values: { ...from.values, ...fittingValues(schema, override.fields) },
62
+ };
63
+ }
64
+ return current;
65
+ }
66
+ /** The menu slugs a region's values point at, defaults included. */
67
+ export function menuSlugs(schema, values) {
68
+ const slugs = new Set();
69
+ for (const [key, def] of Object.entries(schema.fields)) {
70
+ if (def.type !== 'menu')
71
+ continue;
72
+ const value = ownValue(values, key);
73
+ if (def.list) {
74
+ const list = Array.isArray(value) ? value : def.default ? [def.default] : [];
75
+ for (const slug of list)
76
+ if (typeof slug === 'string' && slug)
77
+ slugs.add(slug);
78
+ }
79
+ else if (def.optional) {
80
+ if (isRecord(value) && value.on === true && typeof value.value === 'string' && value.value) {
81
+ slugs.add(value.value);
82
+ }
83
+ }
84
+ else {
85
+ const slug = typeof value === 'string' && value ? value : def.default;
86
+ if (slug)
87
+ slugs.add(slug);
88
+ }
89
+ }
90
+ return [...slugs];
91
+ }
92
+ /** Fill the placeholders the CMS owns. `{year}` is the current UTC year. */
93
+ function fillTokens(text, def, now) {
94
+ if (!def.tokens?.includes('{year}'))
95
+ return text;
96
+ return text.split('{year}').join(String(now.getUTCFullYear()));
97
+ }
98
+ function toggleOn(value) {
99
+ return isRecord(value) && value.on === true;
100
+ }
101
+ /** One field as the site receives it. */
102
+ function publicField(def, value, ctx) {
103
+ switch (def.type) {
104
+ case 'brand':
105
+ return def.key === 'logo' ? ctx.brand.logo : ctx.brand.name;
106
+ case 'menu': {
107
+ if (def.list) {
108
+ const list = Array.isArray(value) ? value : def.default ? [def.default] : [];
109
+ return list
110
+ .map((slug) => (typeof slug === 'string' ? ctx.menus.get(slug) : undefined))
111
+ .filter((menu) => menu !== undefined);
112
+ }
113
+ const slug = def.optional
114
+ ? toggleOn(value) && typeof value.value === 'string'
115
+ ? value.value
116
+ : null
117
+ : typeof value === 'string' && value
118
+ ? value
119
+ : (def.default ?? null);
120
+ return slug ? (ctx.menus.get(slug) ?? null) : null;
121
+ }
122
+ case 'link': {
123
+ if (def.optional && !toggleOn(value))
124
+ return null;
125
+ if (!isRecord(value) || typeof value.url !== 'string' || value.url === '')
126
+ return null;
127
+ return { label: typeof value.label === 'string' ? value.label : '', url: value.url };
128
+ }
129
+ case 'text': {
130
+ if (def.optional) {
131
+ return toggleOn(value) && typeof value.value === 'string'
132
+ ? fillTokens(value.value, def, ctx.now)
133
+ : null;
134
+ }
135
+ return fillTokens(typeof value === 'string' ? value : '', def, ctx.now);
136
+ }
137
+ case 'textarea':
138
+ return typeof value === 'string' ? value : '';
139
+ case 'select':
140
+ return typeof value === 'string' ? value : (def.default ?? def.options[0] ?? '');
141
+ case 'boolean':
142
+ return typeof value === 'boolean' ? value : (def.default ?? false);
143
+ case 'social':
144
+ return Array.isArray(value) ? value : [];
145
+ default:
146
+ return null;
147
+ }
148
+ }
149
+ /** A region as the site receives it, every field filled in, in schema order. */
150
+ export function publicRegion(schema, region, ctx) {
151
+ const fields = {};
152
+ for (const [key, def] of Object.entries(schema.fields)) {
153
+ fields[key] = publicField(def, ownValue(region.values, key), ctx);
154
+ }
155
+ return { variant: region.variant, fields };
156
+ }
157
+ /** Weak ETag over the response body, so an unchanged chrome answers 304. */
158
+ function chromeEtag(body) {
159
+ const hash = createHash('sha256').update(JSON.stringify(body)).digest('hex').slice(0, 20);
160
+ return `W/"chrome-${hash}"`;
161
+ }
162
+ export function withEtag(body) {
163
+ return { ...body, etag: chromeEtag(body) };
164
+ }
165
+ //# sourceMappingURL=resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/chrome/resolve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Tell the site its chrome changed, after the write has committed: the signed
3
+ * `chrome.updated` webhook (to the Developer tab's revalidate URL and any other
4
+ * endpoint subscribed to it) and the `prenta:chrome` cache tag. Chrome is on
5
+ * every page, so the wholesale `prenta` tag goes too, as for a global write.
6
+ * Never throws: the write already succeeded.
7
+ */
8
+ export declare function revalidateChrome(region: string): Promise<void>;
9
+ //# sourceMappingURL=revalidate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revalidate.d.ts","sourceRoot":"","sources":["../../src/chrome/revalidate.ts"],"names":[],"mappings":"AAMA;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmCpE"}
@@ -0,0 +1,51 @@
1
+ import { PRENTA_CHROME_TAG, PRENTA_TAG_ROOT } from '../cache/http.js';
2
+ import { getPrentaConfig } from '../config/runtime.js';
3
+ import { createLogger } from '../diagnostics/logger.js';
4
+ const logger = createLogger('chrome');
5
+ /**
6
+ * Tell the site its chrome changed, after the write has committed: the signed
7
+ * `chrome.updated` webhook (to the Developer tab's revalidate URL and any other
8
+ * endpoint subscribed to it) and the `prenta:chrome` cache tag. Chrome is on
9
+ * every page, so the wholesale `prenta` tag goes too, as for a global write.
10
+ * Never throws: the write already succeeded.
11
+ */
12
+ export async function revalidateChrome(region) {
13
+ const tags = [PRENTA_TAG_ROOT, PRENTA_CHROME_TAG];
14
+ const config = getPrentaConfig();
15
+ const adapter = config?.platform?.cache;
16
+ await Promise.all([
17
+ ...tags.map(async (tag) => {
18
+ try {
19
+ await adapter?.invalidateTag(tag);
20
+ }
21
+ catch (err) {
22
+ logger.error('platform.cache invalidateTag failed, chrome may be stale until TTL', {
23
+ error: err instanceof Error ? err.message : String(err),
24
+ });
25
+ }
26
+ }),
27
+ (async () => {
28
+ try {
29
+ await config?.cache?.onInvalidate?.(tags);
30
+ }
31
+ catch (err) {
32
+ logger.error('cache.onInvalidate failed, chrome may be stale until TTL', {
33
+ error: err instanceof Error ? err.message : String(err),
34
+ });
35
+ }
36
+ })(),
37
+ (async () => {
38
+ try {
39
+ const { dispatch } = await import('../webhooks/index.js');
40
+ await dispatch('chrome.updated', { region });
41
+ }
42
+ catch (err) {
43
+ logger.error('chrome.updated webhook dispatch failed', {
44
+ region,
45
+ error: err instanceof Error ? err.message : String(err),
46
+ });
47
+ }
48
+ })(),
49
+ ]);
50
+ }
51
+ //# sourceMappingURL=revalidate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revalidate.js","sourceRoot":"","sources":["../../src/chrome/revalidate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAEvD,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAA;AAErC;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAc;IACnD,MAAM,IAAI,GAAG,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAA;IACjD,MAAM,MAAM,GAAG,eAAe,EAAE,CAAA;IAChC,MAAM,OAAO,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAA;IACvC,MAAM,OAAO,CAAC,GAAG,CAAC;QAChB,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YACxB,IAAI,CAAC;gBACH,MAAM,OAAO,EAAE,aAAa,CAAC,GAAG,CAAC,CAAA;YACnC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,KAAK,CAAC,oEAAoE,EAAE;oBACjF,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBACxD,CAAC,CAAA;YACJ,CAAC;QACH,CAAC,CAAC;QACF,CAAC,KAAK,IAAI,EAAE;YACV,IAAI,CAAC;gBACH,MAAM,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,IAAI,CAAC,CAAA;YAC3C,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,KAAK,CAAC,0DAA0D,EAAE;oBACvE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBACxD,CAAC,CAAA;YACJ,CAAC;QACH,CAAC,CAAC,EAAE;QACJ,CAAC,KAAK,IAAI,EAAE;YACV,IAAI,CAAC;gBACH,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAA;gBACzD,MAAM,QAAQ,CAAC,gBAAgB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;YAC9C,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,KAAK,CAAC,wCAAwC,EAAE;oBACrD,MAAM;oBACN,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBACxD,CAAC,CAAA;YACJ,CAAC;QACH,CAAC,CAAC,EAAE;KACL,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Site chrome endpoints (DATA_CONTRACTS §2). Admin endpoints live at
3
+ * `/chrome/*`; the site reads `/public/chrome?path=`.
4
+ *
5
+ * Access: anyone signed in may read; saving values, the announcement or
6
+ * "Remove now" needs a role that can publish (a save goes live at once);
7
+ * pushing the schema and the Developer tab's settings need an admin. API keys
8
+ * also need the `chrome` global scope (or admin scope), and for a write the
9
+ * action it takes (`update` or `create`; `delete` for "Remove now"), so a
10
+ * read-only key can't save.
11
+ */
12
+ import type { ApiRouter } from '../api/router.js';
13
+ export declare function registerChromeRoutes(router: ApiRouter): void;
14
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/chrome/routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AA8GjD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgO5D"}