@mdwrk/lander-seo 0.1.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/README.md ADDED
@@ -0,0 +1,39 @@
1
+ # @mdwrk/lander-seo
2
+
3
+ **Metadata, scoring, and discovery helpers**
4
+
5
+ <p align="center">
6
+ <a href="https://github.com/groupsum/markdown_workspace/blob/master/packages/lander/lander-seo/README.md"><img alt="Hits" src="https://visitor-badge.laobi.icu/badge?page_id=groupsum.markdown_workspace.packages_lander_lander_seo_README&amp;left_text=hits" /></a>
7
+ <a href="https://www.npmjs.com/package/@mdwrk/lander-seo"><img alt="Downloads" src="https://img.shields.io/npm/dm/%40mdwrk%2Flander-seo?label=downloads" /></a>
8
+ <a href="../../../package.json"><img alt="Node" src="https://img.shields.io/badge/node-20.x%20%7C%2021.x%20%7C%2022.x-339933?logo=node.js&amp;logoColor=white" /></a>
9
+ <a href="../../../LICENSE"><img alt="License: Apache-2.0" src="https://img.shields.io/badge/license-Apache--2.0-blue.svg" /></a>
10
+ </p>
11
+
12
+ This package provides metadata assembly, page scoring, AI summary helpers, and re-exports for sitemap, robots, and llms.txt generation.
13
+
14
+ ## Why
15
+ Use it when you want lander SEO and AI-discovery helpers above the raw compiler output.
16
+
17
+ ## What
18
+ - Page metadata builders.
19
+ - SEO scoring and diagnostics.
20
+ - AI summary helpers plus re-exports for crawl/discovery files.
21
+
22
+ ## Installation
23
+ Node.js 20.x through 22.x, matching the workspace engine contract in the root package manifest.
24
+
25
+ ```bash
26
+ npm install @mdwrk/lander-seo @mdwrk/lander-core
27
+ ```
28
+
29
+ ## Usage
30
+ ```ts
31
+ import { buildAiSummary, buildPageMetadata, scoreSeoPage } from "@mdwrk/lander-seo";
32
+
33
+ console.log(buildAiSummary);
34
+ console.log(buildPageMetadata, scoreSeoPage);
35
+ ```
36
+
37
+ ## Related
38
+ - [Packages index](../../README.md) - family and package navigation
39
+ - [Root README](../../../README.md) - repo overview
@@ -0,0 +1,149 @@
1
+ import { buildLlmsTxt, buildRobotsTxt, buildSitemap } from "@mdwrk/lander-core";
2
+ import type { CompiledLanderSite, CompiledPage } from "@mdwrk/lander-core";
3
+ import type { LanderCacheHeaderManifest, LanderCacheResourceInput } from "@mdwrk/lander-core";
4
+ import { LANDER_SEO_VERSION } from "./version.js";
5
+ export { LANDER_SEO_VERSION, buildLlmsTxt, buildRobotsTxt, buildSitemap };
6
+ export interface PageMetadata {
7
+ title: string;
8
+ description: string;
9
+ alternates: {
10
+ canonical: string;
11
+ };
12
+ openGraph: {
13
+ title: string;
14
+ description: string;
15
+ url: string;
16
+ siteName: string;
17
+ type: "website" | "article";
18
+ };
19
+ twitter: {
20
+ card: "summary" | "summary_large_image";
21
+ title: string;
22
+ description: string;
23
+ };
24
+ }
25
+ export interface SeoScore {
26
+ title: number;
27
+ description: number;
28
+ h1: number;
29
+ canonical: number;
30
+ schema: number;
31
+ faq: number;
32
+ internalLinks: number;
33
+ crawlableText: number;
34
+ total: number;
35
+ diagnostics: string[];
36
+ }
37
+ export interface DiscoveryArtifactPageSource {
38
+ sourcePath?: string;
39
+ sourceHash?: string;
40
+ lastmod?: string;
41
+ text?: string;
42
+ headings?: string[];
43
+ links?: string[];
44
+ tags?: string[];
45
+ locale?: string;
46
+ translationOf?: string;
47
+ localeGroup?: string;
48
+ contentType?: string;
49
+ intent?: string;
50
+ subtitle?: string;
51
+ llmsInclude?: boolean;
52
+ alternates?: {
53
+ hreflang: string;
54
+ href: string;
55
+ }[];
56
+ jsonLdGraph?: Record<string, unknown>[];
57
+ }
58
+ export interface DiscoveryArtifactOptions {
59
+ generatedAt?: Date | string;
60
+ crawlerPolicies?: DiscoveryCrawlerPolicy[];
61
+ pageSources?: Record<string, DiscoveryArtifactPageSource>;
62
+ additionalCacheResources?: LanderCacheResourceInput[];
63
+ }
64
+ export interface DiscoveryCrawlerPolicy {
65
+ userAgent: string;
66
+ category?: string;
67
+ purpose?: string;
68
+ allow?: string[];
69
+ disallow?: string[];
70
+ }
71
+ export interface ContentIndexEntry {
72
+ slug: string;
73
+ url: string;
74
+ title: string;
75
+ description: string;
76
+ h1: string;
77
+ subtitle?: string;
78
+ intent?: string;
79
+ contentType?: string;
80
+ locale?: string;
81
+ translationOf?: string;
82
+ localeGroup?: string;
83
+ updatedAt?: string;
84
+ tags?: string[];
85
+ llmsInclude: boolean;
86
+ markdownMirror: string | null;
87
+ jsonLdId: string;
88
+ }
89
+ export interface SemanticIndexEntry extends ContentIndexEntry {
90
+ path: string;
91
+ wordCount: number;
92
+ headings: string[];
93
+ links: string[];
94
+ schemaIntentIds: string[];
95
+ componentIntentIds: string[];
96
+ }
97
+ export interface ContentRegistryEntry {
98
+ sourcePath?: string;
99
+ sourceHash?: string;
100
+ frontmatter: Record<string, unknown>;
101
+ rendered: {
102
+ text: string;
103
+ headings: string[];
104
+ links: string[];
105
+ wordCount: number;
106
+ };
107
+ discovery: {
108
+ canonical: string;
109
+ sitemap: boolean;
110
+ robots: "index,follow" | "noindex,follow";
111
+ llms: boolean;
112
+ markdownMirror: boolean;
113
+ jsonLdGraphIds: string[];
114
+ };
115
+ }
116
+ export interface JsonLdGraphArtifact {
117
+ "@context": "https://schema.org";
118
+ "@graph": Record<string, unknown>[];
119
+ }
120
+ export interface DiscoveryArtifacts {
121
+ sitemapXml: string;
122
+ sitemapXsl: string;
123
+ robotsTxt: string;
124
+ llmsTxt: string;
125
+ llmsFullTxt: string;
126
+ contentIndex: ContentIndexEntry[];
127
+ semanticIndex: SemanticIndexEntry[];
128
+ contentRegistry: ContentRegistryEntry[];
129
+ jsonLdGraph: JsonLdGraphArtifact;
130
+ cacheHeaderManifest: LanderCacheHeaderManifest;
131
+ }
132
+ export interface DiscoveryValidationResult {
133
+ ok: boolean;
134
+ diagnostics: string[];
135
+ }
136
+ export declare function buildSitemapXml(site: CompiledLanderSite, options?: DiscoveryArtifactOptions): string;
137
+ export declare function buildSitemapStylesheet(site: CompiledLanderSite): string;
138
+ export declare function buildRobotsTxtArtifact(site: CompiledLanderSite, options?: DiscoveryArtifactOptions): string;
139
+ export declare function buildLlmsFullTxt(site: CompiledLanderSite, options?: DiscoveryArtifactOptions): string;
140
+ export declare function buildContentIndex(site: CompiledLanderSite, options?: DiscoveryArtifactOptions): ContentIndexEntry[];
141
+ export declare function buildSemanticIndex(site: CompiledLanderSite, options?: DiscoveryArtifactOptions): SemanticIndexEntry[];
142
+ export declare function buildJsonLdGraphArtifact(site: CompiledLanderSite, options?: DiscoveryArtifactOptions): JsonLdGraphArtifact;
143
+ export declare function buildContentRegistry(site: CompiledLanderSite, options?: DiscoveryArtifactOptions): ContentRegistryEntry[];
144
+ export declare function buildDiscoveryArtifacts(site: CompiledLanderSite, options?: DiscoveryArtifactOptions): DiscoveryArtifacts;
145
+ export declare function validateDiscoveryArtifacts(site: CompiledLanderSite, artifacts: DiscoveryArtifacts): DiscoveryValidationResult;
146
+ export declare function buildPageMetadata(site: CompiledLanderSite, page: CompiledPage): PageMetadata;
147
+ export declare function scoreSeoPage(page: CompiledPage): SeoScore;
148
+ export declare function buildAiSummary(site: CompiledLanderSite): string;
149
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,405 @@
1
+ import { buildCacheHeaderManifest, buildLlmsTxt, buildRobotsTxt, buildSitemap, normalizeRouteSlug, pageText, } from "@mdwrk/lander-core";
2
+ import { LANDER_SEO_VERSION } from "./version.js";
3
+ export { LANDER_SEO_VERSION, buildLlmsTxt, buildRobotsTxt, buildSitemap };
4
+ const discoveryArtifactPaths = [
5
+ "/sitemap.xml",
6
+ "/sitemap.xsl",
7
+ "/robots.txt",
8
+ "/llms.txt",
9
+ "/llms-full.txt",
10
+ "/content-index.json",
11
+ "/semantic-index.json",
12
+ "/content-registry.json",
13
+ "/jsonld-graph.json",
14
+ ];
15
+ const getPageSource = (page, options) => options.pageSources?.[page.path] ?? options.pageSources?.[page.slug] ?? {};
16
+ const pageUpdatedAt = (page, source) => source.lastmod;
17
+ const pageLlmsIncluded = (page, source) => page.seo?.noindex !== true && source.llmsInclude !== false;
18
+ const pageRenderedText = (page, source) => source.text ?? pageText(page);
19
+ const stableJson = (value) => `${JSON.stringify(value, null, 2)}\n`;
20
+ const escapeXml = (value) => String(value)
21
+ .replace(/&/g, "&amp;")
22
+ .replace(/</g, "&lt;")
23
+ .replace(/>/g, "&gt;")
24
+ .replace(/"/g, "&quot;");
25
+ function sortedPages(site) {
26
+ return [...site.pages].sort((left, right) => left.path.localeCompare(right.path));
27
+ }
28
+ export function buildSitemapXml(site, options = {}) {
29
+ const urls = sortedPages(site)
30
+ .filter((page) => page.seo?.noindex !== true)
31
+ .map((page) => {
32
+ const source = getPageSource(page, options);
33
+ const alternates = source.alternates ?? [];
34
+ return [
35
+ " <url>",
36
+ ` <loc>${escapeXml(page.canonicalUrl)}</loc>`,
37
+ ...(pageUpdatedAt(page, source) ? [` <lastmod>${escapeXml(pageUpdatedAt(page, source) ?? "")}</lastmod>`] : []),
38
+ ...alternates.map((alternate) => ` <xhtml:link rel="alternate" hreflang="${escapeXml(alternate.hreflang)}" href="${escapeXml(alternate.href)}" />`),
39
+ " </url>",
40
+ ].join("\n");
41
+ });
42
+ return [
43
+ '<?xml version="1.0" encoding="UTF-8"?>',
44
+ '<?xml-stylesheet type="text/xsl" href="/sitemap.xsl"?>',
45
+ '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml">',
46
+ urls.join("\n\n"),
47
+ "</urlset>",
48
+ "",
49
+ ].join("\n");
50
+ }
51
+ export function buildSitemapStylesheet(site) {
52
+ const productName = escapeXml(site.product.name);
53
+ return [
54
+ '<?xml version="1.0" encoding="UTF-8"?>',
55
+ '<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sm="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml">',
56
+ ' <xsl:output method="html" encoding="UTF-8" indent="yes" />',
57
+ ' <xsl:template match="/">',
58
+ ' <html lang="en">',
59
+ ' <head>',
60
+ ` <title>${productName} Sitemap</title>`,
61
+ ' <meta charset="UTF-8" />',
62
+ ' <meta name="viewport" content="width=device-width, initial-scale=1" />',
63
+ ' <style>',
64
+ ' :root { color-scheme: light; --bg: #f8fafc; --ink: #18212f; --muted: #5b6676; --panel: #ffffff; --line: #cbd5e1; --accent: #2563eb; }',
65
+ ' * { box-sizing: border-box; }',
66
+ ' body { margin: 0; background: var(--bg); color: var(--ink); font: 16px/1.55 Georgia, "Times New Roman", serif; }',
67
+ ' main { width: min(1180px, calc(100% - 2rem)); margin: 0 auto; padding: 3rem 0; }',
68
+ ' h1 { margin: 0; font-size: 3rem; line-height: 1; letter-spacing: 0; }',
69
+ ' p { max-width: 66ch; color: var(--muted); }',
70
+ ' table { width: 100%; margin-top: 2rem; border-collapse: collapse; overflow-wrap: anywhere; background: var(--panel); border: 1px solid var(--line); box-shadow: 0 24px 70px rgba(73, 45, 19, .14); }',
71
+ ' th, td { padding: .9rem 1rem; text-align: left; vertical-align: top; border-bottom: 1px solid var(--line); }',
72
+ ' th { color: #fff; background: var(--accent); font-family: ui-sans-serif, system-ui, sans-serif; font-size: .78rem; letter-spacing: .12em; text-transform: uppercase; }',
73
+ ' tr:last-child td { border-bottom: 0; }',
74
+ ' a { color: #6f3d16; font-weight: 700; }',
75
+ ' .alternate { color: var(--muted); font-size: .9rem; }',
76
+ ' </style>',
77
+ ' </head>',
78
+ ' <body>',
79
+ ' <main>',
80
+ ` <h1>${productName} Sitemap</h1>`,
81
+ ' <p>This is the machine-readable XML sitemap rendered as a human-readable table. Search engines read the XML nodes; browsers use this stylesheet for review.</p>',
82
+ ' <table>',
83
+ ' <thead>',
84
+ ' <tr>',
85
+ ' <th scope="col">URL</th>',
86
+ ' <th scope="col">Last modified</th>',
87
+ ' </tr>',
88
+ ' </thead>',
89
+ ' <tbody>',
90
+ ' <xsl:for-each select="sm:urlset/sm:url">',
91
+ ' <tr>',
92
+ ' <td>',
93
+ ' <a>',
94
+ ' <xsl:attribute name="href"><xsl:value-of select="sm:loc" /></xsl:attribute>',
95
+ ' <xsl:value-of select="sm:loc" />',
96
+ ' </a>',
97
+ ' <br />',
98
+ ' <xsl:for-each select="xhtml:link">',
99
+ ' <span class="alternate">alternate <xsl:value-of select="@hreflang" />: <xsl:value-of select="@href" /></span>',
100
+ ' <br />',
101
+ ' </xsl:for-each>',
102
+ ' </td>',
103
+ ' <td><xsl:value-of select="sm:lastmod" /></td>',
104
+ ' </tr>',
105
+ ' </xsl:for-each>',
106
+ ' </tbody>',
107
+ ' </table>',
108
+ ' </main>',
109
+ ' </body>',
110
+ ' </html>',
111
+ ' </xsl:template>',
112
+ '</xsl:stylesheet>',
113
+ '',
114
+ ].join("\n");
115
+ }
116
+ export function buildRobotsTxtArtifact(site, options = {}) {
117
+ if (!options.crawlerPolicies?.length)
118
+ return buildRobotsTxt(site);
119
+ return [
120
+ ...options.crawlerPolicies.flatMap((policy) => [
121
+ `User-agent: ${policy.userAgent}`,
122
+ ...(policy.category ? [`# Category: ${policy.category}`] : []),
123
+ ...(policy.purpose ? [`# Purpose: ${policy.purpose}`] : []),
124
+ ...(policy.allow ?? []).map((value) => `Allow: ${value}`),
125
+ ...(policy.disallow ?? []).map((value) => `Disallow: ${value}`),
126
+ "",
127
+ ]),
128
+ `Sitemap: ${site.product.canonicalUrl.replace(/\/+$/, "")}/sitemap.xml`,
129
+ "",
130
+ ].join("\n");
131
+ }
132
+ export function buildLlmsFullTxt(site, options = {}) {
133
+ const title = site.ai?.llmsTxtTitle ?? site.product.name;
134
+ return [
135
+ `# ${title} Full Content`,
136
+ "",
137
+ ...sortedPages(site)
138
+ .filter((page) => pageLlmsIncluded(page, getPageSource(page, options)))
139
+ .flatMap((page) => {
140
+ const source = getPageSource(page, options);
141
+ return [
142
+ `## ${page.h1}`,
143
+ "",
144
+ `URL: ${page.canonicalUrl}`,
145
+ "",
146
+ source.subtitle ?? page.description,
147
+ "",
148
+ pageRenderedText(page, source),
149
+ "",
150
+ ];
151
+ }),
152
+ ].join("\n");
153
+ }
154
+ export function buildContentIndex(site, options = {}) {
155
+ return sortedPages(site)
156
+ .filter((page) => page.seo?.noindex !== true)
157
+ .map((page) => {
158
+ const source = getPageSource(page, options);
159
+ return {
160
+ slug: normalizeRouteSlug(page.slug),
161
+ url: page.canonicalUrl,
162
+ title: page.title,
163
+ description: page.description,
164
+ h1: page.h1,
165
+ subtitle: source.subtitle,
166
+ intent: source.intent,
167
+ contentType: source.contentType,
168
+ locale: source.locale,
169
+ translationOf: source.translationOf,
170
+ localeGroup: source.localeGroup,
171
+ updatedAt: pageUpdatedAt(page, source),
172
+ tags: source.tags,
173
+ llmsInclude: pageLlmsIncluded(page, source),
174
+ markdownMirror: pageLlmsIncluded(page, source) ? `${normalizeRouteSlug(page.slug)}index.md` : null,
175
+ jsonLdId: `${page.canonicalUrl}#webpage`,
176
+ };
177
+ });
178
+ }
179
+ export function buildSemanticIndex(site, options = {}) {
180
+ return buildContentIndex(site, options).map((entry) => {
181
+ const page = site.pageByPath.get(normalizeRouteSlug(entry.slug)) ?? site.pages.find((candidate) => candidate.canonicalUrl === entry.url);
182
+ const source = page ? getPageSource(page, options) : {};
183
+ return {
184
+ ...entry,
185
+ path: page?.path ?? normalizeRouteSlug(entry.slug),
186
+ wordCount: page?.wordCount ?? 0,
187
+ headings: source.headings ?? [entry.h1],
188
+ links: source.links ?? page?.internalLinks ?? [],
189
+ schemaIntentIds: page?.schemaIntents.map((intent) => intent.id) ?? [],
190
+ componentIntentIds: page?.componentIntents.map((intent) => intent.id) ?? [],
191
+ };
192
+ });
193
+ }
194
+ export function buildJsonLdGraphArtifact(site, options = {}) {
195
+ const graph = sortedPages(site).flatMap((page) => {
196
+ const source = getPageSource(page, options);
197
+ if (source.jsonLdGraph?.length)
198
+ return source.jsonLdGraph;
199
+ return [
200
+ {
201
+ "@type": "WebPage",
202
+ "@id": `${page.canonicalUrl}#webpage`,
203
+ url: page.canonicalUrl,
204
+ name: page.title,
205
+ description: page.description,
206
+ inLanguage: source.locale,
207
+ dateModified: pageUpdatedAt(page, source),
208
+ isPartOf: { "@id": `${site.product.canonicalUrl.replace(/\/+$/, "")}#website` },
209
+ },
210
+ ];
211
+ });
212
+ return {
213
+ "@context": "https://schema.org",
214
+ "@graph": [
215
+ {
216
+ "@type": "WebSite",
217
+ "@id": `${site.product.canonicalUrl.replace(/\/+$/, "")}#website`,
218
+ url: site.product.canonicalUrl.replace(/\/+$/, ""),
219
+ name: site.product.name,
220
+ description: site.product.description,
221
+ },
222
+ ...graph,
223
+ ],
224
+ };
225
+ }
226
+ export function buildContentRegistry(site, options = {}) {
227
+ const jsonLdIdsByCanonical = new Map();
228
+ for (const node of buildJsonLdGraphArtifact(site, options)["@graph"]) {
229
+ const id = typeof node["@id"] === "string" ? node["@id"] : undefined;
230
+ if (!id)
231
+ continue;
232
+ const canonical = id.replace(/#.*$/, "");
233
+ const values = jsonLdIdsByCanonical.get(canonical) ?? [];
234
+ values.push(id);
235
+ jsonLdIdsByCanonical.set(canonical, values);
236
+ }
237
+ return sortedPages(site).map((page) => {
238
+ const source = getPageSource(page, options);
239
+ const renderedText = pageRenderedText(page, source);
240
+ return {
241
+ sourcePath: source.sourcePath,
242
+ sourceHash: source.sourceHash,
243
+ frontmatter: {
244
+ slug: page.slug,
245
+ canonical: page.canonicalUrl,
246
+ title: page.title,
247
+ description: page.description,
248
+ h1: page.h1,
249
+ updatedAt: pageUpdatedAt(page, source),
250
+ noindex: page.seo?.noindex === true,
251
+ llmsInclude: pageLlmsIncluded(page, source),
252
+ locale: source.locale,
253
+ translationOf: source.translationOf,
254
+ localeGroup: source.localeGroup,
255
+ tags: source.tags,
256
+ contentType: source.contentType,
257
+ intent: source.intent,
258
+ },
259
+ rendered: {
260
+ text: renderedText,
261
+ headings: source.headings ?? [page.h1],
262
+ links: source.links ?? page.internalLinks,
263
+ wordCount: page.wordCount,
264
+ },
265
+ discovery: {
266
+ canonical: page.canonicalUrl,
267
+ sitemap: page.seo?.noindex !== true,
268
+ robots: page.seo?.noindex === true ? "noindex,follow" : "index,follow",
269
+ llms: pageLlmsIncluded(page, source),
270
+ markdownMirror: pageLlmsIncluded(page, source),
271
+ jsonLdGraphIds: jsonLdIdsByCanonical.get(page.canonicalUrl) ?? [],
272
+ },
273
+ };
274
+ });
275
+ }
276
+ export function buildDiscoveryArtifacts(site, options = {}) {
277
+ const sitemapXml = buildSitemapXml(site, options);
278
+ const sitemapXsl = buildSitemapStylesheet(site);
279
+ const robotsTxt = buildRobotsTxtArtifact(site, options);
280
+ const llmsTxt = buildLlmsTxt(site);
281
+ const llmsFullTxt = buildLlmsFullTxt(site, options);
282
+ const contentIndex = buildContentIndex(site, options);
283
+ const semanticIndex = buildSemanticIndex(site, options);
284
+ const contentRegistry = buildContentRegistry(site, options);
285
+ const jsonLdGraph = buildJsonLdGraphArtifact(site, options);
286
+ const cacheInputs = [
287
+ { path: "/sitemap.xml", content: sitemapXml, contentType: "application/xml; charset=utf-8" },
288
+ { path: "/sitemap.xsl", content: sitemapXsl, contentType: "application/xml; charset=utf-8" },
289
+ { path: "/robots.txt", content: robotsTxt, contentType: "text/plain; charset=utf-8" },
290
+ { path: "/llms.txt", content: llmsTxt, contentType: "text/plain; charset=utf-8" },
291
+ { path: "/llms-full.txt", content: llmsFullTxt, contentType: "text/plain; charset=utf-8" },
292
+ { path: "/content-index.json", content: stableJson(contentIndex), contentType: "application/json; charset=utf-8" },
293
+ { path: "/semantic-index.json", content: stableJson(semanticIndex), contentType: "application/json; charset=utf-8" },
294
+ { path: "/content-registry.json", content: stableJson(contentRegistry), contentType: "application/json; charset=utf-8" },
295
+ { path: "/jsonld-graph.json", content: stableJson(jsonLdGraph), contentType: "application/json; charset=utf-8" },
296
+ ...(options.additionalCacheResources ?? []),
297
+ ];
298
+ const cacheHeaderManifest = options.generatedAt ? buildCacheHeaderManifest(cacheInputs, options.generatedAt) : buildCacheHeaderManifest(cacheInputs);
299
+ return { sitemapXml, sitemapXsl, robotsTxt, llmsTxt, llmsFullTxt, contentIndex, semanticIndex, contentRegistry, jsonLdGraph, cacheHeaderManifest };
300
+ }
301
+ export function validateDiscoveryArtifacts(site, artifacts) {
302
+ const diagnostics = [];
303
+ const indexCanonicals = new Set(artifacts.contentIndex.map((entry) => entry.url));
304
+ const registryCanonicals = new Set(artifacts.contentRegistry.map((entry) => entry.discovery.canonical));
305
+ const graphIds = new Set(artifacts.jsonLdGraph["@graph"].map((node) => node["@id"]).filter((value) => typeof value === "string"));
306
+ const cachePaths = new Set(artifacts.cacheHeaderManifest.entries.map((entry) => entry.path));
307
+ if (!artifacts.sitemapXml.includes('<?xml-stylesheet type="text/xsl" href="/sitemap.xsl"?>'))
308
+ diagnostics.push("sitemap.xml missing sitemap.xsl stylesheet link");
309
+ if (!artifacts.sitemapXsl.includes("<table>"))
310
+ diagnostics.push("sitemap.xsl missing human-readable table");
311
+ if (!artifacts.sitemapXsl.includes('<th scope="col">URL</th>'))
312
+ diagnostics.push("sitemap.xsl missing URL table header");
313
+ if (!artifacts.sitemapXsl.includes('<th scope="col">Last modified</th>'))
314
+ diagnostics.push("sitemap.xsl missing Last modified table header");
315
+ if (!artifacts.sitemapXsl.includes("<br />"))
316
+ diagnostics.push("sitemap.xsl missing visible line break markers");
317
+ if (/localhost|127\.0\.0\.1|:\d{2,5}\b/i.test(artifacts.robotsTxt))
318
+ diagnostics.push("robots.txt contains local host or explicit port policy");
319
+ for (const path of discoveryArtifactPaths) {
320
+ if (!cachePaths.has(path))
321
+ diagnostics.push(`cache-header-manifest.json missing ${path}`);
322
+ }
323
+ for (const page of site.pages) {
324
+ if (page.seo?.noindex === true) {
325
+ if (artifacts.sitemapXml.includes(page.canonicalUrl))
326
+ diagnostics.push(`${page.path}: noindex page appears in sitemap.xml`);
327
+ continue;
328
+ }
329
+ if (!artifacts.sitemapXml.includes(`<loc>${escapeXml(page.canonicalUrl)}</loc>`))
330
+ diagnostics.push(`${page.path}: sitemap.xml missing canonical URL`);
331
+ if (!indexCanonicals.has(page.canonicalUrl))
332
+ diagnostics.push(`${page.path}: content-index.json missing canonical URL`);
333
+ if (!registryCanonicals.has(page.canonicalUrl))
334
+ diagnostics.push(`${page.path}: content-registry.json missing canonical URL`);
335
+ if (!graphIds.has(`${page.canonicalUrl}#webpage`))
336
+ diagnostics.push(`${page.path}: jsonld-graph.json missing WebPage id`);
337
+ if (!artifacts.llmsFullTxt.includes(page.canonicalUrl))
338
+ diagnostics.push(`${page.path}: llms-full.txt missing canonical URL`);
339
+ }
340
+ return { ok: diagnostics.length === 0, diagnostics };
341
+ }
342
+ export function buildPageMetadata(site, page) {
343
+ const title = page.seo?.title ?? page.title;
344
+ const description = page.seo?.description ?? page.description;
345
+ return {
346
+ title,
347
+ description,
348
+ alternates: {
349
+ canonical: page.canonicalUrl,
350
+ },
351
+ openGraph: {
352
+ title,
353
+ description,
354
+ url: page.canonicalUrl,
355
+ siteName: site.product.name,
356
+ type: page.kind === "answer" || page.kind === "feature" ? "article" : "website",
357
+ },
358
+ twitter: {
359
+ card: page.seo?.image ? "summary_large_image" : "summary",
360
+ title,
361
+ description,
362
+ },
363
+ };
364
+ }
365
+ export function scoreSeoPage(page) {
366
+ const diagnostics = [];
367
+ const title = page.title.length >= 10 && page.title.length <= 120 ? 1 : 0;
368
+ const description = page.description.length >= 40 && page.description.length <= 220 ? 1 : 0;
369
+ const h1 = page.h1.length >= 4 && page.h1.length <= 120 ? 1 : 0;
370
+ const canonical = page.canonicalUrl.startsWith("http") ? 1 : 0;
371
+ const schema = page.schema?.length || ["home", "feature", "answer", "compare", "package", "proof", "trust"].includes(page.kind) ? 1 : 0;
372
+ const faq = page.kind !== "feature" || Boolean(page.faq?.length || page.sections.some((section) => section.kind === "faq")) ? 1 : 0;
373
+ const internalLinks = page.internalLinks.length >= 1 || page.slug === "/" ? 1 : 0;
374
+ const crawlableText = page.wordCount >= 80 ? 1 : 0;
375
+ if (!title)
376
+ diagnostics.push("title length is outside the recommended range");
377
+ if (!description)
378
+ diagnostics.push("description length is outside the recommended range");
379
+ if (!h1)
380
+ diagnostics.push("h1 length is outside the recommended range");
381
+ if (!canonical)
382
+ diagnostics.push("canonical URL is missing or invalid");
383
+ if (!schema)
384
+ diagnostics.push("schema metadata is missing");
385
+ if (!faq)
386
+ diagnostics.push("feature page is missing FAQ content");
387
+ if (!internalLinks)
388
+ diagnostics.push("page has too few internal links");
389
+ if (!crawlableText)
390
+ diagnostics.push("page has too little crawlable text");
391
+ const total = title + description + h1 + canonical + schema + faq + internalLinks + crawlableText;
392
+ return { title, description, h1, canonical, schema, faq, internalLinks, crawlableText, total, diagnostics };
393
+ }
394
+ export function buildAiSummary(site) {
395
+ return [
396
+ `# ${site.product.name} Facts`,
397
+ "",
398
+ site.ai?.summary ?? site.product.description,
399
+ "",
400
+ "## Core Facts",
401
+ ...(site.ai?.coreFacts ?? [site.product.tagline, site.product.category]).map((fact) => `- ${fact}`),
402
+ "",
403
+ ].join("\n");
404
+ }
405
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const LANDER_SEO_VERSION = "0.1.1";
2
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,UAAU,CAAC"}
@@ -0,0 +1,2 @@
1
+ export const LANDER_SEO_VERSION = "0.1.1";
2
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,OAAO,CAAC"}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@mdwrk/lander-seo",
3
+ "version": "0.1.2",
4
+ "type": "module",
5
+ "license": "Apache-2.0",
6
+ "publishConfig": {
7
+ "access": "public"
8
+ },
9
+ "engines": {
10
+ "node": ">=20 <23"
11
+ },
12
+ "files": [
13
+ "dist",
14
+ "README.md"
15
+ ],
16
+ "sideEffects": false,
17
+ "keywords": [
18
+ "lander",
19
+ "seo",
20
+ "aeo",
21
+ "aieo"
22
+ ],
23
+ "description": "SEO, AEO, and AI-discovery utilities for portable product landing sites.",
24
+ "dependencies": {
25
+ "@mdwrk/lander-core": "^0.1.2"
26
+ },
27
+ "scripts": {
28
+ "build": "npm run build -w @mdwrk/lander-core && tsc -p tsconfig.json",
29
+ "typecheck": "npm run build -w @mdwrk/lander-core && tsc --noEmit -p tsconfig.json",
30
+ "lint": "npm run typecheck",
31
+ "test": "npm run build && node tests/run-smoke.mjs",
32
+ "prepack": "npm run build"
33
+ },
34
+ "exports": {
35
+ ".": {
36
+ "types": "./dist/index.d.ts",
37
+ "import": "./dist/index.js"
38
+ },
39
+ "./version": {
40
+ "types": "./dist/version.d.ts",
41
+ "import": "./dist/version.js"
42
+ }
43
+ },
44
+ "main": "./dist/index.js",
45
+ "types": "./dist/index.d.ts",
46
+ "author": "Jacob Stewart <jacob@swarmauri.com>",
47
+ "homepage": "https://mdwrk.com"
48
+ }