@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,229 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Glassbox MCP Server — exposes diagnostic tools for AI agents.
|
|
4
|
+
*
|
|
5
|
+
* Runs as a stdio-based MCP server that translates tool calls into
|
|
6
|
+
* REST API requests against the running Glassbox server.
|
|
7
|
+
*
|
|
8
|
+
* Usage in mcp.json:
|
|
9
|
+
* ```json
|
|
10
|
+
* {
|
|
11
|
+
* "mcpServers": {
|
|
12
|
+
* "glassbox": {
|
|
13
|
+
* "command": "npx",
|
|
14
|
+
* "args": ["glassbox", "mcp"],
|
|
15
|
+
* "env": { "GLASSBOX_URL": "http://localhost:3001" }
|
|
16
|
+
* }
|
|
17
|
+
* }
|
|
18
|
+
* }
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.startMCPServer = startMCPServer;
|
|
23
|
+
const index_js_1 = require("@modelcontextprotocol/sdk/server/index.js");
|
|
24
|
+
const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
25
|
+
const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
|
|
26
|
+
const GLASSBOX_URL = process.env.GLASSBOX_URL ?? 'http://localhost:3001';
|
|
27
|
+
/** Tool definitions — each maps to a diagnostic REST endpoint. */
|
|
28
|
+
const TOOLS = [
|
|
29
|
+
{
|
|
30
|
+
name: 'getJourneyStatus',
|
|
31
|
+
description: 'Get a summary of diagnostic data from the last journey run: counts of console errors, exceptions, network failures, and total requests. Call this first to understand what happened.',
|
|
32
|
+
inputSchema: { type: 'object', properties: {} },
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: 'getConsoleErrors',
|
|
36
|
+
description: 'Returns all console.error() and console.warn() calls captured during the journey, with stack traces. Use when investigating runtime errors.',
|
|
37
|
+
inputSchema: { type: 'object', properties: {} },
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
name: 'getExceptions',
|
|
41
|
+
description: 'Returns all unhandled JavaScript exceptions thrown during the journey, with full stack traces and source locations. Use when the failure might be caused by an uncaught error.',
|
|
42
|
+
inputSchema: { type: 'object', properties: {} },
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
name: 'getNetworkFailures',
|
|
46
|
+
description: 'Returns all failed network requests (HTTP status >= 400 or network-level failures). Use when the failure might be caused by a backend issue or misconfigured API call.',
|
|
47
|
+
inputSchema: { type: 'object', properties: {} },
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: 'getNetworkLog',
|
|
51
|
+
description: 'Returns all XHR/Fetch API calls made during the journey with URLs, methods, and status codes. Use to understand what API calls the app made.',
|
|
52
|
+
inputSchema: { type: 'object', properties: {} },
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
name: 'getTimeline',
|
|
56
|
+
description: 'Returns the last N events in chronological order (console calls, network requests, exceptions). Use to understand the sequence of events leading up to the failure.',
|
|
57
|
+
inputSchema: {
|
|
58
|
+
type: 'object',
|
|
59
|
+
properties: {
|
|
60
|
+
lastN: { type: 'number', description: 'Number of recent events to return (default: 20)' },
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
name: 'getPerformanceMetrics',
|
|
66
|
+
description: 'Returns performance metric snapshots captured during the journey (heap size, DOM nodes, layout recalculations). Use when investigating performance issues.',
|
|
67
|
+
inputSchema: { type: 'object', properties: {} },
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
name: 'listJourneys',
|
|
71
|
+
description: 'Returns all available journey files that can be run.',
|
|
72
|
+
inputSchema: { type: 'object', properties: {} },
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
name: 'runJourney',
|
|
76
|
+
description: 'Run a specific journey (or all journeys) and collect diagnostic data. The browser stays open on failure so you can inspect the DOM and take screenshots. Use after making a code change to verify the fix.',
|
|
77
|
+
inputSchema: {
|
|
78
|
+
type: 'object',
|
|
79
|
+
properties: {
|
|
80
|
+
journey: { type: 'string', description: 'Journey name, ID, or path (from listJourneys). Omit to run all.' },
|
|
81
|
+
targetUrl: { type: 'string', description: 'Target URL of the app under test (default: http://localhost:3000)' },
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
name: 'getDomSnapshot',
|
|
87
|
+
description: 'Returns the outerHTML of the page or a specific element. Only available after a journey run (browser stays open on failure). Use when an expected element is missing or has wrong content.',
|
|
88
|
+
inputSchema: {
|
|
89
|
+
type: 'object',
|
|
90
|
+
properties: {
|
|
91
|
+
selector: { type: 'string', description: 'CSS selector to inspect. Omit for full page HTML.' },
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
name: 'getScreenshot',
|
|
97
|
+
description: 'Capture a screenshot of the current page state (base64 PNG). Only available when the browser is still open after a run. Use to see the visual state at the point of failure.',
|
|
98
|
+
inputSchema: { type: 'object', properties: {} },
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
name: 'getAccessibilityTree',
|
|
102
|
+
description: 'Returns the full ARIA accessibility tree of the page. More structured than raw HTML for understanding page layout and interactive elements.',
|
|
103
|
+
inputSchema: { type: 'object', properties: {} },
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
name: 'resetDiagnostics',
|
|
107
|
+
description: 'Clear all collected diagnostic data and close any live browser session. Use before re-running a journey to get fresh results.',
|
|
108
|
+
inputSchema: { type: 'object', properties: {} },
|
|
109
|
+
},
|
|
110
|
+
];
|
|
111
|
+
/** Map tool names to their API call implementations. */
|
|
112
|
+
const toolHandlers = new Map([
|
|
113
|
+
['getJourneyStatus', async () => fetchJson('/api/diagnostics/summary')],
|
|
114
|
+
['getConsoleErrors', async () => fetchJson('/api/diagnostics/console-errors')],
|
|
115
|
+
['getExceptions', async () => fetchJson('/api/diagnostics/exceptions')],
|
|
116
|
+
['getNetworkFailures', async () => fetchJson('/api/diagnostics/network-failures')],
|
|
117
|
+
['getNetworkLog', async () => fetchJson('/api/diagnostics/network-log')],
|
|
118
|
+
['getTimeline', async (args) => {
|
|
119
|
+
const lastN = args.lastN ? `?lastN=${args.lastN}` : '';
|
|
120
|
+
return fetchJson(`/api/diagnostics/timeline${lastN}`);
|
|
121
|
+
}],
|
|
122
|
+
['getPerformanceMetrics', async () => fetchJson('/api/diagnostics/performance')],
|
|
123
|
+
['listJourneys', async () => fetchJson('/api/journeys')],
|
|
124
|
+
['runJourney', async (args) => {
|
|
125
|
+
const journeyFilter = args.journey;
|
|
126
|
+
const targetUrl = args.targetUrl ?? 'http://localhost:3000';
|
|
127
|
+
// Resolve journey path from name/ID/path
|
|
128
|
+
const allJourneys = JSON.parse(await fetchJson('/api/journeys'));
|
|
129
|
+
let journeyPaths;
|
|
130
|
+
if (!journeyFilter) {
|
|
131
|
+
journeyPaths = allJourneys.map((j) => j.path);
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
// Match by ID, name (case-insensitive), or exact path
|
|
135
|
+
const match = allJourneys.find((j) => j.id === journeyFilter ||
|
|
136
|
+
j.name.toLowerCase() === journeyFilter.toLowerCase() ||
|
|
137
|
+
j.path === journeyFilter ||
|
|
138
|
+
j.id.includes(journeyFilter));
|
|
139
|
+
journeyPaths = match ? [match.path] : allJourneys.filter((j) => j.id.includes(journeyFilter)).map((j) => j.path);
|
|
140
|
+
}
|
|
141
|
+
if (journeyPaths.length === 0) {
|
|
142
|
+
return JSON.stringify({ error: `No journey found matching "${journeyFilter}"`, available: allJourneys.map((j) => j.id) });
|
|
143
|
+
}
|
|
144
|
+
// Reset diagnostics before the run for clean data
|
|
145
|
+
await fetch(`${GLASSBOX_URL}/api/diagnostics/reset`, { method: 'POST' });
|
|
146
|
+
// Trigger the run
|
|
147
|
+
await fetch(`${GLASSBOX_URL}/api/tests/run`, {
|
|
148
|
+
method: 'POST',
|
|
149
|
+
headers: { 'Content-Type': 'application/json' },
|
|
150
|
+
body: JSON.stringify({ journeys: journeyPaths, config: { targetUrl, headless: true } }),
|
|
151
|
+
});
|
|
152
|
+
// Wait for completion
|
|
153
|
+
await waitForRunComplete();
|
|
154
|
+
// Return the summary (includes liveSessionAvailable flag)
|
|
155
|
+
return fetchJson('/api/diagnostics/summary');
|
|
156
|
+
}],
|
|
157
|
+
['getDomSnapshot', async (args) => {
|
|
158
|
+
const selector = args.selector ? `?selector=${encodeURIComponent(args.selector)}` : '';
|
|
159
|
+
return fetchJson(`/api/diagnostics/dom${selector}`);
|
|
160
|
+
}],
|
|
161
|
+
['getScreenshot', async () => fetchJson('/api/diagnostics/screenshot')],
|
|
162
|
+
['getAccessibilityTree', async () => fetchJson('/api/diagnostics/accessibility-tree')],
|
|
163
|
+
['resetDiagnostics', async () => {
|
|
164
|
+
await fetch(`${GLASSBOX_URL}/api/diagnostics/reset`, { method: 'POST' });
|
|
165
|
+
return JSON.stringify({ status: 'reset' });
|
|
166
|
+
}],
|
|
167
|
+
]);
|
|
168
|
+
/** Fetch a Glassbox API endpoint and return the JSON as a string. */
|
|
169
|
+
async function fetchJson(path) {
|
|
170
|
+
const response = await fetch(`${GLASSBOX_URL}${path}`);
|
|
171
|
+
if (!response.ok) {
|
|
172
|
+
return JSON.stringify({ error: `API returned ${response.status}: ${response.statusText}` });
|
|
173
|
+
}
|
|
174
|
+
const data = await response.json();
|
|
175
|
+
return JSON.stringify(data, null, 2);
|
|
176
|
+
}
|
|
177
|
+
/** Poll until the run completes (status transitions from 'running' to 'idle'). Max 60 seconds. */
|
|
178
|
+
async function waitForRunComplete() {
|
|
179
|
+
const maxWait = 60_000;
|
|
180
|
+
const interval = 500;
|
|
181
|
+
const start = Date.now();
|
|
182
|
+
// First, wait for the run to actually start (status === 'running')
|
|
183
|
+
while (Date.now() - start < maxWait) {
|
|
184
|
+
try {
|
|
185
|
+
const response = await fetch(`${GLASSBOX_URL}/api/tests/status`);
|
|
186
|
+
const data = await response.json();
|
|
187
|
+
if (data.status === 'running')
|
|
188
|
+
break;
|
|
189
|
+
}
|
|
190
|
+
catch { /* server not ready */ }
|
|
191
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
192
|
+
}
|
|
193
|
+
// Then wait for it to finish (status === 'idle')
|
|
194
|
+
while (Date.now() - start < maxWait) {
|
|
195
|
+
try {
|
|
196
|
+
const response = await fetch(`${GLASSBOX_URL}/api/tests/status`);
|
|
197
|
+
const data = await response.json();
|
|
198
|
+
if (data.status === 'idle')
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
catch { /* server not ready */ }
|
|
202
|
+
await new Promise((r) => setTimeout(r, interval));
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
/** Start the MCP server. */
|
|
206
|
+
async function startMCPServer() {
|
|
207
|
+
const server = new index_js_1.Server({ name: 'glassbox', version: '0.1.0' }, { capabilities: { tools: {} } });
|
|
208
|
+
server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => ({
|
|
209
|
+
tools: TOOLS,
|
|
210
|
+
}));
|
|
211
|
+
server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
|
|
212
|
+
const { name, arguments: args } = request.params;
|
|
213
|
+
const handler = toolHandlers.get(name);
|
|
214
|
+
if (!handler) {
|
|
215
|
+
return { content: [{ type: 'text', text: `Unknown tool: ${name}` }] };
|
|
216
|
+
}
|
|
217
|
+
try {
|
|
218
|
+
const result = await handler(args ?? {});
|
|
219
|
+
return { content: [{ type: 'text', text: result }] };
|
|
220
|
+
}
|
|
221
|
+
catch (error) {
|
|
222
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
223
|
+
return { content: [{ type: 'text', text: `Error: ${message}` }] };
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
const transport = new stdio_js_1.StdioServerTransport();
|
|
227
|
+
await server.connect(transport);
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BasePage — the page object base class that consumers extend.
|
|
3
|
+
* Provides convenience wrappers around the BrowserAdapter.
|
|
4
|
+
*/
|
|
5
|
+
import type { BrowserAdapter } from '../adapters/browser-adapter.interface.js';
|
|
6
|
+
export declare class BasePage {
|
|
7
|
+
protected adapter: BrowserAdapter;
|
|
8
|
+
constructor(adapter: BrowserAdapter);
|
|
9
|
+
protected click(selector: string): Promise<void>;
|
|
10
|
+
protected fill(selector: string, value: string): Promise<void>;
|
|
11
|
+
protected type(selector: string, value: string, options?: {
|
|
12
|
+
delay?: number;
|
|
13
|
+
}): Promise<void>;
|
|
14
|
+
protected getText(selector: string): Promise<string>;
|
|
15
|
+
protected getInputValue(selector: string): Promise<string>;
|
|
16
|
+
protected getAttribute(selector: string, attribute: string): Promise<string | null>;
|
|
17
|
+
protected waitForSelector(selector: string, options?: {
|
|
18
|
+
timeout?: number;
|
|
19
|
+
}): Promise<void>;
|
|
20
|
+
protected waitForHidden(selector: string, options?: {
|
|
21
|
+
timeout?: number;
|
|
22
|
+
}): Promise<void>;
|
|
23
|
+
protected isVisible(selector: string): Promise<boolean>;
|
|
24
|
+
protected goto(url: string): Promise<void>;
|
|
25
|
+
protected evaluate<T = unknown>(script: string | (() => T)): Promise<T>;
|
|
26
|
+
protected clearSession(origin?: string): Promise<void>;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=base.page.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.page.d.ts","sourceRoot":"","sources":["../../../src/page-objects/base.page.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAE/E,qBAAa,QAAQ;IACP,SAAS,CAAC,OAAO,EAAE,cAAc;gBAAvB,OAAO,EAAE,cAAc;cAE7B,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;cAItC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;cAIpD,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;cAIlF,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;cAI1C,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;cAIhD,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;cAIzE,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;cAIhF,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;cAI9E,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;cAI7C,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;cAIhC,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;cAI7D,YAAY,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAG7D"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* BasePage — the page object base class that consumers extend.
|
|
4
|
+
* Provides convenience wrappers around the BrowserAdapter.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.BasePage = void 0;
|
|
8
|
+
class BasePage {
|
|
9
|
+
adapter;
|
|
10
|
+
constructor(adapter) {
|
|
11
|
+
this.adapter = adapter;
|
|
12
|
+
}
|
|
13
|
+
async click(selector) {
|
|
14
|
+
return this.adapter.click(selector);
|
|
15
|
+
}
|
|
16
|
+
async fill(selector, value) {
|
|
17
|
+
return this.adapter.fill(selector, value);
|
|
18
|
+
}
|
|
19
|
+
async type(selector, value, options) {
|
|
20
|
+
return this.adapter.type(selector, value, options);
|
|
21
|
+
}
|
|
22
|
+
async getText(selector) {
|
|
23
|
+
return this.adapter.getText(selector);
|
|
24
|
+
}
|
|
25
|
+
async getInputValue(selector) {
|
|
26
|
+
return this.adapter.getInputValue(selector);
|
|
27
|
+
}
|
|
28
|
+
async getAttribute(selector, attribute) {
|
|
29
|
+
return this.adapter.getAttribute(selector, attribute);
|
|
30
|
+
}
|
|
31
|
+
async waitForSelector(selector, options) {
|
|
32
|
+
return this.adapter.waitForSelector(selector, options);
|
|
33
|
+
}
|
|
34
|
+
async waitForHidden(selector, options) {
|
|
35
|
+
return this.adapter.waitForHidden(selector, options);
|
|
36
|
+
}
|
|
37
|
+
async isVisible(selector) {
|
|
38
|
+
return this.adapter.isVisible(selector);
|
|
39
|
+
}
|
|
40
|
+
async goto(url) {
|
|
41
|
+
return this.adapter.goto(url);
|
|
42
|
+
}
|
|
43
|
+
async evaluate(script) {
|
|
44
|
+
return this.adapter.evaluate(script);
|
|
45
|
+
}
|
|
46
|
+
async clearSession(origin) {
|
|
47
|
+
return this.adapter.clearSession(origin);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
exports.BasePage = BasePage;
|
|
51
|
+
//# sourceMappingURL=base.page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.page.js","sourceRoot":"","sources":["../../../src/page-objects/base.page.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAIH,MAAa,QAAQ;IACG;IAAtB,YAAsB,OAAuB;QAAvB,YAAO,GAAP,OAAO,CAAgB;IAAG,CAAC;IAEvC,KAAK,CAAC,KAAK,CAAC,QAAgB;QACpC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;IAES,KAAK,CAAC,IAAI,CAAC,QAAgB,EAAE,KAAa;QAClD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC5C,CAAC;IAES,KAAK,CAAC,IAAI,CAAC,QAAgB,EAAE,KAAa,EAAE,OAA4B;QAChF,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IACrD,CAAC;IAES,KAAK,CAAC,OAAO,CAAC,QAAgB;QACtC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;IAES,KAAK,CAAC,aAAa,CAAC,QAAgB;QAC5C,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAES,KAAK,CAAC,YAAY,CAAC,QAAgB,EAAE,SAAiB;QAC9D,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACxD,CAAC;IAES,KAAK,CAAC,eAAe,CAAC,QAAgB,EAAE,OAA8B;QAC9E,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACzD,CAAC;IAES,KAAK,CAAC,aAAa,CAAC,QAAgB,EAAE,OAA8B;QAC5E,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IAES,KAAK,CAAC,SAAS,CAAC,QAAgB;QACxC,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAES,KAAK,CAAC,IAAI,CAAC,GAAW;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IAES,KAAK,CAAC,QAAQ,CAAc,MAA0B;QAC9D,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAES,KAAK,CAAC,YAAY,CAAC,MAAe;QAC1C,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;CACF;AAlDD,4BAkDC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BrowserContextPage — extends BasePage with browser-context-aware helpers.
|
|
3
|
+
* Useful for journeys that need to manage navigation state, multiple contexts, etc.
|
|
4
|
+
*/
|
|
5
|
+
import { BasePage } from './base.page.js';
|
|
6
|
+
import type { BrowserAdapter } from '../adapters/browser-adapter.interface.js';
|
|
7
|
+
export declare class BrowserContextPage extends BasePage {
|
|
8
|
+
constructor(adapter: BrowserAdapter);
|
|
9
|
+
navigateToApp(path?: string): Promise<void>;
|
|
10
|
+
waitForApp(selector?: string): Promise<void>;
|
|
11
|
+
getCurrentUrl(): Promise<string>;
|
|
12
|
+
clearAndRestart(origin?: string): Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=browser-context.page.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-context.page.d.ts","sourceRoot":"","sources":["../../../src/page-objects/browser-context.page.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAE/E,qBAAa,kBAAmB,SAAQ,QAAQ;gBAClC,OAAO,EAAE,cAAc;IAI7B,aAAa,CAAC,IAAI,SAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxC,UAAU,CAAC,QAAQ,SAAgC,GAAG,OAAO,CAAC,IAAI,CAAC;IAInE,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAIhC,eAAe,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAItD"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* BrowserContextPage — extends BasePage with browser-context-aware helpers.
|
|
4
|
+
* Useful for journeys that need to manage navigation state, multiple contexts, etc.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.BrowserContextPage = void 0;
|
|
8
|
+
const base_page_js_1 = require("./base.page.js");
|
|
9
|
+
class BrowserContextPage extends base_page_js_1.BasePage {
|
|
10
|
+
constructor(adapter) {
|
|
11
|
+
super(adapter);
|
|
12
|
+
}
|
|
13
|
+
async navigateToApp(path = '/') {
|
|
14
|
+
await this.goto(path);
|
|
15
|
+
}
|
|
16
|
+
async waitForApp(selector = '[data-testid="app-section"]') {
|
|
17
|
+
await this.waitForSelector(selector);
|
|
18
|
+
}
|
|
19
|
+
async getCurrentUrl() {
|
|
20
|
+
return this.adapter.getCurrentUrl();
|
|
21
|
+
}
|
|
22
|
+
async clearAndRestart(origin) {
|
|
23
|
+
await this.clearSession(origin);
|
|
24
|
+
await this.navigateToApp();
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.BrowserContextPage = BrowserContextPage;
|
|
28
|
+
//# sourceMappingURL=browser-context.page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-context.page.js","sourceRoot":"","sources":["../../../src/page-objects/browser-context.page.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,iDAA0C;AAG1C,MAAa,kBAAmB,SAAQ,uBAAQ;IAC9C,YAAY,OAAuB;QACjC,KAAK,CAAC,OAAO,CAAC,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,IAAI,GAAG,GAAG;QAC5B,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,QAAQ,GAAG,6BAA6B;QACvD,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,MAAe;QACnC,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAChC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;CACF;AArBD,gDAqBC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lifecycle hook runner.
|
|
3
|
+
*
|
|
4
|
+
* Loads and executes hook files at specific points in the test lifecycle:
|
|
5
|
+
* - globalSetup: once before all journeys (abort run if fails)
|
|
6
|
+
* - beforeEach: before each journey
|
|
7
|
+
* - afterEach: after each journey (runs even if journey failed)
|
|
8
|
+
* - globalTeardown: once after all journeys
|
|
9
|
+
*
|
|
10
|
+
* Hook files export an async function (default export or named `run`).
|
|
11
|
+
* The function receives a context object with the target URL and
|
|
12
|
+
* any relevant metadata.
|
|
13
|
+
*/
|
|
14
|
+
export interface HookContext {
|
|
15
|
+
/** Target URL of the app under test. */
|
|
16
|
+
targetUrl: string;
|
|
17
|
+
/** Name of the current journey (for beforeEach/afterEach). */
|
|
18
|
+
journeyName?: string;
|
|
19
|
+
/** Path of the current journey file (for beforeEach/afterEach). */
|
|
20
|
+
journeyPath?: string;
|
|
21
|
+
/** Whether the journey passed or failed (for afterEach only). */
|
|
22
|
+
journeyStatus?: 'passed' | 'failed';
|
|
23
|
+
}
|
|
24
|
+
export interface LifecycleHooks {
|
|
25
|
+
globalSetup?: string;
|
|
26
|
+
beforeEach?: string;
|
|
27
|
+
afterEach?: string;
|
|
28
|
+
globalTeardown?: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Execute a single lifecycle hook file.
|
|
32
|
+
* Returns true if successful, false if it failed (with error logged).
|
|
33
|
+
*/
|
|
34
|
+
export declare function executeHook(hookPath: string | undefined, context: HookContext): Promise<boolean>;
|
|
35
|
+
/**
|
|
36
|
+
* Execute the full lifecycle around a set of journeys.
|
|
37
|
+
* Returns false if globalSetup fails (should abort the run).
|
|
38
|
+
*/
|
|
39
|
+
export declare function runGlobalSetup(hooks: LifecycleHooks, context: HookContext): Promise<boolean>;
|
|
40
|
+
export declare function runBeforeEach(hooks: LifecycleHooks, context: HookContext): Promise<boolean>;
|
|
41
|
+
export declare function runAfterEach(hooks: LifecycleHooks, context: HookContext): Promise<boolean>;
|
|
42
|
+
export declare function runGlobalTeardown(hooks: LifecycleHooks, context: HookContext): Promise<boolean>;
|
|
43
|
+
//# sourceMappingURL=lifecycle-hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle-hooks.d.ts","sourceRoot":"","sources":["../../../src/runner/lifecycle-hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,MAAM,WAAW,WAAW;IAC1B,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,8DAA8D;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mEAAmE;IACnE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,aAAa,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;CACrC;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAQD;;;GAGG;AACH,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAwBtG;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAElG;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAEjG;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAEhG;AAED,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAErG"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Lifecycle hook runner.
|
|
4
|
+
*
|
|
5
|
+
* Loads and executes hook files at specific points in the test lifecycle:
|
|
6
|
+
* - globalSetup: once before all journeys (abort run if fails)
|
|
7
|
+
* - beforeEach: before each journey
|
|
8
|
+
* - afterEach: after each journey (runs even if journey failed)
|
|
9
|
+
* - globalTeardown: once after all journeys
|
|
10
|
+
*
|
|
11
|
+
* Hook files export an async function (default export or named `run`).
|
|
12
|
+
* The function receives a context object with the target URL and
|
|
13
|
+
* any relevant metadata.
|
|
14
|
+
*/
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.executeHook = executeHook;
|
|
17
|
+
exports.runGlobalSetup = runGlobalSetup;
|
|
18
|
+
exports.runBeforeEach = runBeforeEach;
|
|
19
|
+
exports.runAfterEach = runAfterEach;
|
|
20
|
+
exports.runGlobalTeardown = runGlobalTeardown;
|
|
21
|
+
const fs_1 = require("fs");
|
|
22
|
+
/**
|
|
23
|
+
* Execute a single lifecycle hook file.
|
|
24
|
+
* Returns true if successful, false if it failed (with error logged).
|
|
25
|
+
*/
|
|
26
|
+
async function executeHook(hookPath, context) {
|
|
27
|
+
if (!hookPath)
|
|
28
|
+
return true;
|
|
29
|
+
if (!(0, fs_1.existsSync)(hookPath)) {
|
|
30
|
+
console.error(`Hook file not found: ${hookPath}`);
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
const module = await import(hookPath);
|
|
35
|
+
const hookFn = module.default ?? module.run ?? findHookFunction(module);
|
|
36
|
+
if (!hookFn) {
|
|
37
|
+
console.error(`Hook file has no default export or run function: ${hookPath}`);
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
await hookFn(context);
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
45
|
+
console.error(`Hook failed (${hookPath}): ${message}`);
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Execute the full lifecycle around a set of journeys.
|
|
51
|
+
* Returns false if globalSetup fails (should abort the run).
|
|
52
|
+
*/
|
|
53
|
+
async function runGlobalSetup(hooks, context) {
|
|
54
|
+
return executeHook(hooks.globalSetup, context);
|
|
55
|
+
}
|
|
56
|
+
async function runBeforeEach(hooks, context) {
|
|
57
|
+
return executeHook(hooks.beforeEach, context);
|
|
58
|
+
}
|
|
59
|
+
async function runAfterEach(hooks, context) {
|
|
60
|
+
return executeHook(hooks.afterEach, context);
|
|
61
|
+
}
|
|
62
|
+
async function runGlobalTeardown(hooks, context) {
|
|
63
|
+
return executeHook(hooks.globalTeardown, context);
|
|
64
|
+
}
|
|
65
|
+
/** Find the first exported async function in a hook module. */
|
|
66
|
+
function findHookFunction(module) {
|
|
67
|
+
const candidates = Object.values(module).filter((v) => typeof v === 'function');
|
|
68
|
+
return candidates[0];
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=lifecycle-hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle-hooks.js","sourceRoot":"","sources":["../../../src/runner/lifecycle-hooks.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;AAgCH,kCAwBC;AAMD,wCAEC;AAED,sCAEC;AAED,oCAEC;AAED,8CAEC;AA1ED,2BAAgC;AA0BhC;;;GAGG;AACI,KAAK,UAAU,WAAW,CAAC,QAA4B,EAAE,OAAoB;IAClF,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3B,IAAI,CAAC,IAAA,eAAU,EAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,KAAK,CAAC,wBAAwB,QAAQ,EAAE,CAAC,CAAC;QAClD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAe,CAAC;QACpD,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAExE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,oDAAoD,QAAQ,EAAE,CAAC,CAAC;YAC9E,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,KAAK,CAAC,gBAAgB,QAAQ,MAAM,OAAO,EAAE,CAAC,CAAC;QACvD,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,cAAc,CAAC,KAAqB,EAAE,OAAoB;IAC9E,OAAO,WAAW,CAAC,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;AACjD,CAAC;AAEM,KAAK,UAAU,aAAa,CAAC,KAAqB,EAAE,OAAoB;IAC7E,OAAO,WAAW,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AAChD,CAAC;AAEM,KAAK,UAAU,YAAY,CAAC,KAAqB,EAAE,OAAoB;IAC5E,OAAO,WAAW,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AAC/C,CAAC;AAEM,KAAK,UAAU,iBAAiB,CAAC,KAAqB,EAAE,OAAoB;IACjF,OAAO,WAAW,CAAC,KAAK,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;AACpD,CAAC;AAED,+DAA+D;AAC/D,SAAS,gBAAgB,CAAC,MAAkB;IAC1C,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAgD,EAAE,CAAC,OAAO,CAAC,KAAK,UAAU,CAAC,CAAC;IAC9H,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Batch runner — headless CLI execution of journeys.
|
|
3
|
+
*
|
|
4
|
+
* Discovers journeys from the configured glob, launches a browser,
|
|
5
|
+
* runs each journey sequentially in an isolated browser context,
|
|
6
|
+
* prints results, and exits with code 0 (all pass) or 1 (any fail).
|
|
7
|
+
*
|
|
8
|
+
* Used by `glassbox run` CLI command.
|
|
9
|
+
*/
|
|
10
|
+
import type { GlassboxConfig } from '../config.js';
|
|
11
|
+
export interface RunResult {
|
|
12
|
+
journey: string;
|
|
13
|
+
name: string;
|
|
14
|
+
status: 'passed' | 'failed' | 'skipped';
|
|
15
|
+
duration: string;
|
|
16
|
+
error?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface BatchRunOptions {
|
|
19
|
+
/** Specific journey names/IDs to run (empty = run all). */
|
|
20
|
+
journeyFilter: string[];
|
|
21
|
+
/** Run in headed mode (visible browser). */
|
|
22
|
+
headed: boolean;
|
|
23
|
+
/** Target URL of the app under test. */
|
|
24
|
+
targetUrl: string;
|
|
25
|
+
/** Continue running remaining journeys after a failure (default: false = stop on first failure). */
|
|
26
|
+
noFailFast: boolean;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Run journeys in batch mode. Returns results and an exit code.
|
|
30
|
+
*/
|
|
31
|
+
export declare function runAllJourneys(config: GlassboxConfig, options: BatchRunOptions): Promise<{
|
|
32
|
+
results: RunResult[];
|
|
33
|
+
exitCode: number;
|
|
34
|
+
}>;
|
|
35
|
+
//# sourceMappingURL=run-all-journeys.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-all-journeys.d.ts","sourceRoot":"","sources":["../../../src/runner/run-all-journeys.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,2DAA2D;IAC3D,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,4CAA4C;IAC5C,MAAM,EAAE,OAAO,CAAC;IAChB,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,oGAAoG;IACpG,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC;IAAE,OAAO,EAAE,SAAS,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAqGrD"}
|