@brillout/test-e2e 0.1.3
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/bin.js +2 -0
- package/dist/Logs.d.ts +29 -0
- package/dist/Logs.js +77 -0
- package/dist/buildTs.d.ts +2 -0
- package/dist/buildTs.js +22 -0
- package/dist/chai/JestChaiExpect.d.ts +2 -0
- package/dist/chai/JestChaiExpect.js +27 -0
- package/dist/chai/expect.d.ts +2 -0
- package/dist/chai/expect.js +30 -0
- package/dist/chai/types.d.ts +15 -0
- package/dist/chai/types.js +2 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +43 -0
- package/dist/editFile.d.ts +6 -0
- package/dist/editFile.js +49 -0
- package/dist/findTestFiles.d.ts +3 -0
- package/dist/findTestFiles.js +26 -0
- package/dist/getBrowser.d.ts +3 -0
- package/dist/getBrowser.js +15 -0
- package/dist/getTestInfo.d.ts +21 -0
- package/dist/getTestInfo.js +14 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +24 -0
- package/dist/logProgress.d.ts +2 -0
- package/dist/logProgress.js +41 -0
- package/dist/page.d.ts +3 -0
- package/dist/page.js +13 -0
- package/dist/runTestSuites.d.ts +6 -0
- package/dist/runTestSuites.js +41 -0
- package/dist/runTests.d.ts +3 -0
- package/dist/runTests.js +111 -0
- package/dist/setup.d.ts +36 -0
- package/dist/setup.js +465 -0
- package/dist/test.d.ts +2 -0
- package/dist/test.js +15 -0
- package/dist/utils/assert.d.ts +14 -0
- package/dist/utils/assert.js +72 -0
- package/dist/utils/createErrorWithCleanStackTrace.d.ts +2 -0
- package/dist/utils/createErrorWithCleanStackTrace.js +43 -0
- package/dist/utils/findFiles.d.ts +7 -0
- package/dist/utils/findFiles.js +46 -0
- package/dist/utils/humanizeTime.d.ts +1 -0
- package/dist/utils/humanizeTime.js +15 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.js +22 -0
- package/dist/utils/isTTY.d.ts +1 -0
- package/dist/utils/isTTY.js +5 -0
- package/dist/utils/projectInfo.d.ts +5 -0
- package/dist/utils/projectInfo.js +8 -0
- package/dist/utils/runCommand.d.ts +6 -0
- package/dist/utils/runCommand.js +46 -0
- package/dist/utils/sleep.d.ts +2 -0
- package/dist/utils/sleep.js +7 -0
- package/package.json +37 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.projectErrorPrefix = exports.getProjectError = exports.assertInfo = exports.assertWarning = exports.assertUsage = exports.assert = void 0;
|
|
4
|
+
const createErrorWithCleanStackTrace_1 = require("./createErrorWithCleanStackTrace");
|
|
5
|
+
const projectInfo_1 = require("./projectInfo");
|
|
6
|
+
const errorPrefix = `[${projectInfo_1.projectInfo.npmPackageName}]`;
|
|
7
|
+
exports.projectErrorPrefix = errorPrefix;
|
|
8
|
+
const internalErrorPrefix = `${errorPrefix}[Bug]`;
|
|
9
|
+
const usageErrorPrefix = `${errorPrefix}[Wrong Usage]`;
|
|
10
|
+
const warningPrefix = `${errorPrefix}[Warning]`;
|
|
11
|
+
const infoPrefix = `${errorPrefix}[Info]`;
|
|
12
|
+
const numberOfStackTraceLinesToRemove = 2;
|
|
13
|
+
function assert(condition, debugInfo) {
|
|
14
|
+
if (condition) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const debugStr = (() => {
|
|
18
|
+
if (!debugInfo) {
|
|
19
|
+
return '';
|
|
20
|
+
}
|
|
21
|
+
const debugInfoSerialized = typeof debugInfo === 'string' ? debugInfo : '`' + JSON.stringify(debugInfo) + '`';
|
|
22
|
+
return `Debug info (this is for the ${projectInfo_1.projectInfo.projectName} maintainers; you can ignore this): ${debugInfoSerialized}.`;
|
|
23
|
+
})();
|
|
24
|
+
const internalError = (0, createErrorWithCleanStackTrace_1.createErrorWithCleanStackTrace)([
|
|
25
|
+
`${internalErrorPrefix} You stumbled upon a bug in ${projectInfo_1.projectInfo.projectName}'s source code.`,
|
|
26
|
+
`Reach out at ${projectInfo_1.projectInfo.githubRepository}/issues/new and include this error stack (the error stack is usually enough to fix the problem).`,
|
|
27
|
+
'A maintainer will fix the bug (usually under 24 hours).',
|
|
28
|
+
`Do not hesitate to reach out as it makes ${projectInfo_1.projectInfo.projectName} more robust.`,
|
|
29
|
+
debugStr
|
|
30
|
+
].join(' '), numberOfStackTraceLinesToRemove);
|
|
31
|
+
throw internalError;
|
|
32
|
+
}
|
|
33
|
+
exports.assert = assert;
|
|
34
|
+
function assertUsage(condition, errorMessage) {
|
|
35
|
+
if (condition) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const whiteSpace = errorMessage.startsWith('[') ? '' : ' ';
|
|
39
|
+
const usageError = (0, createErrorWithCleanStackTrace_1.createErrorWithCleanStackTrace)(`${usageErrorPrefix}${whiteSpace}${errorMessage}`, numberOfStackTraceLinesToRemove);
|
|
40
|
+
throw usageError;
|
|
41
|
+
}
|
|
42
|
+
exports.assertUsage = assertUsage;
|
|
43
|
+
function getProjectError(errorMessage) {
|
|
44
|
+
const pluginError = (0, createErrorWithCleanStackTrace_1.createErrorWithCleanStackTrace)(`${errorPrefix} ${errorMessage}`, numberOfStackTraceLinesToRemove);
|
|
45
|
+
return pluginError;
|
|
46
|
+
}
|
|
47
|
+
exports.getProjectError = getProjectError;
|
|
48
|
+
let loggedWarnings = new Set();
|
|
49
|
+
function assertWarning(condition, errorMessage, { onlyOnce }) {
|
|
50
|
+
if (condition) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const msg = `${warningPrefix} ${errorMessage}`;
|
|
54
|
+
if (onlyOnce) {
|
|
55
|
+
const key = onlyOnce === true ? msg : onlyOnce;
|
|
56
|
+
if (loggedWarnings.has(key)) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
loggedWarnings.add(key);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
console.warn(msg);
|
|
64
|
+
}
|
|
65
|
+
exports.assertWarning = assertWarning;
|
|
66
|
+
function assertInfo(condition, errorMessage) {
|
|
67
|
+
if (condition) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
console.warn(`${infoPrefix} ${errorMessage}`);
|
|
71
|
+
}
|
|
72
|
+
exports.assertInfo = assertInfo;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createErrorWithCleanStackTrace = void 0;
|
|
4
|
+
function createErrorWithCleanStackTrace(errorMessage, numberOfStackTraceLinesToRemove) {
|
|
5
|
+
let err;
|
|
6
|
+
{
|
|
7
|
+
var stackTraceLimit__original = Error.stackTraceLimit;
|
|
8
|
+
Error.stackTraceLimit = Infinity;
|
|
9
|
+
err = new Error(errorMessage);
|
|
10
|
+
Error.stackTraceLimit = stackTraceLimit__original;
|
|
11
|
+
}
|
|
12
|
+
err.stack = clean(err.stack, numberOfStackTraceLinesToRemove);
|
|
13
|
+
return err;
|
|
14
|
+
}
|
|
15
|
+
exports.createErrorWithCleanStackTrace = createErrorWithCleanStackTrace;
|
|
16
|
+
function clean(errStack, numberOfStackTraceLinesToRemove) {
|
|
17
|
+
if (!errStack) {
|
|
18
|
+
return errStack;
|
|
19
|
+
}
|
|
20
|
+
const stackLines = splitByLine(errStack);
|
|
21
|
+
let linesRemoved = 0;
|
|
22
|
+
const stackLine__cleaned = stackLines
|
|
23
|
+
.filter((line) => {
|
|
24
|
+
// Remove internal stack traces
|
|
25
|
+
if (line.includes(' (internal/') || line.includes(' (node:internal')) {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
if (linesRemoved < numberOfStackTraceLinesToRemove && isStackTraceLine(line)) {
|
|
29
|
+
linesRemoved++;
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
return true;
|
|
33
|
+
})
|
|
34
|
+
.join('\n');
|
|
35
|
+
return stackLine__cleaned;
|
|
36
|
+
}
|
|
37
|
+
function isStackTraceLine(line) {
|
|
38
|
+
return line.startsWith(' at ');
|
|
39
|
+
}
|
|
40
|
+
function splitByLine(str) {
|
|
41
|
+
// https://stackoverflow.com/questions/21895233/how-in-node-to-split-string-by-newline-n
|
|
42
|
+
return str.split(/\r?\n/);
|
|
43
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.findFiles = void 0;
|
|
7
|
+
const fast_glob_1 = __importDefault(require("fast-glob"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const runCommand_1 = require("./runCommand");
|
|
10
|
+
const cwd = process.cwd();
|
|
11
|
+
let gitFiles;
|
|
12
|
+
async function findFiles(pattern, findFilter) {
|
|
13
|
+
let files = (await (0, fast_glob_1.default)([pattern], { ignore: ['**/node_modules/**', '**/.git/**'], cwd, dot: true }))
|
|
14
|
+
.filter((filePathRelative) => applyFilter(filePathRelative, findFilter))
|
|
15
|
+
.map((filePathRelative) => path_1.default.join(cwd, filePathRelative));
|
|
16
|
+
files = await filterGitIgnoredFiles(files);
|
|
17
|
+
return files;
|
|
18
|
+
}
|
|
19
|
+
exports.findFiles = findFiles;
|
|
20
|
+
async function filterGitIgnoredFiles(files) {
|
|
21
|
+
if (!gitFiles) {
|
|
22
|
+
const stdout1 = await (0, runCommand_1.runCommand)('git ls-files', { cwd });
|
|
23
|
+
// Also include untracked files.
|
|
24
|
+
// - In other words, we remove git ignored files. (Staged files are tracked and listed by `$ git ls-files`.)
|
|
25
|
+
// - `git ls-files --others --exclude-standard` from https://stackoverflow.com/questions/3801321/git-list-only-untracked-files-also-custom-commands/3801554#3801554
|
|
26
|
+
const stdout2 = await (0, runCommand_1.runCommand)('git ls-files --others --exclude-standard', { cwd });
|
|
27
|
+
gitFiles = [...stdout1.split(' '), ...stdout2.split(' ')].map((filePathRelative) => path_1.default.join(cwd, filePathRelative));
|
|
28
|
+
}
|
|
29
|
+
const filesFiltered = files.filter((file) => gitFiles.includes(file));
|
|
30
|
+
return filesFiltered;
|
|
31
|
+
}
|
|
32
|
+
function applyFilter(filePathRelative, findFilter) {
|
|
33
|
+
if (!findFilter) {
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
const { terms, exclude } = findFilter;
|
|
37
|
+
for (const term of terms) {
|
|
38
|
+
if (!filePathRelative.includes(term) && !exclude) {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
if (filePathRelative.includes(term) && exclude) {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function humanizeTime(milliseconds: number): string;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.humanizeTime = void 0;
|
|
4
|
+
function humanizeTime(milliseconds) {
|
|
5
|
+
const seconds = milliseconds / 1000;
|
|
6
|
+
if (seconds < 120) {
|
|
7
|
+
return `${round(seconds)} seconds`;
|
|
8
|
+
}
|
|
9
|
+
const minutes = seconds / 60;
|
|
10
|
+
return `${round(minutes)} minutes`;
|
|
11
|
+
}
|
|
12
|
+
exports.humanizeTime = humanizeTime;
|
|
13
|
+
function round(n) {
|
|
14
|
+
return n.toFixed(1);
|
|
15
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./sleep"), exports);
|
|
18
|
+
__exportStar(require("./runCommand"), exports);
|
|
19
|
+
__exportStar(require("./assert"), exports);
|
|
20
|
+
__exportStar(require("./humanizeTime"), exports);
|
|
21
|
+
__exportStar(require("./isTTY"), exports);
|
|
22
|
+
__exportStar(require("./findFiles"), exports);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const isTTY: boolean;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isTTY = void 0;
|
|
4
|
+
// https://stackoverflow.com/questions/34570452/node-js-stdout-clearline-and-cursorto-functions#comment80319576_34570694
|
|
5
|
+
exports.isTTY = !!process.stdout.clearLine;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.projectInfo = void 0;
|
|
4
|
+
exports.projectInfo = {
|
|
5
|
+
projectName: '@brillout/test-e2e',
|
|
6
|
+
npmPackageName: '@brillout/test-e2e',
|
|
7
|
+
githubRepository: 'https://github.com/brillout/test-e2e'
|
|
8
|
+
};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runCommand = void 0;
|
|
4
|
+
const child_process_1 = require("child_process");
|
|
5
|
+
function runCommand(cmd, { swallowError, timeout = 5000, cwd } = {}) {
|
|
6
|
+
const { promise, resolvePromise } = genPromise();
|
|
7
|
+
const t = setTimeout(() => {
|
|
8
|
+
console.error(`Command call \`${cmd}\` timeout [${timeout / 1000} seconds][${cwd}].`);
|
|
9
|
+
process.exit(1);
|
|
10
|
+
}, timeout);
|
|
11
|
+
const options = { cwd };
|
|
12
|
+
(0, child_process_1.exec)(cmd, options, (err, stdout, stderr) => {
|
|
13
|
+
clearTimeout(t);
|
|
14
|
+
if (err || stderr) {
|
|
15
|
+
if (swallowError) {
|
|
16
|
+
resolvePromise('SWALLOWED_ERROR');
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
if (stdout) {
|
|
20
|
+
console.log(stdout);
|
|
21
|
+
}
|
|
22
|
+
if (stderr) {
|
|
23
|
+
console.error(stderr);
|
|
24
|
+
}
|
|
25
|
+
if (err) {
|
|
26
|
+
console.error(err);
|
|
27
|
+
}
|
|
28
|
+
throw new Error(`Command \`${cmd}\` failed [cwd: ${cwd}]`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
resolvePromise(stdout);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
return promise;
|
|
36
|
+
}
|
|
37
|
+
exports.runCommand = runCommand;
|
|
38
|
+
function genPromise() {
|
|
39
|
+
let resolvePromise;
|
|
40
|
+
let rejectPromise;
|
|
41
|
+
const promise = new Promise((resolve, reject) => {
|
|
42
|
+
resolvePromise = resolve;
|
|
43
|
+
rejectPromise = reject;
|
|
44
|
+
});
|
|
45
|
+
return { promise, resolvePromise, rejectPromise };
|
|
46
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@brillout/test-e2e",
|
|
3
|
+
"version": "0.1.3",
|
|
4
|
+
"bin": "./bin.js",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"// === Dev ===": "",
|
|
8
|
+
"dev": "tsc --watch --project ./tsconfig.dev.json",
|
|
9
|
+
"// === Build ===": "",
|
|
10
|
+
"build": "rm -rf dist/ && tsc",
|
|
11
|
+
"// === Release ===": "",
|
|
12
|
+
"prepublishOnly": "pnpm run build",
|
|
13
|
+
"release": "npm version patch && npm publish && git push && git push --tags"
|
|
14
|
+
},
|
|
15
|
+
"dependencies": {
|
|
16
|
+
"@brillout/part-regex": "^0.1.2",
|
|
17
|
+
"@types/chai": "^4.3.3",
|
|
18
|
+
"@types/node": "^15.6.1",
|
|
19
|
+
"@types/node-fetch": "^2.5.12",
|
|
20
|
+
"chai": "^4.3.6",
|
|
21
|
+
"esbuild": "^0.15.9",
|
|
22
|
+
"fast-glob": "^3.2.12",
|
|
23
|
+
"kolorist": "^1.4.1",
|
|
24
|
+
"node-fetch": "^2.6.1",
|
|
25
|
+
"playwright-chromium": "^1.22.2",
|
|
26
|
+
"source-map-support": "^0.5.21",
|
|
27
|
+
"strip-ansi": "^6.0.1",
|
|
28
|
+
"typescript": "^4.8.3"
|
|
29
|
+
},
|
|
30
|
+
"repository": "github:brillout/test-e2e",
|
|
31
|
+
"files": [
|
|
32
|
+
"dist/"
|
|
33
|
+
],
|
|
34
|
+
"publishConfig": {
|
|
35
|
+
"access": "public"
|
|
36
|
+
}
|
|
37
|
+
}
|