@pseolint/core 0.2.2 → 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.
Files changed (77) hide show
  1. package/README.md +10 -9
  2. package/dist/ai/prompt.d.ts +1 -1
  3. package/dist/ai/prompt.d.ts.map +1 -1
  4. package/dist/ai/prompt.js +13 -1
  5. package/dist/ai/prompt.js.map +1 -1
  6. package/dist/ai/triage.d.ts +15 -1
  7. package/dist/ai/triage.d.ts.map +1 -1
  8. package/dist/ai/triage.js +30 -0
  9. package/dist/ai/triage.js.map +1 -1
  10. package/dist/analytics-blocklist.d.ts +28 -0
  11. package/dist/analytics-blocklist.d.ts.map +1 -0
  12. package/dist/analytics-blocklist.js +129 -0
  13. package/dist/analytics-blocklist.js.map +1 -0
  14. package/dist/auditor.d.ts.map +1 -1
  15. package/dist/auditor.js +130 -46
  16. package/dist/auditor.js.map +1 -1
  17. package/dist/formatters/console.d.ts +9 -0
  18. package/dist/formatters/console.d.ts.map +1 -1
  19. package/dist/formatters/console.js +53 -0
  20. package/dist/formatters/console.js.map +1 -1
  21. package/dist/formatters/html.d.ts.map +1 -1
  22. package/dist/formatters/html.js +557 -144
  23. package/dist/formatters/html.js.map +1 -1
  24. package/dist/index.d.ts +14 -1
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +12 -1
  27. package/dist/index.js.map +1 -1
  28. package/dist/renderer.d.ts +14 -0
  29. package/dist/renderer.d.ts.map +1 -1
  30. package/dist/renderer.js +130 -4
  31. package/dist/renderer.js.map +1 -1
  32. package/dist/rule-references.d.ts.map +1 -1
  33. package/dist/rule-references.js +9 -0
  34. package/dist/rule-references.js.map +1 -1
  35. package/dist/rules/aeo/answer-first.d.ts +18 -0
  36. package/dist/rules/aeo/answer-first.d.ts.map +1 -0
  37. package/dist/rules/aeo/answer-first.js +191 -0
  38. package/dist/rules/aeo/answer-first.js.map +1 -0
  39. package/dist/rules/aeo/citable-facts.d.ts +9 -0
  40. package/dist/rules/aeo/citable-facts.d.ts.map +1 -0
  41. package/dist/rules/aeo/citable-facts.js +90 -0
  42. package/dist/rules/aeo/citable-facts.js.map +1 -0
  43. package/dist/rules/aeo/content-modularity.d.ts +11 -0
  44. package/dist/rules/aeo/content-modularity.d.ts.map +1 -0
  45. package/dist/rules/aeo/content-modularity.js +107 -0
  46. package/dist/rules/aeo/content-modularity.js.map +1 -0
  47. package/dist/rules/aeo/crawler-access.d.ts +25 -0
  48. package/dist/rules/aeo/crawler-access.d.ts.map +1 -0
  49. package/dist/rules/aeo/crawler-access.js +116 -0
  50. package/dist/rules/aeo/crawler-access.js.map +1 -0
  51. package/dist/rules/aeo/faq-coverage.d.ts +9 -0
  52. package/dist/rules/aeo/faq-coverage.d.ts.map +1 -0
  53. package/dist/rules/aeo/faq-coverage.js +71 -0
  54. package/dist/rules/aeo/faq-coverage.js.map +1 -0
  55. package/dist/rules/aeo/freshness-signals.d.ts +9 -0
  56. package/dist/rules/aeo/freshness-signals.d.ts.map +1 -0
  57. package/dist/rules/aeo/freshness-signals.js +109 -0
  58. package/dist/rules/aeo/freshness-signals.js.map +1 -0
  59. package/dist/rules/aeo/llms-txt.d.ts +24 -0
  60. package/dist/rules/aeo/llms-txt.d.ts.map +1 -0
  61. package/dist/rules/aeo/llms-txt.js +93 -0
  62. package/dist/rules/aeo/llms-txt.js.map +1 -0
  63. package/dist/rules/aeo/non-replicable-value.d.ts +9 -0
  64. package/dist/rules/aeo/non-replicable-value.d.ts.map +1 -0
  65. package/dist/rules/aeo/non-replicable-value.js +95 -0
  66. package/dist/rules/aeo/non-replicable-value.js.map +1 -0
  67. package/dist/rules/aeo/summary-bait.d.ts +20 -0
  68. package/dist/rules/aeo/summary-bait.d.ts.map +1 -0
  69. package/dist/rules/aeo/summary-bait.js +147 -0
  70. package/dist/rules/aeo/summary-bait.js.map +1 -0
  71. package/dist/rules/scope.d.ts +12 -0
  72. package/dist/rules/scope.d.ts.map +1 -0
  73. package/dist/rules/scope.js +67 -0
  74. package/dist/rules/scope.js.map +1 -0
  75. package/dist/types.d.ts +30 -0
  76. package/dist/types.d.ts.map +1 -1
  77. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/formatters/html.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/formatters/html.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -44,6 +44,15 @@ export * from "./renderer.js";
