testeranto 0.94.0 → 0.100.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/bundle.js +4 -7
- package/dist/common/src/PM/main.js +160 -42
- package/dist/common/src/PM/node.js +20 -5
- package/dist/common/src/PM/web.js +19 -4
- package/dist/common/src/SubPackages/react/jsx/node.js +1 -6
- package/dist/common/src/cli.js +439 -0
- package/dist/common/src/cli2.js +144 -0
- package/dist/common/src/esbuildConfigs/inputFilesPlugin.js +18 -6
- package/dist/common/src/esbuildConfigs/node.js +1 -4
- package/dist/common/src/esbuildConfigs/web.js +1 -1
- package/dist/common/src/lib/abstractBase.js +14 -91
- package/dist/common/src/lib/types.js +1 -0
- package/dist/common/tsconfig.common.tsbuildinfo +1 -1
- package/dist/module/src/PM/main.js +160 -42
- package/dist/module/src/PM/node.js +20 -5
- package/dist/module/src/PM/web.js +19 -4
- package/dist/module/src/SubPackages/react/jsx/node.js +1 -6
- package/dist/module/src/cli.js +411 -0
- package/dist/module/src/cli2.js +116 -0
- package/dist/module/src/esbuildConfigs/inputFilesPlugin.js +18 -6
- package/dist/module/src/esbuildConfigs/node.js +1 -4
- package/dist/module/src/esbuildConfigs/web.js +1 -1
- package/dist/module/src/lib/abstractBase.js +14 -91
- package/dist/module/src/lib/types.js +1 -0
- package/dist/module/tsconfig.module.tsbuildinfo +1 -1
- package/dist/prebuild/cli.mjs +1491 -0
- package/dist/prebuild/{run-tests.mjs → cli2.mjs} +203 -156
- package/dist/types/src/Node.d.ts +2 -2
- package/dist/types/src/PM/index.d.ts +10 -2
- package/dist/types/src/PM/main.d.ts +13 -7
- package/dist/types/src/PM/node.d.ts +9 -2
- package/dist/types/src/PM/web.d.ts +9 -3
- package/dist/types/src/SubPackages/puppeteer.d.ts +1 -1
- package/dist/types/src/SubPackages/react/component/node.d.ts +1 -1
- package/dist/types/src/SubPackages/react/component/web.d.ts +1 -1
- package/dist/types/src/SubPackages/react/jsx/node.d.ts +3 -3
- package/dist/types/src/SubPackages/react/jsx/web.d.ts +2 -2
- package/dist/types/src/SubPackages/react-dom/component/node.d.ts +2 -2
- package/dist/types/src/SubPackages/react-dom/component/web.d.ts +1 -1
- package/dist/types/src/SubPackages/react-dom/jsx/node.d.ts +1 -1
- package/dist/types/src/SubPackages/react-dom/jsx/web.d.ts +2 -2
- package/dist/types/src/SubPackages/react-test-renderer/MemoExoticComponent/node.d.ts +2 -2
- package/dist/types/src/SubPackages/react-test-renderer/component/node.d.ts +2 -2
- package/dist/types/src/SubPackages/react-test-renderer/component/web.d.ts +2 -2
- package/dist/types/src/SubPackages/react-test-renderer/fc/node.d.ts +2 -2
- package/dist/types/src/SubPackages/react-test-renderer/fc/web.d.ts +2 -2
- package/dist/types/src/SubPackages/react-test-renderer/jsx/node.d.ts +3 -2
- package/dist/types/src/SubPackages/react-test-renderer/jsx/web.d.ts +2 -2
- package/dist/types/src/SubPackages/react-test-renderer/jsx-promised/node.d.ts +2 -2
- package/dist/types/src/SubPackages/react-test-renderer/jsx-promised/web.d.ts +2 -2
- package/dist/types/src/Types.d.ts +60 -21
- package/dist/types/src/Web.d.ts +2 -2
- package/dist/types/src/lib/index.d.ts +1 -1
- package/dist/types/src/lib/types.d.ts +2 -30
- package/dist/types/tsconfig.types.tsbuildinfo +1 -1
- package/package.json +11 -8
- package/src/PM/index.ts +12 -8
- package/src/PM/main.ts +218 -62
- package/src/PM/node.ts +42 -7
- package/src/PM/web.ts +33 -5
- package/src/SubPackages/react/jsx/node.ts +16 -5
- package/src/SubPackages/react-test-renderer/jsx/node.ts +16 -1
- package/src/Types.ts +362 -114
- package/src/cli.ts +535 -0
- package/src/cli2.ts +157 -0
- package/src/esbuildConfigs/inputFilesPlugin.ts +27 -6
- package/src/esbuildConfigs/node.ts +4 -7
- package/src/esbuildConfigs/web.ts +4 -3
- package/src/lib/abstractBase.ts +58 -115
- package/src/lib/types.ts +3 -177
- package/dist/common/src/Aider.js +0 -143
- package/dist/common/src/Project.js +0 -227
- package/dist/common/src/Puppeteer.js +0 -111
- package/dist/common/src/build-tests.js +0 -39
- package/dist/common/src/esbuildConfigs/features.js +0 -14
- package/dist/common/src/esbuildConfigs/report.js +0 -14
- package/dist/common/src/esbuildConfigs/tests.js +0 -13
- package/dist/common/src/run-tests.js +0 -39
- package/dist/module/src/Aider.js +0 -136
- package/dist/module/src/Project.js +0 -220
- package/dist/module/src/Puppeteer.js +0 -106
- package/dist/module/src/build-tests.js +0 -11
- package/dist/module/src/esbuildConfigs/features.js +0 -12
- package/dist/module/src/esbuildConfigs/report.js +0 -14
- package/dist/module/src/esbuildConfigs/tests.js +0 -11
- package/dist/module/src/run-tests.js +0 -11
- package/dist/prebuild/build-tests.mjs +0 -553
- package/dist/types/src/Aider.d.ts +0 -1
- package/dist/types/src/Project.d.ts +0 -12
- package/dist/types/src/Puppeteer.d.ts +0 -2
- package/dist/types/src/esbuildConfigs/features.d.ts +0 -4
- package/dist/types/src/esbuildConfigs/report.d.ts +0 -0
- package/dist/types/src/esbuildConfigs/tests.d.ts +0 -4
- package/src/Aider.ts +0 -168
- package/src/Project.ts +0 -292
- package/src/Puppeteer.ts +0 -143
- package/src/build-tests.ts +0 -12
- package/src/esbuildConfigs/features.ts +0 -17
- package/src/esbuildConfigs/report.ts +0 -15
- package/src/esbuildConfigs/tests.ts +0 -14
- package/src/run-tests.ts +0 -12
- /package/dist/types/src/{build-tests.d.ts → cli.d.ts} +0 -0
- /package/dist/types/src/{run-tests.d.ts → cli2.d.ts} +0 -0
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "testeranto",
|
|
3
3
|
"description": "the AI powered BDD test framework for typescript projects",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.100.0",
|
|
5
5
|
"engines": {
|
|
6
6
|
"node": "18.18.0"
|
|
7
7
|
},
|
|
@@ -144,10 +144,6 @@
|
|
|
144
144
|
"import": "./src/Node.ts",
|
|
145
145
|
"require": "./src/Node.ts"
|
|
146
146
|
},
|
|
147
|
-
"./src/Aider": {
|
|
148
|
-
"import": "./dist/module/src/Aider.js",
|
|
149
|
-
"require": "./dist/common/src/Aider.js"
|
|
150
|
-
},
|
|
151
147
|
"./src/Init": {
|
|
152
148
|
"import": "./dist/module/src/Init.js",
|
|
153
149
|
"require": "./dist/common/src/Init.js"
|
|
@@ -200,12 +196,15 @@
|
|
|
200
196
|
"@types/react": "18.2.0",
|
|
201
197
|
"@types/react-dom": "18.2.0",
|
|
202
198
|
"@types/react-test-renderer": "19.0.0",
|
|
199
|
+
"eslint": "9.23.0",
|
|
203
200
|
"react": "18.2.0",
|
|
204
201
|
"react-dom": "18.2.0",
|
|
205
202
|
"ts-node": "^10.9.1",
|
|
206
|
-
"typescript": "4.8.2"
|
|
203
|
+
"typescript": "4.8.2",
|
|
204
|
+
"typescript-eslint": "^8.29.0"
|
|
207
205
|
},
|
|
208
206
|
"devDependencies": {
|
|
207
|
+
"@eslint/js": "^9.23.0",
|
|
209
208
|
"@swc/core": "^1.3.26",
|
|
210
209
|
"@types/express": "^5.0.0",
|
|
211
210
|
"@types/express-session": "^1.18.1",
|
|
@@ -218,9 +217,13 @@
|
|
|
218
217
|
"@typescript-eslint/eslint-plugin": "^5.46.0",
|
|
219
218
|
"@typescript-eslint/parser": "^5.46.0",
|
|
220
219
|
"ts-node": "^10.9.1",
|
|
221
|
-
"typescript": "
|
|
220
|
+
"typescript": "^5.8.2"
|
|
222
221
|
},
|
|
223
222
|
"dependencies": {
|
|
223
|
+
"@bscotch/debounce-watch": "^1.1.0",
|
|
224
|
+
"@humanwhocodes/config-array": "^0.13.0",
|
|
225
|
+
"@types/eslint": "^9.6.1",
|
|
226
|
+
"@ungap/structured-clone": "^1.3.0",
|
|
224
227
|
"babel-loader": "^8.2.5",
|
|
225
228
|
"chai": "^5.2.0",
|
|
226
229
|
"chromium": "^3.0.3",
|
|
@@ -229,7 +232,7 @@
|
|
|
229
232
|
"esbuild-plugin-external-package": "^1.0.0",
|
|
230
233
|
"esbuild-plugin-import-map": "^2.1.0",
|
|
231
234
|
"esbuild-plugin-markdown": "^0.0.3",
|
|
232
|
-
"eslint": "^
|
|
235
|
+
"eslint-plugin-import": "^2.31.0",
|
|
233
236
|
"eslint-plugin-react": "^7.31.11",
|
|
234
237
|
"eslint-plugin-react-hooks": "^5.1.0",
|
|
235
238
|
"express": "^4.21.2",
|
package/src/PM/index.ts
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
Page,
|
|
4
|
-
} from "puppeteer-core/lib/esm/puppeteer/puppeteer-core-browser";
|
|
1
|
+
import { CdpPage } from "puppeteer-core/lib/esm/puppeteer/puppeteer-core-browser";
|
|
2
|
+
import { ScreenRecorderOptions } from "puppeteer-core/lib/esm/puppeteer";
|
|
5
3
|
import { ITLog, ITTestResourceConfiguration } from "../lib";
|
|
6
|
-
// import { Page } from "puppeteer-core";
|
|
7
4
|
|
|
8
5
|
type IFPaths = string[];
|
|
9
6
|
const fPaths: IFPaths = [];
|
|
@@ -12,7 +9,6 @@ export abstract class PM {
|
|
|
12
9
|
server: any;
|
|
13
10
|
testResourceConfiguration: ITTestResourceConfiguration;
|
|
14
11
|
|
|
15
|
-
// abstract startPuppeteer(options: any, destfolder: string): Promise<Browser>;
|
|
16
12
|
abstract testArtiFactoryfileWriter(tLog: ITLog, callback: (Promise) => void);
|
|
17
13
|
abstract createWriteStream(filepath: string): any;
|
|
18
14
|
abstract writeFileSync(fp: string, contents: string);
|
|
@@ -20,8 +16,9 @@ export abstract class PM {
|
|
|
20
16
|
abstract existsSync(fp: string): boolean;
|
|
21
17
|
abstract write(accessObject: { uid: number }, contents: string): boolean;
|
|
22
18
|
abstract end(accessObject: { uid: number }): boolean;
|
|
23
|
-
abstract customScreenShot(opts: object): any;
|
|
24
|
-
abstract screencast(opts:
|
|
19
|
+
abstract customScreenShot(opts: object, page?: string): any;
|
|
20
|
+
abstract screencast(opts: ScreenRecorderOptions, p?): any;
|
|
21
|
+
abstract screencastStop(s: string): any;
|
|
25
22
|
|
|
26
23
|
abstract page(): string | undefined;
|
|
27
24
|
abstract click(selector: string): any;
|
|
@@ -31,4 +28,11 @@ export abstract class PM {
|
|
|
31
28
|
abstract getAttribute(selector: string, attribute: string): any;
|
|
32
29
|
abstract isDisabled(selector: string): boolean;
|
|
33
30
|
abstract $(selector: string): any;
|
|
31
|
+
|
|
32
|
+
abstract newPage(): CdpPage;
|
|
33
|
+
abstract goto(p, url: string): any;
|
|
34
|
+
abstract closePage(p): any;
|
|
35
|
+
|
|
36
|
+
abstract waitForSelector(p, sel: string);
|
|
37
|
+
abstract customclose();
|
|
34
38
|
}
|
package/src/PM/main.ts
CHANGED
|
@@ -1,19 +1,20 @@
|
|
|
1
|
+
import { CdpPage, Page } from "puppeteer-core/lib/esm/puppeteer";
|
|
1
2
|
import fs from "fs";
|
|
2
3
|
import path from "path";
|
|
3
4
|
import puppeteer, {
|
|
4
5
|
Browser,
|
|
5
6
|
ConsoleMessage,
|
|
7
|
+
LaunchOptions,
|
|
8
|
+
ScreenRecorder,
|
|
6
9
|
ScreenshotOptions,
|
|
7
10
|
} from "puppeteer-core";
|
|
8
11
|
import { PassThrough } from "stream";
|
|
9
12
|
import crypto from "crypto";
|
|
10
13
|
|
|
11
14
|
import { IBuiltConfig, IFinalResults, ITestTypes } from "../lib/types";
|
|
15
|
+
import { ITLog } from "../lib/index.js";
|
|
12
16
|
|
|
13
17
|
import { PM } from "./index.js";
|
|
14
|
-
import { destinationOfRuntime } from "../utils.js";
|
|
15
|
-
import { ITLog } from "../lib/index.js";
|
|
16
|
-
import { Page } from "puppeteer-core/lib/esm/puppeteer";
|
|
17
18
|
|
|
18
19
|
const fileStreams3: fs.WriteStream[] = [];
|
|
19
20
|
|
|
@@ -22,8 +23,21 @@ type IFPaths = string[];
|
|
|
22
23
|
const fPaths: IFPaths = [];
|
|
23
24
|
|
|
24
25
|
const files: Record<string, Set<string>> = {};
|
|
26
|
+
const recorders: Record<string, ScreenRecorder> = {};
|
|
25
27
|
const screenshots: Record<string, Promise<Uint8Array>[]> = {};
|
|
26
28
|
|
|
29
|
+
const red = "\x1b[31m";
|
|
30
|
+
const green = "\x1b[32m";
|
|
31
|
+
const reset = "\x1b[0m"; // Resets to default color
|
|
32
|
+
|
|
33
|
+
const statusMessagePretty = (failures: number, test: string) => {
|
|
34
|
+
if (failures === 0) {
|
|
35
|
+
console.log(green + `${test} completed successfully` + reset);
|
|
36
|
+
} else {
|
|
37
|
+
console.log(red + `${test} failed ${failures} times` + reset);
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
|
|
27
41
|
export class PM_Main extends PM {
|
|
28
42
|
browser: Browser;
|
|
29
43
|
|
|
@@ -43,6 +57,46 @@ export class PM_Main extends PM {
|
|
|
43
57
|
this.ports[element] = "true"; // set ports as open
|
|
44
58
|
});
|
|
45
59
|
|
|
60
|
+
globalThis["waitForSelector"] = async (pageKey: string, sel: string) => {
|
|
61
|
+
console.log("waitForSelector", pageKey, sel);
|
|
62
|
+
const page = (await this.browser.pages()).find(
|
|
63
|
+
(p) => p.mainFrame()._id === pageKey
|
|
64
|
+
);
|
|
65
|
+
await page?.waitForSelector(sel);
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
globalThis["screencastStop"] = async (path: string) => {
|
|
69
|
+
return recorders[path].stop();
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
globalThis["closePage"] = async (pageKey) => {
|
|
73
|
+
const page = (await this.browser.pages()).find(
|
|
74
|
+
(p) => p.mainFrame()._id === pageKey
|
|
75
|
+
);
|
|
76
|
+
return page.close();
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
// globalThis["closePage"] = (p) => {
|
|
80
|
+
// console.log("closePage", p);
|
|
81
|
+
// return p.close();
|
|
82
|
+
// };
|
|
83
|
+
|
|
84
|
+
globalThis["goto"] = async (pageKey: string, url: string) => {
|
|
85
|
+
const page = (await this.browser.pages()).find(
|
|
86
|
+
(p) => p.mainFrame()._id === pageKey
|
|
87
|
+
);
|
|
88
|
+
await page?.goto(url);
|
|
89
|
+
return;
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
globalThis["newPage"] = () => {
|
|
93
|
+
return this.browser.newPage();
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
globalThis["pages"] = () => {
|
|
97
|
+
return this.browser.pages();
|
|
98
|
+
};
|
|
99
|
+
|
|
46
100
|
globalThis["mkdirSync"] = (fp: string) => {
|
|
47
101
|
if (!fs.existsSync(fp)) {
|
|
48
102
|
return fs.mkdirSync(fp, {
|
|
@@ -99,10 +153,41 @@ export class PM_Main extends PM {
|
|
|
99
153
|
fileStreams3[uid].end();
|
|
100
154
|
};
|
|
101
155
|
|
|
156
|
+
// async (ssOpts: ScreenshotOptions, testName: string) => {
|
|
157
|
+
// const p = ssOpts.path as string;
|
|
158
|
+
// const dir = path.dirname(p);
|
|
159
|
+
// fs.mkdirSync(dir, {
|
|
160
|
+
// recursive: true,
|
|
161
|
+
// });
|
|
162
|
+
// if (!files[testName]) {
|
|
163
|
+
// files[testName] = new Set();
|
|
164
|
+
// }
|
|
165
|
+
// files[testName].add(ssOpts.path as string);
|
|
166
|
+
|
|
167
|
+
// const sPromise = page.screenshot({
|
|
168
|
+
// ...ssOpts,
|
|
169
|
+
// path: p,
|
|
170
|
+
// });
|
|
171
|
+
|
|
172
|
+
// if (!screenshots[testName]) {
|
|
173
|
+
// screenshots[testName] = [];
|
|
174
|
+
// }
|
|
175
|
+
// screenshots[testName].push(sPromise);
|
|
176
|
+
// // sPromise.then(())
|
|
177
|
+
// await sPromise;
|
|
178
|
+
// return sPromise;
|
|
179
|
+
// // page.evaluate(`window["screenshot done"]`);
|
|
180
|
+
// };
|
|
181
|
+
|
|
102
182
|
globalThis["customScreenShot"] = async (
|
|
103
183
|
opts: { path: string },
|
|
104
|
-
|
|
184
|
+
pageKey: string,
|
|
185
|
+
testName: string
|
|
105
186
|
) => {
|
|
187
|
+
const page = (await this.browser.pages()).find(
|
|
188
|
+
(p) => p.mainFrame()._id === pageKey
|
|
189
|
+
);
|
|
190
|
+
|
|
106
191
|
const p = opts.path as string;
|
|
107
192
|
const dir = path.dirname(p);
|
|
108
193
|
fs.mkdirSync(dir, {
|
|
@@ -127,6 +212,30 @@ export class PM_Main extends PM {
|
|
|
127
212
|
return sPromise;
|
|
128
213
|
};
|
|
129
214
|
|
|
215
|
+
globalThis["screencast"] = async (
|
|
216
|
+
opts: ScreenshotOptions,
|
|
217
|
+
pageKey: string
|
|
218
|
+
) => {
|
|
219
|
+
const page = (await this.browser.pages()).find(
|
|
220
|
+
(p) => p.mainFrame()._id === pageKey
|
|
221
|
+
);
|
|
222
|
+
|
|
223
|
+
const p = opts.path as string;
|
|
224
|
+
const dir = path.dirname(p);
|
|
225
|
+
fs.mkdirSync(dir, {
|
|
226
|
+
recursive: true,
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
const recorder = await page?.screencast({
|
|
230
|
+
...opts,
|
|
231
|
+
path: p,
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
recorders[opts.path] = recorder;
|
|
235
|
+
|
|
236
|
+
return opts.path;
|
|
237
|
+
};
|
|
238
|
+
|
|
130
239
|
// globalThis["customclose"] = (p: string, testName: string) => {
|
|
131
240
|
// if (!files[testName]) {
|
|
132
241
|
// files[testName] = new Set();
|
|
@@ -140,13 +249,29 @@ export class PM_Main extends PM {
|
|
|
140
249
|
// };
|
|
141
250
|
}
|
|
142
251
|
|
|
252
|
+
customclose() {
|
|
253
|
+
throw new Error("Method not implemented.");
|
|
254
|
+
}
|
|
255
|
+
waitForSelector(p: string, s: string): any {
|
|
256
|
+
throw new Error("Method not implemented.");
|
|
257
|
+
}
|
|
258
|
+
closePage(p): any {
|
|
259
|
+
throw new Error("Method not implemented.");
|
|
260
|
+
}
|
|
261
|
+
newPage(): CdpPage {
|
|
262
|
+
throw new Error("Method not implemented.");
|
|
263
|
+
}
|
|
264
|
+
goto(p, url: string): any {
|
|
265
|
+
throw new Error("Method not implemented.");
|
|
266
|
+
}
|
|
267
|
+
|
|
143
268
|
$(selector: string): boolean {
|
|
144
269
|
throw new Error("Method not implemented.");
|
|
145
270
|
}
|
|
146
271
|
screencast(opts: object) {
|
|
147
272
|
throw new Error("Method not implemented.");
|
|
148
273
|
}
|
|
149
|
-
customScreenShot(opts: object) {
|
|
274
|
+
customScreenShot(opts: object, cdpPage?: CdpPage) {
|
|
150
275
|
throw new Error("Method not implemented.");
|
|
151
276
|
}
|
|
152
277
|
|
|
@@ -250,9 +375,15 @@ export class PM_Main extends PM {
|
|
|
250
375
|
isDisabled(selector: string): boolean {
|
|
251
376
|
throw new Error("Method not implemented.");
|
|
252
377
|
}
|
|
378
|
+
screencastStop(s: string) {
|
|
379
|
+
throw new Error("Method not implemented.");
|
|
380
|
+
}
|
|
253
381
|
////////////////////////////////////////////////////////////////////////////////
|
|
254
382
|
|
|
255
|
-
async startPuppeteer(
|
|
383
|
+
async startPuppeteer(
|
|
384
|
+
options: LaunchOptions,
|
|
385
|
+
destfolder: string
|
|
386
|
+
): Promise<any> {
|
|
256
387
|
this.browser = (await puppeteer.launch(options)) as any;
|
|
257
388
|
}
|
|
258
389
|
|
|
@@ -288,7 +419,7 @@ export class PM_Main extends PM {
|
|
|
288
419
|
};
|
|
289
420
|
|
|
290
421
|
launchNode = async (src: string, dest: string) => {
|
|
291
|
-
console.log("
|
|
422
|
+
console.log("! node", src);
|
|
292
423
|
this.register(src);
|
|
293
424
|
|
|
294
425
|
const destFolder = dest.replace(".mjs", "");
|
|
@@ -343,31 +474,31 @@ export class PM_Main extends PM {
|
|
|
343
474
|
process.exit(-1);
|
|
344
475
|
}
|
|
345
476
|
|
|
346
|
-
const builtfile = dest
|
|
477
|
+
const builtfile = dest;
|
|
347
478
|
|
|
348
479
|
const webSideCares: Page[] = [];
|
|
349
480
|
|
|
350
|
-
await Promise.all(
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
);
|
|
481
|
+
// await Promise.all(
|
|
482
|
+
// testConfig[3].map(async (sidecar) => {
|
|
483
|
+
// if (sidecar[1] === "web") {
|
|
484
|
+
// const s = await this.launchWebSideCar(
|
|
485
|
+
// sidecar[0],
|
|
486
|
+
// destinationOfRuntime(sidecar[0], "web", this.configs),
|
|
487
|
+
// sidecar
|
|
488
|
+
// );
|
|
489
|
+
// webSideCares.push(s);
|
|
490
|
+
// return s;
|
|
491
|
+
// }
|
|
492
|
+
|
|
493
|
+
// if (sidecar[1] === "node") {
|
|
494
|
+
// return this.launchNodeSideCar(
|
|
495
|
+
// sidecar[0],
|
|
496
|
+
// destinationOfRuntime(sidecar[0], "node", this.configs),
|
|
497
|
+
// sidecar
|
|
498
|
+
// );
|
|
499
|
+
// }
|
|
500
|
+
// })
|
|
501
|
+
// );
|
|
371
502
|
|
|
372
503
|
this.server[builtfile] = await import(
|
|
373
504
|
`${builtfile}?cacheBust=${Date.now()}`
|
|
@@ -376,8 +507,9 @@ export class PM_Main extends PM {
|
|
|
376
507
|
defaultModule
|
|
377
508
|
.receiveTestResourceConfig(argz)
|
|
378
509
|
.then(async ({ features, failed }: IFinalResults) => {
|
|
379
|
-
this.receiveFeatures(features, destFolder);
|
|
380
|
-
console.log(`${src} completed with ${failed} errors`);
|
|
510
|
+
this.receiveFeatures(features, destFolder, src);
|
|
511
|
+
// console.log(`${src} completed with ${failed} errors`);
|
|
512
|
+
statusMessagePretty(failed, src);
|
|
381
513
|
})
|
|
382
514
|
.catch((e) => {
|
|
383
515
|
console.log(`${src} errored with`, e);
|
|
@@ -633,19 +765,19 @@ export class PM_Main extends PM {
|
|
|
633
765
|
}
|
|
634
766
|
};
|
|
635
767
|
|
|
636
|
-
launchWeb = (t: string, dest: string
|
|
637
|
-
console.log("
|
|
768
|
+
launchWeb = (t: string, dest: string) => {
|
|
769
|
+
console.log("! web", t);
|
|
638
770
|
this.register(t);
|
|
639
771
|
|
|
640
|
-
sidecars.map((sidecar) => {
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
});
|
|
772
|
+
// sidecars.map((sidecar) => {
|
|
773
|
+
// if (sidecar[1] === "node") {
|
|
774
|
+
// return this.launchNodeSideCar(
|
|
775
|
+
// sidecar[0],
|
|
776
|
+
// destinationOfRuntime(sidecar[0], "node", this.configs),
|
|
777
|
+
// sidecar
|
|
778
|
+
// );
|
|
779
|
+
// }
|
|
780
|
+
// });
|
|
649
781
|
|
|
650
782
|
const destFolder = dest.replace(".mjs", "");
|
|
651
783
|
|
|
@@ -656,9 +788,11 @@ export class PM_Main extends PM {
|
|
|
656
788
|
browserWSEndpoint: this.browser.wsEndpoint(),
|
|
657
789
|
});
|
|
658
790
|
|
|
791
|
+
const d = `${dest}?cacheBust=${Date.now()}`;
|
|
792
|
+
|
|
659
793
|
const evaluation = `
|
|
660
|
-
console.log("importing ${
|
|
661
|
-
import('${
|
|
794
|
+
console.log("importing ${d}");
|
|
795
|
+
import('${d}').then(async (x) => {
|
|
662
796
|
console.log("imported", (await x.default));
|
|
663
797
|
try {
|
|
664
798
|
return await (await x.default).receiveTestResourceConfig(${webArgz})
|
|
@@ -670,8 +804,8 @@ export class PM_Main extends PM {
|
|
|
670
804
|
const fileStreams2: fs.WriteStream[] = [];
|
|
671
805
|
const doneFileStream2: Promise<any>[] = [];
|
|
672
806
|
|
|
673
|
-
const stdoutStream = fs.createWriteStream(`${
|
|
674
|
-
const stderrStream = fs.createWriteStream(`${
|
|
807
|
+
const stdoutStream = fs.createWriteStream(`${destFolder}/stdout.log`);
|
|
808
|
+
const stderrStream = fs.createWriteStream(`${destFolder}/stderr.log`);
|
|
675
809
|
|
|
676
810
|
this.browser
|
|
677
811
|
.newPage()
|
|
@@ -905,7 +1039,7 @@ export class PM_Main extends PM {
|
|
|
905
1039
|
// files[t].add(filepath);
|
|
906
1040
|
|
|
907
1041
|
fs.writeFileSync(
|
|
908
|
-
|
|
1042
|
+
destFolder + "/manifest.json",
|
|
909
1043
|
JSON.stringify(Array.from(files[t]))
|
|
910
1044
|
);
|
|
911
1045
|
delete files[t];
|
|
@@ -948,13 +1082,14 @@ export class PM_Main extends PM {
|
|
|
948
1082
|
stdoutStream.write(JSON.stringify(log.location()));
|
|
949
1083
|
stdoutStream.write(JSON.stringify(log.stackTrace()));
|
|
950
1084
|
});
|
|
951
|
-
await page.goto(`file://${`${
|
|
1085
|
+
await page.goto(`file://${`${destFolder}.html`}`, {});
|
|
952
1086
|
|
|
953
1087
|
await page
|
|
954
1088
|
.evaluate(evaluation)
|
|
955
1089
|
.then(async ({ failed, features }: IFinalResults) => {
|
|
956
|
-
this.receiveFeatures(features, destFolder);
|
|
957
|
-
console.log(`${t} completed with ${failed} errors`);
|
|
1090
|
+
this.receiveFeatures(features, destFolder, t);
|
|
1091
|
+
// console.log(`${t} completed with ${failed} errors`);
|
|
1092
|
+
statusMessagePretty(failed, t);
|
|
958
1093
|
})
|
|
959
1094
|
.catch((e) => {
|
|
960
1095
|
console.log(`${t} errored with`, e);
|
|
@@ -967,7 +1102,19 @@ export class PM_Main extends PM {
|
|
|
967
1102
|
});
|
|
968
1103
|
};
|
|
969
1104
|
|
|
970
|
-
receiveFeatures = (
|
|
1105
|
+
receiveFeatures = (
|
|
1106
|
+
features: string[],
|
|
1107
|
+
destFolder: string,
|
|
1108
|
+
srcTest: string
|
|
1109
|
+
) => {
|
|
1110
|
+
const featureDestination = path.resolve(
|
|
1111
|
+
process.cwd(),
|
|
1112
|
+
"docs",
|
|
1113
|
+
"features",
|
|
1114
|
+
"strings",
|
|
1115
|
+
srcTest.split(".").slice(0, -1).join(".") + ".features.txt"
|
|
1116
|
+
);
|
|
1117
|
+
|
|
971
1118
|
features
|
|
972
1119
|
.reduce(async (mm, featureStringKey) => {
|
|
973
1120
|
const accum = await mm;
|
|
@@ -1001,29 +1148,38 @@ export class PM_Main extends PM {
|
|
|
1001
1148
|
// console.log("Symlink created successfully");
|
|
1002
1149
|
}
|
|
1003
1150
|
});
|
|
1004
|
-
accum.push(newPath);
|
|
1151
|
+
accum.files.push(newPath);
|
|
1005
1152
|
} else if (u.protocol === "http:" || u.protocol === "https:") {
|
|
1006
1153
|
const newPath = `${process.cwd()}/docs/features/external${
|
|
1007
1154
|
u.hostname
|
|
1008
1155
|
}${u.pathname}`;
|
|
1009
1156
|
const body = await this.configs.featureIngestor(featureStringKey);
|
|
1010
1157
|
writeFileAndCreateDir(newPath, body);
|
|
1011
|
-
accum.push(newPath);
|
|
1158
|
+
accum.files.push(newPath);
|
|
1012
1159
|
}
|
|
1013
1160
|
} else {
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
)
|
|
1017
|
-
|
|
1018
|
-
|
|
1161
|
+
await fs.promises.mkdir(path.dirname(featureDestination), {
|
|
1162
|
+
recursive: true,
|
|
1163
|
+
});
|
|
1164
|
+
// const newPath = `${process.cwd()}/docs/features/plain/${await sha256(
|
|
1165
|
+
// featureStringKey
|
|
1166
|
+
// )}`;
|
|
1167
|
+
// writeFileAndCreateDir(
|
|
1168
|
+
// `${featureDestination}/${await sha256(featureStringKey)}`,
|
|
1169
|
+
// featureStringKey
|
|
1170
|
+
// );
|
|
1171
|
+
accum.strings.push(featureStringKey);
|
|
1019
1172
|
}
|
|
1020
1173
|
|
|
1021
1174
|
return accum;
|
|
1022
|
-
}, Promise.resolve([] as string[]))
|
|
1023
|
-
|
|
1175
|
+
}, Promise.resolve({ files: [] as string[], strings: [] as string[] }))
|
|
1176
|
+
|
|
1177
|
+
.then(({ files, strings }: { files: string[]; strings: string[] }) => {
|
|
1178
|
+
// writeFileAndCreateDir(`${featureDestination}`, JSON.stringify(strings));
|
|
1179
|
+
|
|
1024
1180
|
fs.writeFileSync(
|
|
1025
1181
|
`${destFolder}/featurePrompt.txt`,
|
|
1026
|
-
|
|
1182
|
+
files
|
|
1027
1183
|
.map((f) => {
|
|
1028
1184
|
return `/read ${f}`;
|
|
1029
1185
|
})
|
|
@@ -1038,7 +1194,7 @@ async function writeFileAndCreateDir(filePath, data) {
|
|
|
1038
1194
|
|
|
1039
1195
|
try {
|
|
1040
1196
|
await fs.promises.mkdir(dirPath, { recursive: true });
|
|
1041
|
-
await fs.
|
|
1197
|
+
await fs.appendFileSync(filePath, data);
|
|
1042
1198
|
} catch (error) {
|
|
1043
1199
|
console.error(`Error writing file: ${error}`);
|
|
1044
1200
|
}
|
package/src/PM/node.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import fs from "fs";
|
|
2
2
|
import path from "path";
|
|
3
|
-
import puppeteer from "puppeteer-core";
|
|
3
|
+
import puppeteer, { ScreencastOptions, ScreenRecorder } from "puppeteer-core";
|
|
4
4
|
import { PassThrough } from "stream";
|
|
5
5
|
|
|
6
6
|
import { ITLog, ITTestResourceConfiguration } from "../lib";
|
|
7
7
|
|
|
8
8
|
import { PM } from "./index.js";
|
|
9
|
-
import { Page } from "puppeteer-core/lib/esm/puppeteer";
|
|
9
|
+
import { CdpPage, Page } from "puppeteer-core/lib/esm/puppeteer";
|
|
10
10
|
|
|
11
11
|
type IFPaths = string[];
|
|
12
12
|
const fPaths: IFPaths = [];
|
|
@@ -23,10 +23,23 @@ export class PM_Node extends PM {
|
|
|
23
23
|
this.testResourceConfiguration = t;
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
waitForSelector(p: string, s: string): any {
|
|
27
|
+
return globalThis["waitForSelector"](p, s);
|
|
28
28
|
}
|
|
29
|
-
|
|
29
|
+
|
|
30
|
+
closePage(p): string {
|
|
31
|
+
return globalThis["closePage"](p);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
goto(cdpPage: CdpPage, url: string): any {
|
|
35
|
+
return globalThis["goto"](cdpPage.mainFrame()._id, url);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
newPage(): CdpPage {
|
|
39
|
+
return globalThis["newPage"]();
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
$(selector: string): boolean {
|
|
30
43
|
throw new Error("Method not implemented.");
|
|
31
44
|
}
|
|
32
45
|
|
|
@@ -57,8 +70,30 @@ export class PM_Node extends PM {
|
|
|
57
70
|
return globalThis["click"](selector);
|
|
58
71
|
}
|
|
59
72
|
|
|
60
|
-
|
|
61
|
-
return globalThis["
|
|
73
|
+
screencast(opts: ScreencastOptions, page: CdpPage) {
|
|
74
|
+
return globalThis["screencast"](
|
|
75
|
+
{
|
|
76
|
+
...opts,
|
|
77
|
+
path: this.testResourceConfiguration.fs + "/" + opts.path,
|
|
78
|
+
},
|
|
79
|
+
page.mainFrame()._id,
|
|
80
|
+
this.testResourceConfiguration.name
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
screencastStop(p: string) {
|
|
85
|
+
return globalThis["screencastStop"](p);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
customScreenShot(opts: ScreencastOptions, cdpPage: CdpPage) {
|
|
89
|
+
return globalThis["customScreenShot"](
|
|
90
|
+
{
|
|
91
|
+
...opts,
|
|
92
|
+
path: this.testResourceConfiguration.fs + "/" + opts.path,
|
|
93
|
+
},
|
|
94
|
+
cdpPage.mainFrame()._id,
|
|
95
|
+
this.testResourceConfiguration.name
|
|
96
|
+
);
|
|
62
97
|
}
|
|
63
98
|
|
|
64
99
|
existsSync(destFolder: string): boolean {
|
package/src/PM/web.ts
CHANGED
|
@@ -3,7 +3,8 @@ import { PassThrough } from "stream";
|
|
|
3
3
|
import { ITLog, ITTestResourceConfiguration } from "../lib";
|
|
4
4
|
|
|
5
5
|
import { PM } from "./index.js";
|
|
6
|
-
import { ScreenshotOptions } from "puppeteer-core";
|
|
6
|
+
import { ScreencastOptions, ScreenshotOptions } from "puppeteer-core";
|
|
7
|
+
import { CdpPage } from "puppeteer-core/lib/esm/puppeteer";
|
|
7
8
|
|
|
8
9
|
type PuppetMasterServer = Record<string, Promise<any>>;
|
|
9
10
|
|
|
@@ -16,12 +17,39 @@ export class PM_Web extends PM {
|
|
|
16
17
|
this.testResourceConfiguration = t;
|
|
17
18
|
}
|
|
18
19
|
|
|
20
|
+
waitForSelector(p: string, s: string): any {
|
|
21
|
+
return window["waitForSelector"](p, s);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
screencast(opts: ScreencastOptions) {
|
|
25
|
+
return window["screencast"](
|
|
26
|
+
{
|
|
27
|
+
...opts,
|
|
28
|
+
path: this.testResourceConfiguration.fs + "/" + opts.path,
|
|
29
|
+
},
|
|
30
|
+
this.testResourceConfiguration.name
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
screencastStop(recorder: string) {
|
|
35
|
+
return window["screencastStop"](recorder);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
closePage(p): string {
|
|
39
|
+
return window["closePage"](p);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
goto(p, url: string): any {
|
|
43
|
+
return window["goto"](p, url);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
newPage(): CdpPage {
|
|
47
|
+
return window["newPage"]();
|
|
48
|
+
}
|
|
49
|
+
|
|
19
50
|
$(selector: string): boolean {
|
|
20
51
|
return window["$"](selector);
|
|
21
52
|
}
|
|
22
|
-
screencast(opts: object) {
|
|
23
|
-
throw new Error("Method not implemented.");
|
|
24
|
-
}
|
|
25
53
|
|
|
26
54
|
isDisabled(selector: string): boolean {
|
|
27
55
|
return window["isDisabled"](selector);
|
|
@@ -64,7 +92,7 @@ export class PM_Web extends PM {
|
|
|
64
92
|
return window["existsSync"](destFolder);
|
|
65
93
|
}
|
|
66
94
|
|
|
67
|
-
mkdirSync() {
|
|
95
|
+
mkdirSync(x) {
|
|
68
96
|
return window["mkdirSync"](this.testResourceConfiguration.fs + "/");
|
|
69
97
|
}
|
|
70
98
|
|