@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.
Files changed (30) hide show
  1. package/README.md +0 -3
  2. package/dist/extractors/metadata-extractor.spec.d.ts +2 -0
  3. package/dist/extractors/metadata-extractor.spec.d.ts.map +1 -0
  4. package/dist/extractors/metadata-extractor.spec.js +486 -0
  5. package/dist/extractors/metadata-extractor.spec.js.map +1 -0
  6. package/dist/index.spec.d.ts +2 -0
  7. package/dist/index.spec.d.ts.map +1 -0
  8. package/dist/index.spec.js +518 -0
  9. package/dist/index.spec.js.map +1 -0
  10. package/dist/optimizers/html-cleaner.spec.d.ts +2 -0
  11. package/dist/optimizers/html-cleaner.spec.d.ts.map +1 -0
  12. package/dist/optimizers/html-cleaner.spec.js +351 -0
  13. package/dist/optimizers/html-cleaner.spec.js.map +1 -0
  14. package/dist/optimizers/llm-formatter.spec.d.ts +2 -0
  15. package/dist/optimizers/llm-formatter.spec.d.ts.map +1 -0
  16. package/dist/optimizers/llm-formatter.spec.js +276 -0
  17. package/dist/optimizers/llm-formatter.spec.js.map +1 -0
  18. package/dist/optimizers/structure-enhancer.spec.d.ts +2 -0
  19. package/dist/optimizers/structure-enhancer.spec.d.ts.map +1 -0
  20. package/dist/optimizers/structure-enhancer.spec.js +331 -0
  21. package/dist/optimizers/structure-enhancer.spec.js.map +1 -0
  22. package/dist/utils/url-fetcher.spec.d.ts +2 -0
  23. package/dist/utils/url-fetcher.spec.d.ts.map +1 -0
  24. package/dist/utils/url-fetcher.spec.js +206 -0
  25. package/dist/utils/url-fetcher.spec.js.map +1 -0
  26. package/dist/utils/validators.spec.d.ts +2 -0
  27. package/dist/utils/validators.spec.d.ts.map +1 -0
  28. package/dist/utils/validators.spec.js +290 -0
  29. package/dist/utils/validators.spec.js.map +1 -0
  30. package/package.json +1 -1