44
44
  export * from "./enrich-findings.js";
45
45
  export * from "./data-source-loader.js";
46
46
  export * from "./rules/data/data-binding.js";
47
+ export { llmsTxtRule, validateLlmsTxt } from "./rules/aeo/llms-txt.js";
48
+ export { crawlerAccessRule, parseRobotsByUserAgent, isFullyDisallowed, DEFAULT_AI_CRAWLERS } from "./rules/aeo/crawler-access.js";
49
+ export { freshnessSignalsRule } from "./rules/aeo/freshness-signals.js";
50
+ export { faqCoverageRule } from "./rules/aeo/faq-coverage.js";
51
+ export { answerFirstRule, extractFirstParagraph } from "./rules/aeo/answer-first.js";
52
+ export { citableFactsRule } from "./rules/aeo/citable-facts.js";
53
+ export { nonReplicableValueRule } from "./rules/aeo/non-replicable-value.js";
54
+ export { contentModularityRule } from "./rules/aeo/content-modularity.js";
55
+ export { summaryBaitRule } from "./rules/aeo/summary-bait.js";
47
56
  export { cachedFetch, cacheKeyFor } from "./cache.js";
48
57
  export type { CacheConfig, CachedFetchOptions, CachedFetchResult, CacheEntry } from "./cache.js";
49
58
  export type { CacheOptions, CacheStats, SamplingStrategy, StateOptions } from "./types.js";
