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.
Files changed (98) hide show
  1. package/README.md +9 -18
  2. package/dist/common/Node.js +7 -34
  3. package/dist/common/PM/index.js +71 -0
  4. package/dist/common/PM/main.js +370 -0
  5. package/dist/common/PM/node.js +84 -0
  6. package/dist/common/PM/web.js +129 -0
  7. package/dist/common/Project.js +20 -2
  8. package/dist/common/Puppeteer.js +109 -0
  9. package/dist/common/Reporter.js +119 -0
  10. package/dist/common/Scheduler.js +1 -0
  11. package/dist/common/SubPackages/puppeteer.js +3 -1
  12. package/dist/common/SubPackages/react/jsx/index.js +14 -2
  13. package/dist/common/SubPackages/react-dom/component/web.js +98 -45
  14. package/dist/common/SubPackages/react-test-renderer/jsx/index.js +0 -1
  15. package/dist/common/Web.js +24 -44
  16. package/dist/common/esbuildConfigs/web.js +3 -1
  17. package/dist/common/lib/abstractBase.js +189 -41
  18. package/dist/common/lib/basebuilder.js +56 -29
  19. package/dist/common/lib/classBuilder.js +6 -2
  20. package/dist/common/lib/core.js +41 -45
  21. package/dist/common/lib/index.js +2 -1
  22. package/dist/common/preload.js +14 -18
  23. package/dist/common/tsconfig.common.tsbuildinfo +1 -1
  24. package/dist/module/Node.js +7 -34
  25. package/dist/module/PM/index.js +67 -0
  26. package/dist/module/PM/main.js +340 -0
  27. package/dist/module/PM/node.js +77 -0
  28. package/dist/module/PM/web.js +122 -0
  29. package/dist/module/Project.js +20 -2
  30. package/dist/module/Puppeteer.js +104 -0
  31. package/dist/module/Reporter.js +114 -0
  32. package/dist/module/Scheduler.js +1 -0
  33. package/dist/module/SubPackages/puppeteer.js +3 -1
  34. package/dist/module/SubPackages/react/jsx/index.js +11 -2
  35. package/dist/module/SubPackages/react/jsx/node.js +1 -1
  36. package/dist/module/SubPackages/react-dom/component/web.js +98 -45
  37. package/dist/module/SubPackages/react-test-renderer/jsx/index.js +0 -1
  38. package/dist/module/Web.js +24 -44
  39. package/dist/module/esbuildConfigs/web.js +3 -1
  40. package/dist/module/lib/abstractBase.js +189 -41
  41. package/dist/module/lib/basebuilder.js +56 -29
  42. package/dist/module/lib/classBuilder.js +6 -2
  43. package/dist/module/lib/core.js +41 -45
  44. package/dist/module/lib/index.js +2 -1
  45. package/dist/module/preload.js +15 -14
  46. package/dist/module/tsconfig.module.tsbuildinfo +1 -1
  47. package/dist/prebuild/Report.css +1616 -584
  48. package/dist/prebuild/Report.js +2635 -2506
  49. package/dist/types/PM/index.d.ts +19 -0
  50. package/dist/types/PM/main.d.ts +26 -0
  51. package/dist/types/PM/node.d.ts +25 -0
  52. package/dist/types/PM/web.d.ts +24 -0
  53. package/dist/types/Reporter.d.ts +1 -0
  54. package/dist/types/Scheduler.d.ts +0 -0
  55. package/dist/types/SubPackages/react/jsx/index.d.ts +2 -5
  56. package/dist/types/SubPackages/react-dom/component/web.d.ts +1 -1
  57. package/dist/types/lib/abstractBase.d.ts +13 -12
  58. package/dist/types/lib/basebuilder.d.ts +4 -2
  59. package/dist/types/lib/classBuilder.d.ts +2 -2
  60. package/dist/types/lib/core.d.ts +4 -4
  61. package/dist/types/lib/index.d.ts +6 -5
  62. package/dist/types/lib/types.d.ts +16 -24
  63. package/dist/types/preload.d.ts +0 -1
  64. package/dist/types/tsconfig.types.tsbuildinfo +1 -1
  65. package/package.json +3 -5
  66. package/src/Node.ts +8 -47
  67. package/src/PM/index.ts +102 -0
  68. package/src/PM/main.ts +452 -0
  69. package/src/PM/node.ts +122 -0
  70. package/src/PM/web.ts +162 -0
  71. package/src/Project.ts +21 -2
  72. package/src/Puppeteer.ts +131 -0
  73. package/src/Report.tsx +160 -46
  74. package/src/Reporter.ts +134 -0
  75. package/src/Scheduler.ts +0 -0
  76. package/src/SubPackages/puppeteer.ts +3 -3
  77. package/src/SubPackages/react/jsx/index.ts +13 -3
  78. package/src/SubPackages/react/jsx/node.ts +5 -8
  79. package/src/SubPackages/react-dom/component/web.ts +126 -67
  80. package/src/SubPackages/react-test-renderer/jsx/index.ts +0 -1
  81. package/src/Web.ts +25 -69
  82. package/src/esbuildConfigs/web.ts +4 -2
  83. package/src/lib/abstractBase.ts +260 -65
  84. package/src/lib/basebuilder.ts +121 -100
  85. package/src/lib/classBuilder.ts +5 -4
  86. package/src/lib/core.ts +58 -59
  87. package/src/lib/index.ts +10 -9
  88. package/src/lib/types.ts +18 -27
  89. package/src/preload.ts +14 -14
  90. package/dist/common/NodeWriter.js +0 -54
  91. package/dist/common/electron.js +0 -266
  92. package/dist/module/NodeWriter.js +0 -48
  93. package/dist/module/electron.js +0 -261
  94. package/dist/types/NodeWriter.d.ts +0 -2
  95. package/src/NodeWriter.ts +0 -72
  96. package/src/electron.ts +0 -317
  97. package/yarn-error.log +0 -3144
  98. /package/dist/types/{electron.d.ts → Puppeteer.d.ts} +0 -0
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "testeranto",
3
3
  "description": "teeny tiny tightly-typed typescript tests",