@@ -0,0 +1,331 @@
1
+ // src/optimizers/structure-enhancer.spec.ts
2
+ import test from "ava";
3
+ import { enhanceStructure } from "./structure-enhancer.js";
4
+ test("normalizes heading hierarchy - fixes skipped levels", (t) => {
5
+ const html = `
6
+ <div>
7
+ <h1>Title</h1>
8
+ <h5>Should be h2</h5>
9
+ </div>
10
+ `;
11
+ const result = enhanceStructure(html);
12
+ t.true(result.includes("<h1>Title</h1>"));
13
+ t.true(result.includes("<h2>Should be h2</h2>"));
14
+ t.false(result.includes("<h5>"));
15
+ });
16
+ test("normalizes heading hierarchy - respects proper sequence", (t) => {
17
+ const html = `
18
+ <div>
19
+ <h1>Level 1</h1>
20
+ <h2>Level 2</h2>
21
+ <h3>Level 3</h3>
22
+ </div>
23
+ `;
24
+ const result = enhanceStructure(html);
25
+ t.true(result.includes("<h1>Level 1</h1>"));
26
+ t.true(result.includes("<h2>Level 2</h2>"));
27
+ t.true(result.includes("<h3>Level 3</h3>"));
28
+ });
29
+ test("normalizes heading hierarchy - progressive adjustment", (t) => {
30
+ const html = `
31
+ <div>
32
+ <h1>H1</h1>
33
+ <h3>H3 becomes H2</h3>
34
+ <h6>H6 becomes H3</h6>
35
+ </div>
36
+ `;
37
+ const result = enhanceStructure(html);
38
+ t.true(result.includes("<h1>H1</h1>"));
39
+ t.true(result.includes("<h2>H3 becomes H2</h2>"));
40
+ t.true(result.includes("<h3>H6 becomes H3</h3>"));
41
+ t.false(result.includes("<h6>"));
42
+ });
43
+ test("normalizes heading hierarchy - handles multiple sections", (t) => {
44
+ const html = `
45
+ <div>
46
+ <h2>First section</h2>
47
+ <h3>Subsection</h3>
48
+ <h2>Second section</h2>
49
+ <h5>Should be h3</h5>
50
+ </div>
51
+ `;
52
+ const result = enhanceStructure(html);
53
+ // h2 at start becomes h1 (can't skip levels from 0)
54
+ t.true(result.includes("<h1>First section</h1>"));
55
+ // h3 after h1 becomes h2
56
+ t.true(result.includes("<h2>Subsection</h2>"));
57
+ // h2 after h2 stays h2
58
+ t.true(result.includes("<h2>Second section</h2>"));
59
+ // h5 after h2 becomes h3 (can only go up by 1)
60
+ t.true(result.includes("<h3>Should be h3</h3>"));
61
+ });
62
+ test("unwraps redundant nested divs", (t) => {
63
+ const html = `
64
+ <div>
65
+ <div>
66
+ <div>
67
+ <p>Content</p>
68
+ </div>
69
+ </div>
70
+ </div>
71
+ `;
72
+ const result = enhanceStructure(html);
73
+ t.true(result.includes("<p>Content</p>"));
74
+ // Should have fewer nested divs
75
+ const divCount = (result.match(/<div>/g) || []).length;
76
+ t.true(divCount < 3);
77
+ });
78
+ test("unwraps redundant nested spans", (t) => {
79
+ const html = `
80
+ <span>
81
+ <span>
82
+ Text content
83
+ </span>
84
+ </span>
85
+ `;
86
+ const result = enhanceStructure(html);
87
+ t.true(result.includes("Text content"));
88
+ // Should have fewer nested spans
89
+ const spanCount = (result.match(/<span>/g) || []).length;
90
+ t.true(spanCount < 2);
91
+ });
92
+ test("unwraps paragraphs containing block elements", (t) => {
93
+ const html = `
94
+ <div>
95
+ <p><div>Should be unwrapped</div></p>
96
+ <p><blockquote>Quote</blockquote></p>
97
+ <p><ul><li>List</li></ul></p>
98
+ </div>
99
+ `;
100
+ const result = enhanceStructure(html);
101
+ t.false(result.includes("<p><div>"));
102
+ t.false(result.includes("<p><blockquote>"));
103
+ t.false(result.includes("<p><ul>"));
104
+ t.true(result.includes("Should be unwrapped"));
105
+ t.true(result.includes("Quote"));
106
+ t.true(result.includes("List"));
107
+ });
108
+ test("preserves paragraphs with inline content", (t) => {
109
+ const html = `
110
+ <div>
111
+ <p>Normal paragraph with <strong>emphasis</strong></p>
112
+ <p><span>With span</span></p>
113
+ </div>
114
+ `;
115
+ const result = enhanceStructure(html);
116
+ t.true(result.includes("<p>Normal paragraph"));
117
+ t.true(result.includes("<strong>emphasis</strong>"));
118
+ });
119
+ test("converts title-classed divs to headings", (t) => {
120
+ const html = `
121
+ <div>
122
+ <div class="title">This looks like a title</div>
123
+ <p>Content</p>
124
+ </div>
125
+ `;
126
+ const result = enhanceStructure(html);
127
+ t.true(result.includes("<h3>This looks like a title</h3>"));
128
+ t.false(result.includes('class="title"'));
129
+ });
130
+ test("converts heading-classed divs to headings", (t) => {
131
+ const html = `
132
+ <div>
133
+ <div class="heading">Section Heading</div>
134
+ <p>Content</p>
135
+ </div>
136
+ `;
137
+ const result = enhanceStructure(html);
138
+ t.true(result.includes("<h3>Section Heading</h3>"));
139
+ });
140
+ test("converts bold styled divs to headings", (t) => {
141
+ const html = `
142
+ <div>
143
+ <div style="font-weight: bold">Bold Title</div>
144
+ <div style="font-weight:bold">Another Title</div>
145
+ <p>Content</p>
146
+ </div>
147
+ `;
148
+ const result = enhanceStructure(html);
149
+ t.true(result.includes("<h3>Bold Title</h3>"));
150
+ t.true(result.includes("<h3>Another Title</h3>"));
151
+ });
152
+ test("converts bold styled spans to headings", (t) => {
153
+ const html = `
154
+ <div>
155
+ <span style="font-weight: bold">Span Title</span>
156
+ <p>Content</p>
157
+ </div>
158
+ `;
159
+ const result = enhanceStructure(html);
160
+ t.true(result.includes("<h3>Span Title</h3>"));
161
+ });
162
+ test("does not convert long text to headings", (t) => {
163
+ const longText = "A".repeat(150);
164
+ const html = `
165
+ <div>
166
+ <div class="title">${longText}</div>
167
+ </div>
168
+ `;
169
+ const result = enhanceStructure(html);
170
+ t.false(result.includes("<h3>"));
171
+ t.true(result.includes(longText));
172
+ });
173
+ test("does not convert divs with children to headings", (t) => {
174
+ const html = `
175
+ <div>
176
+ <div class="title">
177
+ <span>Nested</span>
178
+ <span>Content</span>
179
+ </div>
180
+ </div>
181
+ `;
182
+ const result = enhanceStructure(html);
183
+ t.false(result.includes("<h3>"));
184
+ t.true(result.includes("<span>Nested</span>"));
185
+ });
186
+ test("does not convert empty divs to headings", (t) => {
187
+ const html = `
188
+ <div>
189
+ <div class="title"></div>
190
+ <p>Content</p>
191
+ </div>
192
+ `;
193
+ const result = enhanceStructure(html);
194
+ // Count h3 tags - should be 0
195
+ const h3Count = (result.match(/<h3>/g) || []).length;
196
+ t.is(h3Count, 0);
197
+ });
198
+ test("handles complex nested structure", (t) => {
199
+ const html = `
200
+ <div>
201
+ <h1>Main Title</h1>
202
+ <div>
203
+ <div>
204
+ <h5>Should be h2</h5>
205
+ <div class="title">Pseudo heading</div>
206
+ <p><blockquote>Quote</blockquote></p>
207
+ </div>
208
+ </div>
209
+ </div>
210
+ `;
211
+ const result = enhanceStructure(html);
212
+ t.true(result.includes("<h1>Main Title</h1>"));
213
+ t.true(result.includes("<h2>Should be h2</h2>"));
214
+ t.true(result.includes("<h3>Pseudo heading</h3>"));
215
+ t.false(result.includes("<p><blockquote>"));
216
+ });
217
+ test("preserves heading content with HTML entities", (t) => {
218
+ const html = `
219
+ <div>
220
+ <h1>Title &amp; Subtitle</h1>
221
+ <h5>Second &lt;Level&gt;</h5>
222
+ </div>
223
+ `;
224
+ const result = enhanceStructure(html);
225
+ t.true(result.includes("Title &amp; Subtitle"));
226
+ t.true(result.includes("Second &lt;Level&gt;"));
227
+ });
228
+ test("handles headings with nested elements", (t) => {
229
+ const html = `
230
+ <div>
231
+ <h1>Title <strong>with emphasis</strong></h1>
232
+ <h5>Level <em>five</em></h5>
233
+ </div>
234
+ `;
235
+ const result = enhanceStructure(html);
236
+ t.true(result.includes("<h1>Title <strong>with emphasis</strong></h1>"));
237
+ t.true(result.includes("<h2>Level <em>five</em></h2>"));
238
+ });
239
+ test("handles empty input", (t) => {
240
+ const result = enhanceStructure("");
241
+ t.truthy(result);
242
+ });
243
+ test("handles input with no transformations needed", (t) => {
244
+ const html = `
245
+ <div>
246
+ <h1>Title</h1>
247
+ <h2>Subtitle</h2>
248
+ <p>Content</p>
249
+ </div>
250
+ `;
251
+ const result = enhanceStructure(html);
252
+ t.true(result.includes("<h1>Title</h1>"));
253
+ t.true(result.includes("<h2>Subtitle</h2>"));
254
+ t.true(result.includes("<p>Content</p>"));
255
+ });
256
+ test("converts multiple pseudo-headings in same document", (t) => {
257
+ const html = `
258
+ <div>
259
+ <div class="title">First Title</div>
260
+ <p>Content 1</p>
261
+ <div class="heading">Second Title</div>
262
+ <p>Content 2</p>
263
+ <span style="font-weight: bold">Third Title</span>
264
+ <p>Content 3</p>
265
+ </div>
266
+ `;
267
+ const result = enhanceStructure(html);
268
+ t.true(result.includes("<h3>First Title</h3>"));
269
+ t.true(result.includes("<h3>Second Title</h3>"));
270
+ t.true(result.includes("<h3>Third Title</h3>"));
271
+ });
272
+ test("handles case-insensitive class matching", (t) => {
273
+ const html = `
274
+ <div>
275
+ <div class="Title">Mixed Case Title</div>
276
+ <div class="HEADING">Upper Case Heading</div>
277
+ </div>
278
+ `;
279
+ const result = enhanceStructure(html);
280
+ t.true(result.includes("<h3>Mixed Case Title</h3>"));
281
+ t.true(result.includes("<h3>Upper Case Heading</h3>"));
282
+ });
283
+ test("unwraps nested paragraphs with pre elements", (t) => {
284
+ const html = `
285
+ <div>
286
+ <p><pre>Code block</pre></p>
287
+ </div>
288
+ `;
289
+ const result = enhanceStructure(html);
290
+ t.false(result.includes("<p><pre>"));
291
+ t.true(result.includes("<pre>Code block</pre>"));
292
+ });
293
+ test("unwraps nested paragraphs with table elements", (t) => {
294
+ const html = `
295
+ <div>
296
+ <p><table><tr><td>Cell</td></tr></table></p>
297
+ </div>
298
+ `;
299
+ const result = enhanceStructure(html);
300
+ t.false(result.includes("<p><table>"));
301
+ t.true(result.includes("<table>"));
302
+ });
303
+ test("preserves paragraph with multiple inline elements", (t) => {
304
+ const html = `
305
+ <div>
306
+ <p><strong>Bold</strong> and <em>italic</em> text</p>
307
+ </div>
308
+ `;
309
+ const result = enhanceStructure(html);
310
+ t.true(result.includes("<p>"));
311
+ t.true(result.includes("<strong>Bold</strong>"));
312
+ t.true(result.includes("<em>italic</em>"));
313
+ });
314
+ test("handles heading hierarchy reset across sections", (t) => {
315
+ const html = `
316
+ <div>
317
+ <h1>Section 1</h1>
318
+ <h2>Subsection</h2>
319
+ </div>
320
+ <div>
321
+ <h1>Section 2</h1>
322
+ <h2>Subsection</h2>
323
+ </div>
324
+ `;
325
+ const result = enhanceStructure(html);
326
+ const h1Count = (result.match(/<h1>/g) || []).length;
327
+ const h2Count = (result.match(/<h2>/g) || []).length;
328
+ t.is(h1Count, 2);
329
+ t.is(h2Count, 2);
330
+ });
331
+ //# sourceMappingURL=structure-enhancer.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structure-enhancer.spec.js","sourceRoot":"","sources":["../../src/optimizers/structure-enhancer.spec.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAE5C,OAAO,IAAI,MAAM,KAAK,CAAC;AACvB,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,IAAI,CAAC,qDAAqD,EAAE,CAAC,CAAC,EAAE,EAAE;IAChE,MAAM,IAAI,GAAG;;;;;GAKZ,CAAC;IACF,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yDAAyD,EAAE,CAAC,CAAC,EAAE,EAAE;IACpE,MAAM,IAAI,GAAG;;;;;;GAMZ,CAAC;IACF,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC;AAC9C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uDAAuD,EAAE,CAAC,CAAC,EAAE,EAAE;IAClE,MAAM,IAAI,GAAG;;;;;;GAMZ,CAAC;IACF,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,0DAA0D,EAAE,CAAC,CAAC,EAAE,EAAE;IACrE,MAAM,IAAI,GAAG;;;;;;;GAOZ,CAAC;IACF,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,oDAAoD;IACpD,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAC,CAAC;IAClD,yBAAyB;IACzB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC,CAAC;IAC/C,uBAAuB;IACvB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC,CAAC;IACnD,+CAA+C;IAC/C,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC,CAAC;AACnD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,+BAA+B,EAAE,CAAC,CAAC,EAAE,EAAE;IAC1C,MAAM,IAAI,GAAG;;;;;;;;GAQZ,CAAC;IACF,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC1C,gCAAgC;IAChC,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IACvD,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gCAAgC,EAAE,CAAC,CAAC,EAAE,EAAE;IAC3C,MAAM,IAAI,GAAG;;;;;;GAMZ,CAAC;IACF,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC;IACxC,iCAAiC;IACjC,MAAM,SAAS,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IACzD,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;AACxB,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,8CAA8C,EAAE,CAAC,CAAC,EAAE,EAAE;IACzD,MAAM,IAAI,GAAG;;;;;;GAMZ,CAAC;IACF,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IACpC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IACjC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AAClC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,0CAA0C,EAAE,CAAC,CAAC,EAAE,EAAE;IACrD,MAAM,IAAI,GAAG;;;;;GAKZ,CAAC;IACF,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,2BAA2B,CAAC,CAAC,CAAC;AACvD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yCAAyC,EAAE,CAAC,CAAC,EAAE,EAAE;IACpD,MAAM,IAAI,GAAG;;;;;GAKZ,CAAC;IACF,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,kCAAkC,CAAC,CAAC,CAAC;IAC5D,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC;AAC5C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,2CAA2C,EAAE,CAAC,CAAC,EAAE,EAAE;IACtD,MAAM,IAAI,GAAG;;;;;GAKZ,CAAC;IACF,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,0BAA0B,CAAC,CAAC,CAAC;AACtD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uCAAuC,EAAE,CAAC,CAAC,EAAE,EAAE;IAClD,MAAM,IAAI,GAAG;;;;;;GAMZ,CAAC;IACF,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAC,CAAC;AACpD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,wCAAwC,EAAE,CAAC,CAAC,EAAE,EAAE;IACnD,MAAM,IAAI,GAAG;;;;;GAKZ,CAAC;IACF,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,wCAAwC,EAAE,CAAC,CAAC,EAAE,EAAE;IACnD,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG;;2BAEY,QAAQ;;GAEhC,CAAC;IACF,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IACjC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;AACpC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iDAAiD,EAAE,CAAC,CAAC,EAAE,EAAE;IAC5D,MAAM,IAAI,GAAG;;;;;;;GAOZ,CAAC;IACF,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IACjC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yCAAyC,EAAE,CAAC,CAAC,EAAE,EAAE;IACpD,MAAM,IAAI,GAAG;;;;;GAKZ,CAAC;IACF,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,8BAA8B;IAC9B,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IACrD,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;AACnB,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,kCAAkC,EAAE,CAAC,CAAC,EAAE,EAAE;IAC7C,MAAM,IAAI,GAAG;;;;;;;;;;;GAWZ,CAAC;IACF,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC;AAC9C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,8CAA8C,EAAE,CAAC,CAAC,EAAE,EAAE;IACzD,MAAM,IAAI,GAAG;;;;;GAKZ,CAAC;IACF,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC,CAAC;AAClD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uCAAuC,EAAE,CAAC,CAAC,EAAE,EAAE;IAClD,MAAM,IAAI,GAAG;;;;;GAKZ,CAAC;IACF,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,+CAA+C,CAAC,CAAC,CAAC;IACzE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,8BAA8B,CAAC,CAAC,CAAC;AAC1D,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAC,EAAE,EAAE;IAChC,MAAM,MAAM,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACnB,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,8CAA8C,EAAE,CAAC,CAAC,EAAE,EAAE;IACzD,MAAM,IAAI,GAAG;;;;;;GAMZ,CAAC;IACF,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC;AAC5C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,oDAAoD,EAAE,CAAC,CAAC,EAAE,EAAE;IAC/D,MAAM,IAAI,GAAG;;;;;;;;;GASZ,CAAC;IACF,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC,CAAC;AAClD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yCAAyC,EAAE,CAAC,CAAC,EAAE,EAAE;IACpD,MAAM,IAAI,GAAG;;;;;GAKZ,CAAC;IACF,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,2BAA2B,CAAC,CAAC,CAAC;IACrD,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,6BAA6B,CAAC,CAAC,CAAC;AACzD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,6CAA6C,EAAE,CAAC,CAAC,EAAE,EAAE;IACxD,MAAM,IAAI,GAAG;;;;GAIZ,CAAC;IACF,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC,CAAC;AACnD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,+CAA+C,EAAE,CAAC,CAAC,EAAE,EAAE;IAC1D,MAAM,IAAI,GAAG;;;;GAIZ,CAAC;IACF,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;AACrC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mDAAmD,EAAE,CAAC,CAAC,EAAE,EAAE;IAC9D,MAAM,IAAI,GAAG;;;;GAIZ,CAAC;IACF,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/B,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC;AAC7C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iDAAiD,EAAE,CAAC,CAAC,EAAE,EAAE;IAC5D,MAAM,IAAI,GAAG;;;;;;;;;GASZ,CAAC;IACF,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IACrD,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IACrD,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACjB,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;AACnB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=url-fetcher.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-fetcher.spec.d.ts","sourceRoot":"","sources":["../../src/utils/url-fetcher.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,206 @@
1
+ // src/utils/url-fetcher.spec.ts
2
+ import test from "ava";
3
+ import { fetchUrl, isValidUrl } from "./url-fetcher.js";
4
+ // Add cleanup hook to force exit after tests complete
5
+ test.after.always("cleanup", () => {
6
+ // Give a brief moment for cleanup, then force exit
7
+ setTimeout(() => {
8
+ process.exit(0);
9
+ }, 100);
10
+ });
11
+ // Mock fetch for testing
12
+ const createMockFetch = (response) => {
13
+ return async () => ({
14
+ ok: true,
15
+ status: 200,
16
+ statusText: "OK",
17
+ text: async () => "<html><body>Test</body></html>",
18
+ ...response,
19
+ });
20
+ };
21
+ test("fetchUrl: successfully fetches HTML from a URL", async (t) => {
22
+ const mockHtml = "<html><body>Test content</body></html>";
23
+ global.fetch = createMockFetch({
24
+ text: async () => mockHtml,
25
+ });
26
+ const result = await fetchUrl("https://example.com");
27
+ t.is(result, mockHtml);
28
+ });
29
+ test("fetchUrl: uses custom user agent", async (t) => {
30
+ const customUserAgent = "CustomBot/1.0";
31
+ let capturedHeaders;
32
+ global.fetch = (async (_url, init) => {
33
+ capturedHeaders = init?.headers;
34
+ return {
35
+ ok: true,
36
+ status: 200,
37
+ statusText: "OK",
38
+ text: async () => "<html><body>Test</body></html>",
39
+ };
40
+ });
41
+ await fetchUrl("https://example.com", { userAgent: customUserAgent });
42
+ t.truthy(capturedHeaders);
43
+ if (capturedHeaders &&
44
+ typeof capturedHeaders === "object" &&
45
+ !Array.isArray(capturedHeaders)) {
46
+ t.is(capturedHeaders["User-Agent"], customUserAgent);
47
+ }
48
+ });
49
+ test("fetchUrl: handles followRedirects option set to false", async (t) => {
50
+ let capturedRedirect;
51
+ global.fetch = (async (_url, init) => {
52
+ capturedRedirect = init?.redirect;
53
+ return {
54
+ ok: true,
55
+ status: 200,
56
+ statusText: "OK",
57
+ text: async () => "<html><body>Test</body></html>",
58
+ };
59
+ });
60
+ await fetchUrl("https://example.com", { followRedirects: false });
61
+ t.is(capturedRedirect, "manual");
62
+ });
63
+ test("fetchUrl: handles followRedirects option set to true", async (t) => {
64
+ let capturedRedirect;
65
+ global.fetch = (async (_url, init) => {
66
+ capturedRedirect = init?.redirect;
67
+ return {
68
+ ok: true,
69
+ status: 200,
70
+ statusText: "OK",
71
+ text: async () => "<html><body>Test</body></html>",
72
+ };
73
+ });
74
+ await fetchUrl("https://example.com", { followRedirects: true });
75
+ t.is(capturedRedirect, "follow");
76
+ });
77
+ test("fetchUrl: merges custom headers", async (t) => {
78
+ const customHeaders = { Authorization: "Bearer token123" };
79
+ let capturedHeaders;
80
+ global.fetch = (async (_url, init) => {
81
+ capturedHeaders = init?.headers;
82
+ return {
83
+ ok: true,
84
+ status: 200,
85
+ statusText: "OK",
86
+ text: async () => "<html><body>Test</body></html>",
87
+ };
88
+ });
89
+ await fetchUrl("https://example.com", { headers: customHeaders });
90
+ t.truthy(capturedHeaders);
91
+ if (capturedHeaders &&
92
+ typeof capturedHeaders === "object" &&
93
+ !Array.isArray(capturedHeaders)) {
94
+ const headers = capturedHeaders;
95
+ t.is(headers.Authorization, "Bearer token123");
96
+ t.truthy(headers["User-Agent"]);
97
+ }
98
+ });
99
+ test("fetchUrl: throws error on HTTP 404 status", async (t) => {
100
+ global.fetch = createMockFetch({
101
+ ok: false,
102
+ status: 404,
103
+ statusText: "Not Found",
104
+ });
105
+ const error = await t.throwsAsync(fetchUrl("https://example.com"));
106
+ t.regex(error?.message ?? "", /HTTP 404: Not Found/);
107
+ });
108
+ test("fetchUrl: throws error on HTTP 500 status", async (t) => {
109
+ global.fetch = createMockFetch({
110
+ ok: false,
111
+ status: 500,
112
+ statusText: "Internal Server Error",
113
+ });
114
+ const error = await t.throwsAsync(fetchUrl("https://example.com"));
115
+ t.regex(error?.message ?? "", /HTTP 500: Internal Server Error/);
116
+ });
117
+ test("fetchUrl: handles network errors", async (t) => {
118
+ global.fetch = (async () => {
119
+ throw new Error("Network connection failed");
120
+ });
121
+ const error = await t.throwsAsync(fetchUrl("https://example.com"));
122
+ t.regex(error?.message ?? "", /Failed to fetch URL: Network connection failed/);
123
+ });
124
+ test("fetchUrl: handles timeout errors", async (t) => {
125
+ global.fetch = (async () => {
126
+ const error = new Error("Aborted");
127
+ error.name = "AbortError";
128
+ throw error;
129
+ });
130
+ const error = await t.throwsAsync(fetchUrl("https://example.com", { timeout: 50 }));
131
+ t.regex(error?.message ?? "", /Request timeout after 50ms/);
132
+ });
133
+ test("fetchUrl: handles non-Error exceptions", async (t) => {
134
+ global.fetch = (async () => {
135
+ // eslint-disable-next-line no-throw-literal
136
+ throw "String error";
137
+ });
138
+ // For non-Error exceptions, the promise will still reject
139
+ // We just need to verify it throws something
140
+ try {
141
+ await fetchUrl("https://example.com");
142
+ t.fail("Should have thrown an error");
143
+ }
144
+ catch (error) {
145
+ t.is(error, "String error");
146
+ }
147
+ });
148
+ test("isValidUrl: returns true for valid HTTP URLs", (t) => {
149
+ t.true(isValidUrl("http://example.com"));
150
+ t.true(isValidUrl("http://example.com/path"));
151
+ t.true(isValidUrl("http://example.com:8080"));
152
+ t.true(isValidUrl("http://subdomain.example.com"));
153
+ });
154
+ test("isValidUrl: returns true for valid HTTPS URLs", (t) => {
155
+ t.true(isValidUrl("https://example.com"));
156
+ t.true(isValidUrl("https://example.com/path/to/page"));
157
+ t.true(isValidUrl("https://subdomain.example.com"));
158
+ t.true(isValidUrl("https://example.com:443"));
159
+ });
160
+ test("isValidUrl: returns false for invalid protocols", (t) => {
161
+ t.false(isValidUrl("ftp://example.com"));
162
+ t.false(isValidUrl("file:///path/to/file"));
163
+ t.false(isValidUrl("javascript:alert(1)"));
164
+ t.false(isValidUrl("data:text/html,<h1>Test</h1>"));
165
+ });
166
+ test("isValidUrl: returns false for malformed URLs", (t) => {
167
+ t.false(isValidUrl("not-a-url"));
168
+ t.false(isValidUrl(""));
169
+ t.false(isValidUrl("htp://missing-t"));
170
+ t.false(isValidUrl("://no-protocol"));
171
+ });
172
+ test("isValidUrl: returns false for relative URLs", (t) => {
173
+ t.false(isValidUrl("/relative/path"));
174
+ t.false(isValidUrl("../relative/path"));
175
+ t.false(isValidUrl("./relative/path"));
176
+ t.false(isValidUrl("relative/path"));
177
+ });
178
+ test("isValidUrl: handles URLs with query parameters", (t) => {
179
+ t.true(isValidUrl("https://example.com?param=value"));
180
+ t.true(isValidUrl("https://example.com?param1=value1&param2=value2"));
181
+ t.true(isValidUrl("http://example.com/page?search=test&sort=asc"));
182
+ });
183
+ test("isValidUrl: handles URLs with fragments", (t) => {
184
+ t.true(isValidUrl("https://example.com#section"));
185
+ t.true(isValidUrl("https://example.com/page#anchor"));
186
+ t.true(isValidUrl("http://example.com/docs#intro"));
187
+ });
188
+ test("isValidUrl: handles URLs with authentication", (t) => {
189
+ t.true(isValidUrl("https://user:pass@example.com"));
190
+ t.true(isValidUrl("http://admin:secret@example.com:8080"));
191
+ });
192
+ test("isValidUrl: handles complex valid URLs", (t) => {
193
+ t.true(isValidUrl("https://user:pass@subdomain.example.com:8080/path/to/resource?query=value#fragment"));
194
+ t.true(isValidUrl("http://localhost:3000/api/users?filter=active"));
195
+ });
196
+ test("isValidUrl: rejects localhost without protocol", (t) => {
197
+ t.false(isValidUrl("localhost:3000"));
198
+ t.false(isValidUrl("127.0.0.1:8080"));
199
+ });
200
+ test("isValidUrl: handles IP addresses with protocol", (t) => {
201
+ t.true(isValidUrl("http://127.0.0.1"));
202
+ t.true(isValidUrl("https://192.168.1.1:8080"));
203
+ t.true(isValidUrl("http://[::1]"));
204
+ t.true(isValidUrl("http://[2001:db8::1]"));
205
+ });
206
+ //# sourceMappingURL=url-fetcher.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-fetcher.spec.js","sourceRoot":"","sources":["../../src/utils/url-fetcher.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=validators.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validators.spec.d.ts","sourceRoot":"","sources":["../../src/utils/validators.spec.ts"],"names":[],"mappings":""}