@pseolint/core 0.3.0 → 0.3.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/README.md +2 -2
- package/dist/ai/triage.d.ts +15 -1
- package/dist/ai/triage.d.ts.map +1 -1
- package/dist/ai/triage.js +30 -0
- package/dist/ai/triage.js.map +1 -1
- package/dist/analytics-blocklist.d.ts +28 -0
- package/dist/analytics-blocklist.d.ts.map +1 -0
- package/dist/analytics-blocklist.js +129 -0
- package/dist/analytics-blocklist.js.map +1 -0
- package/dist/auditor.d.ts.map +1 -1
- package/dist/auditor.js +13 -5
- package/dist/auditor.js.map +1 -1
- package/dist/formatters/html.d.ts.map +1 -1
- package/dist/formatters/html.js +235 -50
- package/dist/formatters/html.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/renderer.d.ts +14 -0
- package/dist/renderer.d.ts.map +1 -1
- package/dist/renderer.js +130 -4
- package/dist/renderer.js.map +1 -1
- package/dist/rule-references.d.ts.map +1 -1
- package/dist/rule-references.js +1 -0
- package/dist/rule-references.js.map +1 -1
- package/dist/rules/aeo/summary-bait.d.ts +20 -0
- package/dist/rules/aeo/summary-bait.d.ts.map +1 -0
- package/dist/rules/aeo/summary-bait.js +147 -0
- package/dist/rules/aeo/summary-bait.js.map +1 -0
- package/dist/rules/scope.d.ts.map +1 -1
- package/dist/rules/scope.js +1 -0
- package/dist/rules/scope.js.map +1 -1
- package/dist/types.d.ts +13 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +3 -3
package/dist/renderer.js
CHANGED
|
@@ -1,6 +1,41 @@
|
|
|
1
1
|
import { createServer } from "node:http";
|
|
2
2
|
import { readFile } from "node:fs/promises";
|
|
3
|
+
import { createRequire } from "node:module";
|
|
3
4
|
import { join, extname } from "node:path";
|
|
5
|
+
import { isAnalyticsRequest } from "./analytics-blocklist.js";
|
|
6
|
+
/**
|
|
7
|
+
* Distinct User-Agent for rendered audits. Includes the standard `+URL` bot
|
|
8
|
+
* marker so server-side analytics filters (GA4, Matomo, Cloudflare) can drop
|
|
9
|
+
* it automatically, and keeps the `compatible` token so sites that sniff real
|
|
10
|
+
* browsers for feature gating still serve content. The version is read from
|
|
11
|
+
* package.json at module load so it stays accurate across releases.
|
|
12
|
+
*/
|
|
13
|
+
const RENDER_VERSION = (() => {
|
|
14
|
+
try {
|
|
15
|
+
const require = createRequire(import.meta.url);
|
|
16
|
+
const pkg = require("../package.json");
|
|
17
|
+
return pkg.version ?? "0";
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return "0";
|
|
21
|
+
}
|
|
22
|
+
})();
|
|
23
|
+
const RENDER_USER_AGENT = `Mozilla/5.0 (compatible; pseolint-render/${RENDER_VERSION}; +https://pseolint.dev/bot)`;
|
|
24
|
+
/**
|
|
25
|
+
* Playwright resource types that can carry analytics beacons. CSS, fonts,
|
|
26
|
+
* images, and media typically don't — skipping them keeps the route handler
|
|
27
|
+
* off most subresource requests and preserves Playwright's fast path.
|
|
28
|
+
*/
|
|
29
|
+
const INTERCEPTED_RESOURCE_TYPES = new Set([
|
|
30
|
+
"document",
|
|
31
|
+
"script",
|
|
32
|
+
"xhr",
|
|
33
|
+
"fetch",
|
|
34
|
+
"websocket",
|
|
35
|
+
"eventsource",
|
|
36
|
+
"ping",
|
|
37
|
+
"other", // navigator.sendBeacon shows up as "other" in some Playwright versions
|
|
38
|
+
]);
|
|
4
39
|
const MIME_TYPES = {
|
|
5
40
|
".html": "text/html",
|
|
6
41
|
".htm": "text/html",
|
|
@@ -82,6 +117,79 @@ export async function renderPages(pages, sourceDir, options) {
|
|
|
82
117
|
else {
|
|
83
118
|
browser = await pw.chromium.launch({ headless: true });
|
|
84
119
|
}
|
|
120
|
+
// One browser context carries the UA + privacy headers + init script for every
|
|
121
|
+
// audited page. `Sec-GPC` signals privacy-respecting analytics stacks to skip
|
|
122
|
+
// collection (DNT is kept for legacy consumers but is deprecated and mostly
|
|
123
|
+
// ignored today). `window.__pseolint_audit` lets cooperating sites
|
|
124
|
+
// short-circuit their own analytics bootloader.
|
|
125
|
+
const context = await browser.newContext({
|
|
126
|
+
userAgent: RENDER_USER_AGENT,
|
|
127
|
+
extraHTTPHeaders: {
|
|
128
|
+
"DNT": "1",
|
|
129
|
+
"Sec-GPC": "1",
|
|
130
|
+
},
|
|
131
|
+
});
|
|
132
|
+
await context.addInitScript(() => {
|
|
133
|
+
// @ts-ignore -- evaluated in the browser, window is the page's window
|
|
134
|
+
window.__pseolint_audit = true;
|
|
135
|
+
});
|
|
136
|
+
const analyticsMode = options.analyticsMode ?? "block";
|
|
137
|
+
if (analyticsMode !== "allow") {
|
|
138
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
139
|
+
await context.route("**/*", (route, request) => {
|
|
140
|
+
let blocked = false;
|
|
141
|
+
try {
|
|
142
|
+
// Skip resource types that can't carry an analytics beacon — CSS, fonts,
|
|
143
|
+
// images, media. Keeps the fast path for the vast majority of subresources
|
|
144
|
+
// and preserves Playwright's in-browser networking.
|
|
145
|
+
const resourceType = typeof request.resourceType === "function" ? request.resourceType() : "";
|
|
146
|
+
if (resourceType && !INTERCEPTED_RESOURCE_TYPES.has(resourceType)) {
|
|
147
|
+
// Fall through to continue().
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
const requestUrl = request.url();
|
|
151
|
+
// Use the top-level navigation URL as the page origin for first-party
|
|
152
|
+
// matching. `request.frame().url()` is `about:blank` before the first
|
|
153
|
+
// navigation commits, which is an opaque origin and would otherwise
|
|
154
|
+
// under-protect same-origin first-party mode.
|
|
155
|
+
const pageOrigin = (() => {
|
|
156
|
+
try {
|
|
157
|
+
const frameUrl = request.frame?.().url?.() ?? "";
|
|
158
|
+
if (frameUrl && frameUrl !== "about:blank")
|
|
159
|
+
return new URL(frameUrl).origin;
|
|
160
|
+
if (typeof request.isNavigationRequest === "function" && request.isNavigationRequest()) {
|
|
161
|
+
return new URL(requestUrl).origin;
|
|
162
|
+
}
|
|
163
|
+
return undefined;
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
return undefined;
|
|
167
|
+
}
|
|
168
|
+
})();
|
|
169
|
+
if (isAnalyticsRequest(requestUrl, {
|
|
170
|
+
mode: analyticsMode,
|
|
171
|
+
pageOrigin,
|
|
172
|
+
extraBlockedHosts: options.extraBlockedHosts,
|
|
173
|
+
})) {
|
|
174
|
+
blocked = true;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
// fall through on any interception-time error — better to let the
|
|
180
|
+
// request proceed than to break rendering over a bad URL parse.
|
|
181
|
+
}
|
|
182
|
+
// Exactly one of abort()/continue() is called; each is wrapped to swallow
|
|
183
|
+
// "Route is already handled" errors that can fire during teardown when a
|
|
184
|
+
// page has been closed mid-flight.
|
|
185
|
+
if (blocked) {
|
|
186
|
+
route.abort().catch(() => { });
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
route.continue().catch(() => { });
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
}
|
|
85
193
|
let server = null;
|
|
86
194
|
if (sourceDir) {
|
|
87
195
|
server = await startStaticServer(sourceDir);
|
|
@@ -93,7 +201,7 @@ export async function renderPages(pages, sourceDir, options) {
|
|
|
93
201
|
const current = index;
|
|
94
202
|
index += 1;
|
|
95
203
|
const entry = pages[current];
|
|
96
|
-
const page = await
|
|
204
|
+
const page = await context.newPage();
|
|
97
205
|
let navigateUrl = entry.url;
|
|
98
206
|
if (entry.localPath && server) {
|
|
99
207
|
const relativePath = entry.localPath.replace(/\\/g, "/");
|
|
@@ -116,9 +224,27 @@ export async function renderPages(pages, sourceDir, options) {
|
|
|
116
224
|
}
|
|
117
225
|
}
|
|
118
226
|
const workers = Array.from({ length: Math.min(options.concurrency, pages.length) }, () => processNext());
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
227
|
+
try {
|
|
228
|
+
await Promise.all(workers);
|
|
229
|
+
}
|
|
230
|
+
finally {
|
|
231
|
+
// Always tear down server + context + browser, even if a worker threw.
|
|
232
|
+
// Leaking a Chromium process across audit runs is expensive; each of
|
|
233
|
+
// these calls is independently guarded so one failure doesn't skip the
|
|
234
|
+
// others.
|
|
235
|
+
try {
|
|
236
|
+
server?.close();
|
|
237
|
+
}
|
|
238
|
+
catch { /* noop */ }
|
|
239
|
+
try {
|
|
240
|
+
await context.close();
|
|
241
|
+
}
|
|
242
|
+
catch { /* noop */ }
|
|
243
|
+
try {
|
|
244
|
+
await browser.close();
|
|
245
|
+
}
|
|
246
|
+
catch { /* noop */ }
|
|
247
|
+
}
|
|
122
248
|
return results;
|
|
123
249
|
}
|
|
124
250
|
//# sourceMappingURL=renderer.js.map
|
package/dist/renderer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule-references.d.ts","sourceRoot":"","sources":["../src/rule-references.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"rule-references.d.ts","sourceRoot":"","sources":["../src/rule-references.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA6ClD,CAAC"}
|
package/dist/rule-references.js
CHANGED
|
@@ -42,5 +42,6 @@ export const RULE_REFERENCES = {
|
|
|
42
42
|
"aeo/citable-facts": "https://developers.google.com/search/docs/fundamentals/creating-helpful-content",
|
|
43
43
|
"aeo/non-replicable-value": "https://developers.google.com/search/docs/fundamentals/creating-helpful-content",
|
|
44
44
|
"aeo/content-modularity": "https://developers.google.com/search/docs/appearance/structured-data/intro-structured-data",
|
|
45
|
+
"aeo/summary-bait": "https://developers.google.com/search/docs/fundamentals/creating-helpful-content",
|
|
45
46
|
};
|
|
46
47
|
//# sourceMappingURL=rule-references.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule-references.js","sourceRoot":"","sources":["../src/rule-references.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAA2B;IACrD,qBAAqB,EAAE,oFAAoF;IAC3G,kBAAkB,EAAE,kFAAkF;IACtG,mBAAmB,EAAE,iFAAiF;IACtG,wBAAwB,EAAE,iFAAiF;IAC3G,yBAAyB,EAAE,kFAAkF;IAC7G,2BAA2B,EAAE,kGAAkG;IAC/H,sBAAsB,EAAE,kFAAkF;IAC1G,wBAAwB,EAAE,kFAAkF;IAC5G,sBAAsB,EAAE,iFAAiF;IACzG,yBAAyB,EAAE,gFAAgF;IAC3G,4BAA4B,EAAE,uEAAuE;IACrG,wBAAwB,EAAE,sFAAsF;IAChH,sBAAsB,EAAE,sFAAsF;IAC9G,oBAAoB,EAAE,6EAA6E;IACnG,iBAAiB,EAAE,6EAA6E;IAChG,4BAA4B,EAAE,6EAA6E;IAC3G,iBAAiB,EAAE,6EAA6E;IAChG,kBAAkB,EAAE,6EAA6E;IACjG,wBAAwB,EAAE,0EAA0E;IACpG,4BAA4B,EAAE,wFAAwF;IACtH,iCAAiC,EAAE,wFAAwF;IAC3H,8BAA8B,EAAE,4EAA4E;IAC5G,2BAA2B,EAAE,+EAA+E;IAC5G,qBAAqB,EAAE,2EAA2E;IAClG,eAAe,EAAE,6EAA6E;IAC9F,sBAAsB,EAAE,8DAA8D;IACtF,2BAA2B,EAAE,iGAAiG;IAC9H,sBAAsB,EAAE,4FAA4F;IACpH,wBAAwB,EAAE,4FAA4F;IACtH,oBAAoB,EAAE,4FAA4F;IAClH,wBAAwB,EAAE,wFAAwF;IAClH,4BAA4B,EAAE,wFAAwF;IACtH,sBAAsB,EAAE,wFAAwF;IAChH,sBAAsB,EAAE,iFAAiF;IACzG,6BAA6B,EAAE,oFAAoF;IACnH,cAAc,EAAE,qBAAqB;IACrC,oBAAoB,EAAE,0CAA0C;IAChE,uBAAuB,EAAE,wEAAwE;IACjG,kBAAkB,EAAE,8EAA8E;IAClG,kBAAkB,EAAE,wEAAwE;IAC5F,mBAAmB,EAAE,iFAAiF;IACtG,0BAA0B,EAAE,iFAAiF;IAC7G,wBAAwB,EAAE,4FAA4F;
|
|
1
|
+
{"version":3,"file":"rule-references.js","sourceRoot":"","sources":["../src/rule-references.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAA2B;IACrD,qBAAqB,EAAE,oFAAoF;IAC3G,kBAAkB,EAAE,kFAAkF;IACtG,mBAAmB,EAAE,iFAAiF;IACtG,wBAAwB,EAAE,iFAAiF;IAC3G,yBAAyB,EAAE,kFAAkF;IAC7G,2BAA2B,EAAE,kGAAkG;IAC/H,sBAAsB,EAAE,kFAAkF;IAC1G,wBAAwB,EAAE,kFAAkF;IAC5G,sBAAsB,EAAE,iFAAiF;IACzG,yBAAyB,EAAE,gFAAgF;IAC3G,4BAA4B,EAAE,uEAAuE;IACrG,wBAAwB,EAAE,sFAAsF;IAChH,sBAAsB,EAAE,sFAAsF;IAC9G,oBAAoB,EAAE,6EAA6E;IACnG,iBAAiB,EAAE,6EAA6E;IAChG,4BAA4B,EAAE,6EAA6E;IAC3G,iBAAiB,EAAE,6EAA6E;IAChG,kBAAkB,EAAE,6EAA6E;IACjG,wBAAwB,EAAE,0EAA0E;IACpG,4BAA4B,EAAE,wFAAwF;IACtH,iCAAiC,EAAE,wFAAwF;IAC3H,8BAA8B,EAAE,4EAA4E;IAC5G,2BAA2B,EAAE,+EAA+E;IAC5G,qBAAqB,EAAE,2EAA2E;IAClG,eAAe,EAAE,6EAA6E;IAC9F,sBAAsB,EAAE,8DAA8D;IACtF,2BAA2B,EAAE,iGAAiG;IAC9H,sBAAsB,EAAE,4FAA4F;IACpH,wBAAwB,EAAE,4FAA4F;IACtH,oBAAoB,EAAE,4FAA4F;IAClH,wBAAwB,EAAE,wFAAwF;IAClH,4BAA4B,EAAE,wFAAwF;IACtH,sBAAsB,EAAE,wFAAwF;IAChH,sBAAsB,EAAE,iFAAiF;IACzG,6BAA6B,EAAE,oFAAoF;IACnH,cAAc,EAAE,qBAAqB;IACrC,oBAAoB,EAAE,0CAA0C;IAChE,uBAAuB,EAAE,wEAAwE;IACjG,kBAAkB,EAAE,8EAA8E;IAClG,kBAAkB,EAAE,wEAAwE;IAC5F,mBAAmB,EAAE,iFAAiF;IACtG,0BAA0B,EAAE,iFAAiF;IAC7G,wBAAwB,EAAE,4FAA4F;IACtH,kBAAkB,EAAE,iFAAiF;CACtG,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { EntityMaskPattern, ParsedPage, RuleResult } from "../../types.js";
|
|
2
|
+
export interface SummaryBaitOptions {
|
|
3
|
+
/** Words considered "the opener" for fact-distribution analysis. Default: 150. */
|
|
4
|
+
openerWordCount?: number;
|
|
5
|
+
/** Fraction of citable facts that, when packed into the opener, triggers the rule. Default: 0.7. */
|
|
6
|
+
openerFactConcentrationThreshold?: number;
|
|
7
|
+
/** Minimum distinct facts on the page before the distribution check runs. Default: 3. */
|
|
8
|
+
minFactsToAnalyze?: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Composite rule — fires when a page is "optimized for summarization, not retention":
|
|
12
|
+
* 1. Has a strong answer-first opener (AI Overviews will cite it), AND
|
|
13
|
+
* 2. Has no interactive / downloadable / gated value below the fold, AND
|
|
14
|
+
* 3. Has its citable facts concentrated in the opener (nothing deeper to scroll for).
|
|
15
|
+
*
|
|
16
|
+
* The overlap of these three is the worst-case zero-click page: readers (and AI engines)
|
|
17
|
+
* get everything they need from the summary, and the click-through never happens.
|
|
18
|
+
*/
|
|
19
|
+
export declare function summaryBaitRule(pages: ParsedPage[], entityPatterns: EntityMaskPattern[], options?: SummaryBaitOptions): RuleResult[];
|
|
20
|
+
//# sourceMappingURL=summary-bait.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summary-bait.d.ts","sourceRoot":"","sources":["../../../src/rules/aeo/summary-bait.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGhF,MAAM,WAAW,kBAAkB;IACjC,kFAAkF;IAClF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oGAAoG;IACpG,gCAAgC,CAAC,EAAE,MAAM,CAAC;IAC1C,yFAAyF;IACzF,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AA8FD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,UAAU,EAAE,EACnB,cAAc,EAAE,iBAAiB,EAAE,EACnC,OAAO,CAAC,EAAE,kBAAkB,GAC3B,UAAU,EAAE,CA2Cd"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { load } from "cheerio";
|
|
2
|
+
import { extractFirstParagraph } from "./answer-first.js";
|
|
3
|
+
// Same fact extractors as aeo/citable-facts — intentionally duplicated so this
|
|
4
|
+
// rule is self-contained and doesn't silently break if citable-facts's regexes
|
|
5
|
+
// drift. Keep in sync when adding new patterns there.
|
|
6
|
+
const FACT_PATTERNS = [
|
|
7
|
+
/\$[\d,]+(\.\d{2})?/g,
|
|
8
|
+
/\b\d+(\.\d+)?\s*%/g,
|
|
9
|
+
/\b\d+(?:-\d+)?\s*(business\s+days?|days?|weeks?|months?|years?|hours?|minutes?)\b/gi,
|
|
10
|
+
/\b(january|february|march|april|may|june|july|august|september|october|november|december)\s+\d{1,2}(?:,\s*\d{4})?\b/gi,
|
|
11
|
+
/\b\d{4}-\d{2}-\d{2}\b/g,
|
|
12
|
+
/\bForm\s+[A-Z0-9][A-Z0-9-]*\b/g,
|
|
13
|
+
];
|
|
14
|
+
const INTERACTIVE_SELECTORS = [
|
|
15
|
+
"form",
|
|
16
|
+
"input:not([type=hidden])",
|
|
17
|
+
"select",
|
|
18
|
+
"textarea",
|
|
19
|
+
"iframe",
|
|
20
|
+
"button[type=submit]",
|
|
21
|
+
"canvas",
|
|
22
|
+
"[data-interactive]",
|
|
23
|
+
"[data-calculator]",
|
|
24
|
+
"[data-tool]",
|
|
25
|
+
"[data-widget]",
|
|
26
|
+
"[x-data]",
|
|
27
|
+
".calculator",
|
|
28
|
+
".tool",
|
|
29
|
+
".checker",
|
|
30
|
+
".generator",
|
|
31
|
+
".interactive",
|
|
32
|
+
".widget",
|
|
33
|
+
".comparator",
|
|
34
|
+
];
|
|
35
|
+
const DOWNLOAD_PATTERN = /\.(pdf|docx?|xlsx?|csv|zip|pptx?)(?:$|[?#])/i;
|
|
36
|
+
function extractFacts(text) {
|
|
37
|
+
const out = new Set();
|
|
38
|
+
for (const re of FACT_PATTERNS) {
|
|
39
|
+
const matches = text.match(re);
|
|
40
|
+
if (!matches)
|
|
41
|
+
continue;
|
|
42
|
+
for (const m of matches)
|
|
43
|
+
out.add(m.trim().toLowerCase());
|
|
44
|
+
}
|
|
45
|
+
return Array.from(out);
|
|
46
|
+
}
|
|
47
|
+
function applyEntityMask(text, patterns) {
|
|
48
|
+
let out = text;
|
|
49
|
+
for (const p of patterns)
|
|
50
|
+
out = out.replace(p.pattern, p.placeholder);
|
|
51
|
+
return out;
|
|
52
|
+
}
|
|
53
|
+
function openerHasExtractableAnswer(html) {
|
|
54
|
+
// Echo of aeo/answer-first's minimum bar: an opener exists, it has at least
|
|
55
|
+
// one concrete fact, and it's a complete sentence. If the opener is already
|
|
56
|
+
// broken, aeo/answer-first fires and the user sees that diagnosis; this rule
|
|
57
|
+
// stays silent so we don't produce two overlapping findings per page.
|
|
58
|
+
const opener = extractFirstParagraph(html);
|
|
59
|
+
if (!opener)
|
|
60
|
+
return false;
|
|
61
|
+
const hasFact = FACT_PATTERNS.some((re) => {
|
|
62
|
+
re.lastIndex = 0;
|
|
63
|
+
return re.test(opener);
|
|
64
|
+
});
|
|
65
|
+
const isCompleteSentence = /[.!?]\s*$/.test(opener.trim()) && opener.split(/\s+/).length >= 8;
|
|
66
|
+
return hasFact && isCompleteSentence;
|
|
67
|
+
}
|
|
68
|
+
function pageHasNonReplicableValue(html, contentText) {
|
|
69
|
+
const $ = load(html);
|
|
70
|
+
for (const sel of INTERACTIVE_SELECTORS) {
|
|
71
|
+
try {
|
|
72
|
+
if ($(sel).length > 0)
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
catch { /* invalid selector */ }
|
|
76
|
+
}
|
|
77
|
+
if (/\bdata-(reactroot|react-[\w-]+|vue-[\w-]+|v-[\w-]+|svelte-[\w-]+)\b/i.test(html))
|
|
78
|
+
return true;
|
|
79
|
+
let hasDownload = false;
|
|
80
|
+
$("a[href]").each((_, el) => {
|
|
81
|
+
if (hasDownload)
|
|
82
|
+
return false;
|
|
83
|
+
const href = $(el).attr("href") ?? "";
|
|
84
|
+
if (DOWNLOAD_PATTERN.test(href) || /[?&]format=(pdf|docx?|xlsx?|csv)\b/i.test(href)) {
|
|
85
|
+
hasDownload = true;
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
if ($(el).attr("download") !== undefined) {
|
|
89
|
+
hasDownload = true;
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
return undefined;
|
|
93
|
+
});
|
|
94
|
+
if (hasDownload)
|
|
95
|
+
return true;
|
|
96
|
+
return /\b(sign\s*(in|up)|log\s*in)\s+to\s+(read|access|view|download|continue)/i.test(contentText);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Composite rule — fires when a page is "optimized for summarization, not retention":
|
|
100
|
+
* 1. Has a strong answer-first opener (AI Overviews will cite it), AND
|
|
101
|
+
* 2. Has no interactive / downloadable / gated value below the fold, AND
|
|
102
|
+
* 3. Has its citable facts concentrated in the opener (nothing deeper to scroll for).
|
|
103
|
+
*
|
|
104
|
+
* The overlap of these three is the worst-case zero-click page: readers (and AI engines)
|
|
105
|
+
* get everything they need from the summary, and the click-through never happens.
|
|
106
|
+
*/
|
|
107
|
+
export function summaryBaitRule(pages, entityPatterns, options) {
|
|
108
|
+
const openerWords = options?.openerWordCount ?? 150;
|
|
109
|
+
const threshold = options?.openerFactConcentrationThreshold ?? 0.7;
|
|
110
|
+
const minFacts = options?.minFactsToAnalyze ?? 3;
|
|
111
|
+
const findings = [];
|
|
112
|
+
for (const page of pages) {
|
|
113
|
+
if (!openerHasExtractableAnswer(page.html))
|
|
114
|
+
continue;
|
|
115
|
+
if (pageHasNonReplicableValue(page.html, page.contentText))
|
|
116
|
+
continue;
|
|
117
|
+
const maskedFull = applyEntityMask(page.contentText, entityPatterns);
|
|
118
|
+
const openerText = maskedFull.split(/\s+/).slice(0, openerWords).join(" ");
|
|
119
|
+
const fullFacts = extractFacts(maskedFull);
|
|
120
|
+
if (fullFacts.length < minFacts)
|
|
121
|
+
continue;
|
|
122
|
+
const openerFacts = extractFacts(openerText);
|
|
123
|
+
const concentration = openerFacts.length / fullFacts.length;
|
|
124
|
+
if (concentration < threshold)
|
|
125
|
+
continue;
|
|
126
|
+
findings.push({
|
|
127
|
+
ruleId: "aeo/summary-bait",
|
|
128
|
+
severity: "error",
|
|
129
|
+
message: `${page.url} is optimized for summarization, not retention. ` +
|
|
130
|
+
`${Math.round(concentration * 100)}% of citable facts (${openerFacts.length}/${fullFacts.length}) ` +
|
|
131
|
+
`sit in the first ${openerWords} words, the page has no interactive / downloadable / gated value ` +
|
|
132
|
+
`below the fold, and the opener passes answer-first. AI Overviews will cite this page ` +
|
|
133
|
+
`without sending the click.`,
|
|
134
|
+
pageUrl: page.url,
|
|
135
|
+
fix: `Redistribute value across the page so the full answer requires scrolling: ` +
|
|
136
|
+
`(1) move the interactive element — calculator, checklist, comparison tool, generator, ` +
|
|
137
|
+
`downloadable asset — above the fold, or at least into a prominent section below the opener; ` +
|
|
138
|
+
`(2) push a portion of the citable facts into a "Details" / "Requirements" / "Full breakdown" ` +
|
|
139
|
+
`section deeper on the page; ` +
|
|
140
|
+
`(3) add non-replicable value the summary can't carry (worked examples, user-specific calculations, ` +
|
|
141
|
+
`gated templates). ` +
|
|
142
|
+
`A good opener plus no deeper value guarantees zero-click traffic loss.`,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
return findings;
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=summary-bait.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summary-bait.js","sourceRoot":"","sources":["../../../src/rules/aeo/summary-bait.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../src/rules/scope.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE1C,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../src/rules/scope.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE1C,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAqEhD,CAAC;AAEF,4GAA4G;AAC5G,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE3D"}
|
package/dist/rules/scope.js
CHANGED
|
@@ -58,6 +58,7 @@ export const RULE_SCOPE = {
|
|
|
58
58
|
"aeo/citable-facts": "page",
|
|
59
59
|
"aeo/non-replicable-value": "page",
|
|
60
60
|
"aeo/content-modularity": "page",
|
|
61
|
+
"aeo/summary-bait": "page",
|
|
61
62
|
};
|
|
62
63
|
/** Returns true when the rule may run in diff (page-scoped) mode. Unknown ids default to corpus (safer). */
|
|
63
64
|
export function isRuleAllowedInDiff(ruleId) {
|
package/dist/rules/scope.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope.js","sourceRoot":"","sources":["../../src/rules/scope.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,MAAM,UAAU,GAA8B;IACnD,OAAO;IACP,qBAAqB,EAAE,QAAQ;IAC/B,kBAAkB,EAAE,QAAQ;IAC5B,mBAAmB,EAAE,MAAM;IAC3B,wBAAwB,EAAE,QAAQ;IAClC,yBAAyB,EAAE,QAAQ;IACnC,2BAA2B,EAAE,QAAQ;IACrC,sBAAsB,EAAE,QAAQ;IAChC,wBAAwB,EAAE,QAAQ;IAElC,UAAU;IACV,sBAAsB,EAAE,QAAQ;IAChC,4BAA4B,EAAE,QAAQ;IACtC,yBAAyB,EAAE,QAAQ;IACnC,wBAAwB,EAAE,MAAM;IAChC,sBAAsB,EAAE,MAAM;IAE9B,yCAAyC;IACzC,oBAAoB,EAAE,QAAQ;IAC9B,iBAAiB,EAAE,QAAQ;IAC3B,4BAA4B,EAAE,QAAQ;IACtC,iBAAiB,EAAE,QAAQ;IAC3B,kBAAkB,EAAE,QAAQ;IAC5B,6BAA6B,EAAE,QAAQ;IACvC,yBAAyB,EAAE,QAAQ;IAEnC,uFAAuF;IACvF,4BAA4B,EAAE,QAAQ;IACtC,iCAAiC,EAAE,MAAM;IACzC,8BAA8B,EAAE,QAAQ;IACxC,2BAA2B,EAAE,QAAQ;IACrC,qBAAqB,EAAE,MAAM;IAC7B,eAAe,EAAE,MAAM;IACvB,sBAAsB,EAAE,MAAM;IAC9B,2BAA2B,EAAE,QAAQ;IACrC,wBAAwB,EAAE,QAAQ;IAClC,8BAA8B,EAAE,QAAQ;IAExC,SAAS;IACT,sBAAsB,EAAE,MAAM;IAC9B,wBAAwB,EAAE,MAAM;IAChC,oBAAoB,EAAE,QAAQ;IAE9B,sCAAsC;IACtC,wBAAwB,EAAE,QAAQ;IAClC,4BAA4B,EAAE,QAAQ;IACtC,sBAAsB,EAAE,QAAQ;IAEhC,eAAe;IACf,sBAAsB,EAAE,MAAM;IAC9B,6BAA6B,EAAE,QAAQ;IAEvC,iBAAiB;IACjB,qBAAqB,EAAE,QAAQ;IAE/B,0EAA0E;IAC1E,+EAA+E;IAC/E,yEAAyE;IACzE,qEAAqE;IACrE,cAAc,EAAE,QAAQ;IACxB,oBAAoB,EAAE,QAAQ;IAC9B,uBAAuB,EAAE,MAAM;IAC/B,kBAAkB,EAAE,MAAM;IAC1B,kBAAkB,EAAE,MAAM;IAC1B,mBAAmB,EAAE,MAAM;IAC3B,0BAA0B,EAAE,MAAM;IAClC,wBAAwB,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"scope.js","sourceRoot":"","sources":["../../src/rules/scope.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,MAAM,UAAU,GAA8B;IACnD,OAAO;IACP,qBAAqB,EAAE,QAAQ;IAC/B,kBAAkB,EAAE,QAAQ;IAC5B,mBAAmB,EAAE,MAAM;IAC3B,wBAAwB,EAAE,QAAQ;IAClC,yBAAyB,EAAE,QAAQ;IACnC,2BAA2B,EAAE,QAAQ;IACrC,sBAAsB,EAAE,QAAQ;IAChC,wBAAwB,EAAE,QAAQ;IAElC,UAAU;IACV,sBAAsB,EAAE,QAAQ;IAChC,4BAA4B,EAAE,QAAQ;IACtC,yBAAyB,EAAE,QAAQ;IACnC,wBAAwB,EAAE,MAAM;IAChC,sBAAsB,EAAE,MAAM;IAE9B,yCAAyC;IACzC,oBAAoB,EAAE,QAAQ;IAC9B,iBAAiB,EAAE,QAAQ;IAC3B,4BAA4B,EAAE,QAAQ;IACtC,iBAAiB,EAAE,QAAQ;IAC3B,kBAAkB,EAAE,QAAQ;IAC5B,6BAA6B,EAAE,QAAQ;IACvC,yBAAyB,EAAE,QAAQ;IAEnC,uFAAuF;IACvF,4BAA4B,EAAE,QAAQ;IACtC,iCAAiC,EAAE,MAAM;IACzC,8BAA8B,EAAE,QAAQ;IACxC,2BAA2B,EAAE,QAAQ;IACrC,qBAAqB,EAAE,MAAM;IAC7B,eAAe,EAAE,MAAM;IACvB,sBAAsB,EAAE,MAAM;IAC9B,2BAA2B,EAAE,QAAQ;IACrC,wBAAwB,EAAE,QAAQ;IAClC,8BAA8B,EAAE,QAAQ;IAExC,SAAS;IACT,sBAAsB,EAAE,MAAM;IAC9B,wBAAwB,EAAE,MAAM;IAChC,oBAAoB,EAAE,QAAQ;IAE9B,sCAAsC;IACtC,wBAAwB,EAAE,QAAQ;IAClC,4BAA4B,EAAE,QAAQ;IACtC,sBAAsB,EAAE,QAAQ;IAEhC,eAAe;IACf,sBAAsB,EAAE,MAAM;IAC9B,6BAA6B,EAAE,QAAQ;IAEvC,iBAAiB;IACjB,qBAAqB,EAAE,QAAQ;IAE/B,0EAA0E;IAC1E,+EAA+E;IAC/E,yEAAyE;IACzE,qEAAqE;IACrE,cAAc,EAAE,QAAQ;IACxB,oBAAoB,EAAE,QAAQ;IAC9B,uBAAuB,EAAE,MAAM;IAC/B,kBAAkB,EAAE,MAAM;IAC1B,kBAAkB,EAAE,MAAM;IAC1B,mBAAmB,EAAE,MAAM;IAC3B,0BAA0B,EAAE,MAAM;IAClC,wBAAwB,EAAE,MAAM;IAChC,kBAAkB,EAAE,MAAM;CAC3B,CAAC;AAEF,4GAA4G;AAC5G,MAAM,UAAU,mBAAmB,CAAC,MAAc;IAChD,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,KAAK,MAAM,CAAC;AACrD,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -57,6 +57,7 @@ export interface CategoryScores {
|
|
|
57
57
|
aeo: number;
|
|
58
58
|
links: number;
|
|
59
59
|
tech: number;
|
|
60
|
+
data: number;
|
|
60
61
|
schema: number;
|
|
61
62
|
cannibal: number;
|
|
62
63
|
}
|
|
@@ -207,6 +208,18 @@ export interface AuditOptions {
|
|
|
207
208
|
/** Browser rendering options for client-rendered pages. */
|
|
208
209
|
render?: {
|
|
209
210
|
browserWsEndpoint?: string;
|
|
211
|
+
/**
|
|
212
|
+
* How to handle third-party analytics / session-replay beacons during
|
|
213
|
+
* rendered audits.
|
|
214
|
+
* "block" (default) — abort known analytics hosts so the audit doesn't
|
|
215
|
+
* inject fake pageviews / sessions into the site owner's dashboards.
|
|
216
|
+
* "allow-first-party" — block third-party analytics only; same-origin
|
|
217
|
+
* requests pass through (for sites that self-host analytics).
|
|
218
|
+
* "allow" — don't intercept anything (only for sites you own).
|
|
219
|
+
*/
|
|
220
|
+
analyticsMode?: "block" | "allow" | "allow-first-party";
|
|
221
|
+
/** Extra host tokens to block in addition to the default list. */
|
|
222
|
+
extraBlockedHosts?: readonly string[];
|
|
210
223
|
};
|
|
211
224
|
/** Override template auto-detection. When set, skips heuristic detection. */
|
|
212
225
|
templateGenerated?: boolean;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pseolint/core",
|
|
3
|
-
"version": "0.3.
|
|
4
|
-
"description": "Programmatic SEO audit engine —
|
|
3
|
+
"version": "0.3.1",
|
|
4
|
+
"description": "Programmatic SEO audit engine — 43 rules across 8 categories for SpamBrain penalty risk and AI Overview citability",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Ouranos Labs <contact@ouranos-labs.dev>",
|
|
7
7
|
"homepage": "https://pseolint.dev",
|
|
@@ -88,4 +88,4 @@
|
|
|
88
88
|
"@ai-sdk/anthropic": "^2.0.0",
|
|
89
89
|
"ollama-ai-provider-v2": "^1.0.0"
|
|
90
90
|
}
|
|
91
|
-
}
|
|
91
|
+
}
|