testeranto 0.94.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 (103) hide show
  1. package/bundle.js +4 -7
  2. package/dist/common/src/PM/main.js +160 -42
  3. package/dist/common/src/PM/node.js +20 -5
  4. package/dist/common/src/PM/web.js +19 -4
  5. package/dist/common/src/SubPackages/react/jsx/node.js +1 -6
  6. package/dist/common/src/cli.js +439 -0
  7. package/dist/common/src/cli2.js +144 -0
  8. package/dist/common/src/esbuildConfigs/inputFilesPlugin.js +18 -6
  9. package/dist/common/src/esbuildConfigs/node.js +1 -4
  10. package/dist/common/src/esbuildConfigs/web.js +1 -1
  11. package/dist/common/src/lib/abstractBase.js +14 -91
  12. package/dist/common/src/lib/types.js +1 -0
  13. package/dist/common/tsconfig.common.tsbuildinfo +1 -1
  14. package/dist/module/src/PM/main.js +160 -42
  15. package/dist/module/src/PM/node.js +20 -5
  16. package/dist/module/src/PM/web.js +19 -4
  17. package/dist/module/src/SubPackages/react/jsx/node.js +1 -6
  18. package/dist/module/src/cli.js +411 -0
  19. package/dist/module/src/cli2.js +116 -0
  20. package/dist/module/src/esbuildConfigs/inputFilesPlugin.js +18 -6
  21. package/dist/module/src/esbuildConfigs/node.js +1 -4
  22. package/dist/module/src/esbuildConfigs/web.js +1 -1
  23. package/dist/module/src/lib/abstractBase.js +14 -91
  24. package/dist/module/src/lib/types.js +1 -0
  25. package/dist/module/tsconfig.module.tsbuildinfo +1 -1
  26. package/dist/prebuild/cli.mjs +1491 -0
  27. package/dist/prebuild/{run-tests.mjs → cli2.mjs} +203 -156
  28. package/dist/types/src/Node.d.ts +2 -2
  29. package/dist/types/src/PM/index.d.ts +10 -2
  30. package/dist/types/src/PM/main.d.ts +13 -7
  31. package/dist/types/src/PM/node.d.ts +9 -2
  32. package/dist/types/src/PM/web.d.ts +9 -3
  33. package/dist/types/src/SubPackages/puppeteer.d.ts +1 -1
  34. package/dist/types/src/SubPackages/react/component/node.d.ts +1 -1
  35. package/dist/types/src/SubPackages/react/component/web.d.ts +1 -1
  36. package/dist/types/src/SubPackages/react/jsx/node.d.ts +3 -3
  37. package/dist/types/src/SubPackages/react/jsx/web.d.ts +2 -2
  38. package/dist/types/src/SubPackages/react-dom/component/node.d.ts +2 -2
  39. package/dist/types/src/SubPackages/react-dom/component/web.d.ts +1 -1
  40. package/dist/types/src/SubPackages/react-dom/jsx/node.d.ts +1 -1
  41. package/dist/types/src/SubPackages/react-dom/jsx/web.d.ts +2 -2
  42. package/dist/types/src/SubPackages/react-test-renderer/MemoExoticComponent/node.d.ts +2 -2
  43. package/dist/types/src/SubPackages/react-test-renderer/component/node.d.ts +2 -2
  44. package/dist/types/src/SubPackages/react-test-renderer/component/web.d.ts +2 -2
  45. package/dist/types/src/SubPackages/react-test-renderer/fc/node.d.ts +2 -2
  46. package/dist/types/src/SubPackages/react-test-renderer/fc/web.d.ts +2 -2
  47. package/dist/types/src/SubPackages/react-test-renderer/jsx/node.d.ts +3 -2
  48. package/dist/types/src/SubPackages/react-test-renderer/jsx/web.d.ts +2 -2
  49. package/dist/types/src/SubPackages/react-test-renderer/jsx-promised/node.d.ts +2 -2
  50. package/dist/types/src/SubPackages/react-test-renderer/jsx-promised/web.d.ts +2 -2
  51. package/dist/types/src/Types.d.ts +60 -21
  52. package/dist/types/src/Web.d.ts +2 -2
  53. package/dist/types/src/lib/index.d.ts +1 -1
  54. package/dist/types/src/lib/types.d.ts +2 -30
  55. package/dist/types/tsconfig.types.tsbuildinfo +1 -1
  56. package/package.json +11 -8
  57. package/src/PM/index.ts +12 -8
  58. package/src/PM/main.ts +218 -62
  59. package/src/PM/node.ts +42 -7
  60. package/src/PM/web.ts +33 -5
  61. package/src/SubPackages/react/jsx/node.ts +16 -5
  62. package/src/SubPackages/react-test-renderer/jsx/node.ts +16 -1
  63. package/src/Types.ts +362 -114
  64. package/src/cli.ts +535 -0
  65. package/src/cli2.ts +157 -0
  66. package/src/esbuildConfigs/inputFilesPlugin.ts +27 -6
  67. package/src/esbuildConfigs/node.ts +4 -7
  68. package/src/esbuildConfigs/web.ts +4 -3
  69. package/src/lib/abstractBase.ts +58 -115
  70. package/src/lib/types.ts +3 -177
  71. package/dist/common/src/Aider.js +0 -143
  72. package/dist/common/src/Project.js +0 -227
  73. package/dist/common/src/Puppeteer.js +0 -111
  74. package/dist/common/src/build-tests.js +0 -39
  75. package/dist/common/src/esbuildConfigs/features.js +0 -14
  76. package/dist/common/src/esbuildConfigs/report.js +0 -14
  77. package/dist/common/src/esbuildConfigs/tests.js +0 -13
  78. package/dist/common/src/run-tests.js +0 -39
  79. package/dist/module/src/Aider.js +0 -136
  80. package/dist/module/src/Project.js +0 -220
  81. package/dist/module/src/Puppeteer.js +0 -106
  82. package/dist/module/src/build-tests.js +0 -11
  83. package/dist/module/src/esbuildConfigs/features.js +0 -12
  84. package/dist/module/src/esbuildConfigs/report.js +0 -14
  85. package/dist/module/src/esbuildConfigs/tests.js +0 -11
  86. package/dist/module/src/run-tests.js +0 -11
  87. package/dist/prebuild/build-tests.mjs +0 -553
  88. package/dist/types/src/Aider.d.ts +0 -1
  89. package/dist/types/src/Project.d.ts +0 -12
  90. package/dist/types/src/Puppeteer.d.ts +0 -2
  91. package/dist/types/src/esbuildConfigs/features.d.ts +0 -4
  92. package/dist/types/src/esbuildConfigs/report.d.ts +0 -0
  93. package/dist/types/src/esbuildConfigs/tests.d.ts +0 -4
  94. package/src/Aider.ts +0 -168
  95. package/src/Project.ts +0 -292
  96. package/src/Puppeteer.ts +0 -143
  97. package/src/build-tests.ts +0 -12
  98. package/src/esbuildConfigs/features.ts +0 -17
  99. package/src/esbuildConfigs/report.ts +0 -15
  100. package/src/esbuildConfigs/tests.ts +0 -14
  101. package/src/run-tests.ts +0 -12
  102. /package/dist/types/src/{build-tests.d.ts → cli.d.ts} +0 -0
  103. /package/dist/types/src/{run-tests.d.ts → cli2.d.ts} +0 -0
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "testeranto",
3
3
  "description": "the AI powered BDD test framework for typescript projects",
