@nanocollective/get-md 1.0.1 → 1.0.2
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 +0 -3
- package/dist/extractors/metadata-extractor.spec.d.ts +2 -0
- package/dist/extractors/metadata-extractor.spec.d.ts.map +1 -0
- package/dist/extractors/metadata-extractor.spec.js +486 -0
- package/dist/extractors/metadata-extractor.spec.js.map +1 -0
- package/dist/index.spec.d.ts +2 -0
- package/dist/index.spec.d.ts.map +1 -0
- package/dist/index.spec.js +518 -0
- package/dist/index.spec.js.map +1 -0
- package/dist/optimizers/html-cleaner.spec.d.ts +2 -0
- package/dist/optimizers/html-cleaner.spec.d.ts.map +1 -0
- package/dist/optimizers/html-cleaner.spec.js +351 -0
- package/dist/optimizers/html-cleaner.spec.js.map +1 -0
- package/dist/optimizers/llm-formatter.spec.d.ts +2 -0
- package/dist/optimizers/llm-formatter.spec.d.ts.map +1 -0
- package/dist/optimizers/llm-formatter.spec.js +276 -0
- package/dist/optimizers/llm-formatter.spec.js.map +1 -0
- package/dist/optimizers/structure-enhancer.spec.d.ts +2 -0
- package/dist/optimizers/structure-enhancer.spec.d.ts.map +1 -0
- package/dist/optimizers/structure-enhancer.spec.js +331 -0
- package/dist/optimizers/structure-enhancer.spec.js.map +1 -0
- package/dist/utils/url-fetcher.spec.d.ts +2 -0
- package/dist/utils/url-fetcher.spec.d.ts.map +1 -0
- package/dist/utils/url-fetcher.spec.js +206 -0
- package/dist/utils/url-fetcher.spec.js.map +1 -0
- package/dist/utils/validators.spec.d.ts +2 -0
- package/dist/utils/validators.spec.d.ts.map +1 -0
- package/dist/utils/validators.spec.js +290 -0
- package/dist/utils/validators.spec.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
// src/utils/validators.spec.ts
|
|
2
|
+
import test from "ava";
|
|
3
|
+
import { hasContent } from "./validators.js";
|
|
4
|
+
test("hasContent: returns true for HTML with sufficient text content", (t) => {
|
|
5
|
+
const html = `
|
|
6
|
+
<html>
|
|
7
|
+
<body>
|
|
8
|
+
<article>
|
|
9
|
+
<h1>Article Title</h1>
|
|
10
|
+
<p>This is a paragraph with enough text content to be considered valid content.
|
|
11
|
+
It contains more than 100 characters which is the threshold for content validation.</p>
|
|
12
|
+
</article>
|
|
13
|
+
</body>
|
|
14
|
+
</html>
|
|
15
|
+
`;
|
|
16
|
+
t.true(hasContent(html));
|
|
17
|
+
});
|
|
18
|
+
test("hasContent: returns false for HTML with insufficient text content", (t) => {
|
|
19
|
+
const html = `
|
|
20
|
+
<html>
|
|
21
|
+
<body>
|
|
22
|
+
<p>Short text</p>
|
|
23
|
+
</body>
|
|
24
|
+
</html>
|
|
25
|
+
`;
|
|
26
|
+
t.false(hasContent(html));
|
|
27
|
+
});
|
|
28
|
+
test("hasContent: returns false for empty HTML", (t) => {
|
|
29
|
+
t.false(hasContent(""));
|
|
30
|
+
});
|
|
31
|
+
test("hasContent: returns false for non-string input", (t) => {
|
|
32
|
+
t.false(hasContent(null));
|
|
33
|
+
t.false(hasContent(undefined));
|
|
34
|
+
t.false(hasContent(123));
|
|
35
|
+
t.false(hasContent({}));
|
|
36
|
+
t.false(hasContent([]));
|
|
37
|
+
});
|
|
38
|
+
test("hasContent: ignores script tags when counting content", (t) => {
|
|
39
|
+
const html = `
|
|
40
|
+
<html>
|
|
41
|
+
<body>
|
|
42
|
+
<script>
|
|
43
|
+
console.log("This script content should be ignored and not counted toward the 100 character minimum for content validation");
|
|
44
|
+
</script>
|
|
45
|
+
<p>Short</p>
|
|
46
|
+
</body>
|
|
47
|
+
</html>
|
|
48
|
+
`;
|
|
49
|
+
t.false(hasContent(html));
|
|
50
|
+
});
|
|
51
|
+
test("hasContent: ignores style tags when counting content", (t) => {
|
|
52
|
+
const html = `
|
|
53
|
+
<html>
|
|
54
|
+
<body>
|
|
55
|
+
<style>
|
|
56
|
+
body { font-family: Arial; }
|
|
57
|
+
.container { max-width: 1200px; }
|
|
58
|
+
This style content is long enough but should be ignored completely.
|
|
59
|
+
</style>
|
|
60
|
+
<p>Short</p>
|
|
61
|
+
</body>
|
|
62
|
+
</html>
|
|
63
|
+
`;
|
|
64
|
+
t.false(hasContent(html));
|
|
65
|
+
});
|
|
66
|
+
test("hasContent: ignores nav elements when counting content", (t) => {
|
|
67
|
+
const html = `
|
|
68
|
+
<html>
|
|
69
|
+
<body>
|
|
70
|
+
<nav>
|
|
71
|
+
<a href="/">Home</a>
|
|
72
|
+
<a href="/about">About</a>
|
|
73
|
+
<a href="/contact">Contact</a>
|
|
74
|
+
This navigation content should be ignored when checking for meaningful content in the document.
|
|
75
|
+
</nav>
|
|
76
|
+
<p>Short content</p>
|
|
77
|
+
</body>
|
|
78
|
+
</html>
|
|
79
|
+
`;
|
|
80
|
+
t.false(hasContent(html));
|
|
81
|
+
});
|
|
82
|
+
test("hasContent: ignores header elements when counting content", (t) => {
|
|
83
|
+
const html = `
|
|
84
|
+
<html>
|
|
85
|
+
<body>
|
|
86
|
+
<header>
|
|
87
|
+
<h1>Site Header</h1>
|
|
88
|
+
<p>This header content should be ignored when validating if the page has meaningful extractable content.</p>
|
|
89
|
+
</header>
|
|
90
|
+
<p>Brief text</p>
|
|
91
|
+
</body>
|
|
92
|
+
</html>
|
|
93
|
+
`;
|
|
94
|
+
t.false(hasContent(html));
|
|
95
|
+
});
|
|
96
|
+
test("hasContent: ignores footer elements when counting content", (t) => {
|
|
97
|
+
const html = `
|
|
98
|
+
<html>
|
|
99
|
+
<body>
|
|
100
|
+
<p>Short main content</p>
|
|
101
|
+
<footer>
|
|
102
|
+
<p>Copyright 2024. All rights reserved. This footer content should be ignored when checking content.</p>
|
|
103
|
+
</footer>
|
|
104
|
+
</body>
|
|
105
|
+
</html>
|
|
106
|
+
`;
|
|
107
|
+
t.false(hasContent(html));
|
|
108
|
+
});
|
|
109
|
+
test("hasContent: counts content from body after removing noise elements", (t) => {
|
|
110
|
+
const html = `
|
|
111
|
+
<html>
|
|
112
|
+
<body>
|
|
113
|
+
<header>Site Header with some text</header>
|
|
114
|
+
<nav>Navigation links here</nav>
|
|
115
|
+
<script>console.log("ignored");</script>
|
|
116
|
+
<style>.ignored { color: red; }</style>
|
|
117
|
+
<main>
|
|
118
|
+
<h1>Main Content</h1>
|
|
119
|
+
<p>This is the actual content of the page that should be counted. It has enough characters to pass the validation threshold of 100 characters.</p>
|
|
120
|
+
</main>
|
|
121
|
+
<footer>Footer text here</footer>
|
|
122
|
+
</body>
|
|
123
|
+
</html>
|
|
124
|
+
`;
|
|
125
|
+
t.true(hasContent(html));
|
|
126
|
+
});
|
|
127
|
+
test("hasContent: handles HTML with only whitespace", (t) => {
|
|
128
|
+
const html = `
|
|
129
|
+
<html>
|
|
130
|
+
<body>
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
</body>
|
|
135
|
+
</html>
|
|
136
|
+
`;
|
|
137
|
+
t.false(hasContent(html));
|
|
138
|
+
});
|
|
139
|
+
test("hasContent: handles malformed HTML gracefully", (t) => {
|
|
140
|
+
const html = "<div><p>Unclosed tags and malformed structure";
|
|
141
|
+
t.false(hasContent(html));
|
|
142
|
+
});
|
|
143
|
+
test("hasContent: returns false for HTML with only removed elements", (t) => {
|
|
144
|
+
const html = `
|
|
145
|
+
<html>
|
|
146
|
+
<body>
|
|
147
|
+
<script>alert("Only script content here with enough characters to exceed 100 if it were counted");</script>
|
|
148
|
+
<style>body { color: blue; padding: 20px; margin: 0; font-size: 16px; line-height: 1.5; }</style>
|
|
149
|
+
</body>
|
|
150
|
+
</html>
|
|
151
|
+
`;
|
|
152
|
+
t.false(hasContent(html));
|
|
153
|
+
});
|
|
154
|
+
test("hasContent: handles HTML with exactly 100 characters", (t) => {
|
|
155
|
+
// Create exactly 100 characters of content
|
|
156
|
+
const content = "a".repeat(100);
|
|
157
|
+
const html = `<html><body><p>${content}</p></body></html>`;
|
|
158
|
+
t.true(hasContent(html));
|
|
159
|
+
});
|
|
160
|
+
test("hasContent: handles HTML with 99 characters (just below threshold)", (t) => {
|
|
161
|
+
const content = "a".repeat(99);
|
|
162
|
+
const html = `<html><body><p>${content}</p></body></html>`;
|
|
163
|
+
t.false(hasContent(html));
|
|
164
|
+
});
|
|
165
|
+
test("hasContent: handles HTML with 101 characters (just above threshold)", (t) => {
|
|
166
|
+
const content = "a".repeat(101);
|
|
167
|
+
const html = `<html><body><p>${content}</p></body></html>`;
|
|
168
|
+
t.true(hasContent(html));
|
|
169
|
+
});
|
|
170
|
+
test("hasContent: handles deeply nested HTML structure", (t) => {
|
|
171
|
+
const html = `
|
|
172
|
+
<html>
|
|
173
|
+
<body>
|
|
174
|
+
<div>
|
|
175
|
+
<div>
|
|
176
|
+
<div>
|
|
177
|
+
<article>
|
|
178
|
+
<section>
|
|
179
|
+
<p>This is deeply nested content with enough text to be considered valid.
|
|
180
|
+
The validation should work regardless of nesting depth in the HTML structure.</p>
|
|
181
|
+
</section>
|
|
182
|
+
</article>
|
|
183
|
+
</div>
|
|
184
|
+
</div>
|
|
185
|
+
</div>
|
|
186
|
+
</body>
|
|
187
|
+
</html>
|
|
188
|
+
`;
|
|
189
|
+
t.true(hasContent(html));
|
|
190
|
+
});
|
|
191
|
+
test("hasContent: handles HTML parsing errors", (t) => {
|
|
192
|
+
const invalidHtml = "<<<>>>{{{}}}";
|
|
193
|
+
t.false(hasContent(invalidHtml));
|
|
194
|
+
});
|
|
195
|
+
test("hasContent: trims whitespace before checking length", (t) => {
|
|
196
|
+
const html = `
|
|
197
|
+
<html>
|
|
198
|
+
<body>
|
|
199
|
+
<p>
|
|
200
|
+
|
|
201
|
+
Content with lots of whitespace padding that should be trimmed before length check happens here and continues.
|
|
202
|
+
|
|
203
|
+
</p>
|
|
204
|
+
</body>
|
|
205
|
+
</html>
|
|
206
|
+
`;
|
|
207
|
+
t.true(hasContent(html));
|
|
208
|
+
});
|
|
209
|
+
test("hasContent: handles multiple paragraphs", (t) => {
|
|
210
|
+
const html = `
|
|
211
|
+
<html>
|
|
212
|
+
<body>
|
|
213
|
+
<p>First paragraph with some text.</p>
|
|
214
|
+
<p>Second paragraph with more text.</p>
|
|
215
|
+
<p>Third paragraph to ensure we exceed the 100 character threshold for content validation.</p>
|
|
216
|
+
</body>
|
|
217
|
+
</html>
|
|
218
|
+
`;
|
|
219
|
+
t.true(hasContent(html));
|
|
220
|
+
});
|
|
221
|
+
test("hasContent: handles list elements", (t) => {
|
|
222
|
+
const html = `
|
|
223
|
+
<html>
|
|
224
|
+
<body>
|
|
225
|
+
<ul>
|
|
226
|
+
<li>First item with some content</li>
|
|
227
|
+
<li>Second item with more content</li>
|
|
228
|
+
<li>Third item to ensure sufficient length for validation purposes and exceed threshold</li>
|
|
229
|
+
</ul>
|
|
230
|
+
</body>
|
|
231
|
+
</html>
|
|
232
|
+
`;
|
|
233
|
+
t.true(hasContent(html));
|
|
234
|
+
});
|
|
235
|
+
test("hasContent: handles HTML entities", (t) => {
|
|
236
|
+
const html = `
|
|
237
|
+
<html>
|
|
238
|
+
<body>
|
|
239
|
+
<p><This text contains HTML entities> and should be counted properly.
|
|
240
|
+
It has enough content to pass the validation threshold of 100 characters total.</p>
|
|
241
|
+
</body>
|
|
242
|
+
</html>
|
|
243
|
+
`;
|
|
244
|
+
t.true(hasContent(html));
|
|
245
|
+
});
|
|
246
|
+
test("hasContent: handles mixed content types", (t) => {
|
|
247
|
+
const html = `
|
|
248
|
+
<html>
|
|
249
|
+
<body>
|
|
250
|
+
<h1>Heading</h1>
|
|
251
|
+
<p>Paragraph text</p>
|
|
252
|
+
<blockquote>Quote text that adds to the total character count</blockquote>
|
|
253
|
+
<div>Division with additional content to ensure we pass validation</div>
|
|
254
|
+
</body>
|
|
255
|
+
</html>
|
|
256
|
+
`;
|
|
257
|
+
t.true(hasContent(html));
|
|
258
|
+
});
|
|
259
|
+
test("hasContent: handles empty body tag", (t) => {
|
|
260
|
+
const html = `<html><body></body></html>`;
|
|
261
|
+
t.false(hasContent(html));
|
|
262
|
+
});
|
|
263
|
+
test("hasContent: handles body with only whitespace and newlines", (t) => {
|
|
264
|
+
const html = `
|
|
265
|
+
<html>
|
|
266
|
+
<body>
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
</body>
|
|
271
|
+
</html>
|
|
272
|
+
`;
|
|
273
|
+
t.false(hasContent(html));
|
|
274
|
+
});
|
|
275
|
+
test("hasContent: ignores all noise elements combined", (t) => {
|
|
276
|
+
const html = `
|
|
277
|
+
<html>
|
|
278
|
+
<body>
|
|
279
|
+
<header>Header content with text</header>
|
|
280
|
+
<nav>Navigation content</nav>
|
|
281
|
+
<script>console.log("script");</script>
|
|
282
|
+
<style>body { color: red; }</style>
|
|
283
|
+
<footer>Footer content</footer>
|
|
284
|
+
<p>Only this short text should be counted</p>
|
|
285
|
+
</body>
|
|
286
|
+
</html>
|
|
287
|
+
`;
|
|
288
|
+
t.false(hasContent(html));
|
|
289
|
+
});
|
|
290
|
+
//# sourceMappingURL=validators.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validators.spec.js","sourceRoot":"","sources":["../../src/utils/validators.spec.ts"],"names":[],"mappings":"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"}
|