@rivi-software/agentic-seo-check 0.1.0 → 0.2.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/LICENSE +1 -1
- package/README.md +124 -18
- package/dist/brand.d.ts +11 -0
- package/dist/brand.js +22 -0
- package/dist/brand.js.map +1 -0
- package/dist/cli.js +174 -86
- package/dist/cli.js.map +1 -1
- package/dist/core/aeo/audit.d.ts +44 -0
- package/dist/core/aeo/audit.js +310 -0
- package/dist/core/aeo/audit.js.map +1 -0
- package/dist/core/aeo/bots.d.ts +30 -0
- package/dist/core/aeo/bots.js +299 -0
- package/dist/core/aeo/bots.js.map +1 -0
- package/dist/core/aeo/llms-txt.d.ts +8 -0
- package/dist/core/aeo/llms-txt.js +88 -0
- package/dist/core/aeo/llms-txt.js.map +1 -0
- package/dist/core/aeo/page.d.ts +53 -0
- package/dist/core/aeo/page.js +312 -0
- package/dist/core/aeo/page.js.map +1 -0
- package/dist/core/aeo/probe.d.ts +10 -0
- package/dist/core/aeo/probe.js +53 -0
- package/dist/core/aeo/probe.js.map +1 -0
- package/dist/core/aeo/site-rules.d.ts +13 -0
- package/dist/core/aeo/site-rules.js +178 -0
- package/dist/core/aeo/site-rules.js.map +1 -0
- package/dist/core/audit.d.ts +37 -16
- package/dist/core/audit.js +389 -249
- package/dist/core/audit.js.map +1 -1
- package/dist/core/concurrency.d.ts +4 -4
- package/dist/core/concurrency.js +33 -23
- package/dist/core/concurrency.js.map +1 -1
- package/dist/core/crawl.d.ts +9 -5
- package/dist/core/crawl.js +271 -123
- package/dist/core/crawl.js.map +1 -1
- package/dist/core/fetch.d.ts +5 -5
- package/dist/core/fetch.js +151 -100
- package/dist/core/fetch.js.map +1 -1
- package/dist/core/html/answer.d.ts +4 -0
- package/dist/core/html/answer.js +198 -0
- package/dist/core/html/answer.js.map +1 -0
- package/dist/core/html/dom.d.ts +17 -0
- package/dist/core/html/dom.js +83 -0
- package/dist/core/html/dom.js.map +1 -0
- package/dist/core/html/extract.d.ts +2 -2
- package/dist/core/html/extract.js +102 -111
- package/dist/core/html/extract.js.map +1 -1
- package/dist/core/html/structured-data.d.ts +16 -6
- package/dist/core/html/structured-data.js +180 -145
- package/dist/core/html/structured-data.js.map +1 -1
- package/dist/core/html/text.d.ts +14 -14
- package/dist/core/html/text.js +110 -107
- package/dist/core/html/text.js.map +1 -1
- package/dist/core/lighthouse.d.ts +26 -25
- package/dist/core/lighthouse.js +181 -105
- package/dist/core/lighthouse.js.map +1 -1
- package/dist/core/performance-rules.d.ts +2 -2
- package/dist/core/performance-rules.js +105 -33
- package/dist/core/performance-rules.js.map +1 -1
- package/dist/core/render-rules.d.ts +5 -4
- package/dist/core/render-rules.js +129 -62
- package/dist/core/render-rules.js.map +1 -1
- package/dist/core/render.d.ts +2 -2
- package/dist/core/render.js +29 -23
- package/dist/core/render.js.map +1 -1
- package/dist/core/report/markdown.d.ts +4 -2
- package/dist/core/report/markdown.js +210 -129
- package/dist/core/report/markdown.js.map +1 -1
- package/dist/core/robots.d.ts +12 -5
- package/dist/core/robots.js +43 -17
- package/dist/core/robots.js.map +1 -1
- package/dist/core/rules/aeo.d.ts +11 -0
- package/dist/core/rules/aeo.js +423 -0
- package/dist/core/rules/aeo.js.map +1 -0
- package/dist/core/rules/canonical.d.ts +1 -1
- package/dist/core/rules/canonical.js +93 -57
- package/dist/core/rules/canonical.js.map +1 -1
- package/dist/core/rules/content.js +40 -26
- package/dist/core/rules/content.js.map +1 -1
- package/dist/core/rules/document.js +64 -41
- package/dist/core/rules/document.js.map +1 -1
- package/dist/core/rules/headings.js +58 -38
- package/dist/core/rules/headings.js.map +1 -1
- package/dist/core/rules/hreflang.js +70 -38
- package/dist/core/rules/hreflang.js.map +1 -1
- package/dist/core/rules/images.js +44 -26
- package/dist/core/rules/images.js.map +1 -1
- package/dist/core/rules/index.d.ts +10 -6
- package/dist/core/rules/index.js +43 -36
- package/dist/core/rules/index.js.map +1 -1
- package/dist/core/rules/indexing.d.ts +2 -2
- package/dist/core/rules/indexing.js +48 -26
- package/dist/core/rules/indexing.js.map +1 -1
- package/dist/core/rules/keyword.js +84 -47
- package/dist/core/rules/keyword.js.map +1 -1
- package/dist/core/rules/links.js +72 -37
- package/dist/core/rules/links.js.map +1 -1
- package/dist/core/rules/meta.js +55 -34
- package/dist/core/rules/meta.js.map +1 -1
- package/dist/core/rules/response.js +75 -41
- package/dist/core/rules/response.js.map +1 -1
- package/dist/core/rules/rule.d.ts +6 -6
- package/dist/core/rules/rule.js +36 -36
- package/dist/core/rules/rule.js.map +1 -1
- package/dist/core/rules/social.js +86 -45
- package/dist/core/rules/social.js.map +1 -1
- package/dist/core/rules/structured-data.d.ts +6 -4
- package/dist/core/rules/structured-data.js +314 -102
- package/dist/core/rules/structured-data.js.map +1 -1
- package/dist/core/rules/title.js +48 -33
- package/dist/core/rules/title.js.map +1 -1
- package/dist/core/score.d.ts +5 -3
- package/dist/core/score.js +11 -9
- package/dist/core/score.js.map +1 -1
- package/dist/core/site-rules.d.ts +3 -3
- package/dist/core/site-rules.js +409 -198
- package/dist/core/site-rules.js.map +1 -1
- package/dist/core/sitemap.d.ts +5 -5
- package/dist/core/sitemap.js +109 -64
- package/dist/core/sitemap.js.map +1 -1
- package/dist/core/static.d.ts +2 -2
- package/dist/core/static.js +210 -112
- package/dist/core/static.js.map +1 -1
- package/dist/core/summary.d.ts +2 -2
- package/dist/core/summary.js +11 -6
- package/dist/core/summary.js.map +1 -1
- package/dist/core/types.d.ts +189 -14
- package/dist/core/types.js +15 -8
- package/dist/core/types.js.map +1 -1
- package/dist/core/url.d.ts +11 -11
- package/dist/core/url.js +122 -70
- package/dist/core/url.js.map +1 -1
- package/dist/index.d.ts +15 -11
- package/dist/index.js +11 -9
- package/dist/index.js.map +1 -1
- package/dist/mcp-bin.js +7 -4
- package/dist/mcp-bin.js.map +1 -1
- package/dist/mcp.d.ts +3 -3
- package/dist/mcp.js +437 -121
- package/dist/mcp.js.map +1 -1
- package/dist/version.d.ts +0 -1
- package/dist/version.js +4 -2
- package/dist/version.js.map +1 -1
- package/package.json +32 -10
- package/skills/seo-audit/SKILL.md +8 -2
|
@@ -1,185 +1,220 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
}
|
|
26
|
-
for (const node of flattenJsonLd(parsed, null))
|
|
27
|
-
items.push(node);
|
|
28
|
-
});
|
|
29
|
-
for (const item of extractMicrodata($))
|
|
30
|
-
items.push(item);
|
|
31
|
-
return { items, errors };
|
|
32
|
-
}
|
|
33
|
-
function stripCdata(text) {
|
|
34
|
-
return text
|
|
35
|
-
.replace(/^\s*<!--/, '')
|
|
36
|
-
.replace(/-->\s*$/, '')
|
|
37
|
-
.replace(/^\s*\/\*\s*<!\[CDATA\[\s*\*\//, '')
|
|
38
|
-
.replace(/\/\*\s*\]\]>\s*\*\/\s*$/, '')
|
|
39
|
-
.replace(/^\s*<!\[CDATA\[/, '')
|
|
40
|
-
.replace(/\]\]>\s*$/, '');
|
|
41
|
-
}
|
|
42
|
-
function flattenJsonLd(node, inheritedContext) {
|
|
43
|
-
if (Array.isArray(node))
|
|
44
|
-
return node.flatMap((n) => flattenJsonLd(n, inheritedContext));
|
|
45
|
-
if (!node || typeof node !== 'object')
|
|
46
|
-
return [];
|
|
47
|
-
const obj = node;
|
|
48
|
-
const context = contextString(obj['@context']) ?? inheritedContext;
|
|
49
|
-
if (Array.isArray(obj['@graph'])) {
|
|
50
|
-
return obj['@graph'].flatMap((n) => flattenJsonLd(n, context));
|
|
51
|
-
}
|
|
52
|
-
return [{ source: 'json-ld', types: typesOf(obj['@type']), context, data: obj }];
|
|
53
|
-
}
|
|
54
|
-
export function contextString(value) {
|
|
55
|
-
if (typeof value === 'string')
|
|
1
|
+
import { isTag } from "domhandler";
|
|
2
|
+
import { attr, childElements, hasAttr, queryAll, text } from "./dom.js";
|
|
3
|
+
import { collapseWhitespace } from "./text.js";
|
|
4
|
+
/** Whether a structured-data value is a string. */
|
|
5
|
+
export const isString = (value) => typeof value === "string";
|
|
6
|
+
/** Whether a structured-data value is an object with properties, rather than a list or a scalar. */
|
|
7
|
+
export const isJsonObject = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
8
|
+
const stripCdata = (source) => source
|
|
9
|
+
.replace(/^\s*<!--/u, "")
|
|
10
|
+
.replace(/-->\s*$/u, "")
|
|
11
|
+
.replace(/^\s*\/\*\s*<!\[CDATA\[\s*\*\//u, "")
|
|
12
|
+
.replace(/\/\*\s*\]\]>\s*\*\/\s*$/u, "")
|
|
13
|
+
.replace(/^\s*<!\[CDATA\[/u, "")
|
|
14
|
+
.replace(/\]\]>\s*$/u, "");
|
|
15
|
+
/** `https://schema.org/Article` -> `Article`, `schema:Article` -> `Article`. */
|
|
16
|
+
export const shortType = (type) => {
|
|
17
|
+
const t = type.trim();
|
|
18
|
+
const slash = t.lastIndexOf("/");
|
|
19
|
+
const colon = t.lastIndexOf(":");
|
|
20
|
+
const cut = Math.max(slash, t.startsWith("http") ? -1 : colon);
|
|
21
|
+
return cut >= 0 ? t.slice(cut + 1) : t;
|
|
22
|
+
};
|
|
23
|
+
export const contextString = (value) => {
|
|
24
|
+
if (isString(value)) {
|
|
56
25
|
return value;
|
|
26
|
+
}
|
|
57
27
|
if (Array.isArray(value)) {
|
|
58
28
|
for (const v of value) {
|
|
59
29
|
const s = contextString(v);
|
|
60
|
-
if (s)
|
|
30
|
+
if (s) {
|
|
61
31
|
return s;
|
|
32
|
+
}
|
|
62
33
|
}
|
|
63
34
|
return null;
|
|
64
35
|
}
|
|
65
|
-
if (value
|
|
66
|
-
const vocab = value[
|
|
67
|
-
if (
|
|
36
|
+
if (isJsonObject(value)) {
|
|
37
|
+
const vocab = value["@vocab"];
|
|
38
|
+
if (isString(vocab)) {
|
|
68
39
|
return vocab;
|
|
40
|
+
}
|
|
69
41
|
}
|
|
70
42
|
return null;
|
|
71
|
-
}
|
|
72
|
-
export
|
|
73
|
-
if (
|
|
43
|
+
};
|
|
44
|
+
export const typesOf = (value) => {
|
|
45
|
+
if (isString(value)) {
|
|
74
46
|
return [shortType(value)];
|
|
75
|
-
|
|
76
|
-
|
|
47
|
+
}
|
|
48
|
+
if (Array.isArray(value)) {
|
|
49
|
+
return value.filter(isString).map(shortType);
|
|
50
|
+
}
|
|
77
51
|
return [];
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
52
|
+
};
|
|
53
|
+
const flattenJsonLd = (node, inheritedContext) => {
|
|
54
|
+
if (Array.isArray(node)) {
|
|
55
|
+
return node.flatMap((n) => flattenJsonLd(n, inheritedContext));
|
|
56
|
+
}
|
|
57
|
+
if (!isJsonObject(node)) {
|
|
58
|
+
return [];
|
|
59
|
+
}
|
|
60
|
+
const context = contextString(node["@context"]) ?? inheritedContext;
|
|
61
|
+
const graph = node["@graph"];
|
|
62
|
+
if (Array.isArray(graph)) {
|
|
63
|
+
return graph.flatMap((n) => flattenJsonLd(n, context));
|
|
64
|
+
}
|
|
65
|
+
return [
|
|
66
|
+
{ source: "json-ld", types: typesOf(node["@type"]), context, data: node },
|
|
67
|
+
];
|
|
68
|
+
};
|
|
87
69
|
/* ---------------------------------------------------------------------------
|
|
88
70
|
* Microdata
|
|
89
71
|
* ------------------------------------------------------------------------- */
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
72
|
+
/** Elements whose microdata value is always one attribute, empty when it is missing. */
|
|
73
|
+
const URL_VALUE_ATTRIBUTES = new Map([
|
|
74
|
+
["meta", "content"],
|
|
75
|
+
["img", "src"],
|
|
76
|
+
["audio", "src"],
|
|
77
|
+
["embed", "src"],
|
|
78
|
+
["iframe", "src"],
|
|
79
|
+
["source", "src"],
|
|
80
|
+
["track", "src"],
|
|
81
|
+
["video", "src"],
|
|
82
|
+
["a", "href"],
|
|
83
|
+
["area", "href"],
|
|
84
|
+
["link", "href"],
|
|
85
|
+
["object", "data"],
|
|
86
|
+
]);
|
|
87
|
+
/** Elements whose microdata value is an attribute other than `content`, or else their text. */
|
|
88
|
+
const TEXT_VALUE_ATTRIBUTES = new Map([
|
|
89
|
+
["data", "value"],
|
|
90
|
+
["meter", "value"],
|
|
91
|
+
["time", "datetime"],
|
|
92
|
+
]);
|
|
93
|
+
const microdataValue = (el) => {
|
|
94
|
+
const tag = el.name.toLowerCase();
|
|
95
|
+
const urlAttribute = URL_VALUE_ATTRIBUTES.get(tag);
|
|
96
|
+
if (urlAttribute) {
|
|
97
|
+
return attr(el, urlAttribute) ?? "";
|
|
98
|
+
}
|
|
99
|
+
return (attr(el, TEXT_VALUE_ATTRIBUTES.get(tag) ?? "content") ??
|
|
100
|
+
collapseWhitespace(text(el)));
|
|
101
|
+
};
|
|
102
|
+
/** Walk descendants, stopping at nested itemscopes (they are added as a single property). */
|
|
103
|
+
const collectProps = (root, out) => {
|
|
104
|
+
for (const child of childElements(root)) {
|
|
105
|
+
if (hasAttr(child, "itemprop")) {
|
|
106
|
+
out.push(child);
|
|
107
|
+
}
|
|
108
|
+
if (!hasAttr(child, "itemscope")) {
|
|
109
|
+
collectProps(child, out);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
/** Whether an element sits inside another itemscope, which makes it a property, not an item. */
|
|
114
|
+
const hasItemscopeAncestor = (el) => {
|
|
115
|
+
for (let p = el.parent; p && isTag(p); p = p.parent) {
|
|
116
|
+
if (hasAttr(p, "itemscope")) {
|
|
117
|
+
return true;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return false;
|
|
121
|
+
};
|
|
122
|
+
const microdataObject = (scope) => {
|
|
107
123
|
const obj = {};
|
|
108
|
-
const itemtype =
|
|
124
|
+
const itemtype = attr(scope, "itemtype");
|
|
109
125
|
if (itemtype) {
|
|
110
|
-
const types = itemtype.split(/\s+/).filter(Boolean);
|
|
111
|
-
|
|
112
|
-
|
|
126
|
+
const types = itemtype.split(/\s+/u).filter(Boolean);
|
|
127
|
+
const [first] = types;
|
|
128
|
+
obj["@type"] = types.length === 1 && first ? first : types;
|
|
113
129
|
if (first) {
|
|
114
130
|
try {
|
|
115
131
|
const u = new URL(first);
|
|
116
|
-
obj[
|
|
132
|
+
obj["@context"] = `${u.protocol}//${u.host}`;
|
|
117
133
|
}
|
|
118
134
|
catch {
|
|
119
135
|
/* not a URL */
|
|
120
136
|
}
|
|
121
137
|
}
|
|
122
138
|
}
|
|
123
|
-
const itemid =
|
|
124
|
-
if (itemid)
|
|
125
|
-
obj[
|
|
139
|
+
const itemid = attr(scope, "itemid");
|
|
140
|
+
if (itemid) {
|
|
141
|
+
obj["@id"] = itemid;
|
|
142
|
+
}
|
|
126
143
|
const props = [];
|
|
127
|
-
collectProps(
|
|
144
|
+
collectProps(scope, props);
|
|
128
145
|
for (const el of props) {
|
|
129
|
-
const names = (
|
|
130
|
-
const value =
|
|
146
|
+
const names = (attr(el, "itemprop") ?? "").split(/\s+/u).filter(Boolean);
|
|
147
|
+
const value = hasAttr(el, "itemscope")
|
|
148
|
+
? microdataObject(el)
|
|
149
|
+
: microdataValue(el);
|
|
131
150
|
for (const name of names) {
|
|
132
151
|
const existing = obj[name];
|
|
133
|
-
if (existing === undefined)
|
|
152
|
+
if (existing === undefined) {
|
|
134
153
|
obj[name] = value;
|
|
135
|
-
|
|
154
|
+
}
|
|
155
|
+
else if (Array.isArray(existing)) {
|
|
136
156
|
existing.push(value);
|
|
137
|
-
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
138
159
|
obj[name] = [existing, value];
|
|
160
|
+
}
|
|
139
161
|
}
|
|
140
162
|
}
|
|
141
163
|
return obj;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
const
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
164
|
+
};
|
|
165
|
+
const extractMicrodata = (doc) => {
|
|
166
|
+
const items = [];
|
|
167
|
+
for (const el of queryAll(doc, "[itemscope]")) {
|
|
168
|
+
// Top-level scopes only: nested scopes become property values.
|
|
169
|
+
if (hasItemscopeAncestor(el)) {
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
const data = microdataObject(el);
|
|
173
|
+
items.push({
|
|
174
|
+
source: "microdata",
|
|
175
|
+
types: typesOf(data["@type"]),
|
|
176
|
+
context: contextString(data["@context"]),
|
|
177
|
+
data,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
return items;
|
|
181
|
+
};
|
|
182
|
+
export const extractStructuredData = (doc) => {
|
|
183
|
+
const items = [];
|
|
184
|
+
const errors = [];
|
|
185
|
+
for (const el of queryAll(doc, "script[type]")) {
|
|
186
|
+
const type = (attr(el, "type") ?? "").trim().toLowerCase();
|
|
187
|
+
if (type !== "application/ld+json") {
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
const raw = text(el).trim();
|
|
191
|
+
if (!raw) {
|
|
192
|
+
errors.push({
|
|
193
|
+
source: "json-ld",
|
|
194
|
+
message: "Empty JSON-LD script block",
|
|
195
|
+
snippet: "",
|
|
196
|
+
});
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
let parsed;
|
|
200
|
+
try {
|
|
201
|
+
parsed = JSON.parse(stripCdata(raw));
|
|
202
|
+
}
|
|
203
|
+
catch (error) {
|
|
204
|
+
errors.push({
|
|
205
|
+
source: "json-ld",
|
|
206
|
+
message: `Invalid JSON: ${error instanceof Error ? error.message : String(error)}`,
|
|
207
|
+
snippet: raw.slice(0, 200),
|
|
208
|
+
});
|
|
209
|
+
continue;
|
|
210
|
+
}
|
|
211
|
+
for (const node of flattenJsonLd(parsed, null)) {
|
|
212
|
+
items.push(node);
|
|
182
213
|
}
|
|
183
214
|
}
|
|
184
|
-
|
|
215
|
+
for (const item of extractMicrodata(doc)) {
|
|
216
|
+
items.push(item);
|
|
217
|
+
}
|
|
218
|
+
return { items, errors };
|
|
219
|
+
};
|
|
185
220
|
//# sourceMappingURL=structured-data.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"structured-data.js","sourceRoot":"","sources":["../../../src/core/html/structured-data.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"structured-data.js","sourceRoot":"","sources":["../../../src/core/html/structured-data.ts"],"names":[],"mappings":"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"}
|
package/dist/core/html/text.d.ts
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
/** Text analysis helpers: word counts, readability, placeholder detection. */
|
|
2
|
-
export declare
|
|
3
|
-
export declare
|
|
4
|
-
export declare
|
|
5
|
-
export declare
|
|
2
|
+
export declare const words: (text: string) => string[];
|
|
3
|
+
export declare const wordCount: (text: string) => number;
|
|
4
|
+
export declare const collapseWhitespace: (text: string) => string;
|
|
5
|
+
export declare const sentenceCount: (text: string) => number;
|
|
6
6
|
/** English syllable heuristic: vowel groups minus silent trailing e, min 1. */
|
|
7
|
-
export declare
|
|
7
|
+
export declare const syllables: (word: string) => number;
|
|
8
8
|
/**
|
|
9
9
|
* Flesch Reading Ease (English formula). Returns null when there is not enough text.
|
|
10
10
|
* 90-100 very easy, 60-70 plain English, 30-50 difficult, <30 very difficult.
|
|
11
11
|
*/
|
|
12
|
-
export declare
|
|
13
|
-
export declare
|
|
12
|
+
export declare const fleschReadingEase: (text: string) => number | null;
|
|
13
|
+
export declare const hasPlaceholderText: (text: string) => boolean;
|
|
14
14
|
export declare const GENERIC_TITLES: Set<string>;
|
|
15
|
-
export declare
|
|
15
|
+
export declare const isGenericTitle: (title: string) => boolean;
|
|
16
16
|
export declare const GENERIC_ANCHORS: Set<string>;
|
|
17
|
-
export declare
|
|
18
|
-
export declare
|
|
19
|
-
export declare
|
|
20
|
-
export declare
|
|
17
|
+
export declare const isGenericAnchor: (text: string) => boolean;
|
|
18
|
+
export declare const normalizeForComparison: (text: string) => string;
|
|
19
|
+
export declare const includesKeyword: (haystack: string | null | undefined, keyword: string) => boolean;
|
|
20
|
+
export declare const keywordOccurrences: (text: string, keyword: string) => number;
|
|
21
21
|
/** 5-word shingles for near-duplicate detection. */
|
|
22
|
-
export declare
|
|
23
|
-
export declare
|
|
22
|
+
export declare const shingles: (text: string, size?: number) => Set<string>;
|
|
23
|
+
export declare const jaccard: (a: Set<string>, b: Set<string>) => number;
|