4
- "version": "0.94.0",
4
+ "version": "0.100.0",
5
5
  "engines": {
6
6
  "node": "18.18.0"
7
7
  },
@@ -144,10 +144,6 @@
144
144
  "import": "./src/Node.ts",
145
145
  "require": "./src/Node.ts"
146
146
  },
147
- "./src/Aider": {
148
- "import": "./dist/module/src/Aider.js",
149
- "require": "./dist/common/src/Aider.js"
150
- },
151
147
  "./src/Init": {
152
148
  "import": "./dist/module/src/Init.js",
153
149
  "require": "./dist/common/src/Init.js"
@@ -200,12 +196,15 @@
200
196
  "@types/react": "18.2.0",
201
197
  "@types/react-dom": "18.2.0",
202
198
  "@types/react-test-renderer": "19.0.0",
199
+ "eslint": "9.23.0",
203
200
  "react": "18.2.0",
204
201
  "react-dom": "18.2.0",
205
202
  "ts-node": "^10.9.1",
206
- "typescript": "4.8.2"
203
+ "typescript": "4.8.2",
204
+ "typescript-eslint": "^8.29.0"
207
205
  },
208
206
  "devDependencies": {
207
+ "@eslint/js": "^9.23.0",
209
208
  "@swc/core": "^1.3.26",
210
209
  "@types/express": "^5.0.0",
211
210
  "@types/express-session": "^1.18.1",
@@ -218,9 +217,13 @@
218
217
  "@typescript-eslint/eslint-plugin": "^5.46.0",
219
218
  "@typescript-eslint/parser": "^5.46.0",
220
219
  "ts-node": "^10.9.1",
221
- "typescript": "4.8.2"
220
+ "typescript": "^5.8.2"
222
221
  },
