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