@mechris3/glassbox 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.
- package/README.md +213 -0
- package/dist/bin/glassbox.d.ts +14 -0
- package/dist/bin/glassbox.d.ts.map +1 -0
- package/dist/bin/glassbox.js +140 -0
- package/dist/bin/glassbox.js.map +1 -0
- package/dist/src/adapters/base-adapter.d.ts +70 -0
- package/dist/src/adapters/base-adapter.d.ts.map +1 -0
- package/dist/src/adapters/base-adapter.js +155 -0
- package/dist/src/adapters/base-adapter.js.map +1 -0
- package/dist/src/adapters/browser-adapter.interface.d.ts +41 -0
- package/dist/src/adapters/browser-adapter.interface.d.ts.map +1 -0
- package/dist/src/adapters/browser-adapter.interface.js +7 -0
- package/dist/src/adapters/browser-adapter.interface.js.map +1 -0
- package/dist/src/adapters/cdp-adapter.d.ts +63 -0
- package/dist/src/adapters/cdp-adapter.d.ts.map +1 -0
- package/dist/src/adapters/cdp-adapter.js +231 -0
- package/dist/src/adapters/cdp-adapter.js.map +1 -0
- package/dist/src/ai/collectors.d.ts +35 -0
- package/dist/src/ai/collectors.d.ts.map +1 -0
- package/dist/src/ai/collectors.js +170 -0
- package/dist/src/ai/collectors.js.map +1 -0
- package/dist/src/ai/queries.d.ts +21 -0
- package/dist/src/ai/queries.d.ts.map +1 -0
- package/dist/src/ai/queries.js +59 -0
- package/dist/src/ai/queries.js.map +1 -0
- package/dist/src/ai/types.d.ts +55 -0
- package/dist/src/ai/types.d.ts.map +1 -0
- package/dist/src/ai/types.js +6 -0
- package/dist/src/ai/types.js.map +1 -0
- package/dist/src/cdp/connection.d.ts +37 -0
- package/dist/src/cdp/connection.d.ts.map +1 -0
- package/dist/src/cdp/connection.js +86 -0
- package/dist/src/cdp/connection.js.map +1 -0
- package/dist/src/cdp/connection.test.d.ts +6 -0
- package/dist/src/cdp/connection.test.d.ts.map +1 -0
- package/dist/src/cdp/connection.test.js +93 -0
- package/dist/src/cdp/connection.test.js.map +1 -0
- package/dist/src/cdp/domains.d.ts +116 -0
- package/dist/src/cdp/domains.d.ts.map +1 -0
- package/dist/src/cdp/domains.js +153 -0
- package/dist/src/cdp/domains.js.map +1 -0
- package/dist/src/cdp/launcher.d.ts +26 -0
- package/dist/src/cdp/launcher.d.ts.map +1 -0
- package/dist/src/cdp/launcher.js +175 -0
- package/dist/src/cdp/launcher.js.map +1 -0
- package/dist/src/config.d.ts +28 -0
- package/dist/src/config.d.ts.map +1 -0
- package/dist/src/config.js +72 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/config.test.d.ts +5 -0
- package/dist/src/config.test.d.ts.map +1 -0
- package/dist/src/config.test.js +46 -0
- package/dist/src/config.test.js.map +1 -0
- package/dist/src/errors.d.ts +26 -0
- package/dist/src/errors.d.ts.map +1 -0
- package/dist/src/errors.js +27 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/index.d.ts +18 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +28 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/journey.d.ts +35 -0
- package/dist/src/journey.d.ts.map +1 -0
- package/dist/src/journey.js +39 -0
- package/dist/src/journey.js.map +1 -0
- package/dist/src/mcp/server.d.ts +22 -0
- package/dist/src/mcp/server.d.ts.map +1 -0
- package/dist/src/mcp/server.js +229 -0
- package/dist/src/mcp/server.js.map +1 -0
- package/dist/src/page-objects/base.page.d.ts +28 -0
- package/dist/src/page-objects/base.page.d.ts.map +1 -0
- package/dist/src/page-objects/base.page.js +51 -0
- package/dist/src/page-objects/base.page.js.map +1 -0
- package/dist/src/page-objects/browser-context.page.d.ts +14 -0
- package/dist/src/page-objects/browser-context.page.d.ts.map +1 -0
- package/dist/src/page-objects/browser-context.page.js +28 -0
- package/dist/src/page-objects/browser-context.page.js.map +1 -0
- package/dist/src/runner/lifecycle-hooks.d.ts +43 -0
- package/dist/src/runner/lifecycle-hooks.d.ts.map +1 -0
- package/dist/src/runner/lifecycle-hooks.js +70 -0
- package/dist/src/runner/lifecycle-hooks.js.map +1 -0
- package/dist/src/runner/run-all-journeys.d.ts +35 -0
- package/dist/src/runner/run-all-journeys.d.ts.map +1 -0
- package/dist/src/runner/run-all-journeys.js +167 -0
- package/dist/src/runner/run-all-journeys.js.map +1 -0
- package/dist/src/runner/run-journey.d.ts +17 -0
- package/dist/src/runner/run-journey.d.ts.map +1 -0
- package/dist/src/runner/run-journey.js +179 -0
- package/dist/src/runner/run-journey.js.map +1 -0
- package/dist/src/runner/spawn-journey.d.ts +36 -0
- package/dist/src/runner/spawn-journey.d.ts.map +1 -0
- package/dist/src/runner/spawn-journey.js +40 -0
- package/dist/src/runner/spawn-journey.js.map +1 -0
- package/dist/src/server/diagnostic-service.d.ts +69 -0
- package/dist/src/server/diagnostic-service.d.ts.map +1 -0
- package/dist/src/server/diagnostic-service.js +165 -0
- package/dist/src/server/diagnostic-service.js.map +1 -0
- package/dist/src/server/diagnostic-service.test.d.ts +5 -0
- package/dist/src/server/diagnostic-service.test.d.ts.map +1 -0
- package/dist/src/server/diagnostic-service.test.js +82 -0
- package/dist/src/server/diagnostic-service.test.js.map +1 -0
- package/dist/src/server/index.d.ts +11 -0
- package/dist/src/server/index.d.ts.map +1 -0
- package/dist/src/server/index.js +167 -0
- package/dist/src/server/index.js.map +1 -0
- package/dist/src/server/journey-discovery.d.ts +16 -0
- package/dist/src/server/journey-discovery.d.ts.map +1 -0
- package/dist/src/server/journey-discovery.js +38 -0
- package/dist/src/server/journey-discovery.js.map +1 -0
- package/dist/src/server/settings-storage.d.ts +27 -0
- package/dist/src/server/settings-storage.d.ts.map +1 -0
- package/dist/src/server/settings-storage.js +27 -0
- package/dist/src/server/settings-storage.js.map +1 -0
- package/dist/src/server/test-executor.d.ts +64 -0
- package/dist/src/server/test-executor.d.ts.map +1 -0
- package/dist/src/server/test-executor.js +279 -0
- package/dist/src/server/test-executor.js.map +1 -0
- package/dist/src/server/websocket.d.ts +51 -0
- package/dist/src/server/websocket.d.ts.map +1 -0
- package/dist/src/server/websocket.js +28 -0
- package/dist/src/server/websocket.js.map +1 -0
- package/dist/src/utils/browser-discovery.d.ts +11 -0
- package/dist/src/utils/browser-discovery.d.ts.map +1 -0
- package/dist/src/utils/browser-discovery.js +102 -0
- package/dist/src/utils/browser-discovery.js.map +1 -0
- package/dist/src/utils/error-formatter.d.ts +13 -0
- package/dist/src/utils/error-formatter.d.ts.map +1 -0
- package/dist/src/utils/error-formatter.js +29 -0
- package/dist/src/utils/error-formatter.js.map +1 -0
- package/dist/src/utils/escape.d.ts +10 -0
- package/dist/src/utils/escape.d.ts.map +1 -0
- package/dist/src/utils/escape.js +22 -0
- package/dist/src/utils/escape.js.map +1 -0
- package/dist/src/utils/escape.test.d.ts +5 -0
- package/dist/src/utils/escape.test.d.ts.map +1 -0
- package/dist/src/utils/escape.test.js +49 -0
- package/dist/src/utils/escape.test.js.map +1 -0
- package/dist/src/utils/page-object-error.d.ts +5 -0
- package/dist/src/utils/page-object-error.d.ts.map +1 -0
- package/dist/src/utils/page-object-error.js +22 -0
- package/dist/src/utils/page-object-error.js.map +1 -0
- package/dist/src/utils/profile-discovery.d.ts +20 -0
- package/dist/src/utils/profile-discovery.d.ts.map +1 -0
- package/dist/src/utils/profile-discovery.js +68 -0
- package/dist/src/utils/profile-discovery.js.map +1 -0
- package/dist/src/utils/wait-utils.d.ts +10 -0
- package/dist/src/utils/wait-utils.d.ts.map +1 -0
- package/dist/src/utils/wait-utils.js +20 -0
- package/dist/src/utils/wait-utils.js.map +1 -0
- package/dist/src/utils/wait-utils.test.d.ts +5 -0
- package/dist/src/utils/wait-utils.test.d.ts.map +1 -0
- package/dist/src/utils/wait-utils.test.js +30 -0
- package/dist/src/utils/wait-utils.test.js.map +1 -0
- package/package.json +60 -0
- package/src/server/static/index.html +541 -0
- package/ui/dist/3rdpartylicenses.txt +419 -0
- package/ui/dist/browser/assets/logo.svg +29 -0
- package/ui/dist/browser/index.html +13 -0
- package/ui/dist/browser/main-7OJWN7GZ.js +16 -0
- package/ui/dist/browser/polyfills-5CFQRCPP.js +2 -0
- package/ui/dist/browser/styles-HMZYQRBV.css +1 -0
- package/ui/dist/prerendered-routes.json +3 -0
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Chrome process spawning and DevTools endpoint discovery.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.launchBrowser = launchBrowser;
|
|
7
|
+
const child_process_1 = require("child_process");
|
|
8
|
+
const fs_1 = require("fs");
|
|
9
|
+
const os_1 = require("os");
|
|
10
|
+
const path_1 = require("path");
|
|
11
|
+
const os_2 = require("os");
|
|
12
|
+
const DEFAULT_FLAGS = [
|
|
13
|
+
'--no-first-run',
|
|
14
|
+
'--no-default-browser-check',
|
|
15
|
+
'--disable-session-crashed-bubble',
|
|
16
|
+
'--disable-infobars',
|
|
17
|
+
'--hide-crash-restore-bubble',
|
|
18
|
+
'--disable-popup-blocking',
|
|
19
|
+
'--disable-prompt-on-repost',
|
|
20
|
+
'--noerrdialogs',
|
|
21
|
+
'--no-restore-state',
|
|
22
|
+
'--disable-background-timer-throttling',
|
|
23
|
+
'--password-store=basic',
|
|
24
|
+
'--use-mock-keychain',
|
|
25
|
+
];
|
|
26
|
+
/** Sandbox flags only needed on Linux where setuid sandbox exists. */
|
|
27
|
+
const LINUX_SANDBOX_FLAGS = [
|
|
28
|
+
'--no-sandbox',
|
|
29
|
+
'--disable-setuid-sandbox',
|
|
30
|
+
];
|
|
31
|
+
async function launchBrowser(options) {
|
|
32
|
+
const port = options.port ?? 0;
|
|
33
|
+
const userDataDir = options.userDataDir ?? (0, fs_1.mkdtempSync)((0, path_1.join)((0, os_1.tmpdir)(), 'glassbox-'));
|
|
34
|
+
// Clean crash state to prevent "didn't shut down correctly" dialogs
|
|
35
|
+
cleanCrashState(userDataDir);
|
|
36
|
+
const args = [
|
|
37
|
+
`--remote-debugging-port=${port}`,
|
|
38
|
+
`--user-data-dir=${userDataDir}`,
|
|
39
|
+
...DEFAULT_FLAGS,
|
|
40
|
+
...((0, os_2.platform)() === 'linux' ? LINUX_SANDBOX_FLAGS : []),
|
|
41
|
+
...(options.profileDirectory ? [`--profile-directory=${options.profileDirectory}`] : []),
|
|
42
|
+
...(options.headless ? ['--headless=new'] : []),
|
|
43
|
+
...(options.devtools ? ['--auto-open-devtools-for-tabs'] : []),
|
|
44
|
+
...(options.viewport ? [`--window-size=${options.viewport.width},${options.viewport.height}`] : []),
|
|
45
|
+
...(options.args ?? []),
|
|
46
|
+
];
|
|
47
|
+
const browserProcess = (0, child_process_1.spawn)(options.browserPath, args, {
|
|
48
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
49
|
+
});
|
|
50
|
+
try {
|
|
51
|
+
const wsEndpoint = await waitForWSEndpoint(browserProcess);
|
|
52
|
+
const actualPort = parseInt(new URL(wsEndpoint).port, 10);
|
|
53
|
+
return {
|
|
54
|
+
process: browserProcess,
|
|
55
|
+
wsEndpoint,
|
|
56
|
+
port: actualPort,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
// Browser exited immediately — likely already running with this profile.
|
|
61
|
+
// Try to find an existing DevTools endpoint.
|
|
62
|
+
const existing = await tryConnectExisting(options.browserPath);
|
|
63
|
+
if (existing)
|
|
64
|
+
return existing;
|
|
65
|
+
// Can't connect to existing instance — kill all instances and retry
|
|
66
|
+
await killBrowserProcesses(options.browserPath);
|
|
67
|
+
// Wait a moment for OS to release the profile lock
|
|
68
|
+
await new Promise((r) => setTimeout(r, 0));
|
|
69
|
+
const retryProcess = (0, child_process_1.spawn)(options.browserPath, args, {
|
|
70
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
71
|
+
});
|
|
72
|
+
const wsEndpoint = await waitForWSEndpoint(retryProcess);
|
|
73
|
+
const actualPort = parseInt(new URL(wsEndpoint).port, 10);
|
|
74
|
+
return {
|
|
75
|
+
process: retryProcess,
|
|
76
|
+
wsEndpoint,
|
|
77
|
+
port: actualPort,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Try to connect to an already-running browser instance.
|
|
83
|
+
* Scans common debug ports (9222, 9229) and any port the OS reports for the browser.
|
|
84
|
+
*/
|
|
85
|
+
async function tryConnectExisting(_browserPath) {
|
|
86
|
+
// Try common remote debugging ports
|
|
87
|
+
const portsToTry = [9222, 9229, 9333];
|
|
88
|
+
for (const port of portsToTry) {
|
|
89
|
+
try {
|
|
90
|
+
const response = await fetch(`http://127.0.0.1:${port}/json/version`, { signal: AbortSignal.timeout(1000) });
|
|
91
|
+
if (response.ok) {
|
|
92
|
+
const data = await response.json();
|
|
93
|
+
if (data.webSocketDebuggerUrl) {
|
|
94
|
+
// Return a "fake" process that we don't own — won't be killed on cleanup
|
|
95
|
+
const noopProcess = { killed: false, kill: () => { } };
|
|
96
|
+
return {
|
|
97
|
+
process: noopProcess,
|
|
98
|
+
wsEndpoint: data.webSocketDebuggerUrl,
|
|
99
|
+
port,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
// Port not listening, try next
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Kill running instances of a specific browser executable.
|
|
112
|
+
* Uses exact process name match to avoid killing unrelated processes.
|
|
113
|
+
*/
|
|
114
|
+
async function killBrowserProcesses(browserPath) {
|
|
115
|
+
const { execSync } = await import('child_process');
|
|
116
|
+
const processName = (0, path_1.basename)(browserPath);
|
|
117
|
+
try {
|
|
118
|
+
if ((0, os_2.platform)() === 'win32') {
|
|
119
|
+
execSync(`taskkill /F /IM "${processName}" 2>nul`, { stdio: 'ignore' });
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
// Use -x for exact name match (not substring), avoiding collateral kills
|
|
123
|
+
execSync(`pkill -x "${processName}" 2>/dev/null || true`, { stdio: 'ignore' });
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
// Best effort — process might not exist
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Clean Chrome's crash state to prevent "didn't shut down correctly" dialogs.
|
|
132
|
+
* Modifies the Preferences file and removes the Sessions directory.
|
|
133
|
+
*/
|
|
134
|
+
function cleanCrashState(userDataDir) {
|
|
135
|
+
try {
|
|
136
|
+
// Fix Preferences file — set exit_type to "Normal"
|
|
137
|
+
const prefsPath = (0, path_1.join)(userDataDir, 'Default', 'Preferences');
|
|
138
|
+
if ((0, fs_1.existsSync)(prefsPath)) {
|
|
139
|
+
const content = (0, fs_1.readFileSync)(prefsPath, 'utf-8');
|
|
140
|
+
const fixed = content
|
|
141
|
+
.replace(/"exit_type"\s*:\s*"[^"]*"/, '"exit_type":"Normal"')
|
|
142
|
+
.replace(/"exited_cleanly"\s*:\s*false/, '"exited_cleanly":true');
|
|
143
|
+
(0, fs_1.writeFileSync)(prefsPath, fixed);
|
|
144
|
+
}
|
|
145
|
+
// Remove Sessions directory
|
|
146
|
+
const sessionsPath = (0, path_1.join)(userDataDir, 'Default', 'Sessions');
|
|
147
|
+
if ((0, fs_1.existsSync)(sessionsPath)) {
|
|
148
|
+
(0, fs_1.rmSync)(sessionsPath, { recursive: true, force: true });
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
// Best effort — don't fail the launch if cleanup fails
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
function waitForWSEndpoint(process) {
|
|
156
|
+
return new Promise((resolve, reject) => {
|
|
157
|
+
const timeout = setTimeout(() => {
|
|
158
|
+
reject(new Error('Timed out waiting for browser WebSocket endpoint'));
|
|
159
|
+
}, 30_000);
|
|
160
|
+
let stderr = '';
|
|
161
|
+
process.stderr?.on('data', (chunk) => {
|
|
162
|
+
stderr += chunk.toString();
|
|
163
|
+
const match = stderr.match(/DevTools listening on (ws:\/\/.+)/);
|
|
164
|
+
if (match) {
|
|
165
|
+
clearTimeout(timeout);
|
|
166
|
+
resolve(match[1]);
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
process.on('close', (code) => {
|
|
170
|
+
clearTimeout(timeout);
|
|
171
|
+
reject(new Error(`Browser process exited with code ${code} before DevTools endpoint was available`));
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=launcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launcher.js","sourceRoot":"","sources":["../../../src/cdp/launcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration loading and validation.
|
|
3
|
+
*/
|
|
4
|
+
export interface GlassboxConfig {
|
|
5
|
+
journeys: string;
|
|
6
|
+
browser: {
|
|
7
|
+
executablePath?: string;
|
|
8
|
+
userDataDir?: string;
|
|
9
|
+
profileDir?: string;
|
|
10
|
+
defaultViewport: {
|
|
11
|
+
width: number;
|
|
12
|
+
height: number;
|
|
13
|
+
};
|
|
14
|
+
headless: boolean;
|
|
15
|
+
};
|
|
16
|
+
server: {
|
|
17
|
+
port: number;
|
|
18
|
+
};
|
|
19
|
+
testData: {
|
|
20
|
+
globalSetup?: string;
|
|
21
|
+
beforeEach?: string;
|
|
22
|
+
afterEach?: string;
|
|
23
|
+
globalTeardown?: string;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export declare function defineConfig(config: Partial<GlassboxConfig>): Partial<GlassboxConfig>;
|
|
27
|
+
export declare function loadConfig(configPath?: string): Promise<GlassboxConfig>;
|
|
28
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE;QACP,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,eAAe,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QACnD,QAAQ,EAAE,OAAO,CAAC;KACnB,CAAC;IACF,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,QAAQ,EAAE;QACR,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;CACH;AAcD,wBAAgB,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,CAErF;AAED,wBAAsB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAmB7E"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Configuration loading and validation.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.defineConfig = defineConfig;
|
|
7
|
+
exports.loadConfig = loadConfig;
|
|
8
|
+
const fs_1 = require("fs");
|
|
9
|
+
const path_1 = require("path");
|
|
10
|
+
const DEFAULTS = {
|
|
11
|
+
journeys: './journeys/**/*.journey.ts',
|
|
12
|
+
browser: {
|
|
13
|
+
defaultViewport: { width: 1280, height: 720 },
|
|
14
|
+
headless: false,
|
|
15
|
+
},
|
|
16
|
+
server: {
|
|
17
|
+
port: 3001,
|
|
18
|
+
},
|
|
19
|
+
testData: {},
|
|
20
|
+
};
|
|
21
|
+
function defineConfig(config) {
|
|
22
|
+
return config;
|
|
23
|
+
}
|
|
24
|
+
async function loadConfig(configPath) {
|
|
25
|
+
const resolvedPath = configPath
|
|
26
|
+
? (0, path_1.resolve)(process.cwd(), configPath)
|
|
27
|
+
: (0, path_1.resolve)(process.cwd(), 'glassbox.config.ts');
|
|
28
|
+
if (configPath && !(0, fs_1.existsSync)(resolvedPath)) {
|
|
29
|
+
throw new Error(`Config file not found: ${resolvedPath}`);
|
|
30
|
+
}
|
|
31
|
+
if (!(0, fs_1.existsSync)(resolvedPath)) {
|
|
32
|
+
return { ...DEFAULTS };
|
|
33
|
+
}
|
|
34
|
+
const { createJiti } = await import('jiti');
|
|
35
|
+
const jiti = createJiti(resolvedPath);
|
|
36
|
+
const userConfig = await jiti.import(resolvedPath);
|
|
37
|
+
const config = userConfig.default ?? userConfig;
|
|
38
|
+
return mergeConfig(config, (0, path_1.dirname)(resolvedPath));
|
|
39
|
+
}
|
|
40
|
+
function mergeConfig(user, configDir) {
|
|
41
|
+
const merged = {
|
|
42
|
+
journeys: user.journeys ?? DEFAULTS.journeys,
|
|
43
|
+
browser: {
|
|
44
|
+
...DEFAULTS.browser,
|
|
45
|
+
...user.browser,
|
|
46
|
+
defaultViewport: {
|
|
47
|
+
...DEFAULTS.browser.defaultViewport,
|
|
48
|
+
...user.browser?.defaultViewport,
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
server: {
|
|
52
|
+
...DEFAULTS.server,
|
|
53
|
+
...user.server,
|
|
54
|
+
},
|
|
55
|
+
testData: { ...user.testData },
|
|
56
|
+
};
|
|
57
|
+
// Resolve relative paths against config directory
|
|
58
|
+
if (merged.testData.globalSetup) {
|
|
59
|
+
merged.testData.globalSetup = (0, path_1.resolve)(configDir, merged.testData.globalSetup);
|
|
60
|
+
}
|
|
61
|
+
if (merged.testData.beforeEach) {
|
|
62
|
+
merged.testData.beforeEach = (0, path_1.resolve)(configDir, merged.testData.beforeEach);
|
|
63
|
+
}
|
|
64
|
+
if (merged.testData.afterEach) {
|
|
65
|
+
merged.testData.afterEach = (0, path_1.resolve)(configDir, merged.testData.afterEach);
|
|
66
|
+
}
|
|
67
|
+
if (merged.testData.globalTeardown) {
|
|
68
|
+
merged.testData.globalTeardown = (0, path_1.resolve)(configDir, merged.testData.globalTeardown);
|
|
69
|
+
}
|
|
70
|
+
return merged;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.test.d.ts","sourceRoot":"","sources":["../../src/config.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Unit tests for config loading and validation.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const vitest_1 = require("vitest");
|
|
7
|
+
const config_js_1 = require("./config.js");
|
|
8
|
+
(0, vitest_1.describe)('defineConfig', () => {
|
|
9
|
+
(0, vitest_1.it)('returns the config object unchanged', () => {
|
|
10
|
+
const config = (0, config_js_1.defineConfig)({
|
|
11
|
+
journeys: './tests/**/*.journey.ts',
|
|
12
|
+
server: { port: 4000 },
|
|
13
|
+
});
|
|
14
|
+
(0, vitest_1.expect)(config.journeys).toBe('./tests/**/*.journey.ts');
|
|
15
|
+
(0, vitest_1.expect)(config.server?.port).toBe(4000);
|
|
16
|
+
});
|
|
17
|
+
(0, vitest_1.it)('allows partial config', () => {
|
|
18
|
+
const config = (0, config_js_1.defineConfig)({});
|
|
19
|
+
(0, vitest_1.expect)(config).toEqual({});
|
|
20
|
+
});
|
|
21
|
+
(0, vitest_1.it)('accepts browser config', () => {
|
|
22
|
+
const config = (0, config_js_1.defineConfig)({
|
|
23
|
+
browser: {
|
|
24
|
+
executablePath: '/usr/bin/chrome',
|
|
25
|
+
defaultViewport: { width: 1920, height: 1080 },
|
|
26
|
+
headless: true,
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
(0, vitest_1.expect)(config.browser?.executablePath).toBe('/usr/bin/chrome');
|
|
30
|
+
(0, vitest_1.expect)(config.browser?.defaultViewport?.width).toBe(1920);
|
|
31
|
+
(0, vitest_1.expect)(config.browser?.headless).toBe(true);
|
|
32
|
+
});
|
|
33
|
+
(0, vitest_1.it)('accepts testData hooks', () => {
|
|
34
|
+
const config = (0, config_js_1.defineConfig)({
|
|
35
|
+
testData: {
|
|
36
|
+
globalSetup: './setup.ts',
|
|
37
|
+
beforeEach: './before.ts',
|
|
38
|
+
afterEach: './after.ts',
|
|
39
|
+
globalTeardown: './teardown.ts',
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
(0, vitest_1.expect)(config.testData?.globalSetup).toBe('./setup.ts');
|
|
43
|
+
(0, vitest_1.expect)(config.testData?.beforeEach).toBe('./before.ts');
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
//# sourceMappingURL=config.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../src/config.test.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAEH,mCAA8C;AAC9C,2CAA2C;AAE3C,IAAA,iBAAQ,EAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,IAAA,WAAE,EAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,MAAM,GAAG,IAAA,wBAAY,EAAC;YAC1B,QAAQ,EAAE,yBAAyB;YACnC,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;SACvB,CAAC,CAAC;QAEH,IAAA,eAAM,EAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QACxD,IAAA,eAAM,EAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,MAAM,GAAG,IAAA,wBAAY,EAAC,EAAE,CAAC,CAAC;QAChC,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,MAAM,GAAG,IAAA,wBAAY,EAAC;YAC1B,OAAO,EAAE;gBACP,cAAc,EAAE,iBAAiB;gBACjC,eAAe,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;gBAC9C,QAAQ,EAAE,IAAI;aACf;SACF,CAAC,CAAC;QAEH,IAAA,eAAM,EAAC,MAAM,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC/D,IAAA,eAAM,EAAC,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1D,IAAA,eAAM,EAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,MAAM,GAAG,IAAA,wBAAY,EAAC;YAC1B,QAAQ,EAAE;gBACR,WAAW,EAAE,YAAY;gBACzB,UAAU,EAAE,aAAa;gBACzB,SAAS,EAAE,YAAY;gBACvB,cAAc,EAAE,eAAe;aAChC;SACF,CAAC,CAAC;QAEH,IAAA,eAAM,EAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACxD,IAAA,eAAM,EAAC,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DiagnosticError — thrown when a journey step fails.
|
|
3
|
+
* Includes diagnostic data from the collector at the point of failure.
|
|
4
|
+
*/
|
|
5
|
+
import type { ConsoleError, ExceptionDetail, NetworkFailure } from './ai/types.js';
|
|
6
|
+
export declare class DiagnosticError extends Error {
|
|
7
|
+
selector?: string;
|
|
8
|
+
timeout?: number;
|
|
9
|
+
step?: string;
|
|
10
|
+
diagnostics: {
|
|
11
|
+
consoleErrors: ConsoleError[];
|
|
12
|
+
exceptions: ExceptionDetail[];
|
|
13
|
+
networkFailures: NetworkFailure[];
|
|
14
|
+
};
|
|
15
|
+
constructor(message: string, options?: {
|
|
16
|
+
selector?: string;
|
|
17
|
+
timeout?: number;
|
|
18
|
+
step?: string;
|
|
19
|
+
diagnostics?: {
|
|
20
|
+
consoleErrors?: ConsoleError[];
|
|
21
|
+
exceptions?: ExceptionDetail[];
|
|
22
|
+
networkFailures?: NetworkFailure[];
|
|
23
|
+
};
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEnF,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,EAAE;QACX,aAAa,EAAE,YAAY,EAAE,CAAC;QAC9B,UAAU,EAAE,eAAe,EAAE,CAAC;QAC9B,eAAe,EAAE,cAAc,EAAE,CAAC;KACnC,CAAC;gBAGA,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;QACP,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE;YACZ,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;YAC/B,UAAU,CAAC,EAAE,eAAe,EAAE,CAAC;YAC/B,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;SACpC,CAAC;KACE;CAaT"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* DiagnosticError — thrown when a journey step fails.
|
|
4
|
+
* Includes diagnostic data from the collector at the point of failure.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.DiagnosticError = void 0;
|
|
8
|
+
class DiagnosticError extends Error {
|
|
9
|
+
selector;
|
|
10
|
+
timeout;
|
|
11
|
+
step;
|
|
12
|
+
diagnostics;
|
|
13
|
+
constructor(message, options = {}) {
|
|
14
|
+
super(message);
|
|
15
|
+
this.name = 'DiagnosticError';
|
|
16
|
+
this.selector = options.selector;
|
|
17
|
+
this.timeout = options.timeout;
|
|
18
|
+
this.step = options.step;
|
|
19
|
+
this.diagnostics = {
|
|
20
|
+
consoleErrors: options.diagnostics?.consoleErrors ?? [],
|
|
21
|
+
exceptions: options.diagnostics?.exceptions ?? [],
|
|
22
|
+
networkFailures: options.diagnostics?.networkFailures ?? [],
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
exports.DiagnosticError = DiagnosticError;
|
|
27
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAIH,MAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAU;IAClB,OAAO,CAAU;IACjB,IAAI,CAAU;IACd,WAAW,CAIT;IAEF,YACE,OAAe,EACf,UASI,EAAE;QAEN,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,WAAW,GAAG;YACjB,aAAa,EAAE,OAAO,CAAC,WAAW,EAAE,aAAa,IAAI,EAAE;YACvD,UAAU,EAAE,OAAO,CAAC,WAAW,EAAE,UAAU,IAAI,EAAE;YACjD,eAAe,EAAE,OAAO,CAAC,WAAW,EAAE,eAAe,IAAI,EAAE;SAC5D,CAAC;IACJ,CAAC;CACF;AAlCD,0CAkCC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Glassbox — public API surface.
|
|
3
|
+
* This is what consumers `import from 'glassbox'`.
|
|
4
|
+
*/
|
|
5
|
+
export { BasePage } from './page-objects/base.page.js';
|
|
6
|
+
export { BrowserContextPage } from './page-objects/browser-context.page.js';
|
|
7
|
+
export { Journey } from './journey.js';
|
|
8
|
+
export type { BrowserAdapter, DownloadResult } from './adapters/browser-adapter.interface.js';
|
|
9
|
+
export { defineConfig, loadConfig } from './config.js';
|
|
10
|
+
export type { GlassboxConfig } from './config.js';
|
|
11
|
+
export { waitForCondition } from './utils/wait-utils.js';
|
|
12
|
+
export type { WaitOptions } from './utils/wait-utils.js';
|
|
13
|
+
export { withErrorContext } from './utils/page-object-error.js';
|
|
14
|
+
export { formatTestError, getErrorSummary } from './utils/error-formatter.js';
|
|
15
|
+
export type { FormattedError } from './utils/error-formatter.js';
|
|
16
|
+
export type { HookContext, LifecycleHooks } from './runner/lifecycle-hooks.js';
|
|
17
|
+
export type { ConsoleError, ExceptionDetail, NetworkRequest, NetworkFailure, MetricsSnapshot, TimelineEntry, } from './ai/types.js';
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AAG5E,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAG9F,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACvD,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC9E,YAAY,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAGjE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAG/E,YAAY,EACV,YAAY,EACZ,eAAe,EACf,cAAc,EACd,cAAc,EACd,eAAe,EACf,aAAa,GACd,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Glassbox — public API surface.
|
|
4
|
+
* This is what consumers `import from 'glassbox'`.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.getErrorSummary = exports.formatTestError = exports.withErrorContext = exports.waitForCondition = exports.loadConfig = exports.defineConfig = exports.Journey = exports.BrowserContextPage = exports.BasePage = void 0;
|
|
8
|
+
// Page objects
|
|
9
|
+
var base_page_js_1 = require("./page-objects/base.page.js");
|
|
10
|
+
Object.defineProperty(exports, "BasePage", { enumerable: true, get: function () { return base_page_js_1.BasePage; } });
|
|
11
|
+
var browser_context_page_js_1 = require("./page-objects/browser-context.page.js");
|
|
12
|
+
Object.defineProperty(exports, "BrowserContextPage", { enumerable: true, get: function () { return browser_context_page_js_1.BrowserContextPage; } });
|
|
13
|
+
// Journey base class
|
|
14
|
+
var journey_js_1 = require("./journey.js");
|
|
15
|
+
Object.defineProperty(exports, "Journey", { enumerable: true, get: function () { return journey_js_1.Journey; } });
|
|
16
|
+
// Config
|
|
17
|
+
var config_js_1 = require("./config.js");
|
|
18
|
+
Object.defineProperty(exports, "defineConfig", { enumerable: true, get: function () { return config_js_1.defineConfig; } });
|
|
19
|
+
Object.defineProperty(exports, "loadConfig", { enumerable: true, get: function () { return config_js_1.loadConfig; } });
|
|
20
|
+
// Utilities
|
|
21
|
+
var wait_utils_js_1 = require("./utils/wait-utils.js");
|
|
22
|
+
Object.defineProperty(exports, "waitForCondition", { enumerable: true, get: function () { return wait_utils_js_1.waitForCondition; } });
|
|
23
|
+
var page_object_error_js_1 = require("./utils/page-object-error.js");
|
|
24
|
+
Object.defineProperty(exports, "withErrorContext", { enumerable: true, get: function () { return page_object_error_js_1.withErrorContext; } });
|
|
25
|
+
var error_formatter_js_1 = require("./utils/error-formatter.js");
|
|
26
|
+
Object.defineProperty(exports, "formatTestError", { enumerable: true, get: function () { return error_formatter_js_1.formatTestError; } });
|
|
27
|
+
Object.defineProperty(exports, "getErrorSummary", { enumerable: true, get: function () { return error_formatter_js_1.getErrorSummary; } });
|
|
28
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,eAAe;AACf,4DAAuD;AAA9C,wGAAA,QAAQ,OAAA;AACjB,kFAA4E;AAAnE,6HAAA,kBAAkB,OAAA;AAE3B,qBAAqB;AACrB,2CAAuC;AAA9B,qGAAA,OAAO,OAAA;AAKhB,SAAS;AACT,yCAAuD;AAA9C,yGAAA,YAAY,OAAA;AAAE,uGAAA,UAAU,OAAA;AAGjC,YAAY;AACZ,uDAAyD;AAAhD,iHAAA,gBAAgB,OAAA;AAEzB,qEAAgE;AAAvD,wHAAA,gBAAgB,OAAA;AACzB,iEAA8E;AAArE,qHAAA,eAAe,OAAA;AAAE,qHAAA,eAAe,OAAA"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Journey base class — provides page object creation with zero boilerplate.
|
|
3
|
+
*
|
|
4
|
+
* Consumers extend this and use `this.page(PageClass)` to create page objects.
|
|
5
|
+
* The adapter is passed via the inherited constructor — no need to define one.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { Journey } from 'glassbox';
|
|
10
|
+
* import { LoginPage } from '../page-objects/login.page';
|
|
11
|
+
*
|
|
12
|
+
* export class LoginJourney extends Journey {
|
|
13
|
+
* loginPage = this.page(LoginPage);
|
|
14
|
+
*
|
|
15
|
+
* async execute() {
|
|
16
|
+
* await this.loginPage.navigateToApp();
|
|
17
|
+
* await this.loginPage.login('user', 'pass');
|
|
18
|
+
* }
|
|
19
|
+
* }
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
import type { BrowserAdapter } from './adapters/browser-adapter.interface.js';
|
|
23
|
+
import type { BasePage } from './page-objects/base.page.js';
|
|
24
|
+
export declare abstract class Journey {
|
|
25
|
+
protected adapter: BrowserAdapter;
|
|
26
|
+
/**
|
|
27
|
+
* Create a page object instance with the adapter pre-wired.
|
|
28
|
+
* Use as a property initializer: `loginPage = this.page(LoginPage);`
|
|
29
|
+
*/
|
|
30
|
+
protected page<T extends BasePage>(PageClass: new (adapter: BrowserAdapter) => T): T;
|
|
31
|
+
/** Override this to define the journey's test flow. */
|
|
32
|
+
abstract execute(): Promise<void>;
|
|
33
|
+
constructor(adapter: BrowserAdapter);
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=journey.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"journey.d.ts","sourceRoot":"","sources":["../../src/journey.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAC9E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAE5D,8BAAsB,OAAO;IAYf,SAAS,CAAC,OAAO,EAAE,cAAc;IAX7C;;;OAGG;IACH,SAAS,CAAC,IAAI,CAAC,CAAC,SAAS,QAAQ,EAAE,SAAS,EAAE,KAAK,OAAO,EAAE,cAAc,KAAK,CAAC,GAAG,CAAC;IAIpF,uDAAuD;IACvD,QAAQ,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;gBAEX,OAAO,EAAE,cAAc;CAC9C"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Journey base class — provides page object creation with zero boilerplate.
|
|
4
|
+
*
|
|
5
|
+
* Consumers extend this and use `this.page(PageClass)` to create page objects.
|
|
6
|
+
* The adapter is passed via the inherited constructor — no need to define one.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* import { Journey } from 'glassbox';
|
|
11
|
+
* import { LoginPage } from '../page-objects/login.page';
|
|
12
|
+
*
|
|
13
|
+
* export class LoginJourney extends Journey {
|
|
14
|
+
* loginPage = this.page(LoginPage);
|
|
15
|
+
*
|
|
16
|
+
* async execute() {
|
|
17
|
+
* await this.loginPage.navigateToApp();
|
|
18
|
+
* await this.loginPage.login('user', 'pass');
|
|
19
|
+
* }
|
|
20
|
+
* }
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
exports.Journey = void 0;
|
|
25
|
+
class Journey {
|
|
26
|
+
adapter;
|
|
27
|
+
/**
|
|
28
|
+
* Create a page object instance with the adapter pre-wired.
|
|
29
|
+
* Use as a property initializer: `loginPage = this.page(LoginPage);`
|
|
30
|
+
*/
|
|
31
|
+
page(PageClass) {
|
|
32
|
+
return new PageClass(this.adapter);
|
|
33
|
+
}
|
|
34
|
+
constructor(adapter) {
|
|
35
|
+
this.adapter = adapter;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
exports.Journey = Journey;
|
|
39
|
+
//# sourceMappingURL=journey.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"journey.js","sourceRoot":"","sources":["../../src/journey.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;;;AAKH,MAAsB,OAAO;IAYL;IAXtB;;;OAGG;IACO,IAAI,CAAqB,SAA6C;QAC9E,OAAO,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAKD,YAAsB,OAAuB;QAAvB,YAAO,GAAP,OAAO,CAAgB;IAAG,CAAC;CAClD;AAbD,0BAaC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Glassbox MCP Server — exposes diagnostic tools for AI agents.
|
|
3
|
+
*
|
|
4
|
+
* Runs as a stdio-based MCP server that translates tool calls into
|
|
5
|
+
* REST API requests against the running Glassbox server.
|
|
6
|
+
*
|
|
7
|
+
* Usage in mcp.json:
|
|
8
|
+
* ```json
|
|
9
|
+
* {
|
|
10
|
+
* "mcpServers": {
|
|
11
|
+
* "glassbox": {
|
|
12
|
+
* "command": "npx",
|
|
13
|
+
* "args": ["glassbox", "mcp"],
|
|
14
|
+
* "env": { "GLASSBOX_URL": "http://localhost:3001" }
|
|
15
|
+
* }
|
|
16
|
+
* }
|
|
17
|
+
* }
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
/** Start the MCP server. */
|
|
21
|
+
export declare function startMCPServer(): Promise<void>;
|
|
22
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/mcp/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAoMH,4BAA4B;AAC5B,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CA6BpD"}
|