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