testeranto 0.100.0 → 0.111.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 (226) hide show
  1. package/README.md +1 -0
  2. package/bundle.js +80 -30
  3. package/package.json +40 -32
  4. package/src/Footer.tsx +4 -0
  5. package/src/Init.ts +48 -0
  6. package/src/Node.ts +23 -17
  7. package/src/PM/index.ts +1 -1
  8. package/src/PM/main.ts +524 -156
  9. package/src/PM/node.ts +2 -2
  10. package/src/PM/web.ts +1 -1
  11. package/src/ReportClient.tsx +163 -0
  12. package/src/ReportServer.ts +21 -0
  13. package/src/SubPackages/react/component/node.ts +68 -24
  14. package/src/SubPackages/react/component/web.ts +68 -25
  15. package/src/SubPackages/react/jsx/index.ts +39 -18
  16. package/src/SubPackages/react/jsx/node.ts +12 -10
  17. package/src/SubPackages/react/jsx/web.ts +27 -14
  18. package/src/SubPackages/react-dom/component/node.ts +42 -50
  19. package/src/SubPackages/react-dom/component/web.ts +28 -10
  20. package/src/SubPackages/react-dom/jsx/node.ts +54 -56
  21. package/src/SubPackages/react-dom/jsx/web.ts +55 -42
  22. package/src/SubPackages/react-test-renderer/MemoExoticComponent/node.ts +23 -7
  23. package/src/SubPackages/react-test-renderer/component/index.ts +38 -5
  24. package/src/SubPackages/react-test-renderer/component/node.ts +24 -5
  25. package/src/SubPackages/react-test-renderer/component/web.ts +22 -5
  26. package/src/SubPackages/react-test-renderer/fc/node.ts +41 -7
  27. package/src/SubPackages/react-test-renderer/fc/web.ts +43 -11
  28. package/src/SubPackages/react-test-renderer/jsx/index.ts +39 -16
  29. package/src/SubPackages/react-test-renderer/jsx/node.ts +8 -6
  30. package/src/SubPackages/react-test-renderer/jsx/web.ts +22 -5
  31. package/src/SubPackages/react-test-renderer/jsx-promised/index.ts +39 -6
  32. package/src/SubPackages/react-test-renderer/jsx-promised/node.ts +27 -10
  33. package/src/SubPackages/react-test-renderer/jsx-promised/web.ts +26 -12
  34. package/src/TestReport.tsx +176 -0
  35. package/src/Types.ts +63 -309
  36. package/src/Web.ts +24 -18
  37. package/src/build.ts +240 -0
  38. package/src/defaultConfig.ts +2 -1
  39. package/src/esbuildConfigs/eslint-formatter-testeranto.ts +5 -0
  40. package/src/esbuildConfigs/featuresPlugin.ts +0 -1
  41. package/src/esbuildConfigs/index.ts +1 -1
  42. package/src/esbuildConfigs/inputFilesPlugin.ts +2 -135
  43. package/src/esbuildConfigs/node.ts +4 -13
  44. package/src/esbuildConfigs/web.ts +3 -19
  45. package/src/init-docs.ts +2 -1
  46. package/src/lib/abstractBase.ts +82 -80
  47. package/src/lib/basebuilder.ts +57 -45
  48. package/src/lib/classBuilder.ts +15 -15
  49. package/src/lib/core.ts +44 -35
  50. package/src/lib/index.ts +47 -98
  51. package/src/lib/readme.md +12 -0
  52. package/src/lib/types.ts +53 -70
  53. package/src/run.ts +31 -0
  54. package/src/style.css +8 -0
  55. package/src/utils.ts +74 -2
  56. package/tsc.log +108 -0
  57. package/Bundle.Dockerfile +0 -52
  58. package/bin/init-docs.js +0 -24
  59. package/dist/common/dist/module/src/Init.js +0 -40
  60. package/dist/common/package.json +0 -3
  61. package/dist/common/src/Init.js +0 -40
  62. package/dist/common/src/Node.js +0 -27
  63. package/dist/common/src/PM/index.js +0 -7
  64. package/dist/common/src/PM/main.js +0 -941
  65. package/dist/common/src/PM/node.js +0 -128
  66. package/dist/common/src/PM/web.js +0 -121
  67. package/dist/common/src/SubPackages/puppeteer.js +0 -21
  68. package/dist/common/src/SubPackages/react/component/node.js +0 -19
  69. package/dist/common/src/SubPackages/react/component/web.js +0 -19
  70. package/dist/common/src/SubPackages/react/jsx/index.js +0 -33
  71. package/dist/common/src/SubPackages/react/jsx/node.js +0 -10
  72. package/dist/common/src/SubPackages/react/jsx/web.js +0 -10
  73. package/dist/common/src/SubPackages/react-dom/component/node.js +0 -101
  74. package/dist/common/src/SubPackages/react-dom/component/web.js +0 -67
  75. package/dist/common/src/SubPackages/react-dom/jsx/index.js +0 -2
  76. package/dist/common/src/SubPackages/react-dom/jsx/node.js +0 -39
  77. package/dist/common/src/SubPackages/react-dom/jsx/web.js +0 -117
  78. package/dist/common/src/SubPackages/react-test-renderer/MemoExoticComponent/node.js +0 -44
  79. package/dist/common/src/SubPackages/react-test-renderer/component/index.js +0 -2
  80. package/dist/common/src/SubPackages/react-test-renderer/component/interface.js +0 -60
  81. package/dist/common/src/SubPackages/react-test-renderer/component/node.js +0 -8
  82. package/dist/common/src/SubPackages/react-test-renderer/component/web.js +0 -8
  83. package/dist/common/src/SubPackages/react-test-renderer/fc/node.js +0 -50
  84. package/dist/common/src/SubPackages/react-test-renderer/fc/web.js +0 -50
  85. package/dist/common/src/SubPackages/react-test-renderer/jsx/index.js +0 -63
  86. package/dist/common/src/SubPackages/react-test-renderer/jsx/node.js +0 -10
  87. package/dist/common/src/SubPackages/react-test-renderer/jsx/web.js +0 -10
  88. package/dist/common/src/SubPackages/react-test-renderer/jsx-promised/index.js +0 -42
  89. package/dist/common/src/SubPackages/react-test-renderer/jsx-promised/node.js +0 -10
  90. package/dist/common/src/SubPackages/react-test-renderer/jsx-promised/web.js +0 -10
  91. package/dist/common/src/Types.js +0 -2
  92. package/dist/common/src/Web.js +0 -49
  93. package/dist/common/src/cli.js +0 -439
  94. package/dist/common/src/cli2.js +0 -144
  95. package/dist/common/src/defaultConfig.js +0 -19
  96. package/dist/common/src/esbuildConfigs/featuresPlugin.js +0 -39
  97. package/dist/common/src/esbuildConfigs/index.js +0 -21
  98. package/dist/common/src/esbuildConfigs/inputFilesPlugin.js +0 -99
  99. package/dist/common/src/esbuildConfigs/node.js +0 -45
  100. package/dist/common/src/esbuildConfigs/web.js +0 -61
  101. package/dist/common/src/init-docs.js +0 -43
  102. package/dist/common/src/lib/abstractBase.js +0 -324
  103. package/dist/common/src/lib/basebuilder.js +0 -85
  104. package/dist/common/src/lib/classBuilder.js +0 -42
  105. package/dist/common/src/lib/core.js +0 -101
  106. package/dist/common/src/lib/index.js +0 -22
  107. package/dist/common/src/lib/types.js +0 -3
  108. package/dist/common/src/puppeteerConfiger.js +0 -24
  109. package/dist/common/src/utils.js +0 -16
  110. package/dist/common/src/web.html.js +0 -22
  111. package/dist/common/testeranto.js +0 -15
  112. package/dist/common/tsconfig.common.tsbuildinfo +0 -1
  113. package/dist/module/package.json +0 -3
  114. package/dist/module/src/Init.js +0 -35
  115. package/dist/module/src/Node.js +0 -20
  116. package/dist/module/src/PM/index.js +0 -3
  117. package/dist/module/src/PM/main.js +0 -911
  118. package/dist/module/src/PM/node.js +0 -121
  119. package/dist/module/src/PM/web.js +0 -117
  120. package/dist/module/src/SubPackages/puppeteer.js +0 -16
  121. package/dist/module/src/SubPackages/react/component/node.js +0 -14
  122. package/dist/module/src/SubPackages/react/component/web.js +0 -14
  123. package/dist/module/src/SubPackages/react/jsx/index.js +0 -27
  124. package/dist/module/src/SubPackages/react/jsx/node.js +0 -5
  125. package/dist/module/src/SubPackages/react/jsx/web.js +0 -5
  126. package/dist/module/src/SubPackages/react-dom/component/node.js +0 -93
  127. package/dist/module/src/SubPackages/react-dom/component/web.js +0 -62
  128. package/dist/module/src/SubPackages/react-dom/jsx/index.js +0 -1
  129. package/dist/module/src/SubPackages/react-dom/jsx/node.js +0 -31
  130. package/dist/module/src/SubPackages/react-dom/jsx/web.js +0 -89
  131. package/dist/module/src/SubPackages/react-test-renderer/MemoExoticComponent/node.js +0 -16
  132. package/dist/module/src/SubPackages/react-test-renderer/component/index.js +0 -1
  133. package/dist/module/src/SubPackages/react-test-renderer/component/interface.js +0 -31
  134. package/dist/module/src/SubPackages/react-test-renderer/component/node.js +0 -3
  135. package/dist/module/src/SubPackages/react-test-renderer/component/web.js +0 -3
  136. package/dist/module/src/SubPackages/react-test-renderer/fc/node.js +0 -22
  137. package/dist/module/src/SubPackages/react-test-renderer/fc/web.js +0 -22
  138. package/dist/module/src/SubPackages/react-test-renderer/jsx/index.js +0 -34
  139. package/dist/module/src/SubPackages/react-test-renderer/jsx/node.js +0 -5
  140. package/dist/module/src/SubPackages/react-test-renderer/jsx/web.js +0 -5
  141. package/dist/module/src/SubPackages/react-test-renderer/jsx-promised/index.js +0 -16
  142. package/dist/module/src/SubPackages/react-test-renderer/jsx-promised/node.js +0 -5
  143. package/dist/module/src/SubPackages/react-test-renderer/jsx-promised/web.js +0 -5
  144. package/dist/module/src/Types.js +0 -1
  145. package/dist/module/src/Web.js +0 -42
  146. package/dist/module/src/cli.js +0 -411
  147. package/dist/module/src/cli2.js +0 -116
  148. package/dist/module/src/defaultConfig.js +0 -17
  149. package/dist/module/src/esbuildConfigs/featuresPlugin.js +0 -34
  150. package/dist/module/src/esbuildConfigs/index.js +0 -19
  151. package/dist/module/src/esbuildConfigs/inputFilesPlugin.js +0 -94
  152. package/dist/module/src/esbuildConfigs/node.js +0 -40
  153. package/dist/module/src/esbuildConfigs/web.js +0 -56
  154. package/dist/module/src/init-docs.js +0 -15
  155. package/dist/module/src/lib/abstractBase.js +0 -316
  156. package/dist/module/src/lib/basebuilder.js +0 -81
  157. package/dist/module/src/lib/classBuilder.js +0 -38
  158. package/dist/module/src/lib/core.js +0 -98
  159. package/dist/module/src/lib/index.js +0 -18
  160. package/dist/module/src/lib/types.js +0 -2
  161. package/dist/module/src/puppeteerConfiger.js +0 -19
  162. package/dist/module/src/utils.js +0 -9
  163. package/dist/module/src/web.html.js +0 -20
  164. package/dist/module/testeranto.js +0 -13
  165. package/dist/module/tsconfig.module.tsbuildinfo +0 -1
  166. package/dist/prebuild/cli.mjs +0 -1491
  167. package/dist/prebuild/cli2.mjs +0 -918
  168. package/dist/prebuild/init-docs.mjs +0 -48
  169. package/dist/types/dist/module/src/Init.d.ts +0 -2
  170. package/dist/types/src/Init.d.ts +0 -2
  171. package/dist/types/src/Node.d.ts +0 -13
  172. package/dist/types/src/PM/index.d.ts +0 -34
  173. package/dist/types/src/PM/main.d.ts +0 -56
  174. package/dist/types/src/PM/node.d.ts +0 -42
  175. package/dist/types/src/PM/web.d.ts +0 -40
  176. package/dist/types/src/SubPackages/puppeteer.d.ts +0 -6
  177. package/dist/types/src/SubPackages/react/component/node.d.ts +0 -7
  178. package/dist/types/src/SubPackages/react/component/web.d.ts +0 -7
  179. package/dist/types/src/SubPackages/react/jsx/index.d.ts +0 -12
  180. package/dist/types/src/SubPackages/react/jsx/node.d.ts +0 -4
  181. package/dist/types/src/SubPackages/react/jsx/web.d.ts +0 -4
  182. package/dist/types/src/SubPackages/react-dom/component/node.d.ts +0 -12
  183. package/dist/types/src/SubPackages/react-dom/component/web.d.ts +0 -11
  184. package/dist/types/src/SubPackages/react-dom/jsx/index.d.ts +0 -7
  185. package/dist/types/src/SubPackages/react-dom/jsx/node.d.ts +0 -6
  186. package/dist/types/src/SubPackages/react-dom/jsx/web.d.ts +0 -5
  187. package/dist/types/src/SubPackages/react-test-renderer/MemoExoticComponent/node.d.ts +0 -5
  188. package/dist/types/src/SubPackages/react-test-renderer/component/index.d.ts +0 -13
  189. package/dist/types/src/SubPackages/react-test-renderer/component/interface.d.ts +0 -9
  190. package/dist/types/src/SubPackages/react-test-renderer/component/node.d.ts +0 -8
  191. package/dist/types/src/SubPackages/react-test-renderer/component/web.d.ts +0 -3
  192. package/dist/types/src/SubPackages/react-test-renderer/fc/node.d.ts +0 -8
  193. package/dist/types/src/SubPackages/react-test-renderer/fc/web.d.ts +0 -8
  194. package/dist/types/src/SubPackages/react-test-renderer/jsx/index.d.ts +0 -17
  195. package/dist/types/src/SubPackages/react-test-renderer/jsx/node.d.ts +0 -9
  196. package/dist/types/src/SubPackages/react-test-renderer/jsx/web.d.ts +0 -8
  197. package/dist/types/src/SubPackages/react-test-renderer/jsx-promised/index.d.ts +0 -16
  198. package/dist/types/src/SubPackages/react-test-renderer/jsx-promised/node.d.ts +0 -4
  199. package/dist/types/src/SubPackages/react-test-renderer/jsx-promised/web.d.ts +0 -4
  200. package/dist/types/src/Types.d.ts +0 -90
  201. package/dist/types/src/Web.d.ts +0 -10
  202. package/dist/types/src/cli.d.ts +0 -1
  203. package/dist/types/src/cli2.d.ts +0 -1
  204. package/dist/types/src/defaultConfig.d.ts +0 -3
  205. package/dist/types/src/esbuildConfigs/featuresPlugin.d.ts +0 -5
  206. package/dist/types/src/esbuildConfigs/index.d.ts +0 -4
  207. package/dist/types/src/esbuildConfigs/inputFilesPlugin.d.ts +0 -7
  208. package/dist/types/src/esbuildConfigs/node.d.ts +0 -4
  209. package/dist/types/src/esbuildConfigs/web.d.ts +0 -4
  210. package/dist/types/src/init-docs.d.ts +0 -1
  211. package/dist/types/src/lib/abstractBase.d.ts +0 -110
  212. package/dist/types/src/lib/basebuilder.d.ts +0 -27
  213. package/dist/types/src/lib/classBuilder.d.ts +0 -7
  214. package/dist/types/src/lib/core.d.ts +0 -8
  215. package/dist/types/src/lib/index.d.ts +0 -60
  216. package/dist/types/src/lib/types.d.ts +0 -40
  217. package/dist/types/src/puppeteerConfiger.d.ts +0 -4
  218. package/dist/types/src/utils.d.ts +0 -2
  219. package/dist/types/src/web.html.d.ts +0 -2
  220. package/dist/types/testeranto.d.ts +0 -16
  221. package/dist/types/tsconfig.types.tsbuildinfo +0 -1
  222. package/docker-compose.yml +0 -37
  223. package/src/SubPackages/puppeteer.ts +0 -51
  224. package/src/cli.ts +0 -535
  225. package/src/cli2.ts +0 -157
  226. package/testeranto.ts +0 -13