@@ -52,7 +61,7 @@ export { readState, writeState, computeContentHash, normalizeHtmlForHash, STATE_
52
61
  export type { RunState, UrlStateEntry, RenderMode } from "./state.js";
53
62
  export type { AiOptions, } from "./types.js";
54
63
  export type { TokenUsage, RootCause, TriageResult, } from "./ai/types.js";
55
- export { triageFindings } from "./ai/triage.js";
64
+ export { triageFindings, triage } from "./ai/triage.js";
56
65
  export type { TriageOptions, TriageOutcome } from "./ai/triage.js";
57
66
  export { createLanguageModel, detectProvider } from "./ai/adapters/index.js";
58
67
  export type { ProviderId, ResolvedModel } from "./ai/adapters/index.js";
@@ -62,4 +71,8 @@ export * from "./telemetry/index.js";
62
71
  export type { TelemetryOptions } from "./types.js";
63
72
  export { promptTriageFeedback } from "./ai/feedback-prompt.js";
64
73
  export type { FeedbackRating, PromptOptions } from "./ai/feedback-prompt.js";
74
+ export { RULE_SCOPE, isRuleAllowedInDiff } from "./rules/scope.js";
75
+ export type { RuleScope } from "./rules/scope.js";
76
+ export { DEFAULT_ANALYTICS_HOSTS, isAnalyticsRequest } from "./analytics-blocklist.js";
77
+ export type { AnalyticsMode } from "./analytics-blocklist.js";
65
78
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -44,13 +44,24 @@ export * from "./renderer.js";
44
44
  export * from "./enrich-findings.js";
45
45
  export * from "./data-source-loader.js";
46
46
  export * from "./rules/data/data-binding.js";
47
+ export { llmsTxtRule, validateLlmsTxt } from "./rules/aeo/llms-txt.js";
48
+ export { crawlerAccessRule, parseRobotsByUserAgent, isFullyDisallowed, DEFAULT_AI_CRAWLERS } from "./rules/aeo/crawler-access.js";
49
+ export { freshnessSignalsRule } from "./rules/aeo/freshness-signals.js";
50
+ export { faqCoverageRule } from "./rules/aeo/faq-coverage.js";
51
+ export { answerFirstRule, extractFirstParagraph } from "./rules/aeo/answer-first.js";
52
+ export { citableFactsRule } from "./rules/aeo/citable-facts.js";
53
+ export { nonReplicableValueRule } from "./rules/aeo/non-replicable-value.js";
54
+ export { contentModularityRule } from "./rules/aeo/content-modularity.js";
55
+ export { summaryBaitRule } from "./rules/aeo/summary-bait.js";
47
56
  export { cachedFetch, cacheKeyFor } from "./cache.js";
48
57
  export { stratifiedSample, inferUrlTemplate } from "./stratified-sample.js";
49
58
  export { readState, writeState, computeContentHash, normalizeHtmlForHash, STATE_SCHEMA_VERSION } from "./state.js";
50
- export { triageFindings } from "./ai/triage.js";
59
+ export { triageFindings, triage } from "./ai/triage.js";
51
60
  export { createLanguageModel, detectProvider } from "./ai/adapters/index.js";
52
61
  export { PROMPT_VERSION, assignFindingId } from "./ai/prompt.js";
53
62
  export { estimateCostUsd } from "./ai/cost.js";
54
63
  export * from "./telemetry/index.js";
55
64
  export { promptTriageFeedback } from "./ai/feedback-prompt.js";
65
+ export { RULE_SCOPE, isRuleAllowedInDiff } from "./rules/scope.js";
66
+ export { DEFAULT_ANALYTICS_HOSTS, isAnalyticsRequest } from "./analytics-blocklist.js";
56
67
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mCAAmC,CAAC;AAClD,cAAc,oCAAoC,CAAC;AACnD,cAAc,sCAAsC,CAAC;AACrD,cAAc,iCAAiC,CAAC;AAChD,cAAc,mCAAmC,CAAC;AAClD,cAAc,iCAAiC,CAAC;AAChD,cAAc,uCAAuC,CAAC;AACtD,cAAc,oCAAoC,CAAC;AACnD,cAAc,mCAAmC,CAAC;AAClD,cAAc,iCAAiC,CAAC;AAChD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,uCAAuC,CAAC;AACtD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uCAAuC,CAAC;AACtD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,yCAAyC,CAAC;AACxD,cAAc,sCAAsC,CAAC;AACrD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,0BAA0B,CAAC;AACzC,cAAc,iCAAiC,CAAC;AAChD,cAAc,sCAAsC,CAAC;AACrD,cAAc,iCAAiC,CAAC;AAChD,cAAc,mCAAmC,CAAC;AAClD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,wBAAwB,CAAC;AACvC,cAAc,mCAAmC,CAAC;AAClD,cAAc,uCAAuC,CAAC;AACtD,cAAc,iCAAiC,CAAC;AAChD,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,8BAA8B,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGtD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAYnH,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7E,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,cAAc,sBAAsB,CAAC;AAErC,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,21 @@
1
+ import { type AnalyticsMode } from "./analytics-blocklist.js";
1
2
  export interface RenderOptions {
2
3
  browserWsEndpoint?: string;
3
4
  concurrency: number;
4
5
  timeoutMs: number;
6
+ /**
7
+ * How to handle analytics / telemetry / session-replay beacons.
8
+ * "block" (default) — abort known analytics hosts (Google Analytics, Plausible,
9
+ * Mixpanel, Hotjar, PostHog, Sentry, etc.). Prevents the audit from injecting
10
+ * fake pageviews / sessions into the site owner's dashboards.
11
+ * "allow-first-party" — block third-party analytics only; keep same-origin
12
+ * requests for sites that self-host analytics on their own domain.
13
+ * "allow" — don't intercept anything. Use this only when you're auditing a
14
+ * site you own and explicitly want render-mode traffic in your analytics.
15
+ */
16
+ analyticsMode?: AnalyticsMode;
17
+ /** Extra host tokens to block in addition to the default list (substring match). */
18
+ extraBlockedHosts?: readonly string[];
5
19
  }
6
20
  interface RenderedPage {
7
21
  url: string;
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,YAAY;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AA0ED,wBAAsB,WAAW,CAC/B,KAAK,EAAE,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,EACjD,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,YAAY,EAAE,CAAC,CA8DzB"}
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"AAIA,OAAO,EAAsB,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAoClF,MAAM,WAAW,aAAa;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;;;;;OASG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,oFAAoF;IACpF,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACvC;AAED,UAAU,YAAY;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AA0ED,wBAAsB,WAAW,CAC/B,KAAK,EAAE,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,EACjD,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,YAAY,EAAE,CAAC,CA6IzB"}
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 browser.newPage();
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
- await Promise.all(workers);
120
- server?.close();
121
- await browser.close();
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
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"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"}
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,CAoClD,CAAC"}
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"}
@@ -34,5 +34,14 @@ export const RULE_REFERENCES = {
34
34
  "cannibal/url-pattern": "https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls",
35
35
  "data/missing-binding": "https://developers.google.com/search/docs/essentials/spam-policies#thin-content",
36
36
  "data/identical-across-pages": "https://developers.google.com/search/docs/essentials/spam-policies#scraped-content",
37
+ "aeo/llms-txt": "https://llmstxt.org",
38
+ "aeo/crawler-access": "https://www.robotstxt.org/robotstxt.html",
39
+ "aeo/freshness-signals": "https://developers.google.com/search/docs/appearance/publication-dates",
40
+ "aeo/faq-coverage": "https://developers.google.com/search/docs/appearance/structured-data/faqpage",
41
+ "aeo/answer-first": "https://developers.google.com/search/docs/appearance/featured-snippets",
42
+ "aeo/citable-facts": "https://developers.google.com/search/docs/fundamentals/creating-helpful-content",
43
+ "aeo/non-replicable-value": "https://developers.google.com/search/docs/fundamentals/creating-helpful-content",
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",
37
46
  };
