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
@@ -1,13 +1,11 @@
1
1
  import { createRequire } from 'module';const require = createRequire(import.meta.url);
2
2
 
3
- // src/Puppeteer.ts
4
- import readline from "readline";
5
- import fs2 from "fs";
6
- import watch from "recursive-watch";
3
+ // src/cli2.ts
4
+ import { watch } from "fs";
7
5
 
8
6
  // src/PM/main.ts
9
7
  import fs from "fs";
10
- import path2 from "path";
8
+ import path from "path";
11
9
  import puppeteer from "puppeteer-core";
12
10
  import crypto from "crypto";
13
11
 
@@ -15,17 +13,22 @@ import crypto from "crypto";
15
13
  var PM = class {
16
14
  };
17
15
 
18
- // src/utils.ts
19
- import path from "path";
20
- var destinationOfRuntime = (f, r, configs) => {
21
- return path.normalize(`${configs.buildDir}/${r}/${f}`).split(".").slice(0, -1).join(".");
22
- };
23
-
24
16
  // src/PM/main.ts
25
17
  var fileStreams3 = [];
26
18
  var fPaths = [];
27
19
  var files = {};
20
+ var recorders = {};
28
21
  var screenshots = {};
22
+ var red = "\x1B[31m";
23
+ var green = "\x1B[32m";
24
+ var reset = "\x1B[0m";
25
+ var statusMessagePretty = (failures, test) => {
26
+ if (failures === 0) {
27
+ console.log(green + `${test} completed successfully` + reset);
28
+ } else {
29
+ console.log(red + `${test} failed ${failures} times` + reset);
30
+ }
31
+ };
29
32
  var PM_Main = class extends PM {
30
33
  constructor(configs) {
31
34
  super();
@@ -50,7 +53,7 @@ var PM_Main = class extends PM {
50
53
  }
51
54
  };
52
55
  this.launchNode = async (src, dest) => {
53
- console.log("launchNode", src);
56
+ console.log("! node", src);
54
57
  this.register(src);
55
58
  const destFolder = dest.replace(".mjs", "");
56
59
  let argz = "";
@@ -96,32 +99,17 @@ var PM_Main = class extends PM {
96
99
  console.error("negative port makes no sense", src);
97
100
  process.exit(-1);
98
101
  }
99
- const builtfile = dest + ".mjs";
100
- await Promise.all(
101
- testConfig[3].map((sidecar) => {
102
- if (sidecar[1] === "web") {
103
- return this.launchWebSideCar(
104
- sidecar[0],
105
- destinationOfRuntime(sidecar[0], "web", this.configs),
106
- sidecar
107
- );
108
- }
109
- if (sidecar[1] === "node") {
110
- return this.launchNodeSideCar(
111
- sidecar[0],
112
- destinationOfRuntime(sidecar[0], "node", this.configs),
113
- sidecar
114
- );
115
- }
116
- })
117
- );
102
+ const builtfile = dest;
103
+ const webSideCares = [];
118
104
  this.server[builtfile] = await import(`${builtfile}?cacheBust=${Date.now()}`).then((module) => {
119
105
  return module.default.then((defaultModule) => {
120
- defaultModule.receiveTestResourceConfig(argz).then(async (features) => {
121
- this.receiveFeatures(features, destFolder);
106
+ defaultModule.receiveTestResourceConfig(argz).then(async ({ features, failed }) => {
107
+ this.receiveFeatures(features, destFolder, src);
108
+ statusMessagePretty(failed, src);
122
109
  }).catch((e) => {
123
- console.log("catch", e);
110
+ console.log(`${src} errored with`, e);
124
111
  }).finally(() => {
112
+ webSideCares.forEach((webSideCar) => webSideCar.close());
125
113
  this.deregister(src);
126
114
  });
127
115
  });
@@ -136,12 +124,6 @@ var PM_Main = class extends PM {
136
124
  const d = dest + ".mjs";
137
125
  console.log("launchWebSideCar", src, dest, d);
138
126
  const destFolder = dest.replace(".mjs", "");
139
- const webArgz = JSON.stringify({
140
- name: dest,
141
- ports: [].toString(),
142
- fs: destFolder,
143
- browserWSEndpoint: this.browser.wsEndpoint()
144
- });
145
127
  const fileStreams2 = [];
146
128
  const doneFileStream2 = [];
147
129
  return new Promise((res, rej) => {
@@ -150,7 +132,7 @@ var PM_Main = class extends PM {
150
132
  "custom-screenshot",
151
133
  async (ssOpts, testName) => {
152
134
  const p = ssOpts.path;
153
- const dir = path2.dirname(p);
135
+ const dir = path.dirname(p);
154
136
  fs.mkdirSync(dir, {
155
137
  recursive: true
156
138
  });
@@ -170,7 +152,7 @@ var PM_Main = class extends PM {
170
152
  page.exposeFunction(
171
153
  "writeFileSync",
172
154
  (fp, contents, testName) => {
173
- const dir = path2.dirname(fp);
155
+ const dir = path.dirname(fp);
174
156
  fs.mkdirSync(dir, {
175
157
  recursive: true
176
158
  });
@@ -225,16 +207,6 @@ var PM_Main = class extends PM {
225
207
  page.exposeFunction("end", async (uid) => {
226
208
  return fileStreams2[uid].end();
227
209
  });
228
- page.exposeFunction("customclose", (p, testName) => {
229
- fs.writeFileSync(
230
- p + "/manifest.json",
231
- JSON.stringify(Array.from(files[testName]))
232
- );
233
- delete files[testName];
234
- Promise.all(screenshots[testName] || []).then(() => {
235
- delete screenshots[testName];
236
- });
237
- });
238
210
  return page;
239
211
  }).then(async (page) => {
240
212
  await page.goto(`file://${`${dest}.html`}`, {});
@@ -295,18 +267,9 @@ var PM_Main = class extends PM {
295
267
  }
296
268
  }
297
269
  };
298
- this.launchWeb = (t, dest, sidecars) => {
299
- console.log("launchWeb", t, dest);
270
+ this.launchWeb = (t, dest) => {
271
+ console.log("! web", t);
300
272
  this.register(t);
301
- sidecars.map((sidecar) => {
302
- if (sidecar[1] === "node") {
303
- return this.launchNodeSideCar(
304
- sidecar[0],
305
- destinationOfRuntime(sidecar[0], "node", this.configs),
306
- sidecar
307
- );
308
- }
309
- });
310
273
  const destFolder = dest.replace(".mjs", "");
311
274
  const webArgz = JSON.stringify({
312
275
  name: dest,
@@ -314,9 +277,10 @@ var PM_Main = class extends PM {
314
277
  fs: destFolder,
315
278
  browserWSEndpoint: this.browser.wsEndpoint()
316
279
  });
280
+ const d = `${dest}?cacheBust=${Date.now()}`;
317
281
  const evaluation = `
318
- console.log("importing ${dest}.mjs");
319
- import('${dest}.mjs').then(async (x) => {
282
+ console.log("importing ${d}");
283
+ import('${d}').then(async (x) => {
320
284
  console.log("imported", (await x.default));
321
285
  try {
322
286
  return await (await x.default).receiveTestResourceConfig(${webArgz})
@@ -326,14 +290,14 @@ var PM_Main = class extends PM {
326
290
  })`;
327
291
  const fileStreams2 = [];
328
292
  const doneFileStream2 = [];
329
- const stdoutStream = fs.createWriteStream(`${dest}/stdout.log`);
330
- const stderrStream = fs.createWriteStream(`${dest}/stderr.log`);
293
+ const stdoutStream = fs.createWriteStream(`${destFolder}/stdout.log`);
294
+ const stderrStream = fs.createWriteStream(`${destFolder}/stderr.log`);
331
295
  this.browser.newPage().then((page) => {
332
296
  page.exposeFunction(
333
297
  "screencast",
334
298
  async (ssOpts, testName) => {
335
299
  const p = ssOpts.path;
336
- const dir = path2.dirname(p);
300
+ const dir = path.dirname(p);
337
301
  fs.mkdirSync(dir, {
338
302
  recursive: true
339
303
  });
@@ -357,7 +321,7 @@ var PM_Main = class extends PM {
357
321
  "customScreenShot",
358
322
  async (ssOpts, testName) => {
359
323
  const p = ssOpts.path;
360
- const dir = path2.dirname(p);
324
+ const dir = path.dirname(p);
361
325
  fs.mkdirSync(dir, {
362
326
  recursive: true
363
327
  });
@@ -380,20 +344,7 @@ var PM_Main = class extends PM {
380
344
  page.exposeFunction(
381
345
  "writeFileSync",
382
346
  (fp, contents, testName) => {
383
- const dir = path2.dirname(fp);
384
- fs.mkdirSync(dir, {
385
- recursive: true
386
- });
387
- const p = new Promise(async (res, rej) => {
388
- fs.writeFileSync(fp, contents);
389
- res(fp);
390
- });
391
- doneFileStream2.push(p);
392
- if (!files[testName]) {
393
- files[testName] = /* @__PURE__ */ new Set();
394
- }
395
- files[testName].add(fp);
396
- return p;
347
+ return globalThis["writeFileSync"](fp, contents, testName);
397
348
  }
398
349
  );
399
350
  page.exposeFunction("existsSync", (fp, contents) => {
@@ -435,16 +386,6 @@ var PM_Main = class extends PM {
435
386
  page.exposeFunction("end", async (uid) => {
436
387
  return fileStreams2[uid].end();
437
388
  });
438
- page.exposeFunction("customclose", (p, testName) => {
439
- fs.writeFileSync(
440
- p + "/manifest.json",
441
- JSON.stringify(Array.from(files[testName]))
442
- );
443
- delete files[testName];
444
- Promise.all(screenshots[testName] || []).then(() => {
445
- delete screenshots[testName];
446
- });
447
- });
448
389
  page.exposeFunction("page", () => {
449
390
  return page.mainFrame()._id;
450
391
  });
@@ -488,12 +429,21 @@ var PM_Main = class extends PM {
488
429
  return page;
489
430
  }).then(async (page) => {
490
431
  const close = () => {
491
- console.log("evaluation complete.", dest);
492
- page.off("pageerror");
493
- page.close();
494
- this.deregister(t);
495
- stderrStream.close();
496
- stdoutStream.close();
432
+ if (!files[t]) {
433
+ files[t] = /* @__PURE__ */ new Set();
434
+ }
435
+ fs.writeFileSync(
436
+ destFolder + "/manifest.json",
437
+ JSON.stringify(Array.from(files[t]))
438
+ );
439
+ delete files[t];
440
+ Promise.all(screenshots[t] || []).then(() => {
441
+ delete screenshots[t];
442
+ page.close();
443
+ this.deregister(t);
444
+ stderrStream.close();
445
+ stdoutStream.close();
446
+ });
497
447
  };
498
448
  page.on("pageerror", (err) => {
499
449
  console.debug(`Error from ${t}: [${err.name}] `);
@@ -514,31 +464,37 @@ var PM_Main = class extends PM {
514
464
  stdoutStream.write(JSON.stringify(log.location()));
515
465
  stdoutStream.write(JSON.stringify(log.stackTrace()));
516
466
  });
517
- await page.goto(`file://${`${dest}.html`}`, {});
518
- await page.evaluate(evaluation).then(async (features) => {
519
- this.receiveFeatures(features, destFolder);
467
+ await page.goto(`file://${`${destFolder}.html`}`, {});
468
+ await page.evaluate(evaluation).then(async ({ failed, features }) => {
469
+ this.receiveFeatures(features, destFolder, t);
470
+ statusMessagePretty(failed, t);
520
471
  }).catch((e) => {
521
- console.log("evaluation failed.", dest);
522
- console.log(e);
472
+ console.log(`${t} errored with`, e);
523
473
  }).finally(() => {
524
474
  close();
525
475
  });
526
476
  return page;
527
477
  });
528
478
  };
529
- this.receiveFeatures = (features, destFolder) => {
530
- console.log("this.receiveFeatures", features);
479
+ this.receiveFeatures = (features, destFolder, srcTest) => {
480
+ const featureDestination = path.resolve(
481
+ process.cwd(),
482
+ "docs",
483
+ "features",
484
+ "strings",
485
+ srcTest.split(".").slice(0, -1).join(".") + ".features.txt"
486
+ );
531
487
  features.reduce(async (mm, featureStringKey) => {
532
488
  const accum = await mm;
533
489
  const isUrl = isValidUrl(featureStringKey);
534
490
  if (isUrl) {
535
491
  const u = new URL(featureStringKey);
536
492
  if (u.protocol === "file:") {
537
- const newPath = `${process.cwd()}/docs/features/internal/${path2.relative(
493
+ const newPath = `${process.cwd()}/docs/features/internal/${path.relative(
538
494
  process.cwd(),
539
495
  u.pathname
540
496
  )}`;
541
- await fs.promises.mkdir(path2.dirname(newPath), { recursive: true });
497
+ await fs.promises.mkdir(path.dirname(newPath), { recursive: true });
542
498
  try {
543
499
  await fs.unlinkSync(newPath);
544
500
  } catch (error) {
@@ -550,25 +506,24 @@ var PM_Main = class extends PM {
550
506
  } else {
551
507
  }
552
508
  });
553
- accum.push(newPath);
509
+ accum.files.push(newPath);
554
510
  } else if (u.protocol === "http:" || u.protocol === "https:") {
555
511
  const newPath = `${process.cwd()}/docs/features/external${u.hostname}${u.pathname}`;
556
512
  const body = await this.configs.featureIngestor(featureStringKey);
557
513
  writeFileAndCreateDir(newPath, body);
558
- accum.push(newPath);
514
+ accum.files.push(newPath);
559
515
  }
560
516
  } else {
561
- const newPath = `${process.cwd()}/docs/features/plain/${await sha256(
562
- featureStringKey
563
- )}`;
564
- writeFileAndCreateDir(newPath, featureStringKey);
565
- accum.push(newPath);
517
+ await fs.promises.mkdir(path.dirname(featureDestination), {
518
+ recursive: true
519
+ });
520
+ accum.strings.push(featureStringKey);
566
521
  }
567
522
  return accum;
568
- }, Promise.resolve([])).then((features2) => {
523
+ }, Promise.resolve({ files: [], strings: [] })).then(({ files: files2, strings }) => {
569
524
  fs.writeFileSync(
570
525
  `${destFolder}/featurePrompt.txt`,
571
- features2.map((f) => {
526
+ files2.map((f) => {
572
527
  return `/read ${f}`;
573
528
  }).join("\n")
574
529
  );
@@ -581,6 +536,35 @@ var PM_Main = class extends PM {
581
536
  this.configs.ports.forEach((element) => {
582
537
  this.ports[element] = "true";
583
538
  });
539
+ globalThis["waitForSelector"] = async (pageKey, sel) => {
540
+ console.log("waitForSelector", pageKey, sel);
541
+ const page = (await this.browser.pages()).find(
542
+ (p) => p.mainFrame()._id === pageKey
543
+ );
544
+ await page?.waitForSelector(sel);
545
+ };
546
+ globalThis["screencastStop"] = async (path3) => {
547
+ return recorders[path3].stop();
548
+ };
549
+ globalThis["closePage"] = async (pageKey) => {
550
+ const page = (await this.browser.pages()).find(
551
+ (p) => p.mainFrame()._id === pageKey
552
+ );
553
+ return page.close();
554
+ };
555
+ globalThis["goto"] = async (pageKey, url) => {
556
+ const page = (await this.browser.pages()).find(
557
+ (p) => p.mainFrame()._id === pageKey
558
+ );
559
+ await page?.goto(url);
560
+ return;
561
+ };
562
+ globalThis["newPage"] = () => {
563
+ return this.browser.newPage();
564
+ };
565
+ globalThis["pages"] = () => {
566
+ return this.browser.pages();
567
+ };
584
568
  globalThis["mkdirSync"] = (fp) => {
585
569
  if (!fs.existsSync(fp)) {
586
570
  return fs.mkdirSync(fp, {
@@ -590,7 +574,7 @@ var PM_Main = class extends PM {
590
574
  return false;
591
575
  };
592
576
  globalThis["writeFileSync"] = (filepath, contents, testName) => {
593
- const dir = path2.dirname(filepath.split("/").slice(0, -1).join("/"));
577
+ const dir = path.dirname(filepath);
594
578
  fs.mkdirSync(dir, {
595
579
  recursive: true
596
580
  });
@@ -618,9 +602,12 @@ var PM_Main = class extends PM {
618
602
  globalThis["end"] = (uid) => {
619
603
  fileStreams3[uid].end();
620
604
  };
621
- globalThis["customScreenShot"] = async (opts, page) => {
605
+ globalThis["customScreenShot"] = async (opts, pageKey, testName) => {
606
+ const page = (await this.browser.pages()).find(
607
+ (p2) => p2.mainFrame()._id === pageKey
608
+ );
622
609
  const p = opts.path;
623
- const dir = path2.dirname(p);
610
+ const dir = path.dirname(p);
624
611
  fs.mkdirSync(dir, {
625
612
  recursive: true
626
613
  });
@@ -639,24 +626,45 @@ var PM_Main = class extends PM {
639
626
  await sPromise;
640
627
  return sPromise;
641
628
  };
642
- globalThis["customclose"] = (p, testName) => {
643
- if (!files[testName]) {
644
- files[testName] = /* @__PURE__ */ new Set();
645
- }
646
- fs.writeFileSync(
647
- p + "/manifest.json",
648
- JSON.stringify(Array.from(files[testName]))
629
+ globalThis["screencast"] = async (opts, pageKey) => {
630
+ const page = (await this.browser.pages()).find(
631
+ (p2) => p2.mainFrame()._id === pageKey
649
632
  );
650
- delete files[testName];
633
+ const p = opts.path;
634
+ const dir = path.dirname(p);
635
+ fs.mkdirSync(dir, {
636
+ recursive: true
637
+ });
638
+ const recorder = await page?.screencast({
639
+ ...opts,
640
+ path: p
641
+ });
642
+ recorders[opts.path] = recorder;
643
+ return opts.path;
651
644
  };
652
645
  }
646
+ customclose() {
647
+ throw new Error("Method not implemented.");
648
+ }
649
+ waitForSelector(p, s) {
650
+ throw new Error("Method not implemented.");
651
+ }
652
+ closePage(p) {
653
+ throw new Error("Method not implemented.");
654
+ }
655
+ newPage() {
656
+ throw new Error("Method not implemented.");
657
+ }
658
+ goto(p, url) {
659
+ throw new Error("Method not implemented.");
660
+ }
653
661
  $(selector) {
654
662
  throw new Error("Method not implemented.");
655
663
  }
656
664
  screencast(opts) {
657
665
  throw new Error("Method not implemented.");
658
666
  }
659
- customScreenShot(opts) {
667
+ customScreenShot(opts, cdpPage) {
660
668
  throw new Error("Method not implemented.");
661
669
  }
662
670
  end(accessObject) {
@@ -684,7 +692,7 @@ var PM_Main = class extends PM {
684
692
  callback(
685
693
  new Promise((res, rej) => {
686
694
  tLog("testArtiFactory =>", fPath);
687
- const cleanPath = path2.resolve(fPath);
695
+ const cleanPath = path.resolve(fPath);
688
696
  fPaths.push(cleanPath.replace(process.cwd(), ``));
689
697
  const targetDir = cleanPath.split("/").slice(0, -1).join("/");
690
698
  fs.mkdir(targetDir, { recursive: true }, async (error) => {
@@ -692,7 +700,7 @@ var PM_Main = class extends PM {
692
700
  console.error(`\u2757\uFE0FtestArtiFactory failed`, targetDir, error);
693
701
  }
694
702
  fs.writeFileSync(
695
- path2.resolve(
703
+ path.resolve(
696
704
  targetDir.split("/").slice(0, -1).join("/"),
697
705
  "manifest"
698
706
  ),
@@ -748,6 +756,9 @@ var PM_Main = class extends PM {
748
756
  isDisabled(selector) {
749
757
  throw new Error("Method not implemented.");
750
758
  }
759
+ screencastStop(s) {
760
+ throw new Error("Method not implemented.");
761
+ }
751
762
  ////////////////////////////////////////////////////////////////////////////////
752
763
  async startPuppeteer(options, destfolder) {
753
764
  this.browser = await puppeteer.launch(options);
@@ -760,21 +771,14 @@ var PM_Main = class extends PM {
760
771
  }
761
772
  };
762
773
  async function writeFileAndCreateDir(filePath, data) {
763
- const dirPath = path2.dirname(filePath);
774
+ const dirPath = path.dirname(filePath);
764
775
  try {
765
776
  await fs.promises.mkdir(dirPath, { recursive: true });
766
- await fs.promises.writeFile(filePath, data);
777
+ await fs.appendFileSync(filePath, data);
767
778
  } catch (error) {
768
779
  console.error(`Error writing file: ${error}`);
769
780
  }
770
781
  }
771
- async function sha256(rawData) {
772
- const data = typeof rawData === "object" ? JSON.stringify(rawData) : String(rawData);
773
- const msgBuffer = new TextEncoder().encode(data);
774
- const hashBuffer = await crypto.subtle.digest("SHA-256", msgBuffer);
775
- const hashArray = Array.from(new Uint8Array(hashBuffer));
776
- return hashArray.map((b) => b.toString(16).padStart(2, "0")).join("");
777
- }
778
782
  function isValidUrl(string) {
779
783
  try {
780
784
  new URL(string);
@@ -784,36 +788,64 @@ function isValidUrl(string) {
784
788
  }
785
789
  }
786
790
 
787
- // src/Puppeteer.ts
788
- readline.emitKeypressEvents(process.stdin);
789
- if (process.stdin.isTTY)
790
- process.stdin.setRawMode(true);
791
- var Puppeteer_default = async (partialConfig) => {
791
+ // src/cli2.ts
792
+ import path2 from "path";
793
+ import crypto2 from "node:crypto";
794
+ import fs2 from "fs";
795
+ var fileHashes = {};
796
+ async function fileHash(filePath, algorithm = "md5") {
797
+ return new Promise((resolve, reject) => {
798
+ const hash = crypto2.createHash(algorithm);
799
+ const fileStream = fs2.createReadStream(filePath);
800
+ fileStream.on("data", (data) => {
801
+ hash.update(data);
802
+ });
803
+ fileStream.on("end", () => {
804
+ const fileHash2 = hash.digest("hex");
805
+ resolve(fileHash2);
806
+ });
807
+ fileStream.on("error", (error) => {
808
+ reject(`Error reading file: ${error.message}`);
809
+ });
810
+ });
811
+ }
812
+ var getRunnables = (tests, payload = {
813
+ nodeEntryPoints: {},
814
+ webEntryPoints: {}
815
+ }) => {
816
+ return tests.reduce((pt, cv, cndx, cry) => {
817
+ if (cv[1] === "node") {
818
+ pt.nodeEntryPoints[cv[0]] = path2.resolve(
819
+ `./docs/node/${cv[0].split(".").slice(0, -1).concat("mjs").join(".")}`
820
+ );
821
+ } else if (cv[1] === "web") {
822
+ pt.webEntryPoints[cv[0]] = path2.resolve(
823
+ `./docs/web/${cv[0].split(".").slice(0, -1).concat("mjs").join(".")}`
824
+ );
825
+ }
826
+ if (cv[3].length) {
827
+ getRunnables(cv[3], payload);
828
+ }
829
+ return pt;
830
+ }, payload);
831
+ };
832
+ import(process.cwd() + "/" + process.argv[2]).then(async (module) => {
833
+ const rawConfig = module.default;
792
834
  const config = {
793
- ...partialConfig,
794
- buildDir: process.cwd() + "/" + partialConfig.outdir
835
+ ...rawConfig,
836
+ buildDir: process.cwd() + "/" + rawConfig.outdir
795
837
  };
796
- fs2.writeFileSync(
797
- `${config.outdir}/testeranto.json`,
798
- JSON.stringify(
799
- {
800
- ...config,
801
- buildDir: process.cwd() + "/" + config.outdir
802
- },
803
- null,
804
- 2
805
- )
806
- );
807
- const pm = new PM_Main(config);
838
+ let pm = new PM_Main(config);
808
839
  await pm.startPuppeteer(
809
840
  {
841
+ slowMo: 1,
810
842
  // timeout: 1,
811
843
  waitForInitialPage: false,
812
844
  executablePath: (
813
845
  // process.env.CHROMIUM_PATH || "/opt/homebrew/bin/chromium",
814
846
  "/opt/homebrew/bin/chromium"
815
847
  ),
816
- headless: false,
848
+ headless: true,
817
849
  dumpio: true,
818
850
  // timeout: 0,
819
851
  devtools: true,
@@ -850,58 +882,37 @@ var Puppeteer_default = async (partialConfig) => {
850
882
  },
851
883
  "."
852
884
  );
853
- console.log(
854
- "\n Puppeteer is running. Press 'q' to shutdown softly. Press 'x' to shutdown forcefully.\n"
855
- );
856
- process.stdin.on("keypress", (str, key) => {
857
- if (key.name === "q") {
858
- pm.shutDown();
859
- }
860
- if (key.name === "x") {
861
- process.exit(-1);
862
- }
863
- });
864
- config.tests.forEach(([test, runtime, tr, sidecars]) => {
865
- if (runtime === "node") {
866
- pm.launchNode(test, destinationOfRuntime(test, "node", config));
867
- } else if (runtime === "web") {
868
- pm.launchWeb(test, destinationOfRuntime(test, "web", config), sidecars);
869
- } else {
870
- console.error("runtime makes no sense", runtime);
871
- }
872
- });
873
- if (config.devMode) {
874
- console.log("ready and watching for changes...", config.buildDir);
875
- watch(config.buildDir, (eventType, changedFile) => {
876
- if (changedFile) {
877
- config.tests.forEach(([test, runtime, tr, sidecars]) => {
878
- if (eventType === "change" || eventType === "rename") {
879
- if (changedFile === test.replace("./", "node/").split(".").slice(0, -1).concat("mjs").join(".")) {
880
- pm.launchNode(test, destinationOfRuntime(test, "node", config));
881
- }
882
- if (changedFile === test.replace("./", "web/").split(".").slice(0, -1).concat("mjs").join(".")) {
883
- pm.launchWeb(
884
- test,
885
- destinationOfRuntime(test, "web", config),
886
- sidecars
887
- );
888
- }
885
+ const { nodeEntryPoints, webEntryPoints } = getRunnables(config.tests);
886
+ Object.entries(nodeEntryPoints).forEach(
887
+ ([k, outputFile]) => {
888
+ console.log("watching and running", outputFile);
889
+ pm.launchNode(k, outputFile);
890
+ try {
891
+ watch(outputFile, async (e, filename) => {
892
+ const hash = await fileHash(outputFile);
893
+ if (fileHashes[k] !== hash) {
894
+ fileHashes[k] = hash;
895
+ console.log(`< ${e} ${filename} ${hash}`);
896
+ pm.launchNode(k, outputFile);
889
897
  }
890
898
  });
899
+ } catch (e) {
900
+ console.error(e);
891
901
  }
892
- });
893
- } else {
894
- pm.shutDown();
895
- }
896
- };
897
-
898
- // src/run-tests.ts
899
- import process2 from "process";
900
- if (!process2.argv[2]) {
901
- console.log("You didn't pass a config file");
902
- process2.exit(-1);
903
- } else {
904
- import(process2.cwd() + "/" + process2.argv[2]).then((module) => {
905
- Puppeteer_default(module.default);
906
- });
907
- }
902
+ }
903
+ );
904
+ Object.entries(webEntryPoints).forEach(
905
+ ([k, outputFile]) => {
906
+ console.log("watching and running", outputFile);
907
+ pm.launchWeb(k, outputFile);
908
+ watch(outputFile, async (e, filename) => {
909
+ const hash = await fileHash(outputFile);
910
+ console.log(`< ${e} ${filename} ${hash}`);
911
+ if (fileHashes[k] !== hash) {
912
+ fileHashes[k] = hash;
913
+ pm.launchWeb(k, outputFile);
914
+ }
915
+ });
916
+ }
917
+ );
918
+ });