testeranto 0.90.0 → 0.100.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.
- package/bundle.js +4 -7
- package/dist/common/src/Node.js +5 -3
- package/dist/common/src/PM/main.js +254 -126
- package/dist/common/src/PM/node.js +20 -5
- package/dist/common/src/PM/web.js +19 -4
- package/dist/common/src/SubPackages/puppeteer.js +1 -1
- package/dist/common/src/SubPackages/react/jsx/index.js +14 -6
- package/dist/common/src/SubPackages/react/jsx/node.js +2 -2
- package/dist/common/src/SubPackages/react-dom/component/web.js +13 -39
- package/dist/common/src/SubPackages/react-test-renderer/component/interface.js +2 -10
- package/dist/common/src/Web.js +25 -21
- package/dist/common/src/cli.js +439 -0
- package/dist/common/src/cli2.js +144 -0
- package/dist/common/src/esbuildConfigs/inputFilesPlugin.js +18 -8
- package/dist/common/src/esbuildConfigs/node.js +1 -4
- package/dist/common/src/esbuildConfigs/web.js +1 -1
- package/dist/common/src/lib/abstractBase.js +31 -263
- package/dist/common/src/lib/basebuilder.js +1 -11
- package/dist/common/src/lib/classBuilder.js +1 -1
- package/dist/common/src/lib/core.js +8 -28
- package/dist/common/src/lib/types.js +1 -0
- package/dist/common/tsconfig.common.tsbuildinfo +1 -1
- package/dist/module/src/Node.js +5 -3
- package/dist/module/src/PM/main.js +254 -126
- package/dist/module/src/PM/node.js +20 -5
- package/dist/module/src/PM/web.js +19 -4
- package/dist/module/src/SubPackages/puppeteer.js +1 -1
- package/dist/module/src/SubPackages/react/jsx/index.js +14 -6
- package/dist/module/src/SubPackages/react/jsx/node.js +2 -2
- package/dist/module/src/SubPackages/react-dom/component/web.js +13 -39
- package/dist/module/src/SubPackages/react-test-renderer/component/interface.js +2 -10
- package/dist/module/src/Web.js +25 -21
- package/dist/module/src/cli.js +411 -0
- package/dist/module/src/cli2.js +116 -0
- package/dist/module/src/esbuildConfigs/inputFilesPlugin.js +18 -8
- package/dist/module/src/esbuildConfigs/node.js +1 -4
- package/dist/module/src/esbuildConfigs/web.js +1 -1
- package/dist/module/src/lib/abstractBase.js +31 -263
- package/dist/module/src/lib/basebuilder.js +1 -11
- package/dist/module/src/lib/classBuilder.js +1 -1
- package/dist/module/src/lib/core.js +8 -28
- package/dist/module/src/lib/types.js +1 -0
- package/dist/module/tsconfig.module.tsbuildinfo +1 -1
- package/dist/prebuild/cli.mjs +1491 -0
- package/dist/prebuild/{run-tests.mjs → cli2.mjs} +223 -212
- package/dist/types/src/Node.d.ts +6 -3
- package/dist/types/src/PM/index.d.ts +10 -2
- package/dist/types/src/PM/main.d.ts +14 -7
- package/dist/types/src/PM/node.d.ts +9 -2
- package/dist/types/src/PM/web.d.ts +9 -3
- package/dist/types/src/SubPackages/puppeteer.d.ts +1 -1
- package/dist/types/src/SubPackages/react/component/node.d.ts +1 -1
- package/dist/types/src/SubPackages/react/component/web.d.ts +1 -1
- package/dist/types/src/SubPackages/react/jsx/node.d.ts +3 -3
- package/dist/types/src/SubPackages/react/jsx/web.d.ts +2 -2
- package/dist/types/src/SubPackages/react-dom/component/node.d.ts +2 -2
- package/dist/types/src/SubPackages/react-dom/component/web.d.ts +1 -1
- package/dist/types/src/SubPackages/react-dom/jsx/node.d.ts +1 -1
- package/dist/types/src/SubPackages/react-dom/jsx/web.d.ts +2 -2
- package/dist/types/src/SubPackages/react-test-renderer/MemoExoticComponent/node.d.ts +2 -2
- package/dist/types/src/SubPackages/react-test-renderer/component/interface.d.ts +1 -1
- package/dist/types/src/SubPackages/react-test-renderer/component/node.d.ts +2 -2
- package/dist/types/src/SubPackages/react-test-renderer/component/web.d.ts +2 -2
- package/dist/types/src/SubPackages/react-test-renderer/fc/node.d.ts +2 -2
- package/dist/types/src/SubPackages/react-test-renderer/fc/web.d.ts +2 -2
- package/dist/types/src/SubPackages/react-test-renderer/jsx/node.d.ts +3 -2
- package/dist/types/src/SubPackages/react-test-renderer/jsx/web.d.ts +2 -2
- package/dist/types/src/SubPackages/react-test-renderer/jsx-promised/node.d.ts +2 -2
- package/dist/types/src/SubPackages/react-test-renderer/jsx-promised/web.d.ts +2 -2
- package/dist/types/src/Types.d.ts +60 -21
- package/dist/types/src/Web.d.ts +3 -3
- package/dist/types/src/lib/abstractBase.d.ts +6 -2
- package/dist/types/src/lib/core.d.ts +3 -3
- package/dist/types/src/lib/index.d.ts +1 -1
- package/dist/types/src/lib/types.d.ts +6 -30
- package/dist/types/tsconfig.types.tsbuildinfo +1 -1
- package/package.json +23 -20
- package/src/Node.ts +6 -3
- package/src/PM/index.ts +12 -8
- package/src/PM/main.ts +331 -165
- package/src/PM/node.ts +42 -7
- package/src/PM/web.ts +33 -5
- package/src/SubPackages/puppeteer.ts +1 -1
- package/src/SubPackages/react/jsx/index.ts +15 -7
- package/src/SubPackages/react/jsx/node.ts +18 -6
- package/src/SubPackages/react-dom/component/web.ts +28 -51
- package/src/SubPackages/react-test-renderer/component/interface.ts +4 -11
- package/src/SubPackages/react-test-renderer/jsx/node.ts +16 -1
- package/src/Types.ts +362 -114
- package/src/Web.ts +45 -23
- package/src/cli.ts +535 -0
- package/src/cli2.ts +157 -0
- package/src/esbuildConfigs/inputFilesPlugin.ts +27 -9
- package/src/esbuildConfigs/node.ts +4 -7
- package/src/esbuildConfigs/web.ts +4 -3
- package/src/lib/abstractBase.ts +84 -291
- package/src/lib/basebuilder.ts +1 -12
- package/src/lib/classBuilder.ts +2 -1
- package/src/lib/core.ts +17 -29
- package/src/lib/types.ts +5 -177
- package/dist/common/src/Aider.js +0 -143
- package/dist/common/src/Project.js +0 -225
- package/dist/common/src/Puppeteer.js +0 -113
- package/dist/common/src/build-tests.js +0 -39
- package/dist/common/src/esbuildConfigs/features.js +0 -14
- package/dist/common/src/esbuildConfigs/report.js +0 -14
- package/dist/common/src/esbuildConfigs/tests.js +0 -13
- package/dist/common/src/run-tests.js +0 -39
- package/dist/module/src/Aider.js +0 -136
- package/dist/module/src/Project.js +0 -218
- package/dist/module/src/Puppeteer.js +0 -108
- package/dist/module/src/build-tests.js +0 -11
- package/dist/module/src/esbuildConfigs/features.js +0 -12
- package/dist/module/src/esbuildConfigs/report.js +0 -14
- package/dist/module/src/esbuildConfigs/tests.js +0 -11
- package/dist/module/src/run-tests.js +0 -11
- package/dist/prebuild/build-tests.mjs +0 -552
- package/dist/types/src/Aider.d.ts +0 -1
- package/dist/types/src/Project.d.ts +0 -12
- package/dist/types/src/Puppeteer.d.ts +0 -2
- package/dist/types/src/esbuildConfigs/features.d.ts +0 -4
- package/dist/types/src/esbuildConfigs/report.d.ts +0 -0
- package/dist/types/src/esbuildConfigs/tests.d.ts +0 -4
- package/src/Aider.ts +0 -168
- package/src/Project.ts +0 -291
- package/src/Puppeteer.ts +0 -145
- package/src/build-tests.ts +0 -12
- package/src/esbuildConfigs/features.ts +0 -17
- package/src/esbuildConfigs/report.ts +0 -15
- package/src/esbuildConfigs/tests.ts +0 -14
- package/src/run-tests.ts +0 -12
- /package/dist/types/src/{build-tests.d.ts → cli.d.ts} +0 -0
- /package/dist/types/src/{run-tests.d.ts → cli2.d.ts} +0 -0
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
import { createRequire } from 'module';const require = createRequire(import.meta.url);
|
|
2
2
|
|
|
3
|
-
// src/
|
|
4
|
-
import
|
|
5
|
-
import fs2 from "fs";
|
|
6
|
-
import watch from "recursive-watch";
|
|
3
|
+
// src/cli2.ts
|
|
4
|
+
import { watch } from "fs";
|
|
7
5
|
|
|
8
6
|
// src/PM/main.ts
|
|
9
7
|
import fs from "fs";
|
|
10
|
-
import
|
|
8
|
+
import path from "path";
|
|
11
9
|
import puppeteer from "puppeteer-core";
|
|
12
10
|
import crypto from "crypto";
|
|
13
11
|
|
|
@@ -15,17 +13,22 @@ import crypto from "crypto";
|
|
|
15
13
|
var PM = class {
|
|
16
14
|
};
|
|
17
15
|
|
|
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
16
|
// src/PM/main.ts
|
|
25
17
|
var fileStreams3 = [];
|
|
26
18
|
var fPaths = [];
|
|
27
19
|
var files = {};
|
|
20
|
+
var recorders = {};
|
|
28
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
|
+
};
|
|
29
32
|
var PM_Main = class extends PM {
|
|
30
33
|
constructor(configs) {
|
|
31
34
|
super();
|
|
@@ -50,7 +53,7 @@ var PM_Main = class extends PM {
|
|
|
50
53
|
}
|
|
51
54
|
};
|
|
52
55
|
this.launchNode = async (src, dest) => {
|
|
53
|
-
console.log("
|
|
56
|
+
console.log("! node", src);
|
|
54
57
|
this.register(src);
|
|
55
58
|
const destFolder = dest.replace(".mjs", "");
|
|
56
59
|
let argz = "";
|
|
@@ -96,32 +99,17 @@ var PM_Main = class extends PM {
|
|
|
96
99
|
console.error("negative port makes no sense", src);
|
|
97
100
|
process.exit(-1);
|
|
98
101
|
}
|
|
99
|
-
const builtfile = dest
|
|
100
|
-
|
|
101
|
-
testConfig[3].map((sidecar) => {
|
|
102
|
-
if (sidecar[1] === "web") {
|
|
103
|
-
return this.launchWebSideCar(
|
|
104
|
-
sidecar[0],
|
|
105
|
-
destinationOfRuntime(sidecar[0], "web", this.configs),
|
|
106
|
-
sidecar
|
|
107
|
-
);
|
|
108
|
-
}
|
|
109
|
-
if (sidecar[1] === "node") {
|
|
110
|
-
return this.launchNodeSideCar(
|
|
111
|
-
sidecar[0],
|
|
112
|
-
destinationOfRuntime(sidecar[0], "node", this.configs),
|
|
113
|
-
sidecar
|
|
114
|
-
);
|
|
115
|
-
}
|
|
116
|
-
})
|
|
117
|
-
);
|
|
102
|
+
const builtfile = dest;
|
|
103
|
+
const webSideCares = [];
|
|
118
104
|
this.server[builtfile] = await import(`${builtfile}?cacheBust=${Date.now()}`).then((module) => {
|
|
119
105
|
return module.default.then((defaultModule) => {
|
|
120
|
-
defaultModule.receiveTestResourceConfig(argz).then(async (features) => {
|
|
121
|
-
this.receiveFeatures(features, destFolder);
|
|
106
|
+
defaultModule.receiveTestResourceConfig(argz).then(async ({ features, failed }) => {
|
|
107
|
+
this.receiveFeatures(features, destFolder, src);
|
|
108
|
+
statusMessagePretty(failed, src);
|
|
122
109
|
}).catch((e) => {
|
|
123
|
-
console.log(
|
|
110
|
+
console.log(`${src} errored with`, e);
|
|
124
111
|
}).finally(() => {
|
|
112
|
+
webSideCares.forEach((webSideCar) => webSideCar.close());
|
|
125
113
|
this.deregister(src);
|
|
126
114
|
});
|
|
127
115
|
});
|
|
@@ -136,12 +124,6 @@ var PM_Main = class extends PM {
|
|
|
136
124
|
const d = dest + ".mjs";
|
|
137
125
|
console.log("launchWebSideCar", src, dest, d);
|
|
138
126
|
const destFolder = dest.replace(".mjs", "");
|
|
139
|
-
const webArgz = JSON.stringify({
|
|
140
|
-
name: dest,
|
|
141
|
-
ports: [].toString(),
|
|
142
|
-
fs: destFolder,
|
|
143
|
-
browserWSEndpoint: this.browser.wsEndpoint()
|
|
144
|
-
});
|
|
145
127
|
const fileStreams2 = [];
|
|
146
128
|
const doneFileStream2 = [];
|
|
147
129
|
return new Promise((res, rej) => {
|
|
@@ -150,7 +132,7 @@ var PM_Main = class extends PM {
|
|
|
150
132
|
"custom-screenshot",
|
|
151
133
|
async (ssOpts, testName) => {
|
|
152
134
|
const p = ssOpts.path;
|
|
153
|
-
const dir =
|
|
135
|
+
const dir = path.dirname(p);
|
|
154
136
|
fs.mkdirSync(dir, {
|
|
155
137
|
recursive: true
|
|
156
138
|
});
|
|
@@ -170,7 +152,7 @@ var PM_Main = class extends PM {
|
|
|
170
152
|
page.exposeFunction(
|
|
171
153
|
"writeFileSync",
|
|
172
154
|
(fp, contents, testName) => {
|
|
173
|
-
const dir =
|
|
155
|
+
const dir = path.dirname(fp);
|
|
174
156
|
fs.mkdirSync(dir, {
|
|
175
157
|
recursive: true
|
|
176
158
|
});
|
|
@@ -225,16 +207,6 @@ var PM_Main = class extends PM {
|
|
|
225
207
|
page.exposeFunction("end", async (uid) => {
|
|
226
208
|
return fileStreams2[uid].end();
|
|
227
209
|
});
|
|
228
|
-
page.exposeFunction("customclose", (p, testName) => {
|
|
229
|
-
fs.writeFileSync(
|
|
230
|
-
p + "/manifest.json",
|
|
231
|
-
JSON.stringify(Array.from(files[testName]))
|
|
232
|
-
);
|
|
233
|
-
delete files[testName];
|
|
234
|
-
Promise.all(screenshots[testName] || []).then(() => {
|
|
235
|
-
delete screenshots[testName];
|
|
236
|
-
});
|
|
237
|
-
});
|
|
238
210
|
return page;
|
|
239
211
|
}).then(async (page) => {
|
|
240
212
|
await page.goto(`file://${`${dest}.html`}`, {});
|
|
@@ -295,18 +267,9 @@ var PM_Main = class extends PM {
|
|
|
295
267
|
}
|
|
296
268
|
}
|
|
297
269
|
};
|
|
298
|
-
this.launchWeb = (t, dest
|
|
299
|
-
console.log("
|
|
270
|
+
this.launchWeb = (t, dest) => {
|
|
271
|
+
console.log("! web", t);
|
|
300
272
|
this.register(t);
|
|
301
|
-
sidecars.map((sidecar) => {
|
|
302
|
-
if (sidecar[1] === "node") {
|
|
303
|
-
return this.launchNodeSideCar(
|
|
304
|
-
sidecar[0],
|
|
305
|
-
destinationOfRuntime(sidecar[0], "node", this.configs),
|
|
306
|
-
sidecar
|
|
307
|
-
);
|
|
308
|
-
}
|
|
309
|
-
});
|
|
310
273
|
const destFolder = dest.replace(".mjs", "");
|
|
311
274
|
const webArgz = JSON.stringify({
|
|
312
275
|
name: dest,
|
|
@@ -314,9 +277,10 @@ var PM_Main = class extends PM {
|
|
|
314
277
|
fs: destFolder,
|
|
315
278
|
browserWSEndpoint: this.browser.wsEndpoint()
|
|
316
279
|
});
|
|
280
|
+
const d = `${dest}?cacheBust=${Date.now()}`;
|
|
317
281
|
const evaluation = `
|
|
318
|
-
console.log("importing ${
|
|
319
|
-
import('${
|
|
282
|
+
console.log("importing ${d}");
|
|
283
|
+
import('${d}').then(async (x) => {
|
|
320
284
|
console.log("imported", (await x.default));
|
|
321
285
|
try {
|
|
322
286
|
return await (await x.default).receiveTestResourceConfig(${webArgz})
|
|
@@ -326,14 +290,14 @@ var PM_Main = class extends PM {
|
|
|
326
290
|
})`;
|
|
327
291
|
const fileStreams2 = [];
|
|
328
292
|
const doneFileStream2 = [];
|
|
329
|
-
const stdoutStream = fs.createWriteStream(`${
|
|
330
|
-
const stderrStream = fs.createWriteStream(`${
|
|
293
|
+
const stdoutStream = fs.createWriteStream(`${destFolder}/stdout.log`);
|
|
294
|
+
const stderrStream = fs.createWriteStream(`${destFolder}/stderr.log`);
|
|
331
295
|
this.browser.newPage().then((page) => {
|
|
332
296
|
page.exposeFunction(
|
|
333
297
|
"screencast",
|
|
334
298
|
async (ssOpts, testName) => {
|
|
335
299
|
const p = ssOpts.path;
|
|
336
|
-
const dir =
|
|
300
|
+
const dir = path.dirname(p);
|
|
337
301
|
fs.mkdirSync(dir, {
|
|
338
302
|
recursive: true
|
|
339
303
|
});
|
|
@@ -357,7 +321,7 @@ var PM_Main = class extends PM {
|
|
|
357
321
|
"customScreenShot",
|
|
358
322
|
async (ssOpts, testName) => {
|
|
359
323
|
const p = ssOpts.path;
|
|
360
|
-
const dir =
|
|
324
|
+
const dir = path.dirname(p);
|
|
361
325
|
fs.mkdirSync(dir, {
|
|
362
326
|
recursive: true
|
|
363
327
|
});
|
|
@@ -380,20 +344,7 @@ var PM_Main = class extends PM {
|
|
|
380
344
|
page.exposeFunction(
|
|
381
345
|
"writeFileSync",
|
|
382
346
|
(fp, contents, testName) => {
|
|
383
|
-
|
|
384
|
-
fs.mkdirSync(dir, {
|
|
385
|
-
recursive: true
|
|
386
|
-
});
|
|
387
|
-
const p = new Promise(async (res, rej) => {
|
|
388
|
-
fs.writeFileSync(fp, contents);
|
|
389
|
-
res(fp);
|
|
390
|
-
});
|
|
391
|
-
doneFileStream2.push(p);
|
|
392
|
-
if (!files[testName]) {
|
|
393
|
-
files[testName] = /* @__PURE__ */ new Set();
|
|
394
|
-
}
|
|
395
|
-
files[testName].add(fp);
|
|
396
|
-
return p;
|
|
347
|
+
return globalThis["writeFileSync"](fp, contents, testName);
|
|
397
348
|
}
|
|
398
349
|
);
|
|
399
350
|
page.exposeFunction("existsSync", (fp, contents) => {
|
|
@@ -435,16 +386,6 @@ var PM_Main = class extends PM {
|
|
|
435
386
|
page.exposeFunction("end", async (uid) => {
|
|
436
387
|
return fileStreams2[uid].end();
|
|
437
388
|
});
|
|
438
|
-
page.exposeFunction("customclose", (p, testName) => {
|
|
439
|
-
fs.writeFileSync(
|
|
440
|
-
p + "/manifest.json",
|
|
441
|
-
JSON.stringify(Array.from(files[testName]))
|
|
442
|
-
);
|
|
443
|
-
delete files[testName];
|
|
444
|
-
Promise.all(screenshots[testName] || []).then(() => {
|
|
445
|
-
delete screenshots[testName];
|
|
446
|
-
});
|
|
447
|
-
});
|
|
448
389
|
page.exposeFunction("page", () => {
|
|
449
390
|
return page.mainFrame()._id;
|
|
450
391
|
});
|
|
@@ -488,12 +429,21 @@ var PM_Main = class extends PM {
|
|
|
488
429
|
return page;
|
|
489
430
|
}).then(async (page) => {
|
|
490
431
|
const close = () => {
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
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
|
+
});
|
|
497
447
|
};
|
|
498
448
|
page.on("pageerror", (err) => {
|
|
499
449
|
console.debug(`Error from ${t}: [${err.name}] `);
|
|
@@ -514,31 +464,37 @@ var PM_Main = class extends PM {
|
|
|
514
464
|
stdoutStream.write(JSON.stringify(log.location()));
|
|
515
465
|
stdoutStream.write(JSON.stringify(log.stackTrace()));
|
|
516
466
|
});
|
|
517
|
-
await page.goto(`file://${`${
|
|
518
|
-
await page.evaluate(evaluation).then(async (features) => {
|
|
519
|
-
this.receiveFeatures(features, destFolder);
|
|
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);
|
|
520
471
|
}).catch((e) => {
|
|
521
|
-
console.log(
|
|
522
|
-
console.log(e);
|
|
472
|
+
console.log(`${t} errored with`, e);
|
|
523
473
|
}).finally(() => {
|
|
524
474
|
close();
|
|
525
475
|
});
|
|
526
476
|
return page;
|
|
527
477
|
});
|
|
528
478
|
};
|
|
529
|
-
this.receiveFeatures = (features, destFolder) => {
|
|
530
|
-
|
|
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
|
+
);
|
|
531
487
|
features.reduce(async (mm, featureStringKey) => {
|
|
532
488
|
const accum = await mm;
|
|
533
489
|
const isUrl = isValidUrl(featureStringKey);
|
|
534
490
|
if (isUrl) {
|
|
535
491
|
const u = new URL(featureStringKey);
|
|
536
492
|
if (u.protocol === "file:") {
|
|
537
|
-
const newPath = `${process.cwd()}/docs/features/internal/${
|
|
493
|
+
const newPath = `${process.cwd()}/docs/features/internal/${path.relative(
|
|
538
494
|
process.cwd(),
|
|
539
495
|
u.pathname
|
|
540
496
|
)}`;
|
|
541
|
-
await fs.promises.mkdir(
|
|
497
|
+
await fs.promises.mkdir(path.dirname(newPath), { recursive: true });
|
|
542
498
|
try {
|
|
543
499
|
await fs.unlinkSync(newPath);
|
|
544
500
|
} catch (error) {
|
|
@@ -550,25 +506,24 @@ var PM_Main = class extends PM {
|
|
|
550
506
|
} else {
|
|
551
507
|
}
|
|
552
508
|
});
|
|
553
|
-
accum.push(newPath);
|
|
509
|
+
accum.files.push(newPath);
|
|
554
510
|
} else if (u.protocol === "http:" || u.protocol === "https:") {
|
|
555
511
|
const newPath = `${process.cwd()}/docs/features/external${u.hostname}${u.pathname}`;
|
|
556
512
|
const body = await this.configs.featureIngestor(featureStringKey);
|
|
557
513
|
writeFileAndCreateDir(newPath, body);
|
|
558
|
-
accum.push(newPath);
|
|
514
|
+
accum.files.push(newPath);
|
|
559
515
|
}
|
|
560
516
|
} else {
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
)
|
|
564
|
-
|
|
565
|
-
accum.push(newPath);
|
|
517
|
+
await fs.promises.mkdir(path.dirname(featureDestination), {
|
|
518
|
+
recursive: true
|
|
519
|
+
});
|
|
520
|
+
accum.strings.push(featureStringKey);
|
|
566
521
|
}
|
|
567
522
|
return accum;
|
|
568
|
-
}, Promise.resolve([])).then((
|
|
523
|
+
}, Promise.resolve({ files: [], strings: [] })).then(({ files: files2, strings }) => {
|
|
569
524
|
fs.writeFileSync(
|
|
570
525
|
`${destFolder}/featurePrompt.txt`,
|
|
571
|
-
|
|
526
|
+
files2.map((f) => {
|
|
572
527
|
return `/read ${f}`;
|
|
573
528
|
}).join("\n")
|
|
574
529
|
);
|
|
@@ -581,6 +536,35 @@ var PM_Main = class extends PM {
|
|
|
581
536
|
this.configs.ports.forEach((element) => {
|
|
582
537
|
this.ports[element] = "true";
|
|
583
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
|
+
};
|
|
584
568
|
globalThis["mkdirSync"] = (fp) => {
|
|
585
569
|
if (!fs.existsSync(fp)) {
|
|
586
570
|
return fs.mkdirSync(fp, {
|
|
@@ -590,7 +574,7 @@ var PM_Main = class extends PM {
|
|
|
590
574
|
return false;
|
|
591
575
|
};
|
|
592
576
|
globalThis["writeFileSync"] = (filepath, contents, testName) => {
|
|
593
|
-
const dir =
|
|
577
|
+
const dir = path.dirname(filepath);
|
|
594
578
|
fs.mkdirSync(dir, {
|
|
595
579
|
recursive: true
|
|
596
580
|
});
|
|
@@ -618,9 +602,12 @@ var PM_Main = class extends PM {
|
|
|
618
602
|
globalThis["end"] = (uid) => {
|
|
619
603
|
fileStreams3[uid].end();
|
|
620
604
|
};
|
|
621
|
-
globalThis["customScreenShot"] = async (opts,
|
|
605
|
+
globalThis["customScreenShot"] = async (opts, pageKey, testName) => {
|
|
606
|
+
const page = (await this.browser.pages()).find(
|
|
607
|
+
(p2) => p2.mainFrame()._id === pageKey
|
|
608
|
+
);
|
|
622
609
|
const p = opts.path;
|
|
623
|
-
const dir =
|
|
610
|
+
const dir = path.dirname(p);
|
|
624
611
|
fs.mkdirSync(dir, {
|
|
625
612
|
recursive: true
|
|
626
613
|
});
|
|
@@ -639,24 +626,45 @@ var PM_Main = class extends PM {
|
|
|
639
626
|
await sPromise;
|
|
640
627
|
return sPromise;
|
|
641
628
|
};
|
|
642
|
-
globalThis["
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
}
|
|
646
|
-
fs.writeFileSync(
|
|
647
|
-
p + "/manifest.json",
|
|
648
|
-
JSON.stringify(Array.from(files[testName]))
|
|
629
|
+
globalThis["screencast"] = async (opts, pageKey) => {
|
|
630
|
+
const page = (await this.browser.pages()).find(
|
|
631
|
+
(p2) => p2.mainFrame()._id === pageKey
|
|
649
632
|
);
|
|
650
|
-
|
|
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;
|
|
651
644
|
};
|
|
652
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
|
+
}
|
|
653
661
|
$(selector) {
|
|
654
662
|
throw new Error("Method not implemented.");
|
|
655
663
|
}
|
|
656
664
|
screencast(opts) {
|
|
657
665
|
throw new Error("Method not implemented.");
|
|
658
666
|
}
|
|
659
|
-
customScreenShot(opts) {
|
|
667
|
+
customScreenShot(opts, cdpPage) {
|
|
660
668
|
throw new Error("Method not implemented.");
|
|
661
669
|
}
|
|
662
670
|
end(accessObject) {
|
|
@@ -684,7 +692,7 @@ var PM_Main = class extends PM {
|
|
|
684
692
|
callback(
|
|
685
693
|
new Promise((res, rej) => {
|
|
686
694
|
tLog("testArtiFactory =>", fPath);
|
|
687
|
-
const cleanPath =
|
|
695
|
+
const cleanPath = path.resolve(fPath);
|
|
688
696
|
fPaths.push(cleanPath.replace(process.cwd(), ``));
|
|
689
697
|
const targetDir = cleanPath.split("/").slice(0, -1).join("/");
|
|
690
698
|
fs.mkdir(targetDir, { recursive: true }, async (error) => {
|
|
@@ -692,7 +700,7 @@ var PM_Main = class extends PM {
|
|
|
692
700
|
console.error(`\u2757\uFE0FtestArtiFactory failed`, targetDir, error);
|
|
693
701
|
}
|
|
694
702
|
fs.writeFileSync(
|
|
695
|
-
|
|
703
|
+
path.resolve(
|
|
696
704
|
targetDir.split("/").slice(0, -1).join("/"),
|
|
697
705
|
"manifest"
|
|
698
706
|
),
|
|
@@ -748,6 +756,9 @@ var PM_Main = class extends PM {
|
|
|
748
756
|
isDisabled(selector) {
|
|
749
757
|
throw new Error("Method not implemented.");
|
|
750
758
|
}
|
|
759
|
+
screencastStop(s) {
|
|
760
|
+
throw new Error("Method not implemented.");
|
|
761
|
+
}
|
|
751
762
|
////////////////////////////////////////////////////////////////////////////////
|
|
752
763
|
async startPuppeteer(options, destfolder) {
|
|
753
764
|
this.browser = await puppeteer.launch(options);
|
|
@@ -760,21 +771,14 @@ var PM_Main = class extends PM {
|
|
|
760
771
|
}
|
|
761
772
|
};
|
|
762
773
|
async function writeFileAndCreateDir(filePath, data) {
|
|
763
|
-
const dirPath =
|
|
774
|
+
const dirPath = path.dirname(filePath);
|
|
764
775
|
try {
|
|
765
776
|
await fs.promises.mkdir(dirPath, { recursive: true });
|
|
766
|
-
await fs.
|
|
777
|
+
await fs.appendFileSync(filePath, data);
|
|
767
778
|
} catch (error) {
|
|
768
779
|
console.error(`Error writing file: ${error}`);
|
|
769
780
|
}
|
|
770
781
|
}
|
|
771
|
-
async function sha256(rawData) {
|
|
772
|
-
const data = typeof rawData === "object" ? JSON.stringify(rawData) : String(rawData);
|
|
773
|
-
const msgBuffer = new TextEncoder().encode(data);
|
|
774
|
-
const hashBuffer = await crypto.subtle.digest("SHA-256", msgBuffer);
|
|
775
|
-
const hashArray = Array.from(new Uint8Array(hashBuffer));
|
|
776
|
-
return hashArray.map((b) => b.toString(16).padStart(2, "0")).join("");
|
|
777
|
-
}
|
|
778
782
|
function isValidUrl(string) {
|
|
779
783
|
try {
|
|
780
784
|
new URL(string);
|
|
@@ -784,36 +788,64 @@ function isValidUrl(string) {
|
|
|
784
788
|
}
|
|
785
789
|
}
|
|
786
790
|
|
|
787
|
-
// src/
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
var
|
|
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;
|
|
792
834
|
const config = {
|
|
793
|
-
...
|
|
794
|
-
buildDir: process.cwd() + "/" +
|
|
835
|
+
...rawConfig,
|
|
836
|
+
buildDir: process.cwd() + "/" + rawConfig.outdir
|
|
795
837
|
};
|
|
796
|
-
|
|
797
|
-
`${config.outdir}/testeranto.json`,
|
|
798
|
-
JSON.stringify(
|
|
799
|
-
{
|
|
800
|
-
...config,
|
|
801
|
-
buildDir: process.cwd() + "/" + config.outdir
|
|
802
|
-
},
|
|
803
|
-
null,
|
|
804
|
-
2
|
|
805
|
-
)
|
|
806
|
-
);
|
|
807
|
-
const pm = new PM_Main(config);
|
|
838
|
+
let pm = new PM_Main(config);
|
|
808
839
|
await pm.startPuppeteer(
|
|
809
840
|
{
|
|
841
|
+
slowMo: 1,
|
|
810
842
|
// timeout: 1,
|
|
811
843
|
waitForInitialPage: false,
|
|
812
844
|
executablePath: (
|
|
813
845
|
// process.env.CHROMIUM_PATH || "/opt/homebrew/bin/chromium",
|
|
814
846
|
"/opt/homebrew/bin/chromium"
|
|
815
847
|
),
|
|
816
|
-
headless:
|
|
848
|
+
headless: true,
|
|
817
849
|
dumpio: true,
|
|
818
850
|
// timeout: 0,
|
|
819
851
|
devtools: true,
|
|
@@ -850,58 +882,37 @@ var Puppeteer_default = async (partialConfig) => {
|
|
|
850
882
|
},
|
|
851
883
|
"."
|
|
852
884
|
);
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
if (runtime === "node") {
|
|
866
|
-
pm.launchNode(test, destinationOfRuntime(test, "node", config));
|
|
867
|
-
} else if (runtime === "web") {
|
|
868
|
-
pm.launchWeb(test, destinationOfRuntime(test, "web", config), sidecars);
|
|
869
|
-
} else {
|
|
870
|
-
console.error("runtime makes no sense", runtime);
|
|
871
|
-
}
|
|
872
|
-
});
|
|
873
|
-
if (config.devMode) {
|
|
874
|
-
console.log("ready and watching for changes...", config.buildDir);
|
|
875
|
-
watch(config.buildDir, (eventType, changedFile) => {
|
|
876
|
-
if (changedFile) {
|
|
877
|
-
config.tests.forEach(([test, runtime, tr, sidecars]) => {
|
|
878
|
-
if (eventType === "change" || eventType === "rename") {
|
|
879
|
-
if (changedFile === test.replace("./", "node/").split(".").slice(0, -1).concat("mjs").join(".")) {
|
|
880
|
-
pm.launchNode(test, destinationOfRuntime(test, "node", config));
|
|
881
|
-
}
|
|
882
|
-
if (changedFile === test.replace("./", "web/").split(".").slice(0, -1).concat("mjs").join(".")) {
|
|
883
|
-
pm.launchWeb(
|
|
884
|
-
test,
|
|
885
|
-
destinationOfRuntime(test, "web", config),
|
|
886
|
-
sidecars
|
|
887
|
-
);
|
|
888
|
-
}
|
|
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);
|
|
889
897
|
}
|
|
890
898
|
});
|
|
899
|
+
} catch (e) {
|
|
900
|
+
console.error(e);
|
|
891
901
|
}
|
|
892
|
-
}
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
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
|
+
});
|