@shadowcoderr/context-graph 0.3.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 (115) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +185 -0
  3. package/dist/analyzers/a11y-extractor.d.ts +15 -0
  4. package/dist/analyzers/a11y-extractor.d.ts.map +1 -0
  5. package/dist/analyzers/a11y-extractor.js +148 -0
  6. package/dist/analyzers/a11y-extractor.js.map +1 -0
  7. package/dist/analyzers/dom-analyzer.d.ts +20 -0
  8. package/dist/analyzers/dom-analyzer.d.ts.map +1 -0
  9. package/dist/analyzers/dom-analyzer.js +126 -0
  10. package/dist/analyzers/dom-analyzer.js.map +1 -0
  11. package/dist/analyzers/locator-generator.d.ts +13 -0
  12. package/dist/analyzers/locator-generator.d.ts.map +1 -0
  13. package/dist/analyzers/locator-generator.js +381 -0
  14. package/dist/analyzers/locator-generator.js.map +1 -0
  15. package/dist/analyzers/network-logger.d.ts +15 -0
  16. package/dist/analyzers/network-logger.d.ts.map +1 -0
  17. package/dist/analyzers/network-logger.js +71 -0
  18. package/dist/analyzers/network-logger.js.map +1 -0
  19. package/dist/cli/index.d.ts +2 -0
  20. package/dist/cli/index.d.ts.map +1 -0
  21. package/dist/cli/index.js +155 -0
  22. package/dist/cli/index.js.map +1 -0
  23. package/dist/config/defaults.d.ts +3 -0
  24. package/dist/config/defaults.d.ts.map +1 -0
  25. package/dist/config/defaults.js +54 -0
  26. package/dist/config/defaults.js.map +1 -0
  27. package/dist/config/loader.d.ts +3 -0
  28. package/dist/config/loader.d.ts.map +1 -0
  29. package/dist/config/loader.js +75 -0
  30. package/dist/config/loader.js.map +1 -0
  31. package/dist/config/schema.d.ts +168 -0
  32. package/dist/config/schema.d.ts.map +1 -0
  33. package/dist/config/schema.js +104 -0
  34. package/dist/config/schema.js.map +1 -0
  35. package/dist/core/browser-adapter.d.ts +24 -0
  36. package/dist/core/browser-adapter.d.ts.map +1 -0
  37. package/dist/core/browser-adapter.js +208 -0
  38. package/dist/core/browser-adapter.js.map +1 -0
  39. package/dist/core/capture-engine.d.ts +52 -0
  40. package/dist/core/capture-engine.d.ts.map +1 -0
  41. package/dist/core/capture-engine.js +593 -0
  42. package/dist/core/capture-engine.js.map +1 -0
  43. package/dist/core/runtime.d.ts +38 -0
  44. package/dist/core/runtime.d.ts.map +1 -0
  45. package/dist/core/runtime.js +648 -0
  46. package/dist/core/runtime.js.map +1 -0
  47. package/dist/prompts/init-prompt.d.ts +12 -0
  48. package/dist/prompts/init-prompt.d.ts.map +1 -0
  49. package/dist/prompts/init-prompt.js +128 -0
  50. package/dist/prompts/init-prompt.js.map +1 -0
  51. package/dist/registry/components-registry.d.ts +97 -0
  52. package/dist/registry/components-registry.d.ts.map +1 -0
  53. package/dist/registry/components-registry.js +469 -0
  54. package/dist/registry/components-registry.js.map +1 -0
  55. package/dist/registry/index.d.ts +2 -0
  56. package/dist/registry/index.d.ts.map +1 -0
  57. package/dist/registry/index.js +7 -0
  58. package/dist/registry/index.js.map +1 -0
  59. package/dist/security/patterns.d.ts +4 -0
  60. package/dist/security/patterns.d.ts.map +1 -0
  61. package/dist/security/patterns.js +65 -0
  62. package/dist/security/patterns.js.map +1 -0
  63. package/dist/security/redactor.d.ts +26 -0
  64. package/dist/security/redactor.d.ts.map +1 -0
  65. package/dist/security/redactor.js +128 -0
  66. package/dist/security/redactor.js.map +1 -0
  67. package/dist/security/validator.d.ts +11 -0
  68. package/dist/security/validator.d.ts.map +1 -0
  69. package/dist/security/validator.js +62 -0
  70. package/dist/security/validator.js.map +1 -0
  71. package/dist/storage/engine.d.ts +45 -0
  72. package/dist/storage/engine.d.ts.map +1 -0
  73. package/dist/storage/engine.js +479 -0
  74. package/dist/storage/engine.js.map +1 -0
  75. package/dist/storage/manifest.d.ts +10 -0
  76. package/dist/storage/manifest.d.ts.map +1 -0
  77. package/dist/storage/manifest.js +98 -0
  78. package/dist/storage/manifest.js.map +1 -0
  79. package/dist/storage/serializer.d.ts +9 -0
  80. package/dist/storage/serializer.d.ts.map +1 -0
  81. package/dist/storage/serializer.js +22 -0
  82. package/dist/storage/serializer.js.map +1 -0
  83. package/dist/types/capture.d.ts +206 -0
  84. package/dist/types/capture.d.ts.map +1 -0
  85. package/dist/types/capture.js +3 -0
  86. package/dist/types/capture.js.map +1 -0
  87. package/dist/types/config.d.ts +63 -0
  88. package/dist/types/config.d.ts.map +1 -0
  89. package/dist/types/config.js +3 -0
  90. package/dist/types/config.js.map +1 -0
  91. package/dist/types/registry.d.ts +94 -0
  92. package/dist/types/registry.d.ts.map +1 -0
  93. package/dist/types/registry.js +3 -0
  94. package/dist/types/registry.js.map +1 -0
  95. package/dist/types/storage.d.ts +57 -0
  96. package/dist/types/storage.d.ts.map +1 -0
  97. package/dist/types/storage.js +3 -0
  98. package/dist/types/storage.js.map +1 -0
  99. package/dist/utils/hash.d.ts +3 -0
  100. package/dist/utils/hash.d.ts.map +1 -0
  101. package/dist/utils/hash.js +26 -0
  102. package/dist/utils/hash.js.map +1 -0
  103. package/dist/utils/logger.d.ts +20 -0
  104. package/dist/utils/logger.d.ts.map +1 -0
  105. package/dist/utils/logger.js +86 -0
  106. package/dist/utils/logger.js.map +1 -0
  107. package/dist/utils/pom-generator.d.ts +12 -0
  108. package/dist/utils/pom-generator.d.ts.map +1 -0
  109. package/dist/utils/pom-generator.js +83 -0
  110. package/dist/utils/pom-generator.js.map +1 -0
  111. package/dist/utils/validators.d.ts +7 -0
  112. package/dist/utils/validators.d.ts.map +1 -0
  113. package/dist/utils/validators.js +51 -0
  114. package/dist/utils/validators.js.map +1 -0
  115. package/package.json +70 -0