4
- "version": "0.70.0",
4
+ "version": "0.74.0",
5
5
  "type": "module",
6
6
  "types": "./dist/index.d.mts",
7
7
  "module": "dist/module/index.js",
@@ -227,10 +227,8 @@
227
227
  "ipc": "^0.0.1",
228
228
  "jsonc": "^2.0.0",
229
229
  "npm-watch": "^0.11.0",
230
- "puppeteer": "19.2.2",
231
- "puppeteer-core": "19.2.2",
232
- "puppeteer-in-electron": "^3.0.5",
233
- "react-bootstrap": "^2.7.0",
230
+ "puppeteer-core": "^23.6.0",
231
+ "react-bootstrap": "2.10.6",
234
232
  "react-sigma": "^1.2.35",
235
233
  "react-test-renderer": "18.2.0",
236
234
  "selenium-webdriver": "^4.25.0",
package/src/Node.ts CHANGED
@@ -1,13 +1,10 @@
1
- import puppeteer from "puppeteer-core";
2
-
3
1
  import Testeranto from "./lib/core.js";
4
2
  import {
5
3
  defaultTestResourceRequirement,
6
- ITestJob,
7
4
  ITTestResourceConfiguration,
8
5
  ITTestResourceRequest,
9
6
  } from "./lib/index.js";
10
- import { NodeWriter } from "./NodeWriter.js";
7
+
11
8
  import type {
12
9
  IBaseTest,
13
10
  ITestImplementation,
@@ -15,7 +12,7 @@ import type {
15
12
  } from "./Types.js";
16
13
  import { ITestInterface, INodeTestInterface } from "./lib/types.js";
17
14
 
18
- import puppeteerConfiger from "./puppeteerConfiger.js";
15
+ import { PM_Node } from "./PM/node.js";
19
16
 
20
17
  class NodeTesteranto<
21
18
  TestShape extends IBaseTest
@@ -32,52 +29,16 @@ class NodeTesteranto<
32
29
  testSpecification,
33
30
  testImplementation,
34
31
  testResourceRequirement,
35
- NodeWriter,
36
32
  testInterface
37
33
  );
