@kywi-software/core 0.15.0 → 0.15.1

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 (249) hide show
  1. package/AGENT-PATTERNS.md +47 -0
  2. package/dist/admin/audience-editor.d.ts +2 -0
  3. package/dist/admin/audience-editor.d.ts.map +1 -1
  4. package/dist/admin/audience-editor.js +4 -2
  5. package/dist/admin/audience-editor.js.map +1 -1
  6. package/dist/admin/condition-builder.d.ts.map +1 -1
  7. package/dist/admin/condition-builder.js +16 -3
  8. package/dist/admin/condition-builder.js.map +1 -1
  9. package/dist/admin/rule-tester.d.ts +1 -0
  10. package/dist/admin/rule-tester.d.ts.map +1 -1
  11. package/dist/admin/rule-tester.js +7 -4
  12. package/dist/admin/rule-tester.js.map +1 -1
  13. package/dist/admin/signal-options.d.ts +17 -0
  14. package/dist/admin/signal-options.d.ts.map +1 -1
  15. package/dist/admin/signal-options.js +28 -0
  16. package/dist/admin/signal-options.js.map +1 -1
  17. package/dist/admin/surfaces/audiences/audiences-data.d.ts +5 -0
  18. package/dist/admin/surfaces/audiences/audiences-data.d.ts.map +1 -1
  19. package/dist/admin/surfaces/audiences/audiences-data.js +3 -0
  20. package/dist/admin/surfaces/audiences/audiences-data.js.map +1 -1
  21. package/dist/api/api-key-routes.js +2 -2
  22. package/dist/api/api-key-routes.js.map +1 -1
  23. package/dist/api/audience-routes.d.ts.map +1 -1
  24. package/dist/api/audience-routes.js +10 -4
  25. package/dist/api/audience-routes.js.map +1 -1
  26. package/dist/api/audience-runtime-routes.d.ts +17 -0
  27. package/dist/api/audience-runtime-routes.d.ts.map +1 -1
  28. package/dist/api/audience-runtime-routes.js +474 -23
  29. package/dist/api/audience-runtime-routes.js.map +1 -1
  30. package/dist/api/ax-routes.d.ts.map +1 -1
  31. package/dist/api/ax-routes.js +7 -3
  32. package/dist/api/ax-routes.js.map +1 -1
  33. package/dist/api/category-routes.js +3 -3
  34. package/dist/api/category-routes.js.map +1 -1
  35. package/dist/api/changeset-routes.js +2 -2
  36. package/dist/api/changeset-routes.js.map +1 -1
  37. package/dist/api/comment-routes.js +4 -4
  38. package/dist/api/comment-routes.js.map +1 -1
  39. package/dist/api/component-routes.js +3 -3
  40. package/dist/api/component-routes.js.map +1 -1
  41. package/dist/api/config-routes.js +4 -4
  42. package/dist/api/config-routes.js.map +1 -1
  43. package/dist/api/content-permission-routes.js +2 -2
  44. package/dist/api/content-permission-routes.js.map +1 -1
  45. package/dist/api/content-routes.d.ts.map +1 -1
  46. package/dist/api/content-routes.js +8 -3
  47. package/dist/api/content-routes.js.map +1 -1
  48. package/dist/api/content-type-routes.js +3 -3
  49. package/dist/api/content-type-routes.js.map +1 -1
  50. package/dist/api/experiment-routes.js +2 -2
  51. package/dist/api/experiment-routes.js.map +1 -1
  52. package/dist/api/extension-routes.js +4 -4
  53. package/dist/api/extension-routes.js.map +1 -1
  54. package/dist/api/feed-routes.js +2 -2
  55. package/dist/api/feed-routes.js.map +1 -1
  56. package/dist/api/form-routes.js +2 -2
  57. package/dist/api/form-routes.js.map +1 -1
  58. package/dist/api/group-routes.js +3 -3
  59. package/dist/api/group-routes.js.map +1 -1
  60. package/dist/api/index.d.ts.map +1 -1
  61. package/dist/api/index.js +4 -1
  62. package/dist/api/index.js.map +1 -1
  63. package/dist/api/layout-routes.d.ts +19 -1
  64. package/dist/api/layout-routes.d.ts.map +1 -1
  65. package/dist/api/layout-routes.js +65 -5
  66. package/dist/api/layout-routes.js.map +1 -1
  67. package/dist/api/layout-write-guard.d.ts +3 -2
  68. package/dist/api/layout-write-guard.d.ts.map +1 -1
  69. package/dist/api/layout-write-guard.js +12 -4
  70. package/dist/api/layout-write-guard.js.map +1 -1
  71. package/dist/api/media-routes.d.ts.map +1 -1
  72. package/dist/api/media-routes.js +50 -9
  73. package/dist/api/media-routes.js.map +1 -1
  74. package/dist/api/menu-routes.js +2 -2
  75. package/dist/api/menu-routes.js.map +1 -1
  76. package/dist/api/nav-routes.js +3 -3
  77. package/dist/api/nav-routes.js.map +1 -1
  78. package/dist/api/oauth-routes.js +2 -2
  79. package/dist/api/oauth-routes.js.map +1 -1
  80. package/dist/api/openapi.d.ts.map +1 -1
  81. package/dist/api/openapi.js +14 -1
  82. package/dist/api/openapi.js.map +1 -1
  83. package/dist/api/pagination.d.ts +10 -0
  84. package/dist/api/pagination.d.ts.map +1 -1
  85. package/dist/api/pagination.js +7 -1
  86. package/dist/api/pagination.js.map +1 -1
  87. package/dist/api/response.d.ts +29 -0
  88. package/dist/api/response.d.ts.map +1 -1
  89. package/dist/api/response.js +23 -3
  90. package/dist/api/response.js.map +1 -1
  91. package/dist/api/search-routes.d.ts.map +1 -1
  92. package/dist/api/search-routes.js +17 -3
  93. package/dist/api/search-routes.js.map +1 -1
  94. package/dist/api/section-template-routes.js +2 -2
  95. package/dist/api/section-template-routes.js.map +1 -1
  96. package/dist/api/site-routes.js +2 -2
  97. package/dist/api/site-routes.js.map +1 -1
  98. package/dist/api/tag-routes.d.ts.map +1 -1
  99. package/dist/api/tag-routes.js +2 -2
  100. package/dist/api/tag-routes.js.map +1 -1
  101. package/dist/api/user-routes.js +2 -2
  102. package/dist/api/user-routes.js.map +1 -1
  103. package/dist/api/version-routes.js +2 -2
  104. package/dist/api/version-routes.js.map +1 -1
  105. package/dist/api/webhook-routes.js +3 -3
  106. package/dist/api/webhook-routes.js.map +1 -1
  107. package/dist/api/workflow-routes.d.ts.map +1 -1
  108. package/dist/api/workflow-routes.js +15 -6
  109. package/dist/api/workflow-routes.js.map +1 -1
  110. package/dist/audiences/collectors/index.d.ts +8 -4
  111. package/dist/audiences/collectors/index.d.ts.map +1 -1
  112. package/dist/audiences/collectors/index.js +17 -4
  113. package/dist/audiences/collectors/index.js.map +1 -1
  114. package/dist/audiences/collectors/selfid.d.ts +25 -0
  115. package/dist/audiences/collectors/selfid.d.ts.map +1 -0
  116. package/dist/audiences/collectors/selfid.js +46 -0
  117. package/dist/audiences/collectors/selfid.js.map +1 -0
  118. package/dist/audiences/collectors/session.d.ts +41 -0
  119. package/dist/audiences/collectors/session.d.ts.map +1 -0
  120. package/dist/audiences/collectors/session.js +50 -0
  121. package/dist/audiences/collectors/session.js.map +1 -0
  122. package/dist/audiences/consent.d.ts +13 -0
  123. package/dist/audiences/consent.d.ts.map +1 -1
  124. package/dist/audiences/consent.js +13 -0
  125. package/dist/audiences/consent.js.map +1 -1
  126. package/dist/audiences/cookies.d.ts +21 -0
  127. package/dist/audiences/cookies.d.ts.map +1 -1
  128. package/dist/audiences/cookies.js +26 -0
  129. package/dist/audiences/cookies.js.map +1 -1
  130. package/dist/audiences/engine.d.ts.map +1 -1
  131. package/dist/audiences/engine.js +1 -0
  132. package/dist/audiences/engine.js.map +1 -1
  133. package/dist/audiences/entry-page.d.ts +89 -0
  134. package/dist/audiences/entry-page.d.ts.map +1 -0
  135. package/dist/audiences/entry-page.js +116 -0
  136. package/dist/audiences/entry-page.js.map +1 -0
  137. package/dist/audiences/evaluator/instant-match.d.ts.map +1 -1
  138. package/dist/audiences/evaluator/instant-match.js +7 -0
  139. package/dist/audiences/evaluator/instant-match.js.map +1 -1
  140. package/dist/audiences/index.d.ts +3 -2
  141. package/dist/audiences/index.d.ts.map +1 -1
  142. package/dist/audiences/index.js +6 -2
  143. package/dist/audiences/index.js.map +1 -1
  144. package/dist/audiences/queries.d.ts +16 -0
  145. package/dist/audiences/queries.d.ts.map +1 -1
  146. package/dist/audiences/queries.js +28 -1
  147. package/dist/audiences/queries.js.map +1 -1
  148. package/dist/audiences/schema.d.ts +17 -0
  149. package/dist/audiences/schema.d.ts.map +1 -1
  150. package/dist/audiences/schema.js +7 -0
  151. package/dist/audiences/schema.js.map +1 -1
  152. package/dist/audiences/server-eval.d.ts +19 -0
  153. package/dist/audiences/server-eval.d.ts.map +1 -1
  154. package/dist/audiences/server-eval.js +17 -1
  155. package/dist/audiences/server-eval.js.map +1 -1
  156. package/dist/audiences/types.d.ts +22 -1
  157. package/dist/audiences/types.d.ts.map +1 -1
  158. package/dist/audiences/types.js +1 -0
  159. package/dist/audiences/types.js.map +1 -1
  160. package/dist/ax/content-source.d.ts +10 -2
  161. package/dist/ax/content-source.d.ts.map +1 -1
  162. package/dist/ax/content-source.js +81 -5
  163. package/dist/ax/content-source.js.map +1 -1
  164. package/dist/ax/effective-body.d.ts +28 -0
  165. package/dist/ax/effective-body.d.ts.map +1 -0
  166. package/dist/ax/effective-body.js +47 -0
  167. package/dist/ax/effective-body.js.map +1 -0
  168. package/dist/ax/index.d.ts +3 -1
  169. package/dist/ax/index.d.ts.map +1 -1
  170. package/dist/ax/index.js +2 -0
  171. package/dist/ax/index.js.map +1 -1
  172. package/dist/ax/jsonld.d.ts +31 -1
  173. package/dist/ax/jsonld.d.ts.map +1 -1
  174. package/dist/ax/jsonld.js +35 -22
  175. package/dist/ax/jsonld.js.map +1 -1
  176. package/dist/ax/layout-to-html.d.ts +127 -0
  177. package/dist/ax/layout-to-html.d.ts.map +1 -0
  178. package/dist/ax/layout-to-html.js +545 -0
  179. package/dist/ax/layout-to-html.js.map +1 -0
  180. package/dist/ax/llms-full-txt.d.ts +3 -1
  181. package/dist/ax/llms-full-txt.d.ts.map +1 -1
  182. package/dist/ax/llms-full-txt.js +5 -2
  183. package/dist/ax/llms-full-txt.js.map +1 -1
  184. package/dist/ax/page-markdown.d.ts +10 -2
  185. package/dist/ax/page-markdown.d.ts.map +1 -1
  186. package/dist/ax/page-markdown.js +16 -3
  187. package/dist/ax/page-markdown.js.map +1 -1
  188. package/dist/ax/summary.d.ts +4 -0
  189. package/dist/ax/summary.d.ts.map +1 -1
  190. package/dist/ax/summary.js +6 -1
  191. package/dist/ax/summary.js.map +1 -1
  192. package/dist/ax/types.d.ts +24 -0
  193. package/dist/ax/types.d.ts.map +1 -1
  194. package/dist/cache/content-invalidation.d.ts.map +1 -1
  195. package/dist/cache/content-invalidation.js +11 -0
  196. package/dist/cache/content-invalidation.js.map +1 -1
  197. package/dist/db/apply-snapshot.d.ts +7 -0
  198. package/dist/db/apply-snapshot.d.ts.map +1 -1
  199. package/dist/db/apply-snapshot.js +7 -0
  200. package/dist/db/apply-snapshot.js.map +1 -1
  201. package/dist/db/ax-queries.d.ts +6 -0
  202. package/dist/db/ax-queries.d.ts.map +1 -1
  203. package/dist/db/ax-queries.js +6 -0
  204. package/dist/db/ax-queries.js.map +1 -1
  205. package/dist/db/content-queries.d.ts.map +1 -1
  206. package/dist/db/content-queries.js +8 -0
  207. package/dist/db/content-queries.js.map +1 -1
  208. package/dist/db/layout-queries.d.ts +19 -2
  209. package/dist/db/layout-queries.d.ts.map +1 -1
  210. package/dist/db/layout-queries.js +11 -3
  211. package/dist/db/layout-queries.js.map +1 -1
  212. package/dist/db/search-queries.d.ts.map +1 -1
  213. package/dist/db/search-queries.js +24 -1
  214. package/dist/db/search-queries.js.map +1 -1
  215. package/dist/hooks/ax-invalidation.d.ts.map +1 -1
  216. package/dist/hooks/ax-invalidation.js +4 -0
  217. package/dist/hooks/ax-invalidation.js.map +1 -1
  218. package/dist/layout/index.d.ts +3 -1
  219. package/dist/layout/index.d.ts.map +1 -1
  220. package/dist/layout/index.js +3 -1
  221. package/dist/layout/index.js.map +1 -1
  222. package/dist/layout/module-permissions.d.ts.map +1 -1
  223. package/dist/layout/module-permissions.js +2 -38
  224. package/dist/layout/module-permissions.js.map +1 -1
  225. package/dist/layout/seed-defaults.d.ts +45 -0
  226. package/dist/layout/seed-defaults.d.ts.map +1 -0
  227. package/dist/layout/seed-defaults.js +75 -0
  228. package/dist/layout/seed-defaults.js.map +1 -0
  229. package/dist/layout/walk.d.ts +14 -0
  230. package/dist/layout/walk.d.ts.map +1 -0
  231. package/dist/layout/walk.js +49 -0
  232. package/dist/layout/walk.js.map +1 -0
  233. package/dist/media/index.d.ts +1 -1
  234. package/dist/media/index.d.ts.map +1 -1
  235. package/dist/media/index.js +1 -1
  236. package/dist/media/index.js.map +1 -1
  237. package/dist/media/upload-allowlist.d.ts +23 -0
  238. package/dist/media/upload-allowlist.d.ts.map +1 -1
  239. package/dist/media/upload-allowlist.js +29 -0
  240. package/dist/media/upload-allowlist.js.map +1 -1
  241. package/dist/schema/mysql-tables.d.ts +17 -0
  242. package/dist/schema/mysql-tables.d.ts.map +1 -1
  243. package/dist/schema/mysql-tables.js +2 -0
  244. package/dist/schema/mysql-tables.js.map +1 -1
  245. package/dist/scope/jsonld.d.ts +18 -3
  246. package/dist/scope/jsonld.d.ts.map +1 -1
  247. package/dist/scope/jsonld.js +6 -4
  248. package/dist/scope/jsonld.js.map +1 -1
  249. package/package.json +6 -1
