@nanocollective/get-md 1.0.0 → 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 (40) hide show
  1. package/LICENSE +3 -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.js +15 -2
  11. package/dist/optimizers/html-cleaner.js.map +1 -1
  12. package/dist/optimizers/html-cleaner.spec.d.ts +2 -0
  13. package/dist/optimizers/html-cleaner.spec.d.ts.map +1 -0
  14. package/dist/optimizers/html-cleaner.spec.js +351 -0
  15. package/dist/optimizers/html-cleaner.spec.js.map +1 -0
  16. package/dist/optimizers/llm-formatter.spec.d.ts +2 -0
  17. package/dist/optimizers/llm-formatter.spec.d.ts.map +1 -0
  18. package/dist/optimizers/llm-formatter.spec.js +276 -0
  19. package/dist/optimizers/llm-formatter.spec.js.map +1 -0
  20. package/dist/optimizers/structure-enhancer.spec.d.ts +2 -0
  21. package/dist/optimizers/structure-enhancer.spec.d.ts.map +1 -0
  22. package/dist/optimizers/structure-enhancer.spec.js +331 -0
  23. package/dist/optimizers/structure-enhancer.spec.js.map +1 -0
  24. package/dist/parsers/markdown-parser.d.ts +1 -0
  25. package/dist/parsers/markdown-parser.d.ts.map +1 -1
  26. package/dist/parsers/markdown-parser.js +52 -0
  27. package/dist/parsers/markdown-parser.js.map +1 -1
  28. package/dist/parsers/markdown-parser.spec.d.ts +2 -0
  29. package/dist/parsers/markdown-parser.spec.d.ts.map +1 -0
  30. package/dist/parsers/markdown-parser.spec.js +622 -0
  31. package/dist/parsers/markdown-parser.spec.js.map +1 -0
  32. package/dist/utils/url-fetcher.spec.d.ts +2 -0
  33. package/dist/utils/url-fetcher.spec.d.ts.map +1 -0
  34. package/dist/utils/url-fetcher.spec.js +206 -0
  35. package/dist/utils/url-fetcher.spec.js.map +1 -0
  36. package/dist/utils/validators.spec.d.ts +2 -0
  37. package/dist/utils/validators.spec.d.ts.map +1 -0
  38. package/dist/utils/validators.spec.js +290 -0
  39. package/dist/utils/validators.spec.js.map +1 -0
  40. package/package.json +1 -1