38
-
39
- if (process.argv[2]) {
40
- const testResourceArg = process.argv[2];
41
-
42
- try {
43
- const partialTestResource = JSON.parse(
44
- testResourceArg
45
- ) as ITTestResourceConfiguration;
46
-
47
- this.receiveTestResourceConfig(this.testJobs[0], partialTestResource);
48
- } catch (e) {
49
- console.error(e);
50
- // process.exit(-1);
51
- }
52
- } else {
53
- // no-op
54
- }
55
34
  }
56
35
 
57
- async receiveTestResourceConfig(
58
- t: ITestJob,
59
- partialTestResource: ITTestResourceConfiguration
60
- ) {
61
- const browser = await puppeteerConfiger("2999").then(async (json) => {
62
- const b = await puppeteer.connect({
63
- browserWSEndpoint: json.webSocketDebuggerUrl,
64
- defaultViewport: null,
65
- });
66
- console.log("connected!", b.isConnected());
67
- return b;
68
- });
69
-
70
- const { failed, artifacts, logPromise } = await t.receiveTestResourceConfig(
71
- partialTestResource,
72
- {
73
- browser,
74
- ipc: process.parentPort,
75
- }
76
- );
77
-
78
- Promise.all([...artifacts, logPromise]).then(async () => {
79
- process.exit((await failed) ? 1 : 0);
80
- });
36
+ async receiveTestResourceConfig(partialTestResource: string) {
37
+ const t: ITTestResourceConfiguration = JSON.parse(partialTestResource);
38
+ const pm = new PM_Node(t);
39
+ const { failed, artifacts, logPromise } =
40
+ await this.testJobs[0].receiveTestResourceConfig(pm);
41
+ pm.customclose();
81
42
  }
82
43
  }
83
44
 