@@ -13,6 +13,25 @@ export interface ServerAudienceEvaluation {
13
13
  audiences: Audience[];
14
14
  /** The full winning audience, or null when unmatched / opted out. */
15
15
  winningAudience: Audience | null;
16
+ /**
17
+ * `Set-Cookie` header values this evaluation wants written, or an empty array
18
+ * (kywi-cms#196). Today that is the session-scoped `kywi_entry` cookie, and
19
+ * only on the first request of a consenting visitor's session.
20
+ *
21
+ * Covered by `__tests__/server-eval.test.ts`; the shipped hosts write the
22
+ * cookie in middleware instead (see `apps/reference/middleware.ts`), which is
23
+ * earlier and cheaper, so this is the seam for a host that has no middleware
24
+ * layer rather than the path Kywi's own apps take.
25
+ *
26
+ * Returned rather than written because this seam has no response to write to:
27
+ * a Next.js server component cannot set a cookie during render. Hosts that DO
28
+ * have a response — a route handler, or middleware, which is where the
29
+ * reference app writes it — should copy these onto it. Ignoring them is safe:
30
+ * the entry page still resolves for every request, off the request's own path
31
+ * (see `collectors/session.ts`); it simply stops being the FIRST page once the
32
+ * visitor navigates.
33
+ */
34
+ setCookieHeaders: string[];
16
35
  }