@@ -0,0 +1,381 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LocatorGenerator = void 0;
4
+ const logger_1 = require("../utils/logger");
5
+ class LocatorGenerator {
6
+ async generateLocators(page) {
7
+ logger_1.logger.info('Starting locator generation');
8
+ const elementLocators = [];
9
+ try {
10
+ // Wait for page to be fully interactive
11
+ try {
12
+ await page.waitForLoadState('networkidle', { timeout: 10000 }).catch(() => {
13
+ logger_1.logger.debug('Network idle wait timed out, continuing with locator generation');
14
+ });
15
+ }
16
+ catch (error) {
17
+ logger_1.logger.warn(`Error waiting for network idle: ${error.message}`);
18
+ }
19
+ // Try multiple selector strategies to find interactive elements
20
+ const selectorStrategies = [
21
+ // Test attributes first (most reliable)
22
+ { selector: '[data-test]', name: 'data-test' },
23
+ { selector: '[data-testid]', name: 'data-testid' },
24
+ { selector: '[data-cy]', name: 'data-cy' },
25
+ { selector: '[data-qa]', name: 'data-qa' },
26
+ // Standard interactive elements
27
+ { selector: 'button:not([disabled])', name: 'button' },
28
+ { selector: 'a[href]:not([href=""])', name: 'link' },
29
+ { selector: 'input:not([type="hidden"]):not([disabled])', name: 'input' },
30
+ { selector: 'select:not([disabled])', name: 'select' },
31
+ { selector: 'textarea:not([disabled])', name: 'textarea' },
32
+ { selector: '[role="button"]', name: 'role=button' },
33
+ { selector: '[role="link"]', name: 'role=link' },
34
+ { selector: '[role="textbox"]', name: 'role=textbox' },
35
+ { selector: '[role="checkbox"]', name: 'role=checkbox' },
36
+ { selector: '[role="radio"]', name: 'role=radio' },
37
+ { selector: '[role="combobox"]', name: 'role=combobox' },
38
+ // Fallback to all clickable elements
39
+ { selector: 'button, a, input, select, textarea, [role="button"], [role="link"], [role="textbox"], [role="checkbox"], [role="radio"], [role="combobox"]', name: 'all-interactive' }
40
+ ];
41
+ const seenElements = new Set();
42
+ for (const { selector, name } of selectorStrategies) {
43
+ try {
44
+ logger_1.logger.debug(`Trying selector: ${name} (${selector})`);
45
+ // Use .all() to get all handles
46
+ const elements = await page.locator(selector).all();
47
+ for (const element of elements) {
48
+ try {
49
+ // Generate a unique key for the element to avoid duplicates
50
+ // We use evaluate to get DOM properties for the signature
51
+ const elementKey = await element.evaluate((el) => {
52
+ const tag = el.tagName.toLowerCase();
53
+ const id = el.id ? `#${el.id}` : '';
54
+ const classes = el.className && typeof el.className === 'string'
55
+ ? `.${el.className.split(' ').filter(c => c).join('.')}`
56
+ : '';
57
+ const nameAttr = el.name ? `[name="${el.name}"]` : '';
58
+ // Add rect to key to distinguish identical elements in different locations
59
+ const rect = el.getBoundingClientRect();
60
+ const pos = `(${Math.round(rect.x)},${Math.round(rect.y)})`;
61
+ return `${tag}${id}${classes}${nameAttr}${pos}`;
62
+ }).catch(() => '');
63
+ if (!elementKey || seenElements.has(elementKey))
64
+ continue;
65
+ seenElements.add(elementKey);
66
+ const locator = await this.generateElementLocator(element, elementLocators.length, page);
67
+ if (locator) {
68
+ elementLocators.push(locator);
69
+ }
70
+ }
71
+ catch (error) {
72
+ // Individual element processing error, skip and continue
73
+ logger_1.logger.debug(`Error processing element with selector ${name}: ${error.message}`);
74
+ }
75
+ }
76
+ }
77
+ catch (error) {
78
+ const errorMessage = error.message;
79
+ // Check for fatal browser closure errors
80
+ if (errorMessage.includes('Target page, context or browser has been closed') ||
81
+ errorMessage.includes('Execution context was destroyed')) {
82
+ logger_1.logger.warn(`Browser connection lost, stopping locator generation: ${errorMessage}`);
83
+ throw error; // Re-throw to stop the entire process
84
+ }
85
+ logger_1.logger.warn(`Error with selector ${name} (${selector}): ${errorMessage}`);
86
+ }
87
+ }
88
+ logger_1.logger.info(`Generated locators for ${elementLocators.length} elements`);
89
+ }
90
+ catch (error) {
91
+ logger_1.logger.error(`Error in generateLocators: ${error.message}`);
92
+ }
93
+ return { elements: elementLocators };
94
+ }
95
+ async generateElementLocator(element, index, page) {
96
+ try {
97
+ const tagName = await element.evaluate((el) => el.tagName.toLowerCase());
98
+ const text = await element.textContent();
99
+ const attributes = await element.evaluate((el) => {
100
+ const attrs = {};
101
+ for (let i = 0; i < el.attributes.length; i++) {
102
+ const attr = el.attributes[i];
103
+ attrs[attr.name] = attr.value;
104
+ }
105
+ return attrs;
106
+ });
107
+ const boundingBox = await element.boundingBox();
108
+ const isVisible = await element.isVisible();
109
+ const isEnabled = await element.isEnabled();
110
+ const isEditable = await element.isEditable().catch(() => false);
111
+ // Fix: Only check isChecked for valid types
112
+ let isChecked = false;
113
+ if (tagName === 'input') {
114
+ const type = attributes['type'];
115
+ if (type === 'checkbox' || type === 'radio') {
116
+ isChecked = await element.isChecked().catch(() => false);
117
+ }
118
+ }
119
+ const locators = [];
120
+ // Role-based locator (highest priority)
121
+ const role = await this.getRole(element);
122
+ if (role) {
123
+ const roleLocator = `getByRole('${role.role}'${role.name ? `, { name: '${role.name}' }` : ''})`;
124
+ const matchInfo = await this.getMatchCount(page, 'role', role.role, role.name);
125
+ locators.push({
126
+ strategy: 'role',
127
+ value: roleLocator,
128
+ confidence: 'high',
129
+ resilience: 95,
130
+ matchCount: matchInfo.matchCount,
131
+ isUnique: matchInfo.isUnique,
132
+ });
133
+ }
134
+ // TestID locator
135
+ if (attributes['data-testid']) {
136
+ const testId = attributes['data-testid'];
137
+ const matchInfo = await this.getMatchCount(page, 'testid', testId);
138
+ locators.push({
139
+ strategy: 'testid',
140
+ value: `getByTestId('${testId}')`,
141
+ confidence: 'high',
142
+ resilience: 90,
143
+ matchCount: matchInfo.matchCount,
144
+ isUnique: matchInfo.isUnique,
145
+ });
146
+ }
147
+ else if (attributes['data-test']) {
148
+ const testId = attributes['data-test'];
149
+ const matchInfo = await this.getMatchCount(page, 'testid', testId);
150
+ locators.push({
151
+ strategy: 'testid',
152
+ value: `getByTestId('${testId}')`,
153
+ confidence: 'high',
154
+ resilience: 90,
155
+ matchCount: matchInfo.matchCount,
156
+ isUnique: matchInfo.isUnique,
157
+ });
158
+ }
159
+ // Label locator for form elements
160
+ if (tagName === 'input' || tagName === 'select' || tagName === 'textarea') {
161
+ const label = await this.getAssociatedLabel(element);
162
+ if (label) {
163
+ const matchInfo = await this.getMatchCount(page, 'label', label);
164
+ locators.push({
165
+ strategy: 'label',
166
+ value: `getByLabel('${label}')`,
167
+ confidence: 'high',
168
+ resilience: 85,
169
+ matchCount: matchInfo.matchCount,
170
+ isUnique: matchInfo.isUnique,
171
+ });
172
+ }
173
+ }
174
+ // Placeholder locator
175
+ if (attributes.placeholder) {
176
+ const matchInfo = await this.getMatchCount(page, 'placeholder', attributes.placeholder);
177
+ locators.push({
178
+ strategy: 'placeholder',
179
+ value: `getByPlaceholder('${attributes.placeholder}')`,
180
+ confidence: 'medium',
181
+ resilience: 70,
182
+ matchCount: matchInfo.matchCount,
183
+ isUnique: matchInfo.isUnique,
184
+ });
185
+ }
186
+ // Text locator
187
+ if (text && text.trim().length > 0 && text.trim().length < 50) { // Limit length for text locators
188
+ const matchInfo = await this.getMatchCount(page, 'text', text.trim());
189
+ locators.push({
190
+ strategy: 'text',
191
+ value: `getByText('${text.trim()}')`,
192
+ confidence: 'medium',
193
+ resilience: 60,
194
+ matchCount: matchInfo.matchCount,
195
+ isUnique: matchInfo.isUnique,
196
+ });
197
+ }
198
+ // CSS selector (fallback)
199
+ const cssSelector = await element.evaluate((el) => {
200
+ const getSelector = (element) => {
201
+ if (element.id)
202
+ return `#${element.id}`;
203
+ if (element.className && typeof element.className === 'string') {
204
+ return `${element.tagName.toLowerCase()}.${element.className.split(' ').filter(c => c).join('.')}`;
205
+ }
206
+ if (element.name)
207
+ return `${element.tagName.toLowerCase()}[name="${element.name}"]`;
208
+ return element.tagName.toLowerCase();
209
+ };
210
+ return getSelector(el);
211
+ });
212
+ const cssMatchInfo = await this.getMatchCount(page, 'css', cssSelector);
213
+ locators.push({
214
+ strategy: 'css',
215
+ value: cssSelector,
216
+ confidence: 'low',
217
+ resilience: 30,
218
+ matchCount: cssMatchInfo.matchCount,
219
+ isUnique: cssMatchInfo.isUnique,
220
+ });
221
+ const elementId = `elem_${index.toString().padStart(3, '0')}`;
222
+ // Add data attribute for later reference (non-destructive if possible, wrap in try/catch)
223
+ try {
224
+ await element.evaluate((el, id) => {
225
+ el.setAttribute('data-cc-element-id', id);
226
+ }, elementId);
227
+ }
228
+ catch { }
229
+ return {
230
+ elementId,
231
+ tagName,
232
+ text: text?.trim(),
233
+ locators,
234
+ attributes,
235
+ computedState: {
236
+ isVisible,
237
+ isEnabled,
238
+ isChecked,
239
+ isEditable,
240
+ isFocusable: isVisible && isEnabled, // Approximation
241
+ },
242
+ position: boundingBox ? {
243
+ x: boundingBox.x,
244
+ y: boundingBox.y,
245
+ width: boundingBox.width,
246
+ height: boundingBox.height,
247
+ } : { x: 0, y: 0, width: 0, height: 0 },
248
+ };
249
+ }
250
+ catch (error) {
251
+ // Skip elements that can't be analyzed
252
+ return null;
253
+ }
254
+ }
255
+ async getRole(element) {
256
+ try {
257
+ const role = await element.getAttribute('role');
258
+ const ariaLabel = await element.getAttribute('aria-label');
259
+ const text = await element.textContent();
260
+ let elementRole = role;
261
+ if (!elementRole) {
262
+ const tagName = await element.evaluate((el) => el.tagName.toLowerCase());
263
+ const type = await element.getAttribute('type');
264
+ switch (tagName) {
265
+ case 'button':
266
+ elementRole = 'button';
267
+ break;
268
+ case 'input': {
269
+ if (type === 'checkbox')
270
+ elementRole = 'checkbox';
271
+ else if (type === 'radio')
272
+ elementRole = 'radio';
273
+ else if (type === 'submit' || type === 'button' || type === 'reset')
274
+ elementRole = 'button';
275
+ else if (type === 'search')
276
+ elementRole = 'searchbox';
277
+ else
278
+ elementRole = 'textbox';
279
+ break;
280
+ }
281
+ case 'select':
282
+ elementRole = 'combobox';
283
+ break;
284
+ case 'textarea':
285
+ elementRole = 'textbox';
286
+ break;
287
+ case 'a':
288
+ if (await element.getAttribute('href'))
289
+ elementRole = 'link';
290
+ break;
291
+ }
292
+ }
293
+ if (elementRole) {
294
+ return {
295
+ role: elementRole,
296
+ name: ariaLabel || text?.trim(),
297
+ };
298
+ }
299
+ }
300
+ catch (error) {
301
+ // Ignore
302
+ }
303
+ return null;
304
+ }
305
+ async getAssociatedLabel(element) {
306
+ try {
307
+ const label = await element.evaluate((el) => {
308
+ // Check for aria-labelledby
309
+ const labelledBy = el.getAttribute('aria-labelledby');
310
+ if (labelledBy) {
311
+ const labelElement = document.getElementById(labelledBy);
312
+ return labelElement?.textContent?.trim() || null;
313
+ }
314
+ // Check for associated label via 'for' attribute
315
+ const id = el.id;
316
+ if (id) {
317
+ const labelElement = document.querySelector(`label[for="${id}"]`);
318
+ return labelElement?.textContent?.trim() || null;
319
+ }
320
+ // Check parent label (implicit wrapping)
321
+ const parent = el.parentElement;
322
+ if (parent?.tagName.toLowerCase() === 'label') {
323
+ // Clone and remove the input itself to get just the label text
324
+ const clone = parent.cloneNode(true);
325
+ const inputInClone = clone.querySelector(el.tagName);
326
+ if (inputInClone)
327
+ inputInClone.remove();
328
+ return clone.textContent?.trim() || null;
329
+ }
330
+ return null;
331
+ });
332
+ return label;
333
+ }
334
+ catch (error) {
335
+ return null;
336
+ }
337
+ }
338
+ /**
339
+ * Calculate match count and uniqueness for a locator strategy
340
+ */
341
+ async getMatchCount(page, strategy, value, name) {
342
+ try {
343
+ let locator;
344
+ switch (strategy) {
345
+ case 'role':
346
+ locator = name
347
+ ? page.getByRole(value, { name })
348
+ : page.getByRole(value);
349
+ break;
350
+ case 'testid':
351
+ locator = page.getByTestId(value);
352
+ break;
353
+ case 'label':
354
+ locator = page.getByLabel(value);
355
+ break;
356
+ case 'placeholder':
357
+ locator = page.getByPlaceholder(value);
358
+ break;
359
+ case 'text':
360
+ locator = page.getByText(value);
361
+ break;
362
+ case 'css':
363
+ locator = page.locator(value);
364
+ break;
365
+ default:
366
+ return { matchCount: 0, isUnique: false };
367
+ }
368
+ const count = await locator.count();
369
+ return {
370
+ matchCount: count,
371
+ isUnique: count === 1,
372
+ };
373
+ }
374
+ catch (error) {
375
+ logger_1.logger.debug(`Failed to get match count for ${strategy}:${value}: ${error.message}`);
376
+ return { matchCount: 0, isUnique: false };
377
+ }
378
+ }
379
+ }
380
+ exports.LocatorGenerator = LocatorGenerator;
381
+ //# sourceMappingURL=locator-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locator-generator.js","sourceRoot":"","sources":["../../src/analyzers/locator-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { Page } from '@playwright/test';
2
+ import { NetworkEvent } from '../types/capture';
3
+ import { SecurityRedactor } from '../security/redactor';
4
+ export declare class NetworkLogger {
5
+ private events;
6
+ private redactor;
7
+ private requestMap;
8
+ constructor(redactor: SecurityRedactor);
9
+ attachListeners(page: Page): Promise<void>;
10
+ getEvents(): NetworkEvent[];
11
+ clearEvents(): void;
12
+ getRequestCount(): number;
13
+ getResponseCount(): number;
14
+ }
15
+ //# sourceMappingURL=network-logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network-logger.d.ts","sourceRoot":"","sources":["../../src/analyzers/network-logger.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,QAAQ,CAAmB;IACnC,OAAO,CAAC,UAAU,CAAkC;gBAExC,QAAQ,EAAE,gBAAgB;IAIhC,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAsDhD,SAAS,IAAI,YAAY,EAAE;IAI3B,WAAW,IAAI,IAAI;IAInB,eAAe,IAAI,MAAM;IAIzB,gBAAgB,IAAI,MAAM;CAG3B"}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NetworkLogger = void 0;
4
+ class NetworkLogger {
5
+ events = [];
6
+ redactor;
7
+ requestMap = new Map();
8
+ constructor(redactor) {
9
+ this.redactor = redactor;
10
+ }
11
+ async attachListeners(page) {
12
+ page.on('request', async (request) => {
13
+ const url = request.url();
14
+ const startTime = Date.now();
15
+ this.requestMap.set(url, startTime);
16
+ const event = {
17
+ timestamp: new Date().toISOString(),
18
+ type: 'request',
19
+ method: request.method(),
20
+ url: url,
21
+ resourceType: request.resourceType(),
22
+ headers: { ...request.headers() },
23
+ timing: {
24
+ startTime,
25
+ },
26
+ };
27
+ // Redact headers
28
+ await this.redactor.redact(event.headers, 'network_request', url);
29
+ this.events.push(event);
30
+ });
31
+ page.on('response', async (response) => {
32
+ const request = response.request();
33
+ const url = response.url();
34
+ const endTime = Date.now();
35
+ const startTime = this.requestMap.get(url) || endTime;
36
+ const duration = endTime - startTime;
37
+ const event = {
38
+ timestamp: new Date().toISOString(),
39
+ type: 'response',
40
+ method: request.method(),
41
+ url: url,
42
+ resourceType: request.resourceType(),
43
+ status: response.status(),
44
+ headers: { ...response.headers() },
45
+ timing: {
46
+ startTime,
47
+ endTime,
48
+ duration,
49
+ },
50
+ };
51
+ // Redact headers
52
+ await this.redactor.redact(event.headers, 'network_response', url);
53
+ this.events.push(event);
54
+ this.requestMap.delete(url);
55
+ });
56
+ }
57
+ getEvents() {
58
+ return [...this.events];
59
+ }
60
+ clearEvents() {
61
+ this.events = [];
62
+ }
63
+ getRequestCount() {
64
+ return this.events.filter(e => e.type === 'request').length;
65
+ }
66
+ getResponseCount() {
67
+ return this.events.filter(e => e.type === 'response').length;
68
+ }
69
+ }
70
+ exports.NetworkLogger = NetworkLogger;
71
+ //# sourceMappingURL=network-logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network-logger.js","sourceRoot":"","sources":["../../src/analyzers/network-logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}