38
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;CACpH,CAAC"}
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,18 @@
1
+ import type { EntityMaskPattern, ParsedPage, RuleResult } from "../../types.js";
2
+ export interface AnswerFirstOptions {
3
+ /** First paragraph should fit under this many words to be "extractable". Default: 100. */
4
+ maxFirstParagraphWords?: number;
5
+ /** Opener longer than this is penalized as too long to extract. Default: 150. */
6
+ paragraphTooLongWords?: number;
7
+ /** Minimum score-points for a passing opener. Default: 2. */
8
+ minScoreToPass?: number;
9
+ }
10
+ /**
11
+ * Extract the first paragraph-ish content block after the H1. Walks the DOM in document
12
+ * order starting at the H1 and finds the next `<p>` with >=5 words that is NOT inside a
13
+ * nav/aside/footer/header/breadcrumb. Falls back to the first qualifying `<p>` inside
14
+ * `main`/`article` if the H1-sibling walk finds nothing.
15
+ */
16
+ export declare function extractFirstParagraph(html: string): string;
17
+ export declare function answerFirstRule(pages: ParsedPage[], entityPatterns: EntityMaskPattern[], options?: AnswerFirstOptions): RuleResult[];
18
+ //# sourceMappingURL=answer-first.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"answer-first.d.ts","sourceRoot":"","sources":["../../../src/rules/aeo/answer-first.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEhF,MAAM,WAAW,kBAAkB;IACjC,0FAA0F;IAC1F,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,iFAAiF;IACjF,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,6DAA6D;IAC7D,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AA6BD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA0D1D;AA8CD,wBAAgB,eAAe,CAC7B,KAAK,EAAE,UAAU,EAAE,EACnB,cAAc,EAAE,iBAAiB,EAAE,EACnC,OAAO,CAAC,EAAE,kBAAkB,GAC3B,UAAU,EAAE,CA0Dd"}
@@ -0,0 +1,191 @@
1
+ import { load } from "cheerio";
2
+ const BOILERPLATE_PATTERNS = [
3
+ /^\s*(welcome\s+to|our\s+(complete|comprehensive|ultimate)|in\s+this\s+(post|article|guide)|home\s*»|skip\s+to)/i,
4
+ /^\s*(generate|create|build)\s+your\s+/i,
5
+ ];
6
+ const NUMBER_PATTERNS = [
7
+ /\$[\d,]+(\.\d{2})?/,
8
+ /\b\d+(\.\d+)?\s*%/,
9
+ /\b\d+\s*(days?|weeks?|months?|years?|business\s+days?|hours?|minutes?)\b/i,
10
+ /\b(19|20)\d{2}\b/, // years
11
+ ];
12
+ /**
13
+ * "Proper-noun entity" detector. Accepts multi-word proper nouns (e.g. "Secretary of State",
14
+ * "Delaware Division") AND standalone capitalized entities that are not sentence-initial
15
+ * (e.g. "...with the Delaware office", "filed in California").
16
+ */
17
+ const MULTI_WORD_PROPER_NOUN = /\b[A-Z][a-z]+(?:\s+(?:of\s+|de\s+|and\s+)?[A-Z][a-z]+)+\b/;
18
+ const SINGLE_WORD_PROPER_NOUN = /(?<!^)(?<=\s)[A-Z][a-z]{2,}\b/;
19
+ const FORM_PATTERN = /\bForm\s+[A-Z0-9-]+\b/i;
20
+ function wordCount(text) {
21
+ const trimmed = text.trim();
22
+ if (!trimmed)
23
+ return 0;
24
+ return trimmed.split(/\s+/).length;
25
+ }
26
+ /**
27
+ * Extract the first paragraph-ish content block after the H1. Walks the DOM in document
28
+ * order starting at the H1 and finds the next `<p>` with >=5 words that is NOT inside a
29
+ * nav/aside/footer/header/breadcrumb. Falls back to the first qualifying `<p>` inside
30
+ * `main`/`article` if the H1-sibling walk finds nothing.
31
+ */
32
+ export function extractFirstParagraph(html) {
33
+ const $ = load(html);
34
+ const h1 = $("h1").first();
35
+ const excludeSel = "nav, aside, footer, header, [role=navigation], .breadcrumbs, .breadcrumb";
36
+ const isExcluded = (el) => {
37
+ const $el = $(el);
38
+ return $el.closest(excludeSel).length > 0;
39
+ };
40
+ const pickFirstQualifyingP = (scope) => {
41
+ let found = null;
42
+ scope.find("p").each((_, el) => {
43
+ if (found)
44
+ return false;
45
+ if (isExcluded(el))
46
+ return undefined;
47
+ const text = $(el).text().trim();
48
+ if (wordCount(text) >= 5) {
49
+ found = text;
50
+ return false;
51
+ }
52
+ return undefined;
53
+ });
54
+ return found;
55
+ };
56
+ // Walk forward from the H1 through the document, checking every `<p>` that comes after it.
57
+ // cheerio has no compareDocumentPosition; emulate with a boolean gate in document order.
58
+ if (h1.length > 0) {
59
+ const h1El = h1.get(0);
60
+ let passedH1 = false;
61
+ let found = null;
62
+ $("h1, p").each((_, el) => {
63
+ if (found)
64
+ return false;
65
+ if (el === h1El) {
66
+ passedH1 = true;
67
+ return undefined;
68
+ }
69
+ if (!passedH1)
70
+ return undefined;
71
+ const tag = el.tagName?.toLowerCase?.();
72
+ if (tag !== "p")
73
+ return undefined;
74
+ if (isExcluded(el))
75
+ return undefined;
76
+ const text = $(el).text().trim();
77
+ if (wordCount(text) >= 5) {
78
+ found = text;
79
+ return false;
80
+ }
81
+ return undefined;
82
+ });
83
+ if (found)
84
+ return found;
85
+ }
86
+ // Fallbacks in order of specificity.
87
+ for (const scope of [$("main").first(), $("article").first(), $("body").first()]) {
88
+ if (scope.length === 0)
89
+ continue;
90
+ const found = pickFirstQualifyingP(scope);
91
+ if (found)
92
+ return found;
93
+ }
94
+ return "";
95
+ }
96
+ function applyEntityMask(text, patterns) {
97
+ let out = text;
98
+ for (const p of patterns) {
99
+ out = out.replace(p.pattern, p.placeholder);
100
+ }
101
+ return out;
102
+ }
103
+ function hasConcreteFact(text) {
104
+ return NUMBER_PATTERNS.some((re) => re.test(text)) || FORM_PATTERN.test(text);
105
+ }
106
+ function hasNamedEntity(text, entityPatterns) {
107
+ if (MULTI_WORD_PROPER_NOUN.test(text))
108
+ return true;
109
+ if (SINGLE_WORD_PROPER_NOUN.test(text))
110
+ return true;
111
+ // A user-defined entity pattern matching the opener also counts as a named entity —
112
+ // this is how pSEO operators declare their primary entity dimension (states, cities, etc.).
113
+ for (const p of entityPatterns) {
114
+ if (p.pattern.test(text)) {
115
+ // Reset lastIndex for global regexes so subsequent callers see fresh state.
116
+ p.pattern.lastIndex = 0;
117
+ return true;
118
+ }
119
+ p.pattern.lastIndex = 0;
120
+ }
121
+ return false;
122
+ }
123
+ function hasCompleteSentence(text) {
124
+ return /[.!?]\s*$/.test(text.trim()) && wordCount(text) >= 8;
125
+ }
126
+ function isBoilerplateOpener(text) {
127
+ return BOILERPLATE_PATTERNS.some((re) => re.test(text));
128
+ }
129
+ export function answerFirstRule(pages, entityPatterns, options) {
130
+ const maxWords = options?.maxFirstParagraphWords ?? 100;
131
+ const tooLong = options?.paragraphTooLongWords ?? 150;
132
+ const minPass = options?.minScoreToPass ?? 2;
133
+ const scored = [];
134
+ for (const page of pages) {
135
+ const paragraph = extractFirstParagraph(page.html);
136
+ if (!paragraph)
137
+ continue;
138
+ const opener = paragraph.split(/\s+/).slice(0, maxWords).join(" ");
139
+ const wc = wordCount(paragraph);
140
+ let score = 0;
141
+ if (hasConcreteFact(opener))
142
+ score += 1;
143
+ if (hasNamedEntity(opener, entityPatterns))
144
+ score += 1;
145
+ if (hasCompleteSentence(opener))
146
+ score += 1;
147
+ if (wc > tooLong)
148
+ score -= 1;
149
+ if (isBoilerplateOpener(opener))
150
+ score -= 2;
151
+ const masked = applyEntityMask(opener, entityPatterns);
152
+ scored.push({ url: page.url, score, paragraph: opener, wordCount: wc, masked });
153
+ }
154
+ const maskFrequency = new Map();
155
+ for (const s of scored) {
156
+ maskFrequency.set(s.masked, (maskFrequency.get(s.masked) ?? 0) + 1);
157
+ }
158
+ const templateThreshold = Math.max(3, Math.floor(scored.length * 0.2));
159
+ const findings = [];
160
+ for (const s of scored) {
161
+ let finalScore = s.score;
162
+ const isTemplated = (maskFrequency.get(s.masked) ?? 0) >= templateThreshold && scored.length > 3;
163
+ if (isTemplated)
164
+ finalScore -= 3;
165
+ if (finalScore >= minPass)
166
+ continue;
167
+ const severity = finalScore <= 0 ? "error" : "warning";
168
+ const reasons = [];
169
+ if (isTemplated)
170
+ reasons.push("opener is identical to other pages after entity masking");
171
+ if (s.wordCount > tooLong)
172
+ reasons.push(`opener is ${s.wordCount} words (too long to extract)`);
173
+ if (isBoilerplateOpener(s.paragraph))
174
+ reasons.push("opener is boilerplate ('Welcome to...', 'Generate your...')");
175
+ if (!hasConcreteFact(s.paragraph))
176
+ reasons.push("no specific numbers, dates, or dollar amounts");
177
+ if (!hasNamedEntity(s.paragraph, entityPatterns))
178
+ reasons.push("no named entities (agencies, laws, proper nouns)");
179
+ findings.push({
180
+ ruleId: "aeo/answer-first",
181
+ severity,
182
+ message: `${s.url} does not open with a direct, extractable answer${reasons.length ? `: ${reasons.join("; ")}` : "."}`,
183
+ pageUrl: s.url,
184
+ fix: `Restructure the template to open with entity-specific facts. Instead of boilerplate or a topic preamble, ` +
185
+ `lead with a complete-answer sentence containing the key number, date, agency, or form name a reader ` +
186
+ `(or AI Overview) would cite. Target: <${maxWords} words, at least one concrete number, at least one named entity.`,
187
+ });
188
+ }
189
+ return findings;
190
+ }
191
+ //# sourceMappingURL=answer-first.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"answer-first.js","sourceRoot":"","sources":["../../../src/rules/aeo/answer-first.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { EntityMaskPattern, ParsedPage, RuleResult } from "../../types.js";
2
+ export interface CitableFactsOptions {
3
+ /** Below this count → error. Default: 3. */
4
+ minFactsPerPage?: number;
5
+ /** At or above this count → pass. Default: 8. */
6
+ targetFactsPerPage?: number;
7
+ }
8
+ export declare function citableFactsRule(pages: ParsedPage[], entityPatterns: EntityMaskPattern[], options?: CitableFactsOptions): RuleResult[];
9
+ //# sourceMappingURL=citable-facts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"citable-facts.d.ts","sourceRoot":"","sources":["../../../src/rules/aeo/citable-facts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEhF,MAAM,WAAW,mBAAmB;IAClC,4CAA4C;IAC5C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iDAAiD;IACjD,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAkCD,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,UAAU,EAAE,EACnB,cAAc,EAAE,iBAAiB,EAAE,EACnC,OAAO,CAAC,EAAE,mBAAmB,GAC5B,UAAU,EAAE,CAmEd"}