testeranto 0.70.0 → 0.74.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 +9 -18
- package/dist/common/Node.js +7 -34
- package/dist/common/PM/index.js +71 -0
- package/dist/common/PM/main.js +370 -0
- package/dist/common/PM/node.js +84 -0
- package/dist/common/PM/web.js +129 -0
- package/dist/common/Project.js +20 -2
- package/dist/common/Puppeteer.js +109 -0
- package/dist/common/Reporter.js +119 -0
- package/dist/common/Scheduler.js +1 -0
- package/dist/common/SubPackages/puppeteer.js +3 -1
- package/dist/common/SubPackages/react/jsx/index.js +14 -2
- package/dist/common/SubPackages/react-dom/component/web.js +98 -45
- package/dist/common/SubPackages/react-test-renderer/jsx/index.js +0 -1
- package/dist/common/Web.js +24 -44
- package/dist/common/esbuildConfigs/web.js +3 -1
- package/dist/common/lib/abstractBase.js +189 -41
- package/dist/common/lib/basebuilder.js +56 -29
- package/dist/common/lib/classBuilder.js +6 -2
- package/dist/common/lib/core.js +41 -45
- package/dist/common/lib/index.js +2 -1
- package/dist/common/preload.js +14 -18
- package/dist/common/tsconfig.common.tsbuildinfo +1 -1
- package/dist/module/Node.js +7 -34
- package/dist/module/PM/index.js +67 -0
- package/dist/module/PM/main.js +340 -0
- package/dist/module/PM/node.js +77 -0
- package/dist/module/PM/web.js +122 -0
- package/dist/module/Project.js +20 -2
- package/dist/module/Puppeteer.js +104 -0
- package/dist/module/Reporter.js +114 -0
- package/dist/module/Scheduler.js +1 -0
- package/dist/module/SubPackages/puppeteer.js +3 -1
- package/dist/module/SubPackages/react/jsx/index.js +11 -2
- package/dist/module/SubPackages/react/jsx/node.js +1 -1
- package/dist/module/SubPackages/react-dom/component/web.js +98 -45
- package/dist/module/SubPackages/react-test-renderer/jsx/index.js +0 -1
- package/dist/module/Web.js +24 -44
- package/dist/module/esbuildConfigs/web.js +3 -1
- package/dist/module/lib/abstractBase.js +189 -41
- package/dist/module/lib/basebuilder.js +56 -29
- package/dist/module/lib/classBuilder.js +6 -2
- package/dist/module/lib/core.js +41 -45
- package/dist/module/lib/index.js +2 -1
- package/dist/module/preload.js +15 -14
- package/dist/module/tsconfig.module.tsbuildinfo +1 -1
- package/dist/prebuild/Report.css +1616 -584
- package/dist/prebuild/Report.js +2635 -2506
- package/dist/types/PM/index.d.ts +19 -0
- package/dist/types/PM/main.d.ts +26 -0
- package/dist/types/PM/node.d.ts +25 -0
- package/dist/types/PM/web.d.ts +24 -0
- package/dist/types/Reporter.d.ts +1 -0
- package/dist/types/Scheduler.d.ts +0 -0
- package/dist/types/SubPackages/react/jsx/index.d.ts +2 -5
- package/dist/types/SubPackages/react-dom/component/web.d.ts +1 -1
- package/dist/types/lib/abstractBase.d.ts +13 -12
- package/dist/types/lib/basebuilder.d.ts +4 -2
- package/dist/types/lib/classBuilder.d.ts +2 -2
- package/dist/types/lib/core.d.ts +4 -4
- package/dist/types/lib/index.d.ts +6 -5
- package/dist/types/lib/types.d.ts +16 -24
- package/dist/types/preload.d.ts +0 -1
- package/dist/types/tsconfig.types.tsbuildinfo +1 -1
- package/package.json +3 -5
- package/src/Node.ts +8 -47
- package/src/PM/index.ts +102 -0
- package/src/PM/main.ts +452 -0
- package/src/PM/node.ts +122 -0
- package/src/PM/web.ts +162 -0
- package/src/Project.ts +21 -2
- package/src/Puppeteer.ts +131 -0
- package/src/Report.tsx +160 -46
- package/src/Reporter.ts +134 -0
- package/src/Scheduler.ts +0 -0
- package/src/SubPackages/puppeteer.ts +3 -3
- package/src/SubPackages/react/jsx/index.ts +13 -3
- package/src/SubPackages/react/jsx/node.ts +5 -8
- package/src/SubPackages/react-dom/component/web.ts +126 -67
- package/src/SubPackages/react-test-renderer/jsx/index.ts +0 -1
- package/src/Web.ts +25 -69
- package/src/esbuildConfigs/web.ts +4 -2
- package/src/lib/abstractBase.ts +260 -65
- package/src/lib/basebuilder.ts +121 -100
- package/src/lib/classBuilder.ts +5 -4
- package/src/lib/core.ts +58 -59
- package/src/lib/index.ts +10 -9
- package/src/lib/types.ts +18 -27
- package/src/preload.ts +14 -14
- package/dist/common/NodeWriter.js +0 -54
- package/dist/common/electron.js +0 -266
- package/dist/module/NodeWriter.js +0 -48
- package/dist/module/electron.js +0 -261
- package/dist/types/NodeWriter.d.ts +0 -2
- package/src/NodeWriter.ts +0 -72
- package/src/electron.ts +0 -317
- package/yarn-error.log +0 -3144
- /package/dist/types/{electron.d.ts → Puppeteer.d.ts} +0 -0
package/dist/module/Node.js
CHANGED
|
@@ -1,42 +1,15 @@
|
|
|
1
|
-
import puppeteer from "puppeteer-core";
|
|
2
1
|
import Testeranto from "./lib/core.js";
|
|
3
2
|
import { defaultTestResourceRequirement, } from "./lib/index.js";
|
|
4
|
-
import {
|
|
5
|
-
import puppeteerConfiger from "./puppeteerConfiger.js";
|
|
3
|
+
import { PM_Node } from "./PM/node.js";
|
|
6
4
|
class NodeTesteranto extends Testeranto {
|
|
7
5
|
constructor(input, testSpecification, testImplementation, testResourceRequirement, testInterface) {
|
|
8
|
-
super(input, testSpecification, testImplementation, testResourceRequirement,
|
|
9
|
-
if (process.argv[2]) {
|
|
10
|
-
const testResourceArg = process.argv[2];
|
|
11
|
-
try {
|
|
12
|
-
const partialTestResource = JSON.parse(testResourceArg);
|
|
13
|
-
this.receiveTestResourceConfig(this.testJobs[0], partialTestResource);
|
|
14
|
-
}
|
|
15
|
-
catch (e) {
|
|
16
|
-
console.error(e);
|
|
17
|
-
// process.exit(-1);
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
else {
|
|
21
|
-
// no-op
|
|
22
|
-
}
|
|
6
|
+
super(input, testSpecification, testImplementation, testResourceRequirement, testInterface);
|
|
23
7
|
}
|
|
24
|
-
async receiveTestResourceConfig(
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
});
|
|
30
|
-
console.log("connected!", b.isConnected());
|
|
31
|
-
return b;
|
|
32
|
-
});
|
|
33
|
-
const { failed, artifacts, logPromise } = await t.receiveTestResourceConfig(partialTestResource, {
|
|
34
|
-
browser,
|
|
35
|
-
ipc: process.parentPort,
|
|
36
|
-
});
|
|
37
|
-
Promise.all([...artifacts, logPromise]).then(async () => {
|
|
38
|
-
process.exit((await failed) ? 1 : 0);
|
|
39
|
-
});
|
|
8
|
+
async receiveTestResourceConfig(partialTestResource) {
|
|
9
|
+
const t = JSON.parse(partialTestResource);
|
|
10
|
+
const pm = new PM_Node(t);
|
|
11
|
+
const { failed, artifacts, logPromise } = await this.testJobs[0].receiveTestResourceConfig(pm);
|
|
12
|
+
pm.customclose();
|
|
40
13
|
}
|
|
41
14
|
}
|
|
42
15
|
export default async (input, testSpecification, testImplementation, testInterface, testResourceRequirement = defaultTestResourceRequirement) => {
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// import {
|
|
2
|
+
// Browser,
|
|
3
|
+
// BrowserContext,
|
|
4
|
+
// BrowserContextOptions,
|
|
5
|
+
// DebugInfo,
|
|
6
|
+
// Page,
|
|
7
|
+
// PuppeteerNode,
|
|
8
|
+
// Target,
|
|
9
|
+
// } from "puppeteer-core";
|
|
10
|
+
const fPaths = [];
|
|
11
|
+
export class PM {
|
|
12
|
+
}
|
|
13
|
+
// export class PuppetMasterBrowser extends Browser {
|
|
14
|
+
// process(): ChildProcess | null {
|
|
15
|
+
// return super.process();
|
|
16
|
+
// }
|
|
17
|
+
// createBrowserContext(
|
|
18
|
+
// options?: BrowserContextOptions
|
|
19
|
+
// ): Promise<BrowserContext> {
|
|
20
|
+
// throw new Error("Method not implemented.");
|
|
21
|
+
// }
|
|
22
|
+
// browserContexts(): BrowserContext[] {
|
|
23
|
+
// throw new Error("Method not implemented.");
|
|
24
|
+
// }
|
|
25
|
+
// defaultBrowserContext(): BrowserContext {
|
|
26
|
+
// throw new Error("Method not implemented.");
|
|
27
|
+
// }
|
|
28
|
+
// wsEndpoint(): string {
|
|
29
|
+
// throw new Error("Method not implemented.");
|
|
30
|
+
// }
|
|
31
|
+
// newPage(): Promise<Page> {
|
|
32
|
+
// throw new Error("Method not implemented.");
|
|
33
|
+
// }
|
|
34
|
+
// targets(): Target[] {
|
|
35
|
+
// throw new Error("Method not implemented.");
|
|
36
|
+
// }
|
|
37
|
+
// target(): Target {
|
|
38
|
+
// throw new Error("Method not implemented.");
|
|
39
|
+
// }
|
|
40
|
+
// version(): Promise<string> {
|
|
41
|
+
// throw new Error("Method not implemented.");
|
|
42
|
+
// }
|
|
43
|
+
// userAgent(): Promise<string> {
|
|
44
|
+
// throw new Error("Method not implemented.");
|
|
45
|
+
// }
|
|
46
|
+
// close(): Promise<void> {
|
|
47
|
+
// throw new Error("Method not implemented.");
|
|
48
|
+
// }
|
|
49
|
+
// disconnect(): Promise<void> {
|
|
50
|
+
// throw new Error("Method not implemented.");
|
|
51
|
+
// }
|
|
52
|
+
// get connected(): boolean {
|
|
53
|
+
// throw new Error("Method not implemented.");
|
|
54
|
+
// }
|
|
55
|
+
// get debugInfo(): DebugInfo {
|
|
56
|
+
// throw new Error("Method not implemented.");
|
|
57
|
+
// }
|
|
58
|
+
// constructor(...z: []) {
|
|
59
|
+
// super(...z);
|
|
60
|
+
// }
|
|
61
|
+
// // pages(): Promise<Page[]>;
|
|
62
|
+
// pages(): Promise<Page[]> {
|
|
63
|
+
// return new Promise<Page[]>((res, rej) => {
|
|
64
|
+
// res(super.pages());
|
|
65
|
+
// });
|
|
66
|
+
// }
|
|
67
|
+
// }
|
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import puppeteer from "puppeteer-core";
|
|
4
|
+
import { PM } from "./index.js";
|
|
5
|
+
const fPaths = [];
|
|
6
|
+
const fileStreams3 = [];
|
|
7
|
+
const files = {}; // = new Set<string>();
|
|
8
|
+
const screenshots = {};
|
|
9
|
+
export class PM_Main extends PM {
|
|
10
|
+
constructor(configs) {
|
|
11
|
+
super();
|
|
12
|
+
this.launchNode = async (src, dest) => {
|
|
13
|
+
console.log("launchNode", src);
|
|
14
|
+
const destFolder = dest.replace(".mjs", "");
|
|
15
|
+
let argz = "";
|
|
16
|
+
const testConfig = this.configs.tests.find((t) => {
|
|
17
|
+
return t[0] === src;
|
|
18
|
+
});
|
|
19
|
+
if (!testConfig) {
|
|
20
|
+
console.error("missing test config");
|
|
21
|
+
process.exit(-1);
|
|
22
|
+
}
|
|
23
|
+
const testConfigResource = testConfig[2];
|
|
24
|
+
let portsToUse = [];
|
|
25
|
+
if (testConfigResource.ports === 0) {
|
|
26
|
+
argz = JSON.stringify({
|
|
27
|
+
scheduled: true,
|
|
28
|
+
name: src,
|
|
29
|
+
ports: portsToUse,
|
|
30
|
+
fs: destFolder,
|
|
31
|
+
browserWSEndpoint: this.browser.wsEndpoint(),
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
else if (testConfigResource.ports > 0) {
|
|
35
|
+
const openPorts = Object.entries(this.ports).filter(([portnumber, portopen]) => portopen);
|
|
36
|
+
if (openPorts.length >= testConfigResource.ports) {
|
|
37
|
+
for (let i = 0; i < testConfigResource.ports; i++) {
|
|
38
|
+
portsToUse.push(openPorts[i][0]);
|
|
39
|
+
this.ports[openPorts[i][0]] = false; // port is now closed
|
|
40
|
+
}
|
|
41
|
+
argz = JSON.stringify({
|
|
42
|
+
scheduled: true,
|
|
43
|
+
name: src,
|
|
44
|
+
// ports: [3333],
|
|
45
|
+
ports: portsToUse,
|
|
46
|
+
fs: ".",
|
|
47
|
+
browserWSEndpoint: this.browser.wsEndpoint(),
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
this.queue.push(src);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
console.error("negative port makes no sense", src);
|
|
57
|
+
process.exit(-1);
|
|
58
|
+
}
|
|
59
|
+
const builtfile = dest + ".mjs";
|
|
60
|
+
this.server[builtfile] = await import(`${builtfile}?cacheBust=${Date.now()}`).then((module) => {
|
|
61
|
+
return module.default.then((defaultModule) => {
|
|
62
|
+
defaultModule
|
|
63
|
+
.receiveTestResourceConfig(argz)
|
|
64
|
+
.then((x) => {
|
|
65
|
+
console.log("then", x);
|
|
66
|
+
return x;
|
|
67
|
+
})
|
|
68
|
+
.catch((e) => {
|
|
69
|
+
console.log("catch", e);
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
for (let i = 0; i <= portsToUse.length; i++) {
|
|
74
|
+
this.ports[i] = true; //port is open again
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
this.launchWeb = (t, dest) => {
|
|
78
|
+
console.log("launchWeb", t, dest);
|
|
79
|
+
const destFolder = dest.replace(".mjs", "");
|
|
80
|
+
const webArgz = JSON.stringify({
|
|
81
|
+
name: dest,
|
|
82
|
+
ports: [].toString(),
|
|
83
|
+
fs: destFolder,
|
|
84
|
+
browserWSEndpoint: this.browser.wsEndpoint(),
|
|
85
|
+
});
|
|
86
|
+
const evaluation = `import('${dest}.mjs').then(async (x) => {
|
|
87
|
+
console.log("imported", x, (x.default));
|
|
88
|
+
try {
|
|
89
|
+
await (await x.default).receiveTestResourceConfig(${webArgz})
|
|
90
|
+
} catch (e) {
|
|
91
|
+
console.log("fail", e)
|
|
92
|
+
}
|
|
93
|
+
})`;
|
|
94
|
+
const fileStreams2 = [];
|
|
95
|
+
// const screenshots2: Promise<any>[] = [];
|
|
96
|
+
const doneFileStream2 = [];
|
|
97
|
+
this.browser
|
|
98
|
+
.newPage()
|
|
99
|
+
.then((page) => {
|
|
100
|
+
page.exposeFunction("custom-screenshot", async (ssOpts, testName) => {
|
|
101
|
+
console.log("main.ts browser custom-screenshot", testName);
|
|
102
|
+
const p = ssOpts.path;
|
|
103
|
+
const dir = path.dirname(p);
|
|
104
|
+
fs.mkdirSync(dir, {
|
|
105
|
+
recursive: true,
|
|
106
|
+
});
|
|
107
|
+
files[testName].add(ssOpts.path);
|
|
108
|
+
const sPromise = page.screenshot(Object.assign(Object.assign({}, ssOpts), { path: p }));
|
|
109
|
+
if (!screenshots[testName]) {
|
|
110
|
+
screenshots[testName] = [];
|
|
111
|
+
}
|
|
112
|
+
screenshots[testName].push(sPromise);
|
|
113
|
+
// sPromise.then(())
|
|
114
|
+
await sPromise;
|
|
115
|
+
return sPromise;
|
|
116
|
+
// page.evaluate(`window["screenshot done"]`);
|
|
117
|
+
});
|
|
118
|
+
page.exposeFunction("writeFileSync", (fp, contents, testName) => {
|
|
119
|
+
const dir = path.dirname(fp);
|
|
120
|
+
fs.mkdirSync(dir, {
|
|
121
|
+
recursive: true,
|
|
122
|
+
});
|
|
123
|
+
const p = new Promise(async (res, rej) => {
|
|
124
|
+
fs.writeFileSync(fp, contents);
|
|
125
|
+
res(fp);
|
|
126
|
+
});
|
|
127
|
+
doneFileStream2.push(p);
|
|
128
|
+
if (!files[testName]) {
|
|
129
|
+
files[testName] = new Set();
|
|
130
|
+
}
|
|
131
|
+
files[testName].add(fp);
|
|
132
|
+
return p;
|
|
133
|
+
});
|
|
134
|
+
page.exposeFunction("existsSync", (fp, contents) => {
|
|
135
|
+
return fs.existsSync(fp);
|
|
136
|
+
});
|
|
137
|
+
page.exposeFunction("mkdirSync", (fp) => {
|
|
138
|
+
if (!fs.existsSync(fp)) {
|
|
139
|
+
return fs.mkdirSync(fp, {
|
|
140
|
+
recursive: true,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
return false;
|
|
144
|
+
});
|
|
145
|
+
page.exposeFunction("createWriteStream", (fp, testName) => {
|
|
146
|
+
const f = fs.createWriteStream(fp);
|
|
147
|
+
if (!files[testName]) {
|
|
148
|
+
files[testName] = new Set();
|
|
149
|
+
}
|
|
150
|
+
files[testName].add(fp);
|
|
151
|
+
const p = new Promise((res, rej) => {
|
|
152
|
+
res(fp);
|
|
153
|
+
});
|
|
154
|
+
doneFileStream2.push(p);
|
|
155
|
+
f.on("close", async () => {
|
|
156
|
+
await p;
|
|
157
|
+
});
|
|
158
|
+
fileStreams2.push(f);
|
|
159
|
+
return Object.assign(Object.assign({}, JSON.parse(JSON.stringify(f))), { uid: fileStreams2.length - 1 });
|
|
160
|
+
});
|
|
161
|
+
page.exposeFunction("write", async (uid, contents) => {
|
|
162
|
+
return fileStreams2[uid].write(contents);
|
|
163
|
+
});
|
|
164
|
+
page.exposeFunction("end", async (uid) => {
|
|
165
|
+
return fileStreams2[uid].end();
|
|
166
|
+
});
|
|
167
|
+
page.exposeFunction("customclose", (p, testName) => {
|
|
168
|
+
fs.writeFileSync(p + "/manifest.json", JSON.stringify(Array.from(files[testName])));
|
|
169
|
+
delete files[testName];
|
|
170
|
+
Promise.all(screenshots[testName] || []).then(() => {
|
|
171
|
+
delete screenshots[testName];
|
|
172
|
+
page.close();
|
|
173
|
+
});
|
|
174
|
+
// globalThis["writeFileSync"](
|
|
175
|
+
// p + "/manifest.json",
|
|
176
|
+
// // files.entries()
|
|
177
|
+
// JSON.stringify(Array.from(files[testName]))
|
|
178
|
+
// );
|
|
179
|
+
// console.log("closing doneFileStream2", doneFileStream2);
|
|
180
|
+
// console.log("closing doneFileStream2", doneFileStream2);
|
|
181
|
+
// Promise.all([...doneFileStream2, ...screenshots2]).then(() => {
|
|
182
|
+
// page.close();
|
|
183
|
+
// });
|
|
184
|
+
// Promise.all(screenshots).then(() => {
|
|
185
|
+
// page.close();
|
|
186
|
+
// });
|
|
187
|
+
// setTimeout(() => {
|
|
188
|
+
// console.log("Delayed for 1 second.");
|
|
189
|
+
// page.close();
|
|
190
|
+
// }, 5000);
|
|
191
|
+
// return page.close();
|
|
192
|
+
});
|
|
193
|
+
return page;
|
|
194
|
+
})
|
|
195
|
+
.then(async (page) => {
|
|
196
|
+
await page.goto(`file://${`${dest}.html`}`, {});
|
|
197
|
+
page.evaluate(evaluation).finally(() => {
|
|
198
|
+
console.log("evaluation failed.", dest);
|
|
199
|
+
});
|
|
200
|
+
return page;
|
|
201
|
+
});
|
|
202
|
+
};
|
|
203
|
+
this.server = {};
|
|
204
|
+
this.configs = configs;
|
|
205
|
+
this.ports = {};
|
|
206
|
+
this.configs.ports.forEach((element) => {
|
|
207
|
+
this.ports[element] = "true"; // set ports as open
|
|
208
|
+
});
|
|
209
|
+
globalThis["mkdirSync"] = (fp) => {
|
|
210
|
+
if (!fs.existsSync(fp)) {
|
|
211
|
+
return fs.mkdirSync(fp, {
|
|
212
|
+
recursive: true,
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
return false;
|
|
216
|
+
};
|
|
217
|
+
globalThis["writeFileSync"] = (filepath, contents, testName) => {
|
|
218
|
+
// Create directories if they don't exist
|
|
219
|
+
const dir = path.dirname(filepath.split("/").slice(0, -1).join("/"));
|
|
220
|
+
fs.mkdirSync(dir, {
|
|
221
|
+
recursive: true,
|
|
222
|
+
});
|
|
223
|
+
if (!files[testName]) {
|
|
224
|
+
files[testName] = new Set();
|
|
225
|
+
}
|
|
226
|
+
files[testName].add(filepath);
|
|
227
|
+
return fs.writeFileSync(filepath, contents);
|
|
228
|
+
};
|
|
229
|
+
globalThis["createWriteStream"] = (filepath, testName) => {
|
|
230
|
+
const f = fs.createWriteStream(filepath);
|
|
231
|
+
fileStreams3.push(f);
|
|
232
|
+
// files.add(filepath);
|
|
233
|
+
if (!files[testName]) {
|
|
234
|
+
files[testName] = new Set();
|
|
235
|
+
}
|
|
236
|
+
files[testName].add(filepath);
|
|
237
|
+
return Object.assign(Object.assign({}, JSON.parse(JSON.stringify(f))), { uid: fileStreams3.length - 1 });
|
|
238
|
+
};
|
|
239
|
+
globalThis["write"] = (uid, contents) => {
|
|
240
|
+
fileStreams3[uid].write(contents);
|
|
241
|
+
};
|
|
242
|
+
globalThis["end"] = (uid) => {
|
|
243
|
+
fileStreams3[uid].end();
|
|
244
|
+
};
|
|
245
|
+
globalThis["customclose"] = (p, testName) => {
|
|
246
|
+
if (!files[testName]) {
|
|
247
|
+
files[testName] = new Set();
|
|
248
|
+
}
|
|
249
|
+
fs.writeFileSync(p + "/manifest.json", JSON.stringify(Array.from(files[testName])));
|
|
250
|
+
delete files[testName];
|
|
251
|
+
// globalThis["writeFileSync"](
|
|
252
|
+
// p + "/manifest.json",
|
|
253
|
+
// // files.entries()
|
|
254
|
+
// JSON.stringify(Array.from(files[testName]))
|
|
255
|
+
// );
|
|
256
|
+
// fileStreams3[uid].end();
|
|
257
|
+
};
|
|
258
|
+
// page.exposeFunction("customclose", () => {
|
|
259
|
+
// console.log("closing doneFileStream2", doneFileStream2);
|
|
260
|
+
// // console.log("closing doneFileStream2", doneFileStream2);
|
|
261
|
+
// Promise.all([...doneFileStream2, ...screenshots2]).then(() => {
|
|
262
|
+
// page.close();
|
|
263
|
+
// });
|
|
264
|
+
// // page.close();
|
|
265
|
+
// // Promise.all(screenshots).then(() => {
|
|
266
|
+
// // page.close();
|
|
267
|
+
// // });
|
|
268
|
+
// // setTimeout(() => {
|
|
269
|
+
// // console.log("Delayed for 1 second.");
|
|
270
|
+
// // page.close();
|
|
271
|
+
// // }, 5000);
|
|
272
|
+
// // return page.close();
|
|
273
|
+
// });
|
|
274
|
+
}
|
|
275
|
+
async startPuppeteer(options, destfolder) {
|
|
276
|
+
this.browser = await puppeteer.launch(options);
|
|
277
|
+
return this.browser;
|
|
278
|
+
}
|
|
279
|
+
end(accessObject) {
|
|
280
|
+
throw new Error("Method not implemented.");
|
|
281
|
+
}
|
|
282
|
+
existsSync(destFolder) {
|
|
283
|
+
return fs.existsSync(destFolder);
|
|
284
|
+
}
|
|
285
|
+
async mkdirSync(fp) {
|
|
286
|
+
if (!fs.existsSync(fp)) {
|
|
287
|
+
return fs.mkdirSync(fp, {
|
|
288
|
+
recursive: true,
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
return false;
|
|
292
|
+
}
|
|
293
|
+
writeFileSync(fp, contents) {
|
|
294
|
+
fs.writeFileSync(fp, contents);
|
|
295
|
+
}
|
|
296
|
+
createWriteStream(filepath) {
|
|
297
|
+
return fs.createWriteStream(filepath);
|
|
298
|
+
}
|
|
299
|
+
testArtiFactoryfileWriter(tLog, callback) {
|
|
300
|
+
return (fPath, value) => {
|
|
301
|
+
callback(new Promise((res, rej) => {
|
|
302
|
+
tLog("testArtiFactory =>", fPath);
|
|
303
|
+
const cleanPath = path.resolve(fPath);
|
|
304
|
+
fPaths.push(cleanPath.replace(process.cwd(), ``));
|
|
305
|
+
const targetDir = cleanPath.split("/").slice(0, -1).join("/");
|
|
306
|
+
fs.mkdir(targetDir, { recursive: true }, async (error) => {
|
|
307
|
+
if (error) {
|
|
308
|
+
console.error(`❗️testArtiFactory failed`, targetDir, error);
|
|
309
|
+
}
|
|
310
|
+
fs.writeFileSync(path.resolve(targetDir.split("/").slice(0, -1).join("/"), "manifest"), fPaths.join(`\n`), {
|
|
311
|
+
encoding: "utf-8",
|
|
312
|
+
});
|
|
313
|
+
if (Buffer.isBuffer(value)) {
|
|
314
|
+
fs.writeFileSync(fPath, value, "binary");
|
|
315
|
+
res();
|
|
316
|
+
}
|
|
317
|
+
else if (`string` === typeof value) {
|
|
318
|
+
fs.writeFileSync(fPath, value.toString(), {
|
|
319
|
+
encoding: "utf-8",
|
|
320
|
+
});
|
|
321
|
+
res();
|
|
322
|
+
}
|
|
323
|
+
else {
|
|
324
|
+
/* @ts-ignore:next-line */
|
|
325
|
+
const pipeStream = value;
|
|
326
|
+
const myFile = fs.createWriteStream(fPath);
|
|
327
|
+
pipeStream.pipe(myFile);
|
|
328
|
+
pipeStream.on("close", () => {
|
|
329
|
+
myFile.close();
|
|
330
|
+
res();
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
});
|
|
334
|
+
}));
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
write(accessObject, contents) {
|
|
338
|
+
throw new Error("Method not implemented.");
|
|
339
|
+
}
|
|
340
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import puppeteer from "puppeteer-core";
|
|
4
|
+
import { PM } from "./index.js";
|
|
5
|
+
const fPaths = [];
|
|
6
|
+
export class PM_Node extends PM {
|
|
7
|
+
constructor(t) {
|
|
8
|
+
super();
|
|
9
|
+
this.server = {};
|
|
10
|
+
this.testResourceConfiguration = t;
|
|
11
|
+
}
|
|
12
|
+
existsSync(destFolder) {
|
|
13
|
+
return globalThis["existsSync"](this.testResourceConfiguration.fs + "/" + destFolder);
|
|
14
|
+
}
|
|
15
|
+
mkdirSync() {
|
|
16
|
+
return globalThis["mkdirSync"](this.testResourceConfiguration.fs + "/");
|
|
17
|
+
}
|
|
18
|
+
write(writeObject, contents) {
|
|
19
|
+
return globalThis["write"](writeObject.uid, contents);
|
|
20
|
+
}
|
|
21
|
+
writeFileSync(filepath, contents) {
|
|
22
|
+
return globalThis["writeFileSync"](this.testResourceConfiguration.fs + "/" + filepath, contents, this.testResourceConfiguration.name);
|
|
23
|
+
}
|
|
24
|
+
createWriteStream(filepath) {
|
|
25
|
+
return globalThis["createWriteStream"](this.testResourceConfiguration.fs + "/" + filepath, this.testResourceConfiguration.name);
|
|
26
|
+
}
|
|
27
|
+
end(writeObject) {
|
|
28
|
+
return globalThis["end"](writeObject.uid);
|
|
29
|
+
}
|
|
30
|
+
customclose() {
|
|
31
|
+
globalThis["customclose"](this.testResourceConfiguration.fs, this.testResourceConfiguration.name);
|
|
32
|
+
}
|
|
33
|
+
testArtiFactoryfileWriter(tLog, callback) {
|
|
34
|
+
return (fPath, value) => {
|
|
35
|
+
callback(new Promise((res, rej) => {
|
|
36
|
+
tLog("testArtiFactory =>", fPath);
|
|
37
|
+
const cleanPath = path.resolve(fPath);
|
|
38
|
+
fPaths.push(cleanPath.replace(process.cwd(), ``));
|
|
39
|
+
const targetDir = cleanPath.split("/").slice(0, -1).join("/");
|
|
40
|
+
fs.mkdir(targetDir, { recursive: true }, async (error) => {
|
|
41
|
+
if (error) {
|
|
42
|
+
console.error(`❗️testArtiFactory failed`, targetDir, error);
|
|
43
|
+
}
|
|
44
|
+
fs.writeFileSync(path.resolve(targetDir.split("/").slice(0, -1).join("/"), "manifest"), fPaths.join(`\n`), {
|
|
45
|
+
encoding: "utf-8",
|
|
46
|
+
});
|
|
47
|
+
if (Buffer.isBuffer(value)) {
|
|
48
|
+
fs.writeFileSync(fPath, value, "binary");
|
|
49
|
+
res();
|
|
50
|
+
}
|
|
51
|
+
else if (`string` === typeof value) {
|
|
52
|
+
fs.writeFileSync(fPath, value.toString(), {
|
|
53
|
+
encoding: "utf-8",
|
|
54
|
+
});
|
|
55
|
+
res();
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
/* @ts-ignore:next-line */
|
|
59
|
+
const pipeStream = value;
|
|
60
|
+
const myFile = fs.createWriteStream(fPath);
|
|
61
|
+
pipeStream.pipe(myFile);
|
|
62
|
+
pipeStream.on("close", () => {
|
|
63
|
+
myFile.close();
|
|
64
|
+
res();
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
}));
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
// launch(options?: PuppeteerLaunchOptions): Promise<Browser>;
|
|
72
|
+
startPuppeteer(options) {
|
|
73
|
+
return puppeteer.connect(options).then((b) => {
|
|
74
|
+
this.browser = b;
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import puppeteer from "puppeteer-core/lib/esm/puppeteer/puppeteer-core-browser.js";
|
|
2
|
+
import { PM } from "./index.js";
|
|
3
|
+
export class PM_Web extends PM {
|
|
4
|
+
constructor(t) {
|
|
5
|
+
super();
|
|
6
|
+
this.server = {};
|
|
7
|
+
this.testResourceConfiguration = t;
|
|
8
|
+
}
|
|
9
|
+
existsSync(destFolder) {
|
|
10
|
+
return window["existsSync"](destFolder);
|
|
11
|
+
}
|
|
12
|
+
mkdirSync() {
|
|
13
|
+
return window["mkdirSync"](this.testResourceConfiguration.fs + "/");
|
|
14
|
+
}
|
|
15
|
+
write(writeObject, contents) {
|
|
16
|
+
return window["write"](writeObject.uid, contents);
|
|
17
|
+
}
|
|
18
|
+
writeFileSync(filepath, contents) {
|
|
19
|
+
return window["writeFileSync"](this.testResourceConfiguration.fs + "/" + filepath, contents, this.testResourceConfiguration.name);
|
|
20
|
+
}
|
|
21
|
+
createWriteStream(filepath) {
|
|
22
|
+
return window["createWriteStream"](this.testResourceConfiguration.fs + "/" + filepath, this.testResourceConfiguration.name);
|
|
23
|
+
}
|
|
24
|
+
end(writeObject) {
|
|
25
|
+
return window["end"](writeObject.uid);
|
|
26
|
+
}
|
|
27
|
+
customclose() {
|
|
28
|
+
window["customclose"](this.testResourceConfiguration.fs, this.testResourceConfiguration.name);
|
|
29
|
+
}
|
|
30
|
+
testArtiFactoryfileWriter(tLog, callback) {
|
|
31
|
+
return (fPath, value) => {
|
|
32
|
+
callback(new Promise((res, rej) => {
|
|
33
|
+
tLog("testArtiFactory =>", fPath);
|
|
34
|
+
// const cleanPath = path.resolve(fPath);
|
|
35
|
+
// fPaths.push(cleanPath.replace(process.cwd(), ``));
|
|
36
|
+
// const targetDir = cleanPath.split("/").slice(0, -1).join("/");
|
|
37
|
+
// fs.mkdir(targetDir, { recursive: true }, async (error) => {
|
|
38
|
+
// if (error) {
|
|
39
|
+
// console.error(`❗️testArtiFactory failed`, targetDir, error);
|
|
40
|
+
// }
|
|
41
|
+
// fs.writeFileSync(
|
|
42
|
+
// path.resolve(
|
|
43
|
+
// targetDir.split("/").slice(0, -1).join("/"),
|
|
44
|
+
// "manifest"
|
|
45
|
+
// ),
|
|
46
|
+
// fPaths.join(`\n`),
|
|
47
|
+
// {
|
|
48
|
+
// encoding: "utf-8",
|
|
49
|
+
// }
|
|
50
|
+
// );
|
|
51
|
+
// if (Buffer.isBuffer(value)) {
|
|
52
|
+
// fs.writeFileSync(fPath, value, "binary");
|
|
53
|
+
// res();
|
|
54
|
+
// } else if (`string` === typeof value) {
|
|
55
|
+
// fs.writeFileSync(fPath, value.toString(), {
|
|
56
|
+
// encoding: "utf-8",
|
|
57
|
+
// });
|
|
58
|
+
// res();
|
|
59
|
+
// } else {
|
|
60
|
+
// /* @ts-ignore:next-line */
|
|
61
|
+
// const pipeStream: PassThrough = value;
|
|
62
|
+
// const myFile = fs.createWriteStream(fPath);
|
|
63
|
+
// pipeStream.pipe(myFile);
|
|
64
|
+
// pipeStream.on("close", () => {
|
|
65
|
+
// myFile.close();
|
|
66
|
+
// res();
|
|
67
|
+
// });
|
|
68
|
+
// }
|
|
69
|
+
// });
|
|
70
|
+
}));
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
startPuppeteer(options, destFolder) {
|
|
74
|
+
const name = this.testResourceConfiguration.name;
|
|
75
|
+
return fetch(`http://localhost:3234/json/version`)
|
|
76
|
+
.then((v) => {
|
|
77
|
+
return v.json();
|
|
78
|
+
})
|
|
79
|
+
.then((json) => {
|
|
80
|
+
return puppeteer
|
|
81
|
+
.connect({
|
|
82
|
+
browserWSEndpoint: json.webSocketDebuggerUrl,
|
|
83
|
+
})
|
|
84
|
+
.then((b) => {
|
|
85
|
+
this.browser = b;
|
|
86
|
+
const handler2 = {
|
|
87
|
+
get(target, prop, receiver) {
|
|
88
|
+
if (prop === "screenshot") {
|
|
89
|
+
return async (x) => {
|
|
90
|
+
return await window["custom-screenshot"](Object.assign(Object.assign({}, x), {
|
|
91
|
+
// path: destFolder + "/" + x.path,
|
|
92
|
+
path: x.path }), name);
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
else if (prop === "mainFrame") {
|
|
96
|
+
return () => target[prop](...arguments);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
return Reflect.get(...arguments);
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
const handler1 = {
|
|
104
|
+
get(target, prop, receiver) {
|
|
105
|
+
if (prop === "pages") {
|
|
106
|
+
return async () => {
|
|
107
|
+
return target.pages().then((pages) => {
|
|
108
|
+
return pages.map((p) => {
|
|
109
|
+
return new Proxy(p, handler2);
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
return Reflect.get(...arguments);
|
|
115
|
+
},
|
|
116
|
+
};
|
|
117
|
+
const proxy3 = new Proxy(this.browser, handler1);
|
|
118
|
+
this.browser = proxy3;
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
}
|