testeranto 0.111.0 → 0.112.1

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 (178) hide show
  1. package/README.md +6 -5
  2. package/dist/common/Init.js +68 -0
  3. package/dist/common/Node.js +27 -0
  4. package/dist/common/PM/index.js +7 -0
  5. package/dist/common/PM/main.js +1176 -0
  6. package/dist/common/PM/node.js +128 -0
  7. package/dist/common/PM/web.js +121 -0
  8. package/dist/common/ReportServer.js +22 -0
  9. package/dist/common/SubPackages/react/component/node.js +19 -0
  10. package/dist/common/SubPackages/react/component/web.js +19 -0
  11. package/dist/common/SubPackages/react/jsx/index.js +21 -0
  12. package/dist/common/SubPackages/react/jsx/node.js +10 -0
  13. package/dist/common/SubPackages/react/jsx/web.js +10 -0
  14. package/dist/common/SubPackages/react-dom/component/node.js +88 -0
  15. package/dist/common/SubPackages/react-dom/component/web.js +67 -0
  16. package/dist/common/SubPackages/react-dom/jsx/index.js +2 -0
  17. package/dist/common/SubPackages/react-dom/jsx/node.js +39 -0
  18. package/dist/common/SubPackages/react-dom/jsx/web.js +128 -0
  19. package/dist/common/SubPackages/react-test-renderer/MemoExoticComponent/node.js +54 -0
  20. package/dist/common/SubPackages/react-test-renderer/component/index.js +2 -0
  21. package/dist/common/SubPackages/react-test-renderer/component/interface.js +70 -0
  22. package/dist/common/SubPackages/react-test-renderer/component/node.js +8 -0
  23. package/dist/common/SubPackages/react-test-renderer/component/web.js +8 -0
  24. package/dist/common/SubPackages/react-test-renderer/fc/node.js +60 -0
  25. package/dist/common/SubPackages/react-test-renderer/fc/web.js +60 -0
  26. package/dist/common/SubPackages/react-test-renderer/jsx/index.js +67 -0
  27. package/dist/common/SubPackages/react-test-renderer/jsx/node.js +10 -0
  28. package/dist/common/SubPackages/react-test-renderer/jsx/web.js +10 -0
  29. package/dist/common/SubPackages/react-test-renderer/jsx-promised/index.js +52 -0
  30. package/dist/common/SubPackages/react-test-renderer/jsx-promised/node.js +10 -0
  31. package/dist/common/SubPackages/react-test-renderer/jsx-promised/web.js +10 -0
  32. package/dist/common/Types.js +2 -0
  33. package/dist/common/Web.js +49 -0
  34. package/dist/common/build.js +222 -0
  35. package/dist/common/defaultConfig.js +20 -0
  36. package/dist/common/esbuildConfigs/eslint-formatter-testeranto.js +6 -0
  37. package/dist/common/esbuildConfigs/featuresPlugin.js +39 -0
  38. package/dist/common/esbuildConfigs/index.js +21 -0
  39. package/dist/common/esbuildConfigs/inputFilesPlugin.js +27 -0
  40. package/dist/common/esbuildConfigs/node.js +37 -0
  41. package/dist/common/esbuildConfigs/web.js +50 -0
  42. package/dist/common/init-docs.js +53 -0
  43. package/dist/common/lib/abstractBase.js +329 -0
  44. package/dist/common/lib/basebuilder.js +98 -0
  45. package/dist/common/lib/classBuilder.js +40 -0
  46. package/dist/common/lib/core.js +117 -0
  47. package/dist/common/lib/index.js +21 -0
  48. package/dist/common/lib/types.js +2 -0
  49. package/dist/common/package.json +3 -0
  50. package/dist/common/puppeteerConfiger.js +24 -0
  51. package/dist/common/run.js +62 -0
  52. package/dist/common/tsconfig.common.tsbuildinfo +1 -0
  53. package/dist/common/utils.js +43 -0
  54. package/dist/common/web.html.js +22 -0
  55. package/dist/module/Footer.js +4 -0
  56. package/dist/module/Init.js +63 -0
  57. package/dist/module/Node.js +20 -0
  58. package/dist/module/PM/index.js +3 -0
  59. package/dist/module/PM/main.js +1136 -0
  60. package/dist/module/PM/node.js +121 -0
  61. package/dist/module/PM/web.js +117 -0
  62. package/dist/module/ReportClient.js +97 -0
  63. package/dist/module/ReportServer.js +17 -0
  64. package/dist/module/SubPackages/react/component/node.js +14 -0
  65. package/dist/module/SubPackages/react/component/web.js +14 -0
  66. package/dist/module/SubPackages/react/jsx/index.js +15 -0
  67. package/dist/module/SubPackages/react/jsx/node.js +5 -0
  68. package/dist/module/SubPackages/react/jsx/web.js +5 -0
  69. package/dist/module/SubPackages/react-dom/component/node.js +80 -0
  70. package/dist/module/SubPackages/react-dom/component/web.js +62 -0
  71. package/dist/module/SubPackages/react-dom/jsx/index.js +1 -0
  72. package/dist/module/SubPackages/react-dom/jsx/node.js +31 -0
  73. package/dist/module/SubPackages/react-dom/jsx/web.js +90 -0
  74. package/dist/module/SubPackages/react-test-renderer/MemoExoticComponent/node.js +16 -0
  75. package/dist/module/SubPackages/react-test-renderer/component/index.js +1 -0
  76. package/dist/module/SubPackages/react-test-renderer/component/interface.js +31 -0
  77. package/dist/module/SubPackages/react-test-renderer/component/node.js +3 -0
  78. package/dist/module/SubPackages/react-test-renderer/component/web.js +3 -0
  79. package/dist/module/SubPackages/react-test-renderer/fc/node.js +22 -0
  80. package/dist/module/SubPackages/react-test-renderer/fc/web.js +22 -0
  81. package/dist/module/SubPackages/react-test-renderer/jsx/index.js +28 -0
  82. package/dist/module/SubPackages/react-test-renderer/jsx/node.js +5 -0
  83. package/dist/module/SubPackages/react-test-renderer/jsx/web.js +5 -0
  84. package/dist/module/SubPackages/react-test-renderer/jsx-promised/index.js +16 -0
  85. package/dist/module/SubPackages/react-test-renderer/jsx-promised/node.js +5 -0
  86. package/dist/module/SubPackages/react-test-renderer/jsx-promised/web.js +5 -0
  87. package/dist/module/TestReport.js +91 -0
  88. package/dist/module/Types.js +1 -0
  89. package/dist/module/Web.js +42 -0
  90. package/dist/module/build.js +184 -0
  91. package/dist/module/defaultConfig.js +18 -0
  92. package/dist/module/esbuildConfigs/eslint-formatter-testeranto.js +3 -0
  93. package/dist/module/esbuildConfigs/featuresPlugin.js +34 -0
  94. package/dist/module/esbuildConfigs/index.js +19 -0
  95. package/dist/module/esbuildConfigs/inputFilesPlugin.js +22 -0
  96. package/dist/module/esbuildConfigs/node.js +32 -0
  97. package/dist/module/esbuildConfigs/web.js +45 -0
  98. package/dist/module/init-docs.js +15 -0
  99. package/dist/module/lib/abstractBase.js +321 -0
  100. package/dist/module/lib/basebuilder.js +94 -0
  101. package/dist/module/lib/classBuilder.js +36 -0
  102. package/dist/module/lib/core.js +114 -0
  103. package/dist/module/lib/index.js +17 -0
  104. package/dist/module/lib/types.js +1 -0
  105. package/dist/module/package.json +3 -0
  106. package/dist/module/puppeteerConfiger.js +19 -0
  107. package/dist/module/run.js +24 -0
  108. package/dist/module/tsconfig.module.tsbuildinfo +1 -0
  109. package/dist/module/utils.js +29 -0
  110. package/dist/module/web.html.js +20 -0
  111. package/dist/prebuild/ReportClient.css +11367 -0
  112. package/dist/prebuild/ReportClient.js +24641 -0
  113. package/dist/prebuild/ReportServer.mjs +16 -0
  114. package/dist/prebuild/TestReport.css +11367 -0
  115. package/dist/prebuild/TestReport.js +27484 -0
  116. package/dist/prebuild/build.mjs +376 -0
  117. package/dist/prebuild/esbuildConfigs/eslint-formatter-testeranto.mjs +9 -0
  118. package/dist/prebuild/init-docs.mjs +104 -0
  119. package/dist/prebuild/run.mjs +1153 -0
  120. package/dist/tsconfig.tsbuildinfo +1 -0
  121. package/dist/types/Init.d.ts +2 -0
  122. package/dist/types/Node.d.ts +12 -0
  123. package/dist/types/PM/index.d.ts +34 -0
  124. package/dist/types/PM/main.d.ts +66 -0
  125. package/dist/types/PM/node.d.ts +40 -0
  126. package/dist/types/PM/web.d.ts +38 -0
  127. package/dist/types/ReportServer.d.ts +1 -0
  128. package/dist/types/SubPackages/react/component/node.d.ts +7 -0
  129. package/dist/types/SubPackages/react/component/web.d.ts +7 -0
  130. package/dist/types/SubPackages/react/jsx/index.d.ts +12 -0
  131. package/dist/types/SubPackages/react/jsx/node.d.ts +4 -0
  132. package/dist/types/SubPackages/react/jsx/web.d.ts +4 -0
  133. package/dist/types/SubPackages/react-dom/component/node.d.ts +11 -0
  134. package/dist/types/SubPackages/react-dom/component/web.d.ts +20 -0
  135. package/dist/types/SubPackages/react-dom/jsx/index.d.ts +6 -0
  136. package/dist/types/SubPackages/react-dom/jsx/node.d.ts +7 -0
  137. package/dist/types/SubPackages/react-dom/jsx/web.d.ts +5 -0
  138. package/dist/types/SubPackages/react-test-renderer/MemoExoticComponent/node.d.ts +6 -0
  139. package/dist/types/SubPackages/react-test-renderer/component/index.d.ts +13 -0
  140. package/dist/types/SubPackages/react-test-renderer/component/interface.d.ts +9 -0
  141. package/dist/types/SubPackages/react-test-renderer/component/node.d.ts +4 -0
  142. package/dist/types/SubPackages/react-test-renderer/component/web.d.ts +4 -0
  143. package/dist/types/SubPackages/react-test-renderer/fc/node.d.ts +8 -0
  144. package/dist/types/SubPackages/react-test-renderer/fc/web.d.ts +9 -0
  145. package/dist/types/SubPackages/react-test-renderer/jsx/index.d.ts +16 -0
  146. package/dist/types/SubPackages/react-test-renderer/jsx/node.d.ts +9 -0
  147. package/dist/types/SubPackages/react-test-renderer/jsx/web.d.ts +9 -0
  148. package/dist/types/SubPackages/react-test-renderer/jsx-promised/index.d.ts +15 -0
  149. package/dist/types/SubPackages/react-test-renderer/jsx-promised/node.d.ts +5 -0
  150. package/dist/types/SubPackages/react-test-renderer/jsx-promised/web.d.ts +5 -0
  151. package/dist/types/Types.d.ts +61 -0
  152. package/dist/types/Web.d.ts +9 -0
  153. package/dist/types/build.d.ts +1 -0
  154. package/dist/types/defaultConfig.d.ts +3 -0
  155. package/dist/types/esbuildConfigs/eslint-formatter-testeranto.d.ts +2 -0
  156. package/dist/types/esbuildConfigs/featuresPlugin.d.ts +5 -0
  157. package/dist/types/esbuildConfigs/index.d.ts +4 -0
  158. package/dist/types/esbuildConfigs/inputFilesPlugin.d.ts +6 -0
  159. package/dist/types/esbuildConfigs/node.d.ts +4 -0
  160. package/dist/types/esbuildConfigs/web.d.ts +4 -0
  161. package/dist/types/init-docs.d.ts +1 -0
  162. package/dist/types/lib/abstractBase.d.ts +110 -0
  163. package/dist/types/lib/basebuilder.d.ts +27 -0
  164. package/dist/types/lib/classBuilder.d.ts +7 -0
  165. package/dist/types/lib/core.d.ts +7 -0
  166. package/dist/types/lib/index.d.ts +83 -0
  167. package/dist/types/lib/types.d.ts +14 -0
  168. package/dist/types/puppeteerConfiger.d.ts +4 -0
  169. package/dist/types/run.d.ts +1 -0
  170. package/dist/types/tsconfig.types.tsbuildinfo +1 -0
  171. package/dist/types/utils.d.ts +15 -0
  172. package/dist/types/web.html.d.ts +2 -0
  173. package/package.json +1 -1
  174. package/src/PM/main.ts +25 -57
  175. package/src/ReportClient.tsx +43 -41
  176. package/src/run.ts +8 -5
  177. package/src/utils.ts +10 -0
  178. package/tsc.log +8 -8
