@page2ai/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +128 -0
  3. package/dist/browser/browser-adapter.d.ts +15 -0
  4. package/dist/browser/browser-adapter.d.ts.map +1 -0
  5. package/dist/browser/browser-adapter.js +74 -0
  6. package/dist/browser/browser-adapter.js.map +1 -0
  7. package/dist/browser/index.d.ts +3 -0
  8. package/dist/browser/index.d.ts.map +1 -0
  9. package/dist/browser/index.js +7 -0
  10. package/dist/browser/index.js.map +1 -0
  11. package/dist/node/basic-renderer.d.ts +9 -0
  12. package/dist/node/basic-renderer.d.ts.map +1 -0
  13. package/dist/node/basic-renderer.js +347 -0
  14. package/dist/node/basic-renderer.js.map +1 -0
  15. package/dist/node/fetch-protected.d.ts +19 -0
  16. package/dist/node/fetch-protected.d.ts.map +1 -0
  17. package/dist/node/fetch-protected.js +92 -0
  18. package/dist/node/fetch-protected.js.map +1 -0
  19. package/dist/node/index.d.ts +28 -0
  20. package/dist/node/index.d.ts.map +1 -0
  21. package/dist/node/index.js +136 -0
  22. package/dist/node/index.js.map +1 -0
  23. package/dist/node/linkedom-adapter.d.ts +17 -0
  24. package/dist/node/linkedom-adapter.d.ts.map +1 -0
  25. package/dist/node/linkedom-adapter.js +112 -0
  26. package/dist/node/linkedom-adapter.js.map +1 -0
  27. package/dist/node/ssrf-guard.d.ts +6 -0
  28. package/dist/node/ssrf-guard.d.ts.map +1 -0
  29. package/dist/node/ssrf-guard.js +73 -0
  30. package/dist/node/ssrf-guard.js.map +1 -0
  31. package/dist/shared/constants.d.ts +12 -0
  32. package/dist/shared/constants.d.ts.map +1 -0
  33. package/dist/shared/constants.js +164 -0
  34. package/dist/shared/constants.js.map +1 -0
  35. package/dist/shared/md-postprocess.d.ts +18 -0
  36. package/dist/shared/md-postprocess.d.ts.map +1 -0
  37. package/dist/shared/md-postprocess.js +538 -0
  38. package/dist/shared/md-postprocess.js.map +1 -0
  39. package/dist/shared/page-adapter.d.ts +26 -0
  40. package/dist/shared/page-adapter.d.ts.map +1 -0
  41. package/dist/shared/page-adapter.js +15 -0
  42. package/dist/shared/page-adapter.js.map +1 -0
  43. package/dist/shared/profiles.d.ts +6 -0
  44. package/dist/shared/profiles.d.ts.map +1 -0
  45. package/dist/shared/profiles.js +185 -0
  46. package/dist/shared/profiles.js.map +1 -0
  47. package/dist/shared/types.d.ts +265 -0
  48. package/dist/shared/types.d.ts.map +1 -0
  49. package/dist/shared/types.js +4 -0
  50. package/dist/shared/types.js.map +1 -0
  51. package/dist/shared/utils.d.ts +21 -0
  52. package/dist/shared/utils.d.ts.map +1 -0
  53. package/dist/shared/utils.js +184 -0
  54. package/dist/shared/utils.js.map +1 -0
  55. package/package.json +81 -0
