@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.
- package/AGENT-PATTERNS.md +47 -0
- package/dist/admin/audience-editor.d.ts +2 -0
- package/dist/admin/audience-editor.d.ts.map +1 -1
- package/dist/admin/audience-editor.js +4 -2
- package/dist/admin/audience-editor.js.map +1 -1
- package/dist/admin/condition-builder.d.ts.map +1 -1
- package/dist/admin/condition-builder.js +16 -3
- package/dist/admin/condition-builder.js.map +1 -1
- package/dist/admin/rule-tester.d.ts +1 -0
- package/dist/admin/rule-tester.d.ts.map +1 -1
- package/dist/admin/rule-tester.js +7 -4
- package/dist/admin/rule-tester.js.map +1 -1
- package/dist/admin/signal-options.d.ts +17 -0
- package/dist/admin/signal-options.d.ts.map +1 -1
- package/dist/admin/signal-options.js +28 -0
- package/dist/admin/signal-options.js.map +1 -1
- package/dist/admin/surfaces/audiences/audiences-data.d.ts +5 -0
- package/dist/admin/surfaces/audiences/audiences-data.d.ts.map +1 -1
- package/dist/admin/surfaces/audiences/audiences-data.js +3 -0
- package/dist/admin/surfaces/audiences/audiences-data.js.map +1 -1
- package/dist/api/api-key-routes.js +2 -2
- package/dist/api/api-key-routes.js.map +1 -1
- package/dist/api/audience-routes.d.ts.map +1 -1
- package/dist/api/audience-routes.js +10 -4
- package/dist/api/audience-routes.js.map +1 -1
- package/dist/api/audience-runtime-routes.d.ts +17 -0
- package/dist/api/audience-runtime-routes.d.ts.map +1 -1
- package/dist/api/audience-runtime-routes.js +474 -23
- package/dist/api/audience-runtime-routes.js.map +1 -1
- package/dist/api/ax-routes.d.ts.map +1 -1
- package/dist/api/ax-routes.js +7 -3
- package/dist/api/ax-routes.js.map +1 -1
- package/dist/api/category-routes.js +3 -3
- package/dist/api/category-routes.js.map +1 -1
- package/dist/api/changeset-routes.js +2 -2
- package/dist/api/changeset-routes.js.map +1 -1
- package/dist/api/comment-routes.js +4 -4
- package/dist/api/comment-routes.js.map +1 -1
- package/dist/api/component-routes.js +3 -3
- package/dist/api/component-routes.js.map +1 -1
- package/dist/api/config-routes.js +4 -4
- package/dist/api/config-routes.js.map +1 -1
- package/dist/api/content-permission-routes.js +2 -2
- package/dist/api/content-permission-routes.js.map +1 -1
- package/dist/api/content-routes.d.ts.map +1 -1
- package/dist/api/content-routes.js +8 -3
- package/dist/api/content-routes.js.map +1 -1
- package/dist/api/content-type-routes.js +3 -3
- package/dist/api/content-type-routes.js.map +1 -1
- package/dist/api/experiment-routes.js +2 -2
- package/dist/api/experiment-routes.js.map +1 -1
- package/dist/api/extension-routes.js +4 -4
- package/dist/api/extension-routes.js.map +1 -1
- package/dist/api/feed-routes.js +2 -2
- package/dist/api/feed-routes.js.map +1 -1
- package/dist/api/form-routes.js +2 -2
- package/dist/api/form-routes.js.map +1 -1
- package/dist/api/group-routes.js +3 -3
- package/dist/api/group-routes.js.map +1 -1
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +4 -1
- package/dist/api/index.js.map +1 -1
- package/dist/api/layout-routes.d.ts +19 -1
- package/dist/api/layout-routes.d.ts.map +1 -1
- package/dist/api/layout-routes.js +65 -5
- package/dist/api/layout-routes.js.map +1 -1
- package/dist/api/layout-write-guard.d.ts +3 -2
- package/dist/api/layout-write-guard.d.ts.map +1 -1
- package/dist/api/layout-write-guard.js +12 -4
- package/dist/api/layout-write-guard.js.map +1 -1
- package/dist/api/media-routes.d.ts.map +1 -1
- package/dist/api/media-routes.js +50 -9
- package/dist/api/media-routes.js.map +1 -1
- package/dist/api/menu-routes.js +2 -2
- package/dist/api/menu-routes.js.map +1 -1
- package/dist/api/nav-routes.js +3 -3
- package/dist/api/nav-routes.js.map +1 -1
- package/dist/api/oauth-routes.js +2 -2
- package/dist/api/oauth-routes.js.map +1 -1
- package/dist/api/openapi.d.ts.map +1 -1
- package/dist/api/openapi.js +14 -1
- package/dist/api/openapi.js.map +1 -1
- package/dist/api/pagination.d.ts +10 -0
- package/dist/api/pagination.d.ts.map +1 -1
- package/dist/api/pagination.js +7 -1
- package/dist/api/pagination.js.map +1 -1
- package/dist/api/response.d.ts +29 -0
- package/dist/api/response.d.ts.map +1 -1
- package/dist/api/response.js +23 -3
- package/dist/api/response.js.map +1 -1
- package/dist/api/search-routes.d.ts.map +1 -1
- package/dist/api/search-routes.js +17 -3
- package/dist/api/search-routes.js.map +1 -1
- package/dist/api/section-template-routes.js +2 -2
- package/dist/api/section-template-routes.js.map +1 -1
- package/dist/api/site-routes.js +2 -2
- package/dist/api/site-routes.js.map +1 -1
- package/dist/api/tag-routes.d.ts.map +1 -1
- package/dist/api/tag-routes.js +2 -2
- package/dist/api/tag-routes.js.map +1 -1
- package/dist/api/user-routes.js +2 -2
- package/dist/api/user-routes.js.map +1 -1
- package/dist/api/version-routes.js +2 -2
- package/dist/api/version-routes.js.map +1 -1
- package/dist/api/webhook-routes.js +3 -3
- package/dist/api/webhook-routes.js.map +1 -1
- package/dist/api/workflow-routes.d.ts.map +1 -1
- package/dist/api/workflow-routes.js +15 -6
- package/dist/api/workflow-routes.js.map +1 -1
- package/dist/audiences/collectors/index.d.ts +8 -4
- package/dist/audiences/collectors/index.d.ts.map +1 -1
- package/dist/audiences/collectors/index.js +17 -4
- package/dist/audiences/collectors/index.js.map +1 -1
- package/dist/audiences/collectors/selfid.d.ts +25 -0
- package/dist/audiences/collectors/selfid.d.ts.map +1 -0
- package/dist/audiences/collectors/selfid.js +46 -0
- package/dist/audiences/collectors/selfid.js.map +1 -0
- package/dist/audiences/collectors/session.d.ts +41 -0
- package/dist/audiences/collectors/session.d.ts.map +1 -0
- package/dist/audiences/collectors/session.js +50 -0
- package/dist/audiences/collectors/session.js.map +1 -0
- package/dist/audiences/consent.d.ts +13 -0
- package/dist/audiences/consent.d.ts.map +1 -1
- package/dist/audiences/consent.js +13 -0
- package/dist/audiences/consent.js.map +1 -1
- package/dist/audiences/cookies.d.ts +21 -0
- package/dist/audiences/cookies.d.ts.map +1 -1
- package/dist/audiences/cookies.js +26 -0
- package/dist/audiences/cookies.js.map +1 -1
- package/dist/audiences/engine.d.ts.map +1 -1
- package/dist/audiences/engine.js +1 -0
- package/dist/audiences/engine.js.map +1 -1
- package/dist/audiences/entry-page.d.ts +89 -0
- package/dist/audiences/entry-page.d.ts.map +1 -0
- package/dist/audiences/entry-page.js +116 -0
- package/dist/audiences/entry-page.js.map +1 -0
- package/dist/audiences/evaluator/instant-match.d.ts.map +1 -1
- package/dist/audiences/evaluator/instant-match.js +7 -0
- package/dist/audiences/evaluator/instant-match.js.map +1 -1
- package/dist/audiences/index.d.ts +3 -2
- package/dist/audiences/index.d.ts.map +1 -1
- package/dist/audiences/index.js +6 -2
- package/dist/audiences/index.js.map +1 -1
- package/dist/audiences/queries.d.ts +16 -0
- package/dist/audiences/queries.d.ts.map +1 -1
- package/dist/audiences/queries.js +28 -1
- package/dist/audiences/queries.js.map +1 -1
- package/dist/audiences/schema.d.ts +17 -0
- package/dist/audiences/schema.d.ts.map +1 -1
- package/dist/audiences/schema.js +7 -0
- package/dist/audiences/schema.js.map +1 -1
- package/dist/audiences/server-eval.d.ts +19 -0
- package/dist/audiences/server-eval.d.ts.map +1 -1
- package/dist/audiences/server-eval.js +17 -1
- package/dist/audiences/server-eval.js.map +1 -1
- package/dist/audiences/types.d.ts +22 -1
- package/dist/audiences/types.d.ts.map +1 -1
- package/dist/audiences/types.js +1 -0
- package/dist/audiences/types.js.map +1 -1
- package/dist/ax/content-source.d.ts +10 -2
- package/dist/ax/content-source.d.ts.map +1 -1
- package/dist/ax/content-source.js +81 -5
- package/dist/ax/content-source.js.map +1 -1
- package/dist/ax/effective-body.d.ts +28 -0
- package/dist/ax/effective-body.d.ts.map +1 -0
- package/dist/ax/effective-body.js +47 -0
- package/dist/ax/effective-body.js.map +1 -0
- package/dist/ax/index.d.ts +3 -1
- package/dist/ax/index.d.ts.map +1 -1
- package/dist/ax/index.js +2 -0
- package/dist/ax/index.js.map +1 -1
- package/dist/ax/jsonld.d.ts +31 -1
- package/dist/ax/jsonld.d.ts.map +1 -1
- package/dist/ax/jsonld.js +35 -22
- package/dist/ax/jsonld.js.map +1 -1
- package/dist/ax/layout-to-html.d.ts +127 -0
- package/dist/ax/layout-to-html.d.ts.map +1 -0
- package/dist/ax/layout-to-html.js +545 -0
- package/dist/ax/layout-to-html.js.map +1 -0
- package/dist/ax/llms-full-txt.d.ts +3 -1
- package/dist/ax/llms-full-txt.d.ts.map +1 -1
- package/dist/ax/llms-full-txt.js +5 -2
- package/dist/ax/llms-full-txt.js.map +1 -1
- package/dist/ax/page-markdown.d.ts +10 -2
- package/dist/ax/page-markdown.d.ts.map +1 -1
- package/dist/ax/page-markdown.js +16 -3
- package/dist/ax/page-markdown.js.map +1 -1
- package/dist/ax/summary.d.ts +4 -0
- package/dist/ax/summary.d.ts.map +1 -1
- package/dist/ax/summary.js +6 -1
- package/dist/ax/summary.js.map +1 -1
- package/dist/ax/types.d.ts +24 -0
- package/dist/ax/types.d.ts.map +1 -1
- package/dist/cache/content-invalidation.d.ts.map +1 -1
- package/dist/cache/content-invalidation.js +11 -0
- package/dist/cache/content-invalidation.js.map +1 -1
- package/dist/db/apply-snapshot.d.ts +7 -0
- package/dist/db/apply-snapshot.d.ts.map +1 -1
- package/dist/db/apply-snapshot.js +7 -0
- package/dist/db/apply-snapshot.js.map +1 -1
- package/dist/db/ax-queries.d.ts +6 -0
- package/dist/db/ax-queries.d.ts.map +1 -1
- package/dist/db/ax-queries.js +6 -0
- package/dist/db/ax-queries.js.map +1 -1
- package/dist/db/content-queries.d.ts.map +1 -1
- package/dist/db/content-queries.js +8 -0
- package/dist/db/content-queries.js.map +1 -1
- package/dist/db/layout-queries.d.ts +19 -2
- package/dist/db/layout-queries.d.ts.map +1 -1
- package/dist/db/layout-queries.js +11 -3
- package/dist/db/layout-queries.js.map +1 -1
- package/dist/db/search-queries.d.ts.map +1 -1
- package/dist/db/search-queries.js +24 -1
- package/dist/db/search-queries.js.map +1 -1
- package/dist/hooks/ax-invalidation.d.ts.map +1 -1
- package/dist/hooks/ax-invalidation.js +4 -0
- package/dist/hooks/ax-invalidation.js.map +1 -1
- package/dist/layout/index.d.ts +3 -1
- package/dist/layout/index.d.ts.map +1 -1
- package/dist/layout/index.js +3 -1
- package/dist/layout/index.js.map +1 -1
- package/dist/layout/module-permissions.d.ts.map +1 -1
- package/dist/layout/module-permissions.js +2 -38
- package/dist/layout/module-permissions.js.map +1 -1
- package/dist/layout/seed-defaults.d.ts +45 -0
- package/dist/layout/seed-defaults.d.ts.map +1 -0
- package/dist/layout/seed-defaults.js +75 -0
- package/dist/layout/seed-defaults.js.map +1 -0
- package/dist/layout/walk.d.ts +14 -0
- package/dist/layout/walk.d.ts.map +1 -0
- package/dist/layout/walk.js +49 -0
- package/dist/layout/walk.js.map +1 -0
- package/dist/media/index.d.ts +1 -1
- package/dist/media/index.d.ts.map +1 -1
- package/dist/media/index.js +1 -1
- package/dist/media/index.js.map +1 -1
- package/dist/media/upload-allowlist.d.ts +23 -0
- package/dist/media/upload-allowlist.d.ts.map +1 -1
- package/dist/media/upload-allowlist.js +29 -0
- package/dist/media/upload-allowlist.js.map +1 -1
- package/dist/schema/mysql-tables.d.ts +17 -0
- package/dist/schema/mysql-tables.d.ts.map +1 -1
- package/dist/schema/mysql-tables.js +2 -0
- package/dist/schema/mysql-tables.js.map +1 -1
- package/dist/scope/jsonld.d.ts +18 -3
- package/dist/scope/jsonld.d.ts.map +1 -1
- package/dist/scope/jsonld.js +6 -4
- package/dist/scope/jsonld.js.map +1 -1
- 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;
|
|
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
|
-
|
|
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;
|
|
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":"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"}
|
package/dist/audiences/types.js
CHANGED
|
@@ -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;
|
|
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
|
-
*
|
|
13
|
-
*
|
|
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":"
|
|
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
|
-
*
|
|
12
|
-
*
|
|
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
|
-
|
|
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
|
-
|
|
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;
|
|
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"}
|
package/dist/ax/index.d.ts
CHANGED
|
@@ -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
|
package/dist/ax/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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';
|
package/dist/ax/index.js.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/ax/jsonld.d.ts
CHANGED
|
@@ -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
|
|
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
|
package/dist/ax/jsonld.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonld.d.ts","sourceRoot":"","sources":["../../src/ax/jsonld.ts"],"names":[],"mappings":"
|
|
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
|
-
|
|
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
|
|
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(
|
|
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
|
}
|
package/dist/ax/jsonld.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonld.js","sourceRoot":"","sources":["../../src/ax/jsonld.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAErD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"jsonld.js","sourceRoot":"","sources":["../../src/ax/jsonld.ts"],"names":[],"mappings":"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"}
|