@@ -0,0 +1,102 @@
1
+ // import {
2
+ // Browser,
3
+ // BrowserContext,
4
+ // BrowserContextOptions,
5
+ // DebugInfo,
6
+ // Page,
7
+ // PuppeteerNode,
8
+ // Target,
9
+ // } from "puppeteer-core";
10
+
11
+ import { Browser } from "puppeteer-core/lib/esm/puppeteer/puppeteer-core-browser";
12
+ import { ITLog, ITTestResourceConfiguration } from "../lib";
13
+ import { ChildProcess } from "child_process";
14
+ import { PuppeteerLaunchOptions } from "puppeteer-core/lib/esm/puppeteer";
15
+ // import { ILogWriter, ITLog } from "./lib";
16
+
17
+ type IFPaths = string[];
18
+ const fPaths: IFPaths = [];
19
+
20
+ export abstract class PM {
21
+ server: any;
22
+ browser: Browser;
23
+ testResourceConfiguration: ITTestResourceConfiguration;
24
+
25
+ // constructor(testResourceConfiguration: ITTestResourceConfiguration) {
26
+ // this.testResourceConfiguration = testResourceConfiguration;
27
+ // console.log("mkdirsync2", this.testResourceConfiguration);
28
+ // }
29
+
30
+ abstract startPuppeteer(options: any, destfolder: string): Promise<Browser>;
31
+
32
+ abstract testArtiFactoryfileWriter(tLog: ITLog, callback: (Promise) => void);
33
+ abstract createWriteStream(filepath: string): any;
34
+ abstract writeFileSync(fp: string, contents: string);
35
+ abstract mkdirSync();
36
+ abstract existsSync(fp: string): boolean;
37
+ abstract write(accessObject: { uid: number }, contents: string): boolean;
38
+ abstract end(accessObject: { uid: number }): boolean;
39
+
40
+ // pages(): Promise<Page[]>;
41
+ // pages(): Promise<Page[]> {
42
+ // return new Promise<Page[]>((res, rej) => {
43
+ // res(super.pages());
44
+ // });
45
+ // }
46
+ }
47
+
48
+ // export class PuppetMasterBrowser extends Browser {
49
+ // process(): ChildProcess | null {
50
+ // return super.process();
51
+ // }
52
+ // createBrowserContext(
53
+ // options?: BrowserContextOptions
54
+ // ): Promise<BrowserContext> {
55
+ // throw new Error("Method not implemented.");
56
+ // }
57
+ // browserContexts(): BrowserContext[] {
58
+ // throw new Error("Method not implemented.");
59
+ // }
60
+ // defaultBrowserContext(): BrowserContext {
61
+ // throw new Error("Method not implemented.");
62
+ // }
63
+ // wsEndpoint(): string {
64
+ // throw new Error("Method not implemented.");
65
+ // }
66
+ // newPage(): Promise<Page> {
67
+ // throw new Error("Method not implemented.");
68
+ // }
69
+ // targets(): Target[] {
70
+ // throw new Error("Method not implemented.");
71
+ // }
72
+ // target(): Target {
73
+ // throw new Error("Method not implemented.");
74
+ // }
75
+ // version(): Promise<string> {
76
+ // throw new Error("Method not implemented.");
77
+ // }
78
+ // userAgent(): Promise<string> {
79
+ // throw new Error("Method not implemented.");
80
+ // }
81
+ // close(): Promise<void> {
82
+ // throw new Error("Method not implemented.");
83
+ // }
84
+ // disconnect(): Promise<void> {
85
+ // throw new Error("Method not implemented.");
86
+ // }
87
+ // get connected(): boolean {
88
+ // throw new Error("Method not implemented.");
89
+ // }
90
+ // get debugInfo(): DebugInfo {
91
+ // throw new Error("Method not implemented.");
92
+ // }
93
+ // constructor(...z: []) {
94
+ // super(...z);
95
+ // }
96
+ // // pages(): Promise<Page[]>;
97
+ // pages(): Promise<Page[]> {
98
+ // return new Promise<Page[]>((res, rej) => {
99
+ // res(super.pages());
100
+ // });
101
+ // }
102
+ // }
package/src/PM/main.ts ADDED
@@ -0,0 +1,452 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import puppeteer, { ScreenshotOptions } from "puppeteer-core";
4
+ import { PassThrough } from "stream";
5
+
6
+ import { ITLog } from "../lib";
7
+ import { IBuiltConfig } from "../lib/types";
8
+
9
+ import { PM } from "./index.js";
10
+
11
+ type IFPaths = string[];
12
+
13
+ const fPaths: IFPaths = [];
14
+ const fileStreams3: fs.WriteStream[] = [];
15
+ const files: Record<string, Set<string>> = {}; // = new Set<string>();
16
+ const screenshots: Record<string, Promise<Uint8Array>[]> = {};
17
+
18
+ export class PM_Main extends PM {
19
+ configs: IBuiltConfig;
20
+ ports: Record<number, boolean>;
21
+ queue: any[];
22
+
23
+ constructor(configs: IBuiltConfig) {
24
+ super();
25
+ this.server = {};
26
+ this.configs = configs;
27
+ this.ports = {};
28
+ this.configs.ports.forEach((element) => {
29
+ this.ports[element] = "true"; // set ports as open
30
+ });
31
+
32
+ globalThis["mkdirSync"] = (fp: string) => {
33
+ if (!fs.existsSync(fp)) {
34
+ return fs.mkdirSync(fp, {
35
+ recursive: true,
36
+ });
37
+ }
38
+ return false;
39
+ };
40
+
41
+ globalThis["writeFileSync"] = (
42
+ filepath: string,
43
+ contents: string,
44
+ testName: string
45
+ ) => {
46
+ // Create directories if they don't exist
47
+ const dir = path.dirname(filepath.split("/").slice(0, -1).join("/"));
48
+
49
+ fs.mkdirSync(dir, {
50
+ recursive: true,
51
+ });
52
+ if (!files[testName]) {
53
+ files[testName] = new Set();
54
+ }
55
+ files[testName].add(filepath);
56
+ return fs.writeFileSync(filepath, contents);
57
+ };
58
+
59
+ globalThis["createWriteStream"] = (filepath: string, testName: string) => {
60
+ const f = fs.createWriteStream(filepath);
61
+ fileStreams3.push(f);
62
+ // files.add(filepath);
63
+ if (!files[testName]) {
64
+ files[testName] = new Set();
65
+ }
66
+ files[testName].add(filepath);
67
+ return {
68
+ ...JSON.parse(JSON.stringify(f)),
69
+ uid: fileStreams3.length - 1,
70
+ };
71
+ };
72
+
73
+ globalThis["write"] = (uid: number, contents: string) => {
74
+ fileStreams3[uid].write(contents);
75
+ };
76
+
77
+ globalThis["end"] = (uid: number) => {
78
+ fileStreams3[uid].end();
79
+ };
80
+
81
+ globalThis["customclose"] = (p: string, testName: string) => {
82
+ if (!files[testName]) {
83
+ files[testName] = new Set();
84
+ }
85
+
86
+ fs.writeFileSync(
87
+ p + "/manifest.json",
88
+ JSON.stringify(Array.from(files[testName]))
89
+ );
90
+ delete files[testName];
91
+ // globalThis["writeFileSync"](
92
+ // p + "/manifest.json",
93
+ // // files.entries()
94
+ // JSON.stringify(Array.from(files[testName]))
95
+ // );
96
+
97
+ // fileStreams3[uid].end();
98
+ };
99
+ // page.exposeFunction("customclose", () => {
100
+ // console.log("closing doneFileStream2", doneFileStream2);
101
+ // // console.log("closing doneFileStream2", doneFileStream2);
102
+ // Promise.all([...doneFileStream2, ...screenshots2]).then(() => {
103
+ // page.close();
104
+ // });
105
+
106
+ // // page.close();
107
+ // // Promise.all(screenshots).then(() => {
108
+ // // page.close();
109
+ // // });
110
+ // // setTimeout(() => {
111
+ // // console.log("Delayed for 1 second.");
112
+ // // page.close();
113
+ // // }, 5000);
114
+
115
+ // // return page.close();
116
+ // });
117
+ }
118
+
119
+ async startPuppeteer(options: any, destfolder: string): Promise<any> {
120
+ this.browser = await puppeteer.launch(options);
121
+ return this.browser;
122
+ }
123
+
124
+ launchNode = async (src: string, dest: string) => {
125
+ console.log("launchNode", src);
126
+
127
+ const destFolder = dest.replace(".mjs", "");
128
+
129
+ let argz = "";
130
+
131
+ const testConfig = this.configs.tests.find((t) => {
132
+ return t[0] === src;
133
+ });
134
+
135
+ if (!testConfig) {
136
+ console.error("missing test config");
137
+ process.exit(-1);
138
+ }
139
+ const testConfigResource = testConfig[2];
140
+
141
+ let portsToUse: string[] = [];
142
+ if (testConfigResource.ports === 0) {
143
+ argz = JSON.stringify({
144
+ scheduled: true,
145
+ name: src,
146
+ ports: portsToUse,
147
+ fs: destFolder,
148
+ browserWSEndpoint: this.browser.wsEndpoint(),
149
+ });
150
+ } else if (testConfigResource.ports > 0) {
151
+ const openPorts = Object.entries(this.ports).filter(
152
+ ([portnumber, portopen]) => portopen
153
+ );
154
+ if (openPorts.length >= testConfigResource.ports) {
155
+ for (let i = 0; i < testConfigResource.ports; i++) {
156
+ portsToUse.push(openPorts[i][0]);
157
+ this.ports[openPorts[i][0]] = false; // port is now closed
158
+ }
159
+
160
+ argz = JSON.stringify({
161
+ scheduled: true,
162
+ name: src,
163
+ // ports: [3333],
164
+ ports: portsToUse,
165
+ fs: ".",
166
+ browserWSEndpoint: this.browser.wsEndpoint(),
167
+ });
168
+ } else {
169
+ this.queue.push(src);
170
+ return;
171
+ }
172
+ } else {
173
+ console.error("negative port makes no sense", src);
174
+ process.exit(-1);
175
+ }
176
+
177
+ const builtfile = dest + ".mjs";
178
+
179
+ this.server[builtfile] = await import(
180
+ `${builtfile}?cacheBust=${Date.now()}`
181
+ ).then((module) => {
182
+ return module.default.then((defaultModule) => {
183
+ defaultModule
184
+ .receiveTestResourceConfig(argz)
185
+ .then((x) => {
186
+ console.log("then", x);
187
+ return x;
188
+ })
189
+ .catch((e) => {
190
+ console.log("catch", e);
191
+ });
192
+ });
193
+ });
194
+
195
+ for (let i = 0; i <= portsToUse.length; i++) {
196
+ this.ports[i] = true; //port is open again
197
+ }
198
+ };
199
+
200
+ launchWeb = (t: string, dest: string) => {
201
+ console.log("launchWeb", t, dest);
202
+
203
+ const destFolder = dest.replace(".mjs", "");
204
+
205
+ const webArgz = JSON.stringify({
206
+ name: dest,
207
+ ports: [].toString(),
208
+ fs: destFolder,
209
+ browserWSEndpoint: this.browser.wsEndpoint(),
210
+ });
211
+
212
+ const evaluation = `import('${dest}.mjs').then(async (x) => {
213
+ console.log("imported", x, (x.default));
214
+ try {
215
+ await (await x.default).receiveTestResourceConfig(${webArgz})
216
+ } catch (e) {
217
+ console.log("fail", e)
218
+ }
219
+ })`;
220
+
221
+ const fileStreams2: fs.WriteStream[] = [];
222
+
223
+ // const screenshots2: Promise<any>[] = [];
224
+ const doneFileStream2: Promise<any>[] = [];
225
+
226
+ this.browser
227
+ .newPage()
228
+ .then((page) => {
229
+ page.exposeFunction(
230
+ "custom-screenshot",
231
+ async (ssOpts: ScreenshotOptions, testName: string) => {
232
+ console.log("main.ts browser custom-screenshot", testName);
233
+ const p = ssOpts.path as string;
234
+ const dir = path.dirname(p);
235
+ fs.mkdirSync(dir, {
236
+ recursive: true,
237
+ });
238
+ files[testName].add(ssOpts.path as string);
239
+
240
+ const sPromise = page.screenshot({
241
+ ...ssOpts,
242
+ path: p,
243
+ });
244
+
245
+ if (!screenshots[testName]) {
246
+ screenshots[testName] = [];
247
+ }
248
+ screenshots[testName].push(sPromise);
249
+ // sPromise.then(())
250
+ await sPromise;
251
+ return sPromise;
252
+ // page.evaluate(`window["screenshot done"]`);
253
+ }
254
+ );
255
+
256
+ page.exposeFunction(
257
+ "writeFileSync",
258
+ (fp: string, contents: string, testName: string) => {
259
+ const dir = path.dirname(fp);
260
+
261
+ fs.mkdirSync(dir, {
262
+ recursive: true,
263
+ });
264
+
265
+ const p = new Promise<string>(async (res, rej) => {
266
+ fs.writeFileSync(fp, contents);
267
+ res(fp);
268
+ });
269
+ doneFileStream2.push(p);
270
+
271
+ if (!files[testName]) {
272
+ files[testName] = new Set();
273
+ }
274
+ files[testName].add(fp);
275
+ return p;
276
+ }
277
+ );
278
+
279
+ page.exposeFunction("existsSync", (fp: string, contents: string) => {
280
+ return fs.existsSync(fp);
281
+ });
282
+
283
+ page.exposeFunction("mkdirSync", (fp: string) => {
284
+ if (!fs.existsSync(fp)) {
285
+ return fs.mkdirSync(fp, {
286
+ recursive: true,
287
+ });
288
+ }
289
+ return false;
290
+ });
291
+
292
+ page.exposeFunction(
293
+ "createWriteStream",
294
+ (fp: string, testName: string) => {
295
+ const f = fs.createWriteStream(fp);
296
+
297
+ if (!files[testName]) {
298
+ files[testName] = new Set();
299
+ }
300
+ files[testName].add(fp);
301
+
302
+ const p = new Promise<string>((res, rej) => {
303
+ res(fp);
304
+ });
305
+ doneFileStream2.push(p);
306
+ f.on("close", async () => {
307
+ await p;
308
+ });
309
+ fileStreams2.push(f);
310
+ return {
311
+ ...JSON.parse(JSON.stringify(f)),
312
+ uid: fileStreams2.length - 1,
313
+ };
314
+ }
315
+ );
316
+
317
+ page.exposeFunction("write", async (uid: number, contents: string) => {
318
+ return fileStreams2[uid].write(contents);
319
+ });
320
+
321
+ page.exposeFunction("end", async (uid: number) => {
322
+ return fileStreams2[uid].end();
323
+ });
324
+
325
+ page.exposeFunction("customclose", (p: string, testName: string) => {
326
+ fs.writeFileSync(
327
+ p + "/manifest.json",
328
+ JSON.stringify(Array.from(files[testName]))
329
+ );
330
+ delete files[testName];
331
+
332
+ Promise.all(screenshots[testName] || []).then(() => {
333
+ delete screenshots[testName];
334
+ page.close();
335
+ });
336
+
337
+ // globalThis["writeFileSync"](
338
+ // p + "/manifest.json",
339
+ // // files.entries()
340
+ // JSON.stringify(Array.from(files[testName]))
341
+ // );
342
+
343
+ // console.log("closing doneFileStream2", doneFileStream2);
344
+ // console.log("closing doneFileStream2", doneFileStream2);
345
+ // Promise.all([...doneFileStream2, ...screenshots2]).then(() => {
346
+ // page.close();
347
+ // });
348
+
349
+ // Promise.all(screenshots).then(() => {
350
+ // page.close();
351
+ // });
352
+ // setTimeout(() => {
353
+ // console.log("Delayed for 1 second.");
354
+ // page.close();
355
+ // }, 5000);
356
+
357
+ // return page.close();
358
+ });
359
+
360
+ return page;
361
+ })
362
+ .then(async (page) => {
363
+ await page.goto(`file://${`${dest}.html`}`, {});
364
+
365
+ page.evaluate(evaluation).finally(() => {
366
+ console.log("evaluation failed.", dest);
367
+ });
368
+
369
+ return page;
370
+ });
371
+ };
372
+
373
+ end(accessObject: { uid: number }): boolean {
374
+ throw new Error("Method not implemented.");
375
+ }
376
+
377
+ existsSync(destFolder: string): boolean {
378
+ return fs.existsSync(destFolder);
379
+ }
380
+
381
+ async mkdirSync(fp: string) {
382
+ if (!fs.existsSync(fp)) {
383
+ return fs.mkdirSync(fp, {
384
+ recursive: true,
385
+ });
386
+ }
387
+ return false;
388
+ }
389
+
390
+ writeFileSync(fp: string, contents: string) {
391
+ fs.writeFileSync(fp, contents);
392
+ }
393
+
394
+ createWriteStream(filepath: string): fs.WriteStream {
395
+ return fs.createWriteStream(filepath);
396
+ }
397
+
398
+ testArtiFactoryfileWriter(tLog: ITLog, callback: (Promise) => void) {
399
+ return (fPath, value: string | Buffer | PassThrough) => {
400
+ callback(
401
+ new Promise<void>((res, rej) => {
402
+ tLog("testArtiFactory =>", fPath);
403
+
404
+ const cleanPath = path.resolve(fPath);
405
+ fPaths.push(cleanPath.replace(process.cwd(), ``));
406
+
407
+ const targetDir = cleanPath.split("/").slice(0, -1).join("/");
408
+
409
+ fs.mkdir(targetDir, { recursive: true }, async (error) => {
410
+ if (error) {
411
+ console.error(`❗️testArtiFactory failed`, targetDir, error);
412
+ }
413
+
414
+ fs.writeFileSync(
415
+ path.resolve(
416
+ targetDir.split("/").slice(0, -1).join("/"),
417
+ "manifest"
418
+ ),
419
+ fPaths.join(`\n`),
420
+ {
421
+ encoding: "utf-8",
422
+ }
423
+ );
424
+
425
+ if (Buffer.isBuffer(value)) {
426
+ fs.writeFileSync(fPath, value, "binary");
427
+ res();
428
+ } else if (`string` === typeof value) {
429
+ fs.writeFileSync(fPath, value.toString(), {
430
+ encoding: "utf-8",
431
+ });
432
+ res();
433
+ } else {
434
+ /* @ts-ignore:next-line */
435
+ const pipeStream: PassThrough = value;
436
+ const myFile = fs.createWriteStream(fPath);
437
+ pipeStream.pipe(myFile);
438
+ pipeStream.on("close", () => {
439
+ myFile.close();
440
+ res();
441
+ });
442
+ }
443
+ });
444
+ })
445
+ );
446
+ };
447
+ }
448
+
449
+ write(accessObject: { uid: number }, contents: string): boolean {
450
+ throw new Error("Method not implemented.");
451
+ }
452
+ }