@@ -0,0 +1,184 @@
1
+ // Pure utilities: no DOM access, no shared state.
2
+ // Ported from Rev-032v2 prototype (Sections 7-10, 16-17, 21-22, 35).
3
+ import { PII_VALUE_PATTERNS, PII_KEY_PATTERNS, SOCIAL_DOMAIN_RE } from './constants.js';
4
+ export const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
5
+ // Race a Promise against a hard wall-clock timeout. On timeout resolves to
6
+ // `onTimeout` (default null) — never rejects, so callers can treat "no capture"
7
+ // and "timed out" uniformly. Does NOT abort the racing work: if `p` is a slow
8
+ // synchronous computation (e.g. renderNode on a big DOM), it keeps running to
9
+ // completion in the background but its result is discarded. Guards only real
10
+ // async waits (network fetches, MutationObserver settles inside clickAndWait).
11
+ export const withHardTimeout = (p, ms, onTimeout = null) => {
12
+ let timer = null;
13
+ const timeout = new Promise((resolve) => {
14
+ timer = setTimeout(() => resolve(onTimeout), ms);
15
+ });
16
+ return Promise.race([
17
+ p.then((v) => {
18
+ if (timer)
19
+ clearTimeout(timer);
20
+ return v;
21
+ }),
22
+ timeout,
23
+ ]);
24
+ };
25
+ export const slugify = (t) => (t || 'page')
26
+ .toLowerCase()
27
+ .replace(/https?:\/\//g, '')
28
+ .replace(/[^a-z0-9а-яё]+/gi, '-')
29
+ .replace(/^-+|-+$/g, '')
30
+ .slice(0, 80) || 'page';
31
+ export const absUrl = (u, base) => {
32
+ const resolvedBase = base ?? globalThis.location?.href;
33
+ try {
34
+ return new URL(u || '', resolvedBase).href;
35
+ }
36
+ catch {
37
+ return u || '';
38
+ }
39
+ };
40
+ export const cleanInline = (t) => (t || '').replace(/\u00a0/g, ' ').replace(/[ \t\r\n]+/g, ' ').trim();
41
+ export const cleanBlock = (t) => (t || '').replace(/\u00a0/g, ' ').replace(/[ \t]+/g, ' ').replace(/\n{3,}/g, '\n\n').trim();
42
+ export const stripNoisyHtmlAttributes = (t) => {
43
+ if (!t)
44
+ return t || '';
45
+ return String(t)
46
+ .replace(/\s*data-od-[a-z0-9_-]*\s*=\s*"[^"]*"/gi, '')
47
+ .replace(/\s*data-od-[a-z0-9_-]*\s*=\s*'[^']*'/gi, '')
48
+ .replace(/\s*data-(?:dominant-color|has-transparency)\s*=\s*"[^"]*"/gi, '')
49
+ .replace(/\s*data-(?:dominant-color|has-transparency)\s*=\s*'[^']*'/gi, '')
50
+ .replace(/\s*style\s*=\s*"[^"]*"/gi, '')
51
+ .replace(/\s*style\s*=\s*'[^']*'/gi, '')
52
+ .replace(/\s*(?:loading|decoding|fetchpriority)\s*=\s*"[^"]*"/gi, '')
53
+ .replace(/\s+/g, ' ')
54
+ .trim();
55
+ };
56
+ export const escapeMd = (t, stripNoisy = false) => {
57
+ if (!t)
58
+ return '';
59
+ let c = cleanInline(t);
60
+ if (stripNoisy)
61
+ c = stripNoisyHtmlAttributes(c);
62
+ return c
63
+ .replace(/\\/g, '\\\\')
64
+ .replace(/`/g, '\\`')
65
+ .replace(/\*/g, '\\*')
66
+ .replace(/_/g, '\\_')
67
+ .replace(/\[/g, '\\[')
68
+ .replace(/\]/g, '\\]');
69
+ };
70
+ export const escapeMdTableCell = (t) => {
71
+ if (!t)
72
+ return '';
73
+ return String(t)
74
+ .replace(/\u00a0/g, ' ')
75
+ .replace(/\\/g, '\\\\')
76
+ .replace(/`/g, '\\`')
77
+ .replace(/\|/g, '\\|')
78
+ .replace(/\r?\n/g, '<br>')
79
+ .replace(/[ \t]+/g, ' ')
80
+ .trim();
81
+ };
82
+ export const stripOuterBlankLines = (t) => (t || '').replace(/\u00a0/g, ' ').replace(/^\s*\n/, '').replace(/\n\s*$/, '');
83
+ export const longestRun = (t, c) => {
84
+ const e = c === '`' ? '\\`' : '\\~';
85
+ const m = String(t || '').match(new RegExp(`${e}+`, 'g')) || [];
86
+ return m.reduce((mx, r) => Math.max(mx, r.length), 0);
87
+ };
88
+ export const chooseCodeFence = (t) => {
89
+ const b = longestRun(t, '`');
90
+ const tl = longestRun(t, '~');
91
+ if (b < 3)
92
+ return '```';
93
+ if (tl < b)
94
+ return '~'.repeat(Math.max(3, tl + 1));
95
+ return '`'.repeat(Math.max(3, b + 1));
96
+ };
97
+ // --- PII masking (Section 16) ---
98
+ export const maskString = (s) => {
99
+ let r = s;
100
+ for (const { name, re } of PII_VALUE_PATTERNS)
101
+ r = r.replace(re, `<MASKED:${name}>`);
102
+ return r;
103
+ };
104
+ export const maskPii = (v, enabled, d = 0) => {
105
+ if (!enabled)
106
+ return v;
107
+ if (d > 12)
108
+ return '<MASKED:depth-limit>';
109
+ if (v === null || v === undefined)
110
+ return v;
111
+ if (typeof v === 'string')
112
+ return maskString(v);
113
+ if (typeof v === 'number' || typeof v === 'boolean')
114
+ return v;
115
+ if (Array.isArray(v))
116
+ return v.map((x) => maskPii(x, enabled, d + 1));
117
+ if (typeof v === 'object') {
118
+ const o = {};
119
+ for (const [k, x] of Object.entries(v)) {
120
+ if (PII_KEY_PATTERNS.some((re) => re.test(k)))
121
+ o[k] = '<MASKED:by-key>';
122
+ else
123
+ o[k] = maskPii(x, enabled, d + 1);
124
+ }
125
+ return o;
126
+ }
127
+ return v;
128
+ };
129
+ // --- Form field sanitization (Section 17) ---
130
+ export const sanitizeFormFieldValue = (name, value, type, config) => {
131
+ if (!value)
132
+ return value || '';
133
+ const sn = String(name || '');
134
+ const sv = String(value);
135
+ if (config.maskFormFieldNamePatterns.some((re) => re.test(sn))) {
136
+ return `<MASKED:by-name, len=${sv.length}>`;
137
+ }
138
+ if (type === 'hidden' && sv.length > config.maxHiddenFormValueLength) {
139
+ return `${sv.slice(0, 30)}<TRUNCATED:total=${sv.length}-chars>`;
140
+ }
141
+ return sv;
142
+ };
143
+ // --- Link helpers (Sections 21-22) ---
144
+ export const isWordPressNoiseLink = (href, config) => {
145
+ if (!config.filterWordPressNoiseLinks || !href)
146
+ return false;
147
+ return config.wordpressNoiseLinkPatterns.some((p) => p.test(href));
148
+ };
149
+ export const cleanMailtoTelLabel = (href, rawLabel) => {
150
+ if (!href)
151
+ return rawLabel;
152
+ const isMailto = href.startsWith('mailto:');
153
+ const isTel = href.startsWith('tel:');
154
+ if (!isMailto && !isTel)
155
+ return rawLabel;
156
+ const address = href.replace(/^(?:mailto:|tel:)/, '').trim();
157
+ if (!rawLabel || rawLabel.length === 0)
158
+ return address;
159
+ if (rawLabel.includes(address))
160
+ return address;
161
+ if (/^(icon|иконка|логотип|значок|logo|figure|picture)\b/i.test(rawLabel))
162
+ return address;
163
+ return rawLabel;
164
+ };
165
+ export const classifyLink = (href, alt, hasImg) => {
166
+ const url = String(href || '');
167
+ const as = String(alt || '');
168
+ if (url.startsWith('mailto:'))
169
+ return { type: 'mailto', label: as || url.replace(/^mailto:/, '') };
170
+ if (url.startsWith('tel:'))
171
+ return { type: 'tel', label: as || url.replace(/^tel:/, '') };
172
+ const sm = url.match(SOCIAL_DOMAIN_RE);
173
+ if (sm) {
174
+ const d = sm[1].replace(/^www\./, '').replace(/^m\./, '');
175
+ return { type: 'social', label: d };
176
+ }
177
+ if (hasImg && /\.(jpe?g|png|webp|gif|svg|bmp|ico|avif)(?:\?|#|$)/i.test(url)) {
178
+ if (as.length >= 10)
179
+ return { type: 'linked-image', label: as };
180
+ }
181
+ return { type: 'link', label: as };
182
+ };
183
+ export const isStepNumberLike = (t) => /^(0?\d{1,3}|step\s*\d{1,3}|№\s*\d{1,3})$/i.test(cleanInline(t));
184
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/shared/utils.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,81 @@
1
+ {
2
+ "name": "@page2ai/core",
3
+ "version": "0.1.0",
4
+ "description": "Extract clean Markdown from any web page HTML. Works in Node.js (via linkedom) and browsers. Powers the Page2AI extension and @page2ai/mcp server.",
5
+ "type": "module",
6
+ "exports": {
7
+ ".": {
8
+ "types": "./dist/node/index.d.ts",
9
+ "import": "./dist/node/index.js"
10
+ },
11
+ "./node": {
12
+ "types": "./dist/node/index.d.ts",
13
+ "import": "./dist/node/index.js"
14
+ },
15
+ "./browser": {
16
+ "types": "./dist/browser/index.d.ts",
17
+ "import": "./dist/browser/index.js"
18
+ },
19
+ "./shared/types": {
20
+ "types": "./dist/shared/types.d.ts",
21
+ "import": "./dist/shared/types.js"
22
+ },
23
+ "./shared/profiles": {
24
+ "types": "./dist/shared/profiles.d.ts",
25
+ "import": "./dist/shared/profiles.js"
26
+ }
27
+ },
28
+ "main": "./dist/node/index.js",
29
+ "types": "./dist/node/index.d.ts",
30
+ "files": [
31
+ "dist",
32
+ "README.md",
33
+ "LICENSE"
34
+ ],
35
+ "engines": {
36
+ "node": ">=18.0.0"
37
+ },
38
+ "scripts": {
39
+ "build": "tsc -p tsconfig.build.json",
40
+ "build:watch": "tsc -p tsconfig.build.json --watch",
41
+ "test": "vitest run",
42
+ "test:watch": "vitest",
43
+ "typecheck": "tsc --noEmit",
44
+ "prepublishOnly": "npm run build && npm run test"
45
+ },
46
+ "publishConfig": {
47
+ "access": "public"
48
+ },
49
+ "dependencies": {
50
+ "css.escape": "^1.5.1",
51
+ "linkedom": "^0.18.11"
52
+ },
53
+ "devDependencies": {
54
+ "@types/css.escape": "^1.5.2",
55
+ "@types/node": "^22.10.0",
56
+ "typescript": "^5.7.2",
57
+ "vitest": "^3.2.7"
58
+ },
59
+ "keywords": [
60
+ "html-to-markdown",
61
+ "markdown",
62
+ "webpage-to-markdown",
63
+ "web-scraping",
64
+ "llm",
65
+ "ai",
66
+ "mcp",
67
+ "linkedom",
68
+ "readability",
69
+ "page2ai"
70
+ ],
71
+ "author": "Igor Saevets, AI Expert and Entrepreneur",
72
+ "license": "MIT",
73
+ "homepage": "https://github.com/igorsaevets/page2ai-core",
74
+ "repository": {
75
+ "type": "git",
76
+ "url": "https://github.com/igorsaevets/page2ai-core.git"
77
+ },
78
+ "bugs": {
79
+ "url": "https://github.com/igorsaevets/page2ai-core/issues"
80
+ }
81
+ }