17
36
  /**
18
37
  * Server-side audience evaluation for a public request.
@@ -1 +1 @@
1
- {"version":3,"file":"server-eval.d.ts","sourceRoot":"","sources":["../../src/audiences/server-eval.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAG7C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAE1D;;;;;GAKG;AACH,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,cAAc,CAAA;IACtB,8DAA8D;IAC9D,SAAS,EAAE,QAAQ,EAAE,CAAA;IACrB,qEAAqE;IACrE,eAAe,EAAE,QAAQ,GAAG,IAAI,CAAA;CACjC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,uBAAuB,CAC3C,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,EAChB,IAAI,GAAE,kBAAuB,GAC5B,OAAO,CAAC,wBAAwB,CAAC,CAanC"}
1
+ {"version":3,"file":"server-eval.d.ts","sourceRoot":"","sources":["../../src/audiences/server-eval.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAG7C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAGtD,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAE1D;;;;;GAKG;AACH,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,cAAc,CAAA;IACtB,8DAA8D;IAC9D,SAAS,EAAE,QAAQ,EAAE,CAAA;IACrB,qEAAqE;IACrE,eAAe,EAAE,QAAQ,GAAG,IAAI,CAAA;IAChC;;;;;;;;;;;;;;;;;OAiBG;IACH,gBAAgB,EAAE,MAAM,EAAE,CAAA;CAC3B;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,uBAAuB,CAC3C,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,EAChB,IAAI,GAAE,kBAAuB,GAC5B,OAAO,CAAC,wBAAwB,CAAC,CA2BnC"}
@@ -1,5 +1,7 @@
1
1
  import { getActiveAudiences } from './queries.js';
2
2
  import { createAudienceEngine } from './engine.js';
3
+ import { buildSetCookieHeader, COOKIE_MAX_AGE, COOKIE_NAMES } from './cookies.js';
4
+ import { entryPageCookieValue } from './entry-page.js';
3
5
  /**
4
6
  * Server-side audience evaluation for a public request.
5
7
  *
@@ -34,6 +36,20 @@ export async function evaluateActiveAudiences(db, siteId, request, opts = {}) {
34
36
  const winningAudience = result.winningAudienceId
35
37
  ? (audiences.find((a) => a.id === result.winningAudienceId) ?? null)
36
38
  : null;
37
- return { result, audiences, winningAudience };
39
+ // The entry page is recorded on the first request of the session only — and
40
+ // only for a consenting visitor, since `kywi_entry` is a `personalization`
41
+ // cookie (kywi-cms#91/#196). `entryPageCookieValue` applies both rules.
42
+ const entryValue = entryPageCookieValue(request.url, {
43
+ ...opts,
44
+ cookieHeader: request.headers.get('cookie'),
45
+ // Only a document request may name the entry page — a subresource that
46
+ // happens to come first would poison it (kywi-cms#196, review item 6).
47
+ secFetchDest: request.headers.get('sec-fetch-dest'),
48
+ accept: request.headers.get('accept'),
49
+ });
50
+ const setCookieHeaders = entryValue
51
+ ? [buildSetCookieHeader(COOKIE_NAMES.ENTRY, entryValue, COOKIE_MAX_AGE.ENTRY, { httpOnly: false })]
52
+ : [];
53
+ return { result, audiences, winningAudience, setCookieHeaders };
38
54
  }
39
55
  //# sourceMappingURL=server-eval.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"server-eval.js","sourceRoot":"","sources":["../../src/audiences/server-eval.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAkBlD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,EAAU,EACV,MAAc,EACd,OAAgB,EAChB,OAA2B,EAAE;IAE7B,MAAM,SAAS,GAAG,MAAM,kBAAkB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;IACtD,sEAAsE;IACtE,gDAAgD;IAChD,MAAM,YAAY,GAChB,IAAI,CAAC,cAAc,KAAK,SAAS;QAC/B,CAAC,CAAC,EAAE,SAAS,EAAE;QACf,CAAC,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,CAAA;IACxD,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;IAC7E,MAAM,eAAe,GAAG,MAAM,CAAC,iBAAiB;QAC9C,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,iBAAiB,CAAC,IAAI,IAAI,CAAC;QACpE,CAAC,CAAC,IAAI,CAAA;IACR,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,CAAA;AAC/C,CAAC"}
1
+ {"version":3,"file":"server-eval.js","sourceRoot":"","sources":["../../src/audiences/server-eval.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAElD,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AACjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AAoCtD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,EAAU,EACV,MAAc,EACd,OAAgB,EAChB,OAA2B,EAAE;IAE7B,MAAM,SAAS,GAAG,MAAM,kBAAkB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;IACtD,sEAAsE;IACtE,gDAAgD;IAChD,MAAM,YAAY,GAChB,IAAI,CAAC,cAAc,KAAK,SAAS;QAC/B,CAAC,CAAC,EAAE,SAAS,EAAE;QACf,CAAC,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,CAAA;IACxD,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;IAC7E,MAAM,eAAe,GAAG,MAAM,CAAC,iBAAiB;QAC9C,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,iBAAiB,CAAC,IAAI,IAAI,CAAC;QACpE,CAAC,CAAC,IAAI,CAAA;IACR,4EAA4E;IAC5E,2EAA2E;IAC3E,wEAAwE;IACxE,MAAM,UAAU,GAAG,oBAAoB,CAAC,OAAO,CAAC,GAAG,EAAE;QACnD,GAAG,IAAI;QACP,YAAY,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC3C,uEAAuE;QACvE,uEAAuE;QACvE,YAAY,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;QACnD,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;KACtC,CAAC,CAAA;IACF,MAAM,gBAAgB,GAAG,UAAU;QACjC,CAAC,CAAC,CAAC,oBAAoB,CAAC,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,cAAc,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QACnG,CAAC,CAAC,EAAE,CAAA;IACN,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,gBAAgB,EAAE,CAAA;AACjE,CAAC"}
@@ -22,6 +22,14 @@ export interface VisitorSignals {
22
22
  categoryScores: Record<string, number>;
23
23
  totalScore: number;
24
24
  };
25
+ /**
26
+ * Every query parameter on the request being served, as the `query.<param>`
27
+ * signal family (kywi-cms#196). Not stored and never gated — like the URL's
28
+ * own `utm_*` params these are the content of this request, so a campaign link
29
+ * (`/developers?from=marketer`) is a one-line rule that fires on the very
30
+ * request that carries it.
31
+ */
32
+ query: Record<string, string>;
25
33
  selfId: Record<string, string>;