@@ -0,0 +1,1153 @@
1
+ import { createRequire } from 'module';const require = createRequire(import.meta.url);
2
+
3
+ // src/run.ts
4
+ import ansiC2 from "ansi-colors";
5
+ import readline from "readline";
6
+
7
+ // src/PM/main.ts
8
+ import ts from "typescript";
9
+ import fs, { watch } from "fs";
10
+ import path2 from "path";
11
+ import puppeteer from "puppeteer-core";
12
+ import ansiC from "ansi-colors";
13
+ import crypto from "node:crypto";
14
+ import { ESLint } from "eslint";
15
+ import tsc from "tsc-prog";
16
+
17
+ // src/utils.ts
18
+ import path from "path";
19
+ var tscPather = (entryPoint, platform) => {
20
+ return path.join(
21
+ "./docs/",
22
+ platform,
23
+ entryPoint.split(".").slice(0, -1).join("."),
24
+ `type_errors.txt`
25
+ );
26
+ };
27
+ var lintPather = (entryPoint, platform) => {
28
+ return path.join(
29
+ "./docs/",
30
+ platform,
31
+ entryPoint.split(".").slice(0, -1).join("."),
32
+ `lint_errors.json`
33
+ );
34
+ };
35
+
36
+ // src/PM/index.ts
37
+ var PM = class {
38
+ };
39
+
40
+ // src/PM/main.ts
41
+ var eslint = new ESLint();
42
+ var formatter = await eslint.loadFormatter(
43
+ "./node_modules/testeranto/dist/prebuild/esbuildConfigs/eslint-formatter-testeranto.mjs"
44
+ );
45
+ var changes = {};
46
+ var fileHashes = {};
47
+ var fileStreams3 = [];
48
+ var fPaths = [];
49
+ var files = {};
50
+ var recorders = {};
51
+ var screenshots = {};
52
+ async function fileHash(filePath, algorithm = "md5") {
53
+ return new Promise((resolve, reject) => {
54
+ const hash = crypto.createHash(algorithm);
55
+ const fileStream = fs.createReadStream(filePath);
56
+ fileStream.on("data", (data) => {
57
+ hash.update(data);
58
+ });
59
+ fileStream.on("end", () => {
60
+ const fileHash2 = hash.digest("hex");
61
+ resolve(fileHash2);
62
+ });
63
+ fileStream.on("error", (error) => {
64
+ reject(`Error reading file: ${error.message}`);
65
+ });
66
+ });
67
+ }
68
+ var getRunnables = (tests, payload = {
69
+ nodeEntryPoints: {},
70
+ webEntryPoints: {}
71
+ }) => {
72
+ return tests.reduce((pt, cv, cndx, cry) => {
73
+ if (cv[1] === "node") {
74
+ pt.nodeEntryPoints[cv[0]] = path2.resolve(
75
+ `./docs/node/${cv[0].split(".").slice(0, -1).concat("mjs").join(".")}`
76
+ );
77
+ } else if (cv[1] === "web") {
78
+ pt.webEntryPoints[cv[0]] = path2.resolve(
79
+ `./docs/web/${cv[0].split(".").slice(0, -1).concat("mjs").join(".")}`
80
+ );
81
+ }
82
+ if (cv[3].length) {
83
+ getRunnables(cv[3], payload);
84
+ }
85
+ return pt;
86
+ }, payload);
87
+ };
88
+ var statusMessagePretty = (failures, test) => {
89
+ if (failures === 0) {
90
+ console.log(ansiC.green(ansiC.inverse(`> ${test} completed successfully`)));
91
+ } else {
92
+ console.log(ansiC.red(ansiC.inverse(`> ${test} failed ${failures} times`)));
93
+ }
94
+ };
95
+ async function writeFileAndCreateDir(filePath, data) {
96
+ const dirPath = path2.dirname(filePath);
97
+ try {
98
+ await fs.promises.mkdir(dirPath, { recursive: true });
99
+ await fs.appendFileSync(filePath, data);
100
+ } catch (error) {
101
+ console.error(`Error writing file: ${error}`);
102
+ }
103
+ }
104
+ var filesHash = async (files2, algorithm = "md5") => {
105
+ return new Promise((resolve, reject) => {
106
+ resolve(
107
+ files2.reduce(async (mm, f) => {
108
+ return await mm + await fileHash(f);
109
+ }, Promise.resolve(""))
110
+ );
111
+ });
112
+ };
113
+ function isValidUrl(string) {
114
+ try {
115
+ new URL(string);
116
+ return true;
117
+ } catch (err) {
118
+ return false;
119
+ }
120
+ }
121
+ var PM_Main = class extends PM {
122
+ constructor(configs) {
123
+ super();
124
+ this.shutdownMode = false;
125
+ this.bigBoard = {};
126
+ this.stop = () => {
127
+ console.log(ansiC.inverse("Testeranto-Run is shutting down gracefully..."));
128
+ this.mode = "PROD";
129
+ this.nodeMetafileWatcher.close();
130
+ this.webMetafileWatcher.close();
131
+ this.checkForShutdown();
132
+ };
133
+ this.tscCheck = async ({
134
+ entrypoint,
135
+ addableFiles,
136
+ platform
137
+ }) => {
138
+ console.log(ansiC.green(ansiC.inverse(`tsc < ${entrypoint}`)));
139
+ this.bigBoard[entrypoint].typeErrors = "?";
140
+ const program = tsc.createProgramFromConfig({
141
+ basePath: process.cwd(),
142
+ // always required, used for relative paths
143
+ configFilePath: "tsconfig.json",
144
+ // config to inherit from (optional)
145
+ compilerOptions: {
146
+ rootDir: "src",
147
+ outDir: tscPather(entrypoint, platform),
148
+ // declaration: true,
149
+ // skipLibCheck: true,
150
+ noEmit: true
151
+ },
152
+ include: addableFiles
153
+ //["src/**/*"],
154
+ // exclude: ["**/*.test.ts", "**/*.spec.ts"],
155
+ });
156
+ const tscPath = tscPather(entrypoint, platform);
157
+ let allDiagnostics = program.getSemanticDiagnostics();
158
+ const d = [];
159
+ allDiagnostics.forEach((diagnostic) => {
160
+ if (diagnostic.file) {
161
+ let { line, character } = ts.getLineAndCharacterOfPosition(
162
+ diagnostic.file,
163
+ diagnostic.start
164
+ );
165
+ let message = ts.flattenDiagnosticMessageText(
166
+ diagnostic.messageText,
167
+ "\n"
168
+ );
169
+ d.push(
170
+ `${diagnostic.file.fileName} (${line + 1},${character + 1}): ${message}`
171
+ );
172
+ } else {
173
+ d.push(ts.flattenDiagnosticMessageText(diagnostic.messageText, "\n"));
174
+ }
175
+ });
176
+ fs.writeFileSync(tscPath, d.join("\n"));
177
+ this.bigBoard[entrypoint].typeErrors = d.length;
178
+ if (this.shutdownMode) {
179
+ this.checkForShutdown();
180
+ }
181
+ };
182
+ this.eslintCheck = async (entrypoint, platform, addableFiles) => {
183
+ this.bigBoard[entrypoint].staticErrors = "?";
184
+ console.log(ansiC.green(ansiC.inverse(`eslint < ${entrypoint}`)));
185
+ const results = (await eslint.lintFiles(addableFiles)).filter((r) => r.messages.length).filter((r) => {
186
+ return r.messages[0].ruleId !== null;
187
+ }).map((r) => {
188
+ delete r.source;
189
+ return r;
190
+ });
191
+ fs.writeFileSync(
192
+ lintPather(entrypoint, platform),
193
+ await formatter.format(results)
194
+ );
195
+ this.bigBoard[entrypoint].staticErrors = results.length;
196
+ if (this.shutdownMode) {
197
+ this.checkForShutdown();
198
+ }
199
+ };
200
+ this.makePrompt = async (entryPoint, addableFiles, platform) => {
201
+ this.bigBoard[entryPoint].prompt = "?";
202
+ const promptPath = path2.join(
203
+ "./docs/",
204
+ platform,
205
+ entryPoint.split(".").slice(0, -1).join("."),
206
+ `prompt.txt`
207
+ );
208
+ const testPaths = path2.join(
209
+ "./docs/",
210
+ platform,
211
+ entryPoint.split(".").slice(0, -1).join("."),
212
+ `tests.json`
213
+ );
214
+ const featuresPath = path2.join(
215
+ "./docs/",
216
+ platform,
217
+ entryPoint.split(".").slice(0, -1).join("."),
218
+ `featurePrompt.txt`
219
+ );
220
+ fs.writeFileSync(
221
+ promptPath,
222
+ `
223
+ ${addableFiles.map((x) => {
224
+ return `/add ${x}`;
225
+ }).join("\n")}
226
+
227
+ /read ${lintPather(entryPoint, platform)}
228
+ /read ${tscPather(entryPoint, platform)}
229
+ /read ${testPaths}
230
+
231
+ /load ${featuresPath}
232
+
233
+ /code Fix the failing tests described in ${testPaths}. Correct any type signature errors described in the files ${tscPather(
234
+ entryPoint,
235
+ platform
236
+ )}. Implement any method which throws "Function not implemented. Resolve the lint errors described in ${lintPather(
237
+ entryPoint,
238
+ platform
239
+ )}"
240
+ `
241
+ );
242
+ this.bigBoard[entryPoint].prompt = `aider --model deepseek/deepseek-chat --load docs/${platform}/${entryPoint.split(".").slice(0, -1).join(".")}/prompt.txt`;
243
+ if (this.shutdownMode) {
244
+ this.checkForShutdown();
245
+ }
246
+ };
247
+ this.checkForShutdown = () => {
248
+ const anyRunning = Object.values(this.bigBoard).filter((x) => x.prompt === "?").length + Object.values(this.bigBoard).filter((x) => x.runTimeError === "?").length + Object.values(this.bigBoard).filter((x) => x.staticErrors === "?").length + Object.values(this.bigBoard).filter((x) => x.typeErrors === "?").length > 0;
249
+ if (anyRunning) {
250
+ console.log(ansiC.inverse("Shutting down. Please wait"));
251
+ } else {
252
+ this.browser.disconnect().then(() => {
253
+ fs.writeFileSync(
254
+ "docs/summary.json",
255
+ JSON.stringify(this.bigBoard, null, 2)
256
+ );
257
+ console.log(ansiC.inverse("Goodbye"));
258
+ process.exit();
259
+ });
260
+ }
261
+ };
262
+ this.testIsNowRunning = (src) => {
263
+ this.bigBoard[src].status = "running";
264
+ };
265
+ this.testIsNowDone = (src) => {
266
+ this.bigBoard[src].status = "waiting";
267
+ if (this.shutdownMode) {
268
+ this.checkForShutdown();
269
+ }
270
+ };
271
+ this.launchNode = async (src, dest) => {
272
+ console.log(ansiC.green(ansiC.inverse(`! node, ${src}`)));
273
+ this.testIsNowRunning(src);
274
+ const destFolder = dest.replace(".mjs", "");
275
+ let argz = "";
276
+ const testConfig = this.configs.tests.find((t) => {
277
+ return t[0] === src;
278
+ });
279
+ if (!testConfig) {
280
+ console.log(ansiC.inverse("missing test config! Exiting ungracefully!"));
281
+ process.exit(-1);
282
+ }
283
+ const testConfigResource = testConfig[2];
284
+ let portsToUse = [];
285
+ if (testConfigResource.ports === 0) {
286
+ argz = JSON.stringify({
287
+ scheduled: true,
288
+ name: src,
289
+ ports: portsToUse,
290
+ fs: destFolder,
291
+ browserWSEndpoint: this.browser.wsEndpoint()
292
+ });
293
+ } else if (testConfigResource.ports > 0) {
294
+ const openPorts = Object.entries(this.ports).filter(
295
+ ([portnumber, portopen]) => portopen
296
+ );
297
+ if (openPorts.length >= testConfigResource.ports) {
298
+ for (let i = 0; i < testConfigResource.ports; i++) {
299
+ portsToUse.push(openPorts[i][0]);
300
+ this.ports[openPorts[i][0]] = false;
301
+ }
302
+ argz = JSON.stringify({
303
+ scheduled: true,
304
+ name: src,
305
+ // ports: [3333],
306
+ ports: portsToUse,
307
+ fs: destFolder,
308
+ browserWSEndpoint: this.browser.wsEndpoint()
309
+ });
310
+ } else {
311
+ this.queue.push(src);
312
+ return;
313
+ }
314
+ } else {
315
+ console.error("negative port makes no sense", src);
316
+ process.exit(-1);
317
+ }
318
+ const builtfile = dest;
319
+ const webSideCares = [];
320
+ this.server[builtfile] = await import(`${builtfile}?cacheBust=${Date.now()}`).then((module) => {
321
+ return module.default.then((defaultModule) => {
322
+ defaultModule.receiveTestResourceConfig(argz).then(async ({ features, failed }) => {
323
+ this.receiveFeatures(features, destFolder, src);
324
+ statusMessagePretty(failed, src);
325
+ this.receiveExitCode(src, failed);
326
+ }).catch((e) => {
327
+ console.log(ansiC.red(ansiC.inverse(`${src} errored with: ${e}`)));
328
+ }).finally(() => {
329
+ webSideCares.forEach((webSideCar) => webSideCar.close());
330
+ this.testIsNowDone(src);
331
+ });
332
+ });
333
+ });
334
+ for (let i = 0; i <= portsToUse.length; i++) {
335
+ if (portsToUse[i]) {
336
+ this.ports[portsToUse[i]] = "true";
337
+ }
338
+ }
339
+ };
340
+ this.launchWebSideCar = async (src, dest, testConfig) => {
341
+ const d = dest + ".mjs";
342
+ console.log(ansiC.green(ansiC.inverse(`launchWebSideCar ${src}`)));
343
+ const fileStreams2 = [];
344
+ const doneFileStream2 = [];
345
+ return new Promise((res, rej) => {
346
+ this.browser.newPage().then((page) => {
347
+ page.exposeFunction(
348
+ "custom-screenshot",
349
+ async (ssOpts, testName) => {
350
+ const p = ssOpts.path;
351
+ const dir = path2.dirname(p);
352
+ fs.mkdirSync(dir, {
353
+ recursive: true
354
+ });
355
+ files[testName].add(ssOpts.path);
356
+ const sPromise = page.screenshot({
357
+ ...ssOpts,
358
+ path: p
359
+ });
360
+ if (!screenshots[testName]) {
361
+ screenshots[testName] = [];
362
+ }
363
+ screenshots[testName].push(sPromise);
364
+ await sPromise;
365
+ return sPromise;
366
+ }
367
+ );
368
+ page.exposeFunction(
369
+ "writeFileSync",
370
+ (fp, contents, testName) => {
371
+ const dir = path2.dirname(fp);
372
+ fs.mkdirSync(dir, {
373
+ recursive: true
374
+ });
375
+ const p = new Promise(async (res2, rej2) => {
376
+ fs.writeFileSync(fp, contents);
377
+ res2(fp);
378
+ });
379
+ doneFileStream2.push(p);
380
+ if (!files[testName]) {
381
+ files[testName] = /* @__PURE__ */ new Set();
382
+ }
383
+ files[testName].add(fp);
384
+ return p;
385
+ }
386
+ );
387
+ page.exposeFunction("existsSync", (fp, contents) => {
388
+ return fs.existsSync(fp);
389
+ });
390
+ page.exposeFunction("mkdirSync", (fp) => {
391
+ if (!fs.existsSync(fp)) {
392
+ return fs.mkdirSync(fp, {
393
+ recursive: true
394
+ });
395
+ }
396
+ return false;
397
+ });
398
+ page.exposeFunction(
399
+ "createWriteStream",
400
+ (fp, testName) => {
401
+ const f = fs.createWriteStream(fp);
402
+ files[testName].add(fp);
403
+ const p = new Promise((res2, rej2) => {
404
+ res2(fp);
405
+ });
406
+ doneFileStream2.push(p);
407
+ f.on("close", async () => {
408
+ await p;
409
+ });
410
+ fileStreams2.push(f);
411
+ return {
412
+ ...JSON.parse(JSON.stringify(f)),
413
+ uid: fileStreams2.length - 1
414
+ };
415
+ }
416
+ );
417
+ page.exposeFunction(
418
+ "write",
419
+ async (uid, contents) => {
420
+ return fileStreams2[uid].write(contents);
421
+ }
422
+ );
423
+ page.exposeFunction("end", async (uid) => {
424
+ return fileStreams2[uid].end();
425
+ });
426
+ return page;
427
+ }).then(async (page) => {
428
+ await page.goto(`file://${`${dest}.html`}`, {});
429
+ res(page);
430
+ });
431
+ });
432
+ };
433
+ this.launchNodeSideCar = async (src, dest, testConfig) => {
434
+ const d = dest + ".mjs";
435
+ console.log(ansiC.green(ansiC.inverse(`launchNodeSideCar ${src}`)));
436
+ const destFolder = dest.replace(".mjs", "");
437
+ let argz = "";
438
+ const testConfigResource = testConfig[2];
439
+ let portsToUse = [];
440
+ if (testConfigResource.ports === 0) {
441
+ argz = JSON.stringify({
442
+ scheduled: true,
443
+ name: src,
444
+ ports: portsToUse,
445
+ fs: destFolder,
446
+ browserWSEndpoint: this.browser.wsEndpoint()
447
+ });
448
+ } else if (testConfigResource.ports > 0) {
449
+ const openPorts = Object.entries(this.ports).filter(
450
+ ([portnumber, portopen]) => portopen
451
+ );
452
+ if (openPorts.length >= testConfigResource.ports) {
453
+ for (let i = 0; i < testConfigResource.ports; i++) {
454
+ portsToUse.push(openPorts[i][0]);
455
+ this.ports[openPorts[i][0]] = false;
456
+ }
457
+ argz = JSON.stringify({
458
+ scheduled: true,
459
+ name: src,
460
+ // ports: [3333],
461
+ ports: portsToUse,
462
+ fs: ".",
463
+ browserWSEndpoint: this.browser.wsEndpoint()
464
+ });
465
+ } else {
466
+ this.queue.push(src);
467
+ return;
468
+ }
469
+ } else {
470
+ console.error("negative port makes no sense", src);
471
+ process.exit(-1);
472
+ }
473
+ const builtfile = dest + ".mjs";
474
+ this.server[builtfile] = await import(`${builtfile}?cacheBust=${Date.now()}`).then((module) => {
475
+ return module.default.then((defaultModule) => {
476
+ const s = new defaultModule();
477
+ s.receiveTestResourceConfig(argz);
478
+ });
479
+ });
480
+ for (let i = 0; i <= portsToUse.length; i++) {
481
+ if (portsToUse[i]) {
482
+ this.ports[portsToUse[i]] = "true";
483
+ }
484
+ }
485
+ };
486
+ this.launchWeb = (t, dest) => {
487
+ console.log(ansiC.green(ansiC.inverse(`! web ${t}`)));
488
+ this.testIsNowRunning(t);
489
+ const destFolder = dest.replace(".mjs", "");
490
+ const webArgz = JSON.stringify({
491
+ name: dest,
492
+ ports: [].toString(),
493
+ fs: destFolder,
494
+ browserWSEndpoint: this.browser.wsEndpoint()
495
+ });
496
+ const d = `${dest}?cacheBust=${Date.now()}`;
497
+ const evaluation = `
498
+
499
+ import('${d}').then(async (x) => {
500
+
501
+ try {
502
+ return await (await x.default).receiveTestResourceConfig(${webArgz})
503
+ } catch (e) {
504
+ console.log("fail", e)
505
+ }
506
+ })`;
507
+ const fileStreams2 = [];
508
+ const doneFileStream2 = [];
509
+ const stdoutStream = fs.createWriteStream(`${destFolder}/stdout.log`);
510
+ const stderrStream = fs.createWriteStream(`${destFolder}/stderr.log`);
511
+ this.browser.newPage().then((page) => {
512
+ page.exposeFunction(
513
+ "screencast",
514
+ async (ssOpts, testName) => {
515
+ const p = ssOpts.path;
516
+ const dir = path2.dirname(p);
517
+ fs.mkdirSync(dir, {
518
+ recursive: true
519
+ });
520
+ if (!files[testName]) {
521
+ files[testName] = /* @__PURE__ */ new Set();
522
+ }
523
+ files[testName].add(ssOpts.path);
524
+ const sPromise = page.screenshot({
525
+ ...ssOpts,
526
+ path: p
527
+ });
528
+ if (!screenshots[testName]) {
529
+ screenshots[testName] = [];
530
+ }
531
+ screenshots[testName].push(sPromise);
532
+ await sPromise;
533
+ return sPromise;
534
+ }
535
+ );
536
+ page.exposeFunction(
537
+ "customScreenShot",
538
+ async (ssOpts, testName) => {
539
+ const p = ssOpts.path;
540
+ const dir = path2.dirname(p);
541
+ fs.mkdirSync(dir, {
542
+ recursive: true
543
+ });
544
+ if (!files[testName]) {
545
+ files[testName] = /* @__PURE__ */ new Set();
546
+ }
547
+ files[testName].add(ssOpts.path);
548
+ const sPromise = page.screenshot({
549
+ ...ssOpts,
550
+ path: p
551
+ });
552
+ if (!screenshots[testName]) {
553
+ screenshots[testName] = [];
554
+ }
555
+ screenshots[testName].push(sPromise);
556
+ await sPromise;
557
+ return sPromise;
558
+ }
559
+ );
560
+ page.exposeFunction(
561
+ "writeFileSync",
562
+ (fp, contents, testName) => {
563
+ return globalThis["writeFileSync"](fp, contents, testName);
564
+ }
565
+ );
566
+ page.exposeFunction("existsSync", (fp, contents) => {
567
+ return fs.existsSync(fp);
568
+ });
569
+ page.exposeFunction("mkdirSync", (fp) => {
570
+ if (!fs.existsSync(fp)) {
571
+ return fs.mkdirSync(fp, {
572
+ recursive: true
573
+ });
574
+ }
575
+ return false;
576
+ });
577
+ page.exposeFunction(
578
+ "createWriteStream",
579
+ (fp, testName) => {
580
+ const f = fs.createWriteStream(fp);
581
+ if (!files[testName]) {
582
+ files[testName] = /* @__PURE__ */ new Set();
583
+ }
584
+ files[testName].add(fp);
585
+ const p = new Promise((res, rej) => {
586
+ res(fp);
587
+ });
588
+ doneFileStream2.push(p);
589
+ f.on("close", async () => {
590
+ await p;
591
+ });
592
+ fileStreams2.push(f);
593
+ return {
594
+ ...JSON.parse(JSON.stringify(f)),
595
+ uid: fileStreams2.length - 1
596
+ };
597
+ }
598
+ );
599
+ page.exposeFunction("write", async (uid, contents) => {
600
+ return fileStreams2[uid].write(contents);
601
+ });
602
+ page.exposeFunction("end", async (uid) => {
603
+ return fileStreams2[uid].end();
604
+ });
605
+ page.exposeFunction("page", () => {
606
+ return page.mainFrame()._id;
607
+ });
608
+ page.exposeFunction("click", (sel) => {
609
+ return page.click(sel);
610
+ });
611
+ page.exposeFunction("focusOn", (sel) => {
612
+ return page.focus(sel);
613
+ });
614
+ page.exposeFunction(
615
+ "typeInto",
616
+ async (value) => await page.keyboard.type(value)
617
+ );
618
+ page.exposeFunction(
619
+ "getValue",
620
+ (selector) => page.$eval(selector, (input) => input.getAttribute("value"))
621
+ );
622
+ page.exposeFunction(
623
+ "getAttribute",
624
+ async (selector, attribute) => {
625
+ const attributeValue = await page.$eval(selector, (input) => {
626
+ return input.getAttribute(attribute);
627
+ });
628
+ return attributeValue;
629
+ }
630
+ );
631
+ page.exposeFunction("isDisabled", async (selector) => {
632
+ const attributeValue = await page.$eval(
633
+ selector,
634
+ (input) => {
635
+ return input.disabled;
636
+ }
637
+ );
638
+ return attributeValue;
639
+ });
640
+ page.exposeFunction("$", async (selector) => {
641
+ const x = page.$(selector);
642
+ const y = await x;
643
+ return y;
644
+ });
645
+ return page;
646
+ }).then(async (page) => {
647
+ const close = () => {
648
+ if (!files[t]) {
649
+ files[t] = /* @__PURE__ */ new Set();
650
+ }
651
+ fs.writeFileSync(
652
+ destFolder + "/manifest.json",
653
+ JSON.stringify(Array.from(files[t]))
654
+ );
655
+ delete files[t];
656
+ Promise.all(screenshots[t] || []).then(() => {
657
+ delete screenshots[t];
658
+ page.close();
659
+ this.testIsNowDone(t);
660
+ stderrStream.close();
661
+ stdoutStream.close();
662
+ });
663
+ };
664
+ page.on("pageerror", (err) => {
665
+ console.debug(`Error from ${t}: [${err.name}] `);
666
+ stderrStream.write(err.name);
667
+ if (err.cause) {
668
+ console.debug(`Error from ${t} cause: [${err.cause}] `);
669
+ stderrStream.write(err.cause);
670
+ }
671
+ if (err.stack) {
672
+ console.debug(`Error from stack ${t}: [${err.stack}] `);
673
+ stderrStream.write(err.stack);
674
+ }
675
+ console.debug(`Error from message ${t}: [${err.message}] `);
676
+ stderrStream.write(err.message);
677
+ close();
678
+ });
679
+ page.on("console", (log) => {
680
+ stdoutStream.write(log.text());
681
+ stdoutStream.write(JSON.stringify(log.location()));
682
+ stdoutStream.write(JSON.stringify(log.stackTrace()));
683
+ });
684
+ await page.goto(`file://${`${destFolder}.html`}`, {});
685
+ await page.evaluate(evaluation).then(async ({ failed, features }) => {
686
+ this.receiveFeatures(features, destFolder, t);
687
+ statusMessagePretty(failed, t);
688
+ this.receiveExitCode(t, failed);
689
+ }).catch((e) => {
690
+ console.log(ansiC.red(ansiC.inverse(`${t} errored with: ${e}`)));
691
+ }).finally(() => {
692
+ close();
693
+ });
694
+ return page;
695
+ });
696
+ };
697
+ this.receiveFeatures = (features, destFolder, srcTest) => {
698
+ const featureDestination = path2.resolve(
699
+ process.cwd(),
700
+ "docs",
701
+ "features",
702
+ "strings",
703
+ srcTest.split(".").slice(0, -1).join(".") + ".features.txt"
704
+ );
705
+ features.reduce(async (mm, featureStringKey) => {
706
+ const accum = await mm;
707
+ const isUrl = isValidUrl(featureStringKey);
708
+ if (isUrl) {
709
+ const u = new URL(featureStringKey);
710
+ if (u.protocol === "file:") {
711
+ const newPath = `${process.cwd()}/docs/features/internal/${path2.relative(
712
+ process.cwd(),
713
+ u.pathname
714
+ )}`;
715
+ await fs.promises.mkdir(path2.dirname(newPath), { recursive: true });
716
+ try {
717
+ await fs.unlinkSync(newPath);
718
+ } catch (error) {
719
+ if (error.code !== "ENOENT") {
720
+ }
721
+ }
722
+ accum.files.push(newPath);
723
+ } else if (u.protocol === "http:" || u.protocol === "https:") {
724
+ const newPath = `${process.cwd()}/docs/features/external${u.hostname}${u.pathname}`;
725
+ const body = await this.configs.featureIngestor(featureStringKey);
726
+ writeFileAndCreateDir(newPath, body);
727
+ accum.files.push(newPath);
728
+ }
729
+ } else {
730
+ await fs.promises.mkdir(path2.dirname(featureDestination), {
731
+ recursive: true
732
+ });
733
+ accum.strings.push(featureStringKey);
734
+ }
735
+ return accum;
736
+ }, Promise.resolve({ files: [], strings: [] })).then(({ files: files2, strings }) => {
737
+ fs.writeFileSync(
738
+ `${destFolder}/featurePrompt.txt`,
739
+ files2.map((f) => {
740
+ return `/read ${f}`;
741
+ }).join("\n")
742
+ );
743
+ });
744
+ };
745
+ this.receiveExitCode = (srcTest, failures) => {
746
+ this.bigBoard[srcTest].runTimeError = failures;
747
+ this.writeBigBoard();
748
+ };
749
+ this.writeBigBoard = () => {
750
+ fs.writeFileSync(
751
+ "./docs/summary.json",
752
+ JSON.stringify(this.bigBoard, null, 2)
753
+ );
754
+ };
755
+ this.mode = configs.devMode ? "DEV" : "PROD";
756
+ this.server = {};
757
+ this.configs = configs;
758
+ this.ports = {};
759
+ this.configs.tests.forEach(([t]) => {
760
+ this.bigBoard[t] = {
761
+ runTimeError: "?",
762
+ typeErrors: "?",
763
+ staticErrors: "?",
764
+ prompt: "?"
765
+ };
766
+ });
767
+ this.configs.ports.forEach((element) => {
768
+ this.ports[element] = "true";
769
+ });
770
+ globalThis["waitForSelector"] = async (pageKey, sel) => {
771
+ const page = (await this.browser.pages()).find(
772
+ /* @ts-ignore:next-line */
773
+ (p) => p.mainFrame()._id === pageKey
774
+ );
775
+ await page?.waitForSelector(sel);
776
+ };
777
+ globalThis["screencastStop"] = async (path3) => {
778
+ return recorders[path3].stop();
779
+ };
780
+ globalThis["closePage"] = async (pageKey) => {
781
+ const page = (await this.browser.pages()).find(
782
+ /* @ts-ignore:next-line */
783
+ (p) => p.mainFrame()._id === pageKey
784
+ );
785
+ return page.close();
786
+ };
787
+ globalThis["goto"] = async (pageKey, url) => {
788
+ const page = (await this.browser.pages()).find(
789
+ /* @ts-ignore:next-line */
790
+ (p) => p.mainFrame()._id === pageKey
791
+ );
792
+ await page?.goto(url);
793
+ return;
794
+ };
795
+ globalThis["newPage"] = () => {
796
+ return this.browser.newPage();
797
+ };
798
+ globalThis["pages"] = () => {
799
+ return this.browser.pages();
800
+ };
801
+ globalThis["mkdirSync"] = (fp) => {
802
+ if (!fs.existsSync(fp)) {
803
+ return fs.mkdirSync(fp, {
804
+ recursive: true
805
+ });
806
+ }
807
+ return false;
808
+ };
809
+ globalThis["writeFileSync"] = (filepath, contents, testName) => {
810
+ fs.mkdirSync(path2.dirname(filepath), {
811
+ recursive: true
812
+ });
813
+ if (!files[testName]) {
814
+ files[testName] = /* @__PURE__ */ new Set();
815
+ }
816
+ files[testName].add(filepath);
817
+ return fs.writeFileSync(filepath, contents);
818
+ };
819
+ globalThis["createWriteStream"] = (filepath, testName) => {
820
+ const f = fs.createWriteStream(filepath);
821
+ fileStreams3.push(f);
822
+ if (!files[testName]) {
823
+ files[testName] = /* @__PURE__ */ new Set();
824
+ }
825
+ files[testName].add(filepath);
826
+ return {
827
+ ...JSON.parse(JSON.stringify(f)),
828
+ uid: fileStreams3.length - 1
829
+ };
830
+ };
831
+ globalThis["write"] = (uid, contents) => {
832
+ fileStreams3[uid].write(contents);
833
+ };
834
+ globalThis["end"] = (uid) => {
835
+ fileStreams3[uid].end();
836
+ };
837
+ globalThis["customScreenShot"] = async (opts, pageKey, testName) => {
838
+ const page = (await this.browser.pages()).find(
839
+ /* @ts-ignore:next-line */
840
+ (p2) => p2.mainFrame()._id === pageKey
841
+ );
842
+ const p = opts.path;
843
+ const dir = path2.dirname(p);
844
+ fs.mkdirSync(dir, {
845
+ recursive: true
846
+ });
847
+ if (!files[opts.path]) {
848
+ files[opts.path] = /* @__PURE__ */ new Set();
849
+ }
850
+ files[opts.path].add(opts.path);
851
+ const sPromise = page.screenshot({
852
+ ...opts,
853
+ path: p
854
+ });
855
+ if (!screenshots[opts.path]) {
856
+ screenshots[opts.path] = [];
857
+ }
858
+ screenshots[opts.path].push(sPromise);
859
+ await sPromise;
860
+ return sPromise;
861
+ };
862
+ globalThis["screencast"] = async (opts, pageKey) => {
863
+ const page = (await this.browser.pages()).find(
864
+ /* @ts-ignore:next-line */
865
+ (p2) => p2.mainFrame()._id === pageKey
866
+ );
867
+ const p = opts.path;
868
+ const dir = path2.dirname(p);
869
+ fs.mkdirSync(dir, {
870
+ recursive: true
871
+ });
872
+ const recorder = await page?.screencast({
873
+ ...opts,
874
+ path: p
875
+ });
876
+ recorders[opts.path] = recorder;
877
+ return opts.path;
878
+ };
879
+ }
880
+ customclose() {
881
+ throw new Error("Method not implemented.");
882
+ }
883
+ waitForSelector(p, s) {
884
+ throw new Error("Method not implemented.");
885
+ }
886
+ closePage(p) {
887
+ throw new Error("Method not implemented.");
888
+ }
889
+ newPage() {
890
+ throw new Error("Method not implemented.");
891
+ }
892
+ goto(p, url) {
893
+ throw new Error("Method not implemented.");
894
+ }
895
+ $(selector) {
896
+ throw new Error("Method not implemented.");
897
+ }
898
+ screencast(opts) {
899
+ throw new Error("Method not implemented.");
900
+ }
901
+ customScreenShot(opts, cdpPage) {
902
+ throw new Error("Method not implemented.");
903
+ }
904
+ end(accessObject) {
905
+ throw new Error("Method not implemented.");
906
+ }
907
+ existsSync(destFolder) {
908
+ return fs.existsSync(destFolder);
909
+ }
910
+ async mkdirSync(fp) {
911
+ if (!fs.existsSync(fp)) {
912
+ return fs.mkdirSync(fp, {
913
+ recursive: true
914
+ });
915
+ }
916
+ return false;
917
+ }
918
+ writeFileSync(fp, contents) {
919
+ fs.writeFileSync(fp, contents);
920
+ }
921
+ createWriteStream(filepath) {
922
+ return fs.createWriteStream(filepath);
923
+ }
924
+ testArtiFactoryfileWriter(tLog, callback) {
925
+ return (fPath, value) => {
926
+ callback(
927
+ new Promise((res, rej) => {
928
+ tLog("testArtiFactory =>", fPath);
929
+ const cleanPath = path2.resolve(fPath);
930
+ fPaths.push(cleanPath.replace(process.cwd(), ``));
931
+ const targetDir = cleanPath.split("/").slice(0, -1).join("/");
932
+ fs.mkdir(targetDir, { recursive: true }, async (error) => {
933
+ if (error) {
934
+ console.error(`\u2757\uFE0FtestArtiFactory failed`, targetDir, error);
935
+ }
936
+ fs.writeFileSync(
937
+ path2.resolve(
938
+ targetDir.split("/").slice(0, -1).join("/"),
939
+ "manifest"
940
+ ),
941
+ fPaths.join(`
942
+ `),
943
+ {
944
+ encoding: "utf-8"
945
+ }
946
+ );
947
+ if (Buffer.isBuffer(value)) {
948
+ fs.writeFileSync(fPath, value, "binary");
949
+ res();
950
+ } else if (`string` === typeof value) {
951
+ fs.writeFileSync(fPath, value.toString(), {
952
+ encoding: "utf-8"
953
+ });
954
+ res();
955
+ } else {
956
+ const pipeStream = value;
957
+ const myFile = fs.createWriteStream(fPath);
958
+ pipeStream.pipe(myFile);
959
+ pipeStream.on("close", () => {
960
+ myFile.close();
961
+ res();
962
+ });
963
+ }
964
+ });
965
+ })
966
+ );
967
+ };
968
+ }
969
+ write(accessObject, contents) {
970
+ throw new Error("Method not implemented.");
971
+ }
972
+ page() {
973
+ throw new Error("Method not implemented.");
974
+ }
975
+ click(selector) {
976
+ throw new Error("Method not implemented.");
977
+ }
978
+ focusOn(selector) {
979
+ throw new Error("Method not implemented.");
980
+ }
981
+ typeInto(value) {
982
+ throw new Error("Method not implemented.");
983
+ }
984
+ getValue(value) {
985
+ throw new Error("Method not implemented.");
986
+ }
987
+ getAttribute(selector, attribute) {
988
+ throw new Error("Method not implemented.");
989
+ }
990
+ isDisabled(selector) {
991
+ throw new Error("Method not implemented.");
992
+ }
993
+ screencastStop(s) {
994
+ throw new Error("Method not implemented.");
995
+ }
996
+ ////////////////////////////////////////////////////////////////////////////////
997
+ async metafileOutputs(platform) {
998
+ const metafile = JSON.parse(
999
+ fs.readFileSync(`docs/${platform}/metafile.json`).toString()
1000
+ ).metafile;
1001
+ if (!metafile)
1002
+ return;
1003
+ const outputs = metafile.outputs;
1004
+ Object.keys(outputs).forEach(async (k) => {
1005
+ const addableFiles = Object.keys(outputs[k].inputs).filter((i) => {
1006
+ if (!fs.existsSync(i))
1007
+ return false;
1008
+ if (i.startsWith("node_modules"))
1009
+ return false;
1010
+ return true;
1011
+ });
1012
+ const f = `${k.split(".").slice(0, -1).join(".")}/`;
1013
+ if (!fs.existsSync(f)) {
1014
+ fs.mkdirSync(f);
1015
+ }
1016
+ const entrypoint = outputs[k].entryPoint;
1017
+ if (entrypoint) {
1018
+ const changeDigest = await filesHash(addableFiles);
1019
+ if (changeDigest === changes[entrypoint]) {
1020
+ } else {
1021
+ changes[entrypoint] = changeDigest;
1022
+ this.tscCheck({
1023
+ platform,
1024
+ addableFiles,
1025
+ entrypoint: "./" + entrypoint
1026
+ });
1027
+ this.eslintCheck("./" + entrypoint, platform, addableFiles);
1028
+ this.makePrompt("./" + entrypoint, addableFiles, platform);
1029
+ }
1030
+ }
1031
+ });
1032
+ }
1033
+ async start() {
1034
+ this.browser = await puppeteer.launch({
1035
+ slowMo: 1,
1036
+ // timeout: 1,
1037
+ waitForInitialPage: false,
1038
+ executablePath: (
1039
+ // process.env.CHROMIUM_PATH || "/opt/homebrew/bin/chromium",
1040
+ "/opt/homebrew/bin/chromium"
1041
+ ),
1042
+ headless: true,
1043
+ dumpio: true,
1044
+ // timeout: 0,
1045
+ devtools: true,
1046
+ args: [
1047
+ "--auto-open-devtools-for-tabs",
1048
+ `--remote-debugging-port=3234`,
1049
+ // "--disable-features=IsolateOrigins,site-per-process",
1050
+ "--disable-site-isolation-trials",
1051
+ "--allow-insecure-localhost",
1052
+ "--allow-file-access-from-files",
1053
+ "--allow-running-insecure-content",
1054
+ "--disable-dev-shm-usage",
1055
+ "--disable-extensions",
1056
+ "--disable-gpu",
1057
+ "--disable-setuid-sandbox",
1058
+ "--disable-site-isolation-trials",
1059
+ "--disable-web-security",
1060
+ "--no-first-run",
1061
+ "--no-sandbox",
1062
+ "--no-startup-window",
1063
+ // "--no-zygote",
1064
+ "--reduce-security-for-testing",
1065
+ "--remote-allow-origins=*",
1066
+ "--unsafely-treat-insecure-origin-as-secure=*"
1067
+ // "--disable-features=IsolateOrigins",
1068
+ // "--remote-allow-origins=ws://localhost:3234",
1069
+ // "--single-process",
1070
+ // "--unsafely-treat-insecure-origin-as-secure",
1071
+ // "--unsafely-treat-insecure-origin-as-secure=ws://192.168.0.101:3234",
1072
+ // "--disk-cache-dir=/dev/null",
1073
+ // "--disk-cache-size=1",
1074
+ // "--start-maximized",
1075
+ ]
1076
+ });
1077
+ const { nodeEntryPoints, webEntryPoints } = getRunnables(
1078
+ this.configs.tests
1079
+ );
1080
+ Object.entries(nodeEntryPoints).forEach(
1081
+ ([k, outputFile]) => {
1082
+ this.launchNode(k, outputFile);
1083
+ try {
1084
+ watch(outputFile, async (e, filename) => {
1085
+ const hash = await fileHash(outputFile);
1086
+ if (fileHashes[k] !== hash) {
1087
+ fileHashes[k] = hash;
1088
+ console.log(ansiC.green(ansiC.inverse(`< ${e} ${filename}`)));
1089
+ this.launchNode(k, outputFile);
1090
+ }
1091
+ });
1092
+ } catch (e) {
1093
+ console.error(e);
1094
+ }
1095
+ }
1096
+ );
1097
+ Object.entries(webEntryPoints).forEach(
1098
+ ([k, outputFile]) => {
1099
+ this.launchWeb(k, outputFile);
1100
+ watch(outputFile, async (e, filename) => {
1101
+ const hash = await fileHash(outputFile);
1102
+ if (fileHashes[k] !== hash) {
1103
+ fileHashes[k] = hash;
1104
+ console.log(ansiC.green(ansiC.inverse(`< ${e} ${filename}`)));
1105
+ this.launchWeb(k, outputFile);
1106
+ }
1107
+ });
1108
+ }
1109
+ );
1110
+ this.metafileOutputs("node");
1111
+ this.nodeMetafileWatcher = watch(
1112
+ "docs/node/metafile.json",
1113
+ async (e, filename) => {
1114
+ console.log(ansiC.green(ansiC.inverse(`< ${e} ${filename} (node)`)));
1115
+ this.metafileOutputs("node");
1116
+ }
1117
+ );
1118
+ this.metafileOutputs("web");
1119
+ this.webMetafileWatcher = watch(
1120
+ "docs/web/metafile.json",
1121
+ async (e, filename) => {
1122
+ console.log(ansiC.green(ansiC.inverse(`< ${e} ${filename} (web)`)));
1123
+ this.metafileOutputs("web");
1124
+ }
1125
+ );
1126
+ }
1127
+ };
1128
+
1129
+ // src/run.ts
1130
+ readline.emitKeypressEvents(process.stdin);
1131
+ if (process.stdin.isTTY)
1132
+ process.stdin.setRawMode(true);
1133
+ console.log(ansiC2.inverse("Press 'x' to shutdown forcefully."));
1134
+ process.stdin.on("keypress", (str, key) => {
1135
+ if (key.name === "x") {
1136
+ console.log(ansiC2.inverse("Shutting down forcefully..."));
1137
+ process.exit(-1);
1138
+ }
1139
+ });
1140
+ import(process.cwd() + "/" + process.argv[2]).then(async (module) => {
1141
+ const rawConfig = module.default;
1142
+ const config = {
1143
+ ...rawConfig,
1144
+ buildDir: process.cwd() + "/" + rawConfig.outdir
1145
+ };
1146
+ const pm = new PM_Main(config);
1147
+ pm.start();
1148
+ process.stdin.on("keypress", (str, key) => {
1149
+ if (key.name === "q") {
1150
+ pm.stop();
1151
+ }
1152
+ });
1153
+ });