@@ -1,911 +0,0 @@
1
- import fs from "fs";
2
- import path from "path";
3
- import puppeteer from "puppeteer-core";
4
- import crypto from "crypto";
5
- import { PM } from "./index.js";
6
- const fileStreams3 = [];
7
- const fPaths = [];
8
- const files = {};
9
- const recorders = {};
10
- const screenshots = {};
11
- const red = "\x1b[31m";
12
- const green = "\x1b[32m";
13
- const reset = "\x1b[0m"; // Resets to default color
14
- const statusMessagePretty = (failures, test) => {
15
- if (failures === 0) {
16
- console.log(green + `${test} completed successfully` + reset);
17
- }
18
- else {
19
- console.log(red + `${test} failed ${failures} times` + reset);
20
- }
21
- };
22
- export class PM_Main extends PM {
23
- constructor(configs) {
24
- super();
25
- this.shutdownMode = false;
26
- this.checkForShutdown = () => {
27
- const anyRunning = Object.values(this.registry).filter((x) => x === false).length > 0;
28
- if (anyRunning) {
29
- }
30
- else {
31
- this.browser.disconnect().then(() => {
32
- console.log("Goodbye");
33
- process.exit();
34
- });
35
- }
36
- };
37
- this.register = (src) => {
38
- this.registry[src] = false;
39
- };
40
- this.deregister = (src) => {
41
- this.registry[src] = true;
42
- if (this.shutdownMode) {
43
- this.checkForShutdown();
44
- }
45
- };
46
- this.launchNode = async (src, dest) => {
47
- console.log("! node", src);
48
- this.register(src);
49
- const destFolder = dest.replace(".mjs", "");
50
- let argz = "";
51
- const testConfig = this.configs.tests.find((t) => {
52
- return t[0] === src;
53
- });
54
- if (!testConfig) {
55
- console.error("missing test config");
56
- process.exit(-1);
57
- }
58
- const testConfigResource = testConfig[2];
59
- let portsToUse = [];
60
- if (testConfigResource.ports === 0) {
61
- argz = JSON.stringify({
62
- scheduled: true,
63
- name: src,
64
- ports: portsToUse,
65
- fs: destFolder,
66
- browserWSEndpoint: this.browser.wsEndpoint(),
67
- });
68
- }
69
- else if (testConfigResource.ports > 0) {
70
- const openPorts = Object.entries(this.ports).filter(([portnumber, portopen]) => portopen);
71
- if (openPorts.length >= testConfigResource.ports) {
72
- for (let i = 0; i < testConfigResource.ports; i++) {
73
- portsToUse.push(openPorts[i][0]);
74
- this.ports[openPorts[i][0]] = false; // port is now closed
75
- }
76
- argz = JSON.stringify({
77
- scheduled: true,
78
- name: src,
79
- // ports: [3333],
80
- ports: portsToUse,
81
- fs: destFolder,
82
- browserWSEndpoint: this.browser.wsEndpoint(),
83
- });
84
- }
85
- else {
86
- this.queue.push(src);
87
- return;
88
- }
89
- }
90
- else {
91
- console.error("negative port makes no sense", src);
92
- process.exit(-1);
93
- }
94
- const builtfile = dest;
95
- const webSideCares = [];
96
- // await Promise.all(
97
- // testConfig[3].map(async (sidecar) => {
98
- // if (sidecar[1] === "web") {
99
- // const s = await this.launchWebSideCar(
100
- // sidecar[0],
101
- // destinationOfRuntime(sidecar[0], "web", this.configs),
102
- // sidecar
103
- // );
104
- // webSideCares.push(s);
105
- // return s;
106
- // }
107
- // if (sidecar[1] === "node") {
108
- // return this.launchNodeSideCar(
109
- // sidecar[0],
110
- // destinationOfRuntime(sidecar[0], "node", this.configs),
111
- // sidecar
112
- // );
113
- // }
114
- // })
115
- // );
116
- this.server[builtfile] = await import(`${builtfile}?cacheBust=${Date.now()}`).then((module) => {
117
- return module.default.then((defaultModule) => {
118
- defaultModule
119
- .receiveTestResourceConfig(argz)
120
- .then(async ({ features, failed }) => {
121
- this.receiveFeatures(features, destFolder, src);
122
- // console.log(`${src} completed with ${failed} errors`);
123
- statusMessagePretty(failed, src);
124
- })
125
- .catch((e) => {
126
- console.log(`${src} errored with`, e);
127
- })
128
- .finally(() => {
129
- webSideCares.forEach((webSideCar) => webSideCar.close());
130
- this.deregister(src);
131
- });
132
- });
133
- });
134
- // console.log("portsToUse", portsToUse);
135
- for (let i = 0; i <= portsToUse.length; i++) {
136
- if (portsToUse[i]) {
137
- this.ports[portsToUse[i]] = "true"; //port is open again
138
- }
139
- }
140
- };
141
- this.launchWebSideCar = async (src, dest, testConfig) => {
142
- const d = dest + ".mjs";
143
- console.log("launchWebSideCar", src, dest, d);
144
- const destFolder = dest.replace(".mjs", "");
145
- // const webArgz = JSON.stringify({
146
- // name: dest,
147
- // ports: [].toString(),
148
- // fs: destFolder,
149
- // browserWSEndpoint: this.browser.wsEndpoint(),
150
- // });
151
- const fileStreams2 = [];
152
- const doneFileStream2 = [];
153
- return new Promise((res, rej) => {
154
- this.browser
155
- .newPage()
156
- .then((page) => {
157
- // page.on("console", (msg) => {
158
- // console.log("web > ", msg.args(), msg.text());
159
- // // for (let i = 0; i < msg._args.length; ++i)
160
- // // console.log(`${i}: ${msg._args[i]}`);
161
- // });
162
- page.exposeFunction("custom-screenshot", async (ssOpts, testName) => {
163
- // console.log("main.ts browser custom-screenshot", testName);
164
- const p = ssOpts.path;
165
- const dir = path.dirname(p);
166
- fs.mkdirSync(dir, {
167
- recursive: true,
168
- });
169
- files[testName].add(ssOpts.path);
170
- const sPromise = page.screenshot(Object.assign(Object.assign({}, ssOpts), { path: p }));
171
- if (!screenshots[testName]) {
172
- screenshots[testName] = [];
173
- }
174
- screenshots[testName].push(sPromise);
175
- // sPromise.then(())
176
- await sPromise;
177
- return sPromise;
178
- // page.evaluate(`window["screenshot done"]`);
179
- });
180
- page.exposeFunction("writeFileSync", (fp, contents, testName) => {
181
- const dir = path.dirname(fp);
182
- fs.mkdirSync(dir, {
183
- recursive: true,
184
- });
185
- const p = new Promise(async (res, rej) => {
186
- fs.writeFileSync(fp, contents);
187
- res(fp);
188
- });
189
- doneFileStream2.push(p);
190
- if (!files[testName]) {
191
- files[testName] = new Set();
192
- }
193
- files[testName].add(fp);
194
- return p;
195
- });
196
- page.exposeFunction("existsSync", (fp, contents) => {
197
- return fs.existsSync(fp);
198
- });
199
- page.exposeFunction("mkdirSync", (fp) => {
200
- if (!fs.existsSync(fp)) {
201
- return fs.mkdirSync(fp, {
202
- recursive: true,
203
- });
204
- }
205
- return false;
206
- });
207
- page.exposeFunction("createWriteStream", (fp, testName) => {
208
- const f = fs.createWriteStream(fp);
209
- // if (!files[testName]) {
210
- // files[testName] = new Set();
211
- // }
212
- files[testName].add(fp);
213
- const p = new Promise((res, rej) => {
214
- res(fp);
215
- });
216
- doneFileStream2.push(p);
217
- f.on("close", async () => {
218
- await p;
219
- });
220
- fileStreams2.push(f);
221
- return Object.assign(Object.assign({}, JSON.parse(JSON.stringify(f))), { uid: fileStreams2.length - 1 });
222
- });
223
- page.exposeFunction("write", async (uid, contents) => {
224
- return fileStreams2[uid].write(contents);
225
- });
226
- page.exposeFunction("end", async (uid) => {
227
- return fileStreams2[uid].end();
228
- });
229
- // page.exposeFunction("customclose", (p: string, testName: string) => {
230
- // fs.writeFileSync(
231
- // p + "/manifest.json",
232
- // JSON.stringify(Array.from(files[testName]))
233
- // );
234
- // delete files[testName];
235
- // Promise.all(screenshots[testName] || []).then(() => {
236
- // delete screenshots[testName];
237
- // // page.close();
238
- // });
239
- // });
240
- return page;
241
- })
242
- .then(async (page) => {
243
- await page.goto(`file://${`${dest}.html`}`, {});
244
- res(page);
245
- });
246
- });
247
- };
248
- this.launchNodeSideCar = async (src, dest, testConfig) => {
249
- const d = dest + ".mjs";
250
- console.log("launchNodeSideCar", src, dest, d);
251
- const destFolder = dest.replace(".mjs", "");
252
- let argz = "";
253
- const testConfigResource = testConfig[2];
254
- let portsToUse = [];
255
- if (testConfigResource.ports === 0) {
256
- argz = JSON.stringify({
257
- scheduled: true,
258
- name: src,
259
- ports: portsToUse,
260
- fs: destFolder,
261
- browserWSEndpoint: this.browser.wsEndpoint(),
262
- });
263
- }
264
- else if (testConfigResource.ports > 0) {
265
- const openPorts = Object.entries(this.ports).filter(([portnumber, portopen]) => portopen);
266
- // console.log("openPorts", openPorts);
267
- if (openPorts.length >= testConfigResource.ports) {
268
- for (let i = 0; i < testConfigResource.ports; i++) {
269
- portsToUse.push(openPorts[i][0]);
270
- this.ports[openPorts[i][0]] = false; // port is now closed
271
- }
272
- argz = JSON.stringify({
273
- scheduled: true,
274
- name: src,
275
- // ports: [3333],
276
- ports: portsToUse,
277
- fs: ".",
278
- browserWSEndpoint: this.browser.wsEndpoint(),
279
- });
280
- }
281
- else {
282
- this.queue.push(src);
283
- return;
284
- }
285
- }
286
- else {
287
- console.error("negative port makes no sense", src);
288
- process.exit(-1);
289
- }
290
- const builtfile = dest + ".mjs";
291
- // console.log(
292
- // "node builtfile",
293
- // (await import(`${builtfile}?cacheBust=${Date.now()}`)).default
294
- // );
295
- this.server[builtfile] = await import(`${builtfile}?cacheBust=${Date.now()}`).then((module) => {
296
- return module.default.then((defaultModule) => {
297
- // console.log("defaultModule", defaultModule);
298
- const s = new defaultModule();
299
- s.receiveTestResourceConfig(argz);
300
- // Object.create(defaultModule);
301
- // defaultModule
302
- // .receiveTestResourceConfig(argz)
303
- // .then((x) => {
304
- // console.log("then", x);
305
- // return x;
306
- // })
307
- // .catch((e) => {
308
- // console.log("catch", e);
309
- // });
310
- });
311
- });
312
- // console.log("portsToUse", portsToUse);
313
- for (let i = 0; i <= portsToUse.length; i++) {
314
- if (portsToUse[i]) {
315
- this.ports[portsToUse[i]] = "true"; //port is open again
316
- }
317
- }
318
- };
319
- this.launchWeb = (t, dest) => {
320
- console.log("! web", t);
321
- this.register(t);
322
- // sidecars.map((sidecar) => {
323
- // if (sidecar[1] === "node") {
324
- // return this.launchNodeSideCar(
325
- // sidecar[0],
326
- // destinationOfRuntime(sidecar[0], "node", this.configs),
327
- // sidecar
328
- // );
329
- // }
330
- // });
331
- const destFolder = dest.replace(".mjs", "");
332
- const webArgz = JSON.stringify({
333
- name: dest,
334
- ports: [].toString(),
335
- fs: destFolder,
336
- browserWSEndpoint: this.browser.wsEndpoint(),
337
- });
338
- const d = `${dest}?cacheBust=${Date.now()}`;
339
- const evaluation = `
340
- console.log("importing ${d}");
341
- import('${d}').then(async (x) => {
342
- console.log("imported", (await x.default));
343
- try {
344
- return await (await x.default).receiveTestResourceConfig(${webArgz})
345
- } catch (e) {
346
- console.log("fail", e)
347
- }
348
- })`;
349
- const fileStreams2 = [];
350
- const doneFileStream2 = [];
351
- const stdoutStream = fs.createWriteStream(`${destFolder}/stdout.log`);
352
- const stderrStream = fs.createWriteStream(`${destFolder}/stderr.log`);
353
- this.browser
354
- .newPage()
355
- .then((page) => {
356
- // page.on("console", (msg) => {
357
- // // console.log("web > ", msg.args(), msg.text());
358
- // });
359
- page.exposeFunction("screencast", async (ssOpts, testName) => {
360
- const p = ssOpts.path;
361
- const dir = path.dirname(p);
362
- fs.mkdirSync(dir, {
363
- recursive: true,
364
- });
365
- if (!files[testName]) {
366
- files[testName] = new Set();
367
- }
368
- files[testName].add(ssOpts.path);
369
- const sPromise = page.screenshot(Object.assign(Object.assign({}, ssOpts), { path: p }));
370
- if (!screenshots[testName]) {
371
- screenshots[testName] = [];
372
- }
373
- screenshots[testName].push(sPromise);
374
- // sPromise.then(())
375
- await sPromise;
376
- return sPromise;
377
- // page.evaluate(`window["screenshot done"]`);
378
- });
379
- page.exposeFunction("customScreenShot", async (ssOpts, testName) => {
380
- const p = ssOpts.path;
381
- const dir = path.dirname(p);
382
- fs.mkdirSync(dir, {
383
- recursive: true,
384
- });
385
- if (!files[testName]) {
386
- files[testName] = new Set();
387
- }
388
- files[testName].add(ssOpts.path);
389
- const sPromise = page.screenshot(Object.assign(Object.assign({}, ssOpts), { path: p }));
390
- if (!screenshots[testName]) {
391
- screenshots[testName] = [];
392
- }
393
- screenshots[testName].push(sPromise);
394
- // sPromise.then(())
395
- await sPromise;
396
- return sPromise;
397
- // page.evaluate(`window["screenshot done"]`);
398
- });
399
- page.exposeFunction("writeFileSync", (fp, contents, testName) => {
400
- return globalThis["writeFileSync"](fp, contents, testName);
401
- // const dir = path.dirname(fp);
402
- // fs.mkdirSync(dir, {
403
- // recursive: true,
404
- // });
405
- // const p = new Promise<string>(async (res, rej) => {
406
- // fs.writeFileSync(fp, contents);
407
- // res(fp);
408
- // });
409
- // doneFileStream2.push(p);
410
- // if (!files[testName]) {
411
- // files[testName] = new Set();
412
- // }
413
- // files[testName].add(fp);
414
- // return p;
415
- });
416
- page.exposeFunction("existsSync", (fp, contents) => {
417
- return fs.existsSync(fp);
418
- });
419
- page.exposeFunction("mkdirSync", (fp) => {
420
- if (!fs.existsSync(fp)) {
421
- return fs.mkdirSync(fp, {
422
- recursive: true,
423
- });
424
- }
425
- return false;
426
- });
427
- page.exposeFunction("createWriteStream", (fp, testName) => {
428
- const f = fs.createWriteStream(fp);
429
- if (!files[testName]) {
430
- files[testName] = new Set();
431
- }
432
- files[testName].add(fp);
433
- const p = new Promise((res, rej) => {
434
- res(fp);
435
- });
436
- doneFileStream2.push(p);
437
- f.on("close", async () => {
438
- await p;
439
- });
440
- fileStreams2.push(f);
441
- return Object.assign(Object.assign({}, JSON.parse(JSON.stringify(f))), { uid: fileStreams2.length - 1 });
442
- });
443
- page.exposeFunction("write", async (uid, contents) => {
444
- return fileStreams2[uid].write(contents);
445
- });
446
- page.exposeFunction("end", async (uid) => {
447
- return fileStreams2[uid].end();
448
- });
449
- // page.exposeFunction("customclose", (p: string, testName: string) => {
450
- // // console.log("closing", p);
451
- // console.log("\t GOODBYE customclose");
452
- // fs.writeFileSync(
453
- // p + "/manifest.json",
454
- // JSON.stringify(Array.from(files[testName]))
455
- // );
456
- // delete files[testName];
457
- // // console.log("screenshots[testName]", screenshots[testName]);
458
- // Promise.all(screenshots[testName] || []).then(() => {
459
- // delete screenshots[testName];
460
- // });
461
- // // globalThis["writeFileSync"](
462
- // // p + "/manifest.json",
463
- // // // files.entries()
464
- // // JSON.stringify(Array.from(files[testName]))
465
- // // );
466
- // // console.log("closing doneFileStream2", doneFileStream2);
467
- // // console.log("closing doneFileStream2", doneFileStream2);
468
- // // Promise.all([...doneFileStream2, ...screenshots2]).then(() => {
469
- // // page.close();
470
- // // });
471
- // // Promise.all(screenshots).then(() => {
472
- // // page.close();
473
- // // });
474
- // // setTimeout(() => {
475
- // // console.log("Delayed for 1 second.");
476
- // // page.close();
477
- // // }, 5000);
478
- // // return page.close();
479
- // });
480
- page.exposeFunction("page", () => {
481
- return page.mainFrame()._id;
482
- });
483
- page.exposeFunction("click", (sel) => {
484
- return page.click(sel);
485
- });
486
- page.exposeFunction("focusOn", (sel) => {
487
- return page.focus(sel);
488
- });
489
- page.exposeFunction("typeInto", async (value) => await page.keyboard.type(value));
490
- page.exposeFunction("getValue", (selector) => page.$eval(selector, (input) => input.getAttribute("value")));
491
- page.exposeFunction("getAttribute", async (selector, attribute) => {
492
- const attributeValue = await page.$eval(selector, (input) => {
493
- return input.getAttribute(attribute);
494
- });
495
- return attributeValue;
496
- });
497
- page.exposeFunction("isDisabled", async (selector) => {
498
- const attributeValue = await page.$eval(selector, (input) => {
499
- return input.disabled;
500
- });
501
- return attributeValue;
502
- });
503
- page.exposeFunction("$", async (selector) => {
504
- const x = page.$(selector);
505
- const y = await x;
506
- return y;
507
- });
508
- return page;
509
- })
510
- .then(async (page) => {
511
- const close = () => {
512
- if (!files[t]) {
513
- files[t] = new Set();
514
- }
515
- // files[t].add(filepath);
516
- fs.writeFileSync(destFolder + "/manifest.json", JSON.stringify(Array.from(files[t])));
517
- delete files[t];
518
- Promise.all(screenshots[t] || []).then(() => {
519
- delete screenshots[t];
520
- page.close();
521
- this.deregister(t);
522
- stderrStream.close();
523
- stdoutStream.close();
524
- });
525
- };
526
- page.on("pageerror", (err) => {
527
- console.debug(`Error from ${t}: [${err.name}] `);
528
- stderrStream.write(err.name);
529
- if (err.cause) {
530
- console.debug(`Error from ${t} cause: [${err.cause}] `);
531
- stderrStream.write(err.cause);
532
- }
533
- if (err.stack) {
534
- console.debug(`Error from stack ${t}: [${err.stack}] `);
535
- stderrStream.write(err.stack);
536
- }
537
- console.debug(`Error from message ${t}: [${err.message}] `);
538
- stderrStream.write(err.message);
539
- // close();
540
- });
541
- page.on("console", (log) => {
542
- // console.debug(`Log from ${t}: [${log.text()}] `);
543
- // console.debug(`Log from ${t}: [${JSON.stringify(log.location())}] `);
544
- // console.debug(
545
- // `Log from ${t}: [${JSON.stringify(log.stackTrace())}] `
546
- // );
547
- stdoutStream.write(log.text());
548
- stdoutStream.write(JSON.stringify(log.location()));
549
- stdoutStream.write(JSON.stringify(log.stackTrace()));
550
- });
551
- await page.goto(`file://${`${destFolder}.html`}`, {});
552
- await page
553
- .evaluate(evaluation)
554
- .then(async ({ failed, features }) => {
555
- this.receiveFeatures(features, destFolder, t);
556
- // console.log(`${t} completed with ${failed} errors`);
557
- statusMessagePretty(failed, t);
558
- })
559
- .catch((e) => {
560
- console.log(`${t} errored with`, e);
561
- })
562
- .finally(() => {
563
- close();
564
- });
565
- return page;
566
- });
567
- };
568
- this.receiveFeatures = (features, destFolder, srcTest) => {
569
- const featureDestination = path.resolve(process.cwd(), "docs", "features", "strings", srcTest.split(".").slice(0, -1).join(".") + ".features.txt");
570
- features
571
- .reduce(async (mm, featureStringKey) => {
572
- const accum = await mm;
573
- const isUrl = isValidUrl(featureStringKey);
574
- if (isUrl) {
575
- const u = new URL(featureStringKey);
576
- if (u.protocol === "file:") {
577
- const newPath = `${process.cwd()}/docs/features/internal/${path.relative(process.cwd(), u.pathname)}`;
578
- await fs.promises.mkdir(path.dirname(newPath), { recursive: true });
579
- try {
580
- await fs.unlinkSync(newPath);
581
- // console.log(`Removed existing link at ${newPath}`);
582
- }
583
- catch (error) {
584
- if (error.code !== "ENOENT") {
585
- // throw error;
586
- }
587
- }
588
- fs.symlink(u.pathname, newPath, (err) => {
589
- if (err) {
590
- // console.error("Error creating symlink:", err);
591
- }
592
- else {
593
- // console.log("Symlink created successfully");
594
- }
595
- });
596
- accum.files.push(newPath);
597
- }
598
- else if (u.protocol === "http:" || u.protocol === "https:") {
599
- const newPath = `${process.cwd()}/docs/features/external${u.hostname}${u.pathname}`;
600
- const body = await this.configs.featureIngestor(featureStringKey);
601
- writeFileAndCreateDir(newPath, body);
602
- accum.files.push(newPath);
603
- }
604
- }
605
- else {
606
- await fs.promises.mkdir(path.dirname(featureDestination), {
607
- recursive: true,
608
- });
609
- // const newPath = `${process.cwd()}/docs/features/plain/${await sha256(
610
- // featureStringKey
611
- // )}`;
612
- // writeFileAndCreateDir(
613
- // `${featureDestination}/${await sha256(featureStringKey)}`,
614
- // featureStringKey
615
- // );
616
- accum.strings.push(featureStringKey);
617
- }
618
- return accum;
619
- }, Promise.resolve({ files: [], strings: [] }))
620
- .then(({ files, strings }) => {
621
- // writeFileAndCreateDir(`${featureDestination}`, JSON.stringify(strings));
622
- fs.writeFileSync(`${destFolder}/featurePrompt.txt`, files
623
- .map((f) => {
624
- return `/read ${f}`;
625
- })
626
- .join("\n"));
627
- });
628
- };
629
- this.server = {};
630
- this.configs = configs;
631
- this.ports = {};
632
- this.registry = {};
633
- this.configs.ports.forEach((element) => {
634
- this.ports[element] = "true"; // set ports as open
635
- });
636
- globalThis["waitForSelector"] = async (pageKey, sel) => {
637
- console.log("waitForSelector", pageKey, sel);
638
- const page = (await this.browser.pages()).find((p) => p.mainFrame()._id === pageKey);
639
- await (page === null || page === void 0 ? void 0 : page.waitForSelector(sel));
640
- };
641
- globalThis["screencastStop"] = async (path) => {
642
- return recorders[path].stop();
643
- };
644
- globalThis["closePage"] = async (pageKey) => {
645
- const page = (await this.browser.pages()).find((p) => p.mainFrame()._id === pageKey);
646
- return page.close();
647
- };
648
- // globalThis["closePage"] = (p) => {
649
- // console.log("closePage", p);
650
- // return p.close();
651
- // };
652
- globalThis["goto"] = async (pageKey, url) => {
653
- const page = (await this.browser.pages()).find((p) => p.mainFrame()._id === pageKey);
654
- await (page === null || page === void 0 ? void 0 : page.goto(url));
655
- return;
656
- };
657
- globalThis["newPage"] = () => {
658
- return this.browser.newPage();
659
- };
660
- globalThis["pages"] = () => {
661
- return this.browser.pages();
662
- };
663
- globalThis["mkdirSync"] = (fp) => {
664
- if (!fs.existsSync(fp)) {
665
- return fs.mkdirSync(fp, {
666
- recursive: true,
667
- });
668
- }
669
- return false;
670
- };
671
- globalThis["writeFileSync"] = (filepath, contents, testName) => {
672
- // console.log(testName, "writeFileSync", filepath, testName);
673
- // Create directories if they don't exist
674
- const dir = path.dirname(filepath);
675
- // console.log(testName, "mkdirSync", dir);
676
- fs.mkdirSync(dir, {
677
- recursive: true,
678
- });
679
- // console.log(testName, "mkdirSync2");
680
- if (!files[testName]) {
681
- files[testName] = new Set();
682
- }
683
- files[testName].add(filepath);
684
- return fs.writeFileSync(filepath, contents);
685
- };
686
- globalThis["createWriteStream"] = (filepath, testName) => {
687
- const f = fs.createWriteStream(filepath);
688
- fileStreams3.push(f);
689
- // files.add(filepath);
690
- if (!files[testName]) {
691
- files[testName] = new Set();
692
- }
693
- files[testName].add(filepath);
694
- return Object.assign(Object.assign({}, JSON.parse(JSON.stringify(f))), { uid: fileStreams3.length - 1 });
695
- };
696
- globalThis["write"] = (uid, contents) => {
697
- fileStreams3[uid].write(contents);
698
- };
699
- globalThis["end"] = (uid) => {
700
- fileStreams3[uid].end();
701
- };
702
- // async (ssOpts: ScreenshotOptions, testName: string) => {
703
- // const p = ssOpts.path as string;
704
- // const dir = path.dirname(p);
705
- // fs.mkdirSync(dir, {
706
- // recursive: true,
707
- // });
708
- // if (!files[testName]) {
709
- // files[testName] = new Set();
710
- // }
711
- // files[testName].add(ssOpts.path as string);
712
- // const sPromise = page.screenshot({
713
- // ...ssOpts,
714
- // path: p,
715
- // });
716
- // if (!screenshots[testName]) {
717
- // screenshots[testName] = [];
718
- // }
719
- // screenshots[testName].push(sPromise);
720
- // // sPromise.then(())
721
- // await sPromise;
722
- // return sPromise;
723
- // // page.evaluate(`window["screenshot done"]`);
724
- // };
725
- globalThis["customScreenShot"] = async (opts, pageKey, testName) => {
726
- const page = (await this.browser.pages()).find((p) => p.mainFrame()._id === pageKey);
727
- const p = opts.path;
728
- const dir = path.dirname(p);
729
- fs.mkdirSync(dir, {
730
- recursive: true,
731
- });
732
- if (!files[opts.path]) {
733
- files[opts.path] = new Set();
734
- }
735
- files[opts.path].add(opts.path);
736
- const sPromise = page.screenshot(Object.assign(Object.assign({}, opts), { path: p }));
737
- if (!screenshots[opts.path]) {
738
- screenshots[opts.path] = [];
739
- }
740
- screenshots[opts.path].push(sPromise);
741
- await sPromise;
742
- return sPromise;
743
- };
744
- globalThis["screencast"] = async (opts, pageKey) => {
745
- const page = (await this.browser.pages()).find((p) => p.mainFrame()._id === pageKey);
746
- const p = opts.path;
747
- const dir = path.dirname(p);
748
- fs.mkdirSync(dir, {
749
- recursive: true,
750
- });
751
- const recorder = await (page === null || page === void 0 ? void 0 : page.screencast(Object.assign(Object.assign({}, opts), { path: p })));
752
- recorders[opts.path] = recorder;
753
- return opts.path;
754
- };
755
- // globalThis["customclose"] = (p: string, testName: string) => {
756
- // if (!files[testName]) {
757
- // files[testName] = new Set();
758
- // }
759
- // fs.writeFileSync(
760
- // p + "/manifest.json",
761
- // JSON.stringify(Array.from(files[testName]))
762
- // );
763
- // delete files[testName];
764
- // };
765
- }
766
- customclose() {
767
- throw new Error("Method not implemented.");
768
- }
769
- waitForSelector(p, s) {
770
- throw new Error("Method not implemented.");
771
- }
772
- closePage(p) {
773
- throw new Error("Method not implemented.");
774
- }
775
- newPage() {
776
- throw new Error("Method not implemented.");
777
- }
778
- goto(p, url) {
779
- throw new Error("Method not implemented.");
780
- }
781
- $(selector) {
782
- throw new Error("Method not implemented.");
783
- }
784
- screencast(opts) {
785
- throw new Error("Method not implemented.");
786
- }
787
- customScreenShot(opts, cdpPage) {
788
- throw new Error("Method not implemented.");
789
- }
790
- end(accessObject) {
791
- throw new Error("Method not implemented.");
792
- }
793
- existsSync(destFolder) {
794
- return fs.existsSync(destFolder);
795
- }
796
- async mkdirSync(fp) {
797
- if (!fs.existsSync(fp)) {
798
- return fs.mkdirSync(fp, {
799
- recursive: true,
800
- });
801
- }
802
- return false;
803
- }
804
- writeFileSync(fp, contents) {
805
- fs.writeFileSync(fp, contents);
806
- }
807
- createWriteStream(filepath) {
808
- return fs.createWriteStream(filepath);
809
- }
810
- testArtiFactoryfileWriter(tLog, callback) {
811
- return (fPath, value) => {
812
- callback(new Promise((res, rej) => {
813
- tLog("testArtiFactory =>", fPath);
814
- const cleanPath = path.resolve(fPath);
815
- fPaths.push(cleanPath.replace(process.cwd(), ``));
816
- const targetDir = cleanPath.split("/").slice(0, -1).join("/");
817
- fs.mkdir(targetDir, { recursive: true }, async (error) => {
818
- if (error) {
819
- console.error(`❗️testArtiFactory failed`, targetDir, error);
820
- }
821
- fs.writeFileSync(path.resolve(targetDir.split("/").slice(0, -1).join("/"), "manifest"), fPaths.join(`\n`), {
822
- encoding: "utf-8",
823
- });
824
- if (Buffer.isBuffer(value)) {
825
- fs.writeFileSync(fPath, value, "binary");
826
- res();
827
- }
828
- else if (`string` === typeof value) {
829
- fs.writeFileSync(fPath, value.toString(), {
830
- encoding: "utf-8",
831
- });
832
- res();
833
- }
834
- else {
835
- /* @ts-ignore:next-line */
836
- const pipeStream = value;
837
- const myFile = fs.createWriteStream(fPath);
838
- pipeStream.pipe(myFile);
839
- pipeStream.on("close", () => {
840
- myFile.close();
841
- res();
842
- });
843
- }
844
- });
845
- }));
846
- };
847
- }
848
- write(accessObject, contents) {
849
- throw new Error("Method not implemented.");
850
- }
851
- page() {
852
- throw new Error("Method not implemented.");
853
- }
854
- click(selector) {
855
- throw new Error("Method not implemented.");
856
- }
857
- focusOn(selector) {
858
- throw new Error("Method not implemented.");
859
- }
860
- typeInto(value) {
861
- throw new Error("Method not implemented.");
862
- }
863
- getValue(value) {
864
- throw new Error("Method not implemented.");
865
- }
866
- getAttribute(selector, attribute) {
867
- throw new Error("Method not implemented.");
868
- }
869
- isDisabled(selector) {
870
- throw new Error("Method not implemented.");
871
- }
872
- screencastStop(s) {
873
- throw new Error("Method not implemented.");
874
- }
875
- ////////////////////////////////////////////////////////////////////////////////
876
- async startPuppeteer(options, destfolder) {
877
- this.browser = (await puppeteer.launch(options));
878
- }
879
- ////////////////////////////////////////////////////////////////////////////////
880
- shutDown() {
881
- console.log("shutting down...");
882
- this.shutdownMode = true;
883
- this.checkForShutdown();
884
- }
885
- }
886
- async function writeFileAndCreateDir(filePath, data) {
887
- const dirPath = path.dirname(filePath);
888
- try {
889
- await fs.promises.mkdir(dirPath, { recursive: true });
890
- await fs.appendFileSync(filePath, data);
891
- }
892
- catch (error) {
893
- console.error(`Error writing file: ${error}`);
894
- }
895
- }
896
- async function sha256(rawData) {
897
- const data = typeof rawData === "object" ? JSON.stringify(rawData) : String(rawData);
898
- const msgBuffer = new TextEncoder().encode(data);
899
- const hashBuffer = await crypto.subtle.digest("SHA-256", msgBuffer);
900
- const hashArray = Array.from(new Uint8Array(hashBuffer));
901
- return hashArray.map((b) => b.toString(16).padStart(2, "0")).join("");
902
- }
903
- function isValidUrl(string) {
904
- try {
905
- new URL(string);
906
- return true;
907
- }
908
- catch (err) {
909
- return false;
910
- }
911
- }