testeranto 0.79.6 → 0.79.8

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 (182) hide show
  1. package/TaskMan1.Dockerfile +1 -1
  2. package/dist/common/Features.js +84 -0
  3. package/dist/common/Node.js +23 -0
  4. package/dist/common/PM/index.js +7 -0
  5. package/dist/common/PM/main.js +641 -0
  6. package/dist/common/PM/node.js +88 -0
  7. package/dist/common/PM/web.js +132 -0
  8. package/dist/common/Project.js +186 -0
  9. package/dist/common/Puppeteer.js +104 -0
  10. package/dist/common/Reporter.js +112 -0
  11. package/dist/common/Scheduler.js +1 -0
  12. package/dist/common/SubPackages/puppeteer.js +21 -0
  13. package/dist/common/SubPackages/react/component/node.js +19 -0
  14. package/dist/common/SubPackages/react/component/web.js +19 -0
  15. package/dist/common/SubPackages/react/jsx/index.js +25 -0
  16. package/dist/common/SubPackages/react/jsx/node.js +10 -0
  17. package/dist/common/SubPackages/react/jsx/web.js +10 -0
  18. package/dist/common/SubPackages/react-dom/component/node.js +101 -0
  19. package/dist/common/SubPackages/react-dom/component/web.js +93 -0
  20. package/dist/common/SubPackages/react-dom/jsx/index.js +2 -0
  21. package/dist/common/SubPackages/react-dom/jsx/node.js +39 -0
  22. package/dist/common/SubPackages/react-dom/jsx/web.js +118 -0
  23. package/dist/common/SubPackages/react-test-renderer/MemoExoticComponent/node.js +44 -0
  24. package/dist/common/SubPackages/react-test-renderer/component/index.js +2 -0
  25. package/dist/common/SubPackages/react-test-renderer/component/interface.js +68 -0
  26. package/dist/common/SubPackages/react-test-renderer/component/node.js +8 -0
  27. package/dist/common/SubPackages/react-test-renderer/component/web.js +8 -0
  28. package/dist/common/SubPackages/react-test-renderer/fc/node.js +50 -0
  29. package/dist/common/SubPackages/react-test-renderer/fc/web.js +50 -0
  30. package/dist/common/SubPackages/react-test-renderer/jsx/index.js +48 -0
  31. package/dist/common/SubPackages/react-test-renderer/jsx/node.js +10 -0
  32. package/dist/common/SubPackages/react-test-renderer/jsx/web.js +10 -0
  33. package/dist/common/SubPackages/react-test-renderer/jsx-promised/index.js +42 -0
  34. package/dist/common/SubPackages/react-test-renderer/jsx-promised/node.js +10 -0
  35. package/dist/common/SubPackages/react-test-renderer/jsx-promised/web.js +10 -0
  36. package/dist/common/TaskManBackEnd.js +174 -0
  37. package/dist/common/Types.js +2 -0
  38. package/dist/common/Web.js +39 -0
  39. package/dist/common/esbuildConfigs/features.js +14 -0
  40. package/dist/common/esbuildConfigs/index.js +21 -0
  41. package/dist/common/esbuildConfigs/inputFilesPlugin.js +49 -0
  42. package/dist/common/esbuildConfigs/node.js +39 -0
  43. package/dist/common/esbuildConfigs/report.js +13 -0
  44. package/dist/common/esbuildConfigs/tests.js +13 -0
  45. package/dist/common/esbuildConfigs/web.js +57 -0
  46. package/dist/common/lib/abstractBase.js +553 -0
  47. package/dist/common/lib/basebuilder.js +79 -0
  48. package/dist/common/lib/classBuilder.js +42 -0
  49. package/dist/common/lib/core.js +75 -0
  50. package/dist/common/lib/index.js +22 -0
  51. package/dist/common/lib/types.js +2 -0
  52. package/dist/common/mongooseSchemas.js +56 -0
  53. package/dist/common/package.json +3 -0
  54. package/dist/common/preload.js +15 -0
  55. package/dist/common/puppeteerConfiger.js +24 -0
  56. package/dist/common/report.html.js +31 -0
  57. package/dist/common/tsconfig.common.tsbuildinfo +1 -0
  58. package/dist/common/utils.js +16 -0
  59. package/dist/common/web.html.js +22 -0
  60. package/dist/module/ExampleTab.js +112 -0
  61. package/dist/module/Features.js +73 -0
  62. package/dist/module/Node.js +18 -0
  63. package/dist/module/PM/index.js +3 -0
  64. package/dist/module/PM/main.js +611 -0
  65. package/dist/module/PM/node.js +81 -0
  66. package/dist/module/PM/web.js +125 -0
  67. package/dist/module/Project.js +179 -0
  68. package/dist/module/Puppeteer.js +99 -0
  69. package/dist/module/Reporter.js +107 -0
  70. package/dist/module/Scheduler.js +1 -0
  71. package/dist/module/SubPackages/puppeteer.js +16 -0
  72. package/dist/module/SubPackages/react/component/node.js +14 -0
  73. package/dist/module/SubPackages/react/component/web.js +14 -0
  74. package/dist/module/SubPackages/react/jsx/index.js +19 -0
  75. package/dist/module/SubPackages/react/jsx/node.js +5 -0
  76. package/dist/module/SubPackages/react/jsx/web.js +5 -0
  77. package/dist/module/SubPackages/react-dom/component/node.js +93 -0
  78. package/dist/module/SubPackages/react-dom/component/web.js +88 -0
  79. package/dist/module/SubPackages/react-dom/jsx/index.js +1 -0
  80. package/dist/module/SubPackages/react-dom/jsx/node.js +31 -0
  81. package/dist/module/SubPackages/react-dom/jsx/web.js +90 -0
  82. package/dist/module/SubPackages/react-test-renderer/MemoExoticComponent/node.js +16 -0
  83. package/dist/module/SubPackages/react-test-renderer/component/index.js +1 -0
  84. package/dist/module/SubPackages/react-test-renderer/component/interface.js +39 -0
  85. package/dist/module/SubPackages/react-test-renderer/component/node.js +3 -0
  86. package/dist/module/SubPackages/react-test-renderer/component/web.js +3 -0
  87. package/dist/module/SubPackages/react-test-renderer/fc/node.js +22 -0
  88. package/dist/module/SubPackages/react-test-renderer/fc/web.js +22 -0
  89. package/dist/module/SubPackages/react-test-renderer/jsx/index.js +19 -0
  90. package/dist/module/SubPackages/react-test-renderer/jsx/node.js +5 -0
  91. package/dist/module/SubPackages/react-test-renderer/jsx/web.js +5 -0
  92. package/dist/module/SubPackages/react-test-renderer/jsx-promised/index.js +16 -0
  93. package/dist/module/SubPackages/react-test-renderer/jsx-promised/node.js +5 -0
  94. package/dist/module/SubPackages/react-test-renderer/jsx-promised/web.js +5 -0
  95. package/dist/module/TaskManBackEnd.js +169 -0
  96. package/dist/module/TaskManFrontEnd.js +600 -0
  97. package/dist/module/Types.js +1 -0
  98. package/dist/module/Web.js +34 -0
  99. package/dist/module/esbuildConfigs/features.js +12 -0
  100. package/dist/module/esbuildConfigs/index.js +19 -0
  101. package/dist/module/esbuildConfigs/inputFilesPlugin.js +44 -0
  102. package/dist/module/esbuildConfigs/node.js +34 -0
  103. package/dist/module/esbuildConfigs/report.js +11 -0
  104. package/dist/module/esbuildConfigs/tests.js +11 -0
  105. package/dist/module/esbuildConfigs/web.js +52 -0
  106. package/dist/module/lib/abstractBase.js +545 -0
  107. package/dist/module/lib/basebuilder.js +75 -0
  108. package/dist/module/lib/classBuilder.js +38 -0
  109. package/dist/module/lib/core.js +72 -0
  110. package/dist/module/lib/index.js +18 -0
  111. package/dist/module/lib/types.js +1 -0
  112. package/dist/module/mongooseSchemas.js +50 -0
  113. package/dist/module/package.json +3 -0
  114. package/dist/module/preload.js +15 -0
  115. package/dist/module/puppeteerConfiger.js +19 -0
  116. package/dist/module/report.html.js +29 -0
  117. package/dist/module/tsconfig.module.tsbuildinfo +1 -0
  118. package/dist/module/utils.js +9 -0
  119. package/dist/module/web.html.js +20 -0
  120. package/dist/prebuild/Report.css +11358 -0
  121. package/dist/prebuild/Report.js +37666 -0
  122. package/dist/prebuild/TaskManBackEnd.mjs +180 -0
  123. package/dist/prebuild/TaskManFrontEnd.css +12301 -0
  124. package/dist/prebuild/TaskManFrontEnd.js +81737 -0
  125. package/dist/types/Features.d.ts +68 -0
  126. package/dist/types/Node.d.ts +6 -0
  127. package/dist/types/PM/index.d.ts +20 -0
  128. package/dist/types/PM/main.d.ts +31 -0
  129. package/dist/types/PM/node.d.ts +27 -0
  130. package/dist/types/PM/web.d.ts +25 -0
  131. package/dist/types/Project.d.ts +7 -0
  132. package/dist/types/Puppeteer.d.ts +1 -0
  133. package/dist/types/Reporter.d.ts +1 -0
  134. package/dist/types/Scheduler.d.ts +0 -0
  135. package/dist/types/SubPackages/puppeteer.d.ts +6 -0
  136. package/dist/types/SubPackages/react/component/node.d.ts +7 -0
  137. package/dist/types/SubPackages/react/component/web.d.ts +7 -0
  138. package/dist/types/SubPackages/react/jsx/index.d.ts +12 -0
  139. package/dist/types/SubPackages/react/jsx/node.d.ts +4 -0
  140. package/dist/types/SubPackages/react/jsx/web.d.ts +4 -0
  141. package/dist/types/SubPackages/react-dom/component/node.d.ts +12 -0
  142. package/dist/types/SubPackages/react-dom/component/web.d.ts +11 -0
  143. package/dist/types/SubPackages/react-dom/jsx/index.d.ts +6 -0
  144. package/dist/types/SubPackages/react-dom/jsx/node.d.ts +6 -0
  145. package/dist/types/SubPackages/react-dom/jsx/web.d.ts +5 -0
  146. package/dist/types/SubPackages/react-test-renderer/MemoExoticComponent/node.d.ts +5 -0
  147. package/dist/types/SubPackages/react-test-renderer/component/index.d.ts +13 -0
  148. package/dist/types/SubPackages/react-test-renderer/component/interface.d.ts +9 -0
  149. package/dist/types/SubPackages/react-test-renderer/component/node.d.ts +8 -0
  150. package/dist/types/SubPackages/react-test-renderer/component/web.d.ts +3 -0
  151. package/dist/types/SubPackages/react-test-renderer/fc/node.d.ts +8 -0
  152. package/dist/types/SubPackages/react-test-renderer/fc/web.d.ts +8 -0
  153. package/dist/types/SubPackages/react-test-renderer/jsx/index.d.ts +16 -0
  154. package/dist/types/SubPackages/react-test-renderer/jsx/node.d.ts +8 -0
  155. package/dist/types/SubPackages/react-test-renderer/jsx/web.d.ts +8 -0
  156. package/dist/types/SubPackages/react-test-renderer/jsx-promised/index.d.ts +15 -0
  157. package/dist/types/SubPackages/react-test-renderer/jsx-promised/node.d.ts +4 -0
  158. package/dist/types/SubPackages/react-test-renderer/jsx-promised/web.d.ts +4 -0
  159. package/dist/types/TaskManBackEnd.d.ts +1 -0
  160. package/dist/types/Types.d.ts +50 -0
  161. package/dist/types/Web.d.ts +6 -0
  162. package/dist/types/esbuildConfigs/features.d.ts +4 -0
  163. package/dist/types/esbuildConfigs/index.d.ts +4 -0
  164. package/dist/types/esbuildConfigs/inputFilesPlugin.d.ts +5 -0
  165. package/dist/types/esbuildConfigs/node.d.ts +4 -0
  166. package/dist/types/esbuildConfigs/report.d.ts +4 -0
  167. package/dist/types/esbuildConfigs/tests.d.ts +4 -0
  168. package/dist/types/esbuildConfigs/web.d.ts +4 -0
  169. package/dist/types/lib/abstractBase.d.ts +104 -0
  170. package/dist/types/lib/basebuilder.d.ts +27 -0
  171. package/dist/types/lib/classBuilder.d.ts +7 -0
  172. package/dist/types/lib/core.d.ts +8 -0
  173. package/dist/types/lib/index.d.ts +59 -0
  174. package/dist/types/lib/types.d.ts +64 -0
  175. package/dist/types/mongooseSchemas.d.ts +124 -0
  176. package/dist/types/preload.d.ts +0 -0
  177. package/dist/types/puppeteerConfiger.d.ts +4 -0
  178. package/dist/types/report.html.d.ts +2 -0
  179. package/dist/types/tsconfig.types.tsbuildinfo +1 -0
  180. package/dist/types/utils.d.ts +2 -0
  181. package/dist/types/web.html.d.ts +2 -0
  182. package/package.json +2 -2
