pw-automation-framework 2.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/README.md +93 -0
- package/bin/lexxit-automation-framework.js +427 -0
- package/dist/app.d.ts +2 -0
- package/dist/app.js +26 -0
- package/dist/app.js.map +1 -0
- package/dist/controllers/controller.d.ts +57 -0
- package/dist/controllers/controller.js +263 -0
- package/dist/controllers/controller.js.map +1 -0
- package/dist/core/BrowserManager.d.ts +46 -0
- package/dist/core/BrowserManager.js +377 -0
- package/dist/core/BrowserManager.js.map +1 -0
- package/dist/core/PlaywrightEngine.d.ts +16 -0
- package/dist/core/PlaywrightEngine.js +246 -0
- package/dist/core/PlaywrightEngine.js.map +1 -0
- package/dist/core/ScreenshotManager.d.ts +10 -0
- package/dist/core/ScreenshotManager.js +28 -0
- package/dist/core/ScreenshotManager.js.map +1 -0
- package/dist/core/TestData.d.ts +12 -0
- package/dist/core/TestData.js +29 -0
- package/dist/core/TestData.js.map +1 -0
- package/dist/core/TestExecutor.d.ts +16 -0
- package/dist/core/TestExecutor.js +355 -0
- package/dist/core/TestExecutor.js.map +1 -0
- package/dist/core/handlers/AllHandlers.d.ts +116 -0
- package/dist/core/handlers/AllHandlers.js +648 -0
- package/dist/core/handlers/AllHandlers.js.map +1 -0
- package/dist/core/handlers/BaseHandler.d.ts +16 -0
- package/dist/core/handlers/BaseHandler.js +27 -0
- package/dist/core/handlers/BaseHandler.js.map +1 -0
- package/dist/core/handlers/ClickHandler.d.ts +34 -0
- package/dist/core/handlers/ClickHandler.js +359 -0
- package/dist/core/handlers/ClickHandler.js.map +1 -0
- package/dist/core/handlers/CustomCodeHandler.d.ts +35 -0
- package/dist/core/handlers/CustomCodeHandler.js +102 -0
- package/dist/core/handlers/CustomCodeHandler.js.map +1 -0
- package/dist/core/handlers/DropdownHandler.d.ts +43 -0
- package/dist/core/handlers/DropdownHandler.js +304 -0
- package/dist/core/handlers/DropdownHandler.js.map +1 -0
- package/dist/core/handlers/InputHandler.d.ts +24 -0
- package/dist/core/handlers/InputHandler.js +197 -0
- package/dist/core/handlers/InputHandler.js.map +1 -0
- package/dist/core/registry/ActionRegistry.d.ts +8 -0
- package/dist/core/registry/ActionRegistry.js +35 -0
- package/dist/core/registry/ActionRegistry.js.map +1 -0
- package/dist/installer/frameworkLauncher.d.ts +31 -0
- package/dist/installer/frameworkLauncher.js +198 -0
- package/dist/installer/frameworkLauncher.js.map +1 -0
- package/dist/queue/ExecutionQueue.d.ts +52 -0
- package/dist/queue/ExecutionQueue.js +175 -0
- package/dist/queue/ExecutionQueue.js.map +1 -0
- package/dist/routes/api.routes.d.ts +2 -0
- package/dist/routes/api.routes.js +16 -0
- package/dist/routes/api.routes.js.map +1 -0
- package/dist/server.d.ts +1 -0
- package/dist/server.js +30 -0
- package/dist/server.js.map +1 -0
- package/dist/types/types.d.ts +135 -0
- package/dist/types/types.js +4 -0
- package/dist/types/types.js.map +1 -0
- package/dist/utils/elementHighlight.d.ts +35 -0
- package/dist/utils/elementHighlight.js +136 -0
- package/dist/utils/elementHighlight.js.map +1 -0
- package/dist/utils/locatorHelper.d.ts +7 -0
- package/dist/utils/locatorHelper.js +53 -0
- package/dist/utils/locatorHelper.js.map +1 -0
- package/dist/utils/logger.d.ts +12 -0
- package/dist/utils/logger.js +35 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/response.d.ts +4 -0
- package/dist/utils/response.js +25 -0
- package/dist/utils/response.js.map +1 -0
- package/dist/utils/responseFormatter.d.ts +78 -0
- package/dist/utils/responseFormatter.js +123 -0
- package/dist/utils/responseFormatter.js.map +1 -0
- package/dist/utils/sseManager.d.ts +32 -0
- package/dist/utils/sseManager.js +122 -0
- package/dist/utils/sseManager.js.map +1 -0
- package/lexxit-automation-framework-2.0.0.tgz +0 -0
- package/npmignore +5 -0
- package/package.json +36 -0
- package/scripts/postinstall.js +52 -0
- package/src/app.ts +27 -0
- package/src/controllers/controller.ts +282 -0
- package/src/core/BrowserManager.ts +398 -0
- package/src/core/PlaywrightEngine.ts +371 -0
- package/src/core/ScreenshotManager.ts +25 -0
- package/src/core/TestData.ts +25 -0
- package/src/core/TestExecutor.ts +436 -0
- package/src/core/handlers/AllHandlers.ts +626 -0
- package/src/core/handlers/BaseHandler.ts +41 -0
- package/src/core/handlers/ClickHandler.ts +482 -0
- package/src/core/handlers/CustomCodeHandler.ts +123 -0
- package/src/core/handlers/DropdownHandler.ts +438 -0
- package/src/core/handlers/InputHandler.ts +192 -0
- package/src/core/registry/ActionRegistry.ts +31 -0
- package/src/installer/frameworkLauncher.ts +242 -0
- package/src/installer/install.sh +107 -0
- package/src/public/dashboard.html +540 -0
- package/src/public/queue-monitor.html +190 -0
- package/src/queue/ExecutionQueue.ts +200 -0
- package/src/routes/api.routes.ts +16 -0
- package/src/server.ts +29 -0
- package/src/types/types.ts +169 -0
- package/src/utils/elementHighlight.ts +174 -0
- package/src/utils/locatorHelper.ts +49 -0
- package/src/utils/logger.ts +40 -0
- package/src/utils/response.ts +27 -0
- package/src/utils/responseFormatter.ts +167 -0
- package/src/utils/sseManager.ts +127 -0
- package/tsconfig.json +18 -0
- package/videos/fb1b94b6-6639-4c9a-82bb-63572606f403/page@5bd5c6c8b62baa700e9810cdd64f5c49.webm +0 -0
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.InputHandler = void 0;
|
|
4
|
+
const response_1 = require("../../utils/response");
|
|
5
|
+
const locatorHelper_1 = require("../../utils/locatorHelper");
|
|
6
|
+
const BaseHandler_1 = require("./BaseHandler");
|
|
7
|
+
const response_2 = require("../../utils/response");
|
|
8
|
+
class InputHandler extends BaseHandler_1.BaseHandler {
|
|
9
|
+
constructor(tConfig, page) { super(tConfig, page); }
|
|
10
|
+
getActions() {
|
|
11
|
+
return {
|
|
12
|
+
entertext: this.enterText.bind(this),
|
|
13
|
+
typetext: this.typeText.bind(this),
|
|
14
|
+
cleartext: this.clearText.bind(this),
|
|
15
|
+
appendtext: this.appendText.bind(this),
|
|
16
|
+
getinputvalue: this.getInputValue.bind(this),
|
|
17
|
+
setinputvalue: this.setInputValueByJS.bind(this),
|
|
18
|
+
uploadfile: this.uploadFile.bind(this),
|
|
19
|
+
enteriframe: this.enterTextInFrame.bind(this),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
// tSetup.enterText('xpath', '//input[...]', 'hello@mail.com')
|
|
23
|
+
async enterText(args, label) {
|
|
24
|
+
const [strategy, locator, rawText] = args;
|
|
25
|
+
const text = String(this.testData.resolve(rawText) ?? rawText ?? "");
|
|
26
|
+
const displayLabel = label || 'unknown';
|
|
27
|
+
if (!strategy || !locator)
|
|
28
|
+
return (0, response_1.fail)("enterText needs: strategy, locator, text", "Missing args");
|
|
29
|
+
const ls = (0, locatorHelper_1.buildLocatorString)(strategy, locator);
|
|
30
|
+
try {
|
|
31
|
+
const el = this.page.locator((0, locatorHelper_1.buildLocatorString)(strategy, locator));
|
|
32
|
+
await el.waitFor({ state: "visible", timeout: this.timeout });
|
|
33
|
+
// ✅ Highlight field before entering text
|
|
34
|
+
await this.highlight(ls, "input", `Entering: "${text}"`);
|
|
35
|
+
await el.clear();
|
|
36
|
+
await el.fill(text);
|
|
37
|
+
await this.unhighlight();
|
|
38
|
+
const sc = await this.shots.onPass(this.page);
|
|
39
|
+
return (0, response_1.pass)(`Entered "${text}" into ${displayLabel}`, sc, { expected_result: `"${text}" entered successfully in "${displayLabel}"` });
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
await this.unhighlight();
|
|
43
|
+
const sc = await this.shots.onFail(this.page);
|
|
44
|
+
// const isNotFound = /timeout|waiting for locator|not visible|not found/i.test(error.message);
|
|
45
|
+
// const errorMsg = isNotFound
|
|
46
|
+
// ? `"${displayLabel}" not found`
|
|
47
|
+
// : `Failed enterText into ${displayLabel} — ${error.message}`;
|
|
48
|
+
// return fail(errorMsg, undefined, sc, { expected_result: `"${text}" entered successfully in "${displayLabel}"` });
|
|
49
|
+
// }
|
|
50
|
+
const msg = error.message.toLowerCase();
|
|
51
|
+
if (msg.includes("waiting for locator") || msg.includes("timeout") || msg.includes("no element")) {
|
|
52
|
+
return (0, response_2.failElementNotFound)(displayLabel, sc);
|
|
53
|
+
}
|
|
54
|
+
return (0, response_1.fail)(`Failed enterText into ${displayLabel} — ${error.message}`, undefined, sc, { expected_result: `"${text}" entered successfully in "${displayLabel}"` });
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// tSetup.typeText('xpath', '//input[...]', 'hello') — real char-by-char typing
|
|
58
|
+
async typeText(args, label) {
|
|
59
|
+
const [strategy, locator, rawText, delayStr] = args;
|
|
60
|
+
const text = String(this.testData.resolve(rawText) ?? rawText ?? "");
|
|
61
|
+
const delay = parseInt(delayStr || "50", 10);
|
|
62
|
+
if (!strategy || !locator)
|
|
63
|
+
return (0, response_1.fail)("typeText needs: strategy, locator, text, [delay]", "Missing args");
|
|
64
|
+
try {
|
|
65
|
+
const el = this.page.locator((0, locatorHelper_1.buildLocatorString)(strategy, locator));
|
|
66
|
+
await el.waitFor({ state: "visible", timeout: this.timeout });
|
|
67
|
+
await el.pressSequentially(text, { delay });
|
|
68
|
+
const sc = await this.shots.onPass(this.page);
|
|
69
|
+
return (0, response_1.pass)(`Typed "${text}" into ${label || 'unknown'}`, sc);
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
const sc = await this.shots.onFail(this.page);
|
|
73
|
+
return (0, response_1.fail)(`Failed typeText into ${label || 'unknown'}`, error.message, sc);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// tSetup.clearText('xpath', '//input[...]')
|
|
77
|
+
async clearText(args, label) {
|
|
78
|
+
const [strategy, locator] = args;
|
|
79
|
+
if (!strategy || !locator)
|
|
80
|
+
return (0, response_1.fail)("clearText needs: strategy, locator", "Missing args");
|
|
81
|
+
try {
|
|
82
|
+
const el = this.page.locator((0, locatorHelper_1.buildLocatorString)(strategy, locator));
|
|
83
|
+
await el.waitFor({ state: "visible", timeout: this.timeout });
|
|
84
|
+
await el.clear();
|
|
85
|
+
const sc = await this.shots.onPass(this.page);
|
|
86
|
+
return (0, response_1.pass)(`Cleared ${label || 'unknown'}`, sc);
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
const sc = await this.shots.onFail(this.page);
|
|
90
|
+
return (0, response_1.fail)(`Failed clearText ${label || 'unknown'}`, error.message, sc);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// tSetup.appendText('xpath', '//input[...]', ' extra')
|
|
94
|
+
async appendText(args, label) {
|
|
95
|
+
const [strategy, locator, rawText] = args;
|
|
96
|
+
const text = String(this.testData.resolve(rawText) ?? rawText ?? "");
|
|
97
|
+
if (!strategy || !locator)
|
|
98
|
+
return (0, response_1.fail)("appendText needs: strategy, locator, text", "Missing args");
|
|
99
|
+
try {
|
|
100
|
+
const el = this.page.locator((0, locatorHelper_1.buildLocatorString)(strategy, locator));
|
|
101
|
+
await el.waitFor({ state: "visible", timeout: this.timeout });
|
|
102
|
+
await el.focus();
|
|
103
|
+
await this.page.keyboard.press("End");
|
|
104
|
+
await el.pressSequentially(text, { delay: 30 });
|
|
105
|
+
const sc = await this.shots.onPass(this.page);
|
|
106
|
+
return (0, response_1.pass)(`Appended "${text}" to ${label || 'unknown'}`, sc);
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
const sc = await this.shots.onFail(this.page);
|
|
110
|
+
return (0, response_1.fail)(`Failed appendText into ${label || 'unknown'}]`, error.message, sc);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// tSetup.getInputValue('xpath', '//input[...]', 'storeKey')
|
|
114
|
+
async getInputValue(args, label) {
|
|
115
|
+
const [strategy, locator, storeKey] = args;
|
|
116
|
+
if (!strategy || !locator)
|
|
117
|
+
return (0, response_1.fail)("getInputValue needs: strategy, locator, [storeKey]", "Missing args");
|
|
118
|
+
try {
|
|
119
|
+
const el = this.page.locator((0, locatorHelper_1.buildLocatorString)(strategy, locator));
|
|
120
|
+
await el.waitFor({ state: "attached", timeout: this.timeout });
|
|
121
|
+
const value = await el.inputValue();
|
|
122
|
+
if (storeKey)
|
|
123
|
+
this.testData.set(storeKey, value);
|
|
124
|
+
const sc = await this.shots.onPass(this.page);
|
|
125
|
+
return (0, response_1.pass)(`Input value: "${value}"`, sc, { value });
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
const sc = await this.shots.onFail(this.page);
|
|
129
|
+
return (0, response_1.fail)(`Failed getInputValue ${label || 'unknown'}`, error.message, sc);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// tSetup.setInputValue('xpath', '//input[...]', 'value') — JS set (bypasses React controlled input)
|
|
133
|
+
async setInputValueByJS(args, label) {
|
|
134
|
+
const [strategy, locator, rawText] = args;
|
|
135
|
+
const value = String(this.testData.resolve(rawText) ?? rawText ?? "");
|
|
136
|
+
const text = String(this.testData.resolve(rawText) ?? rawText ?? "");
|
|
137
|
+
if (!strategy || !locator)
|
|
138
|
+
return (0, response_1.fail)("setInputValue needs: strategy, locator, text", "Missing args");
|
|
139
|
+
const ls = (0, locatorHelper_1.buildLocatorString)(strategy, locator);
|
|
140
|
+
try {
|
|
141
|
+
const el = this.page.locator((0, locatorHelper_1.buildLocatorString)(strategy, locator));
|
|
142
|
+
await el.waitFor({ state: "visible", timeout: this.timeout });
|
|
143
|
+
await this.highlight(ls, "input", `Set: "${value}"`);
|
|
144
|
+
await el.evaluate((node, val) => {
|
|
145
|
+
const setter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, "value")?.set;
|
|
146
|
+
setter?.call(node, val);
|
|
147
|
+
node.dispatchEvent(new Event("input", { bubbles: true }));
|
|
148
|
+
node.dispatchEvent(new Event("change", { bubbles: true }));
|
|
149
|
+
}, text);
|
|
150
|
+
await this.unhighlight();
|
|
151
|
+
const sc = await this.shots.onPass(this.page);
|
|
152
|
+
return (0, response_1.pass)(`Set input value "${text}" via JS ${label || 'unknown'}`, sc);
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
await this.unhighlight();
|
|
156
|
+
const sc = await this.shots.onFail(this.page);
|
|
157
|
+
return (0, response_1.fail)(`Failed setInputValue ${label || 'unknown'}`, error.message, sc);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
// tSetup.uploadFile('xpath', '//input[@type="file"]', '/path/to/file.pdf')
|
|
161
|
+
async uploadFile(args, label) {
|
|
162
|
+
const [strategy, locator, filePath] = args;
|
|
163
|
+
if (!strategy || !locator || !filePath)
|
|
164
|
+
return (0, response_1.fail)("uploadFile needs: strategy, locator, filePath", "Missing args");
|
|
165
|
+
try {
|
|
166
|
+
const el = this.page.locator((0, locatorHelper_1.buildLocatorString)(strategy, locator));
|
|
167
|
+
await el.setInputFiles(filePath);
|
|
168
|
+
const sc = await this.shots.onPass(this.page);
|
|
169
|
+
return (0, response_1.pass)(`Uploaded file: "${filePath}"`, sc);
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
const sc = await this.shots.onFail(this.page);
|
|
173
|
+
return (0, response_1.fail)(`Failed uploadFile ${label || 'unknown'}`, error.message, sc);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
// tSetup.enterIframe('iframe[name="myFrame"]', 'xpath', '//input[...]', 'value')
|
|
177
|
+
async enterTextInFrame(args, label) {
|
|
178
|
+
const [frameSelector, strategy, locator, rawText] = args;
|
|
179
|
+
const text = String(this.testData.resolve(rawText) ?? rawText ?? "");
|
|
180
|
+
if (!frameSelector || !strategy || !locator)
|
|
181
|
+
return (0, response_1.fail)("enterIframe needs: frameSelector, strategy, locator, text", "Missing args");
|
|
182
|
+
try {
|
|
183
|
+
const frame = this.page.frameLocator(frameSelector);
|
|
184
|
+
const el = frame.locator((0, locatorHelper_1.buildLocatorString)(strategy, locator));
|
|
185
|
+
await el.waitFor({ state: "visible", timeout: this.timeout });
|
|
186
|
+
await el.fill(text);
|
|
187
|
+
const sc = await this.shots.onPass(this.page);
|
|
188
|
+
return (0, response_1.pass)(`Entered "${text}" in frame [${frameSelector}] → [${label || 'unknown'}]`, sc);
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
const sc = await this.shots.onFail(this.page);
|
|
192
|
+
return (0, response_1.fail)(`Failed enterIframe ${label || 'unknown'}`, error.message, sc);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
exports.InputHandler = InputHandler;
|
|
197
|
+
//# sourceMappingURL=InputHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InputHandler.js","sourceRoot":"","sources":["../../../src/core/handlers/InputHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ActionResponse, IActionHandler } from "../../types/types";
|
|
2
|
+
export declare class ActionRegistry {
|
|
3
|
+
private handlers;
|
|
4
|
+
register(handler: IActionHandler): void;
|
|
5
|
+
execute(action: string, args: string[], label?: string): Promise<ActionResponse | undefined>;
|
|
6
|
+
has(action: string): boolean;
|
|
7
|
+
listActions(): string[];
|
|
8
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ActionRegistry = void 0;
|
|
4
|
+
const logger_1 = require("../../utils/logger");
|
|
5
|
+
const log = logger_1.Logger.create("ActionRegistry");
|
|
6
|
+
class ActionRegistry {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.handlers = new Map();
|
|
9
|
+
}
|
|
10
|
+
register(handler) {
|
|
11
|
+
for (const [name, fn] of Object.entries(handler.getActions())) {
|
|
12
|
+
const key = name.toLowerCase();
|
|
13
|
+
if (this.handlers.has(key))
|
|
14
|
+
log.warn(`Action "${key}" overwritten`);
|
|
15
|
+
this.handlers.set(key, fn);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
async execute(action, args, label) {
|
|
19
|
+
const handler = this.handlers.get(action.toLowerCase());
|
|
20
|
+
if (!handler) {
|
|
21
|
+
log.error(`Unknown action: "${action}"`);
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
if (label == '' || label == undefined) {
|
|
25
|
+
return handler(args);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
return handler(args, label);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
has(action) { return this.handlers.has(action.toLowerCase()); }
|
|
32
|
+
listActions() { return Array.from(this.handlers.keys()).sort(); }
|
|
33
|
+
}
|
|
34
|
+
exports.ActionRegistry = ActionRegistry;
|
|
35
|
+
//# sourceMappingURL=ActionRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ActionRegistry.js","sourceRoot":"","sources":["../../../src/core/registry/ActionRegistry.ts"],"names":[],"mappings":";;;AACA,+CAA4C;AAE5C,MAAM,GAAG,GAAG,eAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAE5C,MAAa,cAAc;IAA3B;QACU,aAAQ,GAAyF,IAAI,GAAG,EAAE,CAAC;IAwBrH,CAAC;IAtBC,QAAQ,CAAC,OAAuB;QAC9B,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC;YAC9D,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAC/B,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,eAAe,CAAC,CAAC;YACpE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAc,EAAE,IAAc,EAAE,KAAc;QAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QACxD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,GAAG,CAAC,KAAK,CAAC,oBAAoB,MAAM,GAAG,CAAC,CAAC;YACzC,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,KAAK,IAAG,EAAE,IAAI,KAAK,IAAI,SAAS,EAAC,CAAC;YACpC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;QAAA,CAAC;aACpB,CAAC;YACH,OAAO,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAAA,CAAC;IACjC,CAAC;IAED,GAAG,CAAC,MAAc,IAAa,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;IAChF,WAAW,KAAe,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;CAC5E;AAzBD,wCAyBC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* frameworkLauncher.ts
|
|
3
|
+
* ====================
|
|
4
|
+
* Called by your MAIN APP's backend to ensure the framework is running.
|
|
5
|
+
* Handles: health check → install if missing → start → return URL.
|
|
6
|
+
*
|
|
7
|
+
* Usage in your main app's API route:
|
|
8
|
+
* import { ensureFramework, submitExecution } from './frameworkLauncher';
|
|
9
|
+
* const url = await ensureFramework();
|
|
10
|
+
* const run = await submitExecution(payload);
|
|
11
|
+
*/
|
|
12
|
+
export declare function isFrameworkRunning(): Promise<boolean>;
|
|
13
|
+
export declare function getFrameworkVersion(): Promise<string | null>;
|
|
14
|
+
export declare function installFramework(onLog?: (msg: string) => void): Promise<void>;
|
|
15
|
+
export declare function startFramework(onLog?: (msg: string) => void): Promise<void>;
|
|
16
|
+
export interface EnsureResult {
|
|
17
|
+
baseUrl: string;
|
|
18
|
+
installed: boolean;
|
|
19
|
+
started: boolean;
|
|
20
|
+
version: string;
|
|
21
|
+
}
|
|
22
|
+
export declare function ensureFramework(onLog?: (msg: string) => void): Promise<EnsureResult>;
|
|
23
|
+
export declare function submitExecution(payload: any, onLog?: (msg: string) => void): Promise<{
|
|
24
|
+
executionId: string;
|
|
25
|
+
dashboardURL: string;
|
|
26
|
+
status: string;
|
|
27
|
+
}>;
|
|
28
|
+
export declare function cancelExecution(executionId: string): Promise<{
|
|
29
|
+
success: boolean;
|
|
30
|
+
message: string;
|
|
31
|
+
}>;
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* frameworkLauncher.ts
|
|
4
|
+
* ====================
|
|
5
|
+
* Called by your MAIN APP's backend to ensure the framework is running.
|
|
6
|
+
* Handles: health check → install if missing → start → return URL.
|
|
7
|
+
*
|
|
8
|
+
* Usage in your main app's API route:
|
|
9
|
+
* import { ensureFramework, submitExecution } from './frameworkLauncher';
|
|
10
|
+
* const url = await ensureFramework();
|
|
11
|
+
* const run = await submitExecution(payload);
|
|
12
|
+
*/
|
|
13
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.isFrameworkRunning = isFrameworkRunning;
|
|
18
|
+
exports.getFrameworkVersion = getFrameworkVersion;
|
|
19
|
+
exports.installFramework = installFramework;
|
|
20
|
+
exports.startFramework = startFramework;
|
|
21
|
+
exports.ensureFramework = ensureFramework;
|
|
22
|
+
exports.submitExecution = submitExecution;
|
|
23
|
+
exports.cancelExecution = cancelExecution;
|
|
24
|
+
const child_process_1 = require("child_process");
|
|
25
|
+
const util_1 = require("util");
|
|
26
|
+
const path_1 = __importDefault(require("path"));
|
|
27
|
+
const http_1 = __importDefault(require("http"));
|
|
28
|
+
const fs_1 = __importDefault(require("fs"));
|
|
29
|
+
const execFileAsync = (0, util_1.promisify)(child_process_1.execFile);
|
|
30
|
+
const execAsync = (0, util_1.promisify)(child_process_1.exec);
|
|
31
|
+
const FRAMEWORK_PORT = parseInt(process.env.FRAMEWORK_PORT || "3000", 10);
|
|
32
|
+
const FRAMEWORK_BASE = `http://localhost:${FRAMEWORK_PORT}`;
|
|
33
|
+
const INSTALL_DIR = path_1.default.join(process.env.HOME || process.env.USERPROFILE || "/tmp", ".pw-automation-framework");
|
|
34
|
+
const PID_FILE = path_1.default.join(INSTALL_DIR, ".pid");
|
|
35
|
+
const LOG_FILE = path_1.default.join(INSTALL_DIR, "server.log");
|
|
36
|
+
const VERSION_FILE = path_1.default.join(INSTALL_DIR, "VERSION");
|
|
37
|
+
const CURRENT_VERSION = "2.0.0";
|
|
38
|
+
// ⬇️ Update this to your actual hosted bundle URL
|
|
39
|
+
const BUNDLE_BASE_URL = process.env.FRAMEWORK_BUNDLE_URL || "https://your-registry.example.com/releases";
|
|
40
|
+
// ─── Health check ─────────────────────────────────────────────────────────────
|
|
41
|
+
async function isFrameworkRunning() {
|
|
42
|
+
return new Promise((resolve) => {
|
|
43
|
+
const req = http_1.default.get(`${FRAMEWORK_BASE}/api/health`, { timeout: 800 }, (res) => resolve(res.statusCode === 200));
|
|
44
|
+
req.on("error", () => resolve(false));
|
|
45
|
+
req.on("timeout", () => { req.destroy(); resolve(false); });
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
async function getFrameworkVersion() {
|
|
49
|
+
try {
|
|
50
|
+
if (fs_1.default.existsSync(VERSION_FILE)) {
|
|
51
|
+
return fs_1.default.readFileSync(VERSION_FILE, "utf-8").trim();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch { /* ignore */ }
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
// ─── Download & install ───────────────────────────────────────────────────────
|
|
58
|
+
async function installFramework(onLog) {
|
|
59
|
+
const log = (msg) => { console.log(`[Installer] ${msg}`); onLog?.(msg); };
|
|
60
|
+
fs_1.default.mkdirSync(INSTALL_DIR, { recursive: true });
|
|
61
|
+
log(`Installing framework v${CURRENT_VERSION} to ${INSTALL_DIR}…`);
|
|
62
|
+
const bundleURL = `${BUNDLE_BASE_URL}/pw-framework-v${CURRENT_VERSION}.tar.gz`;
|
|
63
|
+
const bundleTmp = path_1.default.join(INSTALL_DIR, "bundle.tar.gz");
|
|
64
|
+
// Download bundle
|
|
65
|
+
log("Downloading framework bundle…");
|
|
66
|
+
await new Promise((resolve, reject) => {
|
|
67
|
+
const file = fs_1.default.createWriteStream(bundleTmp);
|
|
68
|
+
http_1.default.get(bundleURL.replace("https://", "http://"), (res) => {
|
|
69
|
+
res.pipe(file);
|
|
70
|
+
file.on("finish", () => { file.close(); resolve(); });
|
|
71
|
+
}).on("error", (err) => {
|
|
72
|
+
fs_1.default.unlink(bundleTmp, () => { });
|
|
73
|
+
reject(new Error(`Download failed: ${err.message}. \nManually download from: ${bundleURL}`));
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
log("Extracting…");
|
|
77
|
+
await execAsync(`tar -xzf "${bundleTmp}" -C "${INSTALL_DIR}" --strip-components=1`);
|
|
78
|
+
fs_1.default.unlinkSync(bundleTmp);
|
|
79
|
+
log("Installing dependencies (this may take a minute)…");
|
|
80
|
+
await execAsync(`npm install --omit=dev --silent`, { cwd: INSTALL_DIR });
|
|
81
|
+
log("Installing Playwright browsers…");
|
|
82
|
+
try {
|
|
83
|
+
await execAsync(`npx playwright install chromium --with-deps`, { cwd: INSTALL_DIR });
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
await execAsync(`npx playwright install chromium`, { cwd: INSTALL_DIR });
|
|
87
|
+
}
|
|
88
|
+
// Write version marker
|
|
89
|
+
fs_1.default.writeFileSync(VERSION_FILE, CURRENT_VERSION);
|
|
90
|
+
log(`Installation complete ✓`);
|
|
91
|
+
}
|
|
92
|
+
// ─── Start server ─────────────────────────────────────────────────────────────
|
|
93
|
+
async function startFramework(onLog) {
|
|
94
|
+
const log = (msg) => { console.log(`[Launcher] ${msg}`); onLog?.(msg); };
|
|
95
|
+
log(`Starting framework on port ${FRAMEWORK_PORT}…`);
|
|
96
|
+
const serverFile = path_1.default.join(INSTALL_DIR, "dist", "server.js");
|
|
97
|
+
if (!fs_1.default.existsSync(serverFile)) {
|
|
98
|
+
throw new Error(`server.js not found at ${serverFile}. Run installFramework() first.`);
|
|
99
|
+
}
|
|
100
|
+
// const child = execFile("node", [serverFile], {
|
|
101
|
+
// env: { ...process.env, PORT: String(FRAMEWORK_PORT) },
|
|
102
|
+
// cwd: INSTALL_DIR,
|
|
103
|
+
// detached: true,
|
|
104
|
+
// stdio: ["ignore", fs.openSync(LOG_FILE, "a"), fs.openSync(LOG_FILE, "a")],
|
|
105
|
+
// });
|
|
106
|
+
const child = (0, child_process_1.execFile)("node", [serverFile], {
|
|
107
|
+
env: { ...process.env, PORT: String(FRAMEWORK_PORT) },
|
|
108
|
+
cwd: INSTALL_DIR,
|
|
109
|
+
detached: true,
|
|
110
|
+
stdio: ["ignore", fs_1.default.openSync(LOG_FILE, "a"), fs_1.default.openSync(LOG_FILE, "a")]
|
|
111
|
+
} // 👈 THIS LINE FIXES YOUR ERROR
|
|
112
|
+
);
|
|
113
|
+
child.unref();
|
|
114
|
+
if (child.pid)
|
|
115
|
+
fs_1.default.writeFileSync(PID_FILE, String(child.pid));
|
|
116
|
+
// Wait for health (up to 15s)
|
|
117
|
+
for (let i = 0; i < 30; i++) {
|
|
118
|
+
await new Promise(r => setTimeout(r, 500));
|
|
119
|
+
if (await isFrameworkRunning()) {
|
|
120
|
+
log(`Framework ready at ${FRAMEWORK_BASE} ✓`);
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
throw new Error(`Framework did not start within 15s. Check ${LOG_FILE}`);
|
|
125
|
+
}
|
|
126
|
+
async function ensureFramework(onLog) {
|
|
127
|
+
const log = (msg) => { console.log(`[ensureFramework] ${msg}`); onLog?.(msg); };
|
|
128
|
+
// 1. Already running?
|
|
129
|
+
if (await isFrameworkRunning()) {
|
|
130
|
+
log("Framework already running ✓");
|
|
131
|
+
return { baseUrl: FRAMEWORK_BASE, installed: false, started: false, version: CURRENT_VERSION };
|
|
132
|
+
}
|
|
133
|
+
// 2. Installed but not running?
|
|
134
|
+
const installedVersion = await getFrameworkVersion();
|
|
135
|
+
let needsInstall = installedVersion !== CURRENT_VERSION;
|
|
136
|
+
if (needsInstall) {
|
|
137
|
+
log(installedVersion
|
|
138
|
+
? `Updating from v${installedVersion} → v${CURRENT_VERSION}…`
|
|
139
|
+
: "First install…");
|
|
140
|
+
await installFramework(onLog);
|
|
141
|
+
}
|
|
142
|
+
// 3. Start
|
|
143
|
+
await startFramework(onLog);
|
|
144
|
+
return {
|
|
145
|
+
baseUrl: FRAMEWORK_BASE,
|
|
146
|
+
installed: needsInstall,
|
|
147
|
+
started: true,
|
|
148
|
+
version: CURRENT_VERSION,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
// ─── Submit execution ─────────────────────────────────────────────────────────
|
|
152
|
+
async function submitExecution(payload, onLog) {
|
|
153
|
+
await ensureFramework(onLog);
|
|
154
|
+
const body = JSON.stringify(payload);
|
|
155
|
+
return new Promise((resolve, reject) => {
|
|
156
|
+
const req = http_1.default.request({
|
|
157
|
+
hostname: "localhost",
|
|
158
|
+
port: FRAMEWORK_PORT,
|
|
159
|
+
path: "/api/run-test",
|
|
160
|
+
method: "POST",
|
|
161
|
+
headers: { "Content-Type": "application/json", "Content-Length": Buffer.byteLength(body) },
|
|
162
|
+
}, (res) => {
|
|
163
|
+
let data = "";
|
|
164
|
+
res.on("data", c => data += c);
|
|
165
|
+
res.on("end", () => {
|
|
166
|
+
try {
|
|
167
|
+
resolve(JSON.parse(data));
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
reject(new Error(`Invalid response: ${data}`));
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
req.on("error", reject);
|
|
175
|
+
req.write(body);
|
|
176
|
+
req.end();
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
// ─── Cancel execution ─────────────────────────────────────────────────────────
|
|
180
|
+
async function cancelExecution(executionId) {
|
|
181
|
+
return new Promise((resolve, reject) => {
|
|
182
|
+
const req = http_1.default.request({ hostname: "localhost", port: FRAMEWORK_PORT, path: `/api/cancel/${executionId}`, method: "DELETE" }, (res) => {
|
|
183
|
+
let data = "";
|
|
184
|
+
res.on("data", c => data += c);
|
|
185
|
+
res.on("end", () => {
|
|
186
|
+
try {
|
|
187
|
+
resolve(JSON.parse(data));
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
reject(new Error(`Invalid response: ${data}`));
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
req.on("error", reject);
|
|
195
|
+
req.end();
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=frameworkLauncher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frameworkLauncher.js","sourceRoot":"","sources":["../../src/installer/frameworkLauncher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { QueueJob, RequestPayload, QueueStatus } from "../types/types";
|
|
2
|
+
export declare class ExecutionQueue {
|
|
3
|
+
private jobs;
|
|
4
|
+
private running;
|
|
5
|
+
private maxConcurrent;
|
|
6
|
+
constructor(maxConcurrent?: number);
|
|
7
|
+
enqueue(payload: RequestPayload): string;
|
|
8
|
+
cancel(executionId: string): {
|
|
9
|
+
success: boolean;
|
|
10
|
+
message: string;
|
|
11
|
+
};
|
|
12
|
+
cancelAll(): {
|
|
13
|
+
cancelled: number;
|
|
14
|
+
};
|
|
15
|
+
private processNext;
|
|
16
|
+
private runJob;
|
|
17
|
+
private finalize;
|
|
18
|
+
getJob(executionId: string): QueueJob | undefined;
|
|
19
|
+
isCancelRequested(executionId: string): boolean;
|
|
20
|
+
getAllJobs(): QueueJob[];
|
|
21
|
+
getQueueStats(): {
|
|
22
|
+
total: number;
|
|
23
|
+
queued: number;
|
|
24
|
+
running: number;
|
|
25
|
+
done: number;
|
|
26
|
+
failed: number;
|
|
27
|
+
cancelled: number;
|
|
28
|
+
maxConcurrent: number;
|
|
29
|
+
jobs: {
|
|
30
|
+
executionId: string;
|
|
31
|
+
status: QueueStatus;
|
|
32
|
+
queuedAt: string;
|
|
33
|
+
startedAt: string | undefined;
|
|
34
|
+
completedAt: string | undefined;
|
|
35
|
+
cancelledAt: string | undefined;
|
|
36
|
+
progress: {
|
|
37
|
+
total_scripts: number;
|
|
38
|
+
completed_scripts: number;
|
|
39
|
+
total_steps: number;
|
|
40
|
+
completed_steps: number;
|
|
41
|
+
passed_steps: number;
|
|
42
|
+
failed_steps: number;
|
|
43
|
+
skipped_steps: number;
|
|
44
|
+
};
|
|
45
|
+
error: string | undefined;
|
|
46
|
+
overall_status: "PASS" | "FAIL" | "CANCELLED" | undefined;
|
|
47
|
+
cancelRequested: boolean;
|
|
48
|
+
}[];
|
|
49
|
+
};
|
|
50
|
+
private broadcastQueueUpdate;
|
|
51
|
+
}
|
|
52
|
+
export declare const executionQueue: ExecutionQueue;
|