@growth-labs/seo 0.2.0 → 0.2.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/dist/index.d.ts.map +1 -1
- package/dist/index.js +30 -50
- package/dist/index.js.map +1 -1
- package/dist/routes/aeo-twin.d.ts +5 -0
- package/dist/routes/aeo-twin.d.ts.map +1 -0
- package/dist/routes/aeo-twin.js +108 -0
- package/dist/routes/aeo-twin.js.map +1 -0
- package/package.json +1 -1
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAA;AAC7C,OAAO,EAAmB,KAAK,UAAU,EAA6B,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAA;AAC7C,OAAO,EAAmB,KAAK,UAAU,EAA6B,MAAM,cAAc,CAAA;AAW1F,MAAM,CAAC,OAAO,UAAU,GAAG,CAAC,WAAW,EAAE,UAAU,GAAG,gBAAgB,CA0NrE;AAeD,YAAY,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAClE,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAA;AAC3F,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAC1D,mBAAmB,YAAY,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { readdirSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
3
|
import { fileURLToPath } from 'node:url';
|
|
4
4
|
import { resolveAeoTwins, validatedSeoOptionsSchema } from './options.js';
|
|
5
5
|
import { _setConfig, _setContentProvider } from './state.js';
|
|
6
|
-
import { emitAeoTwins } from './utils/aeo-twin-emitter.js';
|
|
7
6
|
import { SITEMAP_INDEX_PATH } from './utils/sitemap.js';
|
|
8
|
-
import {
|
|
7
|
+
import { validateJsonLd, validatePage, validatePrerenderedGatedRoutes } from './utils/validation.js';
|
|
9
8
|
import { growthLabsSeoPlugin } from './vite-plugin.js';
|
|
10
9
|
function resolveEntrypoint(path) {
|
|
11
10
|
const ext = typeof import.meta.url === 'string' && import.meta.url.endsWith('.ts') ? '.ts' : '.js';
|
|
@@ -120,61 +119,42 @@ export default function seo(userOptions) {
|
|
|
120
119
|
prerender: false,
|
|
121
120
|
});
|
|
122
121
|
}
|
|
122
|
+
// ─── AEO twin emission (static + both modes) ───
|
|
123
|
+
// Injected as a prerender route so contentProvider runs inside Astro's
|
|
124
|
+
// build pipeline. Raw-Node astro:build:done couldn't resolve Vite-virtual
|
|
125
|
+
// imports like `astro:content` that consumers commonly use in their
|
|
126
|
+
// contentProvider implementations.
|
|
127
|
+
if (aeo && aeo.mode !== 'middleware') {
|
|
128
|
+
injectRoute({
|
|
129
|
+
pattern: '/[...aeoPath].md',
|
|
130
|
+
entrypoint: resolveEntrypoint('./routes/aeo-twin'),
|
|
131
|
+
});
|
|
132
|
+
}
|
|
123
133
|
},
|
|
124
134
|
'astro:build:done': async ({ dir, pages, logger }) => {
|
|
125
135
|
const outDir = fileURLToPath(dir);
|
|
126
136
|
const contentProvider = userOptions.contentProvider;
|
|
127
137
|
// ─── Build-time prerender-gated guard (test 32) ───
|
|
138
|
+
// Note: we try to load items here to check the guard, but this is
|
|
139
|
+
// best-effort. If contentProvider uses astro:content or other Vite
|
|
140
|
+
// virtuals, it will fail at raw-Node import time and we skip silently.
|
|
141
|
+
// The guard is a defence-in-depth check; the primary guarantee comes
|
|
142
|
+
// from the consumer-set `export const prerender = false` on gated routes.
|
|
128
143
|
if (contentProvider && options.flexibleSampling?.enabled) {
|
|
129
|
-
let items = [];
|
|
130
144
|
try {
|
|
131
|
-
items = await contentProvider({ type: 'articles' }, {});
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
const issues = validatePrerenderedGatedRoutes({ prerenderedUrls, items });
|
|
139
|
-
if (issues.length > 0) {
|
|
140
|
-
for (const issue of issues)
|
|
141
|
-
logger.error(issue.message);
|
|
142
|
-
throw new Error(`[@growth-labs/seo] ${issues.length} prerendered route(s) serve members-gated items. See errors above.`);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
// ─── Emit static twins (static or both mode) ───
|
|
146
|
-
if (aeo && aeo.mode !== 'middleware' && contentProvider) {
|
|
147
|
-
let items = [];
|
|
148
|
-
try {
|
|
149
|
-
items = await contentProvider({ type: 'articles' }, {});
|
|
150
|
-
}
|
|
151
|
-
catch (err) {
|
|
152
|
-
logger.warn(`Could not run contentProvider for twin emission: ${err instanceof Error ? err.message : String(err)}`);
|
|
153
|
-
}
|
|
154
|
-
if (items.length > 0) {
|
|
155
|
-
const result = await emitAeoTwins({
|
|
156
|
-
items,
|
|
157
|
-
publisherName: options.organization.name,
|
|
158
|
-
schemaType: options.schemaType,
|
|
159
|
-
renderBody: (item) => item.description ?? '',
|
|
160
|
-
twinUrl: aeo.twinUrl,
|
|
161
|
-
include: aeo.include,
|
|
162
|
-
summaryTwin: aeo.summaryTwin,
|
|
163
|
-
ragChunkMarkers: aeo.ragChunkMarkers,
|
|
164
|
-
stalenessCheck: aeo.stalenessCheck,
|
|
165
|
-
onSummaryMinimalFallback: (item) => logger.warn(`AEO summary fell back to tier 4 (description-only) for ${item.url}. Set item.summary to improve.`),
|
|
166
|
-
});
|
|
167
|
-
for (const twin of result.twins) {
|
|
168
|
-
const path = join(outDir, twin.urlPath.replace(/^\//, ''));
|
|
169
|
-
mkdirSync(dirname(path), { recursive: true });
|
|
170
|
-
writeFileSync(path, twin.content);
|
|
145
|
+
const items = await contentProvider({ type: 'articles' }, {});
|
|
146
|
+
const prerenderedUrls = new Set(pages.map((p) => `/${p.pathname}`.replace(/\/+/g, '/')));
|
|
147
|
+
const issues = validatePrerenderedGatedRoutes({ prerenderedUrls, items });
|
|
148
|
+
if (issues.length > 0) {
|
|
149
|
+
for (const issue of issues)
|
|
150
|
+
logger.error(issue.message);
|
|
151
|
+
throw new Error(`[@growth-labs/seo] ${issues.length} prerendered route(s) serve members-gated items. See errors above.`);
|
|
171
152
|
}
|
|
172
|
-
logger.info(`AEO twin emission: wrote ${result.twins.length} files (${result.skipped} items skipped by access/include filters)`);
|
|
173
153
|
}
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
logger.
|
|
154
|
+
catch (err) {
|
|
155
|
+
// Don't fail the build if the provider can't run from Node context —
|
|
156
|
+
// the injected prerender route handles the primary emission path.
|
|
157
|
+
logger.info(`Skipped prerender-gated-content guard (contentProvider not Node-ESM-safe): ${err instanceof Error ? err.message : String(err)}`);
|
|
178
158
|
}
|
|
179
159
|
}
|
|
180
160
|
// ─── Legacy per-page validation ───
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aeo-twin.d.ts","sourceRoot":"","sources":["../../src/routes/aeo-twin.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,OAAO,CAAA;AAUrD,eAAO,MAAM,SAAS,OAAO,CAAA;AAqB7B,eAAO,MAAM,cAAc,EAAE,cAwE5B,CAAA;AAED,eAAO,MAAM,GAAG,EAAE,QAUjB,CAAA"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
// Dynamic prerender route that emits AEO markdown twins at build time.
|
|
2
|
+
//
|
|
3
|
+
// This replaces the previous `astro:build:done` filesystem-write approach. The
|
|
4
|
+
// problem with that approach: integration hooks run in raw Node ESM, where
|
|
5
|
+
// Vite-virtual imports like `astro:content` can't resolve. Consumers whose
|
|
6
|
+
// `contentProvider` transitively imported `astro:content` saw zero twin files
|
|
7
|
+
// emitted. Reference: https://github.com/withastro/astro/issues/...
|
|
8
|
+
//
|
|
9
|
+
// getStaticPaths runs INSIDE Astro's build pipeline, so Vite resolves virtual
|
|
10
|
+
// modules correctly. The route produces one prerendered file per twin URL:
|
|
11
|
+
// primary at `/article/midway.md` and, when enabled, summary at
|
|
12
|
+
// `/article/midway.md.summary.md`.
|
|
13
|
+
import { resolveAeoTwins } from '../options.js';
|
|
14
|
+
import { getConfig, getContentProvider } from '../state.js';
|
|
15
|
+
import { estimateTokenCount, generateAeoMarkdown } from '../utils/aeo.js';
|
|
16
|
+
import { generateSummaryTwin } from '../utils/aeo-summary.js';
|
|
17
|
+
import { forMarkdownTwin } from '../utils/content-filter.js';
|
|
18
|
+
import { computeContentHash } from '../utils/staleness.js';
|
|
19
|
+
// Prerender these URLs at build time so they're served as static files.
|
|
20
|
+
export const prerender = true;
|
|
21
|
+
function defaultTwin(url) {
|
|
22
|
+
return `${url.replace(/\/+$/, '')}.md`;
|
|
23
|
+
}
|
|
24
|
+
function stripOrigin(url) {
|
|
25
|
+
try {
|
|
26
|
+
return new URL(url).pathname;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return url.startsWith('/') ? url : `/${url}`;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export const getStaticPaths = async () => {
|
|
33
|
+
const config = getConfig();
|
|
34
|
+
const contentProvider = getContentProvider();
|
|
35
|
+
const aeo = resolveAeoTwins(config.aeoTwins);
|
|
36
|
+
// Emit twins for static + both modes; middleware mode serves on-demand.
|
|
37
|
+
if (!aeo || aeo.mode === 'middleware' || !contentProvider)
|
|
38
|
+
return [];
|
|
39
|
+
let items;
|
|
40
|
+
try {
|
|
41
|
+
// contentProvider resolves here because this function runs inside Astro's
|
|
42
|
+
// build pipeline — `astro:content` and other Vite virtual modules work.
|
|
43
|
+
items = await contentProvider({ type: 'articles' }, {});
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
// Don't fail the build; log nothing here because astro's getStaticPaths
|
|
47
|
+
// swallows console output. The consumer sees "zero paths emitted" which
|
|
48
|
+
// is the right signal to inspect their contentProvider.
|
|
49
|
+
return [];
|
|
50
|
+
}
|
|
51
|
+
const filtered = forMarkdownTwin(items).filter(aeo.include ?? (() => true));
|
|
52
|
+
const twinUrl = aeo.twinUrl ?? defaultTwin;
|
|
53
|
+
const emitSummary = aeo.summaryTwin !== false;
|
|
54
|
+
const ragMarkers = aeo.ragChunkMarkers !== false;
|
|
55
|
+
const stalenessMode = aeo.stalenessCheck ?? 'content-hash';
|
|
56
|
+
const paths = [];
|
|
57
|
+
for (const item of filtered) {
|
|
58
|
+
const primaryUrl = twinUrl(item.url);
|
|
59
|
+
const primaryPath = stripOrigin(primaryUrl).replace(/^\//, '');
|
|
60
|
+
const body = item.description ?? '';
|
|
61
|
+
const contentHash = stalenessMode === 'content-hash' ? await computeContentHash(item, body) : undefined;
|
|
62
|
+
const summaryUrl = emitSummary ? `${primaryUrl}.summary.md` : undefined;
|
|
63
|
+
// Primary twin.
|
|
64
|
+
paths.push({
|
|
65
|
+
params: { aeoPath: primaryPath.replace(/\.md$/, '') },
|
|
66
|
+
props: {
|
|
67
|
+
body: generateAeoMarkdown(item, {
|
|
68
|
+
publisherName: config.organization.name,
|
|
69
|
+
schemaType: config.schemaType,
|
|
70
|
+
content: body,
|
|
71
|
+
ragChunkMarkers: ragMarkers,
|
|
72
|
+
canonical: item.url,
|
|
73
|
+
twinUrl: primaryUrl,
|
|
74
|
+
summaryUrl,
|
|
75
|
+
contentHash,
|
|
76
|
+
}),
|
|
77
|
+
kind: 'primary',
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
// Summary twin.
|
|
81
|
+
if (emitSummary && summaryUrl) {
|
|
82
|
+
const summaryPath = stripOrigin(summaryUrl).replace(/^\//, '').replace(/\.md$/, '');
|
|
83
|
+
const summary = generateSummaryTwin(item, {
|
|
84
|
+
publisherName: config.organization.name,
|
|
85
|
+
schemaType: config.schemaType,
|
|
86
|
+
content: body,
|
|
87
|
+
fullUrl: primaryUrl,
|
|
88
|
+
});
|
|
89
|
+
paths.push({
|
|
90
|
+
params: { aeoPath: summaryPath },
|
|
91
|
+
props: { body: summary.markdown, kind: 'summary' },
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return paths;
|
|
96
|
+
};
|
|
97
|
+
export const GET = async ({ props }) => {
|
|
98
|
+
const { body } = props;
|
|
99
|
+
const tokenCount = estimateTokenCount(body);
|
|
100
|
+
return new Response(body, {
|
|
101
|
+
headers: {
|
|
102
|
+
'Content-Type': 'text/markdown; charset=utf-8',
|
|
103
|
+
'X-Robots-Tag': 'noindex',
|
|
104
|
+
'x-markdown-tokens': String(tokenCount),
|
|
105
|
+
},
|
|
106
|
+
});
|
|
107
|
+
};
|
|
108
|
+
//# sourceMappingURL=aeo-twin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aeo-twin.js","sourceRoot":"","sources":["../../src/routes/aeo-twin.ts"],"names":[],"mappings":"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"}
|