testeranto 0.75.0 → 0.79.3
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 +25 -24
- package/devBot.dockerfile +12 -0
- package/dist/common/Node.js +1 -0
- package/dist/common/PM/index.js +0 -64
- package/dist/common/PM/main.js +278 -7
- package/dist/common/PM/node.js +4 -0
- package/dist/common/PM/web.js +3 -0
- package/dist/common/Project.js +6 -2
- package/dist/common/Puppeteer.js +12 -17
- package/dist/common/Reporter.js +1 -8
- package/dist/common/SubPackages/react-dom/component/web.js +5 -25
- package/dist/common/SubPackages/react-dom/jsx/web.js +80 -55
- package/dist/common/SubPackages/react-test-renderer/component/index.js +0 -86
- package/dist/common/SubPackages/react-test-renderer/component/interface.js +68 -0
- package/dist/common/SubPackages/react-test-renderer/component/node.js +2 -2
- package/dist/common/SubPackages/react-test-renderer/component/web.js +2 -2
- package/dist/common/TaskManBackEnd.js +156 -0
- package/dist/common/Types.js +0 -2
- package/dist/common/esbuildConfigs/index.js +1 -0
- package/dist/common/esbuildConfigs/inputFilesPlugin.js +49 -0
- package/dist/common/esbuildConfigs/node.js +3 -1
- package/dist/common/esbuildConfigs/web.js +3 -1
- package/dist/common/lib/abstractBase.js +222 -17
- package/dist/common/lib/basebuilder.js +4 -38
- package/dist/common/lib/classBuilder.js +1 -3
- package/dist/common/lib/core.js +3 -5
- package/dist/common/mongooseSchemas.js +56 -0
- package/dist/common/tsconfig.common.tsbuildinfo +1 -1
- package/dist/common/utils.js +16 -0
- package/dist/module/ExampleTab.js +112 -0
- package/dist/module/Node.js +1 -0
- package/dist/module/PM/index.js +0 -64
- package/dist/module/PM/main.js +278 -7
- package/dist/module/PM/node.js +4 -0
- package/dist/module/PM/web.js +3 -0
- package/dist/module/Project.js +6 -2
- package/dist/module/Puppeteer.js +12 -17
- package/dist/module/Reporter.js +1 -8
- package/dist/module/SubPackages/react-dom/component/web.js +5 -25
- package/dist/module/SubPackages/react-dom/jsx/web.js +80 -55
- package/dist/module/SubPackages/react-test-renderer/component/index.js +1 -59
- package/dist/module/SubPackages/react-test-renderer/component/interface.js +39 -0
- package/dist/module/SubPackages/react-test-renderer/component/node.js +1 -1
- package/dist/module/SubPackages/react-test-renderer/component/web.js +1 -1
- package/dist/module/TaskManBackEnd.js +151 -0
- package/dist/module/TaskManFrontEnd.js +600 -0
- package/dist/module/Types.js +0 -2
- package/dist/module/esbuildConfigs/index.js +1 -0
- package/dist/module/esbuildConfigs/inputFilesPlugin.js +44 -0
- package/dist/module/esbuildConfigs/node.js +3 -1
- package/dist/module/esbuildConfigs/web.js +3 -1
- package/dist/module/lib/abstractBase.js +222 -17
- package/dist/module/lib/basebuilder.js +4 -38
- package/dist/module/lib/classBuilder.js +1 -3
- package/dist/module/lib/core.js +3 -5
- package/dist/module/mongooseSchemas.js +50 -0
- package/dist/module/tsconfig.module.tsbuildinfo +1 -1
- package/dist/module/utils.js +9 -0
- package/dist/prebuild/Report.js +117 -36
- package/dist/prebuild/TaskManBackEnd.mjs +185 -0
- package/dist/prebuild/TaskManFrontEnd.css +12301 -0
- package/dist/prebuild/TaskManFrontEnd.js +81737 -0
- package/dist/types/Node.d.ts +1 -1
- package/dist/types/PM/index.d.ts +2 -1
- package/dist/types/PM/main.d.ts +6 -3
- package/dist/types/PM/node.d.ts +2 -0
- package/dist/types/PM/web.d.ts +1 -0
- package/dist/types/SubPackages/puppeteer.d.ts +1 -1
- package/dist/types/SubPackages/react/component/node.d.ts +1 -1
- package/dist/types/SubPackages/react/component/web.d.ts +1 -1
- package/dist/types/SubPackages/react/jsx/node.d.ts +2 -2
- package/dist/types/SubPackages/react/jsx/web.d.ts +2 -2
- package/dist/types/SubPackages/react-dom/component/node.d.ts +2 -2
- package/dist/types/SubPackages/react-dom/component/web.d.ts +8 -2
- package/dist/types/SubPackages/react-dom/jsx/node.d.ts +2 -2
- package/dist/types/SubPackages/react-dom/jsx/web.d.ts +2 -2
- package/dist/types/SubPackages/react-test-renderer/MemoExoticComponent/node.d.ts +2 -2
- package/dist/types/SubPackages/react-test-renderer/component/index.d.ts +0 -7
- package/dist/types/SubPackages/react-test-renderer/component/interface.d.ts +9 -0
- package/dist/types/SubPackages/react-test-renderer/component/node.d.ts +1 -2
- package/dist/types/SubPackages/react-test-renderer/component/web.d.ts +1 -2
- package/dist/types/SubPackages/react-test-renderer/fc/node.d.ts +1 -1
- package/dist/types/SubPackages/react-test-renderer/fc/web.d.ts +1 -1
- package/dist/types/SubPackages/react-test-renderer/jsx/node.d.ts +1 -2
- package/dist/types/SubPackages/react-test-renderer/jsx/web.d.ts +1 -2
- package/dist/types/SubPackages/react-test-renderer/jsx-promised/node.d.ts +1 -2
- package/dist/types/SubPackages/react-test-renderer/jsx-promised/web.d.ts +1 -2
- package/dist/types/TaskManBackEnd.d.ts +1 -0
- package/dist/types/Types.d.ts +19 -19
- package/dist/types/Web.d.ts +1 -1
- package/dist/types/esbuildConfigs/inputFilesPlugin.d.ts +5 -0
- package/dist/types/lib/abstractBase.d.ts +8 -8
- package/dist/types/lib/basebuilder.d.ts +1 -1
- package/dist/types/lib/classBuilder.d.ts +1 -1
- package/dist/types/lib/core.d.ts +1 -1
- package/dist/types/lib/index.d.ts +5 -5
- package/dist/types/lib/types.d.ts +15 -13
- package/dist/types/mongooseSchemas.d.ts +124 -0
- package/dist/types/tsconfig.types.tsbuildinfo +1 -1
- package/dist/types/utils.d.ts +2 -0
- package/docker-compose-dev.yml +9 -0
- package/docker-compose-prod.yml +18 -0
- package/package.json +20 -7
- package/src/ExampleTab.tsx +219 -0
- package/src/Node.ts +31 -2
- package/src/PM/index.ts +6 -83
- package/src/PM/main.ts +389 -11
- package/src/PM/node.ts +6 -0
- package/src/PM/web.ts +4 -0
- package/src/Project.ts +10 -2
- package/src/Puppeteer.ts +16 -17
- package/src/Report.tsx +17 -40
- package/src/Reporter.ts +1 -9
- package/src/SubPackages/react-dom/component/web.ts +10 -30
- package/src/SubPackages/react-dom/jsx/web.ts +111 -74
- package/src/SubPackages/react-test-renderer/component/index.ts +0 -66
- package/src/SubPackages/react-test-renderer/component/interface.ts +48 -0
- package/src/SubPackages/react-test-renderer/component/node.ts +2 -1
- package/src/SubPackages/react-test-renderer/component/web.ts +2 -1
- package/src/TaskManBackEnd.ts +200 -0
- package/src/TaskManFrontEnd.tsx +1222 -0
- package/src/Types.ts +136 -28
- package/src/Web.ts +32 -2
- package/src/esbuildConfigs/index.ts +1 -0
- package/src/esbuildConfigs/inputFilesPlugin.ts +65 -0
- package/src/esbuildConfigs/node.ts +3 -1
- package/src/esbuildConfigs/web.ts +4 -0
- package/src/lib/abstractBase.ts +337 -34
- package/src/lib/basebuilder.ts +17 -52
- package/src/lib/classBuilder.ts +14 -2
- package/src/lib/core.ts +18 -7
- package/src/lib/index.ts +115 -7
- package/src/lib/types.ts +143 -35
- package/src/mongooseSchemas.ts +105 -0
- package/src/utils.ts +15 -0
- package/yarn-error.log +3144 -0
package/src/PM/main.ts
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import fs from "fs";
|
|
2
2
|
import path from "path";
|
|
3
|
-
import puppeteer, { ScreenshotOptions } from "puppeteer-core";
|
|
3
|
+
import puppeteer, { Page, ScreenshotOptions } from "puppeteer-core";
|
|
4
4
|
import { PassThrough } from "stream";
|
|
5
5
|
|
|
6
|
-
import {
|
|
7
|
-
import { IBuiltConfig } from "../lib/types";
|
|
6
|
+
import { IBuiltConfig, ITestTypes } from "../lib/types";
|
|
8
7
|
|
|
9
8
|
import { PM } from "./index.js";
|
|
9
|
+
import { destinationOfRuntime } from "../utils.js";
|
|
10
|
+
import { ITLog } from "../lib/index.js";
|
|
10
11
|
|
|
11
12
|
type IFPaths = string[];
|
|
12
13
|
|
|
@@ -16,6 +17,9 @@ const files: Record<string, Set<string>> = {}; // = new Set<string>();
|
|
|
16
17
|
const screenshots: Record<string, Promise<Uint8Array>[]> = {};
|
|
17
18
|
|
|
18
19
|
export class PM_Main extends PM {
|
|
20
|
+
customScreenShot(opts: object) {
|
|
21
|
+
throw new Error("Method not implemented.");
|
|
22
|
+
}
|
|
19
23
|
configs: IBuiltConfig;
|
|
20
24
|
ports: Record<number, boolean>;
|
|
21
25
|
queue: any[];
|
|
@@ -43,6 +47,8 @@ export class PM_Main extends PM {
|
|
|
43
47
|
contents: string,
|
|
44
48
|
testName: string
|
|
45
49
|
) => {
|
|
50
|
+
console.log("globalThis-writeFileSync", filepath);
|
|
51
|
+
|
|
46
52
|
// Create directories if they don't exist
|
|
47
53
|
const dir = path.dirname(filepath.split("/").slice(0, -1).join("/"));
|
|
48
54
|
|
|
@@ -78,6 +84,46 @@ export class PM_Main extends PM {
|
|
|
78
84
|
fileStreams3[uid].end();
|
|
79
85
|
};
|
|
80
86
|
|
|
87
|
+
globalThis["customScreenShot"] = async (
|
|
88
|
+
opts: { path: string },
|
|
89
|
+
page: Page
|
|
90
|
+
) => {
|
|
91
|
+
// // fileStreams3[uid].write(contents);
|
|
92
|
+
// // console.log("asd", opts.path.split("/").slice(0, -1).join("/"));
|
|
93
|
+
|
|
94
|
+
// // const dir = path.dirname(opts.path.split("/").slice(0, -1).join("/"));
|
|
95
|
+
// // console.log("dir", dir);
|
|
96
|
+
// fs.mkdirSync(opts.path.split("/").slice(0, -1).join("/"), {
|
|
97
|
+
// recursive: true,
|
|
98
|
+
// });
|
|
99
|
+
|
|
100
|
+
// return page.screenshot(opts);
|
|
101
|
+
|
|
102
|
+
console.log("main.ts node custom-screenshot", page);
|
|
103
|
+
const p = opts.path as string;
|
|
104
|
+
const dir = path.dirname(p);
|
|
105
|
+
fs.mkdirSync(dir, {
|
|
106
|
+
recursive: true,
|
|
107
|
+
});
|
|
108
|
+
if (!files[opts.path]) {
|
|
109
|
+
files[opts.path] = new Set();
|
|
110
|
+
}
|
|
111
|
+
files[opts.path].add(opts.path as string);
|
|
112
|
+
|
|
113
|
+
const sPromise = page.screenshot({
|
|
114
|
+
...opts,
|
|
115
|
+
path: p,
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
if (!screenshots[opts.path]) {
|
|
119
|
+
screenshots[opts.path] = [];
|
|
120
|
+
}
|
|
121
|
+
screenshots[opts.path].push(sPromise);
|
|
122
|
+
|
|
123
|
+
await sPromise;
|
|
124
|
+
return sPromise;
|
|
125
|
+
};
|
|
126
|
+
|
|
81
127
|
globalThis["customclose"] = (p: string, testName: string) => {
|
|
82
128
|
if (!files[testName]) {
|
|
83
129
|
files[testName] = new Set();
|
|
@@ -151,9 +197,11 @@ export class PM_Main extends PM {
|
|
|
151
197
|
const openPorts = Object.entries(this.ports).filter(
|
|
152
198
|
([portnumber, portopen]) => portopen
|
|
153
199
|
);
|
|
200
|
+
console.log("openPorts", openPorts);
|
|
154
201
|
if (openPorts.length >= testConfigResource.ports) {
|
|
155
202
|
for (let i = 0; i < testConfigResource.ports; i++) {
|
|
156
203
|
portsToUse.push(openPorts[i][0]);
|
|
204
|
+
|
|
157
205
|
this.ports[openPorts[i][0]] = false; // port is now closed
|
|
158
206
|
}
|
|
159
207
|
|
|
@@ -162,7 +210,7 @@ export class PM_Main extends PM {
|
|
|
162
210
|
name: src,
|
|
163
211
|
// ports: [3333],
|
|
164
212
|
ports: portsToUse,
|
|
165
|
-
fs:
|
|
213
|
+
fs: destFolder,
|
|
166
214
|
browserWSEndpoint: this.browser.wsEndpoint(),
|
|
167
215
|
});
|
|
168
216
|
} else {
|
|
@@ -176,6 +224,26 @@ export class PM_Main extends PM {
|
|
|
176
224
|
|
|
177
225
|
const builtfile = dest + ".mjs";
|
|
178
226
|
|
|
227
|
+
await Promise.all(
|
|
228
|
+
testConfig[3].map((sidecar) => {
|
|
229
|
+
if (sidecar[1] === "web") {
|
|
230
|
+
return this.launchWebSideCar(
|
|
231
|
+
sidecar[0],
|
|
232
|
+
destinationOfRuntime(sidecar[0], "web", this.configs),
|
|
233
|
+
sidecar
|
|
234
|
+
);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
if (sidecar[1] === "node") {
|
|
238
|
+
return this.launchNodeSideCar(
|
|
239
|
+
sidecar[0],
|
|
240
|
+
destinationOfRuntime(sidecar[0], "node", this.configs),
|
|
241
|
+
sidecar
|
|
242
|
+
);
|
|
243
|
+
}
|
|
244
|
+
})
|
|
245
|
+
);
|
|
246
|
+
|
|
179
247
|
this.server[builtfile] = await import(
|
|
180
248
|
`${builtfile}?cacheBust=${Date.now()}`
|
|
181
249
|
).then((module) => {
|
|
@@ -184,6 +252,7 @@ export class PM_Main extends PM {
|
|
|
184
252
|
.receiveTestResourceConfig(argz)
|
|
185
253
|
.then((x) => {
|
|
186
254
|
console.log("then", x);
|
|
255
|
+
|
|
187
256
|
return x;
|
|
188
257
|
})
|
|
189
258
|
.catch((e) => {
|
|
@@ -192,14 +261,309 @@ export class PM_Main extends PM {
|
|
|
192
261
|
});
|
|
193
262
|
});
|
|
194
263
|
|
|
264
|
+
console.log("portsToUse", portsToUse);
|
|
265
|
+
for (let i = 0; i <= portsToUse.length; i++) {
|
|
266
|
+
if (portsToUse[i]) {
|
|
267
|
+
this.ports[portsToUse[i]] = "true"; //port is open again
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
};
|
|
271
|
+
|
|
272
|
+
launchWebSideCar = async (
|
|
273
|
+
src: string,
|
|
274
|
+
dest: string,
|
|
275
|
+
testConfig: ITestTypes
|
|
276
|
+
) => {
|
|
277
|
+
const d = dest + ".mjs";
|
|
278
|
+
console.log("launchWebSideCar", src, dest, d);
|
|
279
|
+
const destFolder = dest.replace(".mjs", "");
|
|
280
|
+
const webArgz = JSON.stringify({
|
|
281
|
+
name: dest,
|
|
282
|
+
ports: [].toString(),
|
|
283
|
+
fs: destFolder,
|
|
284
|
+
browserWSEndpoint: this.browser.wsEndpoint(),
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
const evaluation = `
|
|
288
|
+
console.log("importing ${dest}.mjs");
|
|
289
|
+
import('${dest}.mjs').then(async (x) => {
|
|
290
|
+
console.log("imported", x.default);
|
|
291
|
+
})`;
|
|
292
|
+
|
|
293
|
+
const fileStreams2: fs.WriteStream[] = [];
|
|
294
|
+
const doneFileStream2: Promise<any>[] = [];
|
|
295
|
+
|
|
296
|
+
return new Promise((res, rej) => {
|
|
297
|
+
this.browser
|
|
298
|
+
.newPage()
|
|
299
|
+
.then((page) => {
|
|
300
|
+
page.on("console", (msg) => {
|
|
301
|
+
console.log("web > ", msg.args(), msg.text());
|
|
302
|
+
// for (let i = 0; i < msg._args.length; ++i)
|
|
303
|
+
// console.log(`${i}: ${msg._args[i]}`);
|
|
304
|
+
});
|
|
305
|
+
|
|
306
|
+
page.exposeFunction(
|
|
307
|
+
"custom-screenshot",
|
|
308
|
+
async (ssOpts: ScreenshotOptions, testName: string) => {
|
|
309
|
+
console.log("main.ts browser custom-screenshot", testName);
|
|
310
|
+
const p = ssOpts.path as string;
|
|
311
|
+
const dir = path.dirname(p);
|
|
312
|
+
fs.mkdirSync(dir, {
|
|
313
|
+
recursive: true,
|
|
314
|
+
});
|
|
315
|
+
files[testName].add(ssOpts.path as string);
|
|
316
|
+
|
|
317
|
+
const sPromise = page.screenshot({
|
|
318
|
+
...ssOpts,
|
|
319
|
+
path: p,
|
|
320
|
+
});
|
|
321
|
+
|
|
322
|
+
if (!screenshots[testName]) {
|
|
323
|
+
screenshots[testName] = [];
|
|
324
|
+
}
|
|
325
|
+
screenshots[testName].push(sPromise);
|
|
326
|
+
// sPromise.then(())
|
|
327
|
+
await sPromise;
|
|
328
|
+
return sPromise;
|
|
329
|
+
// page.evaluate(`window["screenshot done"]`);
|
|
330
|
+
}
|
|
331
|
+
);
|
|
332
|
+
|
|
333
|
+
page.exposeFunction(
|
|
334
|
+
"writeFileSync",
|
|
335
|
+
(fp: string, contents: string, testName: string) => {
|
|
336
|
+
const dir = path.dirname(fp);
|
|
337
|
+
|
|
338
|
+
fs.mkdirSync(dir, {
|
|
339
|
+
recursive: true,
|
|
340
|
+
});
|
|
341
|
+
|
|
342
|
+
const p = new Promise<string>(async (res, rej) => {
|
|
343
|
+
fs.writeFileSync(fp, contents);
|
|
344
|
+
res(fp);
|
|
345
|
+
});
|
|
346
|
+
doneFileStream2.push(p);
|
|
347
|
+
|
|
348
|
+
if (!files[testName]) {
|
|
349
|
+
files[testName] = new Set();
|
|
350
|
+
}
|
|
351
|
+
files[testName].add(fp);
|
|
352
|
+
return p;
|
|
353
|
+
}
|
|
354
|
+
);
|
|
355
|
+
|
|
356
|
+
page.exposeFunction("existsSync", (fp: string, contents: string) => {
|
|
357
|
+
return fs.existsSync(fp);
|
|
358
|
+
});
|
|
359
|
+
|
|
360
|
+
page.exposeFunction("mkdirSync", (fp: string) => {
|
|
361
|
+
if (!fs.existsSync(fp)) {
|
|
362
|
+
return fs.mkdirSync(fp, {
|
|
363
|
+
recursive: true,
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
return false;
|
|
367
|
+
});
|
|
368
|
+
|
|
369
|
+
page.exposeFunction(
|
|
370
|
+
"createWriteStream",
|
|
371
|
+
(fp: string, testName: string) => {
|
|
372
|
+
const f = fs.createWriteStream(fp);
|
|
373
|
+
|
|
374
|
+
if (!files[testName]) {
|
|
375
|
+
files[testName] = new Set();
|
|
376
|
+
}
|
|
377
|
+
files[testName].add(fp);
|
|
378
|
+
|
|
379
|
+
const p = new Promise<string>((res, rej) => {
|
|
380
|
+
res(fp);
|
|
381
|
+
});
|
|
382
|
+
doneFileStream2.push(p);
|
|
383
|
+
f.on("close", async () => {
|
|
384
|
+
await p;
|
|
385
|
+
});
|
|
386
|
+
fileStreams2.push(f);
|
|
387
|
+
return {
|
|
388
|
+
...JSON.parse(JSON.stringify(f)),
|
|
389
|
+
uid: fileStreams2.length - 1,
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
);
|
|
393
|
+
|
|
394
|
+
page.exposeFunction(
|
|
395
|
+
"write",
|
|
396
|
+
async (uid: number, contents: string) => {
|
|
397
|
+
return fileStreams2[uid].write(contents);
|
|
398
|
+
}
|
|
399
|
+
);
|
|
400
|
+
|
|
401
|
+
page.exposeFunction("end", async (uid: number) => {
|
|
402
|
+
return fileStreams2[uid].end();
|
|
403
|
+
});
|
|
404
|
+
|
|
405
|
+
page.exposeFunction("customclose", (p: string, testName: string) => {
|
|
406
|
+
fs.writeFileSync(
|
|
407
|
+
p + "/manifest.json",
|
|
408
|
+
JSON.stringify(Array.from(files[testName]))
|
|
409
|
+
);
|
|
410
|
+
delete files[testName];
|
|
411
|
+
|
|
412
|
+
Promise.all(screenshots[testName] || []).then(() => {
|
|
413
|
+
delete screenshots[testName];
|
|
414
|
+
page.close();
|
|
415
|
+
});
|
|
416
|
+
|
|
417
|
+
// globalThis["writeFileSync"](
|
|
418
|
+
// p + "/manifest.json",
|
|
419
|
+
// // files.entries()
|
|
420
|
+
// JSON.stringify(Array.from(files[testName]))
|
|
421
|
+
// );
|
|
422
|
+
|
|
423
|
+
// console.log("closing doneFileStream2", doneFileStream2);
|
|
424
|
+
// console.log("closing doneFileStream2", doneFileStream2);
|
|
425
|
+
// Promise.all([...doneFileStream2, ...screenshots2]).then(() => {
|
|
426
|
+
// page.close();
|
|
427
|
+
// });
|
|
428
|
+
|
|
429
|
+
// Promise.all(screenshots).then(() => {
|
|
430
|
+
// page.close();
|
|
431
|
+
// });
|
|
432
|
+
// setTimeout(() => {
|
|
433
|
+
// console.log("Delayed for 1 second.");
|
|
434
|
+
// page.close();
|
|
435
|
+
// }, 5000);
|
|
436
|
+
|
|
437
|
+
// return page.close();
|
|
438
|
+
});
|
|
439
|
+
|
|
440
|
+
return page;
|
|
441
|
+
})
|
|
442
|
+
.then(async (page) => {
|
|
443
|
+
page.on("console", (log) =>
|
|
444
|
+
console.debug(`Log from client: [${log.text()}] `)
|
|
445
|
+
);
|
|
446
|
+
await page.goto(`file://${`${dest}.html`}`, {});
|
|
447
|
+
res(page);
|
|
448
|
+
|
|
449
|
+
// page.evaluate(evaluation).finally(() => {
|
|
450
|
+
// console.log("evaluation failed.", dest);
|
|
451
|
+
// });
|
|
452
|
+
|
|
453
|
+
// return page;
|
|
454
|
+
});
|
|
455
|
+
});
|
|
456
|
+
};
|
|
457
|
+
|
|
458
|
+
// launchNodeSideCar = async (src: string, dest: string) => {};
|
|
459
|
+
launchNodeSideCar = async (
|
|
460
|
+
src: string,
|
|
461
|
+
dest: string,
|
|
462
|
+
testConfig: ITestTypes
|
|
463
|
+
) => {
|
|
464
|
+
const d = dest + ".mjs";
|
|
465
|
+
console.log("launchNodeSideCar", src, dest, d);
|
|
466
|
+
|
|
467
|
+
const destFolder = dest.replace(".mjs", "");
|
|
468
|
+
|
|
469
|
+
let argz = "";
|
|
470
|
+
|
|
471
|
+
// const testConfig = this.configs.tests.find((t) => {
|
|
472
|
+
// return t[0] === src;
|
|
473
|
+
// });
|
|
474
|
+
|
|
475
|
+
// if (!testConfig) {
|
|
476
|
+
// console.error("missing test config");
|
|
477
|
+
// process.exit(-1);
|
|
478
|
+
// }
|
|
479
|
+
const testConfigResource = testConfig[2];
|
|
480
|
+
|
|
481
|
+
let portsToUse: string[] = [];
|
|
482
|
+
if (testConfigResource.ports === 0) {
|
|
483
|
+
argz = JSON.stringify({
|
|
484
|
+
scheduled: true,
|
|
485
|
+
name: src,
|
|
486
|
+
ports: portsToUse,
|
|
487
|
+
fs: destFolder,
|
|
488
|
+
browserWSEndpoint: this.browser.wsEndpoint(),
|
|
489
|
+
});
|
|
490
|
+
} else if (testConfigResource.ports > 0) {
|
|
491
|
+
const openPorts = Object.entries(this.ports).filter(
|
|
492
|
+
([portnumber, portopen]) => portopen
|
|
493
|
+
);
|
|
494
|
+
console.log("openPorts", openPorts);
|
|
495
|
+
if (openPorts.length >= testConfigResource.ports) {
|
|
496
|
+
for (let i = 0; i < testConfigResource.ports; i++) {
|
|
497
|
+
portsToUse.push(openPorts[i][0]);
|
|
498
|
+
|
|
499
|
+
this.ports[openPorts[i][0]] = false; // port is now closed
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
argz = JSON.stringify({
|
|
503
|
+
scheduled: true,
|
|
504
|
+
name: src,
|
|
505
|
+
// ports: [3333],
|
|
506
|
+
ports: portsToUse,
|
|
507
|
+
fs: ".",
|
|
508
|
+
browserWSEndpoint: this.browser.wsEndpoint(),
|
|
509
|
+
});
|
|
510
|
+
} else {
|
|
511
|
+
this.queue.push(src);
|
|
512
|
+
return;
|
|
513
|
+
}
|
|
514
|
+
} else {
|
|
515
|
+
console.error("negative port makes no sense", src);
|
|
516
|
+
process.exit(-1);
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
const builtfile = dest + ".mjs";
|
|
520
|
+
|
|
521
|
+
// console.log(
|
|
522
|
+
// "node builtfile",
|
|
523
|
+
// (await import(`${builtfile}?cacheBust=${Date.now()}`)).default
|
|
524
|
+
// );
|
|
525
|
+
this.server[builtfile] = await import(
|
|
526
|
+
`${builtfile}?cacheBust=${Date.now()}`
|
|
527
|
+
).then((module) => {
|
|
528
|
+
return module.default.then((defaultModule) => {
|
|
529
|
+
console.log("defaultModule", defaultModule);
|
|
530
|
+
const s = new defaultModule();
|
|
531
|
+
s.receiveTestResourceConfig(argz);
|
|
532
|
+
// Object.create(defaultModule);
|
|
533
|
+
|
|
534
|
+
// defaultModule
|
|
535
|
+
// .receiveTestResourceConfig(argz)
|
|
536
|
+
// .then((x) => {
|
|
537
|
+
// console.log("then", x);
|
|
538
|
+
// return x;
|
|
539
|
+
// })
|
|
540
|
+
// .catch((e) => {
|
|
541
|
+
// console.log("catch", e);
|
|
542
|
+
// });
|
|
543
|
+
});
|
|
544
|
+
});
|
|
545
|
+
|
|
546
|
+
console.log("portsToUse", portsToUse);
|
|
195
547
|
for (let i = 0; i <= portsToUse.length; i++) {
|
|
196
|
-
|
|
548
|
+
if (portsToUse[i]) {
|
|
549
|
+
this.ports[portsToUse[i]] = "true"; //port is open again
|
|
550
|
+
}
|
|
197
551
|
}
|
|
198
552
|
};
|
|
199
553
|
|
|
200
|
-
launchWeb = (t: string, dest: string) => {
|
|
554
|
+
launchWeb = (t: string, dest: string, sidecars: ITestTypes[]) => {
|
|
201
555
|
console.log("launchWeb", t, dest);
|
|
202
556
|
|
|
557
|
+
sidecars.map((sidecar) => {
|
|
558
|
+
if (sidecar[1] === "node") {
|
|
559
|
+
return this.launchNodeSideCar(
|
|
560
|
+
sidecar[0],
|
|
561
|
+
destinationOfRuntime(sidecar[0], "node", this.configs),
|
|
562
|
+
sidecar
|
|
563
|
+
);
|
|
564
|
+
}
|
|
565
|
+
});
|
|
566
|
+
|
|
203
567
|
const destFolder = dest.replace(".mjs", "");
|
|
204
568
|
|
|
205
569
|
const webArgz = JSON.stringify({
|
|
@@ -209,8 +573,10 @@ export class PM_Main extends PM {
|
|
|
209
573
|
browserWSEndpoint: this.browser.wsEndpoint(),
|
|
210
574
|
});
|
|
211
575
|
|
|
212
|
-
const evaluation = `
|
|
213
|
-
|
|
576
|
+
const evaluation = `
|
|
577
|
+
console.log("importing ${dest}.mjs");
|
|
578
|
+
import('${dest}.mjs').then(async (x) => {
|
|
579
|
+
console.log("imported", x.default);
|
|
214
580
|
try {
|
|
215
581
|
await (await x.default).receiveTestResourceConfig(${webArgz})
|
|
216
582
|
} catch (e) {
|
|
@@ -219,15 +585,19 @@ export class PM_Main extends PM {
|
|
|
219
585
|
})`;
|
|
220
586
|
|
|
221
587
|
const fileStreams2: fs.WriteStream[] = [];
|
|
222
|
-
|
|
223
|
-
// const screenshots2: Promise<any>[] = [];
|
|
224
588
|
const doneFileStream2: Promise<any>[] = [];
|
|
225
589
|
|
|
226
590
|
this.browser
|
|
227
591
|
.newPage()
|
|
228
592
|
.then((page) => {
|
|
593
|
+
page.on("console", (msg) => {
|
|
594
|
+
console.log("web > ", msg.args(), msg.text());
|
|
595
|
+
// for (let i = 0; i < msg._args.length; ++i)
|
|
596
|
+
// console.log(`${i}: ${msg._args[i]}`);
|
|
597
|
+
});
|
|
598
|
+
|
|
229
599
|
page.exposeFunction(
|
|
230
|
-
"
|
|
600
|
+
"customScreenShot",
|
|
231
601
|
async (ssOpts: ScreenshotOptions, testName: string) => {
|
|
232
602
|
console.log("main.ts browser custom-screenshot", testName);
|
|
233
603
|
const p = ssOpts.path as string;
|
|
@@ -235,6 +605,9 @@ export class PM_Main extends PM {
|
|
|
235
605
|
fs.mkdirSync(dir, {
|
|
236
606
|
recursive: true,
|
|
237
607
|
});
|
|
608
|
+
if (!files[testName]) {
|
|
609
|
+
files[testName] = new Set();
|
|
610
|
+
}
|
|
238
611
|
files[testName].add(ssOpts.path as string);
|
|
239
612
|
|
|
240
613
|
const sPromise = page.screenshot({
|
|
@@ -323,6 +696,8 @@ export class PM_Main extends PM {
|
|
|
323
696
|
});
|
|
324
697
|
|
|
325
698
|
page.exposeFunction("customclose", (p: string, testName: string) => {
|
|
699
|
+
console.log("\t closing", p);
|
|
700
|
+
|
|
326
701
|
fs.writeFileSync(
|
|
327
702
|
p + "/manifest.json",
|
|
328
703
|
JSON.stringify(Array.from(files[testName]))
|
|
@@ -360,6 +735,9 @@ export class PM_Main extends PM {
|
|
|
360
735
|
return page;
|
|
361
736
|
})
|
|
362
737
|
.then(async (page) => {
|
|
738
|
+
page.on("console", (log) =>
|
|
739
|
+
console.debug(`Log from client: [${log.text()}] `)
|
|
740
|
+
);
|
|
363
741
|
await page.goto(`file://${`${dest}.html`}`, {});
|
|
364
742
|
|
|
365
743
|
page.evaluate(evaluation).finally(() => {
|
package/src/PM/node.ts
CHANGED
|
@@ -6,6 +6,7 @@ import { PassThrough } from "stream";
|
|
|
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
10
|
|
|
10
11
|
type IFPaths = string[];
|
|
11
12
|
const fPaths: IFPaths = [];
|
|
@@ -22,6 +23,10 @@ export class PM_Node extends PM {
|
|
|
22
23
|
this.testResourceConfiguration = t;
|
|
23
24
|
}
|
|
24
25
|
|
|
26
|
+
customScreenShot(opts: object, page: Page) {
|
|
27
|
+
return globalThis["customScreenShot"](opts, page);
|
|
28
|
+
}
|
|
29
|
+
|
|
25
30
|
existsSync(destFolder: string): boolean {
|
|
26
31
|
return globalThis["existsSync"](
|
|
27
32
|
this.testResourceConfiguration.fs + "/" + destFolder
|
|
@@ -37,6 +42,7 @@ export class PM_Node extends PM {
|
|
|
37
42
|
}
|
|
38
43
|
|
|
39
44
|
writeFileSync(filepath: string, contents: string) {
|
|
45
|
+
console.log("pm_node-writeFileSync", this.testResourceConfiguration);
|
|
40
46
|
return globalThis["writeFileSync"](
|
|
41
47
|
this.testResourceConfiguration.fs + "/" + filepath,
|
|
42
48
|
contents,
|
package/src/PM/web.ts
CHANGED
package/src/Project.ts
CHANGED
|
@@ -109,6 +109,13 @@ export class ITProject {
|
|
|
109
109
|
|
|
110
110
|
const [nodeEntryPoints, webEntryPoints] = getRunnables(this.config.tests);
|
|
111
111
|
|
|
112
|
+
console.log(
|
|
113
|
+
`this.getSecondaryEndpointsPoints("web")`,
|
|
114
|
+
this.getSecondaryEndpointsPoints("web")
|
|
115
|
+
);
|
|
116
|
+
// console.log("nodeEntryPoints", nodeEntryPoints);
|
|
117
|
+
// console.log("webEntryPoints", webEntryPoints);
|
|
118
|
+
|
|
112
119
|
// nodeEntryPoints.forEach((nep) => {
|
|
113
120
|
// const f = `${process.cwd()}/${nep}`;
|
|
114
121
|
// console.log("nep", f);
|
|
@@ -208,11 +215,12 @@ export class ITProject {
|
|
|
208
215
|
public getSecondaryEndpointsPoints(runtime?: IRunTime): string[] {
|
|
209
216
|
const meta = (ts: ITestTypes[], st: Set<string>): Set<string> => {
|
|
210
217
|
ts.forEach((t) => {
|
|
218
|
+
console.log("getSecondaryEndpointsPoints", t);
|
|
211
219
|
if (t[1] === runtime) {
|
|
212
220
|
st.add(t[0]);
|
|
213
221
|
}
|
|
214
|
-
if (Array.isArray(t[
|
|
215
|
-
meta(t[
|
|
222
|
+
if (Array.isArray(t[3])) {
|
|
223
|
+
meta(t[3], st);
|
|
216
224
|
}
|
|
217
225
|
});
|
|
218
226
|
return st;
|
package/src/Puppeteer.ts
CHANGED
|
@@ -7,6 +7,7 @@ import { v4 as uuidv4 } from "uuid";
|
|
|
7
7
|
import { IBuiltConfig, IRunTime } from "./lib/types";
|
|
8
8
|
|
|
9
9
|
import { PM_Main } from "./PM/main.js";
|
|
10
|
+
import { destinationOfRuntime } from "./utils.js";
|
|
10
11
|
|
|
11
12
|
var mode: "DEV" | "PROD" = process.argv[2] === "-dev" ? "DEV" : "PROD";
|
|
12
13
|
|
|
@@ -36,18 +37,20 @@ const main = async () => {
|
|
|
36
37
|
waitForInitialPage: false,
|
|
37
38
|
executablePath: "/opt/homebrew/bin/chromium",
|
|
38
39
|
headless: true,
|
|
39
|
-
dumpio: true,
|
|
40
|
+
// dumpio: true,
|
|
40
41
|
args: [
|
|
42
|
+
"--disable-features=IsolateOrigins,site-per-process",
|
|
43
|
+
"--disable-site-isolation-trials",
|
|
44
|
+
"--allow-insecure-localhost",
|
|
41
45
|
"--allow-file-access-from-files",
|
|
42
46
|
"--allow-running-insecure-content",
|
|
43
|
-
"--auto-open-devtools-for-tabs",
|
|
47
|
+
// "--auto-open-devtools-for-tabs",
|
|
44
48
|
"--disable-dev-shm-usage",
|
|
45
49
|
"--disable-extensions",
|
|
46
50
|
"--disable-gpu",
|
|
47
51
|
"--disable-setuid-sandbox",
|
|
48
52
|
"--disable-site-isolation-trials",
|
|
49
53
|
"--disable-web-security",
|
|
50
|
-
"--disable-web-security",
|
|
51
54
|
"--no-first-run",
|
|
52
55
|
"--no-sandbox",
|
|
53
56
|
"--no-startup-window",
|
|
@@ -70,19 +73,11 @@ const main = async () => {
|
|
|
70
73
|
"."
|
|
71
74
|
);
|
|
72
75
|
|
|
73
|
-
|
|
74
|
-
return path
|
|
75
|
-
.normalize(`${configs.buildDir}/${r}/${f}`)
|
|
76
|
-
.split(".")
|
|
77
|
-
.slice(0, -1)
|
|
78
|
-
.join(".");
|
|
79
|
-
};
|
|
80
|
-
|
|
81
|
-
configs.tests.forEach(([test, runtime, secondaryArtifacts]) => {
|
|
76
|
+
configs.tests.forEach(([test, runtime, tr, sidecars]) => {
|
|
82
77
|
if (runtime === "node") {
|
|
83
|
-
pm.launchNode(test, destinationOfRuntime(test, "node"));
|
|
78
|
+
pm.launchNode(test, destinationOfRuntime(test, "node", configs));
|
|
84
79
|
} else if (runtime === "web") {
|
|
85
|
-
pm.launchWeb(test, destinationOfRuntime(test, "web"));
|
|
80
|
+
pm.launchWeb(test, destinationOfRuntime(test, "web", configs), sidecars);
|
|
86
81
|
} else {
|
|
87
82
|
console.error("runtime makes no sense", runtime);
|
|
88
83
|
}
|
|
@@ -96,7 +91,7 @@ const main = async () => {
|
|
|
96
91
|
},
|
|
97
92
|
(eventType, changedFile) => {
|
|
98
93
|
if (changedFile) {
|
|
99
|
-
configs.tests.forEach(([test, runtime,
|
|
94
|
+
configs.tests.forEach(([test, runtime, tr, sidecars]) => {
|
|
100
95
|
if (eventType === "change" || eventType === "rename") {
|
|
101
96
|
if (
|
|
102
97
|
changedFile ===
|
|
@@ -107,7 +102,7 @@ const main = async () => {
|
|
|
107
102
|
.concat("mjs")
|
|
108
103
|
.join(".")
|
|
109
104
|
) {
|
|
110
|
-
pm.launchNode(test, destinationOfRuntime(test, "node"));
|
|
105
|
+
pm.launchNode(test, destinationOfRuntime(test, "node", configs));
|
|
111
106
|
}
|
|
112
107
|
|
|
113
108
|
if (
|
|
@@ -119,7 +114,11 @@ const main = async () => {
|
|
|
119
114
|
.concat("mjs")
|
|
120
115
|
.join(".")
|
|
121
116
|
) {
|
|
122
|
-
pm.launchWeb(
|
|
117
|
+
pm.launchWeb(
|
|
118
|
+
test,
|
|
119
|
+
destinationOfRuntime(test, "web", configs),
|
|
120
|
+
sidecars
|
|
121
|
+
);
|
|
123
122
|
}
|
|
124
123
|
}
|
|
125
124
|
});
|