@lumen-seo/plugin-render 0.3.0
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 +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +64 -0
- package/package.json +30 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { AuditRunner } from '@lumen-seo/mcp/ports';
|
|
2
|
+
import type { PageContext } from '@lumen-seo/core';
|
|
3
|
+
type PlaywrightLauncher = (o?: Record<string, unknown>) => Promise<PlaywrightBrowserLike>;
|
|
4
|
+
interface PlaywrightBrowserLike {
|
|
5
|
+
newContext(o?: Record<string, unknown>): PlaywrightContextLike;
|
|
6
|
+
close(): Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
interface PlaywrightContextLike {
|
|
9
|
+
newPage(): PlaywrightPageLike;
|
|
10
|
+
close(): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
interface PlaywrightPageLike {
|
|
13
|
+
goto(url: string, o?: Record<string, unknown>): Promise<unknown>;
|
|
14
|
+
content(): Promise<string>;
|
|
15
|
+
close(): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
export interface RenderedRunnerOptions {
|
|
18
|
+
/** playwright's chromium.launch (or an equivalent). */
|
|
19
|
+
launcher: PlaywrightLauncher;
|
|
20
|
+
/** Time budget for the rendered audit (default 120s). */
|
|
21
|
+
maxDurationMs?: number;
|
|
22
|
+
/** Cap pages like the static crawler (default 25 — rendering is expensive). */
|
|
23
|
+
maxPages?: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Wraps runSiteAudit with a rendered transport: every fetched page's DOM is
|
|
27
|
+
* the POST-JS DOM from a real browser. Falls back to the static fetcher only
|
|
28
|
+
* when Playwright is unavailable at call time (typed error, never silent).
|
|
29
|
+
*/
|
|
30
|
+
export declare const createRenderedAuditRunner: (o: RenderedRunnerOptions) => AuditRunner;
|
|
31
|
+
export type { PageContext };
|
|
32
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAInD,KAAK,kBAAkB,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,qBAAqB,CAAC,CAAC;AAE1F,UAAU,qBAAqB;IAC7B,UAAU,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,qBAAqB,CAAC;IAC/D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AACD,UAAU,qBAAqB;IAC7B,OAAO,IAAI,kBAAkB,CAAC;IAC9B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AACD,UAAU,kBAAkB;IAC1B,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACjE,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IACpC,uDAAuD;IACvD,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,yDAAyD;IACzD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,GAAI,GAAG,qBAAqB,KAAG,WAgDnE,CAAC;AAEH,YAAY,EAAE,WAAW,EAAE,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @lumen-seo/plugin-render (E2.4): an OPTIONAL rendered-DOM audit runner for
|
|
3
|
+
* SPA sites. Playwright is a peer dependency (optional) — this package is
|
|
4
|
+
* explicitly outside core so lumen stays lightweight, and every report it
|
|
5
|
+
* produces carries the honesty label `configSnapshot.renderer: 'rendered'`
|
|
6
|
+
* (the audit's existing seam — rendered evidence is DIFFERENT evidence).
|
|
7
|
+
*
|
|
8
|
+
* Usage (user side, after `npm i playwright`):
|
|
9
|
+
* const runner = await createRenderedAuditRunner({ launcher: chromium.launch });
|
|
10
|
+
* const report = await runner.run({ url: new URL('https://spa.example/') });
|
|
11
|
+
*/
|
|
12
|
+
import { load as loadDom } from 'cheerio';
|
|
13
|
+
import { runSiteAudit } from '@lumen-seo/audit';
|
|
14
|
+
/**
|
|
15
|
+
* Wraps runSiteAudit with a rendered transport: every fetched page's DOM is
|
|
16
|
+
* the POST-JS DOM from a real browser. Falls back to the static fetcher only
|
|
17
|
+
* when Playwright is unavailable at call time (typed error, never silent).
|
|
18
|
+
*/
|
|
19
|
+
export const createRenderedAuditRunner = (o) => ({
|
|
20
|
+
run: async (input, signal) => {
|
|
21
|
+
const browser = await o.launcher({ headless: true });
|
|
22
|
+
try {
|
|
23
|
+
const context = await browser.newContext({ userAgent: 'lumen-render (+https://github.com/nitishagar/lumen)' });
|
|
24
|
+
const deps = {
|
|
25
|
+
// The rendered transport: core's Fetcher contract over Playwright.
|
|
26
|
+
fetcher: {
|
|
27
|
+
fetch: async (url, init) => {
|
|
28
|
+
const page = await context.newPage();
|
|
29
|
+
try {
|
|
30
|
+
await page.goto(url.href, { waitUntil: 'networkidle', timeout: 20_000 });
|
|
31
|
+
const html = await page.content();
|
|
32
|
+
void init;
|
|
33
|
+
return new Response(html, {
|
|
34
|
+
status: 200,
|
|
35
|
+
headers: { 'content-type': 'text/html; charset=utf-8' },
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
finally {
|
|
39
|
+
await page.close().catch(() => undefined);
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
now: () => Date.now(),
|
|
44
|
+
delay: (ms) => {
|
|
45
|
+
const p = new Promise((resolve) => setTimeout(resolve, ms));
|
|
46
|
+
p.cancel = () => undefined;
|
|
47
|
+
return p;
|
|
48
|
+
},
|
|
49
|
+
jitter: () => Math.random(),
|
|
50
|
+
randomId: () => `render-${Date.now().toString(36)}`,
|
|
51
|
+
};
|
|
52
|
+
void loadDom; // cheerio stays a peer of the audit engine, not this package
|
|
53
|
+
const report = await runSiteAudit(input.url, {
|
|
54
|
+
crawl: { maxPages: o.maxPages ?? 25, maxDurationMs: o.maxDurationMs ?? 120_000 },
|
|
55
|
+
}, deps, signal);
|
|
56
|
+
// The honesty label (E2.4/M4): rendered evidence is DIFFERENT evidence —
|
|
57
|
+
// the engine's own seam says 'static'; a rendered run must say so.
|
|
58
|
+
return { ...report, configSnapshot: { ...report.configSnapshot, renderer: 'rendered' } };
|
|
59
|
+
}
|
|
60
|
+
finally {
|
|
61
|
+
await browser.close().catch(() => undefined);
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
});
|
package/package.json
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@lumen-seo/plugin-render",
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"description": "Optional rendered-DOM PageContext for lumen audits of SPA sites (Playwright peer dependency — explicitly outside core).",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"default": "./dist/index.js"
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsc -p tsconfig.build.json",
|
|
15
|
+
"test": "vitest run",
|
|
16
|
+
"typecheck": "tsc --noEmit"
|
|
17
|
+
},
|
|
18
|
+
"peerDependencies": {
|
|
19
|
+
"playwright": ">=1.40.0"
|
|
20
|
+
},
|
|
21
|
+
"peerDependenciesMeta": {
|
|
22
|
+
"playwright": {
|
|
23
|
+
"optional": true
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"devDependencies": {},
|
|
27
|
+
"files": [
|
|
28
|
+
"dist"
|
|
29
|
+
]
|
|
30
|
+
}
|