@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,538 @@
1
+ // Markdown post-processing: pure string transforms over the composed document.
2
+ // Ported from Rev-032v2 prototype (Sections 10-11 + aggressive cleanup pass).
3
+ export const createFenceTracker = () => {
4
+ let inFence = false;
5
+ let fenceChar = '';
6
+ let fenceLen = 0;
7
+ return {
8
+ get inFence() {
9
+ return inFence;
10
+ },
11
+ check(trimmedLine) {
12
+ const m = trimmedLine.match(/^(`{3,}|~{3,})/);
13
+ if (!m)
14
+ return false;
15
+ const c = m[1][0];
16
+ const l = m[1].length;
17
+ if (!inFence) {
18
+ inFence = true;
19
+ fenceChar = c;
20
+ fenceLen = l;
21
+ }
22
+ else if (c === fenceChar && l >= fenceLen) {
23
+ inFence = false;
24
+ fenceChar = '';
25
+ fenceLen = 0;
26
+ }
27
+ return true;
28
+ },
29
+ };
30
+ };
31
+ // Preserves leading whitespace on non-blank lines; collapses only internal runs.
32
+ export const normalizeMarkdownPreserveCode = (text) => {
33
+ const lines = String(text || '').replace(/\u00a0/g, ' ').split('\n');
34
+ const out = [];
35
+ const fence = createFenceTracker();
36
+ let blankCount = 0;
37
+ for (const line of lines) {
38
+ const trimmed = line.trim();
39
+ if (fence.check(trimmed)) {
40
+ out.push(line.trimEnd());
41
+ blankCount = 0;
42
+ continue;
43
+ }
44
+ if (fence.inFence) {
45
+ out.push(line.replace(/\s+$/g, ''));
46
+ continue;
47
+ }
48
+ if (trimmed === '') {
49
+ blankCount += 1;
50
+ if (blankCount <= 2)
51
+ out.push('');
52
+ continue;
53
+ }
54
+ blankCount = 0;
55
+ const m = line.match(/^(\s*)(.*?)$/);
56
+ const lead = m ? m[1] : '';
57
+ const rest = (m ? m[2] : line).replace(/[ \t]+/g, ' ').trimEnd();
58
+ out.push(lead + rest);
59
+ }
60
+ return out.join('\n').replace(/^\n+|\n+$/g, '');
61
+ };
62
+ export const dedupeConsecutiveDuplicateLines = (text, config) => {
63
+ if (!config.dedupeConsecutiveDuplicates)
64
+ return text;
65
+ const threshold = Math.max(2, config.minConsecutiveDuplicatesToCollapse);
66
+ const lines = String(text || '').split('\n');
67
+ const out = [];
68
+ const fence = createFenceTracker();
69
+ let i = 0;
70
+ while (i < lines.length) {
71
+ const line = lines[i];
72
+ const trimmed = line.trim();
73
+ if (fence.check(trimmed)) {
74
+ out.push(line);
75
+ i++;
76
+ continue;
77
+ }
78
+ if (fence.inFence) {
79
+ out.push(line);
80
+ i++;
81
+ continue;
82
+ }
83
+ if (trimmed.length > 0) {
84
+ let j = i + 1;
85
+ while (j < lines.length && lines[j].trim() === trimmed)
86
+ j++;
87
+ if (j - i >= threshold) {
88
+ out.push(line);
89
+ out.push(`<!-- AI: collapsed ${j - i - 1} consecutive duplicate line(s) -->`);
90
+ i = j;
91
+ continue;
92
+ }
93
+ }
94
+ out.push(line);
95
+ i++;
96
+ }
97
+ return out.join('\n');
98
+ };
99
+ // Protects YAML frontmatter from collapsing.
100
+ export const collapseShortAdjacentLines = (text, config) => {
101
+ if (!config.collapseShortAdjacentLines)
102
+ return text;
103
+ const maxLen = config.shortLineCollapseMaxChars;
104
+ const lines = String(text || '').split('\n');
105
+ const out = [];
106
+ const fence = createFenceTracker();
107
+ let buffer = [];
108
+ let inFrontmatter = false;
109
+ let seenFirstDashes = false;
110
+ const isStructural = (l) => {
111
+ const t = l.trimStart();
112
+ return /^#{1,6}\s/.test(t) || /^[-*+]\s/.test(t) || /^\d+\.\s/.test(t) ||
113
+ /^>\s/.test(t) || /^\|/.test(t) || /^!\[/.test(t) || /^\[/.test(t) ||
114
+ /^<!--/.test(t) || /^<\w/.test(t) || /^[*_]{2}/.test(t) || /^---/.test(t) || /^===/.test(t);
115
+ };
116
+ const flush = () => {
117
+ if (buffer.length === 0)
118
+ return;
119
+ if (buffer.length === 1) {
120
+ out.push(buffer[0]);
121
+ buffer = [];
122
+ return;
123
+ }
124
+ // If every buffered line starts with an uppercase letter, digit, or emoji —
125
+ // these are separate items (security features, stats, etc.), not fragments
126
+ // of a broken sentence. Don't collapse them.
127
+ const allStartWithUpper = buffer.every((s) => /^[\p{Lu}\d\p{Emoji}]/u.test(s.trim()));
128
+ if (allStartWithUpper) {
129
+ buffer.forEach((s) => out.push(s));
130
+ }
131
+ else {
132
+ out.push(buffer.map((s) => s.trim()).join(' '));
133
+ }
134
+ buffer = [];
135
+ };
136
+ for (let i = 0; i < lines.length; i++) {
137
+ const line = lines[i];
138
+ const trimmed = line.trim();
139
+ if (trimmed === '---') {
140
+ flush();
141
+ out.push(line);
142
+ if (!seenFirstDashes && i <= 1) {
143
+ inFrontmatter = true;
144
+ seenFirstDashes = true;
145
+ }
146
+ else if (inFrontmatter) {
147
+ inFrontmatter = false;
148
+ }
149
+ continue;
150
+ }
151
+ if (inFrontmatter) {
152
+ flush();
153
+ out.push(line);
154
+ continue;
155
+ }
156
+ if (fence.check(trimmed)) {
157
+ flush();
158
+ out.push(line);
159
+ continue;
160
+ }
161
+ if (fence.inFence) {
162
+ flush();
163
+ out.push(line);
164
+ continue;
165
+ }
166
+ if (trimmed === '') {
167
+ flush();
168
+ out.push(line);
169
+ continue;
170
+ }
171
+ if (isStructural(line)) {
172
+ flush();
173
+ out.push(line);
174
+ continue;
175
+ }
176
+ if (trimmed.length < maxLen) {
177
+ buffer.push(line);
178
+ continue;
179
+ }
180
+ flush();
181
+ out.push(line);
182
+ }
183
+ flush();
184
+ return out.join('\n');
185
+ };
186
+ // Punctuation cleanup (space before period, comma, etc.).
187
+ export const cleanupPunctuation = (text, config) => {
188
+ if (!config.cleanupPunctuation)
189
+ return text;
190
+ const lines = String(text || '').split('\n');
191
+ const out = [];
192
+ const fence = createFenceTracker();
193
+ let inFrontmatter = false;
194
+ let seenFirstDashes = false;
195
+ for (let i = 0; i < lines.length; i++) {
196
+ const line = lines[i];
197
+ const trimmed = line.trim();
198
+ if (trimmed === '---') {
199
+ if (!seenFirstDashes && i <= 1) {
200
+ inFrontmatter = true;
201
+ seenFirstDashes = true;
202
+ }
203
+ else if (inFrontmatter) {
204
+ inFrontmatter = false;
205
+ }
206
+ out.push(line);
207
+ continue;
208
+ }
209
+ if (inFrontmatter) {
210
+ out.push(line);
211
+ continue;
212
+ }
213
+ if (fence.check(trimmed)) {
214
+ out.push(line);
215
+ continue;
216
+ }
217
+ if (fence.inFence) {
218
+ out.push(line);
219
+ continue;
220
+ }
221
+ if (trimmed.startsWith('|')) {
222
+ out.push(line);
223
+ continue;
224
+ }
225
+ out.push(line.replace(/\s+([.,!?;:])/g, '$1'));
226
+ }
227
+ return out.join('\n');
228
+ };
229
+ // Dedupe adjacent identical markdown links.
230
+ export const dedupeAdjacentLinks = (text, config) => {
231
+ if (!config.dedupeAdjacentLinks)
232
+ return text;
233
+ const lines = String(text || '').split('\n');
234
+ const out = [];
235
+ const fence = createFenceTracker();
236
+ const linkRe = /\[([^\]]*)\]\(([^)]+)\)/g;
237
+ const extractLinkSigs = (line) => {
238
+ const sigs = [];
239
+ let m;
240
+ linkRe.lastIndex = 0;
241
+ while ((m = linkRe.exec(line)) !== null)
242
+ sigs.push(m[1] + '|' + m[2]);
243
+ return sigs;
244
+ };
245
+ let prevSigs = [];
246
+ for (const line of lines) {
247
+ const trimmed = line.trim();
248
+ if (fence.check(trimmed)) {
249
+ out.push(line);
250
+ prevSigs = [];
251
+ continue;
252
+ }
253
+ if (fence.inFence) {
254
+ out.push(line);
255
+ continue;
256
+ }
257
+ if (trimmed === '') {
258
+ out.push(line);
259
+ prevSigs = [];
260
+ continue;
261
+ }
262
+ const curSigs = extractLinkSigs(trimmed);
263
+ if (curSigs.length > 0 &&
264
+ curSigs.length === prevSigs.length &&
265
+ curSigs.every((s, idx) => s === prevSigs[idx])) {
266
+ continue;
267
+ }
268
+ // Also handle inline duplicates: [A](url) [A](url) on same line.
269
+ const seen = new Set();
270
+ const cleaned = line
271
+ .replace(/\[([^\]]*)\]\(([^)]+)\)/g, (match, label, url) => {
272
+ const sig = label + '|' + url;
273
+ if (seen.has(sig))
274
+ return '';
275
+ seen.add(sig);
276
+ return match;
277
+ })
278
+ .replace(/\s{2,}/g, ' ')
279
+ .trimEnd();
280
+ out.push(cleaned);
281
+ prevSigs = extractLinkSigs(cleaned.trim());
282
+ }
283
+ return out.join('\n');
284
+ };
285
+ // Suppress repeated images (same src, generic alt, threshold+ times).
286
+ export const suppressRepeatedImages = (text, config) => {
287
+ if (!config.suppressRepeatedImages)
288
+ return text;
289
+ const threshold = config.suppressRepeatedImageThreshold;
290
+ const lines = String(text || '').split('\n');
291
+ const imgRe = /^(\s*)!\[([^\]]*)\]\(([^)]+)\)\s*$/;
292
+ const srcCounts = new Map();
293
+ for (const line of lines) {
294
+ const m = line.match(imgRe);
295
+ if (m) {
296
+ const alt = m[2];
297
+ const src = m[3];
298
+ const isGeneric = !alt || alt === 'image' || alt === 'Image link';
299
+ if (isGeneric)
300
+ srcCounts.set(src, (srcCounts.get(src) || 0) + 1);
301
+ }
302
+ }
303
+ const srcSeen = new Map();
304
+ const out = [];
305
+ for (const line of lines) {
306
+ const m = line.match(imgRe);
307
+ if (m) {
308
+ const alt = m[2];
309
+ const src = m[3];
310
+ const isGeneric = !alt || alt === 'image' || alt === 'Image link';
311
+ if (isGeneric && (srcCounts.get(src) || 0) >= threshold) {
312
+ const seen = srcSeen.get(src) || 0;
313
+ srcSeen.set(src, seen + 1);
314
+ if (seen === 0) {
315
+ out.push(line);
316
+ out.push(`<!-- AI: this decorative image repeats ${srcCounts.get(src)} times; subsequent occurrences suppressed -->`);
317
+ }
318
+ continue;
319
+ }
320
+ }
321
+ out.push(line);
322
+ }
323
+ return out.join('\n');
324
+ };
325
+ export const compactLinkLabels = (text, config) => {
326
+ if (!config.compactLinkLabels)
327
+ return text;
328
+ const max = config.maxLinkLabelChars;
329
+ const fence = createFenceTracker();
330
+ const lines = String(text || '').split('\n');
331
+ const out = [];
332
+ for (const line of lines) {
333
+ const trimmed = line.trim();
334
+ if (fence.check(trimmed)) {
335
+ out.push(line);
336
+ continue;
337
+ }
338
+ if (fence.inFence) {
339
+ out.push(line);
340
+ continue;
341
+ }
342
+ out.push(line.replace(/\[([^\]]+)\]\(([^)]+)\)/g, (match, label, url) => {
343
+ if (label.length > max)
344
+ return `[${label.slice(0, max)}…](${url})`;
345
+ return match;
346
+ }));
347
+ }
348
+ return out.join('\n');
349
+ };
350
+ // Collapse repeated blocks (marquee/carousel loops): a sequence of N lines
351
+ // (N>=3) repeating K times (K>=2) consecutively keeps only the first copy.
352
+ export const dedupeRepeatedBlocks = (text) => {
353
+ const lines = String(text || '').split('\n');
354
+ const out = [];
355
+ const fence = createFenceTracker();
356
+ let i = 0;
357
+ while (i < lines.length) {
358
+ const trimmed = lines[i].trim();
359
+ if (fence.check(trimmed)) {
360
+ out.push(lines[i]);
361
+ i++;
362
+ continue;
363
+ }
364
+ if (fence.inFence) {
365
+ out.push(lines[i]);
366
+ i++;
367
+ continue;
368
+ }
369
+ let collapsed = false;
370
+ for (let blockSize = 3; blockSize <= 15 && i + blockSize * 2 <= lines.length; blockSize++) {
371
+ const block = lines.slice(i, i + blockSize).map((l) => l.trim()).join('\n');
372
+ if (!block || block.length < 10)
373
+ continue;
374
+ let repeats = 1;
375
+ let j = i + blockSize;
376
+ while (j + blockSize <= lines.length) {
377
+ const nextBlock = lines.slice(j, j + blockSize).map((l) => l.trim()).join('\n');
378
+ if (nextBlock === block) {
379
+ repeats++;
380
+ j += blockSize;
381
+ }
382
+ else
383
+ break;
384
+ }
385
+ if (repeats >= 2) {
386
+ for (let k = i; k < i + blockSize; k++)
387
+ out.push(lines[k]);
388
+ out.push(`<!-- AI: repeated block (${blockSize} lines × ${repeats} times) collapsed -->`);
389
+ i = j;
390
+ collapsed = true;
391
+ break;
392
+ }
393
+ }
394
+ if (!collapsed) {
395
+ out.push(lines[i]);
396
+ i++;
397
+ }
398
+ }
399
+ return out.join('\n');
400
+ };
401
+ // Remove tab panel content that also appears in the main flow.
402
+ export const dedupeTabPanelDuplicates = (text) => {
403
+ const lines = String(text || '').split('\n');
404
+ const normForDedup = (s) => s.trim().replace(/^#{1,6}\s+/, '').replace(/^[-*+]\s+/, '').replace(/^\d+\.\s+/, '').trim();
405
+ const panelTexts = [];
406
+ let inPanel = false;
407
+ let panelLines = [];
408
+ for (const line of lines) {
409
+ if (/<!-- AI: TAB PANEL START:/.test(line)) {
410
+ inPanel = true;
411
+ panelLines = [];
412
+ continue;
413
+ }
414
+ if (/<!-- AI: TAB PANEL END:/.test(line)) {
415
+ if (panelLines.length) {
416
+ const normalized = panelLines.map((l) => normForDedup(l)).filter(Boolean);
417
+ if (normalized.length >= 1)
418
+ panelTexts.push(new Set(normalized));
419
+ }
420
+ inPanel = false;
421
+ continue;
422
+ }
423
+ if (inPanel)
424
+ panelLines.push(line);
425
+ }
426
+ if (!panelTexts.length)
427
+ return text;
428
+ const out = [];
429
+ inPanel = false;
430
+ let matchBuffer = [];
431
+ let matchedPanelIdx = -1;
432
+ const flushMatch = () => {
433
+ if (matchBuffer.length >= 3 && matchedPanelIdx >= 0) {
434
+ out.push('<!-- AI: TAB PANEL CONTENT ALREADY EXPORTED ABOVE (deduplicated) -->');
435
+ }
436
+ else {
437
+ matchBuffer.forEach((l) => out.push(l));
438
+ }
439
+ matchBuffer = [];
440
+ matchedPanelIdx = -1;
441
+ };
442
+ for (const line of lines) {
443
+ if (/<!-- AI: TAB PANEL START:/.test(line)) {
444
+ flushMatch();
445
+ inPanel = true;
446
+ out.push(line);
447
+ continue;
448
+ }
449
+ if (/<!-- AI: TAB PANEL END:/.test(line)) {
450
+ inPanel = false;
451
+ out.push(line);
452
+ continue;
453
+ }
454
+ if (inPanel) {
455
+ out.push(line);
456
+ continue;
457
+ }
458
+ const trimmed = line.trim();
459
+ if (!trimmed) {
460
+ flushMatch();
461
+ out.push(line);
462
+ continue;
463
+ }
464
+ const norm = normForDedup(line);
465
+ let found = -1;
466
+ for (let p = 0; p < panelTexts.length; p++) {
467
+ if (panelTexts[p].has(norm)) {
468
+ found = p;
469
+ break;
470
+ }
471
+ }
472
+ if (found >= 0) {
473
+ if (matchBuffer.length === 0)
474
+ matchedPanelIdx = found;
475
+ if (matchedPanelIdx === found) {
476
+ matchBuffer.push(line);
477
+ }
478
+ else {
479
+ flushMatch();
480
+ matchBuffer.push(line);
481
+ matchedPanelIdx = found;
482
+ }
483
+ }
484
+ else {
485
+ flushMatch();
486
+ out.push(line);
487
+ }
488
+ }
489
+ flushMatch();
490
+ return out.join('\n');
491
+ };
492
+ export const aggressiveCleanup = (text, config, progress) => {
493
+ if (!config.aggressiveCleanup)
494
+ return text;
495
+ const lines = String(text || '').split('\n');
496
+ const out = [];
497
+ const fence = createFenceTracker();
498
+ const maxLT = config.aggressiveCleanupMaxLinkTextLength;
499
+ const htmlP = config.aggressiveCleanupHtmlTagPattern;
500
+ let sc = 0;
501
+ for (const line of lines) {
502
+ const trimmed = line.trim();
503
+ if (fence.check(trimmed)) {
504
+ out.push(line);
505
+ continue;
506
+ }
507
+ if (fence.inFence) {
508
+ out.push(line);
509
+ continue;
510
+ }
511
+ const cleaned = line.replace(/(\[)([^\]]*?)(\]\()([^)]+)(\))/g, (match, _o, lt, _m, url) => {
512
+ if (lt.length > maxLT || htmlP.test(lt)) {
513
+ sc++;
514
+ return `[link](${url})`;
515
+ }
516
+ return match;
517
+ });
518
+ out.push(cleaned);
519
+ }
520
+ if (sc > 0)
521
+ progress?.('postprocess', `aggressive cleanup stripped ${sc} link(s)`);
522
+ return out.join('\n');
523
+ };
524
+ // Full post-processing chain in prototype order (Section 41).
525
+ export const postProcessMarkdown = (text, config, progress) => {
526
+ let md = normalizeMarkdownPreserveCode(text);
527
+ md = dedupeConsecutiveDuplicateLines(md, config);
528
+ md = dedupeRepeatedBlocks(md);
529
+ md = dedupeTabPanelDuplicates(md);
530
+ md = collapseShortAdjacentLines(md, config);
531
+ md = cleanupPunctuation(md, config);
532
+ md = dedupeAdjacentLinks(md, config);
533
+ md = suppressRepeatedImages(md, config);
534
+ md = aggressiveCleanup(md, config, progress);
535
+ md = compactLinkLabels(md, config);
536
+ return md;
537
+ };
538
+ //# sourceMappingURL=md-postprocess.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"md-postprocess.js","sourceRoot":"","sources":["../../src/shared/md-postprocess.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ export interface ComputedStyleLike {
2
+ display: string;
3
+ visibility: string;
4
+ opacity: string;
5
+ fontSize: string;
6
+ fontWeight: string;
7
+ }
8
+ export interface AdapterCapabilities {
9
+ canComputeStyle: boolean;
10
+ canPseudoContent: boolean;
11
+ canShadowDom: boolean;
12
+ canInnerText: boolean;
13
+ canCurrentSrc: boolean;
14
+ }
15
+ export interface PageAdapter {
16
+ capabilities: Readonly<AdapterCapabilities>;
17
+ getComputedStyle(el: Element): ComputedStyleLike;
18
+ getPseudoContent(el: Element, pseudo: '::before' | '::after'): string;
19
+ innerText(el: Element): string;
20
+ shadowRoot(el: Element): unknown | null;
21
+ currentSrc(img: Element): string;
22
+ baseUrl(): string;
23
+ cssEscape(s: string): string;
24
+ document(): Document;
25
+ }
26
+ //# sourceMappingURL=page-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-adapter.d.ts","sourceRoot":"","sources":["../../src/shared/page-adapter.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAID,MAAM,WAAW,mBAAmB;IAClC,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IAI5C,gBAAgB,CAAC,EAAE,EAAE,OAAO,GAAG,iBAAiB,CAAC;IAIjD,gBAAgB,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC;IAMtE,SAAS,CAAC,EAAE,EAAE,OAAO,GAAG,MAAM,CAAC;IAG/B,UAAU,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,GAAG,IAAI,CAAC;IAGxC,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAAC;IAKjC,OAAO,IAAI,MAAM,CAAC;IAIlB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAG7B,QAAQ,IAAI,QAAQ,CAAC;CACtB"}
@@ -0,0 +1,15 @@
1
+ // PageAdapter interface: abstracts browser-only DOM APIs so the renderer
2
+ // can run in both browsers (real DOM) and Node.js (via linkedom).
3
+ //
4
+ // Callers MUST route every browser-only lookup (window.getComputedStyle,
5
+ // HTMLElement.innerText, Element.shadowRoot, HTMLImageElement.currentSrc,
6
+ // CSS.escape, location.href, ::before/::after content) through PageAdapter.
7
+ // Direct globals break tree-shaking and force the Node build to ship JSDOM.
8
+ //
9
+ // Design note (Spark P20): the interface also exposes CAPABILITIES so the
10
+ // renderer can BRANCH on real fidelity instead of receiving plausible-looking
11
+ // stub data. Example: badge detection uses fontSize; on Node the adapter
12
+ // declares canComputeStyle=false and the renderer falls back to class-name
13
+ // pattern detection instead of trusting a stubbed 16px.
14
+ export {};
15
+ //# sourceMappingURL=page-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-adapter.js","sourceRoot":"","sources":["../../src/shared/page-adapter.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,kEAAkE;AAClE,EAAE;AACF,yEAAyE;AACzE,0EAA0E;AAC1E,4EAA4E;AAC5E,4EAA4E;AAC5E,EAAE;AACF,0EAA0E;AAC1E,8EAA8E;AAC9E,yEAAyE;AACzE,2EAA2E;AAC3E,wDAAwD"}
@@ -0,0 +1,6 @@
1
+ import type { DerivedFlags, ExtractOptions, ProfileName, ProfileSettings, ProgressCallback, ResolvedConfig } from './types.js';
2
+ export declare const PROFILES: Record<ProfileName, ProfileSettings>;
3
+ export declare const detectProfile: (doc?: Document, loc?: Location) => ProfileName;
4
+ export declare const resolveConfig: (options?: ExtractOptions, progress?: ProgressCallback) => ResolvedConfig;
5
+ export declare const deriveFlags: (config: ResolvedConfig) => DerivedFlags;
6
+ //# sourceMappingURL=profiles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../../src/shared/profiles.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,YAAY,EACZ,cAAc,EACd,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,cAAc,EACf,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,WAAW,EAAE,eAAe,CAmGzD,CAAC;AAGF,eAAO,MAAM,aAAa,GACxB,MAAK,QAAmB,EACxB,MAAK,QAAmB,KACvB,WAmEF,CAAC;AAEF,eAAO,MAAM,aAAa,GACxB,UAAS,cAAmB,EAC5B,WAAW,gBAAgB,KAC1B,cAcF,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,QAAQ,cAAc,KAAG,YAsBpD,CAAC"}