@shadowcoderr/context-graph 0.3.2 → 0.3.4
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/README.md +448 -88
- package/dist/analyzers/a11y-extractor.d.ts +19 -5
- package/dist/analyzers/a11y-extractor.d.ts.map +1 -1
- package/dist/analyzers/a11y-extractor.js +274 -104
- package/dist/analyzers/a11y-extractor.js.map +1 -1
- package/dist/analyzers/network-logger.d.ts +20 -2
- package/dist/analyzers/network-logger.d.ts.map +1 -1
- package/dist/analyzers/network-logger.js +122 -42
- package/dist/analyzers/network-logger.js.map +1 -1
- package/dist/analyzers/network-patterns.d.ts +73 -0
- package/dist/analyzers/network-patterns.d.ts.map +1 -0
- package/dist/analyzers/network-patterns.js +316 -0
- package/dist/analyzers/network-patterns.js.map +1 -0
- package/dist/analyzers/screenshot-capturer.d.ts +73 -0
- package/dist/analyzers/screenshot-capturer.d.ts.map +1 -0
- package/dist/analyzers/screenshot-capturer.js +190 -0
- package/dist/analyzers/screenshot-capturer.js.map +1 -0
- package/dist/cli/index.js +17 -7
- package/dist/cli/index.js.map +1 -1
- package/dist/core/capture-engine.d.ts +30 -25
- package/dist/core/capture-engine.d.ts.map +1 -1
- package/dist/core/capture-engine.js +290 -276
- package/dist/core/capture-engine.js.map +1 -1
- package/dist/exporters/ai-context-bundler.d.ts +88 -0
- package/dist/exporters/ai-context-bundler.d.ts.map +1 -0
- package/dist/exporters/ai-context-bundler.js +380 -0
- package/dist/exporters/ai-context-bundler.js.map +1 -0
- package/dist/security/redactor.d.ts +16 -0
- package/dist/security/redactor.d.ts.map +1 -1
- package/dist/security/redactor.js +127 -57
- package/dist/security/redactor.js.map +1 -1
- package/dist/storage/engine.d.ts +24 -21
- package/dist/storage/engine.d.ts.map +1 -1
- package/dist/storage/engine.js +210 -176
- package/dist/storage/engine.js.map +1 -1
- package/dist/storage/manifest.d.ts.map +1 -1
- package/dist/storage/manifest.js +4 -3
- package/dist/storage/manifest.js.map +1 -1
- package/dist/utils/version.d.ts +5 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/utils/version.js +53 -0
- package/dist/utils/version.js.map +1 -0
- package/package.json +3 -3
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { Page } from '@playwright/test';
|
|
2
|
+
export interface ScreenshotOptions {
|
|
3
|
+
fullPage: boolean;
|
|
4
|
+
format: 'png' | 'jpeg' | 'webp';
|
|
5
|
+
quality?: number;
|
|
6
|
+
elementTargeting: boolean;
|
|
7
|
+
maxElements: number;
|
|
8
|
+
timeout: number;
|
|
9
|
+
}
|
|
10
|
+
export interface ScreenshotResult {
|
|
11
|
+
fullPagePath?: string | undefined;
|
|
12
|
+
elementPaths: Array<{
|
|
13
|
+
elementId: string;
|
|
14
|
+
path: string;
|
|
15
|
+
selector: string;
|
|
16
|
+
label?: string | undefined;
|
|
17
|
+
}>;
|
|
18
|
+
capturedAt: string;
|
|
19
|
+
dimensions?: {
|
|
20
|
+
width: number;
|
|
21
|
+
height: number;
|
|
22
|
+
} | undefined;
|
|
23
|
+
}
|
|
24
|
+
export declare class ScreenshotCapturer {
|
|
25
|
+
private options;
|
|
26
|
+
constructor(options?: Partial<ScreenshotOptions>);
|
|
27
|
+
/**
|
|
28
|
+
* Capture a full-page screenshot and return the saved path, or null on failure.
|
|
29
|
+
*/
|
|
30
|
+
captureFullPage(page: Page, outputDir: string, _captureId: string): Promise<string | null>;
|
|
31
|
+
/**
|
|
32
|
+
* Capture individual element screenshots for key interactive elements.
|
|
33
|
+
* Elements that are not visible, off-screen, or zero-size are skipped gracefully.
|
|
34
|
+
*/
|
|
35
|
+
captureElementScreenshots(page: Page, outputDir: string, _captureId: string, elements: Array<{
|
|
36
|
+
elementId: string;
|
|
37
|
+
selector: string;
|
|
38
|
+
label?: string;
|
|
39
|
+
}>): Promise<ScreenshotResult['elementPaths']>;
|
|
40
|
+
/**
|
|
41
|
+
* Orchestrates capturing screenshots for a page. Returns a ScreenshotResult
|
|
42
|
+
* with all paths. The caller is responsible for creating `pageDir`.
|
|
43
|
+
*/
|
|
44
|
+
capturePageScreenshots(page: Page, pageDir: string, captureId: string, interactiveElements?: Array<{
|
|
45
|
+
elementId: string;
|
|
46
|
+
selector: string;
|
|
47
|
+
label?: string;
|
|
48
|
+
}>): Promise<ScreenshotResult>;
|
|
49
|
+
/**
|
|
50
|
+
* Build a list of element descriptors suitable for element screenshot capture
|
|
51
|
+
* from locators data.
|
|
52
|
+
*/
|
|
53
|
+
static buildElementTargets(locatorsElements: Array<{
|
|
54
|
+
elementId: string;
|
|
55
|
+
tagName: string;
|
|
56
|
+
text?: string;
|
|
57
|
+
attributes: Record<string, any>;
|
|
58
|
+
computedState: {
|
|
59
|
+
isVisible: boolean;
|
|
60
|
+
isEnabled: boolean;
|
|
61
|
+
};
|
|
62
|
+
locators: Array<{
|
|
63
|
+
strategy: string;
|
|
64
|
+
value: string;
|
|
65
|
+
isUnique?: boolean;
|
|
66
|
+
}>;
|
|
67
|
+
}>): Array<{
|
|
68
|
+
elementId: string;
|
|
69
|
+
selector: string;
|
|
70
|
+
label?: string;
|
|
71
|
+
}>;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=screenshot-capturer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screenshot-capturer.d.ts","sourceRoot":"","sources":["../../src/analyzers/screenshot-capturer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAKxC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,YAAY,EAAE,KAAK,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KAC5B,CAAC,CAAC;IACH,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE;QACX,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,GAAG,SAAS,CAAC;CACf;AAWD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,OAAO,CAAoB;gBAEvB,OAAO,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC;IAIhD;;OAEG;IACG,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IA6BhG;;;OAGG;IACG,yBAAyB,CAC7B,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GACvE,OAAO,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;IAmD5C;;;OAGG;IACG,sBAAsB,CAC1B,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,mBAAmB,GAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAM,GACvF,OAAO,CAAC,gBAAgB,CAAC;IAqC5B;;;OAGG;IACH,MAAM,CAAC,mBAAmB,CACxB,gBAAgB,EAAE,KAAK,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAChC,aAAa,EAAE;YAAE,SAAS,EAAE,OAAO,CAAC;YAAC,SAAS,EAAE,OAAO,CAAA;SAAE,CAAC;QAC1D,QAAQ,EAAE,KAAK,CAAC;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;SAAE,CAAC,CAAC;KAC1E,CAAC,GACD,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CA0BlE"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.ScreenshotCapturer = void 0;
|
|
37
|
+
const fs = __importStar(require("fs-extra"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const logger_1 = require("../utils/logger");
|
|
40
|
+
const DEFAULT_OPTIONS = {
|
|
41
|
+
fullPage: true,
|
|
42
|
+
format: 'png',
|
|
43
|
+
quality: 90,
|
|
44
|
+
elementTargeting: false,
|
|
45
|
+
maxElements: 10,
|
|
46
|
+
timeout: 15000,
|
|
47
|
+
};
|
|
48
|
+
class ScreenshotCapturer {
|
|
49
|
+
options;
|
|
50
|
+
constructor(options) {
|
|
51
|
+
this.options = { ...DEFAULT_OPTIONS, ...options };
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Capture a full-page screenshot and return the saved path, or null on failure.
|
|
55
|
+
*/
|
|
56
|
+
async captureFullPage(page, outputDir, _captureId) {
|
|
57
|
+
try {
|
|
58
|
+
await fs.ensureDir(outputDir);
|
|
59
|
+
const filename = `screenshot.${this.options.format}`;
|
|
60
|
+
const filepath = path.join(outputDir, filename);
|
|
61
|
+
const screenshotOpts = {
|
|
62
|
+
path: filepath,
|
|
63
|
+
fullPage: this.options.fullPage,
|
|
64
|
+
type: this.options.format === 'webp' ? 'png' : this.options.format, // Playwright screenshot doesn't support webp directly in some versions, fallback to png for type if it's webp or just cast to any
|
|
65
|
+
animations: 'disabled',
|
|
66
|
+
timeout: this.options.timeout,
|
|
67
|
+
};
|
|
68
|
+
// quality only applies to lossy formats
|
|
69
|
+
if (this.options.format !== 'png' && this.options.quality !== undefined) {
|
|
70
|
+
screenshotOpts.quality = this.options.quality;
|
|
71
|
+
}
|
|
72
|
+
await page.screenshot(screenshotOpts);
|
|
73
|
+
logger_1.logger.info(`Full-page screenshot saved: ${filepath}`);
|
|
74
|
+
return filepath;
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
logger_1.logger.warn(`Failed to capture full-page screenshot: ${error.message}`);
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Capture individual element screenshots for key interactive elements.
|
|
83
|
+
* Elements that are not visible, off-screen, or zero-size are skipped gracefully.
|
|
84
|
+
*/
|
|
85
|
+
async captureElementScreenshots(page, outputDir, _captureId, elements) {
|
|
86
|
+
const results = [];
|
|
87
|
+
await fs.ensureDir(outputDir);
|
|
88
|
+
const batch = elements.slice(0, this.options.maxElements);
|
|
89
|
+
for (const element of batch) {
|
|
90
|
+
try {
|
|
91
|
+
const locator = page.locator(element.selector).first();
|
|
92
|
+
const count = await locator.count().catch(() => 0);
|
|
93
|
+
if (count === 0)
|
|
94
|
+
continue;
|
|
95
|
+
const isVisible = await locator.isVisible({ timeout: 2000 }).catch(() => false);
|
|
96
|
+
if (!isVisible)
|
|
97
|
+
continue;
|
|
98
|
+
const box = await locator.boundingBox().catch(() => null);
|
|
99
|
+
if (!box || box.width === 0 || box.height === 0)
|
|
100
|
+
continue;
|
|
101
|
+
const safe = element.elementId.replace(/[^a-z0-9_-]/gi, '_');
|
|
102
|
+
const filename = `element_${safe}.${this.options.format}`;
|
|
103
|
+
const filepath = path.join(outputDir, filename);
|
|
104
|
+
const eleOpts = {
|
|
105
|
+
path: filepath,
|
|
106
|
+
type: this.options.format === 'webp' ? 'png' : this.options.format,
|
|
107
|
+
animations: 'disabled',
|
|
108
|
+
timeout: this.options.timeout,
|
|
109
|
+
};
|
|
110
|
+
if (this.options.format !== 'png' && this.options.quality !== undefined) {
|
|
111
|
+
eleOpts.quality = this.options.quality;
|
|
112
|
+
}
|
|
113
|
+
await locator.screenshot(eleOpts);
|
|
114
|
+
results.push({
|
|
115
|
+
elementId: element.elementId,
|
|
116
|
+
path: filepath,
|
|
117
|
+
selector: element.selector,
|
|
118
|
+
label: element.label || undefined
|
|
119
|
+
});
|
|
120
|
+
logger_1.logger.debug(`Element screenshot saved: ${filepath}`);
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
logger_1.logger.debug(`Skipping element screenshot (${element.elementId}): ${error.message}`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return results;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Orchestrates capturing screenshots for a page. Returns a ScreenshotResult
|
|
130
|
+
* with all paths. The caller is responsible for creating `pageDir`.
|
|
131
|
+
*/
|
|
132
|
+
async capturePageScreenshots(page, pageDir, captureId, interactiveElements = []) {
|
|
133
|
+
const screenshotsDir = path.join(pageDir, 'screenshots');
|
|
134
|
+
const result = {
|
|
135
|
+
elementPaths: [],
|
|
136
|
+
capturedAt: new Date().toISOString(),
|
|
137
|
+
};
|
|
138
|
+
// Full-page screenshot
|
|
139
|
+
const fullPagePath = await this.captureFullPage(page, screenshotsDir, captureId);
|
|
140
|
+
if (fullPagePath) {
|
|
141
|
+
result.fullPagePath = fullPagePath;
|
|
142
|
+
// Attempt to read dimensions via viewport
|
|
143
|
+
try {
|
|
144
|
+
const vp = page.viewportSize();
|
|
145
|
+
if (vp) {
|
|
146
|
+
result.dimensions = { width: vp.width, height: vp.height };
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
logger_1.logger.debug(`Failed to get viewport size: ${error.message}`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// Optional element-level screenshots
|
|
154
|
+
if (this.options.elementTargeting && interactiveElements.length > 0) {
|
|
155
|
+
const elementsDir = path.join(screenshotsDir, 'elements');
|
|
156
|
+
result.elementPaths = await this.captureElementScreenshots(page, elementsDir, captureId, interactiveElements);
|
|
157
|
+
}
|
|
158
|
+
return result;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Build a list of element descriptors suitable for element screenshot capture
|
|
162
|
+
* from locators data.
|
|
163
|
+
*/
|
|
164
|
+
static buildElementTargets(locatorsElements) {
|
|
165
|
+
return locatorsElements
|
|
166
|
+
.filter(el => el.computedState.isVisible && el.computedState.isEnabled)
|
|
167
|
+
.filter(el => ['button', 'a', 'input', 'select', 'textarea'].includes(el.tagName))
|
|
168
|
+
.map(el => {
|
|
169
|
+
// Prefer a unique locator or fall back to the first available
|
|
170
|
+
const best = el.locators.find(l => l.isUnique && l.strategy === 'testid') ||
|
|
171
|
+
el.locators.find(l => l.isUnique && l.strategy === 'role') ||
|
|
172
|
+
el.locators.find(l => l.isUnique) ||
|
|
173
|
+
el.locators[0];
|
|
174
|
+
if (!best)
|
|
175
|
+
return null;
|
|
176
|
+
return {
|
|
177
|
+
elementId: el.elementId,
|
|
178
|
+
selector: el.attributes?.['data-testid']
|
|
179
|
+
? `[data-testid="${el.attributes['data-testid']}"]`
|
|
180
|
+
: el.attributes?.id
|
|
181
|
+
? `#${el.attributes.id}`
|
|
182
|
+
: best.value,
|
|
183
|
+
label: el.text?.trim().substring(0, 40) || el.attributes?.['aria-label'] || undefined,
|
|
184
|
+
};
|
|
185
|
+
})
|
|
186
|
+
.filter(Boolean);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
exports.ScreenshotCapturer = ScreenshotCapturer;
|
|
190
|
+
//# sourceMappingURL=screenshot-capturer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screenshot-capturer.js","sourceRoot":"","sources":["../../src/analyzers/screenshot-capturer.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/index.js
CHANGED
|
@@ -13,11 +13,12 @@ const runtime_1 = require("../core/runtime");
|
|
|
13
13
|
const loader_1 = require("../config/loader");
|
|
14
14
|
const validators_1 = require("../utils/validators");
|
|
15
15
|
const logger_1 = require("../utils/logger");
|
|
16
|
+
const version_1 = require("../utils/version");
|
|
16
17
|
const program = new commander_1.Command();
|
|
17
18
|
program
|
|
18
19
|
.name('context-graph')
|
|
19
20
|
.description('A deterministic "Flight Data Recorder" for web applications')
|
|
20
|
-
.version(
|
|
21
|
+
.version((0, version_1.getVersion)());
|
|
21
22
|
program
|
|
22
23
|
.argument('[startUrl]', 'Starting URL (optional)')
|
|
23
24
|
.option('-m, --mode <type>', 'Operating mode (browser|recorder)', 'browser')
|
|
@@ -112,13 +113,22 @@ program.action(async (startUrl, options) => {
|
|
|
112
113
|
await runtime.setupPage(page);
|
|
113
114
|
if (finalStartUrl) {
|
|
114
115
|
spinner.text = `Navigating to ${finalStartUrl}...`;
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
116
|
+
try {
|
|
117
|
+
await page.goto(finalStartUrl, { waitUntil: 'domcontentloaded' });
|
|
118
|
+
spinner.succeed(`Navigated to ${finalStartUrl}`);
|
|
119
|
+
// Give a moment for any post-load scripts to run
|
|
120
|
+
await new Promise(r => setTimeout(r, 1000));
|
|
121
|
+
// Ensure initial page is captured (fallback if events didn't fire)
|
|
122
|
+
await runtime.capturePageIfNeeded(page);
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
spinner.fail(`Failed to navigate to ${finalStartUrl}`);
|
|
126
|
+
throw error;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
spinner.stop();
|
|
120
131
|
}
|
|
121
|
-
spinner.stop();
|
|
122
132
|
console.log(chalk_1.default.green('✓ Browser ready!'));
|
|
123
133
|
console.log(chalk_1.default.blue('Navigate through the application. Each page will be captured automatically.'));
|
|
124
134
|
console.log(chalk_1.default.yellow('Press Ctrl+C to stop and save all data...'));
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;AAEA,sCAAsC;;;;;AAEtC,yCAAoC;AACpC,kDAA0B;AAC1B,8CAAsB;AACtB,wDAAgC;AAChC,6CAAiE;AACjE,6CAA8C;AAC9C,oDAAiD;AACjD,4CAAyC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,47 +6,52 @@ export declare class CaptureEngine {
|
|
|
6
6
|
private a11yExtractor;
|
|
7
7
|
private locatorGenerator;
|
|
8
8
|
private networkLogger;
|
|
9
|
+
private screenshotCapturer;
|
|
9
10
|
private redactor;
|
|
10
11
|
private validator;
|
|
11
12
|
constructor(config: Config);
|
|
12
13
|
attachNetworkListeners(page: Page): Promise<void>;
|
|
13
|
-
|
|
14
|
+
/**
|
|
15
|
+
* Capture a full snapshot of the current page state.
|
|
16
|
+
*
|
|
17
|
+
* @param page — Playwright Page instance
|
|
18
|
+
* @param config — Active configuration
|
|
19
|
+
* @param consoleMessages — Console messages buffered by BrowserAdapter
|
|
20
|
+
* @param pageDir — If provided, full-page screenshots are captured here.
|
|
21
|
+
* The caller is responsible for ensuring the directory
|
|
22
|
+
* exists before passing this parameter.
|
|
23
|
+
*/
|
|
24
|
+
capturePageSnapshot(page: Page, config: Config, consoleMessages?: any[], pageDir?: string): Promise<PageSnapshot>;
|
|
14
25
|
private getFrameHierarchy;
|
|
15
|
-
getRedactionAudit(): import("../types/storage").RedactionAuditEntry[];
|
|
16
|
-
private generatePageName;
|
|
17
|
-
private sanitize;
|
|
18
26
|
/**
|
|
19
|
-
* Compute a
|
|
20
|
-
*
|
|
27
|
+
* Compute a structural fingerprint of the page for change detection.
|
|
28
|
+
*
|
|
29
|
+
* Instead of truncating the raw HTML at 5 000 chars (which causes SPAs with
|
|
30
|
+
* large identical `<head>` sections to hash identically across routes), we
|
|
31
|
+
* extract a token stream of `tagName[#id][@role]` from the DOM. This is
|
|
32
|
+
* order-sensitive, compact, and captures the semantic structure without
|
|
33
|
+
* being affected by text-content changes that don't alter layout.
|
|
21
34
|
*/
|
|
22
35
|
private computeContentHash;
|
|
23
36
|
/**
|
|
24
|
-
*
|
|
37
|
+
* Extract a structural token stream from HTML rather than truncating text.
|
|
38
|
+
* Produces strings like `div#app@main|button|input@textbox` — semantically
|
|
39
|
+
* rich but immune to text-content noise and `<head>` boilerplate.
|
|
40
|
+
*
|
|
41
|
+
* Up to 500 tokens are extracted to bound memory usage while covering
|
|
42
|
+
* enough of the page to reliably detect structural changes.
|
|
25
43
|
*/
|
|
26
44
|
private normalizeDomForHash;
|
|
27
|
-
/**
|
|
28
|
-
* Normalize accessibility tree for hashing
|
|
29
|
-
*/
|
|
30
45
|
private normalizeA11yForHash;
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
*/
|
|
46
|
+
private generatePageName;
|
|
47
|
+
private sanitizeName;
|
|
34
48
|
private capturePageState;
|
|
35
|
-
/**
|
|
36
|
-
* Capture network request summary
|
|
37
|
-
*/
|
|
38
49
|
private captureNetworkSummary;
|
|
39
|
-
/**
|
|
40
|
-
* Capture enhanced timing metrics
|
|
41
|
-
*/
|
|
42
50
|
private captureEnhancedTiming;
|
|
43
|
-
/**
|
|
44
|
-
* Enhance locators data with CSS styles, viewport info, and form details
|
|
45
|
-
*/
|
|
46
51
|
private enhanceLocatorsData;
|
|
47
|
-
/**
|
|
48
|
-
* Capture form field details
|
|
49
|
-
*/
|
|
50
52
|
private captureFormFieldDetails;
|
|
53
|
+
getRedactionAudit(): import("../types/storage").RedactionAuditEntry[];
|
|
54
|
+
/** Network event count — passed to StorageEngine for statistics */
|
|
55
|
+
getNetworkEventCount(): number;
|
|
51
56
|
}
|
|
52
57
|
//# sourceMappingURL=capture-engine.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capture-engine.d.ts","sourceRoot":"","sources":["../../src/core/capture-engine.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"capture-engine.d.ts","sourceRoot":"","sources":["../../src/core/capture-engine.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAUhD,qBAAa,aAAa;IACxB,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,aAAa,CAAyB;IAC9C,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,OAAO,CAAC,QAAQ,CAAmB;IACnC,OAAO,CAAC,SAAS,CAAgB;gBAErB,MAAM,EAAE,MAAM;IAgBpB,sBAAsB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvD;;;;;;;;;OASG;IACG,mBAAmB,CACvB,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,EACd,eAAe,GAAE,GAAG,EAAO,EAC3B,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,YAAY,CAAC;YAgJV,iBAAiB;IAuB/B;;;;;;;;OAQG;IACH,OAAO,CAAC,kBAAkB;IAuB1B;;;;;;;OAOG;IACH,OAAO,CAAC,mBAAmB;IAiB3B,OAAO,CAAC,oBAAoB;IAW5B,OAAO,CAAC,gBAAgB;IA0CxB,OAAO,CAAC,YAAY;YAUN,gBAAgB;YA4DhB,qBAAqB;YAwCrB,qBAAqB;YA8BrB,mBAAmB;YAyHnB,uBAAuB;IA6DrC,iBAAiB;IAIjB,mEAAmE;IACnE,oBAAoB,IAAI,MAAM;CAG/B"}
|