@pseolint/core 0.6.1 → 0.6.3
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 +80 -6
- package/dist/algorithms/wikipedia-paraphrase.d.ts +18 -6
- package/dist/algorithms/wikipedia-paraphrase.d.ts.map +1 -1
- package/dist/algorithms/wikipedia-paraphrase.js +31 -20
- package/dist/algorithms/wikipedia-paraphrase.js.map +1 -1
- package/dist/rules/tech/robots-sitemap-presence.d.ts +10 -0
- package/dist/rules/tech/robots-sitemap-presence.d.ts.map +1 -1
- package/dist/rules/tech/robots-sitemap-presence.js +24 -0
- package/dist/rules/tech/robots-sitemap-presence.js.map +1 -1
- package/package.json +2 -3
- package/data/wikipedia-trigrams.bin +0 -0
package/README.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# @pseolint/core
|
|
2
2
|
|
|
3
|
-
> Programmatic SEO audit engine
|
|
3
|
+
> Programmatic SEO audit engine — 45 rules, surfaced per-template, on every monitored release.
|
|
4
4
|
|
|
5
|
-
The core engine behind [pseolint](https://www.npmjs.com/package/pseolint). Use this package to embed pSEO auditing into your own tools, CI pipelines, or SaaS products.
|
|
5
|
+
The core engine behind [pseolint](https://www.npmjs.com/package/pseolint) v0.6.2. Use this package to embed pSEO auditing into your own tools, CI pipelines, or SaaS products.
|
|
6
6
|
|
|
7
7
|
## Install
|
|
8
8
|
|
|
@@ -15,9 +15,19 @@ npm install @pseolint/core
|
|
|
15
15
|
```ts
|
|
16
16
|
import { auditSource } from "@pseolint/core";
|
|
17
17
|
|
|
18
|
-
const
|
|
19
|
-
console.log(`
|
|
20
|
-
console.log(`Findings: ${
|
|
18
|
+
const result = await auditSource("https://example.com");
|
|
19
|
+
console.log(`Verdict: ${result.verdict}`);
|
|
20
|
+
console.log(`Findings: ${result.findings.length}`);
|
|
21
|
+
|
|
22
|
+
// v0.6: per-template breakdown
|
|
23
|
+
for (const t of result.templates) {
|
|
24
|
+
console.log(`${t.signature} ${t.verdict} risk=${t.risk}`);
|
|
25
|
+
if (t.variance.topDriver) {
|
|
26
|
+
const { ruleId, fireRate } = t.variance.topDriver;
|
|
27
|
+
const n = Math.round(fireRate * t.auditedUrls.length);
|
|
28
|
+
console.log(` ${n}/${t.auditedUrls.length} samples fail ${ruleId}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
21
31
|
```
|
|
22
32
|
|
|
23
33
|
`auditSource` accepts a local directory, a single HTML file, a page URL, or a sitemap URL.
|
|
@@ -35,6 +45,70 @@ console.log(`Findings: ${summary.findings.length}`);
|
|
|
35
45
|
- **Cannibalization** (1) — URL pattern conflicts (`title-overlap` and `keyword-collision` were dropped in v0.4 due to high false-positive rates)
|
|
36
46
|
- **Data binding** (2) — verify rendered pages expose values from a source dataset (missing or identical-across-pages bindings)
|
|
37
47
|
|
|
48
|
+
## What's new in v0.6 — audit-as-template
|
|
49
|
+
|
|
50
|
+
The unit of analysis is now the **template**, not the URL. When ≥2 template clusters are detected (each with ≥1% URL coverage and ≥5 pages), the engine runs a two-phase pipeline:
|
|
51
|
+
|
|
52
|
+
1. **Template detection** — clusters the sitemap via `clusterUrlTemplates`, canonicality-verifies one sample per cluster. Cost: ~T HTTP fetches.
|
|
53
|
+
2. **Per-template deep audit** — stratified-samples K pages per template (K=10 monitoring, K=20 re-audit), runs all per-page rules, tags each `RuleResult` with its `template` field, computes per-template verdict + variance.
|
|
54
|
+
|
|
55
|
+
`AuditResult.templates` is additive — old code reading `findings` continues to work.
|
|
56
|
+
|
|
57
|
+
### `Template` type
|
|
58
|
+
|
|
59
|
+
```ts
|
|
60
|
+
import type { Template, TemplateVariance, AuditResult } from "@pseolint/core";
|
|
61
|
+
|
|
62
|
+
// Each entry in result.templates:
|
|
63
|
+
// {
|
|
64
|
+
// signature: string; e.g. "/listing/:slug"
|
|
65
|
+
// totalUrls: number; cluster size in the sitemap
|
|
66
|
+
// auditedUrls: string[]; pages actually fetched in phase 2
|
|
67
|
+
// verdict: Verdict;
|
|
68
|
+
// risk: number; 0-100, independent of site-level risk
|
|
69
|
+
// categories: CategoryGrades;
|
|
70
|
+
// variance: {
|
|
71
|
+
// ruleFireRates: Record<string, number>; per-rule fraction of samples that fired
|
|
72
|
+
// uniformityScore: number; 0-1; high = same problems on every page
|
|
73
|
+
// topDriver: { ruleId: string; fireRate: number } | null;
|
|
74
|
+
// };
|
|
75
|
+
// findingIds: string[]; references into result.findings
|
|
76
|
+
// }
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### `siteVerdictFromTemplates` helper
|
|
80
|
+
|
|
81
|
+
```ts
|
|
82
|
+
import { siteVerdictFromTemplates } from "@pseolint/core";
|
|
83
|
+
|
|
84
|
+
// Returns the worst verdict among templates with ≥5% URL coverage.
|
|
85
|
+
// Falls back to "ready" when no template clears the 5% floor.
|
|
86
|
+
const verdict = siteVerdictFromTemplates(result.templates);
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### Full example — audit a site, log per-template verdicts
|
|
90
|
+
|
|
91
|
+
```ts
|
|
92
|
+
import { auditSource } from "@pseolint/core";
|
|
93
|
+
|
|
94
|
+
const result = await auditSource("https://example.com", {
|
|
95
|
+
samplingStrategy: "stratified",
|
|
96
|
+
cache: { dir: ".pseolint/cache" },
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
console.log(`Site verdict: ${result.verdict} risk: ${result.risk}`);
|
|
100
|
+
|
|
101
|
+
for (const t of result.templates) {
|
|
102
|
+
const td = t.variance.topDriver;
|
|
103
|
+
const driverLine = td
|
|
104
|
+
? ` top driver: ${td.ruleId} (${Math.round(td.fireRate * 100)}% of samples)`
|
|
105
|
+
: "";
|
|
106
|
+
console.log(` ${t.signature} ${t.verdict} uniformity ${Math.round(t.variance.uniformityScore * 100)}%${driverLine}`);
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Design rationale: [`docs/superpowers/specs/2026-05-04-pseolint-v0.6-audit-as-template-reframe.md`](../../docs/superpowers/specs/2026-05-04-pseolint-v0.6-audit-as-template-reframe.md)
|
|
111
|
+
|
|
38
112
|
## What's new in v0.5.2 — credibility layer
|
|
39
113
|
|
|
40
114
|
- **4 new content-quality rules** addressing the v0.5.1 blind-spot audit's tier-1 gaps: `content/title-uniqueness` (raw, not entity-masked — catalog templates with per-record entity values still pass), `content/heading-structure` (H1 presence, single-H1, hierarchy), `content/image-alt-text` (skips `role="presentation"` / `aria-hidden="true"` / explicit `alt=""`), `tech/og-completeness` (the README-promised rule that finally ships).
|
|
@@ -52,7 +126,7 @@ The full per-round iteration story (9 calibration rounds against a curated reput
|
|
|
52
126
|
|
|
53
127
|
### `auditSource(source, options?)`
|
|
54
128
|
|
|
55
|
-
Returns an `
|
|
129
|
+
Returns an `AuditResult` with verdict, risk score, category grades, enriched findings, and — since v0.6 — a `templates: Template[]` array with per-template verdicts and variance metrics. Also carries optional cache / state / AI-triage metadata.
|
|
56
130
|
|
|
57
131
|
Selected options (see `AuditOptions` in `types.ts` for the full surface):
|
|
58
132
|
|
|
@@ -4,20 +4,32 @@
|
|
|
4
4
|
* Loads the prebuilt Wikipedia trigram bloom filter and provides a
|
|
5
5
|
* paraphrase-rate estimator. Used by content/wikipedia-paraphrase rule.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
7
|
+
* v0.6.2 — bloom filter inlined as base64 to remove filesystem dependency.
|
|
8
|
+
* Production hotfix: Vercel serverless deployments couldn't resolve the
|
|
9
|
+
* relative file path. Inlining the 8 KB binary into the JS source removes
|
|
10
|
+
* deployment-config dependencies and makes the rule work in any runtime
|
|
11
|
+
* (Node, Bun, Cloudflare Workers, Vercel serverless, etc.).
|
|
12
|
+
*
|
|
13
|
+
* Bloom filter layout:
|
|
8
14
|
* m = 65536 bits (8192 bytes)
|
|
9
15
|
* k = 3 FNV-1a-32 hash functions with distinct seeds
|
|
10
16
|
*
|
|
11
17
|
* FP rate ~5% for the curated corpus of ~10 k unique trigrams.
|
|
18
|
+
*
|
|
19
|
+
* If the underlying corpus is regenerated via `bun run build-wikipedia-bloom`,
|
|
20
|
+
* also re-run the inline script that produced BLOOM_BASE64 below — see
|
|
21
|
+
* `scripts/inline-wikipedia-bloom.ts` (or regenerate manually):
|
|
22
|
+
* node -e "console.log(require(node:fs).readFileSync(packages/core/data/wikipedia-trigrams.bin).toString(base64))"
|
|
12
23
|
*/
|
|
13
|
-
/**
|
|
24
|
+
/** Decode and cache the bloom filter from the inlined base64 string. */
|
|
14
25
|
export declare function loadWikipediaBloomFilter(): Uint8Array;
|
|
15
26
|
/**
|
|
16
|
-
* Compute the
|
|
17
|
-
*
|
|
18
|
-
*
|
|
27
|
+
* Compute the paraphrase rate of `text` against the Wikipedia reference
|
|
28
|
+
* corpus. Returns a value in [0, 1] — the fraction of trigrams that are
|
|
29
|
+
* present in the bloom filter. Returns 0 for text shorter than 3 tokens.
|
|
19
30
|
*/
|
|
20
31
|
export declare function wikipediaParaphraseRate(text: string): number;
|
|
21
|
-
/**
|
|
32
|
+
/** Test-only: reset the bloom-filter cache so loadWikipediaBloomFilter
|
|
33
|
+
* re-decodes the inlined base64 on next call. Used by unit tests. */
|
|
22
34
|
export declare function _resetBloomCache(): void;
|
|
23
35
|
//# sourceMappingURL=wikipedia-paraphrase.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wikipedia-paraphrase.d.ts","sourceRoot":"","sources":["../../src/algorithms/wikipedia-paraphrase.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"wikipedia-paraphrase.d.ts","sourceRoot":"","sources":["../../src/algorithms/wikipedia-paraphrase.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAoBH,wEAAwE;AACxE,wBAAgB,wBAAwB,IAAI,UAAU,CAUrD;AAuBD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAS5D;AAED;sEACsE;AACtE,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
|
|
@@ -4,17 +4,24 @@
|
|
|
4
4
|
* Loads the prebuilt Wikipedia trigram bloom filter and provides a
|
|
5
5
|
* paraphrase-rate estimator. Used by content/wikipedia-paraphrase rule.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
7
|
+
* v0.6.2 — bloom filter inlined as base64 to remove filesystem dependency.
|
|
8
|
+
* Production hotfix: Vercel serverless deployments couldn't resolve the
|
|
9
|
+
* relative file path. Inlining the 8 KB binary into the JS source removes
|
|
10
|
+
* deployment-config dependencies and makes the rule work in any runtime
|
|
11
|
+
* (Node, Bun, Cloudflare Workers, Vercel serverless, etc.).
|
|
12
|
+
*
|
|
13
|
+
* Bloom filter layout:
|
|
8
14
|
* m = 65536 bits (8192 bytes)
|
|
9
15
|
* k = 3 FNV-1a-32 hash functions with distinct seeds
|
|
10
16
|
*
|
|
11
17
|
* FP rate ~5% for the curated corpus of ~10 k unique trigrams.
|
|
18
|
+
*
|
|
19
|
+
* If the underlying corpus is regenerated via `bun run build-wikipedia-bloom`,
|
|
20
|
+
* also re-run the inline script that produced BLOOM_BASE64 below — see
|
|
21
|
+
* `scripts/inline-wikipedia-bloom.ts` (or regenerate manually):
|
|
22
|
+
* node -e "console.log(require(node:fs).readFileSync(packages/core/data/wikipedia-trigrams.bin).toString(base64))"
|
|
12
23
|
*/
|
|
13
|
-
import { readFileSync } from "node:fs";
|
|
14
|
-
import { join, dirname } from "node:path";
|
|
15
|
-
import { fileURLToPath } from "node:url";
|
|
16
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
17
|
-
const DATA_PATH = join(__dirname, "..", "..", "data", "wikipedia-trigrams.bin");
|
|
24
|
+
const BLOOM_BASE64 = "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";
|
|
18
25
|
const BLOOM_BITS = 65536;
|
|
19
26
|
const BLOOM_K = 3;
|
|
20
27
|
const FNV_PRIME = 0x01000193;
|
|
@@ -28,12 +35,17 @@ function fnv1a32(str, seed) {
|
|
|
28
35
|
return hash;
|
|
29
36
|
}
|
|
30
37
|
let _cache = null;
|
|
31
|
-
/**
|
|
38
|
+
/** Decode and cache the bloom filter from the inlined base64 string. */
|
|
32
39
|
export function loadWikipediaBloomFilter() {
|
|
33
40
|
if (_cache !== null)
|
|
34
41
|
return _cache;
|
|
35
|
-
|
|
36
|
-
|
|
42
|
+
// Buffer.from is available in Node + Bun. For browser/edge runtimes that
|
|
43
|
+
// lack it, atob + manual conversion would be the fallback (not needed yet
|
|
44
|
+
// — the engine runs server-side only).
|
|
45
|
+
const decoded = typeof Buffer !== "undefined"
|
|
46
|
+
? Buffer.from(BLOOM_BASE64, "base64")
|
|
47
|
+
: Uint8Array.from(atob(BLOOM_BASE64), (c) => c.charCodeAt(0));
|
|
48
|
+
_cache = new Uint8Array(decoded.buffer, decoded.byteOffset, decoded.byteLength);
|
|
37
49
|
return _cache;
|
|
38
50
|
}
|
|
39
51
|
function bloomQuery(bits, trigram) {
|
|
@@ -57,25 +69,24 @@ function extractTrigrams(text) {
|
|
|
57
69
|
return trigrams;
|
|
58
70
|
}
|
|
59
71
|
/**
|
|
60
|
-
* Compute the
|
|
61
|
-
*
|
|
62
|
-
*
|
|
72
|
+
* Compute the paraphrase rate of `text` against the Wikipedia reference
|
|
73
|
+
* corpus. Returns a value in [0, 1] — the fraction of trigrams that are
|
|
74
|
+
* present in the bloom filter. Returns 0 for text shorter than 3 tokens.
|
|
63
75
|
*/
|
|
64
76
|
export function wikipediaParaphraseRate(text) {
|
|
65
|
-
if (!text || text.trim().length === 0)
|
|
66
|
-
return 0;
|
|
67
77
|
const trigrams = extractTrigrams(text);
|
|
68
78
|
if (trigrams.length === 0)
|
|
69
79
|
return 0;
|
|
70
80
|
const bits = loadWikipediaBloomFilter();
|
|
71
|
-
let
|
|
72
|
-
for (const
|
|
73
|
-
if (bloomQuery(bits,
|
|
74
|
-
|
|
81
|
+
let hits = 0;
|
|
82
|
+
for (const tg of trigrams) {
|
|
83
|
+
if (bloomQuery(bits, tg))
|
|
84
|
+
hits += 1;
|
|
75
85
|
}
|
|
76
|
-
return
|
|
86
|
+
return hits / trigrams.length;
|
|
77
87
|
}
|
|
78
|
-
/**
|
|
88
|
+
/** Test-only: reset the bloom-filter cache so loadWikipediaBloomFilter
|
|
89
|
+
* re-decodes the inlined base64 on next call. Used by unit tests. */
|
|
79
90
|
export function _resetBloomCache() {
|
|
80
91
|
_cache = null;
|
|
81
92
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wikipedia-paraphrase.js","sourceRoot":"","sources":["../../src/algorithms/wikipedia-paraphrase.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"wikipedia-paraphrase.js","sourceRoot":"","sources":["../../src/algorithms/wikipedia-paraphrase.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,MAAM,YAAY,GAAG,8qVAA8qV,CAAC;AAEpsV,MAAM,UAAU,GAAG,KAAK,CAAC;AACzB,MAAM,OAAO,GAAG,CAAC,CAAC;AAClB,MAAM,SAAS,GAAG,UAAU,CAAC;AAC7B,MAAM,SAAS,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;AAEvD,SAAS,OAAO,CAAC,GAAW,EAAE,IAAY;IACxC,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,CAAC;IACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,IAAI,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,IAAI,MAAM,GAAsB,IAAI,CAAC;AAErC,wEAAwE;AACxE,MAAM,UAAU,wBAAwB;IACtC,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IACnC,yEAAyE;IACzE,0EAA0E;IAC1E,uCAAuC;IACvC,MAAM,OAAO,GAAG,OAAO,MAAM,KAAK,WAAW;QAC3C,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC;QACrC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAChE,MAAM,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAChF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,UAAU,CAAC,IAAgB,EAAE,OAAe;IACnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;QACjC,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC;QACxD,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;IAC9D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,MAAM,MAAM,GAAG,IAAI;SAChB,WAAW,EAAE;SACb,OAAO,CAAC,oBAAoB,EAAE,GAAG,CAAC;SAClC,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,OAAO,CAAC,CAAC;IACnB,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAY;IAClD,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,wBAAwB,EAAE,CAAC;IACxC,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC1B,IAAI,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;YAAE,IAAI,IAAI,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC;AAChC,CAAC;AAED;sEACsE;AACtE,MAAM,UAAU,gBAAgB;IAC9B,MAAM,GAAG,IAAI,CAAC;AAChB,CAAC"}
|
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
import type { ParsedPage, RuleResult } from "../../types.js";
|
|
2
2
|
export declare function robotsSitemapPresenceRule(source: string): Promise<RuleResult[]>;
|
|
3
|
+
/**
|
|
4
|
+
* Parse all `Sitemap:` directive URLs from a robots.txt string.
|
|
5
|
+
*
|
|
6
|
+
* Case-insensitive per the Sitemaps protocol spec. Multiple occurrences are
|
|
7
|
+
* allowed and all are returned. Comment lines and blank lines are skipped.
|
|
8
|
+
* Leading/trailing whitespace around the URL value is stripped.
|
|
9
|
+
*
|
|
10
|
+
* Returns `[]` when no `Sitemap:` directives are present.
|
|
11
|
+
*/
|
|
12
|
+
export declare function parseSitemapDirectives(robotsTxt: string): string[];
|
|
3
13
|
/**
|
|
4
14
|
* Parses Disallow directives from the `User-agent: *` block of a robots.txt string.
|
|
5
15
|
* Returns an array of raw pattern strings (e.g. "/secret", "/templates/", "/*.json").
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"robots-sitemap-presence.d.ts","sourceRoot":"","sources":["../../../src/rules/tech/robots-sitemap-presence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAc7D,wBAAsB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAqDrF;AAED;;;GAGG;AACH,6FAA6F;AAC7F,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAmBhE;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,GAAE,SAAS,MAAM,EAAU,GAAG,MAAM,EAAE,CA+BxG;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CA8B5E;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,UAAU,EAAE,EACnB,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,EACxB,gBAAgB,EAAE,MAAM,GACvB,UAAU,EAAE,CA+Bd"}
|
|
1
|
+
{"version":3,"file":"robots-sitemap-presence.d.ts","sourceRoot":"","sources":["../../../src/rules/tech/robots-sitemap-presence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAc7D,wBAAsB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAqDrF;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAYlE;AAED;;;GAGG;AACH,6FAA6F;AAC7F,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAmBhE;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,GAAE,SAAS,MAAM,EAAU,GAAG,MAAM,EAAE,CA+BxG;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CA8B5E;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,UAAU,EAAE,EACnB,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,EACxB,gBAAgB,EAAE,MAAM,GACvB,UAAU,EAAE,CA+Bd"}
|
|
@@ -58,6 +58,30 @@ export async function robotsSitemapPresenceRule(source) {
|
|
|
58
58
|
}
|
|
59
59
|
return findings;
|
|
60
60
|
}
|
|
61
|
+
/**
|
|
62
|
+
* Parse all `Sitemap:` directive URLs from a robots.txt string.
|
|
63
|
+
*
|
|
64
|
+
* Case-insensitive per the Sitemaps protocol spec. Multiple occurrences are
|
|
65
|
+
* allowed and all are returned. Comment lines and blank lines are skipped.
|
|
66
|
+
* Leading/trailing whitespace around the URL value is stripped.
|
|
67
|
+
*
|
|
68
|
+
* Returns `[]` when no `Sitemap:` directives are present.
|
|
69
|
+
*/
|
|
70
|
+
export function parseSitemapDirectives(robotsTxt) {
|
|
71
|
+
const sitemaps = [];
|
|
72
|
+
for (const rawLine of robotsTxt.split(/\r?\n/)) {
|
|
73
|
+
const line = rawLine.trim();
|
|
74
|
+
if (!line || line.startsWith("#"))
|
|
75
|
+
continue;
|
|
76
|
+
const m = /^sitemap\s*:\s*(.+)/i.exec(line);
|
|
77
|
+
if (m) {
|
|
78
|
+
const url = m[1].trim();
|
|
79
|
+
if (url)
|
|
80
|
+
sitemaps.push(url);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return sitemaps;
|
|
84
|
+
}
|
|
61
85
|
/**
|
|
62
86
|
* Parses Disallow directives from the `User-agent: *` block of a robots.txt string.
|
|
63
87
|
* Returns an array of raw pattern strings (e.g. "/secret", "/templates/", "/*.json").
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"robots-sitemap-presence.js","sourceRoot":"","sources":["../../../src/rules/tech/robots-sitemap-presence.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"robots-sitemap-presence.js","sourceRoot":"","sources":["../../../src/rules/tech/robots-sitemap-presence.ts"],"names":[],"mappings":"AAEA,KAAK,UAAU,aAAa,CAAC,GAAW;IACtC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,MAAc;IAC5D,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAClC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;IAChC,MAAM,SAAS,GAAG,GAAG,MAAM,aAAa,CAAC;IACzC,MAAM,UAAU,GAAG,GAAG,MAAM,cAAc,CAAC;IAC3C,MAAM,QAAQ,GAAiB,EAAE,CAAC;IAElC,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,SAAS,CAAC,CAAC;IAClD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,QAAQ,CAAC,IAAI,CAAC;YACZ,MAAM,EAAE,8BAA8B;YACtC,QAAQ,EAAE,SAAS;YACnB,OAAO,EAAE,mBAAmB,SAAS,GAAG;YACxC,GAAG,EAAE,+BAA+B,SAAS,4DAA4D;SAC1G,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3C,QAAQ,CAAC,IAAI,CAAC;YACZ,MAAM,EAAE,8BAA8B;YACtC,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,GAAG,SAAS,wCAAwC;YAC7D,GAAG,EAAE,8BAA8B,SAAS,oBAAoB,UAAU,EAAE;SAC7E,CAAC,CAAC;IACL,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,aAAa,CAAC,UAAU,CAAC,CAAC;IACpD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,QAAQ,CAAC,IAAI,CAAC;YACZ,MAAM,EAAE,8BAA8B;YACtC,QAAQ,EAAE,SAAS;YACnB,OAAO,EAAE,mBAAmB,UAAU,GAAG;YACzC,GAAG,EAAE,4BAA4B,UAAU,wBAAwB,SAAS,GAAG;SAChF,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC;IAC1C,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QACvE,QAAQ,CAAC,IAAI,CAAC;YACZ,MAAM,EAAE,8BAA8B;YACtC,QAAQ,EAAE,SAAS;YACnB,OAAO,EAAE,GAAG,UAAU,kDAAkD;YACxE,GAAG,EAAE,UAAU,UAAU,6EAA6E;SACvG,CAAC,CAAC;IACL,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,sBAAsB,CAAC,SAAiB;IACtD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,OAAO,IAAI,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAC5C,MAAM,CAAC,GAAG,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,EAAE,CAAC;YACN,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACxB,IAAI,GAAG;gBAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,6FAA6F;AAC7F,MAAM,UAAU,sBAAsB,CAAC,SAAiB;IACtD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACvC,IAAI,eAAe,GAAG,KAAK,CAAC;IAC5B,KAAK,MAAM,OAAO,IAAI,KAAK,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAC5C,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAC7D,eAAe,GAAG,KAAK,KAAK,GAAG,CAAC;YAChC,SAAS;QACX,CAAC;QACD,IAAI,CAAC,eAAe;YAAE,SAAS;QAC/B,IAAI,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAC9D,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YACxB,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CAAC,SAAiB,EAAE,aAAgC,CAAC,GAAG,CAAC;IAC5F,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAC9D,IAAI,eAAe,GAAG,KAAK,CAAC;IAE5B,KAAK,MAAM,OAAO,IAAI,KAAK,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAE5B,gCAAgC;QAChC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAE5C,8BAA8B;QAC9B,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC3E,eAAe,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACnC,SAAS;QACX,CAAC;QAED,IAAI,CAAC,eAAe;YAAE,SAAS;QAE/B,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAC3D,iDAAiD;YACjD,IAAI,KAAK,EAAE,CAAC;gBACV,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAe,EAAE,OAAe;IACjE,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAE3B,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,yEAAyE;QACzE,2CAA2C;QAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACZ,8EAA8E;gBAC9E,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;oBAAE,OAAO,KAAK,CAAC;gBAC5C,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;YACpB,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBACvC,IAAI,GAAG,KAAK,CAAC,CAAC;oBAAE,OAAO,KAAK,CAAC;gBAC7B,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;YAC1B,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,+BAA+B;IAC/B,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,cAAc;IACd,OAAO,OAAO,KAAK,OAAO,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,KAAmB,EACnB,WAAwB,EACxB,gBAAwB;IAExB,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,gBAAgB,CAAC,CAAC;IACjE,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAE7C,MAAM,QAAQ,GAAiB,EAAE,CAAC;IAElC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,SAAS;QAEzC,IAAI,UAAkB,CAAC;QACvB,IAAI,CAAC;YACH,UAAU,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QAED,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;YACvC,IAAI,kBAAkB,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC;gBAC5C,QAAQ,CAAC,IAAI,CAAC;oBACZ,MAAM,EAAE,wBAAwB;oBAChC,QAAQ,EAAE,OAAO;oBACjB,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,2DAA2D,OAAO,IAAI;oBAC1F,OAAO,EAAE,IAAI,CAAC,GAAG;oBACjB,GAAG,EAAE,qEAAqE;iBAC3E,CAAC,CAAC;gBACH,MAAM,CAAC,iCAAiC;YAC1C,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pseolint/core",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.3",
|
|
4
4
|
"description": "Programmatic SEO audit engine — 32 rules across 4 categories (integrity, discoverability, citation, data) for SpamBrain risk + AI Overview citability. v0.4 verdict ladder + site classifier.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Ouranos Labs <contact@ouranos-labs.dev>",
|
|
@@ -31,8 +31,7 @@
|
|
|
31
31
|
"node": ">=18"
|
|
32
32
|
},
|
|
33
33
|
"files": [
|
|
34
|
-
"dist"
|
|
35
|
-
"data/wikipedia-trigrams.bin"
|
|
34
|
+
"dist"
|
|
36
35
|
],
|
|
37
36
|
"scripts": {
|
|
38
37
|
"build": "tsc -p tsconfig.json",
|
|
Binary file
|