testeranto 0.90.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.
Files changed (133) hide show
  1. package/bundle.js +4 -7
  2. package/dist/common/src/Node.js +5 -3
  3. package/dist/common/src/PM/main.js +254 -126
  4. package/dist/common/src/PM/node.js +20 -5
  5. package/dist/common/src/PM/web.js +19 -4
  6. package/dist/common/src/SubPackages/puppeteer.js +1 -1
  7. package/dist/common/src/SubPackages/react/jsx/index.js +14 -6
  8. package/dist/common/src/SubPackages/react/jsx/node.js +2 -2
  9. package/dist/common/src/SubPackages/react-dom/component/web.js +13 -39
  10. package/dist/common/src/SubPackages/react-test-renderer/component/interface.js +2 -10
  11. package/dist/common/src/Web.js +25 -21
  12. package/dist/common/src/cli.js +439 -0
  13. package/dist/common/src/cli2.js +144 -0
  14. package/dist/common/src/esbuildConfigs/inputFilesPlugin.js +18 -8
  15. package/dist/common/src/esbuildConfigs/node.js +1 -4
  16. package/dist/common/src/esbuildConfigs/web.js +1 -1
  17. package/dist/common/src/lib/abstractBase.js +31 -263
  18. package/dist/common/src/lib/basebuilder.js +1 -11
  19. package/dist/common/src/lib/classBuilder.js +1 -1
  20. package/dist/common/src/lib/core.js +8 -28
  21. package/dist/common/src/lib/types.js +1 -0
  22. package/dist/common/tsconfig.common.tsbuildinfo +1 -1
  23. package/dist/module/src/Node.js +5 -3
  24. package/dist/module/src/PM/main.js +254 -126
  25. package/dist/module/src/PM/node.js +20 -5
  26. package/dist/module/src/PM/web.js +19 -4
  27. package/dist/module/src/SubPackages/puppeteer.js +1 -1
  28. package/dist/module/src/SubPackages/react/jsx/index.js +14 -6
  29. package/dist/module/src/SubPackages/react/jsx/node.js +2 -2
  30. package/dist/module/src/SubPackages/react-dom/component/web.js +13 -39
  31. package/dist/module/src/SubPackages/react-test-renderer/component/interface.js +2 -10
  32. package/dist/module/src/Web.js +25 -21
  33. package/dist/module/src/cli.js +411 -0
  34. package/dist/module/src/cli2.js +116 -0
  35. package/dist/module/src/esbuildConfigs/inputFilesPlugin.js +18 -8
  36. package/dist/module/src/esbuildConfigs/node.js +1 -4
  37. package/dist/module/src/esbuildConfigs/web.js +1 -1
  38. package/dist/module/src/lib/abstractBase.js +31 -263
  39. package/dist/module/src/lib/basebuilder.js +1 -11
  40. package/dist/module/src/lib/classBuilder.js +1 -1
  41. package/dist/module/src/lib/core.js +8 -28
  42. package/dist/module/src/lib/types.js +1 -0
  43. package/dist/module/tsconfig.module.tsbuildinfo +1 -1
  44. package/dist/prebuild/cli.mjs +1491 -0
  45. package/dist/prebuild/{run-tests.mjs → cli2.mjs} +223 -212
  46. package/dist/types/src/Node.d.ts +6 -3
  47. package/dist/types/src/PM/index.d.ts +10 -2
  48. package/dist/types/src/PM/main.d.ts +14 -7
  49. package/dist/types/src/PM/node.d.ts +9 -2
  50. package/dist/types/src/PM/web.d.ts +9 -3
  51. package/dist/types/src/SubPackages/puppeteer.d.ts +1 -1
  52. package/dist/types/src/SubPackages/react/component/node.d.ts +1 -1
  53. package/dist/types/src/SubPackages/react/component/web.d.ts +1 -1
  54. package/dist/types/src/SubPackages/react/jsx/node.d.ts +3 -3
  55. package/dist/types/src/SubPackages/react/jsx/web.d.ts +2 -2
  56. package/dist/types/src/SubPackages/react-dom/component/node.d.ts +2 -2
  57. package/dist/types/src/SubPackages/react-dom/component/web.d.ts +1 -1
  58. package/dist/types/src/SubPackages/react-dom/jsx/node.d.ts +1 -1
  59. package/dist/types/src/SubPackages/react-dom/jsx/web.d.ts +2 -2
  60. package/dist/types/src/SubPackages/react-test-renderer/MemoExoticComponent/node.d.ts +2 -2
  61. package/dist/types/src/SubPackages/react-test-renderer/component/interface.d.ts +1 -1
  62. package/dist/types/src/SubPackages/react-test-renderer/component/node.d.ts +2 -2
  63. package/dist/types/src/SubPackages/react-test-renderer/component/web.d.ts +2 -2
  64. package/dist/types/src/SubPackages/react-test-renderer/fc/node.d.ts +2 -2
  65. package/dist/types/src/SubPackages/react-test-renderer/fc/web.d.ts +2 -2
  66. package/dist/types/src/SubPackages/react-test-renderer/jsx/node.d.ts +3 -2
  67. package/dist/types/src/SubPackages/react-test-renderer/jsx/web.d.ts +2 -2
  68. package/dist/types/src/SubPackages/react-test-renderer/jsx-promised/node.d.ts +2 -2
  69. package/dist/types/src/SubPackages/react-test-renderer/jsx-promised/web.d.ts +2 -2
  70. package/dist/types/src/Types.d.ts +60 -21
  71. package/dist/types/src/Web.d.ts +3 -3
  72. package/dist/types/src/lib/abstractBase.d.ts +6 -2
  73. package/dist/types/src/lib/core.d.ts +3 -3
  74. package/dist/types/src/lib/index.d.ts +1 -1
  75. package/dist/types/src/lib/types.d.ts +6 -30
  76. package/dist/types/tsconfig.types.tsbuildinfo +1 -1
  77. package/package.json +23 -20
  78. package/src/Node.ts +6 -3
  79. package/src/PM/index.ts +12 -8
  80. package/src/PM/main.ts +331 -165
  81. package/src/PM/node.ts +42 -7
  82. package/src/PM/web.ts +33 -5
  83. package/src/SubPackages/puppeteer.ts +1 -1
  84. package/src/SubPackages/react/jsx/index.ts +15 -7
  85. package/src/SubPackages/react/jsx/node.ts +18 -6
  86. package/src/SubPackages/react-dom/component/web.ts +28 -51
  87. package/src/SubPackages/react-test-renderer/component/interface.ts +4 -11
  88. package/src/SubPackages/react-test-renderer/jsx/node.ts +16 -1
  89. package/src/Types.ts +362 -114
  90. package/src/Web.ts +45 -23
  91. package/src/cli.ts +535 -0
  92. package/src/cli2.ts +157 -0
  93. package/src/esbuildConfigs/inputFilesPlugin.ts +27 -9
  94. package/src/esbuildConfigs/node.ts +4 -7
  95. package/src/esbuildConfigs/web.ts +4 -3
  96. package/src/lib/abstractBase.ts +84 -291
  97. package/src/lib/basebuilder.ts +1 -12
  98. package/src/lib/classBuilder.ts +2 -1
  99. package/src/lib/core.ts +17 -29
  100. package/src/lib/types.ts +5 -177
  101. package/dist/common/src/Aider.js +0 -143
  102. package/dist/common/src/Project.js +0 -225
  103. package/dist/common/src/Puppeteer.js +0 -113
  104. package/dist/common/src/build-tests.js +0 -39
  105. package/dist/common/src/esbuildConfigs/features.js +0 -14
  106. package/dist/common/src/esbuildConfigs/report.js +0 -14
  107. package/dist/common/src/esbuildConfigs/tests.js +0 -13
  108. package/dist/common/src/run-tests.js +0 -39
  109. package/dist/module/src/Aider.js +0 -136
  110. package/dist/module/src/Project.js +0 -218
  111. package/dist/module/src/Puppeteer.js +0 -108
  112. package/dist/module/src/build-tests.js +0 -11
  113. package/dist/module/src/esbuildConfigs/features.js +0 -12
  114. package/dist/module/src/esbuildConfigs/report.js +0 -14
  115. package/dist/module/src/esbuildConfigs/tests.js +0 -11
  116. package/dist/module/src/run-tests.js +0 -11
  117. package/dist/prebuild/build-tests.mjs +0 -552
  118. package/dist/types/src/Aider.d.ts +0 -1
  119. package/dist/types/src/Project.d.ts +0 -12
  120. package/dist/types/src/Puppeteer.d.ts +0 -2
  121. package/dist/types/src/esbuildConfigs/features.d.ts +0 -4
  122. package/dist/types/src/esbuildConfigs/report.d.ts +0 -0
  123. package/dist/types/src/esbuildConfigs/tests.d.ts +0 -4
  124. package/src/Aider.ts +0 -168
  125. package/src/Project.ts +0 -291
  126. package/src/Puppeteer.ts +0 -145
  127. package/src/build-tests.ts +0 -12
  128. package/src/esbuildConfigs/features.ts +0 -17
  129. package/src/esbuildConfigs/report.ts +0 -15
  130. package/src/esbuildConfigs/tests.ts +0 -14
  131. package/src/run-tests.ts +0 -12
  132. /package/dist/types/src/{build-tests.d.ts → cli.d.ts} +0 -0
  133. /package/dist/types/src/{run-tests.d.ts → cli2.d.ts} +0 -0
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
- import { IBuiltConfig, ITestTypes } from "../lib/types";
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, {
@@ -57,14 +111,19 @@ export class PM_Main extends PM {
57
111
  contents: string,
58
112
  testName: string
59
113
  ) => {
60
- // console.log("globalThis-writeFileSync", filepath);
114
+ // console.log(testName, "writeFileSync", filepath, testName);
61
115
 
62
116
  // Create directories if they don't exist
63
- const dir = path.dirname(filepath.split("/").slice(0, -1).join("/"));
117
+ const dir = path.dirname(filepath);
118
+
119
+ // console.log(testName, "mkdirSync", dir);
64
120
 
65
121
  fs.mkdirSync(dir, {
66
122
  recursive: true,
67
123
  });
124
+
125
+ // console.log(testName, "mkdirSync2");
126
+
68
127
  if (!files[testName]) {
69
128
  files[testName] = new Set();
70
129
  }
@@ -94,10 +153,41 @@ export class PM_Main extends PM {
94
153
  fileStreams3[uid].end();
95
154
  };
96
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
+
97
182
  globalThis["customScreenShot"] = async (
98
183
  opts: { path: string },
99
- page: Page
184
+ pageKey: string,
185
+ testName: string
100
186
  ) => {
187
+ const page = (await this.browser.pages()).find(
188
+ (p) => p.mainFrame()._id === pageKey
189
+ );
190
+
101
191
  const p = opts.path as string;
102
192
  const dir = path.dirname(p);
103
193
  fs.mkdirSync(dir, {
@@ -122,17 +212,57 @@ export class PM_Main extends PM {
122
212
  return sPromise;
123
213
  };
124
214
 
125
- globalThis["customclose"] = (p: string, testName: string) => {
126
- if (!files[testName]) {
127
- files[testName] = new Set();
128
- }
129
-
130
- fs.writeFileSync(
131
- p + "/manifest.json",
132
- JSON.stringify(Array.from(files[testName]))
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
133
221
  );
134
- delete files[testName];
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;
135
237
  };
238
+
239
+ // globalThis["customclose"] = (p: string, testName: string) => {
240
+ // if (!files[testName]) {
241
+ // files[testName] = new Set();
242
+ // }
243
+
244
+ // fs.writeFileSync(
245
+ // p + "/manifest.json",
246
+ // JSON.stringify(Array.from(files[testName]))
247
+ // );
248
+ // delete files[testName];
249
+ // };
250
+ }
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.");
136
266
  }
137
267
 
138
268
  $(selector: string): boolean {
@@ -141,7 +271,7 @@ export class PM_Main extends PM {
141
271
  screencast(opts: object) {
142
272
  throw new Error("Method not implemented.");
143
273
  }
144
- customScreenShot(opts: object) {
274
+ customScreenShot(opts: object, cdpPage?: CdpPage) {
145
275
  throw new Error("Method not implemented.");
146
276
  }
147
277
 
@@ -245,9 +375,15 @@ export class PM_Main extends PM {
245
375
  isDisabled(selector: string): boolean {
246
376
  throw new Error("Method not implemented.");
247
377
  }
378
+ screencastStop(s: string) {
379
+ throw new Error("Method not implemented.");
380
+ }
248
381
  ////////////////////////////////////////////////////////////////////////////////
249
382
 
250
- async startPuppeteer(options: any, destfolder: string): Promise<any> {
383
+ async startPuppeteer(
384
+ options: LaunchOptions,
385
+ destfolder: string
386
+ ): Promise<any> {
251
387
  this.browser = (await puppeteer.launch(options)) as any;
252
388
  }
253
389
 
@@ -283,7 +419,7 @@ export class PM_Main extends PM {
283
419
  };
284
420
 
285
421
  launchNode = async (src: string, dest: string) => {
286
- console.log("launchNode", src);
422
+ console.log("! node", src);
287
423
  this.register(src);
288
424
 
289
425
  const destFolder = dest.replace(".mjs", "");
@@ -338,27 +474,31 @@ export class PM_Main extends PM {
338
474
  process.exit(-1);
339
475
  }
340
476
 
341
- const builtfile = dest + ".mjs";
342
-
343
- await Promise.all(
344
- testConfig[3].map((sidecar) => {
345
- if (sidecar[1] === "web") {
346
- return this.launchWebSideCar(
347
- sidecar[0],
348
- destinationOfRuntime(sidecar[0], "web", this.configs),
349
- sidecar
350
- );
351
- }
352
-
353
- if (sidecar[1] === "node") {
354
- return this.launchNodeSideCar(
355
- sidecar[0],
356
- destinationOfRuntime(sidecar[0], "node", this.configs),
357
- sidecar
358
- );
359
- }
360
- })
361
- );
477
+ const builtfile = dest;
478
+
479
+ const webSideCares: Page[] = [];
480
+
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
+ // );
362
502
 
363
503
  this.server[builtfile] = await import(
364
504
  `${builtfile}?cacheBust=${Date.now()}`
@@ -366,13 +506,16 @@ export class PM_Main extends PM {
366
506
  return module.default.then((defaultModule) => {
367
507
  defaultModule
368
508
  .receiveTestResourceConfig(argz)
369
- .then(async (features: string[]) => {
370
- this.receiveFeatures(features, destFolder);
509
+ .then(async ({ features, failed }: IFinalResults) => {
510
+ this.receiveFeatures(features, destFolder, src);
511
+ // console.log(`${src} completed with ${failed} errors`);
512
+ statusMessagePretty(failed, src);
371
513
  })
372
514
  .catch((e) => {
373
- console.log("catch", e);
515
+ console.log(`${src} errored with`, e);
374
516
  })
375
517
  .finally(() => {
518
+ webSideCares.forEach((webSideCar) => webSideCar.close());
376
519
  this.deregister(src);
377
520
  });
378
521
  });
@@ -390,23 +533,16 @@ export class PM_Main extends PM {
390
533
  src: string,
391
534
  dest: string,
392
535
  testConfig: ITestTypes
393
- ) => {
536
+ ): Promise<Page> => {
394
537
  const d = dest + ".mjs";
395
538
  console.log("launchWebSideCar", src, dest, d);
396
539
  const destFolder = dest.replace(".mjs", "");
397
- const webArgz = JSON.stringify({
398
- name: dest,
399
- ports: [].toString(),
400
- fs: destFolder,
401
- browserWSEndpoint: this.browser.wsEndpoint(),
402
- });
403
-
404
- // files[src] = new Set();
405
- // const evaluation = `
406
- // console.log("importing ${dest}.mjs");
407
- // import('${dest}.mjs').then(async (x) => {
408
- // console.log("imported", x.default);
409
- // })`;
540
+ // const webArgz = JSON.stringify({
541
+ // name: dest,
542
+ // ports: [].toString(),
543
+ // fs: destFolder,
544
+ // browserWSEndpoint: this.browser.wsEndpoint(),
545
+ // });
410
546
 
411
547
  const fileStreams2: fs.WriteStream[] = [];
412
548
  const doneFileStream2: Promise<any>[] = [];
@@ -520,18 +656,18 @@ export class PM_Main extends PM {
520
656
  return fileStreams2[uid].end();
521
657
  });
522
658
 
523
- page.exposeFunction("customclose", (p: string, testName: string) => {
524
- fs.writeFileSync(
525
- p + "/manifest.json",
526
- JSON.stringify(Array.from(files[testName]))
527
- );
528
- delete files[testName];
529
-
530
- Promise.all(screenshots[testName] || []).then(() => {
531
- delete screenshots[testName];
532
- // page.close();
533
- });
534
- });
659
+ // page.exposeFunction("customclose", (p: string, testName: string) => {
660
+ // fs.writeFileSync(
661
+ // p + "/manifest.json",
662
+ // JSON.stringify(Array.from(files[testName]))
663
+ // );
664
+ // delete files[testName];
665
+
666
+ // Promise.all(screenshots[testName] || []).then(() => {
667
+ // delete screenshots[testName];
668
+ // // page.close();
669
+ // });
670
+ // });
535
671
 
536
672
  return page;
537
673
  })
@@ -629,19 +765,19 @@ export class PM_Main extends PM {
629
765
  }
630
766
  };
631
767
 
632
- launchWeb = (t: string, dest: string, sidecars: ITestTypes[]) => {
633
- console.log("launchWeb", t, dest);
768
+ launchWeb = (t: string, dest: string) => {
769
+ console.log("! web", t);
634
770
  this.register(t);
635
771
 
636
- sidecars.map((sidecar) => {
637
- if (sidecar[1] === "node") {
638
- return this.launchNodeSideCar(
639
- sidecar[0],
640
- destinationOfRuntime(sidecar[0], "node", this.configs),
641
- sidecar
642
- );
643
- }
644
- });
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
+ // });
645
781
 
646
782
  const destFolder = dest.replace(".mjs", "");
647
783
 
@@ -652,9 +788,11 @@ export class PM_Main extends PM {
652
788
  browserWSEndpoint: this.browser.wsEndpoint(),
653
789
  });
654
790
 
791
+ const d = `${dest}?cacheBust=${Date.now()}`;
792
+
655
793
  const evaluation = `
656
- console.log("importing ${dest}.mjs");
657
- import('${dest}.mjs').then(async (x) => {
794
+ console.log("importing ${d}");
795
+ import('${d}').then(async (x) => {
658
796
  console.log("imported", (await x.default));
659
797
  try {
660
798
  return await (await x.default).receiveTestResourceConfig(${webArgz})
@@ -666,8 +804,8 @@ export class PM_Main extends PM {
666
804
  const fileStreams2: fs.WriteStream[] = [];
667
805
  const doneFileStream2: Promise<any>[] = [];
668
806
 
669
- const stdoutStream = fs.createWriteStream(`${dest}/stdout.log`);
670
- const stderrStream = fs.createWriteStream(`${dest}/stderr.log`);
807
+ const stdoutStream = fs.createWriteStream(`${destFolder}/stdout.log`);
808
+ const stderrStream = fs.createWriteStream(`${destFolder}/stderr.log`);
671
809
 
672
810
  this.browser
673
811
  .newPage()
@@ -737,23 +875,24 @@ export class PM_Main extends PM {
737
875
  page.exposeFunction(
738
876
  "writeFileSync",
739
877
  (fp: string, contents: string, testName: string) => {
740
- const dir = path.dirname(fp);
741
-
742
- fs.mkdirSync(dir, {
743
- recursive: true,
744
- });
745
-
746
- const p = new Promise<string>(async (res, rej) => {
747
- fs.writeFileSync(fp, contents);
748
- res(fp);
749
- });
750
- doneFileStream2.push(p);
751
-
752
- if (!files[testName]) {
753
- files[testName] = new Set();
754
- }
755
- files[testName].add(fp);
756
- return p;
878
+ return globalThis["writeFileSync"](fp, contents, testName);
879
+ // const dir = path.dirname(fp);
880
+
881
+ // fs.mkdirSync(dir, {
882
+ // recursive: true,
883
+ // });
884
+
885
+ // const p = new Promise<string>(async (res, rej) => {
886
+ // fs.writeFileSync(fp, contents);
887
+ // res(fp);
888
+ // });
889
+ // doneFileStream2.push(p);
890
+
891
+ // if (!files[testName]) {
892
+ // files[testName] = new Set();
893
+ // }
894
+ // files[testName].add(fp);
895
+ // return p;
757
896
  }
758
897
  );
759
898
 
@@ -803,45 +942,44 @@ export class PM_Main extends PM {
803
942
  return fileStreams2[uid].end();
804
943
  });
805
944
 
806
- page.exposeFunction("customclose", (p: string, testName: string) => {
807
- // console.log("closing", p);
945
+ // page.exposeFunction("customclose", (p: string, testName: string) => {
946
+ // // console.log("closing", p);
808
947
 
809
- fs.writeFileSync(
810
- p + "/manifest.json",
811
- JSON.stringify(Array.from(files[testName]))
812
- );
813
- delete files[testName];
814
-
815
- // console.log("screenshots[testName]", screenshots[testName]);
816
- Promise.all(screenshots[testName] || []).then(() => {
817
- delete screenshots[testName];
818
- // page.close();
819
- // console.log("\t GOODBYE");
820
- // whyIsNodeRunning();
821
- });
948
+ // console.log("\t GOODBYE customclose");
822
949
 
823
- // globalThis["writeFileSync"](
824
- // p + "/manifest.json",
825
- // // files.entries()
826
- // JSON.stringify(Array.from(files[testName]))
827
- // );
950
+ // fs.writeFileSync(
951
+ // p + "/manifest.json",
952
+ // JSON.stringify(Array.from(files[testName]))
953
+ // );
954
+ // delete files[testName];
828
955
 
829
- // console.log("closing doneFileStream2", doneFileStream2);
830
- // console.log("closing doneFileStream2", doneFileStream2);
831
- // Promise.all([...doneFileStream2, ...screenshots2]).then(() => {
832
- // page.close();
833
- // });
834
-
835
- // Promise.all(screenshots).then(() => {
836
- // page.close();
837
- // });
838
- // setTimeout(() => {
839
- // console.log("Delayed for 1 second.");
840
- // page.close();
841
- // }, 5000);
956
+ // // console.log("screenshots[testName]", screenshots[testName]);
957
+ // Promise.all(screenshots[testName] || []).then(() => {
958
+ // delete screenshots[testName];
959
+ // });
842
960
 
843
- // return page.close();
844
- });
961
+ // // globalThis["writeFileSync"](
962
+ // // p + "/manifest.json",
963
+ // // // files.entries()
964
+ // // JSON.stringify(Array.from(files[testName]))
965
+ // // );
966
+
967
+ // // console.log("closing doneFileStream2", doneFileStream2);
968
+ // // console.log("closing doneFileStream2", doneFileStream2);
969
+ // // Promise.all([...doneFileStream2, ...screenshots2]).then(() => {
970
+ // // page.close();
971
+ // // });
972
+
973
+ // // Promise.all(screenshots).then(() => {
974
+ // // page.close();
975
+ // // });
976
+ // // setTimeout(() => {
977
+ // // console.log("Delayed for 1 second.");
978
+ // // page.close();
979
+ // // }, 5000);
980
+
981
+ // // return page.close();
982
+ // });
845
983
 
846
984
  page.exposeFunction("page", () => {
847
985
  return page.mainFrame()._id;
@@ -895,13 +1033,25 @@ export class PM_Main extends PM {
895
1033
  })
896
1034
  .then(async (page) => {
897
1035
  const close = () => {
898
- console.log("evaluation complete.", dest);
899
- page.off("pageerror");
900
- page.close();
1036
+ if (!files[t]) {
1037
+ files[t] = new Set();
1038
+ }
1039
+ // files[t].add(filepath);
1040
+
1041
+ fs.writeFileSync(
1042
+ destFolder + "/manifest.json",
1043
+ JSON.stringify(Array.from(files[t]))
1044
+ );
1045
+ delete files[t];
901
1046
 
902
- this.deregister(t);
903
- stderrStream.close();
904
- stdoutStream.close();
1047
+ Promise.all(screenshots[t] || []).then(() => {
1048
+ delete screenshots[t];
1049
+ page.close();
1050
+
1051
+ this.deregister(t);
1052
+ stderrStream.close();
1053
+ stdoutStream.close();
1054
+ });
905
1055
  };
906
1056
 
907
1057
  page.on("pageerror", (err: Error) => {
@@ -932,32 +1082,39 @@ export class PM_Main extends PM {
932
1082
  stdoutStream.write(JSON.stringify(log.location()));
933
1083
  stdoutStream.write(JSON.stringify(log.stackTrace()));
934
1084
  });
935
- await page.goto(`file://${`${dest}.html`}`, {});
1085
+ await page.goto(`file://${`${destFolder}.html`}`, {});
936
1086
 
937
1087
  await page
938
1088
  .evaluate(evaluation)
939
- .then(async (features: string[]) => {
940
- this.receiveFeatures(features, destFolder);
1089
+ .then(async ({ failed, features }: IFinalResults) => {
1090
+ this.receiveFeatures(features, destFolder, t);
1091
+ // console.log(`${t} completed with ${failed} errors`);
1092
+ statusMessagePretty(failed, t);
941
1093
  })
942
1094
  .catch((e) => {
943
- console.log("evaluation failed.", dest);
944
- console.log(e);
1095
+ console.log(`${t} errored with`, e);
945
1096
  })
946
1097
  .finally(() => {
947
1098
  close();
948
- // console.log("evaluation complete.", dest);
949
- // page.close();
950
- // this.deregister(t);
951
- // stderrStream.close();
952
- // stdoutStream.close();
953
1099
  });
954
1100
 
955
1101
  return page;
956
1102
  });
957
1103
  };
958
1104
 
959
- receiveFeatures = (features: string[], destFolder: string) => {
960
- console.log("this.receiveFeatures", features);
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
+
961
1118
  features
962
1119
  .reduce(async (mm, featureStringKey) => {
963
1120
  const accum = await mm;
@@ -991,29 +1148,38 @@ export class PM_Main extends PM {
991
1148
  // console.log("Symlink created successfully");
992
1149
  }
993
1150
  });
994
- accum.push(newPath);
1151
+ accum.files.push(newPath);
995
1152
  } else if (u.protocol === "http:" || u.protocol === "https:") {
996
1153
  const newPath = `${process.cwd()}/docs/features/external${
997
1154
  u.hostname
998
1155
  }${u.pathname}`;
999
1156
  const body = await this.configs.featureIngestor(featureStringKey);
1000
1157
  writeFileAndCreateDir(newPath, body);
1001
- accum.push(newPath);
1158
+ accum.files.push(newPath);
1002
1159
  }
1003
1160
  } else {
1004
- const newPath = `${process.cwd()}/docs/features/plain/${await sha256(
1005
- featureStringKey
1006
- )}`;
1007
- writeFileAndCreateDir(newPath, featureStringKey);
1008
- accum.push(newPath);
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);
1009
1172
  }
1010
1173
 
1011
1174
  return accum;
1012
- }, Promise.resolve([] as string[]))
1013
- .then((features: string[]) => {
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
+
1014
1180
  fs.writeFileSync(
1015
1181
  `${destFolder}/featurePrompt.txt`,
1016
- features
1182
+ files
1017
1183
  .map((f) => {
1018
1184
  return `/read ${f}`;
1019
1185
  })
@@ -1028,7 +1194,7 @@ async function writeFileAndCreateDir(filePath, data) {
1028
1194
 
1029
1195
  try {
1030
1196
  await fs.promises.mkdir(dirPath, { recursive: true });
1031
- await fs.promises.writeFile(filePath, data);
1197
+ await fs.appendFileSync(filePath, data);
1032
1198
  } catch (error) {
1033
1199
  console.error(`Error writing file: ${error}`);
1034
1200
  }