26
34
  identity: {
27
35
  visitorId: string;
@@ -56,6 +64,19 @@ export interface Audience {
56
64
  status: AudienceStatus;
57
65
  conditionGroups: ConditionGroup[];
58
66
  scoreThreshold: number | null;
67
+ /**
68
+ * The audience's NAME may be listed to the public by
69
+ * `GET /api/v1/kywi/audiences`, so a page can offer the visitor a choice
70
+ * ("What brings you here?") without an admin token (kywi-cms#200). Off by
71
+ * default — an audience is an internal segment definition until someone
72
+ * deliberately publishes its name.
73
+ *
74
+ * Optional because this shape is also parsed from payloads written before the
75
+ * column existed (an audience list serialized into a page, a fixture); absent
76
+ * reads as false everywhere, and the public listing filters in SQL rather than
77
+ * trusting this field.
78
+ */
79
+ public?: boolean;
59
80
  createdAt: Date;
60
81
  updatedAt: Date;
61
82
  }
@@ -74,7 +95,7 @@ export interface InstantMatchCondition {
74
95
  operator: InstantOperator;
75
96
  value: string | string[];
76
97
  }
77
- export type InstantSignalRef = 'utm.source' | 'utm.medium' | 'utm.campaign' | 'utm.term' | 'utm.content' | 'referrer.domain' | 'referrer.sourceType' | `selfId.${string}` | `adapter.${string}` | 'identity.isKnown' | 'session.entryPage' | 'session.pagesVisited';
98
+ export type InstantSignalRef = 'utm.source' | 'utm.medium' | 'utm.campaign' | 'utm.term' | 'utm.content' | 'referrer.domain' | 'referrer.sourceType' | `selfId.${string}` | `adapter.${string}` | 'identity.isKnown' | 'session.entryPage' | 'session.pagesVisited' | `query.${string}`;
78
99
  export type InstantOperator = 'equals' | 'not_equals' | 'contains' | 'starts_with' | 'matches_glob' | 'is_one_of' | 'is_true' | 'is_false' | 'gte' | 'lte';
79
100
  export interface ScoreContributionCondition {
80
101
  type: 'score';
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/audiences/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/audiences/types.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE;QACH,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;QACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;QACrB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;QACvB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;QACnB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;KACvB,CAAA;IACD,QAAQ,EAAE;QACR,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;QAClB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;QACrB,UAAU,EAAE,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAA;KACzE,CAAA;IACD,OAAO,EAAE;QACP,aAAa,EAAE,MAAM,CAAA;QACrB,cAAc,EAAE,MAAM,CAAA;QACtB,eAAe,EAAE,MAAM,CAAA;QACvB,SAAS,EAAE,MAAM,CAAA;QACjB,YAAY,EAAE,MAAM,EAAE,CAAA;KACvB,CAAA;IACD,UAAU,EAAE;QACV,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QACtC,UAAU,EAAE,MAAM,CAAA;KACnB,CAAA;IACD;;;;;;OAMG;IACH,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC7B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9B,QAAQ,EAAE;QACR,SAAS,EAAE,MAAM,CAAA;QACjB,OAAO,EAAE,OAAO,CAAA;QAChB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;KACxB,CAAA;IACD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,IAAI,EAAE;QACJ,UAAU,EAAE,OAAO,CAAA;QACnB,SAAS,EAAE,OAAO,CAAA;QAClB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAA;QAChC,UAAU,EAAE,QAAQ,GAAG,QAAQ,CAAA;KAChC,CAAA;CACF;AAID,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAA;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;CACzC;AAED,MAAM,WAAW,cAAc;IAC7B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB,OAAO,EAAE,cAAc,CAAA;IACvB,UAAU,EAAE,OAAO,CAAA;CACpB;AAID,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,CAAA;AAE5D,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,cAAc,CAAA;IACtB,eAAe,EAAE,cAAc,EAAE,CAAA;IACjC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,SAAS,EAAE,IAAI,CAAA;IACf,SAAS,EAAE,IAAI,CAAA;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,SAAS,EAAE,CAAA;CACxB;AAED,MAAM,MAAM,SAAS,GAAG,qBAAqB,GAAG,0BAA0B,CAAA;AAE1E,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,SAAS,CAAA;IACf,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,gBAAgB,CAAA;IACxB,QAAQ,EAAE,eAAe,CAAA;IACzB,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;CACzB;AAED,MAAM,MAAM,gBAAgB,GACxB,YAAY,GAAG,YAAY,GAAG,cAAc,GAAG,UAAU,GAAG,aAAa,GACzE,iBAAiB,GAAG,qBAAqB,GACzC,UAAU,MAAM,EAAE,GAClB,WAAW,MAAM,EAAE,GACnB,kBAAkB,GAClB,mBAAmB,GACnB,sBAAsB,GACtB,SAAS,MAAM,EAAE,CAAA;AAErB,MAAM,MAAM,eAAe,GACvB,QAAQ,GAAG,YAAY,GAAG,UAAU,GAAG,aAAa,GAAG,cAAc,GACrE,WAAW,GAAG,SAAS,GAAG,UAAU,GACpC,KAAK,GAAG,KAAK,CAAA;AAEjB,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,OAAO,CAAA;IACb,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,YAAY,CAAA;IACrB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,gBAAgB,CAAA;IACzB,QAAQ,CAAC,EAAE,eAAe,CAAA;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;CAC1B;AAED,MAAM,MAAM,YAAY,GACpB,eAAe,GACf,gBAAgB,GAChB,UAAU,GACV,gBAAgB,GAChB,YAAY,GACZ,aAAa,CAAA;AAIjB,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACjD,QAAQ,EAAE,OAAO,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,eAAe,GAAG,kBAAkB,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAA;IAC9F,OAAO,EAAE,aAAa,CAAA;IACtB,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,SAAS,EAAE,cAAc,GAAG,cAAc,GAAG,QAAQ,CAAA;CACtD;AAED,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAA;AAItB,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAA;IACX,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;CAClB;AAID,wBAAgB,kBAAkB,IAAI,cAAc,CAYnD"}
@@ -6,6 +6,7 @@ export function createEmptySignals() {
6
6
  referrer: { raw: null, domain: null, sourceType: 'direct' },
7
7
  session: { pageViewCount: 0, totalPageViews: 0, sessionDuration: 0, entryPage: '/', pagesVisited: [] },
8
8
  behavioral: { categoryScores: {}, totalScore: 0 },
9
+ query: {},
9
10
  selfId: {},
10
11
  identity: { visitorId: '', isKnown: false, maLeadId: null },
11
12
  adapters: {},
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/audiences/types.ts"],"names":[],"mappings":"AAAA,gFAAgF;AA0KhF,gFAAgF;AAEhF,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;QAC9E,QAAQ,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE;QAC3D,OAAO,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE;QACtG,UAAU,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE;QACjD,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC3D,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE;KAC7F,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/audiences/types.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAgMhF,gFAAgF;AAEhF,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;QAC9E,QAAQ,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE;QAC3D,OAAO,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE;QACtG,UAAU,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE;QACjD,KAAK,EAAE,EAAE;QACT,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC3D,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE;KAC7F,CAAA;AACH,CAAC"}
@@ -9,8 +9,16 @@ import type { AxContentSource } from './types.js';
9
9
  * generators need. Fixtures implement the same interface for unit tests, so the
10
10
  * generators never depend on a database.
11
11
  *
12
- * @param config reserved for future curation the DB source may need; currently
13
- * the source derives everything it needs from the DB directly.
12
+ * It is also where the LAYOUT PROJECTION is computed (kywi-cms#195). A page
13
+ * built in the layout editor keeps its copy in `layout`, and serializing that
14
+ * faithfully needs two things only this layer has: the site's module registry
15
+ * (so CUSTOM modules serialize from their declared prop schema) and its saved
16
+ * component definitions (so a linked placement projects what it renders). The
17
+ * result rides on the node as `layoutHtml`, which keeps every generator pure and
18
+ * synchronous — a fixture that supplies a `body` or a plain `layout` still
19
+ * exercises the same code.
20
+ *
21
+ * @param config supplies `modules` for the registry. Omitted → built-ins only.
14
22
  */
15
23
  export declare function createDbAxContentSource(db: KywiDb, config?: KywiConfig): AxContentSource;
16
24
  //# sourceMappingURL=content-source.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"content-source.d.ts","sourceRoot":"","sources":["../../src/ax/content-source.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,KAAK,EAAE,eAAe,EAAc,MAAM,YAAY,CAAA;AAE7D;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,eAAe,CAiBxF"}
1
+ {"version":3,"file":"content-source.d.ts","sourceRoot":"","sources":["../../src/ax/content-source.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,KAAK,EAAiB,eAAe,EAAc,MAAM,YAAY,CAAA;AAE5E;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,eAAe,CA0CxF"}
@@ -1,5 +1,9 @@
1
1
  import { listPublishedForAx } from '../db/ax-queries.js';
2
2
  import { getSiteById } from '../db/site-queries.js';
3
+ import { listComponents } from '../db/component-queries.js';
4
+ import { componentDetachSource } from '../layout/component-refs.js';
5
+ import { createModuleRegistry } from '../layout/registry.js';
6
+ import { withLayoutHtml } from './effective-body.js';
3
7
  /**
4
8
  * Production `AxContentSource` — the single read path backing every generator.
5
9
  *
@@ -8,14 +12,47 @@ import { getSiteById } from '../db/site-queries.js';
8
12
  * generators need. Fixtures implement the same interface for unit tests, so the
9
13
  * generators never depend on a database.
10
14
  *
11
- * @param config reserved for future curation the DB source may need; currently
12
- * the source derives everything it needs from the DB directly.
15
+ * It is also where the LAYOUT PROJECTION is computed (kywi-cms#195). A page
16
+ * built in the layout editor keeps its copy in `layout`, and serializing that
17
+ * faithfully needs two things only this layer has: the site's module registry
18
+ * (so CUSTOM modules serialize from their declared prop schema) and its saved
19
+ * component definitions (so a linked placement projects what it renders). The
20
+ * result rides on the node as `layoutHtml`, which keeps every generator pure and
21
+ * synchronous — a fixture that supplies a `body` or a plain `layout` still
22
+ * exercises the same code.
23
+ *
24
+ * @param config supplies `modules` for the registry. Omitted → built-ins only.
13
25
  */
14
26
  export function createDbAxContentSource(db, config) {
15
- void config;
27
+ const registry = createModuleRegistry(config?.modules ?? []);
28
+ async function projectionOpts(siteId) {
29
+ return { modules: registry, resolveComponent: await buildComponentResolver(db, siteId) };
30
+ }
16
31
  return {
17
- listForSite(siteId) {
18
- return listPublishedForAx(db, siteId);
32
+ async listForSite(siteId) {
33
+ const nodes = await listPublishedForAx(db, siteId);
34
+ // Only pay for the components read when something would actually use it.
35
+ if (!nodes.some(needsLayoutProjection))
36
+ return nodes;
37
+ const opts = await projectionOpts(siteId);
38
+ return nodes.map(node => (needsLayoutProjection(node) ? withLayoutHtml(node, opts) : node));
39
+ },
40
+ /**
41
+ * One node by slug, projecting ONE layout.
42
+ *
43
+ * `/<path>.md` used to call `listForSite` and `.find()` the node it wanted,
44
+ * which projected every page's layout — on an uncached route — to answer for
45
+ * one (kywi-cms#195 review). The read is still the same single query; only
46
+ * the projection is narrowed.
47
+ */
48
+ async getForSite(siteId, slug) {
49
+ const nodes = await listPublishedForAx(db, siteId);
50
+ const node = nodes.find(n => n.slug === slug);
51
+ if (!node)
52
+ return null;
53
+ if (!needsLayoutProjection(node))
54
+ return node;
55
+ return withLayoutHtml(node, await projectionOpts(siteId));
19
56
  },
20
57
  async getSiteMeta(siteId) {
21
58
  const site = await getSiteById(db, siteId);
@@ -30,4 +67,43 @@ export function createDbAxContentSource(db, config) {
30
67
  },
31
68
  };
32
69
  }
70
+ function needsLayoutProjection(node) {
71
+ // A node the editor marked "exclude from search & AX" is filtered out of every
72
+ // surface that would read the projection, so building it is pure cost — and on
73
+ // a site that excludes most of its tree, it is the cost that decides whether
74
+ // the components read happens at all.
75
+ if (node.excludeFromSearch === true)
76
+ return false;
77
+ if (typeof node.body === 'string' && node.body.trim())
78
+ return false;
79
+ return Boolean(node['layout']);
80
+ }
81
+ /**
82
+ * One read of the site's components, indexed by id AND by name, projected
83
+ * through {@link componentDetachSource} — the same projection the renderer and
84
+ * detach use, so the AX corpus shows what a placement actually draws.
85
+ *
86
+ * Name doubles as the `component` module's `slug` prop: `kywi_components` has no
87
+ * slug column, and a placement written before ids were stored addresses its
88
+ * target by name.
89
+ */
90
+ async function buildComponentResolver(db, siteId) {
91
+ const byId = new Map();
92
+ const byName = new Map();
93
+ const rows = await listComponents(db, siteId);
94
+ for (const row of rows) {
95
+ const source = componentDetachSource(row);
96
+ byId.set(row.id, source);
97
+ if (row.name && !byName.has(row.name))
98
+ byName.set(row.name, source);
99
+ }
100
+ return ({ componentId, slug }) => {
101
+ if (componentId) {
102
+ const byIdHit = byId.get(componentId);
103
+ if (byIdHit)
104
+ return byIdHit;
105
+ }
106
+ return slug ? byName.get(slug) ?? null : null;
107
+ };
108
+ }
33
109
  //# sourceMappingURL=content-source.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"content-source.js","sourceRoot":"","sources":["../../src/ax/content-source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAKnD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,uBAAuB,CAAC,EAAU,EAAE,MAAmB;IACrE,KAAK,MAAM,CAAA;IACX,OAAO;QACL,WAAW,CAAC,MAAc;YACxB,OAAO,kBAAkB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;QACvC,CAAC;QACD,KAAK,CAAC,WAAW,CAAC,MAAc;YAC9B,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;YAC1C,IAAI,CAAC,IAAI;gBAAE,OAAO,IAAI,CAAA;YACtB,OAAO;gBACL,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,aAAa,EAAE,IAAI,CAAC,aAAa;aAClC,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"content-source.js","sourceRoot":"","sources":["../../src/ax/content-source.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { LayoutToHtmlOptions } from './layout-to-html.js';
2
+ import type { AxContentNode } from './types.js';
3
+ /**
4
+ * THE one answer to "what is this node's body copy", for every AX surface
5
+ * (kywi-cms#195).
6
+ *
7
+ * Resolution order:
8
+ * 1. the stored `body` column, when it holds anything — an article written in
9
+ * the rich-text field is already the whole page;
10
+ * 2. `layoutHtml`, the layout projection the AX CONTENT SOURCE precomputed
11
+ * (it is the only layer that can hand `layoutToHtml` the site's module
12
+ * registry and its saved component definitions);
13
+ * 3. a direct {@link layoutToHtml} of the node's stored `layout`, so a node
14
+ * handed straight to a generator — per-page JSON-LD reads the node the
15
+ * public page rendered, not one this module's source produced — still
16
+ * exports every built-in module's copy.
17
+ *
18
+ * Returns `''` when the node has neither, leaving each caller's own fallback
19
+ * (`summary`, `metaDescription`) exactly where it was.
20
+ */
21
+ export declare function effectiveBodyHtml(node: AxContentNode, opts?: LayoutToHtmlOptions): string;
22
+ /**
23
+ * Attach {@link AxContentNode.layoutHtml} to a node whose `body` is empty, using
24
+ * the registry/component resolver the caller has. A node with a body, or with no
25
+ * layout, is returned untouched — the projection would never be read.
26
+ */
27
+ export declare function withLayoutHtml(node: AxContentNode, opts: LayoutToHtmlOptions): AxContentNode;
28
+ //# sourceMappingURL=effective-body.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effective-body.d.ts","sourceRoot":"","sources":["../../src/ax/effective-body.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE/C;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,mBAAmB,GAAG,MAAM,CAMzF;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,mBAAmB,GAAG,aAAa,CAM5F"}
@@ -0,0 +1,47 @@
1
+ import { layoutToHtml } from './layout-to-html.js';
2
+ /**
3
+ * THE one answer to "what is this node's body copy", for every AX surface
4
+ * (kywi-cms#195).
5
+ *
6
+ * Resolution order:
7
+ * 1. the stored `body` column, when it holds anything — an article written in
8
+ * the rich-text field is already the whole page;
9
+ * 2. `layoutHtml`, the layout projection the AX CONTENT SOURCE precomputed
10
+ * (it is the only layer that can hand `layoutToHtml` the site's module
11
+ * registry and its saved component definitions);
12
+ * 3. a direct {@link layoutToHtml} of the node's stored `layout`, so a node
13
+ * handed straight to a generator — per-page JSON-LD reads the node the
14
+ * public page rendered, not one this module's source produced — still
15
+ * exports every built-in module's copy.
16
+ *
17
+ * Returns `''` when the node has neither, leaving each caller's own fallback
18
+ * (`summary`, `metaDescription`) exactly where it was.
19
+ */
20
+ export function effectiveBodyHtml(node, opts) {
21
+ const body = str(node.body);
22
+ if (body)
23
+ return body;
24
+ const projected = str(node['layoutHtml']);
25
+ if (projected)
26
+ return projected;
27
+ return layoutToHtml(node['layout'], opts);
28
+ }
29
+ /**
30
+ * Attach {@link AxContentNode.layoutHtml} to a node whose `body` is empty, using
31
+ * the registry/component resolver the caller has. A node with a body, or with no
32
+ * layout, is returned untouched — the projection would never be read.
33
+ */
34
+ export function withLayoutHtml(node, opts) {
35
+ if (str(node.body))
36
+ return node;
37
+ if (!node['layout'])
38
+ return node;
39
+ const html = layoutToHtml(node['layout'], opts);
40
+ if (!html)
41
+ return node;
42
+ return { ...node, layoutHtml: html };
43
+ }
44
+ function str(value) {
45
+ return typeof value === 'string' ? value.trim() : '';
46
+ }
47
+ //# sourceMappingURL=effective-body.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effective-body.js","sourceRoot":"","sources":["../../src/ax/effective-body.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAIlD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAmB,EAAE,IAA0B;IAC/E,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC3B,IAAI,IAAI;QAAE,OAAO,IAAI,CAAA;IACrB,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAA;IACzC,IAAI,SAAS;QAAE,OAAO,SAAS,CAAA;IAC/B,OAAO,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAA;AAC3C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,IAAmB,EAAE,IAAyB;IAC3E,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAA;IAC/B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAA;IAChC,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAA;IAC/C,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAA;IACtB,OAAO,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAA;AACtC,CAAC;AAED,SAAS,GAAG,CAAC,KAAc;IACzB,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;AACtD,CAAC"}
@@ -14,12 +14,14 @@ export type { AxContentNode, AxSiteMeta, AxContentSource, AxRenderContext, } fro
14
14
  export { createDbAxContentSource } from './content-source.js';
15
15
  export { resolveBaseUrl, absoluteUrl } from './url.js';
16
16
  export { htmlToMarkdown, stripHtml } from './html-to-markdown.js';
17
+ export { layoutToHtml, type LayoutToHtmlOptions, type AxComponentResolver, } from './layout-to-html.js';
18
+ export { effectiveBodyHtml, withLayoutHtml } from './effective-body.js';
17
19
  export { summaryFor, truncate, oneLine } from './summary.js';
18
20
  export { isAxEligible, isIndexable, passesTypeFilter, INDEXABLE_BASE_TYPES } from './filters.js';
19
21
  export { generateLlmsTxt } from './llms-txt.js';
20
22
  export { generateLlmsFullTxt } from './llms-full-txt.js';
21
23
  export { generateSitemapXml } from './sitemap-xml.js';
22
24
  export { generateRobotsTxt, AI_CRAWLERS } from './robots-txt.js';
23
- export { generateJsonLd } from './jsonld.js';
25
+ export { generateJsonLd, type JsonLdOptions } from './jsonld.js';
24
26
  export { generatePageMarkdown } from './page-markdown.js';
25
27
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ax/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,YAAY,EACV,aAAa,EACb,UAAU,EACV,eAAe,EACf,eAAe,GAChB,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAC7D,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AACtD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AAChG,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ax/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,YAAY,EACV,aAAa,EACb,UAAU,EACV,eAAe,EACf,eAAe,GAChB,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAC7D,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AACtD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjE,OAAO,EACL,YAAY,EACZ,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,GACzB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACvE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AAChG,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAChE,OAAO,EAAE,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAA;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA"}
package/dist/ax/index.js CHANGED
@@ -1,6 +1,8 @@
1
1
  export { createDbAxContentSource } from './content-source.js';
2
2
  export { resolveBaseUrl, absoluteUrl } from './url.js';
3
3
  export { htmlToMarkdown, stripHtml } from './html-to-markdown.js';
4
+ export { layoutToHtml, } from './layout-to-html.js';
5
+ export { effectiveBodyHtml, withLayoutHtml } from './effective-body.js';
4
6
  export { summaryFor, truncate, oneLine } from './summary.js';
5
7
  export { isAxEligible, isIndexable, passesTypeFilter, INDEXABLE_BASE_TYPES } from './filters.js';
6
8
  export { generateLlmsTxt } from './llms-txt.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ax/index.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAC7D,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AACtD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AAChG,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ax/index.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAC7D,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AACtD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjE,OAAO,EACL,YAAY,GAGb,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACvE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AAChG,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAChE,OAAO,EAAE,cAAc,EAAsB,MAAM,aAAa,CAAA;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA"}
@@ -13,6 +13,36 @@ import type { AxContentNode, AxRenderContext } from './types.js';
13
13
  *
14
14
  * Never calls a language model. FAQPage is a pure field read of a stored
15
15
  * `[{ question, answer }]` array — see the FAQ-as-content-type design.
16
+ *
17
+ * ─── WHY THIS TAKES A LAYOUT INSTEAD OF READING THE NODE'S ──────────────────
18
+ *
19
+ * JSON-LD is a PER-VISITOR surface: `KywiJsonLd` renders inside the page, so
20
+ * whatever lands in `description`/`articleBody` ships in THAT visitor's HTML and
21
+ * RSC payload. The node carries the STORED layout — every arm of every
22
+ * personalized band and every experiment — and projecting it here put the
23
+ * DEFAULT arm's copy in front of a visitor who was being served a targeted one.
24
+ * That is precisely the leak kywi-cms#167 closed for the renderer, arriving
25
+ * through the structured data instead.
26
+ *
27
+ * So the SERVED document is an input, never an inference:
28
+ * - `opts.layout` given → that is what this visitor sees; project it.
29
+ * - `opts.layout` omitted → project NO layout at all. `body`,
30
+ * `metaDescription` and `summary` are per-node, not per-visitor, so they
31
+ * stay; the node's own `layout` and any precomputed anonymous `layoutHtml`
32
+ * are deliberately ignored.
33
+ *
34
+ * Guessing is not an option a per-visitor surface has: the choice is between
35
+ * the right arm and no arm, and a missing description is not a privacy
36
+ * incident. Hosts pass the pruned document — see `KywiJsonLd`'s `layout` prop
37
+ * and the `pruneLayoutToServedArms` call the reference app makes before it.
16
38
  */
17
- export declare function generateJsonLd(node: AxContentNode, ctx: AxRenderContext): Record<string, unknown> | Record<string, unknown>[];
39
+ export interface JsonLdOptions {
40
+ /**
41
+ * The layout document THIS visitor is served — post `applyPageVariant`,
42
+ * component resolution and `pruneLayoutToServedArms`. Omit it and no layout
43
+ * copy is projected at all.
44
+ */
45
+ layout?: unknown;
46
+ }
47
+ export declare function generateJsonLd(node: AxContentNode, ctx: AxRenderContext, opts?: JsonLdOptions): Record<string, unknown> | Record<string, unknown>[];
18
48
  //# sourceMappingURL=jsonld.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"jsonld.d.ts","sourceRoot":"","sources":["../../src/ax/jsonld.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEhE;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,aAAa,EACnB,GAAG,EAAE,eAAe,GACnB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAqCrD"}
1
+ {"version":3,"file":"jsonld.d.ts","sourceRoot":"","sources":["../../src/ax/jsonld.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEhE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,aAAa,EACnB,GAAG,EAAE,eAAe,EACpB,IAAI,GAAE,aAAkB,GACvB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAqCrD"}
package/dist/ax/jsonld.js CHANGED
@@ -1,23 +1,9 @@
1
1
  import { resolveAxConfig } from '../config/define.js';
2
2
  import { absoluteUrl } from './url.js';
3
- import { htmlToMarkdown } from './html-to-markdown.js';
4
- import { truncate } from './summary.js';
5
- /**
6
- * Pure, config-driven content→schema.org JSON-LD mapping (Tier 1, deterministic).
7
- *
8
- * Resolution order for a node:
9
- * 1. `mapping.transform(node, ctx)` — full escape hatch, wins over everything.
10
- * 2. `mapping.schemaType` from `ax.jsonLd.types[contentTypeName]`, else a
11
- * built-in default keyed by baseType/name (WebPage / Article / Event /
12
- * FAQPage).
13
- * 3. Built-in field defaults for the resolved type (unless
14
- * `ax.jsonLd.defaults === false`), then `mapping.fields` remaps applied on
15
- * top (schema.org prop -> content field name).
16
- *
17
- * Never calls a language model. FAQPage is a pure field read of a stored
18
- * `[{ question, answer }]` array — see the FAQ-as-content-type design.
19
- */
20
- export function generateJsonLd(node, ctx) {
3
+ import { htmlToMarkdown, stripHtml } from './html-to-markdown.js';
4
+ import { oneLine, truncate } from './summary.js';
5
+ import { layoutToHtml, registryForModules } from './layout-to-html.js';
6
+ export function generateJsonLd(node, ctx, opts = {}) {
21
7
  const ax = resolveAxConfig(ctx.config.ax);
22
8
  const mapping = ax.jsonLd?.types?.[node.contentTypeName];
23
9
  // 1. Escape hatch.
@@ -38,7 +24,7 @@ export function generateJsonLd(node, ctx) {
38
24
  name,
39
25
  };
40
26
  if (applyDefaults)
41
- applyTypeDefaults(obj, node, schemaType, ctx);
27
+ applyTypeDefaults(obj, node, schemaType, ctx, opts);
42
28
  // 3. Field remap applied over defaults (schema.org prop -> content field name).
43
29
  if (mapping?.fields) {
44
30
  for (const [prop, fieldName] of Object.entries(mapping.fields)) {
@@ -64,8 +50,13 @@ function defaultSchemaType(node) {
64
50
  return 'WebPage';
65
51
  return 'WebPage';
66
52
  }
67
- function applyTypeDefaults(obj, node, schemaType, ctx) {
68
- const description = str(node.metaDescription) || str(node.summary);
53
+ function applyTypeDefaults(obj, node, schemaType, ctx, opts) {
54
+ const bodyHtml = servedBodyHtml(node, ctx, opts);
55
+ // metaDescription → summary → the served body. The body fallback is built
56
+ // HERE rather than borrowed from `summaryFor` (kywi-cms#195): that chain puts
57
+ // `aiSummary` above `metaDescription`, and promoting a machine-written blurb
58
+ // into schema.org output would be a real change of meaning, not a fallback.
59
+ const description = str(node.metaDescription) || str(node.summary) || bodyDescription(bodyHtml);
69
60
  const published = toIso(node.publishedAt);
70
61
  const modified = toIso(node.updatedAt);
71
62
  const imageUrl = imageFor(node, ctx.baseUrl);
@@ -79,7 +70,7 @@ function applyTypeDefaults(obj, node, schemaType, ctx) {
79
70
  obj['dateModified'] = modified;
80
71
  if (imageUrl)
81
72
  obj['image'] = imageUrl;
82
- const body = htmlToMarkdown(str(node.body));
73
+ const body = htmlToMarkdown(bodyHtml);
83
74
  if (body)
84
75
  obj['articleBody'] = truncate(body, 5000);
85
76
  const author = str(node['author']);
@@ -156,6 +147,28 @@ function imageFor(node, baseUrl) {
156
147
  return undefined;
157
148
  return absoluteUrl(baseUrl, `/api/v1/media/${id}/file`);
158
149
  }
150
+ /**
151
+ * The body copy this VISITOR is being shown — the stored `body` column, else the
152
+ * SERVED layout the caller handed over, else nothing.
153
+ *
154
+ * The two omissions are the point (see {@link generateJsonLd}): `node.layout` is
155
+ * the stored document with every arm in it, and `node.layoutHtml` is the
156
+ * ANONYMOUS projection the AX content source precomputes for the crawler
157
+ * surfaces. Neither describes what this visitor sees, so neither is consulted.
158
+ */
159
+ function servedBodyHtml(node, ctx, opts) {
160
+ const body = str(node.body);
161
+ if (body)
162
+ return body;
163
+ if (opts.layout === undefined || opts.layout === null)
164
+ return '';
165
+ return layoutToHtml(opts.layout, { modules: registryForModules(ctx.config.modules) });
166
+ }
167
+ /** A one-line, tag-stripped description built from already-resolved body HTML. */
168
+ function bodyDescription(bodyHtml) {
169
+ const text = stripHtml(bodyHtml);
170
+ return text ? truncate(oneLine(text), 160) : '';
171
+ }
159
172
  function str(v) {
160
173
  return typeof v === 'string' ? v.trim() : '';
161
174
  }
@@ -1 +1 @@
1
- {"version":3,"file":"jsonld.js","sourceRoot":"","sources":["../../src/ax/jsonld.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"jsonld.js","sourceRoot":"","sources":["../../src/ax/jsonld.ts"],"names":[],"mappings":"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"}