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
@@ -3,14 +3,16 @@ import { defaultTestResourceRequirement, } from "./lib/index.js";
3
3
  import { PM_Node } from "./PM/node.js";
4
4
  export class NodeTesteranto extends Testeranto {
5
5
  constructor(input, testSpecification, testImplementation, testResourceRequirement, testInterface) {
6
- super(input, testSpecification, testImplementation, testResourceRequirement, testInterface);
6
+ super(input, testSpecification, testImplementation, testResourceRequirement, testInterface, () => {
7
+ // no-op
8
+ });
7
9
  }
8
10
  async receiveTestResourceConfig(partialTestResource) {
9
11
  const t = JSON.parse(partialTestResource);
10
12
  const pm = new PM_Node(t);
11
13
  const { failed, artifacts, logPromise, features } = await this.testJobs[0].receiveTestResourceConfig(pm);
12
- pm.customclose();
13
- return features;
14
+ // pm.customclose();
15
+ return { features, failed };
14
16
  }
15
17
  }
16
18
  export default async (input, testSpecification, testImplementation, testInterface, testResourceRequirement = defaultTestResourceRequirement) => {
@@ -3,11 +3,22 @@ import path from "path";
3
3
  import puppeteer from "puppeteer-core";
4
4
  import crypto from "crypto";
5
5
  import { PM } from "./index.js";
6
- import { destinationOfRuntime } from "../utils.js";
7
6
  const fileStreams3 = [];
8
7
  const fPaths = [];
9
8
  const files = {};
9
+ const recorders = {};
10
10
  const screenshots = {};
11
+ const red = "\x1b[31m";
12
+ const green = "\x1b[32m";
13
+ const reset = "\x1b[0m"; // Resets to default color
14
+ const statusMessagePretty = (failures, test) => {
15
+ if (failures === 0) {
16
+ console.log(green + `${test} completed successfully` + reset);
17
+ }
18
+ else {
19
+ console.log(red + `${test} failed ${failures} times` + reset);
20
+ }
21
+ };
11
22
  export class PM_Main extends PM {
12
23
  constructor(configs) {
13
24
  super();
@@ -33,7 +44,7 @@ export class PM_Main extends PM {
33
44
  }
34
45
  };
35
46
  this.launchNode = async (src, dest) => {
36
- console.log("launchNode", src);
47
+ console.log("! node", src);
37
48
  this.register(src);
38
49
  const destFolder = dest.replace(".mjs", "");
39
50
  let argz = "";
@@ -80,26 +91,42 @@ export class PM_Main extends PM {
80
91
  console.error("negative port makes no sense", src);
81
92
  process.exit(-1);
82
93
  }
83
- const builtfile = dest + ".mjs";
84
- await Promise.all(testConfig[3].map((sidecar) => {
85
- if (sidecar[1] === "web") {
86
- return this.launchWebSideCar(sidecar[0], destinationOfRuntime(sidecar[0], "web", this.configs), sidecar);
87
- }
88
- if (sidecar[1] === "node") {
89
- return this.launchNodeSideCar(sidecar[0], destinationOfRuntime(sidecar[0], "node", this.configs), sidecar);
90
- }
91
- }));
94
+ const builtfile = dest;
95
+ const webSideCares = [];
96
+ // await Promise.all(
97
+ // testConfig[3].map(async (sidecar) => {
98
+ // if (sidecar[1] === "web") {
99
+ // const s = await this.launchWebSideCar(
100
+ // sidecar[0],
101
+ // destinationOfRuntime(sidecar[0], "web", this.configs),
102
+ // sidecar
103
+ // );
104
+ // webSideCares.push(s);
105
+ // return s;
106
+ // }
107
+ // if (sidecar[1] === "node") {
108
+ // return this.launchNodeSideCar(
109
+ // sidecar[0],
110
+ // destinationOfRuntime(sidecar[0], "node", this.configs),
111
+ // sidecar
112
+ // );
113
+ // }
114
+ // })
115
+ // );
92
116
  this.server[builtfile] = await import(`${builtfile}?cacheBust=${Date.now()}`).then((module) => {
93
117
  return module.default.then((defaultModule) => {
94
118
  defaultModule
95
119
  .receiveTestResourceConfig(argz)
96
- .then(async (features) => {
97
- this.receiveFeatures(features, destFolder);
120
+ .then(async ({ features, failed }) => {
121
+ this.receiveFeatures(features, destFolder, src);
122
+ // console.log(`${src} completed with ${failed} errors`);
123
+ statusMessagePretty(failed, src);
98
124
  })
99
125
  .catch((e) => {
100
- console.log("catch", e);
126
+ console.log(`${src} errored with`, e);
101
127
  })
102
128
  .finally(() => {
129
+ webSideCares.forEach((webSideCar) => webSideCar.close());
103
130
  this.deregister(src);
104
131
  });
105
132
  });
@@ -115,18 +142,12 @@ export class PM_Main extends PM {
115
142
  const d = dest + ".mjs";
116
143
  console.log("launchWebSideCar", src, dest, d);
117
144
  const destFolder = dest.replace(".mjs", "");
118
- const webArgz = JSON.stringify({
119
- name: dest,
120
- ports: [].toString(),
121
- fs: destFolder,
122
- browserWSEndpoint: this.browser.wsEndpoint(),
123
- });
124
- // files[src] = new Set();
125
- // const evaluation = `
126
- // console.log("importing ${dest}.mjs");
127
- // import('${dest}.mjs').then(async (x) => {
128
- // console.log("imported", x.default);
129
- // })`;
145
+ // const webArgz = JSON.stringify({
146
+ // name: dest,
147
+ // ports: [].toString(),
148
+ // fs: destFolder,
149
+ // browserWSEndpoint: this.browser.wsEndpoint(),
150
+ // });
130
151
  const fileStreams2 = [];
131
152
  const doneFileStream2 = [];
132
153
  return new Promise((res, rej) => {
@@ -205,14 +226,17 @@ export class PM_Main extends PM {
205
226
  page.exposeFunction("end", async (uid) => {
206
227
  return fileStreams2[uid].end();
207
228
  });
208
- page.exposeFunction("customclose", (p, testName) => {
209
- fs.writeFileSync(p + "/manifest.json", JSON.stringify(Array.from(files[testName])));
210
- delete files[testName];
211
- Promise.all(screenshots[testName] || []).then(() => {
212
- delete screenshots[testName];
213
- // page.close();
214
- });
215
- });
229
+ // page.exposeFunction("customclose", (p: string, testName: string) => {
230
+ // fs.writeFileSync(
231
+ // p + "/manifest.json",
232
+ // JSON.stringify(Array.from(files[testName]))
233
+ // );
234
+ // delete files[testName];
235
+ // Promise.all(screenshots[testName] || []).then(() => {
236
+ // delete screenshots[testName];
237
+ // // page.close();
238
+ // });
239
+ // });
216
240
  return page;
217
241
  })
218
242
  .then(async (page) => {
@@ -292,14 +316,18 @@ export class PM_Main extends PM {
292
316
  }
293
317
  }
294
318
  };
295
- this.launchWeb = (t, dest, sidecars) => {
296
- console.log("launchWeb", t, dest);
319
+ this.launchWeb = (t, dest) => {
320
+ console.log("! web", t);
297
321
  this.register(t);
298
- sidecars.map((sidecar) => {
299
- if (sidecar[1] === "node") {
300
- return this.launchNodeSideCar(sidecar[0], destinationOfRuntime(sidecar[0], "node", this.configs), sidecar);
301
- }
302
- });
322
+ // sidecars.map((sidecar) => {
323
+ // if (sidecar[1] === "node") {
324
+ // return this.launchNodeSideCar(
325
+ // sidecar[0],
326
+ // destinationOfRuntime(sidecar[0], "node", this.configs),
327
+ // sidecar
328
+ // );
329
+ // }
330
+ // });
303
331
  const destFolder = dest.replace(".mjs", "");
304
332
  const webArgz = JSON.stringify({
305
333
  name: dest,
@@ -307,9 +335,10 @@ export class PM_Main extends PM {
307
335
  fs: destFolder,
308
336
  browserWSEndpoint: this.browser.wsEndpoint(),
309
337
  });
338
+ const d = `${dest}?cacheBust=${Date.now()}`;
310
339
  const evaluation = `
311
- console.log("importing ${dest}.mjs");
312
- import('${dest}.mjs').then(async (x) => {
340
+ console.log("importing ${d}");
341
+ import('${d}').then(async (x) => {
313
342
  console.log("imported", (await x.default));
314
343
  try {
315
344
  return await (await x.default).receiveTestResourceConfig(${webArgz})
@@ -319,8 +348,8 @@ export class PM_Main extends PM {
319
348
  })`;
320
349
  const fileStreams2 = [];
321
350
  const doneFileStream2 = [];
322
- const stdoutStream = fs.createWriteStream(`${dest}/stdout.log`);
323
- const stderrStream = fs.createWriteStream(`${dest}/stderr.log`);
351
+ const stdoutStream = fs.createWriteStream(`${destFolder}/stdout.log`);
352
+ const stderrStream = fs.createWriteStream(`${destFolder}/stderr.log`);
324
353
  this.browser
325
354
  .newPage()
326
355
  .then((page) => {
@@ -368,20 +397,21 @@ export class PM_Main extends PM {
368
397
  // page.evaluate(`window["screenshot done"]`);
369
398
  });
370
399
  page.exposeFunction("writeFileSync", (fp, contents, testName) => {
371
- const dir = path.dirname(fp);
372
- fs.mkdirSync(dir, {
373
- recursive: true,
374
- });
375
- const p = new Promise(async (res, rej) => {
376
- fs.writeFileSync(fp, contents);
377
- res(fp);
378
- });
379
- doneFileStream2.push(p);
380
- if (!files[testName]) {
381
- files[testName] = new Set();
382
- }
383
- files[testName].add(fp);
384
- return p;
400
+ return globalThis["writeFileSync"](fp, contents, testName);
401
+ // const dir = path.dirname(fp);
402
+ // fs.mkdirSync(dir, {
403
+ // recursive: true,
404
+ // });
405
+ // const p = new Promise<string>(async (res, rej) => {
406
+ // fs.writeFileSync(fp, contents);
407
+ // res(fp);
408
+ // });
409
+ // doneFileStream2.push(p);
410
+ // if (!files[testName]) {
411
+ // files[testName] = new Set();
412
+ // }
413
+ // files[testName].add(fp);
414
+ // return p;
385
415
  });
386
416
  page.exposeFunction("existsSync", (fp, contents) => {
387
417
  return fs.existsSync(fp);
@@ -416,36 +446,37 @@ export class PM_Main extends PM {
416
446
  page.exposeFunction("end", async (uid) => {
417
447
  return fileStreams2[uid].end();
418
448
  });
419
- page.exposeFunction("customclose", (p, testName) => {
420
- // console.log("closing", p);
421
- fs.writeFileSync(p + "/manifest.json", JSON.stringify(Array.from(files[testName])));
422
- delete files[testName];
423
- // console.log("screenshots[testName]", screenshots[testName]);
424
- Promise.all(screenshots[testName] || []).then(() => {
425
- delete screenshots[testName];
426
- // page.close();
427
- // console.log("\t GOODBYE");
428
- // whyIsNodeRunning();
429
- });
430
- // globalThis["writeFileSync"](
431
- // p + "/manifest.json",
432
- // // files.entries()
433
- // JSON.stringify(Array.from(files[testName]))
434
- // );
435
- // console.log("closing doneFileStream2", doneFileStream2);
436
- // console.log("closing doneFileStream2", doneFileStream2);
437
- // Promise.all([...doneFileStream2, ...screenshots2]).then(() => {
438
- // page.close();
439
- // });
440
- // Promise.all(screenshots).then(() => {
441
- // page.close();
442
- // });
443
- // setTimeout(() => {
444
- // console.log("Delayed for 1 second.");
445
- // page.close();
446
- // }, 5000);
447
- // return page.close();
448
- });
449
+ // page.exposeFunction("customclose", (p: string, testName: string) => {
450
+ // // console.log("closing", p);
451
+ // console.log("\t GOODBYE customclose");
452
+ // fs.writeFileSync(
453
+ // p + "/manifest.json",
454
+ // JSON.stringify(Array.from(files[testName]))
455
+ // );
456
+ // delete files[testName];
457
+ // // console.log("screenshots[testName]", screenshots[testName]);
458
+ // Promise.all(screenshots[testName] || []).then(() => {
459
+ // delete screenshots[testName];
460
+ // });
461
+ // // globalThis["writeFileSync"](
462
+ // // p + "/manifest.json",
463
+ // // // files.entries()
464
+ // // JSON.stringify(Array.from(files[testName]))
465
+ // // );
466
+ // // console.log("closing doneFileStream2", doneFileStream2);
467
+ // // console.log("closing doneFileStream2", doneFileStream2);
468
+ // // Promise.all([...doneFileStream2, ...screenshots2]).then(() => {
469
+ // // page.close();
470
+ // // });
471
+ // // Promise.all(screenshots).then(() => {
472
+ // // page.close();
473
+ // // });
474
+ // // setTimeout(() => {
475
+ // // console.log("Delayed for 1 second.");
476
+ // // page.close();
477
+ // // }, 5000);
478
+ // // return page.close();
479
+ // });
449
480
  page.exposeFunction("page", () => {
450
481
  return page.mainFrame()._id;
451
482
  });
@@ -478,12 +509,19 @@ export class PM_Main extends PM {
478
509
  })
479
510
  .then(async (page) => {
480
511
  const close = () => {
481
- console.log("evaluation complete.", dest);
482
- page.off("pageerror");
483
- page.close();
484
- this.deregister(t);
485
- stderrStream.close();
486
- stdoutStream.close();
512
+ if (!files[t]) {
513
+ files[t] = new Set();
514
+ }
515
+ // files[t].add(filepath);
516
+ fs.writeFileSync(destFolder + "/manifest.json", JSON.stringify(Array.from(files[t])));
517
+ delete files[t];
518
+ Promise.all(screenshots[t] || []).then(() => {
519
+ delete screenshots[t];
520
+ page.close();
521
+ this.deregister(t);
522
+ stderrStream.close();
523
+ stdoutStream.close();
524
+ });
487
525
  };
488
526
  page.on("pageerror", (err) => {
489
527
  console.debug(`Error from ${t}: [${err.name}] `);
@@ -510,29 +548,25 @@ export class PM_Main extends PM {
510
548
  stdoutStream.write(JSON.stringify(log.location()));
511
549
  stdoutStream.write(JSON.stringify(log.stackTrace()));
512
550
  });
513
- await page.goto(`file://${`${dest}.html`}`, {});
551
+ await page.goto(`file://${`${destFolder}.html`}`, {});
514
552
  await page
515
553
  .evaluate(evaluation)
516
- .then(async (features) => {
517
- this.receiveFeatures(features, destFolder);
554
+ .then(async ({ failed, features }) => {
555
+ this.receiveFeatures(features, destFolder, t);
556
+ // console.log(`${t} completed with ${failed} errors`);
557
+ statusMessagePretty(failed, t);
518
558
  })
519
559
  .catch((e) => {
520
- console.log("evaluation failed.", dest);
521
- console.log(e);
560
+ console.log(`${t} errored with`, e);
522
561
  })
523
562
  .finally(() => {
524
563
  close();
525
- // console.log("evaluation complete.", dest);
526
- // page.close();
527
- // this.deregister(t);
528
- // stderrStream.close();
529
- // stdoutStream.close();
530
564
  });
531
565
  return page;
532
566
  });
533
567
  };
534
- this.receiveFeatures = (features, destFolder) => {
535
- console.log("this.receiveFeatures", features);
568
+ this.receiveFeatures = (features, destFolder, srcTest) => {
569
+ const featureDestination = path.resolve(process.cwd(), "docs", "features", "strings", srcTest.split(".").slice(0, -1).join(".") + ".features.txt");
536
570
  features
537
571
  .reduce(async (mm, featureStringKey) => {
538
572
  const accum = await mm;
@@ -559,24 +593,33 @@ export class PM_Main extends PM {
559
593
  // console.log("Symlink created successfully");
560
594
  }
561
595
  });
562
- accum.push(newPath);
596
+ accum.files.push(newPath);
563
597
  }
564
598
  else if (u.protocol === "http:" || u.protocol === "https:") {
565
599
  const newPath = `${process.cwd()}/docs/features/external${u.hostname}${u.pathname}`;
566
600
  const body = await this.configs.featureIngestor(featureStringKey);
567
601
  writeFileAndCreateDir(newPath, body);
568
- accum.push(newPath);
602
+ accum.files.push(newPath);
569
603
  }
570
604
  }
571
605
  else {
572
- const newPath = `${process.cwd()}/docs/features/plain/${await sha256(featureStringKey)}`;
573
- writeFileAndCreateDir(newPath, featureStringKey);
574
- accum.push(newPath);
606
+ await fs.promises.mkdir(path.dirname(featureDestination), {
607
+ recursive: true,
608
+ });
609
+ // const newPath = `${process.cwd()}/docs/features/plain/${await sha256(
610
+ // featureStringKey
611
+ // )}`;
612
+ // writeFileAndCreateDir(
613
+ // `${featureDestination}/${await sha256(featureStringKey)}`,
614
+ // featureStringKey
615
+ // );
616
+ accum.strings.push(featureStringKey);
575
617
  }
576
618
  return accum;
577
- }, Promise.resolve([]))
578
- .then((features) => {
579
- fs.writeFileSync(`${destFolder}/featurePrompt.txt`, features
619
+ }, Promise.resolve({ files: [], strings: [] }))
620
+ .then(({ files, strings }) => {
621
+ // writeFileAndCreateDir(`${featureDestination}`, JSON.stringify(strings));
622
+ fs.writeFileSync(`${destFolder}/featurePrompt.txt`, files
580
623
  .map((f) => {
581
624
  return `/read ${f}`;
582
625
  })
@@ -590,6 +633,33 @@ export class PM_Main extends PM {
590
633
  this.configs.ports.forEach((element) => {
591
634
  this.ports[element] = "true"; // set ports as open
592
635
  });
636
+ globalThis["waitForSelector"] = async (pageKey, sel) => {
637
+ console.log("waitForSelector", pageKey, sel);
638
+ const page = (await this.browser.pages()).find((p) => p.mainFrame()._id === pageKey);
639
+ await (page === null || page === void 0 ? void 0 : page.waitForSelector(sel));
640
+ };
641
+ globalThis["screencastStop"] = async (path) => {
642
+ return recorders[path].stop();
643
+ };
644
+ globalThis["closePage"] = async (pageKey) => {
645
+ const page = (await this.browser.pages()).find((p) => p.mainFrame()._id === pageKey);
646
+ return page.close();
647
+ };
648
+ // globalThis["closePage"] = (p) => {
649
+ // console.log("closePage", p);
650
+ // return p.close();
651
+ // };
652
+ globalThis["goto"] = async (pageKey, url) => {
653
+ const page = (await this.browser.pages()).find((p) => p.mainFrame()._id === pageKey);
654
+ await (page === null || page === void 0 ? void 0 : page.goto(url));
655
+ return;
656
+ };
657
+ globalThis["newPage"] = () => {
658
+ return this.browser.newPage();
659
+ };
660
+ globalThis["pages"] = () => {
661
+ return this.browser.pages();
662
+ };
593
663
  globalThis["mkdirSync"] = (fp) => {
594
664
  if (!fs.existsSync(fp)) {
595
665
  return fs.mkdirSync(fp, {
@@ -599,12 +669,14 @@ export class PM_Main extends PM {
599
669
  return false;
600
670
  };
601
671
  globalThis["writeFileSync"] = (filepath, contents, testName) => {
602
- // console.log("globalThis-writeFileSync", filepath);
672
+ // console.log(testName, "writeFileSync", filepath, testName);
603
673
  // Create directories if they don't exist
604
- const dir = path.dirname(filepath.split("/").slice(0, -1).join("/"));
674
+ const dir = path.dirname(filepath);
675
+ // console.log(testName, "mkdirSync", dir);
605
676
  fs.mkdirSync(dir, {
606
677
  recursive: true,
607
678
  });
679
+ // console.log(testName, "mkdirSync2");
608
680
  if (!files[testName]) {
609
681
  files[testName] = new Set();
610
682
  }
@@ -627,7 +699,31 @@ export class PM_Main extends PM {
627
699
  globalThis["end"] = (uid) => {
628
700
  fileStreams3[uid].end();
629
701
  };
630
- globalThis["customScreenShot"] = async (opts, page) => {
702
+ // async (ssOpts: ScreenshotOptions, testName: string) => {
703
+ // const p = ssOpts.path as string;
704
+ // const dir = path.dirname(p);
705
+ // fs.mkdirSync(dir, {
706
+ // recursive: true,
707
+ // });
708
+ // if (!files[testName]) {
709
+ // files[testName] = new Set();
710
+ // }
711
+ // files[testName].add(ssOpts.path as string);
712
+ // const sPromise = page.screenshot({
713
+ // ...ssOpts,
714
+ // path: p,
715
+ // });
716
+ // if (!screenshots[testName]) {
717
+ // screenshots[testName] = [];
718
+ // }
719
+ // screenshots[testName].push(sPromise);
720
+ // // sPromise.then(())
721
+ // await sPromise;
722
+ // return sPromise;
723
+ // // page.evaluate(`window["screenshot done"]`);
724
+ // };
725
+ globalThis["customScreenShot"] = async (opts, pageKey, testName) => {
726
+ const page = (await this.browser.pages()).find((p) => p.mainFrame()._id === pageKey);
631
727
  const p = opts.path;
632
728
  const dir = path.dirname(p);
633
729
  fs.mkdirSync(dir, {
@@ -645,13 +741,42 @@ export class PM_Main extends PM {
645
741
  await sPromise;
646
742
  return sPromise;
647
743
  };
648
- globalThis["customclose"] = (p, testName) => {
649
- if (!files[testName]) {
650
- files[testName] = new Set();
651
- }
652
- fs.writeFileSync(p + "/manifest.json", JSON.stringify(Array.from(files[testName])));
653
- delete files[testName];
744
+ globalThis["screencast"] = async (opts, pageKey) => {
745
+ const page = (await this.browser.pages()).find((p) => p.mainFrame()._id === pageKey);
746
+ const p = opts.path;
747
+ const dir = path.dirname(p);
748
+ fs.mkdirSync(dir, {
749
+ recursive: true,
750
+ });
751
+ const recorder = await (page === null || page === void 0 ? void 0 : page.screencast(Object.assign(Object.assign({}, opts), { path: p })));
752
+ recorders[opts.path] = recorder;
753
+ return opts.path;
654
754
  };
755
+ // globalThis["customclose"] = (p: string, testName: string) => {
756
+ // if (!files[testName]) {
757
+ // files[testName] = new Set();
758
+ // }
759
+ // fs.writeFileSync(
760
+ // p + "/manifest.json",
761
+ // JSON.stringify(Array.from(files[testName]))
762
+ // );
763
+ // delete files[testName];
764
+ // };
765
+ }
766
+ customclose() {
767
+ throw new Error("Method not implemented.");
768
+ }
769
+ waitForSelector(p, s) {
770
+ throw new Error("Method not implemented.");
771
+ }
772
+ closePage(p) {
773
+ throw new Error("Method not implemented.");
774
+ }
775
+ newPage() {
776
+ throw new Error("Method not implemented.");
777
+ }
778
+ goto(p, url) {
779
+ throw new Error("Method not implemented.");
655
780
  }
656
781
  $(selector) {
657
782
  throw new Error("Method not implemented.");
@@ -659,7 +784,7 @@ export class PM_Main extends PM {
659
784
  screencast(opts) {
660
785
  throw new Error("Method not implemented.");
661
786
  }
662
- customScreenShot(opts) {
787
+ customScreenShot(opts, cdpPage) {
663
788
  throw new Error("Method not implemented.");
664
789
  }
665
790
  end(accessObject) {
@@ -744,6 +869,9 @@ export class PM_Main extends PM {
744
869
  isDisabled(selector) {
745
870
  throw new Error("Method not implemented.");
746
871
  }
872
+ screencastStop(s) {
873
+ throw new Error("Method not implemented.");
874
+ }
747
875
  ////////////////////////////////////////////////////////////////////////////////
748
876
  async startPuppeteer(options, destfolder) {
749
877
  this.browser = (await puppeteer.launch(options));
@@ -759,7 +887,7 @@ async function writeFileAndCreateDir(filePath, data) {
759
887
  const dirPath = path.dirname(filePath);
760
888
  try {
761
889
  await fs.promises.mkdir(dirPath, { recursive: true });
762
- await fs.promises.writeFile(filePath, data);
890
+ await fs.appendFileSync(filePath, data);
763
891
  }
764
892
  catch (error) {
765
893
  console.error(`Error writing file: ${error}`);
@@ -8,10 +8,19 @@ export class PM_Node extends PM {
8
8
  this.server = {};
9
9
  this.testResourceConfiguration = t;
10
10
  }
11
- $(selector) {
12
- throw new Error("Method not implemented.");
11
+ waitForSelector(p, s) {
12
+ return globalThis["waitForSelector"](p, s);
13
+ }
14
+ closePage(p) {
15
+ return globalThis["closePage"](p);
16
+ }
17
+ goto(cdpPage, url) {
18
+ return globalThis["goto"](cdpPage.mainFrame()._id, url);
13
19
  }
14
- screencast(opts) {
20
+ newPage() {
21
+ return globalThis["newPage"]();
22
+ }
23
+ $(selector) {
15
24
  throw new Error("Method not implemented.");
16
25
  }
17
26
  isDisabled(selector) {
@@ -35,8 +44,14 @@ export class PM_Node extends PM {
35
44
  click(selector) {
36
45
  return globalThis["click"](selector);
37
46
  }
38
- customScreenShot(opts) {
39
- return globalThis["customScreenShot"](opts);
47
+ screencast(opts, page) {
48
+ return globalThis["screencast"](Object.assign(Object.assign({}, opts), { path: this.testResourceConfiguration.fs + "/" + opts.path }), page.mainFrame()._id, this.testResourceConfiguration.name);
49
+ }
50
+ screencastStop(p) {
51
+ return globalThis["screencastStop"](p);
52
+ }
53
+ customScreenShot(opts, cdpPage) {
54
+ return globalThis["customScreenShot"](Object.assign(Object.assign({}, opts), { path: this.testResourceConfiguration.fs + "/" + opts.path }), cdpPage.mainFrame()._id, this.testResourceConfiguration.name);
40
55
  }
41
56
  existsSync(destFolder) {
42
57
  return globalThis["existsSync"](this.testResourceConfiguration.fs + "/" + destFolder);
@@ -5,11 +5,26 @@ export class PM_Web extends PM {
5
5
  this.server = {};
6
6
  this.testResourceConfiguration = t;
7
7
  }
8
- $(selector) {
9
- return window["$"](selector);
8
+ waitForSelector(p, s) {
9
+ return window["waitForSelector"](p, s);
10
10
  }
11
11
  screencast(opts) {
12
- throw new Error("Method not implemented.");
12
+ return window["screencast"](Object.assign(Object.assign({}, opts), { path: this.testResourceConfiguration.fs + "/" + opts.path }), this.testResourceConfiguration.name);
13
+ }
14
+ screencastStop(recorder) {
15
+ return window["screencastStop"](recorder);
16
+ }
17
+ closePage(p) {
18
+ return window["closePage"](p);
19
+ }
20
+ goto(p, url) {
21
+ return window["goto"](p, url);
22
+ }
23
+ newPage() {
24
+ return window["newPage"]();
25
+ }
26
+ $(selector) {
27
+ return window["$"](selector);
13
28
  }
14
29
  isDisabled(selector) {
15
30
  return window["isDisabled"](selector);
@@ -38,7 +53,7 @@ export class PM_Web extends PM {
38
53
  existsSync(destFolder) {
39
54
  return window["existsSync"](destFolder);
40
55
  }
41
- mkdirSync() {
56
+ mkdirSync(x) {
42
57
  return window["mkdirSync"](this.testResourceConfiguration.fs + "/");
43
58
  }
44
59
  write(writeObject, contents) {