webforai 1.3.1 → 1.3.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/dist/cjs/extract-hast/readability.js +23 -13
- package/dist/cjs/extract-hast/utils.js +1 -1
- package/dist/cjs/extract-mdast.js +47 -0
- package/dist/cjs/html-to-markdown.test.js +121 -1
- package/dist/cjs/html-to-mdast.js +3 -1
- package/dist/cjs/link-replacer.test.js +47 -0
- package/dist/cjs/loaders/fetch.js +34 -0
- package/dist/cjs/loaders/fetch.test.js +9 -0
- package/dist/cjs/loaders/playwright.js +4 -13
- package/dist/cjs/loaders/playwright.test.js +17 -0
- package/dist/cjs/mdast-handlers/custom-a-handler.js +5 -1
- package/dist/cjs/mdast-to-markdown.js +2 -1
- package/dist/extract-hast/readability.js +23 -13
- package/dist/extract-hast/utils.js +1 -1
- package/dist/extract-mdast.js +24 -0
- package/dist/html-to-markdown.test.js +99 -1
- package/dist/html-to-mdast.js +3 -1
- package/dist/link-replacer.test.js +47 -0
- package/dist/loaders/fetch.js +10 -0
- package/dist/loaders/fetch.test.js +9 -0
- package/dist/loaders/playwright.js +4 -13
- package/dist/loaders/playwright.test.js +17 -0
- package/dist/mdast-handlers/custom-a-handler.js +5 -1
- package/dist/mdast-to-markdown.js +2 -1
- package/dist/types/extract-hast/readability.js.map +1 -1
- package/dist/types/extract-hast/utils.js.map +1 -1
- package/dist/types/extract-mdast.d.ts +2 -0
- package/dist/types/extract-mdast.js.map +1 -0
- package/dist/types/html-to-mdast.js.map +1 -1
- package/dist/types/loaders/fetch.d.ts +9 -0
- package/dist/types/loaders/fetch.js.map +1 -0
- package/dist/types/loaders/playwright.d.ts +16 -2
- package/dist/types/loaders/playwright.js.map +1 -1
- package/dist/types/mdast-handlers/custom-a-handler.js.map +1 -1
- package/dist/types/mdast-to-markdown.js.map +1 -1
- package/package.json +6 -1
|
@@ -30,6 +30,7 @@ const UNLIKELY_ROLES = ["menu", "menubar", "complementary", "navigation", "alert
|
|
|
30
30
|
const REGEXPS = {
|
|
31
31
|
hidden: /hidden|invisible|fallback-image/i,
|
|
32
32
|
byline: /byline|author|dateline|writtenby|p-author/i,
|
|
33
|
+
specialUnlikelyCandidates: /frb-|uls-menu|language-link/i,
|
|
33
34
|
unlikelyCandidates: /-ad-|ai2html|banner|breadcrumbs|combx|comment|community|cover-wrap|disqus|extra|footer|gdpr|header|legends|menu|related|remark|replies|rss|shoutbox|sidebar|skyscraper|social|sponsor|supplemental|ad-break|agegate|pagination|pager|popup|yom-remote|speechify-ignore/i,
|
|
34
35
|
okMaybeItsaCandidate: /and|article|body|column|content|main|shadow|code/i
|
|
35
36
|
};
|
|
@@ -89,18 +90,31 @@ const unlikelyElementFilter = (node) => {
|
|
|
89
90
|
return true;
|
|
90
91
|
}
|
|
91
92
|
const element = node;
|
|
92
|
-
const match = (0, import_utils.matchString)(element);
|
|
93
93
|
if (["body", "article", "main", "section", "a"].includes(element.tagName)) {
|
|
94
94
|
return true;
|
|
95
95
|
}
|
|
96
96
|
if ((0, import_utils.hasAncestors)(element, ["table", "code"], 3)) {
|
|
97
97
|
return true;
|
|
98
98
|
}
|
|
99
|
+
const match = (0, import_utils.matchString)(element);
|
|
100
|
+
if (REGEXPS.specialUnlikelyCandidates.test(match)) {
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
99
103
|
if (REGEXPS.unlikelyCandidates.test(match) && !REGEXPS.okMaybeItsaCandidate.test(match)) {
|
|
100
104
|
return false;
|
|
101
105
|
}
|
|
102
106
|
return true;
|
|
103
107
|
};
|
|
108
|
+
const isImageLink = (element) => {
|
|
109
|
+
const a = (0, import_hast_util_select.select)("a", element);
|
|
110
|
+
const img = (0, import_hast_util_select.select)("img", a);
|
|
111
|
+
if (!(a && img)) {
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
const imgFilename = img.properties.src?.toString().split("/").pop();
|
|
115
|
+
const hrefFilename = a.properties.href?.toString().split("/").pop();
|
|
116
|
+
return imgFilename === hrefFilename && imgFilename;
|
|
117
|
+
};
|
|
104
118
|
const removeEmptyFilter = (node) => {
|
|
105
119
|
if (node.type !== "element") {
|
|
106
120
|
return true;
|
|
@@ -109,6 +123,9 @@ const removeEmptyFilter = (node) => {
|
|
|
109
123
|
if (!PARAGRAPH_TAGS.includes(element.tagName)) {
|
|
110
124
|
return true;
|
|
111
125
|
}
|
|
126
|
+
if (isImageLink(element)) {
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
112
129
|
const text = (0, import_hast_util_to_string.toString)(element);
|
|
113
130
|
if (text.length < 10) {
|
|
114
131
|
return false;
|
|
@@ -119,7 +136,7 @@ const readabilityExtractHast = (hast) => {
|
|
|
119
136
|
const lang = String((0, import_hast_util_select.select)("html", hast)?.properties.lang || tryGetLang(hast) || "en");
|
|
120
137
|
const body = (0, import_hast_util_select.select)("body", hast) ?? hast;
|
|
121
138
|
const proxiedHast = (0, import_unist_util_parents.parents)(body);
|
|
122
|
-
|
|
139
|
+
const baseFilterd = (0, import_unist_util_filter.filter)(proxiedHast, (node) => {
|
|
123
140
|
if (!metadataFilter(node)) {
|
|
124
141
|
return false;
|
|
125
142
|
}
|
|
@@ -133,17 +150,7 @@ const readabilityExtractHast = (hast) => {
|
|
|
133
150
|
}
|
|
134
151
|
const baseText = (0, import_hast_util_to_string.toString)(baseFilterd);
|
|
135
152
|
let minimalLength = lang in BASE_MINIMAL_LENGTH ? BASE_MINIMAL_LENGTH[lang] : 500;
|
|
136
|
-
if (baseText.length
|
|
137
|
-
const filterd = (0, import_unist_util_filter.filter)(baseFilterd, (node) => {
|
|
138
|
-
if (!unlikelyElementFilter(node)) {
|
|
139
|
-
return false;
|
|
140
|
-
}
|
|
141
|
-
return true;
|
|
142
|
-
});
|
|
143
|
-
if (filterd) {
|
|
144
|
-
baseFilterd = filterd;
|
|
145
|
-
}
|
|
146
|
-
} else {
|
|
153
|
+
if (baseText.length < minimalLength) {
|
|
147
154
|
minimalLength = Math.max(0, baseText.length - 200);
|
|
148
155
|
}
|
|
149
156
|
let bodyTree = baseFilterd;
|
|
@@ -168,6 +175,9 @@ const readabilityExtractHast = (hast) => {
|
|
|
168
175
|
if (!removeEmptyFilter(node)) {
|
|
169
176
|
return false;
|
|
170
177
|
}
|
|
178
|
+
if (!unlikelyElementFilter(node)) {
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
171
181
|
return true;
|
|
172
182
|
});
|
|
173
183
|
return finalTree;
|
|
@@ -24,7 +24,7 @@ __export(utils_exports, {
|
|
|
24
24
|
matchString: () => matchString
|
|
25
25
|
});
|
|
26
26
|
module.exports = __toCommonJS(utils_exports);
|
|
27
|
-
const matchString = (element) => `${element.tagName} ${element.properties.id} ${classnames(element).join(" ")}
|
|
27
|
+
const matchString = (element) => `${element.tagName} ${element.properties.id} ${classnames(element).join(" ")}`;
|
|
28
28
|
const classnames = (element) => {
|
|
29
29
|
if (Array.isArray(element.properties.className)) {
|
|
30
30
|
return element.properties.className;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var extract_mdast_exports = {};
|
|
20
|
+
__export(extract_mdast_exports, {
|
|
21
|
+
extractMdast: () => extractMdast
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(extract_mdast_exports);
|
|
24
|
+
var import_unist_util_filter = require("unist-util-filter");
|
|
25
|
+
const DECLATION_TYPES = ["blockquote", "strong", "emphasis", "delete"];
|
|
26
|
+
const emptyDeclarationFilter = (node) => {
|
|
27
|
+
if (!DECLATION_TYPES.includes(node.type)) {
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
if (node.children.length === 0) {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
return true;
|
|
34
|
+
};
|
|
35
|
+
const extractMdast = (node) => {
|
|
36
|
+
const extracted = (0, import_unist_util_filter.filter)(node, (node2) => {
|
|
37
|
+
if (!emptyDeclarationFilter(node2)) {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
return true;
|
|
41
|
+
});
|
|
42
|
+
return extracted;
|
|
43
|
+
};
|
|
44
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
45
|
+
0 && (module.exports = {
|
|
46
|
+
extractMdast
|
|
47
|
+
});
|
|
@@ -1,10 +1,35 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __copyProps = (to, from, except, desc) => {
|
|
9
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
10
|
+
for (let key of __getOwnPropNames(from))
|
|
11
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
12
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
13
|
+
}
|
|
14
|
+
return to;
|
|
15
|
+
};
|
|
16
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
17
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
18
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
19
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
20
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
21
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
22
|
+
mod
|
|
23
|
+
));
|
|
2
24
|
var import_fastest_levenshtein = require("fastest-levenshtein");
|
|
3
25
|
var import_vitest = require("vitest");
|
|
4
26
|
var import_html_to_markdown = require("./html-to-markdown");
|
|
27
|
+
var import_fetch = require("./loaders/fetch");
|
|
5
28
|
const html = `
|
|
6
29
|
<h1>Hello, world!</h1>
|
|
7
30
|
<p>This is a paragraph.</p>
|
|
31
|
+
<a href="/example.html">Example</a>
|
|
32
|
+
<img src="/example.jpg" alt="Example" />
|
|
8
33
|
<ul>
|
|
9
34
|
<li>Item 1</li>
|
|
10
35
|
<li>Item 2</li>
|
|
@@ -14,13 +39,108 @@ const expected = `# Hello, world!
|
|
|
14
39
|
|
|
15
40
|
This is a paragraph.
|
|
16
41
|
|
|
42
|
+
[Example](/example.html)
|
|
43
|
+
|
|
44
|
+

|
|
45
|
+
|
|
17
46
|
* Item 1
|
|
18
47
|
* Item 2
|
|
19
48
|
`;
|
|
49
|
+
const baseUrlReplaced = `# Hello, world!
|
|
50
|
+
|
|
51
|
+
This is a paragraph.
|
|
52
|
+
|
|
53
|
+
[Example](https://example.com/example.html)
|
|
54
|
+
|
|
55
|
+

|
|
56
|
+
|
|
57
|
+
* Item 1
|
|
58
|
+
* Item 2
|
|
59
|
+
`;
|
|
60
|
+
const linkAsText = `# Hello, world!
|
|
61
|
+
|
|
62
|
+
This is a paragraph.
|
|
63
|
+
|
|
64
|
+
Example
|
|
65
|
+
|
|
66
|
+

|
|
67
|
+
|
|
68
|
+
- Item 1
|
|
69
|
+
- Item 2
|
|
70
|
+
`;
|
|
71
|
+
const imageHidden = `# Hello, world!
|
|
72
|
+
|
|
73
|
+
This is a paragraph.
|
|
74
|
+
|
|
75
|
+
[Example](/example.html)
|
|
76
|
+
|
|
77
|
+
- Item 1
|
|
78
|
+
- Item 2
|
|
79
|
+
`;
|
|
80
|
+
const htmlTable = `
|
|
81
|
+
<table>
|
|
82
|
+
<tr>
|
|
83
|
+
<th>Header 1</th>
|
|
84
|
+
<th>Header 2</th>
|
|
85
|
+
</tr>
|
|
86
|
+
<tr>
|
|
87
|
+
<td>Cell 1</td>
|
|
88
|
+
<td>Cell 2</td>
|
|
89
|
+
</tr>
|
|
90
|
+
</table>
|
|
91
|
+
`;
|
|
92
|
+
const expectedTableMarkdown = `
|
|
93
|
+
| Header 1 | Header 2 |
|
|
94
|
+
| -------- | -------- |
|
|
95
|
+
| Cell 1 | Cell 2 |
|
|
96
|
+
`;
|
|
97
|
+
const expectedTableText = `Header 1 Header 2
|
|
98
|
+
Cell 1 Cell 2`;
|
|
20
99
|
(0, import_vitest.describe)("htmlToMarkdown", () => {
|
|
21
100
|
(0, import_vitest.it)("should convert HTML to Markdown", () => {
|
|
22
101
|
const markdown = (0, import_html_to_markdown.htmlToMarkdown)(html, { extractors: false });
|
|
23
102
|
const d = (0, import_fastest_levenshtein.distance)(markdown, expected);
|
|
24
|
-
(0, import_vitest.expect)(d).lte(
|
|
103
|
+
(0, import_vitest.expect)(d).lte(5);
|
|
104
|
+
});
|
|
105
|
+
(0, import_vitest.it)("should convert HTML to Markdown with replaced base URL", () => {
|
|
106
|
+
const markdown = (0, import_html_to_markdown.htmlToMarkdown)(html, { baseUrl: "https://example.com", extractors: false });
|
|
107
|
+
const d = (0, import_fastest_levenshtein.distance)(markdown, baseUrlReplaced);
|
|
108
|
+
(0, import_vitest.expect)(d).lte(5);
|
|
109
|
+
});
|
|
110
|
+
(0, import_vitest.it)("should convert HTML to Markdown with links as text", () => {
|
|
111
|
+
const markdown = (0, import_html_to_markdown.htmlToMarkdown)(html, { linkAsText: true, extractors: false });
|
|
112
|
+
const d = (0, import_fastest_levenshtein.distance)(markdown, linkAsText);
|
|
113
|
+
(0, import_vitest.expect)(d).lte(5);
|
|
114
|
+
});
|
|
115
|
+
(0, import_vitest.it)("should convert HTML to Markdown with hidden images", () => {
|
|
116
|
+
const markdown = (0, import_html_to_markdown.htmlToMarkdown)(html, { hideImage: true, extractors: false });
|
|
117
|
+
const d = (0, import_fastest_levenshtein.distance)(markdown, imageHidden);
|
|
118
|
+
(0, import_vitest.expect)(d).lte(5);
|
|
119
|
+
});
|
|
120
|
+
(0, import_vitest.it)("should convert HTML table to Markdown table", () => {
|
|
121
|
+
const markdown = (0, import_html_to_markdown.htmlToMarkdown)(htmlTable, { extractors: false });
|
|
122
|
+
const d = (0, import_fastest_levenshtein.distance)(markdown, expectedTableMarkdown);
|
|
123
|
+
(0, import_vitest.expect)(d).lte(5);
|
|
124
|
+
});
|
|
125
|
+
(0, import_vitest.it)("should convert HTML table with table as text option", () => {
|
|
126
|
+
const markdown = (0, import_html_to_markdown.htmlToMarkdown)(htmlTable, { tableAsText: true, extractors: false });
|
|
127
|
+
const d = (0, import_fastest_levenshtein.distance)(markdown, expectedTableText);
|
|
128
|
+
(0, import_vitest.expect)(d).lte(10);
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
(0, import_vitest.describe)("htmlToMarkdown E2E", () => {
|
|
132
|
+
(0, import_vitest.it)("should convert npm README to Markdown ", async () => {
|
|
133
|
+
const html2 = await (0, import_fetch.loadHtml)("https://www.npmjs.com/package/webforai");
|
|
134
|
+
const markdown = (0, import_html_to_markdown.htmlToMarkdown)(html2, { baseUrl: "https://www.npmjs.com/package/webforai" });
|
|
135
|
+
const original = await import("../README.md?raw");
|
|
136
|
+
const d = (0, import_fastest_levenshtein.distance)(markdown, original.default);
|
|
137
|
+
(0, import_vitest.expect)(d).lte(400);
|
|
138
|
+
});
|
|
139
|
+
(0, import_vitest.it)("should convert GitHub README to Markdown ", async () => {
|
|
140
|
+
const html2 = await (0, import_fetch.loadHtml)("https://github.com/inaridiy/webforai");
|
|
141
|
+
const markdown = (0, import_html_to_markdown.htmlToMarkdown)(html2, { baseUrl: "https://www.npmjs.com/package/webforai" });
|
|
142
|
+
const original = await import("../../../README.md?raw");
|
|
143
|
+
const d = (0, import_fastest_levenshtein.distance)(markdown, original.default);
|
|
144
|
+
(0, import_vitest.expect)(d).lte(200);
|
|
25
145
|
});
|
|
26
146
|
});
|
|
@@ -24,6 +24,7 @@ module.exports = __toCommonJS(html_to_mdast_exports);
|
|
|
24
24
|
var import_hast_util_from_html = require("hast-util-from-html");
|
|
25
25
|
var import_hast_util_to_mdast = require("hast-util-to-mdast");
|
|
26
26
|
var import_extract_hast = require("./extract-hast");
|
|
27
|
+
var import_extract_mdast = require("./extract-mdast");
|
|
27
28
|
var import_custom_a_handler = require("./mdast-handlers/custom-a-handler");
|
|
28
29
|
var import_custom_code_handler = require("./mdast-handlers/custom-code-handler");
|
|
29
30
|
var import_custom_div_handler = require("./mdast-handlers/custom-div-handler");
|
|
@@ -46,7 +47,8 @@ const htmlToMdast = (htmlOrHast, options) => {
|
|
|
46
47
|
br: import_empty_handler.emptyHandler
|
|
47
48
|
}
|
|
48
49
|
});
|
|
49
|
-
|
|
50
|
+
const extractedMdast = (0, import_extract_mdast.extractMdast)(mdast);
|
|
51
|
+
return extractedMdast;
|
|
50
52
|
};
|
|
51
53
|
// Annotate the CommonJS export names for ESM import in node:
|
|
52
54
|
0 && (module.exports = {
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var import_vitest = require("vitest");
|
|
3
|
+
var import_link_replacer = require("./link-replacer");
|
|
4
|
+
const markdown = `# Hello, world!
|
|
5
|
+
|
|
6
|
+
This is a paragraph.
|
|
7
|
+
|
|
8
|
+
[Example](/example.html)
|
|
9
|
+
|
|
10
|
+

|
|
11
|
+
|
|
12
|
+
[Absolute Link](https://www.google.com)
|
|
13
|
+
|
|
14
|
+
[Link with hash](/page#hash)
|
|
15
|
+
|
|
16
|
+
[Link with query](/page?query=string)`;
|
|
17
|
+
const expected = `# Hello, world!
|
|
18
|
+
|
|
19
|
+
This is a paragraph.
|
|
20
|
+
|
|
21
|
+
[Example](https://example.com/example.html)
|
|
22
|
+
|
|
23
|
+

|
|
24
|
+
|
|
25
|
+
[Absolute Link](https://www.google.com)
|
|
26
|
+
|
|
27
|
+
[Link with hash](https://example.com/page#hash)
|
|
28
|
+
|
|
29
|
+
[Link with query](https://example.com/page?query=string)`;
|
|
30
|
+
(0, import_vitest.describe)("linkReplacer", () => {
|
|
31
|
+
(0, import_vitest.it)("should replace relative links", () => {
|
|
32
|
+
const replaced = (0, import_link_replacer.linkReplacer)(markdown, "https://example.com");
|
|
33
|
+
(0, import_vitest.expect)(replaced).toEqual(expected);
|
|
34
|
+
});
|
|
35
|
+
(0, import_vitest.it)("should not replace absolute links", () => {
|
|
36
|
+
const replaced = (0, import_link_replacer.linkReplacer)("[Absolute Link](https://www.google.com)", "https://example.com");
|
|
37
|
+
(0, import_vitest.expect)(replaced).toEqual("[Absolute Link](https://www.google.com)");
|
|
38
|
+
});
|
|
39
|
+
(0, import_vitest.it)("should handle links with hashes", () => {
|
|
40
|
+
const replaced = (0, import_link_replacer.linkReplacer)("[Link with hash](/page#hash)", "https://example.com");
|
|
41
|
+
(0, import_vitest.expect)(replaced).toEqual("[Link with hash](https://example.com/page#hash)");
|
|
42
|
+
});
|
|
43
|
+
(0, import_vitest.it)("should handle links with query parameters", () => {
|
|
44
|
+
const replaced = (0, import_link_replacer.linkReplacer)("[Link with query](/page?query=string)", "https://example.com");
|
|
45
|
+
(0, import_vitest.expect)(replaced).toEqual("[Link with query](https://example.com/page?query=string)");
|
|
46
|
+
});
|
|
47
|
+
});
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var fetch_exports = {};
|
|
20
|
+
__export(fetch_exports, {
|
|
21
|
+
USER_AGENT: () => USER_AGENT,
|
|
22
|
+
loadHtml: () => loadHtml
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(fetch_exports);
|
|
25
|
+
const USER_AGENT = "mozilla/5.0 (windows nt 10.0; win64; x64) applewebkit/537.36 (khtml, like gecko) chrome/125.0.0.0 safari/537.36";
|
|
26
|
+
const loadHtml = async (url, userAgent = USER_AGENT) => {
|
|
27
|
+
const response = await fetch(url, { headers: { "User-Agent": userAgent } });
|
|
28
|
+
return response.text();
|
|
29
|
+
};
|
|
30
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
31
|
+
0 && (module.exports = {
|
|
32
|
+
USER_AGENT,
|
|
33
|
+
loadHtml
|
|
34
|
+
});
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var import_vitest = require("vitest");
|
|
3
|
+
var import_fetch = require("./fetch");
|
|
4
|
+
(0, import_vitest.describe)("Fetch loader", () => {
|
|
5
|
+
(0, import_vitest.it)("should load the HTML of a URL", async () => {
|
|
6
|
+
const html = await (0, import_fetch.loadHtml)("https://example.com");
|
|
7
|
+
(0, import_vitest.expect)(html).toContain("Example Domain");
|
|
8
|
+
});
|
|
9
|
+
});
|
|
@@ -22,23 +22,14 @@ __export(playwright_exports, {
|
|
|
22
22
|
});
|
|
23
23
|
module.exports = __toCommonJS(playwright_exports);
|
|
24
24
|
var import_playwright = require("playwright");
|
|
25
|
-
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
26
25
|
const loadHtml = async (url, context) => {
|
|
27
|
-
|
|
28
|
-
let _context;
|
|
29
|
-
if (context) {
|
|
30
|
-
_context = context;
|
|
31
|
-
} else {
|
|
32
|
-
_browser = await import_playwright.chromium.launch({ headless: true });
|
|
33
|
-
_context = await _browser.newContext();
|
|
34
|
-
}
|
|
26
|
+
const _context = context ?? await import_playwright.chromium.launch({ headless: true });
|
|
35
27
|
const page = await _context.newPage();
|
|
36
|
-
await page.goto(url);
|
|
37
|
-
await Promise.race([page.waitForLoadState("networkidle"), sleep(1e4)]);
|
|
28
|
+
await page.goto(url, { waitUntil: "load" });
|
|
38
29
|
const html = await page.content();
|
|
39
30
|
await page.close();
|
|
40
|
-
if (
|
|
41
|
-
await
|
|
31
|
+
if (!context) {
|
|
32
|
+
await _context.close();
|
|
42
33
|
}
|
|
43
34
|
return html;
|
|
44
35
|
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var import_playwright = require("playwright");
|
|
3
|
+
var import_vitest = require("vitest");
|
|
4
|
+
var import_playwright2 = require("./playwright");
|
|
5
|
+
(0, import_vitest.describe)("Playwright loader", () => {
|
|
6
|
+
(0, import_vitest.it)("should load the HTML of a URL", async () => {
|
|
7
|
+
const html = await (0, import_playwright2.loadHtml)("https://example.com");
|
|
8
|
+
(0, import_vitest.expect)(html).toContain("Example Domain");
|
|
9
|
+
});
|
|
10
|
+
(0, import_vitest.it)("should load the HTML of a URL using a custom context", async () => {
|
|
11
|
+
const context = await import_playwright.chromium.launch({ headless: true });
|
|
12
|
+
const html = await (0, import_playwright2.loadHtml)("https://example.com", context);
|
|
13
|
+
(0, import_vitest.expect)(html).toContain("Example Domain");
|
|
14
|
+
(0, import_vitest.expect)(context.isConnected()).toBe(true);
|
|
15
|
+
await context.close();
|
|
16
|
+
});
|
|
17
|
+
});
|
|
@@ -25,7 +25,11 @@ var import_hast_util_to_mdast = require("hast-util-to-mdast");
|
|
|
25
25
|
var import_hast_util_to_string = require("hast-util-to-string");
|
|
26
26
|
const customAHandler = (options) => (state, node) => {
|
|
27
27
|
if (options?.asText) {
|
|
28
|
-
const
|
|
28
|
+
const text = (0, import_hast_util_to_string.toString)(node);
|
|
29
|
+
if (3 >= text.length) {
|
|
30
|
+
return void 0;
|
|
31
|
+
}
|
|
32
|
+
const link2 = { type: "text", value: text };
|
|
29
33
|
state.patch(node, link2);
|
|
30
34
|
return link2;
|
|
31
35
|
}
|
|
@@ -28,7 +28,8 @@ var import_mdast_util_to_markdown = require("mdast-util-to-markdown");
|
|
|
28
28
|
var import_link_replacer = require("./link-replacer");
|
|
29
29
|
var import_mdast_utils = require("./utils/mdast-utils");
|
|
30
30
|
const DEFAULT_MDAST_TO_MARKDOWN_OPTIONS = {
|
|
31
|
-
extensions: [(0, import_mdast_util_gfm.gfmToMarkdown)(), (0, import_mdast_util_math.mathToMarkdown)()]
|
|
31
|
+
extensions: [(0, import_mdast_util_gfm.gfmToMarkdown)(), (0, import_mdast_util_math.mathToMarkdown)()],
|
|
32
|
+
bullet: "-"
|
|
32
33
|
};
|
|
33
34
|
const mdastToMarkdown = (mdast, options) => {
|
|
34
35
|
const { baseUrl, ...toMarkdownOptions } = { ...DEFAULT_MDAST_TO_MARKDOWN_OPTIONS, ...options };
|
|
@@ -8,6 +8,7 @@ var UNLIKELY_ROLES = ["menu", "menubar", "complementary", "navigation", "alert",
|
|
|
8
8
|
var REGEXPS = {
|
|
9
9
|
hidden: /hidden|invisible|fallback-image/i,
|
|
10
10
|
byline: /byline|author|dateline|writtenby|p-author/i,
|
|
11
|
+
specialUnlikelyCandidates: /frb-|uls-menu|language-link/i,
|
|
11
12
|
unlikelyCandidates: /-ad-|ai2html|banner|breadcrumbs|combx|comment|community|cover-wrap|disqus|extra|footer|gdpr|header|legends|menu|related|remark|replies|rss|shoutbox|sidebar|skyscraper|social|sponsor|supplemental|ad-break|agegate|pagination|pager|popup|yom-remote|speechify-ignore/i,
|
|
12
13
|
okMaybeItsaCandidate: /and|article|body|column|content|main|shadow|code/i
|
|
13
14
|
};
|
|
@@ -67,18 +68,31 @@ var unlikelyElementFilter = (node) => {
|
|
|
67
68
|
return true;
|
|
68
69
|
}
|
|
69
70
|
const element = node;
|
|
70
|
-
const match = matchString(element);
|
|
71
71
|
if (["body", "article", "main", "section", "a"].includes(element.tagName)) {
|
|
72
72
|
return true;
|
|
73
73
|
}
|
|
74
74
|
if (hasAncestors(element, ["table", "code"], 3)) {
|
|
75
75
|
return true;
|
|
76
76
|
}
|
|
77
|
+
const match = matchString(element);
|
|
78
|
+
if (REGEXPS.specialUnlikelyCandidates.test(match)) {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
77
81
|
if (REGEXPS.unlikelyCandidates.test(match) && !REGEXPS.okMaybeItsaCandidate.test(match)) {
|
|
78
82
|
return false;
|
|
79
83
|
}
|
|
80
84
|
return true;
|
|
81
85
|
};
|
|
86
|
+
var isImageLink = (element) => {
|
|
87
|
+
const a = select("a", element);
|
|
88
|
+
const img = select("img", a);
|
|
89
|
+
if (!(a && img)) {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
const imgFilename = img.properties.src?.toString().split("/").pop();
|
|
93
|
+
const hrefFilename = a.properties.href?.toString().split("/").pop();
|
|
94
|
+
return imgFilename === hrefFilename && imgFilename;
|
|
95
|
+
};
|
|
82
96
|
var removeEmptyFilter = (node) => {
|
|
83
97
|
if (node.type !== "element") {
|
|
84
98
|
return true;
|
|
@@ -87,6 +101,9 @@ var removeEmptyFilter = (node) => {
|
|
|
87
101
|
if (!PARAGRAPH_TAGS.includes(element.tagName)) {
|
|
88
102
|
return true;
|
|
89
103
|
}
|
|
104
|
+
if (isImageLink(element)) {
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
90
107
|
const text = hastToString(element);
|
|
91
108
|
if (text.length < 10) {
|
|
92
109
|
return false;
|
|
@@ -97,7 +114,7 @@ var readabilityExtractHast = (hast) => {
|
|
|
97
114
|
const lang = String(select("html", hast)?.properties.lang || tryGetLang(hast) || "en");
|
|
98
115
|
const body = select("body", hast) ?? hast;
|
|
99
116
|
const proxiedHast = parents(body);
|
|
100
|
-
|
|
117
|
+
const baseFilterd = filter(proxiedHast, (node) => {
|
|
101
118
|
if (!metadataFilter(node)) {
|
|
102
119
|
return false;
|
|
103
120
|
}
|
|
@@ -111,17 +128,7 @@ var readabilityExtractHast = (hast) => {
|
|
|
111
128
|
}
|
|
112
129
|
const baseText = hastToString(baseFilterd);
|
|
113
130
|
let minimalLength = lang in BASE_MINIMAL_LENGTH ? BASE_MINIMAL_LENGTH[lang] : 500;
|
|
114
|
-
if (baseText.length
|
|
115
|
-
const filterd = filter(baseFilterd, (node) => {
|
|
116
|
-
if (!unlikelyElementFilter(node)) {
|
|
117
|
-
return false;
|
|
118
|
-
}
|
|
119
|
-
return true;
|
|
120
|
-
});
|
|
121
|
-
if (filterd) {
|
|
122
|
-
baseFilterd = filterd;
|
|
123
|
-
}
|
|
124
|
-
} else {
|
|
131
|
+
if (baseText.length < minimalLength) {
|
|
125
132
|
minimalLength = Math.max(0, baseText.length - 200);
|
|
126
133
|
}
|
|
127
134
|
let bodyTree = baseFilterd;
|
|
@@ -146,6 +153,9 @@ var readabilityExtractHast = (hast) => {
|
|
|
146
153
|
if (!removeEmptyFilter(node)) {
|
|
147
154
|
return false;
|
|
148
155
|
}
|
|
156
|
+
if (!unlikelyElementFilter(node)) {
|
|
157
|
+
return false;
|
|
158
|
+
}
|
|
149
159
|
return true;
|
|
150
160
|
});
|
|
151
161
|
return finalTree;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// src/extract-hast/utils.ts
|
|
2
|
-
var matchString = (element) => `${element.tagName} ${element.properties.id} ${classnames(element).join(" ")}
|
|
2
|
+
var matchString = (element) => `${element.tagName} ${element.properties.id} ${classnames(element).join(" ")}`;
|
|
3
3
|
var classnames = (element) => {
|
|
4
4
|
if (Array.isArray(element.properties.className)) {
|
|
5
5
|
return element.properties.className;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// src/extract-mdast.ts
|
|
2
|
+
import { filter } from "unist-util-filter";
|
|
3
|
+
var DECLATION_TYPES = ["blockquote", "strong", "emphasis", "delete"];
|
|
4
|
+
var emptyDeclarationFilter = (node) => {
|
|
5
|
+
if (!DECLATION_TYPES.includes(node.type)) {
|
|
6
|
+
return true;
|
|
7
|
+
}
|
|
8
|
+
if (node.children.length === 0) {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
return true;
|
|
12
|
+
};
|
|
13
|
+
var extractMdast = (node) => {
|
|
14
|
+
const extracted = filter(node, (node2) => {
|
|
15
|
+
if (!emptyDeclarationFilter(node2)) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
return true;
|
|
19
|
+
});
|
|
20
|
+
return extracted;
|
|
21
|
+
};
|
|
22
|
+
export {
|
|
23
|
+
extractMdast
|
|
24
|
+
};
|
|
@@ -2,9 +2,12 @@
|
|
|
2
2
|
import { distance } from "fastest-levenshtein";
|
|
3
3
|
import { describe, expect, it } from "vitest";
|
|
4
4
|
import { htmlToMarkdown } from "./html-to-markdown.js";
|
|
5
|
+
import { loadHtml } from "./loaders/fetch.js";
|
|
5
6
|
var html = `
|
|
6
7
|
<h1>Hello, world!</h1>
|
|
7
8
|
<p>This is a paragraph.</p>
|
|
9
|
+
<a href="/example.html">Example</a>
|
|
10
|
+
<img src="/example.jpg" alt="Example" />
|
|
8
11
|
<ul>
|
|
9
12
|
<li>Item 1</li>
|
|
10
13
|
<li>Item 2</li>
|
|
@@ -14,13 +17,108 @@ var expected = `# Hello, world!
|
|
|
14
17
|
|
|
15
18
|
This is a paragraph.
|
|
16
19
|
|
|
20
|
+
[Example](/example.html)
|
|
21
|
+
|
|
22
|
+

|
|
23
|
+
|
|
17
24
|
* Item 1
|
|
18
25
|
* Item 2
|
|
19
26
|
`;
|
|
27
|
+
var baseUrlReplaced = `# Hello, world!
|
|
28
|
+
|
|
29
|
+
This is a paragraph.
|
|
30
|
+
|
|
31
|
+
[Example](https://example.com/example.html)
|
|
32
|
+
|
|
33
|
+

|
|
34
|
+
|
|
35
|
+
* Item 1
|
|
36
|
+
* Item 2
|
|
37
|
+
`;
|
|
38
|
+
var linkAsText = `# Hello, world!
|
|
39
|
+
|
|
40
|
+
This is a paragraph.
|
|
41
|
+
|
|
42
|
+
Example
|
|
43
|
+
|
|
44
|
+

|
|
45
|
+
|
|
46
|
+
- Item 1
|
|
47
|
+
- Item 2
|
|
48
|
+
`;
|
|
49
|
+
var imageHidden = `# Hello, world!
|
|
50
|
+
|
|
51
|
+
This is a paragraph.
|
|
52
|
+
|
|
53
|
+
[Example](/example.html)
|
|
54
|
+
|
|
55
|
+
- Item 1
|
|
56
|
+
- Item 2
|
|
57
|
+
`;
|
|
58
|
+
var htmlTable = `
|
|
59
|
+
<table>
|
|
60
|
+
<tr>
|
|
61
|
+
<th>Header 1</th>
|
|
62
|
+
<th>Header 2</th>
|
|
63
|
+
</tr>
|
|
64
|
+
<tr>
|
|
65
|
+
<td>Cell 1</td>
|
|
66
|
+
<td>Cell 2</td>
|
|
67
|
+
</tr>
|
|
68
|
+
</table>
|
|
69
|
+
`;
|
|
70
|
+
var expectedTableMarkdown = `
|
|
71
|
+
| Header 1 | Header 2 |
|
|
72
|
+
| -------- | -------- |
|
|
73
|
+
| Cell 1 | Cell 2 |
|
|
74
|
+
`;
|
|
75
|
+
var expectedTableText = `Header 1 Header 2
|
|
76
|
+
Cell 1 Cell 2`;
|
|
20
77
|
describe("htmlToMarkdown", () => {
|
|
21
78
|
it("should convert HTML to Markdown", () => {
|
|
22
79
|
const markdown = htmlToMarkdown(html, { extractors: false });
|
|
23
80
|
const d = distance(markdown, expected);
|
|
24
|
-
expect(d).lte(
|
|
81
|
+
expect(d).lte(5);
|
|
82
|
+
});
|
|
83
|
+
it("should convert HTML to Markdown with replaced base URL", () => {
|
|
84
|
+
const markdown = htmlToMarkdown(html, { baseUrl: "https://example.com", extractors: false });
|
|
85
|
+
const d = distance(markdown, baseUrlReplaced);
|
|
86
|
+
expect(d).lte(5);
|
|
87
|
+
});
|
|
88
|
+
it("should convert HTML to Markdown with links as text", () => {
|
|
89
|
+
const markdown = htmlToMarkdown(html, { linkAsText: true, extractors: false });
|
|
90
|
+
const d = distance(markdown, linkAsText);
|
|
91
|
+
expect(d).lte(5);
|
|
92
|
+
});
|
|
93
|
+
it("should convert HTML to Markdown with hidden images", () => {
|
|
94
|
+
const markdown = htmlToMarkdown(html, { hideImage: true, extractors: false });
|
|
95
|
+
const d = distance(markdown, imageHidden);
|
|
96
|
+
expect(d).lte(5);
|
|
97
|
+
});
|
|
98
|
+
it("should convert HTML table to Markdown table", () => {
|
|
99
|
+
const markdown = htmlToMarkdown(htmlTable, { extractors: false });
|
|
100
|
+
const d = distance(markdown, expectedTableMarkdown);
|
|
101
|
+
expect(d).lte(5);
|
|
102
|
+
});
|
|
103
|
+
it("should convert HTML table with table as text option", () => {
|
|
104
|
+
const markdown = htmlToMarkdown(htmlTable, { tableAsText: true, extractors: false });
|
|
105
|
+
const d = distance(markdown, expectedTableText);
|
|
106
|
+
expect(d).lte(10);
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
describe("htmlToMarkdown E2E", () => {
|
|
110
|
+
it("should convert npm README to Markdown ", async () => {
|
|
111
|
+
const html2 = await loadHtml("https://www.npmjs.com/package/webforai");
|
|
112
|
+
const markdown = htmlToMarkdown(html2, { baseUrl: "https://www.npmjs.com/package/webforai" });
|
|
113
|
+
const original = await import("../README.md?raw");
|
|
114
|
+
const d = distance(markdown, original.default);
|
|
115
|
+
expect(d).lte(400);
|
|
116
|
+
});
|
|
117
|
+
it("should convert GitHub README to Markdown ", async () => {
|
|
118
|
+
const html2 = await loadHtml("https://github.com/inaridiy/webforai");
|
|
119
|
+
const markdown = htmlToMarkdown(html2, { baseUrl: "https://www.npmjs.com/package/webforai" });
|
|
120
|
+
const original = await import("../../../README.md?raw");
|
|
121
|
+
const d = distance(markdown, original.default);
|
|
122
|
+
expect(d).lte(200);
|
|
25
123
|
});
|
|
26
124
|
});
|
package/dist/html-to-mdast.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { fromHtml } from "hast-util-from-html";
|
|
3
3
|
import { toMdast } from "hast-util-to-mdast";
|
|
4
4
|
import { extractHast } from "./extract-hast/index.js";
|
|
5
|
+
import { extractMdast } from "./extract-mdast.js";
|
|
5
6
|
import { customAHandler } from "./mdast-handlers/custom-a-handler.js";
|
|
6
7
|
import { customCodeHandler } from "./mdast-handlers/custom-code-handler.js";
|
|
7
8
|
import { customDivHandler } from "./mdast-handlers/custom-div-handler.js";
|
|
@@ -24,7 +25,8 @@ var htmlToMdast = (htmlOrHast, options) => {
|
|
|
24
25
|
br: emptyHandler
|
|
25
26
|
}
|
|
26
27
|
});
|
|
27
|
-
|
|
28
|
+
const extractedMdast = extractMdast(mdast);
|
|
29
|
+
return extractedMdast;
|
|
28
30
|
};
|
|
29
31
|
export {
|
|
30
32
|
htmlToMdast
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// src/link-replacer.test.ts
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
import { linkReplacer } from "./link-replacer.js";
|
|
4
|
+
var markdown = `# Hello, world!
|
|
5
|
+
|
|
6
|
+
This is a paragraph.
|
|
7
|
+
|
|
8
|
+
[Example](/example.html)
|
|
9
|
+
|
|
10
|
+

|
|
11
|
+
|
|
12
|
+
[Absolute Link](https://www.google.com)
|
|
13
|
+
|
|
14
|
+
[Link with hash](/page#hash)
|
|
15
|
+
|
|
16
|
+
[Link with query](/page?query=string)`;
|
|
17
|
+
var expected = `# Hello, world!
|
|
18
|
+
|
|
19
|
+
This is a paragraph.
|
|
20
|
+
|
|
21
|
+
[Example](https://example.com/example.html)
|
|
22
|
+
|
|
23
|
+

|
|
24
|
+
|
|
25
|
+
[Absolute Link](https://www.google.com)
|
|
26
|
+
|
|
27
|
+
[Link with hash](https://example.com/page#hash)
|
|
28
|
+
|
|
29
|
+
[Link with query](https://example.com/page?query=string)`;
|
|
30
|
+
describe("linkReplacer", () => {
|
|
31
|
+
it("should replace relative links", () => {
|
|
32
|
+
const replaced = linkReplacer(markdown, "https://example.com");
|
|
33
|
+
expect(replaced).toEqual(expected);
|
|
34
|
+
});
|
|
35
|
+
it("should not replace absolute links", () => {
|
|
36
|
+
const replaced = linkReplacer("[Absolute Link](https://www.google.com)", "https://example.com");
|
|
37
|
+
expect(replaced).toEqual("[Absolute Link](https://www.google.com)");
|
|
38
|
+
});
|
|
39
|
+
it("should handle links with hashes", () => {
|
|
40
|
+
const replaced = linkReplacer("[Link with hash](/page#hash)", "https://example.com");
|
|
41
|
+
expect(replaced).toEqual("[Link with hash](https://example.com/page#hash)");
|
|
42
|
+
});
|
|
43
|
+
it("should handle links with query parameters", () => {
|
|
44
|
+
const replaced = linkReplacer("[Link with query](/page?query=string)", "https://example.com");
|
|
45
|
+
expect(replaced).toEqual("[Link with query](https://example.com/page?query=string)");
|
|
46
|
+
});
|
|
47
|
+
});
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// src/loaders/fetch.ts
|
|
2
|
+
var USER_AGENT = "mozilla/5.0 (windows nt 10.0; win64; x64) applewebkit/537.36 (khtml, like gecko) chrome/125.0.0.0 safari/537.36";
|
|
3
|
+
var loadHtml = async (url, userAgent = USER_AGENT) => {
|
|
4
|
+
const response = await fetch(url, { headers: { "User-Agent": userAgent } });
|
|
5
|
+
return response.text();
|
|
6
|
+
};
|
|
7
|
+
export {
|
|
8
|
+
USER_AGENT,
|
|
9
|
+
loadHtml
|
|
10
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// src/loaders/fetch.test.ts
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
import { loadHtml } from "./fetch.js";
|
|
4
|
+
describe("Fetch loader", () => {
|
|
5
|
+
it("should load the HTML of a URL", async () => {
|
|
6
|
+
const html = await loadHtml("https://example.com");
|
|
7
|
+
expect(html).toContain("Example Domain");
|
|
8
|
+
});
|
|
9
|
+
});
|
|
@@ -1,22 +1,13 @@
|
|
|
1
1
|
// src/loaders/playwright.ts
|
|
2
2
|
import { chromium } from "playwright";
|
|
3
|
-
var sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
4
3
|
var loadHtml = async (url, context) => {
|
|
5
|
-
|
|
6
|
-
let _context;
|
|
7
|
-
if (context) {
|
|
8
|
-
_context = context;
|
|
9
|
-
} else {
|
|
10
|
-
_browser = await chromium.launch({ headless: true });
|
|
11
|
-
_context = await _browser.newContext();
|
|
12
|
-
}
|
|
4
|
+
const _context = context ?? await chromium.launch({ headless: true });
|
|
13
5
|
const page = await _context.newPage();
|
|
14
|
-
await page.goto(url);
|
|
15
|
-
await Promise.race([page.waitForLoadState("networkidle"), sleep(1e4)]);
|
|
6
|
+
await page.goto(url, { waitUntil: "load" });
|
|
16
7
|
const html = await page.content();
|
|
17
8
|
await page.close();
|
|
18
|
-
if (
|
|
19
|
-
await
|
|
9
|
+
if (!context) {
|
|
10
|
+
await _context.close();
|
|
20
11
|
}
|
|
21
12
|
return html;
|
|
22
13
|
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// src/loaders/playwright.test.ts
|
|
2
|
+
import { chromium } from "playwright";
|
|
3
|
+
import { describe, expect, it } from "vitest";
|
|
4
|
+
import { loadHtml } from "./playwright.js";
|
|
5
|
+
describe("Playwright loader", () => {
|
|
6
|
+
it("should load the HTML of a URL", async () => {
|
|
7
|
+
const html = await loadHtml("https://example.com");
|
|
8
|
+
expect(html).toContain("Example Domain");
|
|
9
|
+
});
|
|
10
|
+
it("should load the HTML of a URL using a custom context", async () => {
|
|
11
|
+
const context = await chromium.launch({ headless: true });
|
|
12
|
+
const html = await loadHtml("https://example.com", context);
|
|
13
|
+
expect(html).toContain("Example Domain");
|
|
14
|
+
expect(context.isConnected()).toBe(true);
|
|
15
|
+
await context.close();
|
|
16
|
+
});
|
|
17
|
+
});
|
|
@@ -3,7 +3,11 @@ import { defaultHandlers } from "hast-util-to-mdast";
|
|
|
3
3
|
import { toString as hastToString } from "hast-util-to-string";
|
|
4
4
|
var customAHandler = (options) => (state, node) => {
|
|
5
5
|
if (options?.asText) {
|
|
6
|
-
const
|
|
6
|
+
const text = hastToString(node);
|
|
7
|
+
if (3 >= text.length) {
|
|
8
|
+
return void 0;
|
|
9
|
+
}
|
|
10
|
+
const link2 = { type: "text", value: text };
|
|
7
11
|
state.patch(node, link2);
|
|
8
12
|
return link2;
|
|
9
13
|
}
|
|
@@ -5,7 +5,8 @@ import { toMarkdown } from "mdast-util-to-markdown";
|
|
|
5
5
|
import { linkReplacer } from "./link-replacer.js";
|
|
6
6
|
import { warpRoot } from "./utils/mdast-utils.js";
|
|
7
7
|
var DEFAULT_MDAST_TO_MARKDOWN_OPTIONS = {
|
|
8
|
-
extensions: [gfmToMarkdown(), mathToMarkdown()]
|
|
8
|
+
extensions: [gfmToMarkdown(), mathToMarkdown()],
|
|
9
|
+
bullet: "-"
|
|
9
10
|
};
|
|
10
11
|
var mdastToMarkdown = (mdast, options) => {
|
|
11
12
|
const { baseUrl, ...toMarkdownOptions } = { ...DEFAULT_MDAST_TO_MARKDOWN_OPTIONS, ...options };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"readability.js","sourceRoot":"","sources":["../../../src/extract-hast/readability.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"readability.js","sourceRoot":"","sources":["../../../src/extract-hast/readability.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/extract-hast/utils.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAAgB,EAAE,EAAE,CAC/C,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,EAAE,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/extract-hast/utils.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAAgB,EAAE,EAAE,CAC/C,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,EAAE,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAEhF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAAgB,EAAE,EAAE;IAC9C,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACjD,OAAO,OAAO,CAAC,UAAU,CAAC,SAAqB,CAAC;IACjD,CAAC;IACD,OAAO,EAAE,CAAC;AACX,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAc,EAAE,KAAa,EAAE,EAAE;IAC7D,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,OAAgB,EAAE,QAAkB,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE;IAC/E,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC1C,OAAO,KAAK,CAAC;QACd,CAAC;QACD,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YACvC,OAAO,IAAI,CAAC;QACb,CAAC;QACD,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IACxB,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract-mdast.js","sourceRoot":"","sources":["../../src/extract-mdast.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,MAAM,eAAe,GAAG,CAAC,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;AAEvE,MAAM,sBAAsB,GAAG,CAAC,IAAW,EAAE,EAAE;IAC9C,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC;IACb,CAAC;IACD,IAAK,IAAe,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAC;IACd,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAW,EAAE,EAAE;IAC3C,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE;QACvC,IAAI,CAAC,sBAAsB,CAAC,IAAa,CAAC,EAAE,CAAC;YAC5C,OAAO,KAAK,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC,CAAC,CAAC;IACH,OAAO,SAAkB,CAAC;AAC3B,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html-to-mdast.js","sourceRoot":"","sources":["../../src/html-to-mdast.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"html-to-mdast.js","sourceRoot":"","sources":["../../src/html-to-mdast.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAG7C,OAAO,EAAmB,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAgB5D;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,UAAyB,EAAE,OAA4B,EAAS,EAAE;IAC7F,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;IAErC,MAAM,IAAI,GAAG,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IAEpG,MAAM,aAAa,GAAG,WAAW,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAEpD,MAAM,KAAK,GAAG,OAAO,CAAC,aAAa,EAAE;QACpC,QAAQ,EAAE;YACT,IAAI,EAAE,WAAW;YACjB,GAAG,EAAE,gBAAgB;YACrB,GAAG,EAAE,iBAAiB;YACtB,CAAC,EAAE,cAAc,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;YAClD,GAAG,EAAE,gBAAgB,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;YACxD,KAAK,EAAE,kBAAkB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;YAC3D,EAAE,EAAE,YAAY;SAChB;KACD,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAE3C,OAAO,cAAc,CAAC;AACvB,CAAC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const USER_AGENT = "mozilla/5.0 (windows nt 10.0; win64; x64) applewebkit/537.36 (khtml, like gecko) chrome/125.0.0.0 safari/537.36";
|
|
2
|
+
/**
|
|
3
|
+
* Useful function for load the HTML of a URL using the Fetch API.
|
|
4
|
+
* **Not recommended** for use in production environments.
|
|
5
|
+
* @param url - The URL to load.
|
|
6
|
+
* @param userAgent - The user agent to use. Default is a Chrome user agent.
|
|
7
|
+
* @returns The HTML content of the URL.
|
|
8
|
+
*/
|
|
9
|
+
export declare const loadHtml: (url: string, userAgent?: string) => Promise<string>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../../src/loaders/fetch.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GACtB,iHAAiH,CAAC;AAEnH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAAE,GAAW,EAAE,SAAS,GAAG,UAAU,EAAE,EAAE;IACrE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;IAC5E,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AACxB,CAAC,CAAC"}
|
|
@@ -1,2 +1,16 @@
|
|
|
1
|
-
import { type BrowserContext } from "playwright";
|
|
2
|
-
|
|
1
|
+
import { type Browser, type BrowserContext } from "playwright";
|
|
2
|
+
/**
|
|
3
|
+
* Useful function for load the HTML of a URL using Playwright.
|
|
4
|
+
* **Not recommended** for use in production environments.
|
|
5
|
+
* @param url - The URL to load.
|
|
6
|
+
* @param context - The Playwright browser context to use. If not provided, a new browser context will be created and closed after loading the URL.
|
|
7
|
+
* @returns The HTML content of the URL.
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* import { loadHtml } from "webforai/loaders/playwright";
|
|
11
|
+
*
|
|
12
|
+
* const html = await loadHtml("https://example.com");
|
|
13
|
+
* console.log(html);
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export declare const loadHtml: (url: string, context?: BrowserContext | Browser) => Promise<string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playwright.js","sourceRoot":"","sources":["../../../src/loaders/playwright.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqC,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEzE
|
|
1
|
+
{"version":3,"file":"playwright.js","sourceRoot":"","sources":["../../../src/loaders/playwright.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqC,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEzE;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAAE,GAAW,EAAE,OAAkC,EAAE,EAAE;IACjF,MAAM,QAAQ,GAAG,OAAO,IAAI,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAExE,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;IACtC,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;IAClC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IAEnB,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom-a-handler.js","sourceRoot":"","sources":["../../../src/mdast-handlers/custom-a-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE/D,MAAM,CAAC,MAAM,cAAc,GAC1B,CAAC,OAA8B,EAAU,EAAE,CAC3C,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACf,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"custom-a-handler.js","sourceRoot":"","sources":["../../../src/mdast-handlers/custom-a-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE/D,MAAM,CAAC,MAAM,cAAc,GAC1B,CAAC,OAA8B,EAAU,EAAE,CAC3C,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACf,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACtB,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAW,CAAC;QACpD,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACxB,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,IAAI,GAAG,eAAe,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC5C,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACb,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mdast-to-markdown.js","sourceRoot":"","sources":["../../src/mdast-to-markdown.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAqC,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEvF,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAY/C;;GAEG;AACH,MAAM,CAAC,MAAM,iCAAiC,GAA2B;IACxE,UAAU,EAAE,CAAC,aAAa,EAAE,EAAE,cAAc,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"mdast-to-markdown.js","sourceRoot":"","sources":["../../src/mdast-to-markdown.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAqC,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEvF,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAY/C;;GAEG;AACH,MAAM,CAAC,MAAM,iCAAiC,GAA2B;IACxE,UAAU,EAAE,CAAC,aAAa,EAAE,EAAE,cAAc,EAAE,CAAC;IAC/C,MAAM,EAAE,GAAG;CACX,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAA4B,EAAE,OAAgC,EAAU,EAAE;IACzG,MAAM,EAAE,OAAO,EAAE,GAAG,iBAAiB,EAAE,GAAG,EAAE,GAAG,iCAAiC,EAAE,GAAG,OAAO,EAAE,CAAC;IAE/F,IAAI,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,iBAAiB,CAAC,CAAC;IAE9D,IAAI,OAAO,EAAE,CAAC;QACb,QAAQ,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,QAAQ,CAAC;AACjB,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "webforai",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.3",
|
|
4
4
|
"description": "A library that provides a web interface for AI",
|
|
5
5
|
"author": "inaridiy",
|
|
6
6
|
"license": "MIT",
|
|
@@ -42,6 +42,11 @@
|
|
|
42
42
|
"import": "./dist/loaders/playwright.js",
|
|
43
43
|
"require": "./dist/cjs/loaders/playwright.js"
|
|
44
44
|
},
|
|
45
|
+
"./loaders/fetch": {
|
|
46
|
+
"types": "./dist/types/loaders/fetch.d.ts",
|
|
47
|
+
"import": "./dist/loaders/fetch.js",
|
|
48
|
+
"require": "./dist/cjs/loaders/fetch.js"
|
|
49
|
+
},
|
|
45
50
|
"./loaders/cf-puppeteer": {
|
|
46
51
|
"types": "./dist/types/loaders/cf-puppeteer.d.ts",
|
|
47
52
|
"import": "./dist/loaders/cf-puppeteer.js",
|