223
222
  "dependencies": {
223
+ "@bscotch/debounce-watch": "^1.1.0",
224
+ "@humanwhocodes/config-array": "^0.13.0",
225
+ "@types/eslint": "^9.6.1",
226
+ "@ungap/structured-clone": "^1.3.0",
224
227
  "babel-loader": "^8.2.5",
225
228
  "chai": "^5.2.0",
226
229
  "chromium": "^3.0.3",
@@ -229,7 +232,7 @@
229
232
  "esbuild-plugin-external-package": "^1.0.0",
230
233
  "esbuild-plugin-import-map": "^2.1.0",
231
234
  "esbuild-plugin-markdown": "^0.0.3",
232
- "eslint": "^8.29.0",
235
+ "eslint-plugin-import": "^2.31.0",
233
236
  "eslint-plugin-react": "^7.31.11",
234
237
  "eslint-plugin-react-hooks": "^5.1.0",
235
238
  "express": "^4.21.2",
package/src/PM/index.ts CHANGED
@@ -1,9 +1,6 @@
1
- import {
2
- Browser,
3
- Page,
4
- } from "puppeteer-core/lib/esm/puppeteer/puppeteer-core-browser";
1
+ import { CdpPage } from "puppeteer-core/lib/esm/puppeteer/puppeteer-core-browser";
2
+ import { ScreenRecorderOptions } from "puppeteer-core/lib/esm/puppeteer";
5
3
  import { ITLog, ITTestResourceConfiguration } from "../lib";
6
- // import { Page } from "puppeteer-core";
7
4
 
8
5
  type IFPaths = string[];
9
6
  const fPaths: IFPaths = [];
@@ -12,7 +9,6 @@ export abstract class PM {
12
9
  server: any;
13
10
  testResourceConfiguration: ITTestResourceConfiguration;
14
11
 
15
- // abstract startPuppeteer(options: any, destfolder: string): Promise<Browser>;
16
12
  abstract testArtiFactoryfileWriter(tLog: ITLog, callback: (Promise) => void);
17
13
  abstract createWriteStream(filepath: string): any;
18
14
  abstract writeFileSync(fp: string, contents: string);
@@ -20,8 +16,9 @@ export abstract class PM {
20
16
  abstract existsSync(fp: string): boolean;
21
17
  abstract write(accessObject: { uid: number }, contents: string): boolean;
22
18
  abstract end(accessObject: { uid: number }): boolean;
23
- abstract customScreenShot(opts: object): any;
24
- abstract screencast(opts: object): any;
19
+ abstract customScreenShot(opts: object, page?: string): any;
20
+ abstract screencast(opts: ScreenRecorderOptions, p?): any;
21
+ abstract screencastStop(s: string): any;
25
22
 
26
23
  abstract page(): string | undefined;
27
24
  abstract click(selector: string): any;
@@ -31,4 +28,11 @@ export abstract class PM {
31
28
  abstract getAttribute(selector: string, attribute: string): any;
32
29
  abstract isDisabled(selector: string): boolean;
33
30
  abstract $(selector: string): any;
31
+
32
+ abstract newPage(): CdpPage;
33
+ abstract goto(p, url: string): any;
34
+ abstract closePage(p): any;
35
+
36
+ abstract waitForSelector(p, sel: string);
37
+ abstract customclose();
34
38
  }
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
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, {
@@ -99,10 +153,41 @@ export class PM_Main extends PM {
99
153
  fileStreams3[uid].end();
100
154
  };
101
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
+
102
182
  globalThis["customScreenShot"] = async (
103
183
  opts: { path: string },
104
- page: Page
184
+ pageKey: string,
185
+ testName: string
105
186
  ) => {
187
+ const page = (await this.browser.pages()).find(
188
+ (p) => p.mainFrame()._id === pageKey
189
+ );
190
+
106
191
  const p = opts.path as string;
107
192
  const dir = path.dirname(p);
108
193
  fs.mkdirSync(dir, {
@@ -127,6 +212,30 @@ export class PM_Main extends PM {
127
212
  return sPromise;
128
213
  };
129
214
 
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
221
+ );
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;
237
+ };
238
+
130
239
  // globalThis["customclose"] = (p: string, testName: string) => {
131
240
  // if (!files[testName]) {
132
241
  // files[testName] = new Set();
@@ -140,13 +249,29 @@ export class PM_Main extends PM {
140
249
  // };
141
250
  }
142
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.");
266
+ }
267
+
143
268
  $(selector: string): boolean {
144
269
  throw new Error("Method not implemented.");
145
270
  }
146
271
  screencast(opts: object) {
147
272
  throw new Error("Method not implemented.");
148
273
  }
149
- customScreenShot(opts: object) {
274
+ customScreenShot(opts: object, cdpPage?: CdpPage) {
150
275
  throw new Error("Method not implemented.");
151
276
  }
152
277
 
@@ -250,9 +375,15 @@ export class PM_Main extends PM {
250
375
  isDisabled(selector: string): boolean {
251
376
  throw new Error("Method not implemented.");
252
377
  }
378
+ screencastStop(s: string) {
379
+ throw new Error("Method not implemented.");
380
+ }
253
381
  ////////////////////////////////////////////////////////////////////////////////
254
382
 
255
- async startPuppeteer(options: any, destfolder: string): Promise<any> {
383
+ async startPuppeteer(
384
+ options: LaunchOptions,
385
+ destfolder: string
386
+ ): Promise<any> {
256
387
  this.browser = (await puppeteer.launch(options)) as any;
257
388
  }
258
389
 
@@ -288,7 +419,7 @@ export class PM_Main extends PM {
288
419
  };
289
420
 
290
421
  launchNode = async (src: string, dest: string) => {
291
- console.log("launchNode", src);
422
+ console.log("! node", src);
292
423
  this.register(src);
293
424
 
294
425
  const destFolder = dest.replace(".mjs", "");
@@ -343,31 +474,31 @@ export class PM_Main extends PM {
343
474
  process.exit(-1);
344
475
  }
345
476
 
346
- const builtfile = dest + ".mjs";
477
+ const builtfile = dest;
347
478
 
348
479
  const webSideCares: Page[] = [];
349
480
 
350
- await Promise.all(
351
- testConfig[3].map(async (sidecar) => {
352
- if (sidecar[1] === "web") {
353
- const s = await this.launchWebSideCar(
354
- sidecar[0],
355
- destinationOfRuntime(sidecar[0], "web", this.configs),
356
- sidecar
357
- );
358
- webSideCares.push(s);
359
- return s;
360
- }
361
-
362
- if (sidecar[1] === "node") {
363
- return this.launchNodeSideCar(
364
- sidecar[0],
365
- destinationOfRuntime(sidecar[0], "node", this.configs),
366
- sidecar
367
- );
368
- }
369
- })
370
- );
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
+ // );
371
502
 
372
503
  this.server[builtfile] = await import(
373
504
  `${builtfile}?cacheBust=${Date.now()}`
@@ -376,8 +507,9 @@ export class PM_Main extends PM {
376
507
  defaultModule
377
508
  .receiveTestResourceConfig(argz)
378
509
  .then(async ({ features, failed }: IFinalResults) => {
379
- this.receiveFeatures(features, destFolder);
380
- console.log(`${src} completed with ${failed} errors`);
510
+ this.receiveFeatures(features, destFolder, src);
511
+ // console.log(`${src} completed with ${failed} errors`);
512
+ statusMessagePretty(failed, src);
381
513
  })
382
514
  .catch((e) => {
383
515
  console.log(`${src} errored with`, e);
@@ -633,19 +765,19 @@ export class PM_Main extends PM {
633
765
  }
634
766
  };
635
767
 
636
- launchWeb = (t: string, dest: string, sidecars: ITestTypes[]) => {
637
- console.log("launchWeb", t, dest);
768
+ launchWeb = (t: string, dest: string) => {
769
+ console.log("! web", t);
638
770
  this.register(t);
639
771
 
640
- sidecars.map((sidecar) => {
641
- if (sidecar[1] === "node") {
642
- return this.launchNodeSideCar(
643
- sidecar[0],
644
- destinationOfRuntime(sidecar[0], "node", this.configs),
645
- sidecar
646
- );
647
- }
648
- });
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
+ // });
649
781
 
650
782
  const destFolder = dest.replace(".mjs", "");
651
783
 
@@ -656,9 +788,11 @@ export class PM_Main extends PM {
656
788
  browserWSEndpoint: this.browser.wsEndpoint(),
657
789
  });
658
790
 
791
+ const d = `${dest}?cacheBust=${Date.now()}`;
792
+
659
793
  const evaluation = `
660
- console.log("importing ${dest}.mjs");
661
- import('${dest}.mjs').then(async (x) => {
794
+ console.log("importing ${d}");
795
+ import('${d}').then(async (x) => {
662
796
  console.log("imported", (await x.default));
663
797
  try {
664
798
  return await (await x.default).receiveTestResourceConfig(${webArgz})
@@ -670,8 +804,8 @@ export class PM_Main extends PM {
670
804
  const fileStreams2: fs.WriteStream[] = [];
671
805
  const doneFileStream2: Promise<any>[] = [];
672
806
 
673
- const stdoutStream = fs.createWriteStream(`${dest}/stdout.log`);
674
- const stderrStream = fs.createWriteStream(`${dest}/stderr.log`);
807
+ const stdoutStream = fs.createWriteStream(`${destFolder}/stdout.log`);
808
+ const stderrStream = fs.createWriteStream(`${destFolder}/stderr.log`);
675
809
 
676
810
  this.browser
677
811
  .newPage()
@@ -905,7 +1039,7 @@ export class PM_Main extends PM {
905
1039
  // files[t].add(filepath);
906
1040
 
907
1041
  fs.writeFileSync(
908
- dest + "/manifest.json",
1042
+ destFolder + "/manifest.json",
909
1043
  JSON.stringify(Array.from(files[t]))
910
1044
  );
911
1045
  delete files[t];
@@ -948,13 +1082,14 @@ export class PM_Main extends PM {
948
1082
  stdoutStream.write(JSON.stringify(log.location()));
949
1083
  stdoutStream.write(JSON.stringify(log.stackTrace()));
950
1084
  });
951
- await page.goto(`file://${`${dest}.html`}`, {});
1085
+ await page.goto(`file://${`${destFolder}.html`}`, {});
952
1086
 
953
1087
  await page
954
1088
  .evaluate(evaluation)
955
1089
  .then(async ({ failed, features }: IFinalResults) => {
956
- this.receiveFeatures(features, destFolder);
957
- console.log(`${t} completed with ${failed} errors`);
1090
+ this.receiveFeatures(features, destFolder, t);
1091
+ // console.log(`${t} completed with ${failed} errors`);
1092
+ statusMessagePretty(failed, t);
958
1093
  })
959
1094
  .catch((e) => {
960
1095
  console.log(`${t} errored with`, e);
@@ -967,7 +1102,19 @@ export class PM_Main extends PM {
967
1102
  });
968
1103
  };
969
1104
 
970
- receiveFeatures = (features: string[], destFolder: string) => {
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
+
971
1118
  features
972
1119
  .reduce(async (mm, featureStringKey) => {
973
1120
  const accum = await mm;
@@ -1001,29 +1148,38 @@ export class PM_Main extends PM {
1001
1148
  // console.log("Symlink created successfully");
1002
1149
  }
1003
1150
  });
1004
- accum.push(newPath);
1151
+ accum.files.push(newPath);
1005
1152
  } else if (u.protocol === "http:" || u.protocol === "https:") {
1006
1153
  const newPath = `${process.cwd()}/docs/features/external${
1007
1154
  u.hostname
1008
1155
  }${u.pathname}`;
1009
1156
  const body = await this.configs.featureIngestor(featureStringKey);
1010
1157
  writeFileAndCreateDir(newPath, body);
1011
- accum.push(newPath);
1158
+ accum.files.push(newPath);
1012
1159
  }
1013
1160
  } else {
1014
- const newPath = `${process.cwd()}/docs/features/plain/${await sha256(
1015
- featureStringKey
1016
- )}`;
1017
- writeFileAndCreateDir(newPath, featureStringKey);
1018
- 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);
1019
1172
  }
1020
1173
 
1021
1174
  return accum;
1022
- }, Promise.resolve([] as string[]))
1023
- .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
+
1024
1180
  fs.writeFileSync(
1025
1181
  `${destFolder}/featurePrompt.txt`,
1026
- features
1182
+ files
1027
1183
  .map((f) => {
1028
1184
  return `/read ${f}`;
1029
1185
  })
@@ -1038,7 +1194,7 @@ async function writeFileAndCreateDir(filePath, data) {
1038
1194
 
1039
1195
  try {
1040
1196
  await fs.promises.mkdir(dirPath, { recursive: true });
1041
- await fs.promises.writeFile(filePath, data);
1197
+ await fs.appendFileSync(filePath, data);
1042
1198
  } catch (error) {
1043
1199
  console.error(`Error writing file: ${error}`);
1044
1200
  }
package/src/PM/node.ts CHANGED
@@ -1,12 +1,12 @@
1
1
  import fs from "fs";
2
2
  import path from "path";
3
- import puppeteer from "puppeteer-core";
3
+ import puppeteer, { ScreencastOptions, ScreenRecorder } from "puppeteer-core";
4
4
  import { PassThrough } from "stream";
5
5
 
6
6
  import { ITLog, ITTestResourceConfiguration } from "../lib";
7
7
 
8
8
  import { PM } from "./index.js";
9
- import { Page } from "puppeteer-core/lib/esm/puppeteer";
9
+ import { CdpPage, Page } from "puppeteer-core/lib/esm/puppeteer";
10
10
 
11
11
  type IFPaths = string[];
12
12
  const fPaths: IFPaths = [];
@@ -23,10 +23,23 @@ export class PM_Node extends PM {
23
23
  this.testResourceConfiguration = t;
24
24
  }
25
25
 
26
- $(selector: string): boolean {
27
- throw new Error("Method not implemented.");
26
+ waitForSelector(p: string, s: string): any {
27
+ return globalThis["waitForSelector"](p, s);
28
28
  }
29
- screencast(opts: object) {
29
+
30
+ closePage(p): string {
31
+ return globalThis["closePage"](p);
32
+ }
33
+
34
+ goto(cdpPage: CdpPage, url: string): any {
35
+ return globalThis["goto"](cdpPage.mainFrame()._id, url);
36
+ }
37
+
38
+ newPage(): CdpPage {
39
+ return globalThis["newPage"]();
40
+ }
41
+
42
+ $(selector: string): boolean {
30
43
  throw new Error("Method not implemented.");
31
44
  }
32
45
 
@@ -57,8 +70,30 @@ export class PM_Node extends PM {
57
70
  return globalThis["click"](selector);
58
71
  }
59
72
 
60
- customScreenShot(opts: object) {
61
- return globalThis["customScreenShot"](opts);
73
+ screencast(opts: ScreencastOptions, page: CdpPage) {
74
+ return globalThis["screencast"](
75
+ {
76
+ ...opts,
77
+ path: this.testResourceConfiguration.fs + "/" + opts.path,
78
+ },
79
+ page.mainFrame()._id,
80
+ this.testResourceConfiguration.name
81
+ );
82
+ }
83
+
84
+ screencastStop(p: string) {
85
+ return globalThis["screencastStop"](p);
86
+ }
87
+
88
+ customScreenShot(opts: ScreencastOptions, cdpPage: CdpPage) {
89
+ return globalThis["customScreenShot"](
90
+ {
91
+ ...opts,
92
+ path: this.testResourceConfiguration.fs + "/" + opts.path,
93
+ },
94
+ cdpPage.mainFrame()._id,
95
+ this.testResourceConfiguration.name
96
+ );
62
97
  }
63
98
 
64
99
  existsSync(destFolder: string): boolean {
package/src/PM/web.ts CHANGED
@@ -3,7 +3,8 @@ import { PassThrough } from "stream";
3
3
  import { ITLog, ITTestResourceConfiguration } from "../lib";
4
4
 
5
5
  import { PM } from "./index.js";
6
- import { ScreenshotOptions } from "puppeteer-core";
6
+ import { ScreencastOptions, ScreenshotOptions } from "puppeteer-core";
7
+ import { CdpPage } from "puppeteer-core/lib/esm/puppeteer";
7
8
 
8
9
  type PuppetMasterServer = Record<string, Promise<any>>;
9
10
 
@@ -16,12 +17,39 @@ export class PM_Web extends PM {
16
17
  this.testResourceConfiguration = t;
17
18
  }
18
19
 
20
+ waitForSelector(p: string, s: string): any {
21
+ return window["waitForSelector"](p, s);
22
+ }
23
+
24
+ screencast(opts: ScreencastOptions) {
25
+ return window["screencast"](
26
+ {
27
+ ...opts,
28
+ path: this.testResourceConfiguration.fs + "/" + opts.path,
29
+ },
30
+ this.testResourceConfiguration.name
31
+ );
32
+ }
33
+
34
+ screencastStop(recorder: string) {
35
+ return window["screencastStop"](recorder);
36
+ }
37
+
38
+ closePage(p): string {
39
+ return window["closePage"](p);
40
+ }
41
+
42
+ goto(p, url: string): any {
43
+ return window["goto"](p, url);
44
+ }
45
+
46
+ newPage(): CdpPage {
47
+ return window["newPage"]();
48
+ }
49
+
19
50
  $(selector: string): boolean {
20
51
  return window["$"](selector);
21
52
  }
22
- screencast(opts: object) {
23
- throw new Error("Method not implemented.");
24
- }
25
53
 
26
54
  isDisabled(selector: string): boolean {
27
55
  return window["isDisabled"](selector);
@@ -64,7 +92,7 @@ export class PM_Web extends PM {
64
92
  return window["existsSync"](destFolder);
65
93
  }
66
94
 
67
- mkdirSync() {
95
+ mkdirSync(x) {
68
96
  return window["mkdirSync"](this.testResourceConfiguration.fs + "/");
69
97
  }
70
98