@@ -0,0 +1,611 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import puppeteer from "puppeteer-core";
4
+ import { PM } from "./index.js";
5
+ import { destinationOfRuntime } from "../utils.js";
6
+ const fPaths = [];
7
+ const fileStreams3 = [];
8
+ const files = {}; // = new Set<string>();
9
+ const screenshots = {};
10
+ export class PM_Main extends PM {
11
+ constructor(configs) {
12
+ super();
13
+ this.launchNode = async (src, dest) => {
14
+ console.log("launchNode", src);
15
+ const destFolder = dest.replace(".mjs", "");
16
+ let argz = "";
17
+ const testConfig = this.configs.tests.find((t) => {
18
+ return t[0] === src;
19
+ });
20
+ if (!testConfig) {
21
+ console.error("missing test config");
22
+ process.exit(-1);
23
+ }
24
+ const testConfigResource = testConfig[2];
25
+ let portsToUse = [];
26
+ if (testConfigResource.ports === 0) {
27
+ argz = JSON.stringify({
28
+ scheduled: true,
29
+ name: src,
30
+ ports: portsToUse,
31
+ fs: destFolder,
32
+ browserWSEndpoint: this.browser.wsEndpoint(),
33
+ });
34
+ }
35
+ else if (testConfigResource.ports > 0) {
36
+ const openPorts = Object.entries(this.ports).filter(([portnumber, portopen]) => portopen);
37
+ console.log("openPorts", openPorts);
38
+ if (openPorts.length >= testConfigResource.ports) {
39
+ for (let i = 0; i < testConfigResource.ports; i++) {
40
+ portsToUse.push(openPorts[i][0]);
41
+ this.ports[openPorts[i][0]] = false; // port is now closed
42
+ }
43
+ argz = JSON.stringify({
44
+ scheduled: true,
45
+ name: src,
46
+ // ports: [3333],
47
+ ports: portsToUse,
48
+ fs: destFolder,
49
+ browserWSEndpoint: this.browser.wsEndpoint(),
50
+ });
51
+ }
52
+ else {
53
+ this.queue.push(src);
54
+ return;
55
+ }
56
+ }
57
+ else {
58
+ console.error("negative port makes no sense", src);
59
+ process.exit(-1);
60
+ }
61
+ const builtfile = dest + ".mjs";
62
+ await Promise.all(testConfig[3].map((sidecar) => {
63
+ if (sidecar[1] === "web") {
64
+ return this.launchWebSideCar(sidecar[0], destinationOfRuntime(sidecar[0], "web", this.configs), sidecar);
65
+ }
66
+ if (sidecar[1] === "node") {
67
+ return this.launchNodeSideCar(sidecar[0], destinationOfRuntime(sidecar[0], "node", this.configs), sidecar);
68
+ }
69
+ }));
70
+ this.server[builtfile] = await import(`${builtfile}?cacheBust=${Date.now()}`).then((module) => {
71
+ return module.default.then((defaultModule) => {
72
+ defaultModule
73
+ .receiveTestResourceConfig(argz)
74
+ .then((x) => {
75
+ console.log("then", x);
76
+ return x;
77
+ })
78
+ .catch((e) => {
79
+ console.log("catch", e);
80
+ });
81
+ });
82
+ });
83
+ console.log("portsToUse", portsToUse);
84
+ for (let i = 0; i <= portsToUse.length; i++) {
85
+ if (portsToUse[i]) {
86
+ this.ports[portsToUse[i]] = "true"; //port is open again
87
+ }
88
+ }
89
+ };
90
+ this.launchWebSideCar = async (src, dest, testConfig) => {
91
+ const d = dest + ".mjs";
92
+ console.log("launchWebSideCar", src, dest, d);
93
+ const destFolder = dest.replace(".mjs", "");
94
+ const webArgz = JSON.stringify({
95
+ name: dest,
96
+ ports: [].toString(),
97
+ fs: destFolder,
98
+ browserWSEndpoint: this.browser.wsEndpoint(),
99
+ });
100
+ const evaluation = `
101
+ console.log("importing ${dest}.mjs");
102
+ import('${dest}.mjs').then(async (x) => {
103
+ console.log("imported", x.default);
104
+ })`;
105
+ const fileStreams2 = [];
106
+ const doneFileStream2 = [];
107
+ return new Promise((res, rej) => {
108
+ this.browser
109
+ .newPage()
110
+ .then((page) => {
111
+ page.on("console", (msg) => {
112
+ console.log("web > ", msg.args(), msg.text());
113
+ // for (let i = 0; i < msg._args.length; ++i)
114
+ // console.log(`${i}: ${msg._args[i]}`);
115
+ });
116
+ page.exposeFunction("custom-screenshot", async (ssOpts, testName) => {
117
+ console.log("main.ts browser custom-screenshot", testName);
118
+ const p = ssOpts.path;
119
+ const dir = path.dirname(p);
120
+ fs.mkdirSync(dir, {
121
+ recursive: true,
122
+ });
123
+ files[testName].add(ssOpts.path);
124
+ const sPromise = page.screenshot(Object.assign(Object.assign({}, ssOpts), { path: p }));
125
+ if (!screenshots[testName]) {
126
+ screenshots[testName] = [];
127
+ }
128
+ screenshots[testName].push(sPromise);
129
+ // sPromise.then(())
130
+ await sPromise;
131
+ return sPromise;
132
+ // page.evaluate(`window["screenshot done"]`);
133
+ });
134
+ page.exposeFunction("writeFileSync", (fp, contents, testName) => {
135
+ const dir = path.dirname(fp);
136
+ fs.mkdirSync(dir, {
137
+ recursive: true,
138
+ });
139
+ const p = new Promise(async (res, rej) => {
140
+ fs.writeFileSync(fp, contents);
141
+ res(fp);
142
+ });
143
+ doneFileStream2.push(p);
144
+ if (!files[testName]) {
145
+ files[testName] = new Set();
146
+ }
147
+ files[testName].add(fp);
148
+ return p;
149
+ });
150
+ page.exposeFunction("existsSync", (fp, contents) => {
151
+ return fs.existsSync(fp);
152
+ });
153
+ page.exposeFunction("mkdirSync", (fp) => {
154
+ if (!fs.existsSync(fp)) {
155
+ return fs.mkdirSync(fp, {
156
+ recursive: true,
157
+ });
158
+ }
159
+ return false;
160
+ });
161
+ page.exposeFunction("createWriteStream", (fp, testName) => {
162
+ const f = fs.createWriteStream(fp);
163
+ if (!files[testName]) {
164
+ files[testName] = new Set();
165
+ }
166
+ files[testName].add(fp);
167
+ const p = new Promise((res, rej) => {
168
+ res(fp);
169
+ });
170
+ doneFileStream2.push(p);
171
+ f.on("close", async () => {
172
+ await p;
173
+ });
174
+ fileStreams2.push(f);
175
+ return Object.assign(Object.assign({}, JSON.parse(JSON.stringify(f))), { uid: fileStreams2.length - 1 });
176
+ });
177
+ page.exposeFunction("write", async (uid, contents) => {
178
+ return fileStreams2[uid].write(contents);
179
+ });
180
+ page.exposeFunction("end", async (uid) => {
181
+ return fileStreams2[uid].end();
182
+ });
183
+ page.exposeFunction("customclose", (p, testName) => {
184
+ fs.writeFileSync(p + "/manifest.json", JSON.stringify(Array.from(files[testName])));
185
+ delete files[testName];
186
+ Promise.all(screenshots[testName] || []).then(() => {
187
+ delete screenshots[testName];
188
+ page.close();
189
+ });
190
+ // globalThis["writeFileSync"](
191
+ // p + "/manifest.json",
192
+ // // files.entries()
193
+ // JSON.stringify(Array.from(files[testName]))
194
+ // );
195
+ // console.log("closing doneFileStream2", doneFileStream2);
196
+ // console.log("closing doneFileStream2", doneFileStream2);
197
+ // Promise.all([...doneFileStream2, ...screenshots2]).then(() => {
198
+ // page.close();
199
+ // });
200
+ // Promise.all(screenshots).then(() => {
201
+ // page.close();
202
+ // });
203
+ // setTimeout(() => {
204
+ // console.log("Delayed for 1 second.");
205
+ // page.close();
206
+ // }, 5000);
207
+ // return page.close();
208
+ });
209
+ return page;
210
+ })
211
+ .then(async (page) => {
212
+ page.on("console", (log) => console.debug(`Log from client: [${log.text()}] `));
213
+ await page.goto(`file://${`${dest}.html`}`, {});
214
+ res(page);
215
+ // page.evaluate(evaluation).finally(() => {
216
+ // console.log("evaluation failed.", dest);
217
+ // });
218
+ // return page;
219
+ });
220
+ });
221
+ };
222
+ // launchNodeSideCar = async (src: string, dest: string) => {};
223
+ this.launchNodeSideCar = async (src, dest, testConfig) => {
224
+ const d = dest + ".mjs";
225
+ console.log("launchNodeSideCar", src, dest, d);
226
+ const destFolder = dest.replace(".mjs", "");
227
+ let argz = "";
228
+ // const testConfig = this.configs.tests.find((t) => {
229
+ // return t[0] === src;
230
+ // });
231
+ // if (!testConfig) {
232
+ // console.error("missing test config");
233
+ // process.exit(-1);
234
+ // }
235
+ const testConfigResource = testConfig[2];
236
+ let portsToUse = [];
237
+ if (testConfigResource.ports === 0) {
238
+ argz = JSON.stringify({
239
+ scheduled: true,
240
+ name: src,
241
+ ports: portsToUse,
242
+ fs: destFolder,
243
+ browserWSEndpoint: this.browser.wsEndpoint(),
244
+ });
245
+ }
246
+ else if (testConfigResource.ports > 0) {
247
+ const openPorts = Object.entries(this.ports).filter(([portnumber, portopen]) => portopen);
248
+ console.log("openPorts", openPorts);
249
+ if (openPorts.length >= testConfigResource.ports) {
250
+ for (let i = 0; i < testConfigResource.ports; i++) {
251
+ portsToUse.push(openPorts[i][0]);
252
+ this.ports[openPorts[i][0]] = false; // port is now closed
253
+ }
254
+ argz = JSON.stringify({
255
+ scheduled: true,
256
+ name: src,
257
+ // ports: [3333],
258
+ ports: portsToUse,
259
+ fs: ".",
260
+ browserWSEndpoint: this.browser.wsEndpoint(),
261
+ });
262
+ }
263
+ else {
264
+ this.queue.push(src);
265
+ return;
266
+ }
267
+ }
268
+ else {
269
+ console.error("negative port makes no sense", src);
270
+ process.exit(-1);
271
+ }
272
+ const builtfile = dest + ".mjs";
273
+ // console.log(
274
+ // "node builtfile",
275
+ // (await import(`${builtfile}?cacheBust=${Date.now()}`)).default
276
+ // );
277
+ this.server[builtfile] = await import(`${builtfile}?cacheBust=${Date.now()}`).then((module) => {
278
+ return module.default.then((defaultModule) => {
279
+ console.log("defaultModule", defaultModule);
280
+ const s = new defaultModule();
281
+ s.receiveTestResourceConfig(argz);
282
+ // Object.create(defaultModule);
283
+ // defaultModule
284
+ // .receiveTestResourceConfig(argz)
285
+ // .then((x) => {
286
+ // console.log("then", x);
287
+ // return x;
288
+ // })
289
+ // .catch((e) => {
290
+ // console.log("catch", e);
291
+ // });
292
+ });
293
+ });
294
+ console.log("portsToUse", portsToUse);
295
+ for (let i = 0; i <= portsToUse.length; i++) {
296
+ if (portsToUse[i]) {
297
+ this.ports[portsToUse[i]] = "true"; //port is open again
298
+ }
299
+ }
300
+ };
301
+ this.launchWeb = (t, dest, sidecars) => {
302
+ console.log("launchWeb", t, dest);
303
+ sidecars.map((sidecar) => {
304
+ if (sidecar[1] === "node") {
305
+ return this.launchNodeSideCar(sidecar[0], destinationOfRuntime(sidecar[0], "node", this.configs), sidecar);
306
+ }
307
+ });
308
+ const destFolder = dest.replace(".mjs", "");
309
+ const webArgz = JSON.stringify({
310
+ name: dest,
311
+ ports: [].toString(),
312
+ fs: destFolder,
313
+ browserWSEndpoint: this.browser.wsEndpoint(),
314
+ });
315
+ const evaluation = `
316
+ console.log("importing ${dest}.mjs");
317
+ import('${dest}.mjs').then(async (x) => {
318
+ console.log("imported", x.default);
319
+ try {
320
+ await (await x.default).receiveTestResourceConfig(${webArgz})
321
+ } catch (e) {
322
+ console.log("fail", e)
323
+ }
324
+ })`;
325
+ const fileStreams2 = [];
326
+ const doneFileStream2 = [];
327
+ this.browser
328
+ .newPage()
329
+ .then((page) => {
330
+ page.on("console", (msg) => {
331
+ console.log("web > ", msg.args(), msg.text());
332
+ // for (let i = 0; i < msg._args.length; ++i)
333
+ // console.log(`${i}: ${msg._args[i]}`);
334
+ });
335
+ page.exposeFunction("customScreenShot", async (ssOpts, testName) => {
336
+ console.log("main.ts browser custom-screenshot", testName);
337
+ const p = ssOpts.path;
338
+ const dir = path.dirname(p);
339
+ fs.mkdirSync(dir, {
340
+ recursive: true,
341
+ });
342
+ if (!files[testName]) {
343
+ files[testName] = new Set();
344
+ }
345
+ files[testName].add(ssOpts.path);
346
+ const sPromise = page.screenshot(Object.assign(Object.assign({}, ssOpts), { path: p }));
347
+ if (!screenshots[testName]) {
348
+ screenshots[testName] = [];
349
+ }
350
+ screenshots[testName].push(sPromise);
351
+ // sPromise.then(())
352
+ await sPromise;
353
+ return sPromise;
354
+ // page.evaluate(`window["screenshot done"]`);
355
+ });
356
+ page.exposeFunction("writeFileSync", (fp, contents, testName) => {
357
+ const dir = path.dirname(fp);
358
+ fs.mkdirSync(dir, {
359
+ recursive: true,
360
+ });
361
+ const p = new Promise(async (res, rej) => {
362
+ fs.writeFileSync(fp, contents);
363
+ res(fp);
364
+ });
365
+ doneFileStream2.push(p);
366
+ if (!files[testName]) {
367
+ files[testName] = new Set();
368
+ }
369
+ files[testName].add(fp);
370
+ return p;
371
+ });
372
+ page.exposeFunction("existsSync", (fp, contents) => {
373
+ return fs.existsSync(fp);
374
+ });
375
+ page.exposeFunction("mkdirSync", (fp) => {
376
+ if (!fs.existsSync(fp)) {
377
+ return fs.mkdirSync(fp, {
378
+ recursive: true,
379
+ });
380
+ }
381
+ return false;
382
+ });
383
+ page.exposeFunction("createWriteStream", (fp, testName) => {
384
+ const f = fs.createWriteStream(fp);
385
+ if (!files[testName]) {
386
+ files[testName] = new Set();
387
+ }
388
+ files[testName].add(fp);
389
+ const p = new Promise((res, rej) => {
390
+ res(fp);
391
+ });
392
+ doneFileStream2.push(p);
393
+ f.on("close", async () => {
394
+ await p;
395
+ });
396
+ fileStreams2.push(f);
397
+ return Object.assign(Object.assign({}, JSON.parse(JSON.stringify(f))), { uid: fileStreams2.length - 1 });
398
+ });
399
+ page.exposeFunction("write", async (uid, contents) => {
400
+ return fileStreams2[uid].write(contents);
401
+ });
402
+ page.exposeFunction("end", async (uid) => {
403
+ return fileStreams2[uid].end();
404
+ });
405
+ page.exposeFunction("customclose", (p, testName) => {
406
+ console.log("\t closing", p);
407
+ fs.writeFileSync(p + "/manifest.json", JSON.stringify(Array.from(files[testName])));
408
+ delete files[testName];
409
+ Promise.all(screenshots[testName] || []).then(() => {
410
+ delete screenshots[testName];
411
+ page.close();
412
+ });
413
+ // globalThis["writeFileSync"](
414
+ // p + "/manifest.json",
415
+ // // files.entries()
416
+ // JSON.stringify(Array.from(files[testName]))
417
+ // );
418
+ // console.log("closing doneFileStream2", doneFileStream2);
419
+ // console.log("closing doneFileStream2", doneFileStream2);
420
+ // Promise.all([...doneFileStream2, ...screenshots2]).then(() => {
421
+ // page.close();
422
+ // });
423
+ // Promise.all(screenshots).then(() => {
424
+ // page.close();
425
+ // });
426
+ // setTimeout(() => {
427
+ // console.log("Delayed for 1 second.");
428
+ // page.close();
429
+ // }, 5000);
430
+ // return page.close();
431
+ });
432
+ return page;
433
+ })
434
+ .then(async (page) => {
435
+ page.on("console", (log) => console.debug(`Log from client: [${log.text()}] `));
436
+ await page.goto(`file://${`${dest}.html`}`, {});
437
+ page.evaluate(evaluation).finally(() => {
438
+ console.log("evaluation failed.", dest);
439
+ });
440
+ return page;
441
+ });
442
+ };
443
+ this.server = {};
444
+ this.configs = configs;
445
+ this.ports = {};
446
+ this.configs.ports.forEach((element) => {
447
+ this.ports[element] = "true"; // set ports as open
448
+ });
449
+ globalThis["mkdirSync"] = (fp) => {
450
+ if (!fs.existsSync(fp)) {
451
+ return fs.mkdirSync(fp, {
452
+ recursive: true,
453
+ });
454
+ }
455
+ return false;
456
+ };
457
+ globalThis["writeFileSync"] = (filepath, contents, testName) => {
458
+ console.log("globalThis-writeFileSync", filepath);
459
+ // Create directories if they don't exist
460
+ const dir = path.dirname(filepath.split("/").slice(0, -1).join("/"));
461
+ fs.mkdirSync(dir, {
462
+ recursive: true,
463
+ });
464
+ if (!files[testName]) {
465
+ files[testName] = new Set();
466
+ }
467
+ files[testName].add(filepath);
468
+ return fs.writeFileSync(filepath, contents);
469
+ };
470
+ globalThis["createWriteStream"] = (filepath, testName) => {
471
+ const f = fs.createWriteStream(filepath);
472
+ fileStreams3.push(f);
473
+ // files.add(filepath);
474
+ if (!files[testName]) {
475
+ files[testName] = new Set();
476
+ }
477
+ files[testName].add(filepath);
478
+ return Object.assign(Object.assign({}, JSON.parse(JSON.stringify(f))), { uid: fileStreams3.length - 1 });
479
+ };
480
+ globalThis["write"] = (uid, contents) => {
481
+ fileStreams3[uid].write(contents);
482
+ };
483
+ globalThis["end"] = (uid) => {
484
+ fileStreams3[uid].end();
485
+ };
486
+ globalThis["customScreenShot"] = async (opts, page) => {
487
+ // // fileStreams3[uid].write(contents);
488
+ // // console.log("asd", opts.path.split("/").slice(0, -1).join("/"));
489
+ // // const dir = path.dirname(opts.path.split("/").slice(0, -1).join("/"));
490
+ // // console.log("dir", dir);
491
+ // fs.mkdirSync(opts.path.split("/").slice(0, -1).join("/"), {
492
+ // recursive: true,
493
+ // });
494
+ // return page.screenshot(opts);
495
+ console.log("main.ts node custom-screenshot", page);
496
+ const p = opts.path;
497
+ const dir = path.dirname(p);
498
+ fs.mkdirSync(dir, {
499
+ recursive: true,
500
+ });
501
+ if (!files[opts.path]) {
502
+ files[opts.path] = new Set();
503
+ }
504
+ files[opts.path].add(opts.path);
505
+ const sPromise = page.screenshot(Object.assign(Object.assign({}, opts), { path: p }));
506
+ if (!screenshots[opts.path]) {
507
+ screenshots[opts.path] = [];
508
+ }
509
+ screenshots[opts.path].push(sPromise);
510
+ await sPromise;
511
+ return sPromise;
512
+ };
513
+ globalThis["customclose"] = (p, testName) => {
514
+ if (!files[testName]) {
515
+ files[testName] = new Set();
516
+ }
517
+ fs.writeFileSync(p + "/manifest.json", JSON.stringify(Array.from(files[testName])));
518
+ delete files[testName];
519
+ // globalThis["writeFileSync"](
520
+ // p + "/manifest.json",
521
+ // // files.entries()
522
+ // JSON.stringify(Array.from(files[testName]))
523
+ // );
524
+ // fileStreams3[uid].end();
525
+ };
526
+ // page.exposeFunction("customclose", () => {
527
+ // console.log("closing doneFileStream2", doneFileStream2);
528
+ // // console.log("closing doneFileStream2", doneFileStream2);
529
+ // Promise.all([...doneFileStream2, ...screenshots2]).then(() => {
530
+ // page.close();
531
+ // });
532
+ // // page.close();
533
+ // // Promise.all(screenshots).then(() => {
534
+ // // page.close();
535
+ // // });
536
+ // // setTimeout(() => {
537
+ // // console.log("Delayed for 1 second.");
538
+ // // page.close();
539
+ // // }, 5000);
540
+ // // return page.close();
541
+ // });
542
+ }
543
+ customScreenShot(opts) {
544
+ throw new Error("Method not implemented.");
545
+ }
546
+ async startPuppeteer(options, destfolder) {
547
+ this.browser = await puppeteer.launch(options);
548
+ return this.browser;
549
+ }
550
+ end(accessObject) {
551
+ throw new Error("Method not implemented.");
552
+ }
553
+ existsSync(destFolder) {
554
+ return fs.existsSync(destFolder);
555
+ }
556
+ async mkdirSync(fp) {
557
+ if (!fs.existsSync(fp)) {
558
+ return fs.mkdirSync(fp, {
559
+ recursive: true,
560
+ });
561
+ }
562
+ return false;
563
+ }
564
+ writeFileSync(fp, contents) {
565
+ fs.writeFileSync(fp, contents);
566
+ }
567
+ createWriteStream(filepath) {
568
+ return fs.createWriteStream(filepath);
569
+ }
570
+ testArtiFactoryfileWriter(tLog, callback) {
571
+ return (fPath, value) => {
572
+ callback(new Promise((res, rej) => {
573
+ tLog("testArtiFactory =>", fPath);
574
+ const cleanPath = path.resolve(fPath);
575
+ fPaths.push(cleanPath.replace(process.cwd(), ``));
576
+ const targetDir = cleanPath.split("/").slice(0, -1).join("/");
577
+ fs.mkdir(targetDir, { recursive: true }, async (error) => {
578
+ if (error) {
579
+ console.error(`❗️testArtiFactory failed`, targetDir, error);
580
+ }
581
+ fs.writeFileSync(path.resolve(targetDir.split("/").slice(0, -1).join("/"), "manifest"), fPaths.join(`\n`), {
582
+ encoding: "utf-8",
583
+ });
584
+ if (Buffer.isBuffer(value)) {
585
+ fs.writeFileSync(fPath, value, "binary");
586
+ res();
587
+ }
588
+ else if (`string` === typeof value) {
589
+ fs.writeFileSync(fPath, value.toString(), {
590
+ encoding: "utf-8",
591
+ });
592
+ res();
593
+ }
594
+ else {
595
+ /* @ts-ignore:next-line */
596
+ const pipeStream = value;
597
+ const myFile = fs.createWriteStream(fPath);
598
+ pipeStream.pipe(myFile);
599
+ pipeStream.on("close", () => {
600
+ myFile.close();
601
+ res();
602
+ });
603
+ }
604
+ });
605
+ }));
606
+ };
607
+ }
608
+ write(accessObject, contents) {
609
+ throw new Error("Method not implemented.");
610
+ }
611
+ }
@@ -0,0 +1,81 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import puppeteer from "puppeteer-core";
4
+ import { PM } from "./index.js";
5
+ const fPaths = [];
6
+ export class PM_Node extends PM {
7
+ constructor(t) {
8
+ super();
9
+ this.server = {};
10
+ this.testResourceConfiguration = t;
11
+ }
12
+ customScreenShot(opts, page) {
13
+ return globalThis["customScreenShot"](opts, page);
14
+ }
15
+ existsSync(destFolder) {
16
+ return globalThis["existsSync"](this.testResourceConfiguration.fs + "/" + destFolder);
17
+ }
18
+ mkdirSync() {
19
+ return globalThis["mkdirSync"](this.testResourceConfiguration.fs + "/");
20
+ }
21
+ write(writeObject, contents) {
22
+ return globalThis["write"](writeObject.uid, contents);
23
+ }
24
+ writeFileSync(filepath, contents) {
25
+ console.log("pm_node-writeFileSync", this.testResourceConfiguration);
26
+ return globalThis["writeFileSync"](this.testResourceConfiguration.fs + "/" + filepath, contents, this.testResourceConfiguration.name);
27
+ }
28
+ createWriteStream(filepath) {
29
+ return globalThis["createWriteStream"](this.testResourceConfiguration.fs + "/" + filepath, this.testResourceConfiguration.name);
30
+ }
31
+ end(writeObject) {
32
+ return globalThis["end"](writeObject.uid);
33
+ }
34
+ customclose() {
35
+ globalThis["customclose"](this.testResourceConfiguration.fs, this.testResourceConfiguration.name);
36
+ }
37
+ testArtiFactoryfileWriter(tLog, callback) {
38
+ return (fPath, value) => {
39
+ callback(new Promise((res, rej) => {
40
+ tLog("testArtiFactory =>", fPath);
41
+ const cleanPath = path.resolve(fPath);
42
+ fPaths.push(cleanPath.replace(process.cwd(), ``));
43
+ const targetDir = cleanPath.split("/").slice(0, -1).join("/");
44
+ fs.mkdir(targetDir, { recursive: true }, async (error) => {
45
+ if (error) {
46
+ console.error(`❗️testArtiFactory failed`, targetDir, error);
47
+ }
48
+ fs.writeFileSync(path.resolve(targetDir.split("/").slice(0, -1).join("/"), "manifest"), fPaths.join(`\n`), {
49
+ encoding: "utf-8",
50
+ });
51
+ if (Buffer.isBuffer(value)) {
52
+ fs.writeFileSync(fPath, value, "binary");
53
+ res();
54
+ }
55
+ else if (`string` === typeof value) {
56
+ fs.writeFileSync(fPath, value.toString(), {
57
+ encoding: "utf-8",
58
+ });
59
+ res();
60
+ }
61
+ else {
62
+ /* @ts-ignore:next-line */
63
+ const pipeStream = value;
64
+ const myFile = fs.createWriteStream(fPath);
65
+ pipeStream.pipe(myFile);
66
+ pipeStream.on("close", () => {
67
+ myFile.close();
68
+ res();
69
+ });
70
+ }
71
+ });
72
+ }));
73
+ };
74
+ }
75
+ // launch(options?: PuppeteerLaunchOptions): Promise<Browser>;
76
+ startPuppeteer(options) {
77
+ return puppeteer.connect(options).then((b) => {
78
+ this.browser = b;
79
+ });
80
+ }
81
+ }