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