@@ -0,0 +1,351 @@
1
+ // src/optimizers/html-cleaner.spec.ts
2
+ import test from "ava";
3
+ import { cleanHTML } from "./html-cleaner.js";
4
+ test("removes script tags", (t) => {
5
+ const html = `
6
+ <div>
7
+ <p>Content</p>
8
+ <script>alert('test');</script>
9
+ </div>
10
+ `;
11
+ const result = cleanHTML(html);
12
+ t.false(result.includes("<script>"));
13
+ t.true(result.includes("Content"));
14
+ });
15
+ test("removes style tags", (t) => {
16
+ const html = `
17
+ <div>
18
+ <p>Content</p>
19
+ <style>.test { color: red; }</style>
20
+ </div>
21
+ `;
22
+ const result = cleanHTML(html);
23
+ t.false(result.includes("<style>"));
24
+ t.true(result.includes("Content"));
25
+ });
26
+ test("removes noscript tags", (t) => {
27
+ const html = `
28
+ <div>
29
+ <p>Content</p>
30
+ <noscript>No JS support</noscript>
31
+ </div>
32
+ `;
33
+ const result = cleanHTML(html);
34
+ t.false(result.includes("<noscript>"));
35
+ t.true(result.includes("Content"));
36
+ });
37
+ test("removes HTML comments", (t) => {
38
+ const html = `
39
+ <div>
40
+ <p>Content</p>
41
+ <!-- This is a comment -->
42
+ </div>
43
+ `;
44
+ const result = cleanHTML(html);
45
+ t.false(result.includes("<!-- This is a comment -->"));
46
+ t.true(result.includes("Content"));
47
+ });
48
+ test("removes navigation elements by role", (t) => {
49
+ const html = `
50
+ <div>
51
+ <nav role="navigation">Nav content</nav>
52
+ <div role="banner">Banner content</div>
53
+ <div role="complementary">Sidebar</div>
54
+ <footer role="contentinfo">Footer</footer>
55
+ <p>Main content</p>
56
+ </div>
57
+ `;
58
+ const result = cleanHTML(html);
59
+ t.false(result.includes("Nav content"));
60
+ t.false(result.includes("Banner content"));
61
+ t.false(result.includes("Sidebar"));
62
+ t.false(result.includes("Footer"));
63
+ t.true(result.includes("Main content"));
64
+ });
65
+ test("removes navigation elements by tag and class", (t) => {
66
+ const html = `
67
+ <div>
68
+ <nav class="navbar">Nav</nav>
69
+ <div class="navbar">Nav2</div>
70
+ <p>Content</p>
71
+ </div>
72
+ `;
73
+ const result = cleanHTML(html);
74
+ t.false(result.includes("Nav"));
75
+ t.false(result.includes("Nav2"));
76
+ t.true(result.includes("Content"));
77
+ });
78
+ test("removes aside elements", (t) => {
79
+ const html = `
80
+ <div>
81
+ <aside>Sidebar content</aside>
82
+ <p>Main content</p>
83
+ </div>
84
+ `;
85
+ const result = cleanHTML(html);
86
+ t.false(result.includes("Sidebar content"));
87
+ t.true(result.includes("Main content"));
88
+ });
89
+ test("removes ad elements", (t) => {
90
+ const html = `
91
+ <div>
92
+ <div class="ad">Advertisement</div>
93
+ <div class="ads">More ads</div>
94
+ <div class="advertisement">Yet more ads</div>
95
+ <p>Content</p>
96
+ </div>
97
+ `;
98
+ const result = cleanHTML(html);
99
+ t.false(result.includes("Advertisement"));
100
+ t.false(result.includes("More ads"));
101
+ t.false(result.includes("Yet more ads"));
102
+ t.true(result.includes("Content"));
103
+ });
104
+ test("removes social media elements", (t) => {
105
+ const html = `
106
+ <div>
107
+ <div class="social-share">Share this</div>
108
+ <div class="share-buttons">Share buttons</div>
109
+ <p>Content</p>
110
+ </div>
111
+ `;
112
+ const result = cleanHTML(html);
113
+ t.false(result.includes("Share this"));
114
+ t.false(result.includes("Share buttons"));
115
+ t.true(result.includes("Content"));
116
+ });
117
+ test("removes comment sections", (t) => {
118
+ const html = `
119
+ <div>
120
+ <div class="comments">Comments section</div>
121
+ <div id="comments">More comments</div>
122
+ <p>Content</p>
123
+ </div>
124
+ `;
125
+ const result = cleanHTML(html);
126
+ t.false(result.includes("Comments section"));
127
+ t.false(result.includes("More comments"));
128
+ t.true(result.includes("Content"));
129
+ });
130
+ test("removes cookie notices", (t) => {
131
+ const html = `
132
+ <div>
133
+ <div class="cookie-notice">We use cookies</div>
134
+ <p>Content</p>
135
+ </div>
136
+ `;
137
+ const result = cleanHTML(html);
138
+ t.false(result.includes("We use cookies"));
139
+ t.true(result.includes("Content"));
140
+ });
141
+ test("removes elements with noise text (short content)", (t) => {
142
+ const html = `
143
+ <div>
144
+ <div>Accept cookies now</div>
145
+ <div>Sign up for our newsletter</div>
146
+ <div>Follow us on social media</div>
147
+ </div>
148
+ `;
149
+ const result = cleanHTML(html);
150
+ // These short elements with noise keywords should be removed
151
+ t.false(result.includes("Accept cookies"));
152
+ t.false(result.includes("Sign up for"));
153
+ t.false(result.includes("Follow us"));
154
+ });
155
+ test("preserves elements with noise keywords if content is long", (t) => {
156
+ const html = `
157
+ <div>
158
+ <p>${"This article discusses cookie policy and how it affects your browsing. ".repeat(10)}</p>
159
+ </div>
160
+ `;
161
+ const result = cleanHTML(html);
162
+ t.true(result.includes("cookie policy"));
163
+ });
164
+ test("cleans attributes but keeps essential ones", (t) => {
165
+ const html = `
166
+ <div id="test" class="container" data-value="123">
167
+ <a href="https://example.com" target="_blank" rel="noopener">Link</a>
168
+ <img src="image.jpg" alt="Test" class="img-fluid" />
169
+ </div>
170
+ `;
171
+ const result = cleanHTML(html);
172
+ t.false(result.includes('id="test"'));
173
+ t.false(result.includes('class="container"'));
174
+ t.false(result.includes('target="_blank"'));
175
+ t.true(result.includes('href="https://example.com"'));
176
+ t.true(result.includes('src="image.jpg"'));
177
+ t.true(result.includes('alt="Test"'));
178
+ });
179
+ test("preserves data attributes on code elements", (t) => {
180
+ const html = `
181
+ <div>
182
+ <pre data-language="javascript"><code data-line="1">const x = 1;</code></pre>
183
+ </div>
184
+ `;
185
+ const result = cleanHTML(html);
186
+ t.true(result.includes('data-language="javascript"'));
187
+ t.true(result.includes('data-line="1"'));
188
+ });
189
+ test("preserves table attributes", (t) => {
190
+ const html = `
191
+ <table>
192
+ <tr>
193
+ <td colspan="2" rowspan="3" align="center">Cell</td>
194
+ </tr>
195
+ </table>
196
+ `;
197
+ const result = cleanHTML(html);
198
+ t.true(result.includes("colspan"));
199
+ t.true(result.includes("rowspan"));
200
+ t.true(result.includes("align"));
201
+ });
202
+ test("removes empty elements", (t) => {
203
+ const html = `
204
+ <div>
205
+ <p></p>
206
+ <div></div>
207
+ <h1>Title</h1>
208
+ <p>Content</p>
209
+ </div>
210
+ `;
211
+ const result = cleanHTML(html);
212
+ t.true(result.includes("<h1>Title</h1>"));
213
+ t.true(result.includes("<p>Content</p>"));
214
+ // Empty p and div should be removed
215
+ t.false(result.includes("<p></p>"));
216
+ });
217
+ test("removes elements with only punctuation", (t) => {
218
+ const html = `
219
+ <div>
220
+ <p>| - .</p>
221
+ <p>Real content</p>
222
+ </div>
223
+ `;
224
+ const result = cleanHTML(html);
225
+ t.true(result.includes("Real content"));
226
+ // Punctuation-only paragraph should be removed
227
+ const emptyPTags = (result.match(/<p>[\s|_.:;-]+<\/p>/g) || []).length;
228
+ t.is(emptyPTags, 0);
229
+ });
230
+ test("preserves images and iframes", (t) => {
231
+ const html = `
232
+ <div>
233
+ <img src="test.jpg" alt="Test" />
234
+ <iframe src="video.html"></iframe>
235
+ </div>
236
+ `;
237
+ const result = cleanHTML(html);
238
+ t.true(result.includes("<img"));
239
+ t.true(result.includes("<iframe"));
240
+ });
241
+ test("resolves relative URLs when baseUrl is provided", (t) => {
242
+ const html = `
243
+ <div>
244
+ <img src="/images/test.jpg" />
245
+ <a href="/page">Link</a>
246
+ </div>
247
+ `;
248
+ const result = cleanHTML(html, { baseUrl: "https://example.com" });
249
+ t.true(result.includes('src="https://example.com/images/test.jpg"'));
250
+ t.true(result.includes('href="https://example.com/page"'));
251
+ });
252
+ test("does not resolve absolute URLs", (t) => {
253
+ const html = `
254
+ <div>
255
+ <img src="https://other.com/image.jpg" />
256
+ <a href="https://other.com/page">Link</a>
257
+ </div>
258
+ `;
259
+ const result = cleanHTML(html, { baseUrl: "https://example.com" });
260
+ t.true(result.includes('src="https://other.com/image.jpg"'));
261
+ t.true(result.includes('href="https://other.com/page"'));
262
+ });
263
+ test("does not resolve data URLs", (t) => {
264
+ const html = `
265
+ <div>
266
+ <img src="data:image/png;base64,ABC123" />
267
+ </div>
268
+ `;
269
+ const result = cleanHTML(html, { baseUrl: "https://example.com" });
270
+ t.true(result.includes('src="data:image/png;base64,ABC123"'));
271
+ });
272
+ test("does not resolve anchor links", (t) => {
273
+ const html = `
274
+ <div>
275
+ <a href="#section">Jump to section</a>
276
+ </div>
277
+ `;
278
+ const result = cleanHTML(html, { baseUrl: "https://example.com" });
279
+ t.true(result.includes('href="#section"'));
280
+ });
281
+ test("does not resolve mailto links", (t) => {
282
+ const html = `
283
+ <div>
284
+ <a href="mailto:test@example.com">Email</a>
285
+ </div>
286
+ `;
287
+ const result = cleanHTML(html, { baseUrl: "https://example.com" });
288
+ t.true(result.includes('href="mailto:test@example.com"'));
289
+ });
290
+ test("skips aggressive cleaning when aggressive is false", (t) => {
291
+ const html = `
292
+ <div>
293
+ <nav role="navigation">Nav content</nav>
294
+ <aside>Sidebar</aside>
295
+ <p>Content</p>
296
+ </div>
297
+ `;
298
+ const result = cleanHTML(html, { aggressive: false });
299
+ t.true(result.includes("Nav content"));
300
+ t.true(result.includes("Sidebar"));
301
+ t.true(result.includes("Content"));
302
+ });
303
+ test("handles invalid URLs gracefully", (t) => {
304
+ const html = `
305
+ <div>
306
+ <img src="::invalid::" />
307
+ <a href="::invalid::">Link</a>
308
+ </div>
309
+ `;
310
+ t.notThrows(() => {
311
+ cleanHTML(html, { baseUrl: "https://example.com" });
312
+ });
313
+ });
314
+ test("handles complex nested structures", (t) => {
315
+ const html = `
316
+ <div>
317
+ <header role="banner">
318
+ <nav class="navbar">
319
+ <div class="social-share">Share</div>
320
+ </nav>
321
+ </header>
322
+ <main>
323
+ <article>
324
+ <h1>Title</h1>
325
+ <p>Content</p>
326
+ </article>
327
+ <aside>Sidebar</aside>
328
+ </main>
329
+ <footer role="contentinfo">Footer</footer>
330
+ </div>
331
+ `;
332
+ const result = cleanHTML(html);
333
+ t.true(result.includes("<h1>Title</h1>"));
334
+ t.true(result.includes("<p>Content</p>"));
335
+ t.false(result.includes("Share"));
336
+ t.false(result.includes("Sidebar"));
337
+ t.false(result.includes("Footer"));
338
+ });
339
+ test("preserves content in pre and code tags", (t) => {
340
+ const html = `
341
+ <div>
342
+ <pre data-lang="js"><code>const x = 1;</code></pre>
343
+ <p>Text</p>
344
+ </div>
345
+ `;
346
+ const result = cleanHTML(html);
347
+ t.true(result.includes("<pre"));
348
+ t.true(result.includes("<code>"));
349
+ t.true(result.includes("const x = 1;"));
350
+ });
351
+ //# sourceMappingURL=html-cleaner.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-cleaner.spec.js","sourceRoot":"","sources":["../../src/optimizers/html-cleaner.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=llm-formatter.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-formatter.spec.d.ts","sourceRoot":"","sources":["../../src/optimizers/llm-formatter.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,276 @@
1
+ // src/optimizers/llm-formatter.spec.ts
2
+ import test from "ava";
3
+ import { formatForLLM } from "./llm-formatter.js";
4
+ test("normalizes heading levels - prevents skipping levels", (t) => {
5
+ const markdown = `
6
+ # Level 1
7
+ ##### Level 5 (should become Level 2)
8
+ `.trim();
9
+ const result = formatForLLM(markdown);
10
+ t.true(result.includes("# Level 1"));
11
+ t.true(result.includes("## Level 5"));
12
+ t.false(result.includes("#####"));
13
+ });
14
+ test("normalizes heading levels - respects proper hierarchy", (t) => {
15
+ const markdown = `
16
+ # Level 1
17
+ ## Level 2
18
+ ### Level 3
19
+ `.trim();
20
+ const result = formatForLLM(markdown);
21
+ t.true(result.includes("# Level 1"));
22
+ t.true(result.includes("## Level 2"));
23
+ t.true(result.includes("### Level 3"));
24
+ });
25
+ test("normalizes heading levels - resets on blank sections", (t) => {
26
+ const markdown = `
27
+ # First Section
28
+ ## Subsection
29
+
30
+ # New Section
31
+ ##### Should become Level 2
32
+ `.trim();
33
+ const result = formatForLLM(markdown);
34
+ const lines = result.split("\n");
35
+ const newSectionIndex = lines.findIndex((l) => l.includes("New Section"));
36
+ const nextHeadingIndex = lines.findIndex((l, i) => i > newSectionIndex && l.includes("Should become"));
37
+ t.true(lines[nextHeadingIndex].startsWith("##"));
38
+ });
39
+ test("normalizes list markers - converts * to -", (t) => {
40
+ const markdown = `
41
+ * Item 1
42
+ * Item 2
43
+ + Item 3
44
+ `.trim();
45
+ const result = formatForLLM(markdown);
46
+ t.true(result.includes("- Item 1"));
47
+ t.true(result.includes("- Item 2"));
48
+ t.true(result.includes("- Item 3"));
49
+ t.false(result.includes("* Item"));
50
+ t.false(result.includes("+ Item"));
51
+ });
52
+ test("normalizes list indentation - uses 2 spaces", (t) => {
53
+ const markdown = `
54
+ - Item 1
55
+ - Nested 1
56
+ - Nested 2
57
+ - Nested 3
58
+ `.trim();
59
+ const result = formatForLLM(markdown);
60
+ t.true(result.includes("- Item 1"));
61
+ t.true(result.includes(" - Nested 1"));
62
+ t.true(result.includes(" - Nested 2"));
63
+ t.true(result.includes(" - Nested 3"));
64
+ });
65
+ test("normalizes list indentation - fixes inconsistent spacing", (t) => {
66
+ const markdown = `
67
+ - Item 1
68
+ - Nested (3 spaces)
69
+ - Deep nested (5 spaces)
70
+ `.trim();
71
+ const result = formatForLLM(markdown);
72
+ const lines = result.split("\n");
73
+ // Should normalize to proper 2-space indentation
74
+ t.true(lines.some((l) => l.match(/^ - Nested/)));
75
+ t.true(lines.some((l) => l.match(/^ - Deep nested/)));
76
+ });
77
+ test("cleans inline formatting - reduces excessive emphasis", (t) => {
78
+ const markdown = "This is ***very important*** text";
79
+ const result = formatForLLM(markdown);
80
+ t.true(result.includes("**very important**"));
81
+ t.false(result.includes("***"));
82
+ });
83
+ test("cleans inline formatting - removes spaces inside emphasis", (t) => {
84
+ const markdown = "This is ** spaced ** and * also spaced * text";
85
+ const result = formatForLLM(markdown);
86
+ t.true(result.includes("**spaced**"));
87
+ t.true(result.includes("*also spaced*"));
88
+ });
89
+ test("cleans inline formatting - handles multiple emphasis patterns", (t) => {
90
+ const markdown = "** bold ** and **** extra bold ****";
91
+ const result = formatForLLM(markdown);
92
+ t.true(result.includes("**bold**"));
93
+ t.true(result.includes("**extra bold**"));
94
+ });
95
+ test("enhances code blocks - adds line breaks before", (t) => {
96
+ const markdown = "Some text\`\`\`javascript\ncode\n\`\`\`";
97
+ const result = formatForLLM(markdown);
98
+ t.true(result.includes("Some text\n\n\`\`\`"));
99
+ });
100
+ test("enhances code blocks - adds line breaks after opening", (t) => {
101
+ const markdown = "\`\`\`javascriptcode here\`\`\`";
102
+ const result = formatForLLM(markdown);
103
+ t.true(result.includes("\`\`\`\njavascript"));
104
+ });
105
+ test("enhances code blocks - properly spaces full code block", (t) => {
106
+ const markdown = "Text\`\`\`js\nconst x = 1;\n\`\`\`More text";
107
+ const result = formatForLLM(markdown);
108
+ t.true(result.includes("Text\n\n\`\`\`"));
109
+ t.true(result.includes("\`\`\`\njs"));
110
+ });
111
+ test("optimizes link formatting - converts reference to inline", (t) => {
112
+ const markdown = `
113
+ This is a [link][ref] to something.
114
+
115
+ [ref]: https://example.com
116
+ `.trim();
117
+ const result = formatForLLM(markdown);
118
+ t.true(result.includes("[link](https://example.com)"));
119
+ t.false(result.includes("[ref]:"));
120
+ });
121
+ test("optimizes link formatting - handles implicit references", (t) => {
122
+ const markdown = `
123
+ This is a [link][] to something.
124
+
125
+ [link]: https://example.com
126
+ `.trim();
127
+ const result = formatForLLM(markdown);
128
+ t.true(result.includes("[link](https://example.com)"));
129
+ });
130
+ test("optimizes link formatting - handles multiple references", (t) => {
131
+ const markdown = `
132
+ [Link 1][ref1] and [Link 2][ref2].
133
+
134
+ [ref1]: https://example.com
135
+ [ref2]: https://other.com
136
+ `.trim();
137
+ const result = formatForLLM(markdown);
138
+ t.true(result.includes("[Link 1](https://example.com)"));
139
+ t.true(result.includes("[Link 2](https://other.com)"));
140
+ t.false(result.includes("[ref1]:"));
141
+ t.false(result.includes("[ref2]:"));
142
+ });
143
+ test("optimizes link formatting - case insensitive references", (t) => {
144
+ const markdown = `
145
+ [Link][REF]
146
+
147
+ [ref]: https://example.com
148
+ `.trim();
149
+ const result = formatForLLM(markdown);
150
+ t.true(result.includes("[Link](https://example.com)"));
151
+ });
152
+ test("optimizes link formatting - preserves unmatched references", (t) => {
153
+ const markdown = "[Link][missing]";
154
+ const result = formatForLLM(markdown);
155
+ t.true(result.includes("[Link][missing]"));
156
+ });
157
+ test("handles complex markdown with all transformations", (t) => {
158
+ const markdown = `
159
+ # Title
160
+ #### Should be h2
161
+
162
+ - Item 1
163
+ - Nested
164
+
165
+ This is ***bold*** and **emphasized**.
166
+
167
+ [Link][ref]
168
+
169
+ [ref]: https://example.com
170
+
171
+ Some text\`\`\`js
172
+ code
173
+ \`\`\`
174
+ `.trim();
175
+ const result = formatForLLM(markdown);
176
+ // Check heading normalization
177
+ t.true(result.includes("# Title"));
178
+ t.true(result.includes("## Should be h2"));
179
+ // Check list normalization
180
+ t.true(result.includes("- Item 1"));
181
+ t.true(result.includes(" - Nested"));
182
+ // Check inline formatting
183
+ t.true(result.includes("**bold**"));
184
+ t.true(result.includes("**emphasized**"));
185
+ // Check link optimization
186
+ t.true(result.includes("[Link](https://example.com)"));
187
+ // Check code block enhancement
188
+ t.true(result.includes("\n\n\`\`\`"));
189
+ });
190
+ test("preserves inline code", (t) => {
191
+ const markdown = "Use `const x = 1;` for variables";
192
+ const result = formatForLLM(markdown);
193
+ t.true(result.includes("`const x = 1;`"));
194
+ });
195
+ test("handles empty input", (t) => {
196
+ const result = formatForLLM("");
197
+ t.is(result, "");
198
+ });
199
+ test("handles markdown with no transformations needed", (t) => {
200
+ const markdown = `
201
+ # Title
202
+ ## Subtitle
203
+
204
+ - Item 1
205
+ - Item 2
206
+
207
+ This is normal text with **bold**.
208
+ `.trim();
209
+ const result = formatForLLM(markdown);
210
+ t.true(result.includes("# Title"));
211
+ t.true(result.includes("## Subtitle"));
212
+ t.true(result.includes("- Item 1"));
213
+ t.true(result.includes("**bold**"));
214
+ });
215
+ test("normalizes mixed list styles in same list", (t) => {
216
+ const markdown = `
217
+ * Item 1
218
+ + Item 2
219
+ - Item 3
220
+ `.trim();
221
+ const result = formatForLLM(markdown);
222
+ const lines = result.split("\n");
223
+ t.true(lines.every((l) => !l.trim() || l.trim().startsWith("- ")));
224
+ });
225
+ test("handles nested lists with mixed markers", (t) => {
226
+ const markdown = `
227
+ - Item 1
228
+ - Nested 1
229
+ - Deep nested
230
+ `.trim();
231
+ const result = formatForLLM(markdown);
232
+ t.true(result.includes("- Item 1"));
233
+ t.true(result.includes(" - Nested 1"));
234
+ t.true(result.includes(" - Deep nested"));
235
+ });
236
+ test("preserves ordered lists", (t) => {
237
+ const markdown = `
238
+ 1. First
239
+ 2. Second
240
+ 3. Third
241
+ `.trim();
242
+ const result = formatForLLM(markdown);
243
+ t.true(result.includes("1. First"));
244
+ t.true(result.includes("2. Second"));
245
+ t.true(result.includes("3. Third"));
246
+ });
247
+ test("handles code blocks with language identifiers", (t) => {
248
+ const markdown = "\`\`\`typescript\nconst x: number = 1;\n\`\`\`";
249
+ const result = formatForLLM(markdown);
250
+ t.true(result.includes("\`\`\`"));
251
+ t.true(result.includes("typescript"));
252
+ });
253
+ test("handles multiple consecutive emphasis correctly", (t) => {
254
+ const markdown = "**bold** and **more bold** text";
255
+ const result = formatForLLM(markdown);
256
+ t.true(result.includes("**bold**"));
257
+ t.true(result.includes("**more bold**"));
258
+ });
259
+ test("normalizes heading levels progressively", (t) => {
260
+ const markdown = `
261
+ # H1
262
+ ### H3 (stays H3, max jump is 2)
263
+ ##### H5 (stays H5, max jump is 2)
264
+ `.trim();
265
+ const result = formatForLLM(markdown);
266
+ const lines = result.split("\n");
267
+ t.true(lines[0].startsWith("#"));
268
+ t.is(lines[0].match(/^#+/)?.[0].length, 1);
269
+ // H3 is allowed because it's currentLevel (1) + 2 = 3
270
+ t.true(lines[1].startsWith("###"));
271
+ t.is(lines[1].match(/^#+/)?.[0].length, 3);
272
+ // H5 is allowed because it's currentLevel (3) + 2 = 5
273
+ t.true(lines[2].startsWith("#####"));
274
+ t.is(lines[2].match(/^#+/)?.[0].length, 5);
275
+ });
276
+ //# sourceMappingURL=llm-formatter.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-formatter.spec.js","sourceRoot":"","sources":["../../src/optimizers/llm-formatter.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=structure-enhancer.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structure-enhancer.spec.d.ts","sourceRoot":"","sources":["../../src/optimizers/structure-enhancer.spec.ts"],"names":[],"mappings":""}