testchimp-runner-core 0.0.1
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/auth-config.d.ts +33 -0
- package/dist/auth-config.d.ts.map +1 -0
- package/dist/auth-config.js +69 -0
- package/dist/auth-config.js.map +1 -0
- package/dist/env-loader.d.ts +20 -0
- package/dist/env-loader.d.ts.map +1 -0
- package/dist/env-loader.js +83 -0
- package/dist/env-loader.js.map +1 -0
- package/dist/execution-service.d.ts +61 -0
- package/dist/execution-service.d.ts.map +1 -0
- package/dist/execution-service.js +822 -0
- package/dist/execution-service.js.map +1 -0
- package/dist/file-handler.d.ts +59 -0
- package/dist/file-handler.d.ts.map +1 -0
- package/dist/file-handler.js +75 -0
- package/dist/file-handler.js.map +1 -0
- package/dist/index.d.ts +46 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +196 -0
- package/dist/index.js.map +1 -0
- package/dist/llm-facade.d.ts +101 -0
- package/dist/llm-facade.d.ts.map +1 -0
- package/dist/llm-facade.js +289 -0
- package/dist/llm-facade.js.map +1 -0
- package/dist/playwright-mcp-service.d.ts +42 -0
- package/dist/playwright-mcp-service.d.ts.map +1 -0
- package/dist/playwright-mcp-service.js +167 -0
- package/dist/playwright-mcp-service.js.map +1 -0
- package/dist/prompts.d.ts +34 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +237 -0
- package/dist/prompts.js.map +1 -0
- package/dist/scenario-service.d.ts +25 -0
- package/dist/scenario-service.d.ts.map +1 -0
- package/dist/scenario-service.js +119 -0
- package/dist/scenario-service.js.map +1 -0
- package/dist/scenario-worker-class.d.ts +30 -0
- package/dist/scenario-worker-class.d.ts.map +1 -0
- package/dist/scenario-worker-class.js +263 -0
- package/dist/scenario-worker-class.js.map +1 -0
- package/dist/script-utils.d.ts +44 -0
- package/dist/script-utils.d.ts.map +1 -0
- package/dist/script-utils.js +100 -0
- package/dist/script-utils.js.map +1 -0
- package/dist/types.d.ts +171 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +28 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/browser-utils.d.ts +13 -0
- package/dist/utils/browser-utils.d.ts.map +1 -0
- package/dist/utils/browser-utils.js +269 -0
- package/dist/utils/browser-utils.js.map +1 -0
- package/dist/utils/page-info-utils.d.ts +16 -0
- package/dist/utils/page-info-utils.d.ts.map +1 -0
- package/dist/utils/page-info-utils.js +77 -0
- package/dist/utils/page-info-utils.js.map +1 -0
- package/env.prod +1 -0
- package/env.staging +1 -0
- package/package.json +38 -0
- package/src/auth-config.ts +84 -0
- package/src/env-loader.ts +91 -0
- package/src/execution-service.ts +999 -0
- package/src/file-handler.ts +104 -0
- package/src/index.ts +205 -0
- package/src/llm-facade.ts +413 -0
- package/src/playwright-mcp-service.ts +203 -0
- package/src/prompts.ts +247 -0
- package/src/scenario-service.ts +138 -0
- package/src/scenario-worker-class.ts +330 -0
- package/src/script-utils.ts +109 -0
- package/src/types.ts +202 -0
- package/src/utils/browser-utils.ts +272 -0
- package/src/utils/page-info-utils.ts +93 -0
- package/tsconfig.json +19 -0
|
@@ -0,0 +1,269 @@
|
|
|
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.initializeBrowser = initializeBrowser;
|
|
37
|
+
const playwright_1 = require("playwright");
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const fs = __importStar(require("fs"));
|
|
40
|
+
const esbuild_1 = require("esbuild");
|
|
41
|
+
/**
|
|
42
|
+
* Initialize browser with Playwright configuration
|
|
43
|
+
* @param playwrightConfig - JavaScript config file content (playwright.config.js)
|
|
44
|
+
* @param headless - Override headless mode (optional)
|
|
45
|
+
* @returns Browser, context, and page instances
|
|
46
|
+
*/
|
|
47
|
+
async function initializeBrowser(playwrightConfigContent, headless, playwrightConfigFilePath) {
|
|
48
|
+
console.log('Initializing browser with Playwright');
|
|
49
|
+
let contextOptions = {};
|
|
50
|
+
// Use Playwright config content if provided
|
|
51
|
+
if (playwrightConfigContent) {
|
|
52
|
+
console.log('Using provided Playwright config content');
|
|
53
|
+
try {
|
|
54
|
+
// Transpile the config content in-memory and evaluate it
|
|
55
|
+
console.log(`Transpiling config content (${playwrightConfigContent.length} characters)`);
|
|
56
|
+
const result = await (0, esbuild_1.build)({
|
|
57
|
+
stdin: {
|
|
58
|
+
contents: playwrightConfigContent,
|
|
59
|
+
resolveDir: process.cwd(),
|
|
60
|
+
},
|
|
61
|
+
bundle: true,
|
|
62
|
+
platform: 'node',
|
|
63
|
+
format: 'cjs',
|
|
64
|
+
sourcemap: false,
|
|
65
|
+
target: 'node18',
|
|
66
|
+
logLevel: 'silent',
|
|
67
|
+
write: false, // Don't write to file, get the result in memory
|
|
68
|
+
external: [
|
|
69
|
+
'@playwright/test',
|
|
70
|
+
'playwright',
|
|
71
|
+
'playwright-core'
|
|
72
|
+
]
|
|
73
|
+
});
|
|
74
|
+
if (!result.outputFiles || result.outputFiles.length === 0) {
|
|
75
|
+
throw new Error('esbuild failed to generate output');
|
|
76
|
+
}
|
|
77
|
+
const transpiledCode = result.outputFiles[0].text;
|
|
78
|
+
console.log(`Transpilation complete. Generated ${transpiledCode.length} characters of code`);
|
|
79
|
+
// Evaluate the transpiled code in a safe context
|
|
80
|
+
const loadedConfig = eval(transpiledCode);
|
|
81
|
+
console.log('Loaded config object:', loadedConfig);
|
|
82
|
+
console.log('Config type:', typeof loadedConfig);
|
|
83
|
+
console.log('Config keys:', loadedConfig ? Object.keys(loadedConfig) : 'null/undefined');
|
|
84
|
+
// Get the actual config from the default export (ES module transpiled to CommonJS)
|
|
85
|
+
const actualConfig = loadedConfig.default || loadedConfig;
|
|
86
|
+
if (actualConfig && typeof actualConfig === 'object') {
|
|
87
|
+
console.log('Successfully loaded Playwright config from content');
|
|
88
|
+
console.log(`Config keys: ${Object.keys(actualConfig).join(', ')}`);
|
|
89
|
+
// Extract context options from the config
|
|
90
|
+
if (actualConfig.use && actualConfig.use.contextOptions) {
|
|
91
|
+
contextOptions = { ...contextOptions, ...actualConfig.use.contextOptions };
|
|
92
|
+
console.log('Applied context options from config');
|
|
93
|
+
}
|
|
94
|
+
// Apply other config settings
|
|
95
|
+
if (actualConfig.use && actualConfig.use.headless !== undefined) {
|
|
96
|
+
// Override headless mode if specified in config and not explicitly overridden
|
|
97
|
+
if (headless === undefined) {
|
|
98
|
+
headless = actualConfig.use.headless;
|
|
99
|
+
console.log(`Using headless mode from config: ${headless}`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Apply timeout settings
|
|
103
|
+
if (actualConfig.use && actualConfig.use.actionTimeout) {
|
|
104
|
+
console.log(`Using action timeout from config: ${actualConfig.use.actionTimeout}ms`);
|
|
105
|
+
}
|
|
106
|
+
// Apply viewport settings
|
|
107
|
+
if (actualConfig.use && actualConfig.use.viewport) {
|
|
108
|
+
contextOptions.viewport = actualConfig.use.viewport;
|
|
109
|
+
console.log(`Using viewport from config: ${JSON.stringify(actualConfig.use.viewport)}`);
|
|
110
|
+
}
|
|
111
|
+
// Apply user agent
|
|
112
|
+
if (actualConfig.use && actualConfig.use.userAgent) {
|
|
113
|
+
contextOptions.userAgent = actualConfig.use.userAgent;
|
|
114
|
+
console.log(`Using user agent from config: ${actualConfig.use.userAgent}`);
|
|
115
|
+
}
|
|
116
|
+
// Apply other context options
|
|
117
|
+
if (actualConfig.use && actualConfig.use.extraHTTPHeaders) {
|
|
118
|
+
contextOptions.extraHTTPHeaders = actualConfig.use.extraHTTPHeaders;
|
|
119
|
+
console.log(`Using extra HTTP headers from config`);
|
|
120
|
+
}
|
|
121
|
+
if (actualConfig.use && actualConfig.use.locale) {
|
|
122
|
+
contextOptions.locale = actualConfig.use.locale;
|
|
123
|
+
console.log(`Using locale from config: ${actualConfig.use.locale}`);
|
|
124
|
+
}
|
|
125
|
+
if (actualConfig.use && actualConfig.use.timezoneId) {
|
|
126
|
+
contextOptions.timezoneId = actualConfig.use.timezoneId;
|
|
127
|
+
console.log(`Using timezone from config: ${actualConfig.use.timezoneId}`);
|
|
128
|
+
}
|
|
129
|
+
if (actualConfig.use && actualConfig.use.geolocation) {
|
|
130
|
+
contextOptions.geolocation = actualConfig.use.geolocation;
|
|
131
|
+
console.log(`Using geolocation from config: ${JSON.stringify(actualConfig.use.geolocation)}`);
|
|
132
|
+
}
|
|
133
|
+
if (actualConfig.use && actualConfig.use.permissions) {
|
|
134
|
+
contextOptions.permissions = actualConfig.use.permissions;
|
|
135
|
+
console.log(`Using permissions from config: ${JSON.stringify(actualConfig.use.permissions)}`);
|
|
136
|
+
}
|
|
137
|
+
if (actualConfig.use && actualConfig.use.colorScheme) {
|
|
138
|
+
contextOptions.colorScheme = actualConfig.use.colorScheme;
|
|
139
|
+
console.log(`Using color scheme from config: ${actualConfig.use.colorScheme}`);
|
|
140
|
+
}
|
|
141
|
+
if (actualConfig.use && actualConfig.use.reducedMotion) {
|
|
142
|
+
contextOptions.reducedMotion = actualConfig.use.reducedMotion;
|
|
143
|
+
console.log(`Using reduced motion from config: ${actualConfig.use.reducedMotion}`);
|
|
144
|
+
}
|
|
145
|
+
if (actualConfig.use && actualConfig.use.forcedColors) {
|
|
146
|
+
contextOptions.forcedColors = actualConfig.use.forcedColors;
|
|
147
|
+
console.log(`Using forced colors from config: ${actualConfig.use.forcedColors}`);
|
|
148
|
+
}
|
|
149
|
+
if (actualConfig.use && actualConfig.use.acceptDownloads) {
|
|
150
|
+
contextOptions.acceptDownloads = actualConfig.use.acceptDownloads;
|
|
151
|
+
console.log(`Using accept downloads from config: ${actualConfig.use.acceptDownloads}`);
|
|
152
|
+
}
|
|
153
|
+
if (actualConfig.use && actualConfig.use.bypassCSP) {
|
|
154
|
+
contextOptions.bypassCSP = actualConfig.use.bypassCSP;
|
|
155
|
+
console.log(`Using bypass CSP from config: ${actualConfig.use.bypassCSP}`);
|
|
156
|
+
}
|
|
157
|
+
if (actualConfig.use && actualConfig.use.javaScriptEnabled) {
|
|
158
|
+
contextOptions.javaScriptEnabled = actualConfig.use.javaScriptEnabled;
|
|
159
|
+
console.log(`Using JavaScript enabled from config: ${actualConfig.use.javaScriptEnabled}`);
|
|
160
|
+
}
|
|
161
|
+
if (actualConfig.use && actualConfig.use.ignoreHTTPSErrors) {
|
|
162
|
+
contextOptions.ignoreHTTPSErrors = actualConfig.use.ignoreHTTPSErrors;
|
|
163
|
+
console.log(`Using ignore HTTPS errors from config: ${actualConfig.use.ignoreHTTPSErrors}`);
|
|
164
|
+
}
|
|
165
|
+
console.log(`Final context options: ${JSON.stringify(contextOptions, null, 2)}`);
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
console.log('Config loaded but no valid configuration found');
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
console.error(`Error transpiling config content: ${error}`);
|
|
173
|
+
console.log('Falling back to default configuration');
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
else if (playwrightConfigFilePath) {
|
|
177
|
+
// Fallback to file path if no content provided (for backward compatibility)
|
|
178
|
+
console.log('No config content provided, falling back to file path');
|
|
179
|
+
// Resolve the path - it might be relative or absolute
|
|
180
|
+
const resolvedPath = path.isAbsolute(playwrightConfigFilePath)
|
|
181
|
+
? playwrightConfigFilePath
|
|
182
|
+
: path.resolve(process.cwd(), playwrightConfigFilePath);
|
|
183
|
+
console.log(`Looking for Playwright config at: ${resolvedPath}`);
|
|
184
|
+
console.log(`File exists: ${fs.existsSync(resolvedPath)}`);
|
|
185
|
+
if (fs.existsSync(resolvedPath)) {
|
|
186
|
+
console.log(`Loading Playwright config from: ${resolvedPath}`);
|
|
187
|
+
try {
|
|
188
|
+
// Transpile the config in-memory and evaluate it
|
|
189
|
+
console.log(`Transpiling config in-memory from: ${resolvedPath}`);
|
|
190
|
+
const result = await (0, esbuild_1.build)({
|
|
191
|
+
entryPoints: [resolvedPath],
|
|
192
|
+
bundle: true,
|
|
193
|
+
platform: 'node',
|
|
194
|
+
format: 'cjs',
|
|
195
|
+
sourcemap: false,
|
|
196
|
+
target: 'node18',
|
|
197
|
+
logLevel: 'silent',
|
|
198
|
+
write: false, // Don't write to file, get the result in memory
|
|
199
|
+
external: [
|
|
200
|
+
'@playwright/test',
|
|
201
|
+
'playwright',
|
|
202
|
+
'playwright-core'
|
|
203
|
+
]
|
|
204
|
+
});
|
|
205
|
+
if (!result.outputFiles || result.outputFiles.length === 0) {
|
|
206
|
+
throw new Error('esbuild failed to generate output');
|
|
207
|
+
}
|
|
208
|
+
const transpiledCode = result.outputFiles[0].text;
|
|
209
|
+
console.log(`Transpilation complete. Generated ${transpiledCode.length} characters of code`);
|
|
210
|
+
// Evaluate the transpiled code in a safe context
|
|
211
|
+
const loadedConfig = eval(transpiledCode);
|
|
212
|
+
console.log('Loaded config object:', loadedConfig);
|
|
213
|
+
console.log('Config type:', typeof loadedConfig);
|
|
214
|
+
console.log('Config keys:', loadedConfig ? Object.keys(loadedConfig) : 'null/undefined');
|
|
215
|
+
// Get the actual config from the default export (ES module transpiled to CommonJS)
|
|
216
|
+
const actualConfig = loadedConfig.default || loadedConfig;
|
|
217
|
+
console.log('Actual config:', actualConfig);
|
|
218
|
+
console.log('Actual config keys:', actualConfig ? Object.keys(actualConfig) : 'null/undefined');
|
|
219
|
+
if (!actualConfig) {
|
|
220
|
+
console.log('Config import did not return a valid config; using defaults');
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
// Apply global use options
|
|
224
|
+
if (actualConfig.use) {
|
|
225
|
+
contextOptions = { ...actualConfig.use };
|
|
226
|
+
console.log('Applied context options from Playwright config:', contextOptions);
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
console.log('No use property found in config');
|
|
230
|
+
}
|
|
231
|
+
// Apply first project overrides if present
|
|
232
|
+
if (Array.isArray(actualConfig.projects) && actualConfig.projects.length > 0) {
|
|
233
|
+
const firstProject = actualConfig.projects[0];
|
|
234
|
+
if (firstProject && firstProject.use) {
|
|
235
|
+
contextOptions = { ...contextOptions, ...firstProject.use };
|
|
236
|
+
console.log('Applied project-specific options:', firstProject.use);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
console.log('No projects found in config');
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
// No cleanup needed - we used in-memory transpilation
|
|
244
|
+
}
|
|
245
|
+
catch (error) {
|
|
246
|
+
console.log(`Failed to load Playwright config via esbuild/import: ${error}`);
|
|
247
|
+
console.log('Using default browser settings');
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
console.log(`Playwright config file not found at: ${resolvedPath}`);
|
|
252
|
+
console.log('Using default browser settings');
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
// Use chromium as default browser
|
|
256
|
+
const browser = await playwright_1.chromium.launch({
|
|
257
|
+
headless: headless !== undefined ? headless : false
|
|
258
|
+
});
|
|
259
|
+
// Create context with config options or defaults
|
|
260
|
+
const context = await browser.newContext(contextOptions);
|
|
261
|
+
const page = await context.newPage();
|
|
262
|
+
// Set default timeout to 5 seconds (unless overridden by playwright config)
|
|
263
|
+
if (!contextOptions.timeout) {
|
|
264
|
+
context.setDefaultTimeout(5000);
|
|
265
|
+
page.setDefaultTimeout(5000);
|
|
266
|
+
}
|
|
267
|
+
return { browser, context, page };
|
|
268
|
+
}
|
|
269
|
+
//# sourceMappingURL=browser-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-utils.js","sourceRoot":"","sources":["../../src/utils/browser-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Page } from 'playwright';
|
|
2
|
+
export interface PageInfo {
|
|
3
|
+
url: string;
|
|
4
|
+
title: string;
|
|
5
|
+
elements: string;
|
|
6
|
+
formFields: string;
|
|
7
|
+
interactiveElements: string;
|
|
8
|
+
pageStructure: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function getEnhancedPageInfo(page: Page): Promise<PageInfo>;
|
|
11
|
+
export declare function getEnhancedPageInfo(domSnapshot: {
|
|
12
|
+
url: string;
|
|
13
|
+
title: string;
|
|
14
|
+
accessibilityTree: any;
|
|
15
|
+
}): Promise<PageInfo>;
|
|
16
|
+
//# sourceMappingURL=page-info-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-info-utils.d.ts","sourceRoot":"","sources":["../../src/utils/page-info-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAElC,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AACzE,wBAAsB,mBAAmB,CAAC,WAAW,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,GAAG,CAAA;CAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getEnhancedPageInfo = getEnhancedPageInfo;
|
|
4
|
+
async function getEnhancedPageInfo(input) {
|
|
5
|
+
let domSnapshot = { url: 'Unknown', title: 'Unknown', accessibilityTree: null };
|
|
6
|
+
try {
|
|
7
|
+
if ('accessibility' in input) {
|
|
8
|
+
// Input is a Page object
|
|
9
|
+
const snapshot = await input.accessibility.snapshot();
|
|
10
|
+
const url = input.url();
|
|
11
|
+
const title = await input.title();
|
|
12
|
+
domSnapshot = { url, title, accessibilityTree: snapshot };
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
// Input is already a domSnapshot
|
|
16
|
+
domSnapshot = input;
|
|
17
|
+
}
|
|
18
|
+
// Extract key information from accessibility tree
|
|
19
|
+
const elements = [];
|
|
20
|
+
const formFields = [];
|
|
21
|
+
const interactiveElements = [];
|
|
22
|
+
const pageStructure = [];
|
|
23
|
+
const extractElements = (node, depth = 0) => {
|
|
24
|
+
if (depth > 4)
|
|
25
|
+
return; // Limit depth to avoid overwhelming output
|
|
26
|
+
if (node && typeof node === 'object') {
|
|
27
|
+
if (node.role) {
|
|
28
|
+
const elementInfo = `${node.role}${node.name ? `: ${node.name}` : ''}`;
|
|
29
|
+
elements.push(elementInfo);
|
|
30
|
+
// Categorize elements
|
|
31
|
+
if (['textbox', 'button', 'link', 'checkbox', 'radio', 'combobox', 'slider'].includes(node.role)) {
|
|
32
|
+
interactiveElements.push(elementInfo);
|
|
33
|
+
}
|
|
34
|
+
if (['textbox', 'checkbox', 'radio', 'combobox', 'slider'].includes(node.role)) {
|
|
35
|
+
formFields.push(elementInfo);
|
|
36
|
+
}
|
|
37
|
+
if (['main', 'navigation', 'banner', 'contentinfo', 'complementary', 'search'].includes(node.role)) {
|
|
38
|
+
pageStructure.push(elementInfo);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (node.children) {
|
|
42
|
+
node.children.forEach((child) => extractElements(child, depth + 1));
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
extractElements(domSnapshot.accessibilityTree);
|
|
47
|
+
// Create a more focused summary
|
|
48
|
+
const getElementSummary = (elementList, maxItems, category) => {
|
|
49
|
+
if (elementList.length === 0)
|
|
50
|
+
return `No ${category} found`;
|
|
51
|
+
const limited = elementList.slice(0, maxItems);
|
|
52
|
+
const remaining = elementList.length - maxItems;
|
|
53
|
+
const summary = limited.join(', ');
|
|
54
|
+
return remaining > 0 ? `${summary} (+${remaining} more)` : summary;
|
|
55
|
+
};
|
|
56
|
+
return {
|
|
57
|
+
url: domSnapshot.url,
|
|
58
|
+
title: domSnapshot.title,
|
|
59
|
+
elements: getElementSummary(elements, 15, 'elements'),
|
|
60
|
+
formFields: getElementSummary(formFields, 8, 'form fields'),
|
|
61
|
+
interactiveElements: getElementSummary(interactiveElements, 12, 'interactive elements'),
|
|
62
|
+
pageStructure: getElementSummary(pageStructure, 6, 'page sections')
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
console.error('Error extracting page info:', error);
|
|
67
|
+
return {
|
|
68
|
+
url: domSnapshot?.url || 'Unknown',
|
|
69
|
+
title: 'Unknown',
|
|
70
|
+
elements: 'Unable to extract',
|
|
71
|
+
formFields: 'Unable to extract',
|
|
72
|
+
interactiveElements: 'Unable to extract',
|
|
73
|
+
pageStructure: 'Unable to extract'
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=page-info-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-info-utils.js","sourceRoot":"","sources":["../../src/utils/page-info-utils.ts"],"names":[],"mappings":"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"}
|
package/env.prod
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
TESTCHIMP_BACKEND_URL=https://featureservice.testchimp.io
|
package/env.staging
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
TESTCHIMP_BACKEND_URL=https://featureservice-staging.testchimp.io
|
package/package.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "testchimp-runner-core",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Core TestChimp functionality for test generation and AI repair",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"build": "tsc",
|
|
9
|
+
"watch": "tsc --watch",
|
|
10
|
+
"clean": "rm -rf dist"
|
|
11
|
+
},
|
|
12
|
+
"dependencies": {
|
|
13
|
+
"@playwright/test": "^1.40.0",
|
|
14
|
+
"axios": "^1.6.0",
|
|
15
|
+
"dotenv": "^16.3.1",
|
|
16
|
+
"express": "^4.18.2",
|
|
17
|
+
"fs-extra": "^11.1.1",
|
|
18
|
+
"playwright": "^1.40.0",
|
|
19
|
+
"ws": "^8.14.2"
|
|
20
|
+
},
|
|
21
|
+
"devDependencies": {
|
|
22
|
+
"@types/express": "^4.17.21",
|
|
23
|
+
"@types/fs-extra": "^11.0.4",
|
|
24
|
+
"@types/node": "^20.10.0",
|
|
25
|
+
"@types/ws": "^8.5.10",
|
|
26
|
+
"esbuild": "^0.21.5",
|
|
27
|
+
"typescript": "^5.3.0"
|
|
28
|
+
},
|
|
29
|
+
"keywords": [
|
|
30
|
+
"testchimp",
|
|
31
|
+
"playwright",
|
|
32
|
+
"ai",
|
|
33
|
+
"test-automation",
|
|
34
|
+
"test-repair"
|
|
35
|
+
],
|
|
36
|
+
"author": "TestChimp",
|
|
37
|
+
"license": "MIT"
|
|
38
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication configuration for TestChimp services
|
|
3
|
+
* Supports both user PAT and project API key authentication modes
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export interface UserPATAuthConfig {
|
|
7
|
+
mode: 'user_pat';
|
|
8
|
+
userAuthKey: string;
|
|
9
|
+
userMail: string;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface ProjectApiKeyAuthConfig {
|
|
13
|
+
mode: 'project_api_key';
|
|
14
|
+
apiKey: string;
|
|
15
|
+
projectId: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export type AuthConfig = UserPATAuthConfig | ProjectApiKeyAuthConfig;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Helper function to create user PAT auth configuration
|
|
22
|
+
*/
|
|
23
|
+
export function createUserPATAuth(userAuthKey: string, userMail: string): UserPATAuthConfig {
|
|
24
|
+
return {
|
|
25
|
+
mode: 'user_pat',
|
|
26
|
+
userAuthKey,
|
|
27
|
+
userMail
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Helper function to create project API key auth configuration
|
|
33
|
+
*/
|
|
34
|
+
export function createProjectApiKeyAuth(apiKey: string, projectId: string): ProjectApiKeyAuthConfig {
|
|
35
|
+
return {
|
|
36
|
+
mode: 'project_api_key',
|
|
37
|
+
apiKey,
|
|
38
|
+
projectId
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Helper function to create auth configuration from environment variables
|
|
44
|
+
* Supports both authentication modes based on available environment variables
|
|
45
|
+
*/
|
|
46
|
+
export function createAuthConfigFromEnv(): AuthConfig | null {
|
|
47
|
+
// Check for project API key authentication first (for CI/CD)
|
|
48
|
+
const apiKey = process.env.TESTCHIMP_API_KEY;
|
|
49
|
+
const projectId = process.env.TESTCHIMP_PROJECT_ID;
|
|
50
|
+
|
|
51
|
+
if (apiKey && projectId) {
|
|
52
|
+
return createProjectApiKeyAuth(apiKey, projectId);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Fall back to user PAT authentication (for VS Code extension)
|
|
56
|
+
const userAuthKey = process.env.TESTCHIMP_USER_AUTH_KEY;
|
|
57
|
+
const userMail = process.env.TESTCHIMP_USER_MAIL;
|
|
58
|
+
|
|
59
|
+
if (userAuthKey && userMail) {
|
|
60
|
+
return createUserPATAuth(userAuthKey, userMail);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Helper function to get authentication headers for HTTP requests
|
|
68
|
+
*/
|
|
69
|
+
export function getAuthHeaders(authConfig: AuthConfig): Record<string, string> {
|
|
70
|
+
switch (authConfig.mode) {
|
|
71
|
+
case 'user_pat':
|
|
72
|
+
return {
|
|
73
|
+
'user_auth_key': authConfig.userAuthKey,
|
|
74
|
+
'user_mail': authConfig.userMail
|
|
75
|
+
};
|
|
76
|
+
case 'project_api_key':
|
|
77
|
+
return {
|
|
78
|
+
'TestChimp-Api-Key': authConfig.apiKey,
|
|
79
|
+
'project-id': authConfig.projectId
|
|
80
|
+
};
|
|
81
|
+
default:
|
|
82
|
+
throw new Error('Invalid authentication configuration');
|
|
83
|
+
}
|
|
84
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment Configuration Loader
|
|
3
|
+
*
|
|
4
|
+
* This module loads environment configuration from packaged env files
|
|
5
|
+
* instead of relying on process.env which may not be available in VS Code extensions
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
interface EnvConfig {
|
|
9
|
+
TESTCHIMP_BACKEND_URL: string;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
let cachedConfig: EnvConfig | null = null;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Load environment configuration from the packaged env file
|
|
16
|
+
* Falls back to process.env if env file is not available
|
|
17
|
+
*/
|
|
18
|
+
export function loadEnvConfig(): EnvConfig {
|
|
19
|
+
if (cachedConfig) {
|
|
20
|
+
return cachedConfig;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
try {
|
|
24
|
+
// Try multiple possible paths for the env file
|
|
25
|
+
const possiblePaths = [
|
|
26
|
+
require('path').join(__dirname, 'env'),
|
|
27
|
+
require('path').join(__dirname, './env'),
|
|
28
|
+
require('path').join(__dirname, '../env'),
|
|
29
|
+
require('path').join(__dirname, '../../runner-core/env'),
|
|
30
|
+
require('path').join(__dirname, '../../runner-core/dist/env'),
|
|
31
|
+
require('path').join(process.cwd(), 'env'),
|
|
32
|
+
require('path').join(process.cwd(), 'runner-core/env'),
|
|
33
|
+
require('path').join(process.cwd(), 'runner-core/dist/env'),
|
|
34
|
+
require('path').join(process.cwd(), 'local/runner-core/env'),
|
|
35
|
+
require('path').join(process.cwd(), 'local/runner-core/dist/env')
|
|
36
|
+
];
|
|
37
|
+
|
|
38
|
+
let envContent = '';
|
|
39
|
+
let envPath = '';
|
|
40
|
+
|
|
41
|
+
for (const path of possiblePaths) {
|
|
42
|
+
try {
|
|
43
|
+
envContent = require('fs').readFileSync(path, 'utf8');
|
|
44
|
+
envPath = path;
|
|
45
|
+
break;
|
|
46
|
+
} catch (error) {
|
|
47
|
+
// Silently continue to next path
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (!envContent) {
|
|
52
|
+
throw new Error('Could not find env file in any of the expected locations');
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const config: Partial<EnvConfig> = {};
|
|
56
|
+
|
|
57
|
+
envContent.split('\n').forEach((line: string) => {
|
|
58
|
+
const trimmedLine = line.trim();
|
|
59
|
+
if (trimmedLine && !trimmedLine.startsWith('#')) {
|
|
60
|
+
const [key, value] = trimmedLine.split('=');
|
|
61
|
+
if (key && value) {
|
|
62
|
+
const trimmedKey = key.trim() as keyof EnvConfig;
|
|
63
|
+
config[trimmedKey] = value.trim();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
// Ensure required properties are present
|
|
69
|
+
const finalConfig: EnvConfig = {
|
|
70
|
+
TESTCHIMP_BACKEND_URL: config.TESTCHIMP_BACKEND_URL || 'https://featureservice.testchimp.io'
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
cachedConfig = finalConfig;
|
|
74
|
+
return finalConfig;
|
|
75
|
+
} catch (error) {
|
|
76
|
+
// Fallback to process.env
|
|
77
|
+
const config: EnvConfig = {
|
|
78
|
+
TESTCHIMP_BACKEND_URL: process.env.TESTCHIMP_BACKEND_URL || 'https://featureservice.testchimp.io'
|
|
79
|
+
};
|
|
80
|
+
cachedConfig = config;
|
|
81
|
+
return config;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Get a specific environment variable
|
|
87
|
+
*/
|
|
88
|
+
export function getEnvVar(key: keyof EnvConfig): string | undefined {
|
|
89
|
+
const config = loadEnvConfig();
|
|
90
|
+
return config[key];
|
|
91
|
+
}
|