@kywi-software/core 0.15.0 → 0.15.2
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 +51 -1
- 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/admin/surfaces/feeds/feeds-data.d.ts +8 -1
- package/dist/admin/surfaces/feeds/feeds-data.d.ts.map +1 -1
- package/dist/admin/surfaces/feeds/feeds-data.js +39 -22
- package/dist/admin/surfaces/feeds/feeds-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.d.ts.map +1 -1
- package/dist/api/feed-routes.js +51 -4
- 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 +15 -4
- 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-config.d.ts +12 -0
- package/dist/audiences/consent-config.d.ts.map +1 -1
- package/dist/audiences/consent-config.js +16 -0
- package/dist/audiences/consent-config.js.map +1 -1
- package/dist/audiences/consent-startup.d.ts +7 -0
- package/dist/audiences/consent-startup.d.ts.map +1 -1
- package/dist/audiences/consent-startup.js +9 -2
- package/dist/audiences/consent-startup.js.map +1 -1
- 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/config/types.d.ts +16 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.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
|
@@ -0,0 +1,545 @@
|
|
|
1
|
+
import { sanitizeHtml } from '../util/sanitize.js';
|
|
2
|
+
import { createModuleRegistry } from '../layout/registry.js';
|
|
3
|
+
import { resolveComponentPlacements } from '../layout/component-refs.js';
|
|
4
|
+
import { isModuleVariantContainer } from '../layout/types.js';
|
|
5
|
+
import { selectVariantArm } from '../layout/variant-selection.js';
|
|
6
|
+
/**
|
|
7
|
+
* Serialize a stored layout document to semantic HTML in reading order.
|
|
8
|
+
* Returns `''` for a null/empty/unrecognizable document.
|
|
9
|
+
*/
|
|
10
|
+
export function layoutToHtml(layout, opts = {}) {
|
|
11
|
+
const doc = asLayoutDocument(layout);
|
|
12
|
+
if (!doc)
|
|
13
|
+
return '';
|
|
14
|
+
const resolver = opts.resolveComponent;
|
|
15
|
+
// Pre-resolve linked placements exactly as the renderer does, so the
|
|
16
|
+
// projection reads the definition rather than a placement's fallback copy.
|
|
17
|
+
// A malformed subtree (or a resolver that throws) degrades to the UNRESOLVED
|
|
18
|
+
// document rather than to no output at all — the inline fallback copy a
|
|
19
|
+
// placement carries is still the page's copy.
|
|
20
|
+
let resolved = doc;
|
|
21
|
+
if (resolver) {
|
|
22
|
+
try {
|
|
23
|
+
resolved = resolveComponentPlacements(doc, (componentId) => resolver({ componentId }));
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
resolved = doc;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const ctx = {
|
|
30
|
+
registry: opts.modules ?? builtInRegistry(),
|
|
31
|
+
...(resolver ? { resolveComponent: resolver } : {}),
|
|
32
|
+
visitedComponents: new Set(),
|
|
33
|
+
depth: 0,
|
|
34
|
+
};
|
|
35
|
+
const sink = createSink();
|
|
36
|
+
if (isRecord(resolved.regions)) {
|
|
37
|
+
for (const nodes of Object.values(resolved.regions)) {
|
|
38
|
+
for (const node of asArray(nodes))
|
|
39
|
+
emitRegionNode(node, ctx, sink);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return sink.blocks.join('\n');
|
|
43
|
+
}
|
|
44
|
+
// ─── Output sink (the budget lives here) ─────────────────────────────────────
|
|
45
|
+
/**
|
|
46
|
+
* Total characters one projection may emit. Generous for any real page (a long
|
|
47
|
+
* article body is a few tens of KB) and small enough that a pathological
|
|
48
|
+
* document — a deep diamond of components, a machine-generated layout — cannot
|
|
49
|
+
* turn one uncached `/search` hit into a memory event.
|
|
50
|
+
*/
|
|
51
|
+
const MAX_OUTPUT_CHARS = 262_144;
|
|
52
|
+
function createSink() {
|
|
53
|
+
const blocks = [];
|
|
54
|
+
let used = 0;
|
|
55
|
+
return {
|
|
56
|
+
blocks,
|
|
57
|
+
push(html) {
|
|
58
|
+
if (used >= MAX_OUTPUT_CHARS)
|
|
59
|
+
return;
|
|
60
|
+
blocks.push(html);
|
|
61
|
+
used += html.length + 1;
|
|
62
|
+
},
|
|
63
|
+
full() {
|
|
64
|
+
return used >= MAX_OUTPUT_CHARS;
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
// ─── Walking ──────────────────────────────────────────────────────────────────
|
|
69
|
+
/** How many component expansions may nest before the walk gives up. */
|
|
70
|
+
const MAX_COMPONENT_DEPTH = 10;
|
|
71
|
+
function emitRegionNode(node, ctx, out) {
|
|
72
|
+
if (!isRecord(node) || out.full())
|
|
73
|
+
return;
|
|
74
|
+
if (node.type === 'section') {
|
|
75
|
+
emitSection(node, ctx, out);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
if (node.type === 'variantContainer') {
|
|
79
|
+
for (const section of servedSections(node)) {
|
|
80
|
+
emitSection(section, ctx, out);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* The sections a section-level container serves an anonymous visitor: the
|
|
86
|
+
* locked winner's arm for an `ab_test`, otherwise Default. `selectVariantArm` is
|
|
87
|
+
* the renderer's own precedence — one implementation, so the corpus and the page
|
|
88
|
+
* cannot disagree about which arm is public.
|
|
89
|
+
*/
|
|
90
|
+
function servedSections(container) {
|
|
91
|
+
const arms = asArray(container.variants);
|
|
92
|
+
const arm = selectVariantArm(arms, container, null);
|
|
93
|
+
return arm ? asArray(arm.sections) : asArray(container.defaultSections);
|
|
94
|
+
}
|
|
95
|
+
/** {@link servedSections} for a MODULE-level container: one module, not sections. */
|
|
96
|
+
function servedModule(container) {
|
|
97
|
+
const arms = asArray(container.variants);
|
|
98
|
+
const arm = selectVariantArm(arms, container, null);
|
|
99
|
+
return arm ? arm.module : container.defaultModule;
|
|
100
|
+
}
|
|
101
|
+
function emitSection(section, ctx, out) {
|
|
102
|
+
if (!isRecord(section) || out.full())
|
|
103
|
+
return;
|
|
104
|
+
for (const column of asArray(section.columns)) {
|
|
105
|
+
if (!isRecord(column))
|
|
106
|
+
continue;
|
|
107
|
+
for (const node of asArray(column['nodes']))
|
|
108
|
+
emitColumnNode(node, ctx, out);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
function emitColumnNode(node, ctx, out) {
|
|
112
|
+
if (!isRecord(node) || out.full())
|
|
113
|
+
return;
|
|
114
|
+
if (isModuleVariantContainer(node)) {
|
|
115
|
+
emitModule(servedModule(node), ctx, out);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
emitModule(node, ctx, out);
|
|
119
|
+
}
|
|
120
|
+
function emitModule(node, ctx, out) {
|
|
121
|
+
if (!isRecord(node) || typeof node.type !== 'string' || out.full())
|
|
122
|
+
return;
|
|
123
|
+
const props = isRecord(node.props) ? node.props : {};
|
|
124
|
+
if (node.type === 'component') {
|
|
125
|
+
emitComponentPlacement(props, ctx, out);
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
emitModuleOfType(node.type, props, ctx, out);
|
|
129
|
+
}
|
|
130
|
+
function emitModuleOfType(type, props, ctx, out) {
|
|
131
|
+
const entry = ctx.registry.get(type);
|
|
132
|
+
// A host that OVERRIDES a built-in name owns its prop shape, so the built-in
|
|
133
|
+
// emitter would be reading props that no longer exist. Its declared schema is
|
|
134
|
+
// the only trustworthy description of it.
|
|
135
|
+
//
|
|
136
|
+
// This runs BEFORE the skip list on purpose: the skip list describes KYWI's
|
|
137
|
+
// built-ins, and a host that registers its own `video` (with a transcript) or
|
|
138
|
+
// `carousel` (with slide copy) under that name has authored real content the
|
|
139
|
+
// built-in never carried.
|
|
140
|
+
if (entry && !entry.isBuiltIn) {
|
|
141
|
+
emitFromPropSchema(entry.props, props, out);
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
if (SKIPPED_MODULES.has(type))
|
|
145
|
+
return;
|
|
146
|
+
const emitter = BUILT_IN_EMITTERS[type];
|
|
147
|
+
if (emitter) {
|
|
148
|
+
emitter(props, out);
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
// Unregistered → skip silently. Registered but with no emitter (a built-in
|
|
152
|
+
// that carries copy in plain props) → read its schema.
|
|
153
|
+
if (entry)
|
|
154
|
+
emitFromPropSchema(entry.props, props, out);
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* A `component` MODULE placement (the "Saved → Component" palette entry), whose
|
|
158
|
+
* target lives in `props`, not in a node-level `componentId`.
|
|
159
|
+
*/
|
|
160
|
+
function emitComponentPlacement(props, ctx, out) {
|
|
161
|
+
// A host that already hydrated the placement wins: that HTML is what rendered.
|
|
162
|
+
const content = str(props['content']);
|
|
163
|
+
if (content) {
|
|
164
|
+
pushHtml(content, out);
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
const resolve = ctx.resolveComponent;
|
|
168
|
+
if (!resolve)
|
|
169
|
+
return;
|
|
170
|
+
const componentId = str(props['componentId']);
|
|
171
|
+
const slug = str(props['slug']);
|
|
172
|
+
if (!componentId && !slug)
|
|
173
|
+
return;
|
|
174
|
+
const key = componentId || `slug:${slug}`;
|
|
175
|
+
// The visited set catches a definition that points back at ITSELF; the depth
|
|
176
|
+
// cap catches a chain that never repeats a key (A→B→C→…), which a visited set
|
|
177
|
+
// alone cannot bound.
|
|
178
|
+
if (ctx.visitedComponents.has(key) || ctx.depth >= MAX_COMPONENT_DEPTH)
|
|
179
|
+
return;
|
|
180
|
+
ctx.visitedComponents.add(key);
|
|
181
|
+
ctx.depth += 1;
|
|
182
|
+
try {
|
|
183
|
+
const source = resolve({
|
|
184
|
+
...(componentId ? { componentId } : {}),
|
|
185
|
+
...(slug ? { slug } : {}),
|
|
186
|
+
});
|
|
187
|
+
if (!source)
|
|
188
|
+
return;
|
|
189
|
+
emitComponentSource(source, ctx, out);
|
|
190
|
+
}
|
|
191
|
+
finally {
|
|
192
|
+
ctx.depth -= 1;
|
|
193
|
+
ctx.visitedComponents.delete(key);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
function emitComponentSource(source, ctx, out) {
|
|
197
|
+
switch (source.kind) {
|
|
198
|
+
case 'module':
|
|
199
|
+
emitModuleOfType(source.moduleType, isRecord(source.props) ? source.props : {}, ctx, out);
|
|
200
|
+
return;
|
|
201
|
+
case 'section':
|
|
202
|
+
emitSection(source.section, ctx, out);
|
|
203
|
+
return;
|
|
204
|
+
case 'variantContainer':
|
|
205
|
+
if (!isRecord(source.container))
|
|
206
|
+
return;
|
|
207
|
+
for (const section of servedSections(source.container))
|
|
208
|
+
emitSection(section, ctx, out);
|
|
209
|
+
return;
|
|
210
|
+
case 'moduleVariantContainer':
|
|
211
|
+
if (!isRecord(source.container))
|
|
212
|
+
return;
|
|
213
|
+
emitModule(servedModule(source.container), ctx, out);
|
|
214
|
+
return;
|
|
215
|
+
default:
|
|
216
|
+
// 'unresolvable' — the renderer shows the placement's own (empty) props.
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
// ─── Prop-schema projection (custom modules + schema-only built-ins) ──────────
|
|
221
|
+
function emitFromPropSchema(schema, props, out) {
|
|
222
|
+
if (!schema)
|
|
223
|
+
return;
|
|
224
|
+
let headingUsed = false;
|
|
225
|
+
for (const [key, def] of Object.entries(schema)) {
|
|
226
|
+
const value = str(props[key]);
|
|
227
|
+
if (!value)
|
|
228
|
+
continue;
|
|
229
|
+
if (def.type === 'richText') {
|
|
230
|
+
pushHtml(value, out);
|
|
231
|
+
continue;
|
|
232
|
+
}
|
|
233
|
+
if (def.type !== 'text' && def.type !== 'textarea')
|
|
234
|
+
continue;
|
|
235
|
+
if (isReferenceProp(key))
|
|
236
|
+
continue;
|
|
237
|
+
// A textarea prop is also how the palette stores JSON item lists; a serialized
|
|
238
|
+
// array is data, not copy.
|
|
239
|
+
if (looksLikeJson(value) || looksLikeLinkTarget(value))
|
|
240
|
+
continue;
|
|
241
|
+
if (!headingUsed && def.type === 'text') {
|
|
242
|
+
headingUsed = true;
|
|
243
|
+
out.push(`<h2>${esc(value)}</h2>`);
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
out.push(`<p>${esc(value)}</p>`);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
const HEADING_LEVELS = new Set(['h1', 'h2', 'h3', 'h4', 'h5', 'h6']);
|
|
251
|
+
const BUILT_IN_EMITTERS = {
|
|
252
|
+
heading(props, out) {
|
|
253
|
+
const text = str(props['text']);
|
|
254
|
+
if (!text)
|
|
255
|
+
return;
|
|
256
|
+
const level = str(props['level']);
|
|
257
|
+
const tag = HEADING_LEVELS.has(level) ? level : 'h2';
|
|
258
|
+
out.push(`<${tag}>${esc(text)}</${tag}>`);
|
|
259
|
+
},
|
|
260
|
+
richText(props, out) {
|
|
261
|
+
pushHtml(str(props['content']), out);
|
|
262
|
+
},
|
|
263
|
+
text(props, out) {
|
|
264
|
+
pushParagraph(str(props['content']), out);
|
|
265
|
+
},
|
|
266
|
+
button(props, out) {
|
|
267
|
+
pushLinkParagraph(str(props['label']), str(props['href']), out);
|
|
268
|
+
},
|
|
269
|
+
image(props, out) {
|
|
270
|
+
const alt = str(props['alt']);
|
|
271
|
+
if (alt)
|
|
272
|
+
out.push(`<p><em>${esc(alt)}</em></p>`);
|
|
273
|
+
pushParagraph(str(props['caption']), out);
|
|
274
|
+
},
|
|
275
|
+
card(props, out) {
|
|
276
|
+
const title = str(props['title']);
|
|
277
|
+
const href = safeHref(str(props['href']));
|
|
278
|
+
if (title) {
|
|
279
|
+
out.push(href ? `<h3><a href="${escAttr(href)}">${esc(title)}</a></h3>` : `<h3>${esc(title)}</h3>`);
|
|
280
|
+
}
|
|
281
|
+
pushParagraph(str(props['body']), out);
|
|
282
|
+
pushParagraph(str(props['footer']), out);
|
|
283
|
+
},
|
|
284
|
+
cta(props, out) {
|
|
285
|
+
pushHeading(2, str(props['headline']), out);
|
|
286
|
+
pushParagraph(str(props['subtext']), out);
|
|
287
|
+
pushLinkParagraph(str(props['buttonLabel']), str(props['buttonHref']), out);
|
|
288
|
+
},
|
|
289
|
+
hero(props, out) {
|
|
290
|
+
// h1 to match what HeroModule renders.
|
|
291
|
+
pushHeading(1, str(props['headline']), out);
|
|
292
|
+
pushParagraph(str(props['subtext']), out);
|
|
293
|
+
pushLinkParagraph(str(props['buttonLabel']), str(props['buttonHref']), out);
|
|
294
|
+
},
|
|
295
|
+
testimonial(props, out) {
|
|
296
|
+
pushQuote(str(props['quote']), out);
|
|
297
|
+
const author = str(props['author']);
|
|
298
|
+
const role = str(props['role']);
|
|
299
|
+
if (author)
|
|
300
|
+
pushParagraph(role ? `${author}, ${role}` : author, out);
|
|
301
|
+
},
|
|
302
|
+
blockquote(props, out) {
|
|
303
|
+
pushQuote(str(props['content']), out);
|
|
304
|
+
pushParagraph(str(props['author']), out);
|
|
305
|
+
},
|
|
306
|
+
faq(props, out) {
|
|
307
|
+
pushHeading(3, str(props['question']), out);
|
|
308
|
+
pushHtml(str(props['answer']), out);
|
|
309
|
+
},
|
|
310
|
+
accordion(props, out) {
|
|
311
|
+
pushHeading(3, str(props['title']), out);
|
|
312
|
+
pushHtml(str(props['content']), out);
|
|
313
|
+
},
|
|
314
|
+
pricing(props, out) {
|
|
315
|
+
pushHeading(3, str(props['planName']), out);
|
|
316
|
+
const price = str(props['price']);
|
|
317
|
+
const period = str(props['period']);
|
|
318
|
+
if (price)
|
|
319
|
+
pushParagraph(period ? `${price}/${period}` : price, out);
|
|
320
|
+
const features = parseJsonArray(props['features']).map(str).filter(Boolean);
|
|
321
|
+
if (features.length > 0) {
|
|
322
|
+
out.push(`<ul>${features.map(f => `<li>${esc(f)}</li>`).join('')}</ul>`);
|
|
323
|
+
}
|
|
324
|
+
pushLinkParagraph(str(props['buttonLabel']), str(props['buttonHref']), out);
|
|
325
|
+
},
|
|
326
|
+
alert(props, out) {
|
|
327
|
+
pushParagraph(str(props['message']), out);
|
|
328
|
+
},
|
|
329
|
+
badge(props, out) {
|
|
330
|
+
const label = str(props['label']);
|
|
331
|
+
if (!label)
|
|
332
|
+
return;
|
|
333
|
+
const href = str(props['href']);
|
|
334
|
+
if (href)
|
|
335
|
+
pushLinkParagraph(label, href, out);
|
|
336
|
+
else
|
|
337
|
+
pushParagraph(label, out);
|
|
338
|
+
},
|
|
339
|
+
tabs(props, out) {
|
|
340
|
+
for (const raw of parseJsonArray(props['tabs'])) {
|
|
341
|
+
if (!isRecord(raw))
|
|
342
|
+
continue;
|
|
343
|
+
pushHeading(3, str(raw['label']), out);
|
|
344
|
+
pushHtml(str(raw['content']), out);
|
|
345
|
+
}
|
|
346
|
+
},
|
|
347
|
+
feedDisplay(props, out) {
|
|
348
|
+
// Items are other published nodes — they enter the corpus on their own.
|
|
349
|
+
pushHeading(2, str(props['heading']) || str(props['title']), out);
|
|
350
|
+
},
|
|
351
|
+
};
|
|
352
|
+
/**
|
|
353
|
+
* Modules that carry no standalone authored copy, or whose copy is site chrome
|
|
354
|
+
* repeated on every page. See the module docblock for the reasoning per group.
|
|
355
|
+
*/
|
|
356
|
+
const SKIPPED_MODULES = new Set([
|
|
357
|
+
// Layout scaffolding
|
|
358
|
+
'section', 'container', 'columns', 'spacer', 'divider',
|
|
359
|
+
// Arbitrary markup / embeds
|
|
360
|
+
'html', 'embed', 'video',
|
|
361
|
+
// Interaction
|
|
362
|
+
'form', 'formEmbed', 'comments',
|
|
363
|
+
// Navigation + search chrome
|
|
364
|
+
'breadcrumbs', 'navMenu', 'navigation', 'siteMap', 'searchBox', 'search',
|
|
365
|
+
// Compliance chrome
|
|
366
|
+
'cookieConsent',
|
|
367
|
+
// Decorative / structured-data-only
|
|
368
|
+
'icon', 'map', 'socialShare', 'countdown', 'carousel', 'tagCloud', 'categoryList',
|
|
369
|
+
// Personalization chrome + the retired container MODULE (the real container is
|
|
370
|
+
// a layout NODE, handled in the walk above).
|
|
371
|
+
'personalizationBadge', 'variantContainer',
|
|
372
|
+
]);
|
|
373
|
+
// ─── Emit helpers ─────────────────────────────────────────────────────────────
|
|
374
|
+
function pushHeading(level, text, out) {
|
|
375
|
+
if (!text)
|
|
376
|
+
return;
|
|
377
|
+
out.push(`<h${level}>${esc(text)}</h${level}>`);
|
|
378
|
+
}
|
|
379
|
+
function pushParagraph(text, out) {
|
|
380
|
+
if (!text)
|
|
381
|
+
return;
|
|
382
|
+
out.push(`<p>${esc(text)}</p>`);
|
|
383
|
+
}
|
|
384
|
+
function pushLinkParagraph(label, rawHref, out) {
|
|
385
|
+
if (!label)
|
|
386
|
+
return;
|
|
387
|
+
const href = safeHref(rawHref);
|
|
388
|
+
out.push(href ? `<p><a href="${escAttr(href)}">${esc(label)}</a></p>` : `<p>${esc(label)}</p>`);
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* The href allowlist for links this module ASSEMBLES.
|
|
392
|
+
*
|
|
393
|
+
* Rich text goes through `sanitizeHtml`, which enforces its own scheme list, but
|
|
394
|
+
* a `button`/`cta`/`card` href is interpolated straight into markup built here.
|
|
395
|
+
* A stored `javascript:` or `data:` href is inert in an agent corpus and live in
|
|
396
|
+
* anything that renders this HTML, and there is no reason for a projection to
|
|
397
|
+
* carry one. Relative targets (`/`, `#`, `?`, `.`, a bare path) pass; an
|
|
398
|
+
* absolute one must be http(s)/mailto/tel. Dropped → the label still emits as
|
|
399
|
+
* plain copy, since the words are the content.
|
|
400
|
+
*/
|
|
401
|
+
const SAFE_SCHEME = /^(https?|mailto|tel):/i;
|
|
402
|
+
const HAS_SCHEME = /^[a-z][a-z0-9+.-]*:/i;
|
|
403
|
+
function safeHref(href) {
|
|
404
|
+
if (!href)
|
|
405
|
+
return '';
|
|
406
|
+
// Control characters are how `java\0script:` style bypasses are written.
|
|
407
|
+
const cleaned = href.replace(/[\u0000-\u001f\u007f]/g, '');
|
|
408
|
+
if (!cleaned)
|
|
409
|
+
return '';
|
|
410
|
+
if (!HAS_SCHEME.test(cleaned))
|
|
411
|
+
return cleaned;
|
|
412
|
+
return SAFE_SCHEME.test(cleaned) ? cleaned : '';
|
|
413
|
+
}
|
|
414
|
+
function pushQuote(text, out) {
|
|
415
|
+
if (!text)
|
|
416
|
+
return;
|
|
417
|
+
out.push(`<blockquote><p>${esc(text)}</p></blockquote>`);
|
|
418
|
+
}
|
|
419
|
+
/** Stored rich text is CMS-authored HTML: sanitize it exactly as the renderer does. */
|
|
420
|
+
function pushHtml(html, out) {
|
|
421
|
+
if (!html)
|
|
422
|
+
return;
|
|
423
|
+
const clean = sanitizeHtml(html).trim();
|
|
424
|
+
if (clean)
|
|
425
|
+
out.push(clean);
|
|
426
|
+
}
|
|
427
|
+
// ─── Small pure helpers ───────────────────────────────────────────────────────
|
|
428
|
+
let cachedBuiltInRegistry = null;
|
|
429
|
+
/** The built-ins-only registry, built once (it is immutable and stateless). */
|
|
430
|
+
function builtInRegistry() {
|
|
431
|
+
cachedBuiltInRegistry ??= createModuleRegistry([]);
|
|
432
|
+
return cachedBuiltInRegistry;
|
|
433
|
+
}
|
|
434
|
+
const registryByModules = new WeakMap();
|
|
435
|
+
/**
|
|
436
|
+
* The module registry for a config's `modules`, memoised on the array itself.
|
|
437
|
+
*
|
|
438
|
+
* The per-NODE surfaces — `/<path>.md`, per-page JSON-LD — are handed a node by
|
|
439
|
+
* the host rather than by the AX content source, so nothing precomputed their
|
|
440
|
+
* layout projection and they must build the registry themselves. Doing it
|
|
441
|
+
* unmemoised would rebuild a ~45-entry map on every request; the config's
|
|
442
|
+
* `modules` array is a stable object for the process's lifetime, so it keys the
|
|
443
|
+
* cache exactly.
|
|
444
|
+
*
|
|
445
|
+
* NOTE what this deliberately does NOT carry: a component resolver. Resolving a
|
|
446
|
+
* saved component is a database read, and these two surfaces are synchronous and
|
|
447
|
+
* DB-free by contract. A linked placement on a node that did not come through
|
|
448
|
+
* the content source therefore contributes its inline fallback copy — the same
|
|
449
|
+
* copy the renderer falls back to when a link cannot be resolved.
|
|
450
|
+
*/
|
|
451
|
+
export function registryForModules(modules) {
|
|
452
|
+
if (!Array.isArray(modules) || modules.length === 0)
|
|
453
|
+
return builtInRegistry();
|
|
454
|
+
const hit = registryByModules.get(modules);
|
|
455
|
+
if (hit)
|
|
456
|
+
return hit;
|
|
457
|
+
const built = createModuleRegistry(modules);
|
|
458
|
+
registryByModules.set(modules, built);
|
|
459
|
+
return built;
|
|
460
|
+
}
|
|
461
|
+
function asLayoutDocument(value) {
|
|
462
|
+
if (!isRecord(value))
|
|
463
|
+
return null;
|
|
464
|
+
const regions = value['regions'];
|
|
465
|
+
if (!isRecord(regions))
|
|
466
|
+
return null;
|
|
467
|
+
return value;
|
|
468
|
+
}
|
|
469
|
+
function isRecord(value) {
|
|
470
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
471
|
+
}
|
|
472
|
+
/**
|
|
473
|
+
* THE guard for every walk site. A stored layout is raw JSONB that
|
|
474
|
+
* `setContentLayout` never validated, so any of `regions.main`, `columns`,
|
|
475
|
+
* `nodes`, `defaultSections` and `variants` may be an object, a string, or
|
|
476
|
+
* absent. `for (const x of somethingNotIterable)` is a TypeError, and these
|
|
477
|
+
* projections run on public routes.
|
|
478
|
+
*/
|
|
479
|
+
function asArray(value) {
|
|
480
|
+
return Array.isArray(value) ? value : [];
|
|
481
|
+
}
|
|
482
|
+
function str(value) {
|
|
483
|
+
return typeof value === 'string' ? value.trim() : '';
|
|
484
|
+
}
|
|
485
|
+
/**
|
|
486
|
+
* Structured data stored in a `textarea` prop (the palette's item lists). The
|
|
487
|
+
* `JSON.parse` is not decoration: prose legitimately opens with a brace
|
|
488
|
+
* ("{curly} quotes", "[draft] title"), and dropping it would silently lose real
|
|
489
|
+
* copy.
|
|
490
|
+
*/
|
|
491
|
+
function looksLikeJson(value) {
|
|
492
|
+
const first = value[0];
|
|
493
|
+
if (first !== '[' && first !== '{')
|
|
494
|
+
return false;
|
|
495
|
+
try {
|
|
496
|
+
JSON.parse(value);
|
|
497
|
+
return true;
|
|
498
|
+
}
|
|
499
|
+
catch {
|
|
500
|
+
return false;
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
/**
|
|
504
|
+
* A prop that NAMES something rather than saying something: a link target, an
|
|
505
|
+
* id, a slug, a CSS class.
|
|
506
|
+
*
|
|
507
|
+
* The palette has no "reference" prop type, so a custom module's `ctaHref`,
|
|
508
|
+
* `experimentId` or `videoSrc` is declared `text` alongside its `headline`. Emitting those as
|
|
509
|
+
* paragraphs fills an agent corpus with bare paths and UUIDs, and the schema
|
|
510
|
+
* path is the only projection that cannot tell them apart from copy (a built-in
|
|
511
|
+
* emitter names the props it reads). Matching on the name is the cheap, stable
|
|
512
|
+
* half of that; {@link looksLikeLinkTarget} catches the rest by value.
|
|
513
|
+
*/
|
|
514
|
+
function isReferenceProp(name) {
|
|
515
|
+
// Whole name, or a camelCase suffix. The camelCase half must require the
|
|
516
|
+
// capital: a plain `/id$/i` would also swallow `valid`, `grid` and `hybrid`.
|
|
517
|
+
return (/^(href|url|uri|id|slug|class|classname|link|path|route|target|src)$/i.test(name) ||
|
|
518
|
+
/[a-z](Href|Url|Uri|Id|Slug|Class|ClassName|Link|Path|Route|Target|Src)$/.test(name));
|
|
519
|
+
}
|
|
520
|
+
/** A bare path, anchor, or absolute URL — a destination, not a sentence. */
|
|
521
|
+
function looksLikeLinkTarget(value) {
|
|
522
|
+
if (/\s/.test(value))
|
|
523
|
+
return false;
|
|
524
|
+
return /^(\/|#|https?:\/\/|mailto:|tel:)/i.test(value);
|
|
525
|
+
}
|
|
526
|
+
function parseJsonArray(raw) {
|
|
527
|
+
if (Array.isArray(raw))
|
|
528
|
+
return raw;
|
|
529
|
+
if (typeof raw !== 'string')
|
|
530
|
+
return [];
|
|
531
|
+
try {
|
|
532
|
+
const parsed = JSON.parse(raw);
|
|
533
|
+
return Array.isArray(parsed) ? parsed : [];
|
|
534
|
+
}
|
|
535
|
+
catch {
|
|
536
|
+
return [];
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
function esc(text) {
|
|
540
|
+
return text.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
|
|
541
|
+
}
|
|
542
|
+
function escAttr(text) {
|
|
543
|
+
return esc(text).replace(/"/g, '"');
|
|
544
|
+
}
|
|
545
|
+
//# sourceMappingURL=layout-to-html.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout-to-html.js","sourceRoot":"","sources":["../../src/ax/layout-to-html.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import type { AxContentSource, AxRenderContext } from './types.js';
|
|
2
2
|
/**
|
|
3
3
|
* Generate `llms-full.txt` — the full-text agent corpus: a deterministic
|
|
4
|
-
* HTML→Markdown projection of every AX-eligible published node's
|
|
4
|
+
* HTML→Markdown projection of every AX-eligible published node's effective body
|
|
5
|
+
* (its stored `body`, or its LAYOUT serialized to HTML when that is empty —
|
|
6
|
+
* kywi-cms#195).
|
|
5
7
|
*
|
|
6
8
|
* Preamble matches the llms.txt header, then one `## {title}` section per node
|
|
7
9
|
* (ordered by path), each with a URL/Type/Updated header line and the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llms-full-txt.d.ts","sourceRoot":"","sources":["../../src/ax/llms-full-txt.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"llms-full-txt.d.ts","sourceRoot":"","sources":["../../src/ax/llms-full-txt.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAiB,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjF;;;;;;;;;GASG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CA4BxG"}
|
package/dist/ax/llms-full-txt.js
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { resolveAxConfig } from '../config/define.js';
|
|
2
2
|
import { absoluteUrl } from './url.js';
|
|
3
3
|
import { htmlToMarkdown } from './html-to-markdown.js';
|
|
4
|
+
import { effectiveBodyHtml } from './effective-body.js';
|
|
4
5
|
import { isAxEligible } from './filters.js';
|
|
5
6
|
/**
|
|
6
7
|
* Generate `llms-full.txt` — the full-text agent corpus: a deterministic
|
|
7
|
-
* HTML→Markdown projection of every AX-eligible published node's
|
|
8
|
+
* HTML→Markdown projection of every AX-eligible published node's effective body
|
|
9
|
+
* (its stored `body`, or its LAYOUT serialized to HTML when that is empty —
|
|
10
|
+
* kywi-cms#195).
|
|
8
11
|
*
|
|
9
12
|
* Preamble matches the llms.txt header, then one `## {title}` section per node
|
|
10
13
|
* (ordered by path), each with a URL/Type/Updated header line and the
|
|
@@ -44,7 +47,7 @@ function section(node, baseUrl) {
|
|
|
44
47
|
`URL: ${url}`,
|
|
45
48
|
`Type: ${node.contentTypeName}${updated ? ` Updated: ${updated}` : ''}`,
|
|
46
49
|
].join('\n');
|
|
47
|
-
const bodySource =
|
|
50
|
+
const bodySource = effectiveBodyHtml(node) || strOrEmpty(node.summary);
|
|
48
51
|
const markdown = htmlToMarkdown(bodySource);
|
|
49
52
|
return markdown ? `${header}\n\n${markdown}` : header;
|
|
50
53
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llms-full-txt.js","sourceRoot":"","sources":["../../src/ax/llms-full-txt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAG3C
|
|
1
|
+
{"version":3,"file":"llms-full-txt.js","sourceRoot":"","sources":["../../src/ax/llms-full-txt.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,16 @@
|
|
|
1
1
|
import type { AxContentNode, AxRenderContext } from './types.js';
|
|
2
2
|
/**
|
|
3
3
|
* Single-node Markdown projection for content negotiation (`.md` /
|
|
4
|
-
* `Accept: text/markdown`). Deterministic HTML→Markdown of the
|
|
5
|
-
*
|
|
4
|
+
* `Accept: text/markdown`). Deterministic HTML→Markdown of the node's effective
|
|
5
|
+
* body — its stored `body`, or its LAYOUT serialized to HTML when that column is
|
|
6
|
+
* empty (kywi-cms#195) — the same converter as llms-full.txt, no language model.
|
|
7
|
+
*
|
|
8
|
+
* PROJECTING THE STORED LAYOUT IS CORRECT HERE, unlike in per-page JSON-LD.
|
|
9
|
+
* `/ax/md/slug/*` reads no cookie and resolves no audience — it is the same
|
|
10
|
+
* anonymous surface llms-full.txt is — so `layoutToHtml`'s own answer (Default,
|
|
11
|
+
* or a locked A/B winner, never a targeted arm) IS what this surface serves.
|
|
12
|
+
* JSON-LD differs because it renders inside a personalized page; see
|
|
13
|
+
* `generateJsonLd`'s docblock for that contract.
|
|
6
14
|
*/
|
|
7
15
|
export declare function generatePageMarkdown(node: AxContentNode, ctx: AxRenderContext): string;
|
|
8
16
|
//# sourceMappingURL=page-markdown.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page-markdown.d.ts","sourceRoot":"","sources":["../../src/ax/page-markdown.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"page-markdown.d.ts","sourceRoot":"","sources":["../../src/ax/page-markdown.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEhE;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,eAAe,GAAG,MAAM,CAetF"}
|