testeranto 0.167.0 → 0.171.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 (181) hide show
  1. package/dist/common/src/NavBar.js +45 -0
  2. package/dist/common/src/PM/main.js +81 -59
  3. package/dist/common/src/Pure.js +16 -14
  4. package/dist/common/src/ReportServer.js +48 -5
  5. package/dist/common/src/Web.js +35 -20
  6. package/dist/common/src/components/SunriseAnimation.test/implementation.js +1 -0
  7. package/dist/common/src/components/SunriseAnimation.test/index.js +1 -0
  8. package/dist/common/src/components/SunriseAnimation.test/interface.js +1 -0
  9. package/dist/common/src/components/SunriseAnimation.test/specification.js +1 -0
  10. package/dist/common/src/components/TestStatusBadge.js +55 -0
  11. package/dist/common/src/components/pure/ProjectPageView.js +204 -0
  12. package/dist/common/src/components/pure/ProjectPageView.test/adapter.js +20 -0
  13. package/dist/common/src/components/pure/ProjectPageView.test/implementation.js +71 -0
  14. package/dist/common/src/components/pure/ProjectPageView.test/index.js +10 -0
  15. package/dist/common/src/components/pure/ProjectPageView.test/specification.js +19 -0
  16. package/dist/common/src/components/pure/ProjectPageView.test/types.js +2 -0
  17. package/dist/common/src/lib/BaseSuite.js +3 -3
  18. package/dist/common/src/lib/BaseSuite.test/test.js +1 -1
  19. package/dist/common/src/lib/abstractBase.js +41 -14
  20. package/dist/common/src/lib/baseBuilder.test/baseBuilder.test.adapter.js +1 -1
  21. package/dist/common/src/lib/pmProxy.js +185 -64
  22. package/dist/common/testeranto.config.js +6 -0
  23. package/dist/common/tsconfig.common.tsbuildinfo +1 -1
  24. package/dist/module/src/App.js +3 -3
  25. package/dist/module/src/PM/main.js +81 -59
  26. package/dist/module/src/ProjectsPage.js +1 -110
  27. package/dist/module/src/Pure.js +16 -14
  28. package/dist/module/src/ReportServer.js +48 -5
  29. package/dist/module/src/TestPage.js +45 -16
  30. package/dist/module/src/Web.js +35 -20
  31. package/dist/module/src/components/SunriseAnimation.test/implementation.js +1 -0
  32. package/dist/module/src/components/SunriseAnimation.test/index.js +1 -0
  33. package/dist/module/src/components/SunriseAnimation.test/interface.js +1 -0
  34. package/dist/module/src/components/SunriseAnimation.test/specification.js +1 -0
  35. package/dist/module/src/components/pure/ProjectPageView.js +197 -0
  36. package/dist/module/src/components/pure/ProjectPageView.test/adapter.js +17 -0
  37. package/dist/module/src/components/pure/ProjectPageView.test/implementation.js +68 -0
  38. package/dist/module/src/components/pure/ProjectPageView.test/index.js +5 -0
  39. package/dist/module/src/components/pure/ProjectPageView.test/specification.js +15 -0
  40. package/dist/module/src/components/pure/ProjectPageView.test/types.js +1 -0
  41. package/dist/module/src/components/pure/ProjectsPageView.js +58 -0
  42. package/dist/module/src/components/pure/TestPageView.js +136 -0
  43. package/dist/module/src/components/stateful/ProjectPage.js +63 -0
  44. package/dist/module/src/components/stateful/ProjectsPage.js +55 -0
  45. package/dist/module/src/components/stateful/TestPage.js +82 -0
  46. package/dist/module/src/lib/BaseSuite.js +3 -3
  47. package/dist/module/src/lib/BaseSuite.test/test.js +1 -1
  48. package/dist/module/src/lib/abstractBase.js +41 -14
  49. package/dist/module/src/lib/baseBuilder.test/baseBuilder.test.adapter.js +1 -1
  50. package/dist/module/src/lib/pmProxy.js +185 -64
  51. package/dist/module/testeranto.config.js +6 -0
  52. package/dist/module/tsconfig.module.tsbuildinfo +1 -1
  53. package/dist/prebuild/App.js +541 -495
  54. package/dist/prebuild/ReportServer.mjs +44 -4
  55. package/dist/prebuild/run.mjs +67 -39
  56. package/dist/types/src/NavBar.d.ts +19 -0
  57. package/dist/types/src/PM/index.d.ts +3 -1
  58. package/dist/types/src/PM/main.d.ts +0 -4
  59. package/dist/types/src/PM/node.d.ts +2 -2
  60. package/dist/types/src/components/SunriseAnimation.test/interface.d.ts +0 -0
  61. package/dist/types/src/components/SunriseAnimation.test/specification.d.ts +0 -0
  62. package/dist/types/src/components/TestStatusBadge.d.ts +15 -0
  63. package/dist/types/src/components/pure/ProjectPageView.d.ts +14 -0
  64. package/dist/types/src/components/pure/ProjectPageView.test/adapter.d.ts +3 -0
  65. package/dist/types/src/components/pure/ProjectPageView.test/implementation.d.ts +3 -0
  66. package/dist/types/src/components/pure/ProjectPageView.test/index.d.ts +3 -0
  67. package/dist/types/src/components/pure/ProjectPageView.test/specification.d.ts +3 -0
  68. package/dist/types/src/components/pure/ProjectPageView.test/types.d.ts +39 -0
  69. package/dist/types/src/lib/BaseSuite.d.ts +2 -0
  70. package/dist/types/src/lib/abstractBase.d.ts +12 -0
  71. package/dist/types/tsconfig.types.tsbuildinfo +1 -1
  72. package/package.json +3 -2
  73. package/src/App.tsx +5 -9
  74. package/src/PM/index.ts +1 -1
  75. package/src/PM/main.ts +87 -82
  76. package/src/PM/node.ts +2 -2
  77. package/src/ProjectsPage.tsx +1 -164
  78. package/src/Pure.ts +16 -16
  79. package/src/ReportServer.ts +49 -6
  80. package/src/TestPage.tsx +78 -5
  81. package/src/Web.ts +35 -35
  82. package/src/components/SunriseAnimation.test/implementation.ts +0 -0
  83. package/src/components/SunriseAnimation.test/index.ts +0 -0
  84. package/src/components/SunriseAnimation.test/interface.ts +0 -0
  85. package/src/components/SunriseAnimation.test/specification.ts +0 -0
  86. package/src/components/pure/ProjectPageView.test/adapter.ts +21 -0
  87. package/src/components/pure/ProjectPageView.test/implementation.tsx +84 -0
  88. package/src/components/pure/ProjectPageView.test/index.ts +8 -0
  89. package/src/components/pure/ProjectPageView.test/specification.ts +31 -0
  90. package/src/components/pure/ProjectPageView.test/types.ts +55 -0
  91. package/src/components/pure/ProjectPageView.tsx +332 -0
  92. package/src/components/pure/ProjectsPageView.tsx +99 -0
  93. package/src/components/pure/TestPageView.tsx +278 -0
  94. package/src/components/stateful/ProjectPage.tsx +83 -0
  95. package/src/components/stateful/ProjectsPage.tsx +73 -0
  96. package/src/components/stateful/TestPage.tsx +107 -0
  97. package/src/lib/BaseSuite.test/test.ts +1 -1
  98. package/src/lib/BaseSuite.ts +9 -4
  99. package/src/lib/abstractBase.ts +45 -14
  100. package/src/lib/baseBuilder.test/baseBuilder.test.adapter.ts +1 -1
  101. package/src/lib/pmProxy.ts +184 -87
  102. package/testeranto/App.js +541 -495
  103. package/testeranto/bundles/node/allTests/{chunk-4ONUZRZ4.mjs → chunk-3EUGBAOM.mjs} +1 -1
  104. package/testeranto/bundles/node/allTests/{chunk-IDCUSTSM.mjs → chunk-E75CSRER.mjs} +246 -115
  105. package/testeranto/bundles/node/allTests/{chunk-NQEP7SN4.mjs → chunk-M6DO7VMB.mjs} +1 -1
  106. package/testeranto/bundles/node/allTests/metafile.json +34 -34
  107. package/testeranto/bundles/node/allTests/src/lib/BaseSuite.test/node.test.mjs +4 -4
  108. package/testeranto/bundles/node/allTests/src/lib/baseBuilder.test/baseBuilder.test.node.mjs +3 -3
  109. package/testeranto/bundles/node/allTests/src/lib/classBuilder.test/classBuilder.test.mjs +3 -3
  110. package/testeranto/bundles/node/allTests/src/lib/core.test/core.test.mjs +2 -17
  111. package/testeranto/bundles/node/allTests/src/lib/pmProxy.test/index.mjs +2 -2
  112. package/testeranto/bundles/pure/allTests/{chunk-5SBJWHSZ.mjs → chunk-KHDVEHF7.mjs} +2 -17
  113. package/testeranto/bundles/pure/allTests/{chunk-4ULDTZFU.mjs → chunk-VMUSFSZM.mjs} +246 -115
  114. package/testeranto/bundles/pure/allTests/metafile.json +57 -27
  115. package/testeranto/bundles/pure/allTests/src/Pure.test.mjs +2 -2
  116. package/testeranto/bundles/pure/allTests/src/lib/BaseSuite.test/pure.test.mjs +3 -3
  117. package/testeranto/bundles/pure/allTests/src/lib/baseBuilder.test/baseBuilder.test.pure.mjs +2 -29
  118. package/testeranto/bundles/web/allTests/chunk-HPYA4YZC.mjs +2283 -0
  119. package/testeranto/bundles/web/allTests/{chunk-TU3MJSSI.mjs → chunk-RLDR6LJN.mjs} +302 -127
  120. package/testeranto/bundles/web/allTests/{chunk-46E6YGGN.mjs → chunk-U7AW26HL.mjs} +292 -142
  121. package/testeranto/bundles/web/allTests/metafile.json +15062 -43
  122. package/testeranto/bundles/web/allTests/src/components/pure/ProjectPageView.test/index.html +19 -0
  123. package/testeranto/bundles/web/allTests/src/components/pure/ProjectPageView.test/index.mjs +37524 -0
  124. package/testeranto/bundles/web/allTests/src/lib/BaseSuite.test/web.test.mjs +20 -2
  125. package/testeranto/bundles/web/allTests/src/lib/baseBuilder.test/baseBuilder.test.web.mjs +26 -2
  126. package/testeranto/reports/allTests/config.json +8 -0
  127. package/testeranto/reports/allTests/src/Pure.test/pure/type_errors.txt +9 -3
  128. package/testeranto/reports/allTests/src/components/pure/ProjectPageView.test/index/web/bdd_errors.txt +1 -0
  129. package/testeranto/reports/allTests/src/components/pure/ProjectPageView.test/index/web/lint_errors.txt +13 -0
  130. package/testeranto/reports/allTests/src/components/pure/ProjectPageView.test/index/web/logs.txt +50 -0
  131. package/testeranto/reports/allTests/src/components/pure/ProjectPageView.test/index/web/message.txt +2 -0
  132. package/testeranto/reports/allTests/src/components/pure/ProjectPageView.test/index/web/prompt.txt +17 -0
  133. package/testeranto/reports/allTests/src/components/pure/ProjectPageView.test/index/web/tests.json +32 -0
  134. package/testeranto/reports/allTests/src/components/pure/ProjectPageView.test/index/web/type_errors.txt +68 -0
  135. package/testeranto/reports/allTests/src/lib/BaseSuite.test/node.test/node/logs.txt +22 -39
  136. package/testeranto/reports/allTests/src/lib/BaseSuite.test/node.test/node/tests.json +6 -3
  137. package/testeranto/reports/allTests/src/lib/BaseSuite.test/node.test/node/type_errors.txt +8 -1
  138. package/testeranto/reports/allTests/src/lib/BaseSuite.test/pure.test/pure/tests.json +6 -3
  139. package/testeranto/reports/allTests/src/lib/BaseSuite.test/pure.test/pure/type_errors.txt +9 -3
  140. package/testeranto/reports/allTests/src/lib/BaseSuite.test/web.test/web/logs.txt +66 -55
  141. package/testeranto/reports/allTests/src/lib/BaseSuite.test/web.test/web/prompt.txt +2 -2
  142. package/testeranto/reports/allTests/src/lib/BaseSuite.test/web.test/web/tests.json +6 -3
  143. package/testeranto/reports/allTests/src/lib/BaseSuite.test/web.test/web/type_errors.txt +10 -5
  144. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.node/node/logs.txt +16 -48
  145. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.node/node/tests.json +18 -9
  146. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.node/node/type_errors.txt +8 -1
  147. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.pure/pure/type_errors.txt +10 -5
  148. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.web/web/logs.txt +62 -33
  149. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.web/web/prompt.txt +2 -2
  150. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.web/web/tests.json +18 -9
  151. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.web/web/type_errors.txt +10 -5
  152. package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/logs.txt +37 -50
  153. package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/tests.json +36 -18
  154. package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/type_errors.txt +8 -1
  155. package/testeranto/reports/allTests/src/lib/core.test/core.test/node/logs.txt +2 -2
  156. package/testeranto/reports/allTests/src/lib/core.test/core.test/node/type_errors.txt +9 -3
  157. package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/logs.txt +21 -36
  158. package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/tests.json +28 -14
  159. package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/type_errors.txt +8 -1
  160. package/testeranto/reports/allTests/summary.json +15 -8
  161. package/testeranto/reportsweb_build_errors +25 -0
  162. package/testeranto.config.ts +7 -0
  163. package/tsc.log +100 -26
  164. package/dist/tsconfig.tsbuildinfo +0 -1
  165. package/testeranto/bundles/node/allTests/chunk-FFBRDUBH.mjs +0 -677
  166. package/testeranto/bundles/node/allTests/chunk-H2IBV7SY.mjs +0 -113
  167. package/testeranto/bundles/node/allTests/chunk-ZHOULXPN.mjs +0 -252
  168. package/testeranto/bundles/pure/allTests/chunk-CSMXYJ65.mjs +0 -200
  169. package/testeranto/bundles/pure/allTests/chunk-QK4IXLF6.mjs +0 -674
  170. package/testeranto/bundles/web/allTests/src/lib/BaseSuite.test/web.test/manifest.json +0 -1
  171. package/testeranto/bundles/web/allTests/src/lib/baseBuilder.test/baseBuilder.test.web/manifest.json +0 -1
  172. package/testeranto/reports/allTests/src/Pure.test/pure/manifest.json +0 -1
  173. package/testeranto/reports/allTests/src/lib/BaseSuite.test/node.test/node/manifest.json +0 -1
  174. package/testeranto/reports/allTests/src/lib/BaseSuite.test/pure.test/pure/manifest.json +0 -1
  175. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.node/node/manifest.json +0 -1
  176. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.pure/pure/manifest.json +0 -1
  177. package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/manifest.json +0 -1
  178. package/testeranto/reports/allTests/src/lib/core.test/core.test/node/manifest.json +0 -1
  179. package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/manifest.json +0 -1
  180. /package/{testeranto/reports/allTests/src/Pure.test/pure/logs.txt → dist/types/src/components/SunriseAnimation.test/implementation.d.ts} +0 -0
  181. /package/{testeranto/reports/allTests/src/lib/BaseSuite.test/pure.test/pure/logs.txt → dist/types/src/components/SunriseAnimation.test/index.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.167.0",
4
+ "version": "0.171.0",
5
5
  "engines": {
6
6
  "node": "18.18.0"
7
7
  },
@@ -204,7 +204,8 @@
204
204
  "react-dom": "18.2.0",
205
205
  "react-router-dom": "^7.7.0",
206
206
  "sass": "^1.89.2",
207
- "testeranto": "",
207
+ "testeranto": "latest",
208
+ "testeranto-react": "^0.0.2",
208
209
  "tsc-prog": "^2.3.0",
209
210
  "tsx": "^4.19.3",
210
211
  "type-fest": "^4.41.0",
package/src/App.tsx CHANGED
@@ -3,31 +3,27 @@
3
3
  import React from 'react';
4
4
  import ReactDom from "react-dom/client";
5
5
  import { HashRouter as Router, Routes, Route } from 'react-router-dom';
6
- import { ProjectsPage } from './ProjectsPage';
7
- import { ProjectPage } from './ProjectPage';
8
- import { TestPage } from './TestPage';
6
+
7
+ import { TestPage } from './components/stateful/TestPage';
9
8
  import { Container } from 'react-bootstrap';
10
9
  import { SettingsButton } from './SettingsButton';
10
+ import { ProjectPage } from './components/stateful/ProjectPage';
11
+ import { ProjectsPage } from './components/stateful/ProjectsPage';
11
12
 
12
13
  export const App = () => {
13
14
  return (
14
15
  <Router>
15
16
  <div className="d-flex flex-column min-vh-100" key={window.location.pathname}>
16
-
17
17
  <main className="flex-grow-1 p-3">
18
18
  <Container fluid>
19
19
  <Routes>
20
20
  <Route path="/" element={<ProjectsPage />} />
21
21
  <Route path="/projects/:projectName" element={<ProjectPage />} />
22
- <Route
23
- path="/projects/:projectName/tests/*"
24
- element={<TestPage />}
25
- />
22
+ <Route path="/projects/:projectName/tests/*" element={<TestPage />} />
26
23
  <Route path="/projects/:projectName#:tab" element={<ProjectPage />} />
27
24
  </Routes>
28
25
  </Container>
29
26
  </main>
30
-
31
27
  <footer className="bg-light py-3 d-flex justify-content-between align-items-center">
32
28
  <div className="ms-3">
33
29
  <SettingsButton />
package/src/PM/index.ts CHANGED
@@ -20,7 +20,7 @@ export abstract class PM {
20
20
  testName: string
21
21
  ): Promise<string>;
22
22
  abstract customclose();
23
- abstract customScreenShot(opts: object, page?: string): any;
23
+ abstract customScreenShot(opts: { path: string }, page?: string): any;
24
24
  abstract end(uid: number): Promise<boolean>;
25
25
  abstract existsSync(fp: string): Promise<boolean>;
26
26
  abstract focusOn(selector: string): any;
package/src/PM/main.ts CHANGED
@@ -242,11 +242,9 @@ export class PM_Main extends PM_WithEslintAndTsc {
242
242
  slowMo: 1,
243
243
  waitForInitialPage: false,
244
244
  executablePath,
245
-
246
- headless: true,
247
-
245
+ headless: false,
248
246
  dumpio: false,
249
- devtools: false,
247
+ devtools: true,
250
248
 
251
249
  args: [
252
250
  "--disable-features=site-per-process",
@@ -369,36 +367,36 @@ export class PM_Main extends PM_WithEslintAndTsc {
369
367
  // });
370
368
  }
371
369
 
372
- async launchExternalTest(
373
- externalTestName: string,
374
- externalTest: {
375
- watch: string[];
376
- exec: string;
377
- }
378
- ) {
379
- // fs.mkdirSync(`testeranto/externalTests/${externalTestName}`);
380
- // exec(externalTest.exec, (error, stdout, stderr) => {
381
- // if (error) {
382
- // fs.writeFileSync(
383
- // `testeranto/externalTests/${externalTestName}/exitcode.txt`,
384
- // `${error.name}\n${error.message}\n${error.code}\n`
385
- // );
386
- // } else {
387
- // fs.writeFileSync(
388
- // `testeranto/externalTests/${externalTestName}/exitcode.txt`,
389
- // `0`
390
- // );
391
- // }
392
- // fs.writeFileSync(
393
- // `testeranto/externalTests/${externalTestName}/stdout.txt`,
394
- // stdout
395
- // );
396
- // fs.writeFileSync(
397
- // `testeranto/externalTests/${externalTestName}/stderr.txt`,
398
- // stderr
399
- // );
400
- // });
401
- }
370
+ // async launchExternalTest(
371
+ // externalTestName: string,
372
+ // externalTest: {
373
+ // watch: string[];
374
+ // exec: string;
375
+ // }
376
+ // ) {
377
+ // // fs.mkdirSync(`testeranto/externalTests/${externalTestName}`);
378
+ // // exec(externalTest.exec, (error, stdout, stderr) => {
379
+ // // if (error) {
380
+ // // fs.writeFileSync(
381
+ // // `testeranto/externalTests/${externalTestName}/exitcode.txt`,
382
+ // // `${error.name}\n${error.message}\n${error.code}\n`
383
+ // // );
384
+ // // } else {
385
+ // // fs.writeFileSync(
386
+ // // `testeranto/externalTests/${externalTestName}/exitcode.txt`,
387
+ // // `0`
388
+ // // );
389
+ // // }
390
+ // // fs.writeFileSync(
391
+ // // `testeranto/externalTests/${externalTestName}/stdout.txt`,
392
+ // // stdout
393
+ // // );
394
+ // // fs.writeFileSync(
395
+ // // `testeranto/externalTests/${externalTestName}/stderr.txt`,
396
+ // // stderr
397
+ // // );
398
+ // // });
399
+ // }
402
400
 
403
401
  async stop() {
404
402
  console.log(ansiC.inverse("Testeranto-Run is shutting down gracefully..."));
@@ -544,7 +542,7 @@ export class PM_Main extends PM_WithEslintAndTsc {
544
542
 
545
543
  const builtfile = dest;
546
544
 
547
- const webSideCares: Page[] = [];
545
+ // const webSideCares: Page[] = [];
548
546
 
549
547
  // fs.writeFileSync(
550
548
  // `${reportDest}/stdlog.txt`,
@@ -586,47 +584,49 @@ export class PM_Main extends PM_WithEslintAndTsc {
586
584
  statusMessagePretty(results.fails, src, "pure");
587
585
  this.bddTestIsNowDone(src, results.fails);
588
586
  })
589
- .catch((e) => {
587
+ .catch((e1) => {
590
588
  console.log(
591
- ansiC.red(`launchPure - ${src} errored with: ${e}`)
589
+ ansiC.red(`launchPure - ${src} errored with: ${e1}`)
592
590
  );
593
591
  this.bddTestIsNowDone(src, -1);
592
+ statusMessagePretty(-1, src, "pure");
594
593
  });
595
594
  // .finally(() => {
596
595
  // // webSideCares.forEach((webSideCar) => webSideCar.close());
597
596
  // });
598
597
  })
599
- .catch((e) => {
598
+ .catch((e2) => {
600
599
  console.log(
601
600
  ansiColors.red(
602
601
  `pure ! ${src} failed to execute. No "tests.json" file was generated. Check ${reportDest}/logs.txt for more info`
603
602
  )
604
603
  );
605
604
 
606
- this.writeFileSync(`${reportDest}/logs.txt`, e.stack, src);
605
+ this.writeFileSync(`${reportDest}/logs.txt`, e2.stack, src);
607
606
  this.bddTestIsNowDone(src, -1);
608
607
  statusMessagePretty(-1, src, "pure");
609
608
  // console.error(e);
610
609
  })
611
610
  .finally((x) => {
612
- const fileSet = files[src] || new Set();
613
- fs.writeFileSync(
614
- reportDest + "/manifest.json",
615
- JSON.stringify(Array.from(fileSet))
616
- );
611
+ // const fileSet = files[src] || new Set();
612
+ // fs.writeFileSync(
613
+ // reportDest + "/manifest.json",
614
+ // JSON.stringify(Array.from(fileSet))
615
+ // );
617
616
  });
618
617
  });
619
- } catch (e) {
618
+ } catch (e3) {
620
619
  console.log(
621
620
  ansiC.red(
622
621
  ansiC.inverse(
623
- `${src} 1 errored with: ${e}. Check ${reportDest}/logs.txt for more info`
622
+ `${src} 1 errored with: ${e3}. Check ${reportDest}/logs.txt for more info`
624
623
  )
625
624
  )
626
625
  );
627
- this.writeFileSync(`${reportDest}/logs.txt`, e.stack, src);
626
+ this.writeFileSync(`${reportDest}/logs.txt`, e3.stack, src);
628
627
  this.bddTestIsNowDone(src, -1);
629
628
  statusMessagePretty(-1, src, "pure");
629
+ console.log("III) PURE IS EXITING BADLY WITH error", e3);
630
630
  }
631
631
 
632
632
  for (let i = 0; i <= portsToUse.length; i++) {
@@ -787,7 +787,7 @@ export class PM_Main extends PM_WithEslintAndTsc {
787
787
  });
788
788
  child.on("error", (err) => {});
789
789
  child.on("close", (code) => {
790
- oStream.close();
790
+ // oStream.close();
791
791
  server.close();
792
792
 
793
793
  if (!files[src]) {
@@ -795,10 +795,10 @@ export class PM_Main extends PM_WithEslintAndTsc {
795
795
  }
796
796
  // files[src].add(filepath);
797
797
 
798
- fs.writeFileSync(
799
- reportDest + "/manifest.json",
800
- JSON.stringify(Array.from(files[src]))
801
- );
798
+ // fs.writeFileSync(
799
+ // reportDest + "/manifest.json",
800
+ // JSON.stringify(Array.from(files[src]))
801
+ // );
802
802
 
803
803
  if (code === 255) {
804
804
  console.log(
@@ -808,6 +808,8 @@ export class PM_Main extends PM_WithEslintAndTsc {
808
808
  );
809
809
  this.bddTestIsNowDone(src, -1);
810
810
  statusMessagePretty(-1, src, "node");
811
+ oStream.close();
812
+ return;
811
813
  } else if (code === 0) {
812
814
  this.bddTestIsNowDone(src, 0);
813
815
  statusMessagePretty(0, src, "node");
@@ -876,10 +878,10 @@ export class PM_Main extends PM_WithEslintAndTsc {
876
878
  }
877
879
  // files[src].add(filepath);
878
880
 
879
- fs.writeFileSync(
880
- destFolder + "/manifest.json",
881
- JSON.stringify(Array.from(files[src]))
882
- );
881
+ // fs.writeFileSync(
882
+ // destFolder + "/manifest.json",
883
+ // JSON.stringify(Array.from(files[src]))
884
+ // );
883
885
 
884
886
  delete files[src];
885
887
 
@@ -1250,7 +1252,7 @@ export class PM_Main extends PM_WithEslintAndTsc {
1250
1252
  try {
1251
1253
  return await (await x.default).receiveTestResourceConfig(${webArgz})
1252
1254
  } catch (e) {
1253
- console.log("fail", e)
1255
+ console.log("web run failure", e.toString())
1254
1256
  }
1255
1257
  })`;
1256
1258
 
@@ -1283,10 +1285,10 @@ export class PM_Main extends PM_WithEslintAndTsc {
1283
1285
  }
1284
1286
  // files[t].add(filepath);
1285
1287
 
1286
- fs.writeFileSync(
1287
- destFolder + "/manifest.json",
1288
- JSON.stringify(Array.from(files[src]))
1289
- );
1288
+ // fs.writeFileSync(
1289
+ // destFolder + "/manifest.json",
1290
+ // JSON.stringify(Array.from(files[src]))
1291
+ // );
1290
1292
  delete files[src];
1291
1293
 
1292
1294
  Promise.all(screenshots[src] || []).then(() => {
@@ -1294,12 +1296,14 @@ export class PM_Main extends PM_WithEslintAndTsc {
1294
1296
  page.close();
1295
1297
  oStream.close();
1296
1298
  });
1299
+ console.log("ostream is closed");
1300
+ return;
1297
1301
  };
1298
1302
 
1299
1303
  page.on("pageerror", (err: Error) => {
1300
1304
  console.log(
1301
1305
  ansiColors.red(
1302
- `web ! ${src} failed to execute. No "tests.json" file was generated. Check ${reportDest}/logs.txt for more info`
1306
+ `web ! ${src} failed to execute No "tests.json" file was generated. Check ${reportDest}/logs.txt for more info`
1303
1307
  )
1304
1308
  );
1305
1309
 
@@ -1326,38 +1330,39 @@ export class PM_Main extends PM_WithEslintAndTsc {
1326
1330
  });
1327
1331
 
1328
1332
  page.on("console", (log: ConsoleMessage) => {
1329
- oStream.write(log.text());
1330
- oStream.write("\n");
1331
- oStream.write(JSON.stringify(log.location()));
1332
- oStream.write("\n");
1333
- oStream.write(JSON.stringify(log.stackTrace()));
1334
- oStream.write("\n");
1333
+ console.log("console message: ", log.text());
1334
+ if (oStream.closed) {
1335
+ console.log("missed console message: ", log.text());
1336
+ return;
1337
+ } else {
1338
+ oStream.write(log.text());
1339
+ oStream.write("\n");
1340
+ oStream.write(JSON.stringify(log.location()));
1341
+ oStream.write("\n");
1342
+ oStream.write(JSON.stringify(log.stackTrace()));
1343
+ oStream.write("\n");
1344
+ }
1335
1345
  });
1336
1346
 
1337
1347
  await page.goto(`file://${`${destFolder}.html`}`, {});
1338
1348
 
1339
- this.webSidecars[Math.random()] = page.mainFrame()._id;
1340
-
1341
1349
  await page
1342
1350
  .evaluate(evaluation)
1343
1351
  .then(async ({ fails, failed, features }: IFinalResults) => {
1344
- // this.receiveFeatures(features, destFolder, src, "web");
1345
- // this.receiveFeaturesV2(reportDest, src, "web");
1346
-
1347
1352
  statusMessagePretty(fails, src, "web");
1348
1353
  this.bddTestIsNowDone(src, fails);
1349
1354
  close();
1350
1355
  })
1351
1356
  .catch((e) => {
1352
- // console.log(ansiC.red(ansiC.inverse(e)));
1353
-
1354
- // console.log(
1355
- // ansiC.red(
1356
- // ansiC.inverse(
1357
- // `web ! ${src} failed to execute. No "tests.json" file was generated. Check ${reportDest}/logs.txt for more info`
1358
- // )
1359
- // )
1360
- // );
1357
+ console.log(ansiC.red(ansiC.inverse(e)));
1358
+
1359
+ console.log(
1360
+ ansiC.red(
1361
+ ansiC.inverse(
1362
+ `web ! ${src} failed to execute. No "tests.json" file was generated. Check ${reportDest}/logs.txt for more info`
1363
+ )
1364
+ )
1365
+ );
1361
1366
  this.bddTestIsNowDone(src, -1);
1362
1367
  })
1363
1368
  .finally(() => {
package/src/PM/node.ts CHANGED
@@ -4,7 +4,7 @@
4
4
  import net from "net";
5
5
  import fs from "fs";
6
6
  import path from "path";
7
- import { ScreencastOptions } from "puppeteer-core";
7
+ import { ScreencastOptions, ScreenshotOptions } from "puppeteer-core";
8
8
  import { PassThrough } from "stream";
9
9
 
10
10
  import { ITLog, ITTestResourceConfiguration } from "../lib";
@@ -151,7 +151,7 @@ export class PM_Node extends PM {
151
151
  return this.send("screencastStop", ...arguments);
152
152
  }
153
153
 
154
- customScreenShot(x: ScreencastOptions, y?: string) {
154
+ customScreenShot(x: ScreenshotOptions, y?: string) {
155
155
  const opts = x[0];
156
156
  const page = x[1];
157
157
 
@@ -1,164 +1 @@
1
- import ReactDom from "react-dom/client";
2
- import React, { useEffect, useState } from 'react';
3
- import { Table, Alert, Badge, Container, Navbar } from 'react-bootstrap';
4
- import { ISummary } from './Types';
5
- import { useNavigate } from 'react-router-dom';
6
- import { NavBar } from "./NavBar";
7
-
8
- type ProjectSummary = {
9
- name: string;
10
- testCount: number;
11
- nodeStatus: 'success' | 'failed' | 'unknown';
12
- webStatus: 'success' | 'failed' | 'unknown';
13
- pureStatus: 'success' | 'failed' | 'unknown';
14
- };
15
-
16
- export const ProjectsPage = () => {
17
- const [projects, setProjects] = useState<ProjectSummary[]>([]);
18
- const [summaries, setSummaries] = useState<Record<string, ISummary>>({});
19
- const [loading, setLoading] = useState(true);
20
- const [error, setError] = useState<string | null>(null);
21
-
22
- const navigate = useNavigate();
23
- const [configs, setConfigs] = useState<Record<string, object>>({});
24
-
25
- useEffect(() => {
26
- const fetchProjects = async () => {
27
- try {
28
- const projectsRes = await fetch(`projects.json`);
29
- const projectNames = await projectsRes.json();
30
-
31
- // const projectNames = Object.keys(config.projects);
32
- const projectsData = await Promise.all(
33
- projectNames.map(async (name) => {
34
- const [summaryRes, nodeRes, webRes, pureRes, configRes] = await Promise.all([
35
- fetch(`reports/${name}/summary.json`),
36
- fetch(`bundles/node/${name}/metafile.json`),
37
- fetch(`bundles/web/${name}/metafile.json`),
38
- fetch(`bundles/pure/${name}/metafile.json`),
39
- fetch(`reports/${name}/config.json`),
40
-
41
- ]);
42
-
43
- const [summary, nodeData, webData, pureData, configData] = await Promise.all([
44
- summaryRes.json(),
45
- nodeRes.ok ? nodeRes.json() : { errors: ["Failed to load node build logs"] },
46
- webRes.ok ? webRes.json() : { errors: ["Failed to load web build logs"] },
47
- pureRes.ok ? pureRes.json() : { errors: ["Failed to load pure build logs"] },
48
- configRes.json(),
49
- ]);
50
-
51
- setSummaries(prev => ({ ...prev, [name]: summary }));
52
- setConfigs(prev => ({ ...prev, [name]: configData }));
53
-
54
- return {
55
- name,
56
- testCount: Object.keys(summary).length,
57
- nodeStatus: nodeData.errors?.length ? 'failed' : nodeData.warnings?.length ? 'warning' : 'success',
58
- webStatus: webData.errors?.length ? 'failed' : webData.warnings?.length ? 'warning' : 'success',
59
- pureStatus: pureData.errors?.length ? 'failed' : pureData.warnings?.length ? 'warning' : 'success',
60
- config: Object.keys(configData).length,
61
- };
62
- })
63
- );
64
-
65
- setProjects(projectsData);
66
- } catch (err) {
67
- setError(err instanceof Error ? err.message : 'Unknown error');
68
- } finally {
69
- setLoading(false);
70
- }
71
- };
72
-
73
- fetchProjects();
74
- }, []);
75
-
76
- const getStatusIcon = (status: string) => {
77
- switch (status) {
78
- case 'success': return '✅';
79
- case 'failed': return '❌';
80
- case 'warning': return '⚠️';
81
- default: return '❓';
82
- }
83
- };
84
-
85
- if (loading) return <div>Loading projects...</div>;
86
- if (error) return <Alert variant="danger">Error: {error}</Alert>;
87
-
88
- console.log(configs);
89
-
90
- return (
91
- <div className="p-3">
92
- <NavBar title="Testeranto" backLink={null} />
93
- <Table striped bordered hover responsive>
94
- <thead>
95
- <tr>
96
- <th>Project</th>
97
- <th>Tests</th>
98
- <th>Node</th>
99
- <th>Web</th>
100
- <th>Pure</th>
101
- </tr>
102
- </thead>
103
- <tbody>
104
- {projects.map((project) => (
105
- <tr key={project.name}>
106
- <td>
107
- <a href="#" onClick={(e) => {
108
- e.preventDefault();
109
- navigate(`/projects/${project.name}`);
110
- }}>{project.name}</a>
111
- </td>
112
- <td>
113
- <div style={{ maxHeight: '200px', overflowY: 'auto' }}>
114
- {summaries[project.name] ? (
115
- Object.keys(summaries[project.name]).map(testName => {
116
- const testData = summaries[project.name][testName];
117
- const runTime = configs[project.name].tests.find((t) => t[0] === testName)[1];
118
- const hasRuntimeErrors = testData.runTimeErrors > 0;
119
- const hasStaticErrors = testData.typeErrors > 0 || testData.staticErrors > 0;
120
-
121
- return (
122
- <div key={testName}>
123
- <a
124
- href={`#/projects/${project.name}/tests/${encodeURIComponent(testName)}/${runTime}`}
125
- >
126
- {hasRuntimeErrors ? '❌ ' : hasStaticErrors ? '⚠️ ' : ''}
127
- {testName.split('/').pop()}
128
- </a>
129
- </div>
130
- )
131
- })
132
- ) : (
133
- <div>Loading tests...</div>
134
- )}
135
- </div>
136
- </td>
137
- <td>
138
- <a
139
- href={`#/projects/${project.name}#node`}
140
- >
141
- {getStatusIcon(project.nodeStatus)} Node build logs
142
- </a>
143
- </td>
144
- <td>
145
- <a
146
- href={`#/projects/${project.name}#web`}
147
- >
148
- {getStatusIcon(project.webStatus)} Web build logs
149
- </a>
150
- </td>
151
- <td>
152
- <a
153
- href={`#/projects/${project.name}#pure`}
154
- >
155
- {getStatusIcon(project.pureStatus)} Pure build logs
156
- </a>
157
- </td>
158
- </tr>
159
- ))}
160
- </tbody>
161
- </Table>
162
- </div>
163
- );
164
- };
1
+ export { ProjectsPage } from './components/stateful/ProjectsPage';
package/src/Pure.ts CHANGED
@@ -46,22 +46,22 @@ export class PureTesteranto<
46
46
  const t: ITTestResourceConfiguration = JSON.parse(partialTestResource);
47
47
  const pm = new PM_Pure(t);
48
48
 
49
- console.log("[DEBUG] Current test jobs:", this.testJobs?.length);
49
+ // console.log("[DEBUG] Current test jobs:", this.testJobs?.length);
50
50
 
51
- if (!this.testJobs || this.testJobs.length === 0) {
52
- console.error(
53
- "[ERROR] No test jobs available - checking specs:",
54
- this.specs?.length
55
- );
56
- console.error("[ERROR] Test implementation:", this.testImplementation);
57
- return {
58
- failed: true,
59
- fails: 1,
60
- artifacts: [],
61
- // logPromise: Promise.resolve(),
62
- features: [],
63
- };
64
- }
51
+ // if (!this.testJobs || this.testJobs.length === 0) {
52
+ // console.error(
53
+ // "[ERROR] No test jobs available - checking specs:",
54
+ // this.specs?.length
55
+ // );
56
+ // console.error("[ERROR] Test implementation:", this.testImplementation);
57
+ // return {
58
+ // failed: true,
59
+ // fails: 1,
60
+ // artifacts: [],
61
+ // // logPromise: Promise.resolve(),
62
+ // features: [],
63
+ // };
64
+ // }
65
65
 
66
66
  try {
67
67
  console.log("[DEBUG] Executing test job with PM:", pm);
@@ -72,7 +72,7 @@ export class PureTesteranto<
72
72
  console.error("[ERROR] Test job failed:", e);
73
73
  return {
74
74
  failed: true,
75
- fails: 1,
75
+ fails: -1,
76
76
  artifacts: [],
77
77
  // logPromise: Promise.resolve(),
78
78
  features: [],
@@ -45,15 +45,58 @@ const server = http.createServer((req, res) => {
45
45
  req.on('end', () => {
46
46
  safeResponse(() => {
47
47
  const filePath = path.join(process.cwd(), req.url || '');
48
-
48
+
49
49
  // First check if file exists
50
50
  fs.stat(filePath, (err, stats) => {
51
51
  if (err || !stats.isFile()) {
52
- // File doesn't exist - send 404 once
53
- if (!res.headersSent) {
54
- res.writeHead(404, { 'Content-Type': 'text/plain' });
55
- res.end('File not found');
56
- }
52
+ // Check if directory exists
53
+ fs.stat(filePath, (dirErr, dirStats) => {
54
+ if (!dirErr && dirStats.isDirectory()) {
55
+ // Serve directory listing
56
+ fs.readdir(filePath, (readErr, files) => {
57
+ if (readErr) {
58
+ res.writeHead(500);
59
+ return res.end('Error reading directory');
60
+ }
61
+
62
+ res.writeHead(200, { 'Content-Type': 'text/html' });
63
+ res.write(`
64
+ <html>
65
+ <head>
66
+ <title>Directory Listing: ${req.url}</title>
67
+ <style>
68
+ body { font-family: sans-serif; margin: 2rem; }
69
+ h1 { color: #333; }
70
+ ul { list-style: none; padding: 0; }
71
+ li { padding: 0.5rem; }
72
+ li a { color: #0366d6; text-decoration: none; }
73
+ li a:hover { text-decoration: underline; }
74
+ </style>
75
+ </head>
76
+ <body>
77
+ <h1>Directory: ${req.url}</h1>
78
+ <ul>
79
+ ${files.map(file => `
80
+ <li>
81
+ <a href="${path.join(req.url || '', file)}">
82
+ ${file}${file.endsWith('/') ? '/' : ''}
83
+ </a>
84
+ </li>
85
+ `).join('')}
86
+ </ul>
87
+ </body>
88
+ </html>
89
+ `);
90
+ res.end();
91
+ });
92
+ } else {
93
+ // Neither file nor directory exists - send 404
94
+ if (!res.headersSent) {
95
+ res.writeHead(404, { 'Content-Type': 'text/plain' });
96
+ res.end('File not found');
97
+ }
98
+ }
99
+ });
57
100
  return;
58
101
  }
59
102