@spscommerce/e2e-core 2.6.1 → 2.9.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/.dockerignore +4 -2
- package/.env +1 -0
- package/.husky/commit-msg +1 -0
- package/.husky/pre-commit +1 -0
- package/Dockerfile +3 -3
- package/README.md +3 -2
- package/commitlint.config.js +1 -0
- package/eslint.config.mjs +28 -22
- package/lib/globalSetup.js +35 -14
- package/lib/globalSetup.js.map +1 -1
- package/lib/loggerSetup.js +3 -3
- package/lib/loggerSetup.js.map +1 -1
- package/package.json +25 -8
- package/pnpm-workspace.yaml +1 -0
- package/src/globalSetup.ts +18 -5
- package/.yarnrc.yml +0 -1
package/.dockerignore
CHANGED
package/.env
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
pnpm commitlint --edit $1
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
npx lint-staged --allow-empty
|
package/Dockerfile
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
FROM mcr.microsoft.com/playwright:v1.
|
|
1
|
+
FROM mcr.microsoft.com/playwright:v1.58.2-noble
|
|
2
2
|
|
|
3
3
|
ARG BROWSER
|
|
4
4
|
|
|
5
5
|
RUN mkdir e2e
|
|
6
6
|
WORKDIR /e2e
|
|
7
7
|
COPY . .
|
|
8
|
-
RUN corepack enable && corepack prepare
|
|
9
|
-
RUN
|
|
8
|
+
RUN corepack enable && corepack prepare pnpm@10.32.1 --activate
|
|
9
|
+
RUN pnpm i
|
|
10
10
|
RUN if [ "$BROWSER" = "edge" ]; then npx playwright install msedge --only-shell ; fi
|
|
11
11
|
RUN if [ "$BROWSER" = "chrome" ]; then npx playwright install chrome --only-shell ; fi
|
package/README.md
CHANGED
|
@@ -120,7 +120,8 @@ ARG BROWSER
|
|
|
120
120
|
RUN mkdir e2e
|
|
121
121
|
WORKDIR /e2e
|
|
122
122
|
COPY . .
|
|
123
|
-
RUN
|
|
123
|
+
RUN corepack enable && corepack prepare pnpm@10.28.0 --activate
|
|
124
|
+
RUN pnpm i
|
|
124
125
|
RUN if [ "$BROWSER" = "edge" ]; then npx playwright install msedge; fi
|
|
125
126
|
RUN if [ "$BROWSER" = "chrome" ]; then npx playwright install chrome; fi
|
|
126
127
|
```
|
|
@@ -129,7 +130,7 @@ RUN if [ "$BROWSER" = "chrome" ]; then npx playwright install chrome; fi
|
|
|
129
130
|
> You can find exact version here: https://mcr.microsoft.com/en-us/product/playwright/tags
|
|
130
131
|
|
|
131
132
|
## Publish package
|
|
132
|
-
If you want to publish your package to the npm registry and have changed any files from `src` folder, you must build the package first. Run the following command: `
|
|
133
|
+
If you want to publish your package to the npm registry and have changed any files from `src` folder, you must build the package first. Run the following command: `pnpm build`.
|
|
133
134
|
After that, push changed files from the `lib` and `src` folders to your PR. You need to follow the [pattern](https://gist.github.com/joshbuchea/6f47e86d2510bce28f8e7f42ae84c716) of the semantic commit messages (should begin from __fix:__ or __feat:__), like:
|
|
134
135
|
```
|
|
135
136
|
fix: Update Dockerfile to restore build process
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
module.exports = { extends: ['@commitlint/config-conventional'] };
|
package/eslint.config.mjs
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import globals from 'globals';
|
|
2
2
|
import path from 'node:path';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import {fileURLToPath} from 'node:url';
|
|
4
|
+
import {defineConfig, globalIgnores} from 'eslint/config';
|
|
5
5
|
|
|
6
6
|
import tsParser from '@typescript-eslint/parser';
|
|
7
7
|
import typescriptEslint from '@typescript-eslint/eslint-plugin';
|
|
8
8
|
import js from '@eslint/js';
|
|
9
|
-
import {
|
|
9
|
+
import {FlatCompat} from '@eslint/eslintrc';
|
|
10
10
|
|
|
11
11
|
const __filename = fileURLToPath(import.meta.url);
|
|
12
12
|
const __dirname = path.dirname(__filename);
|
|
@@ -14,25 +14,31 @@ const compat = new FlatCompat({
|
|
|
14
14
|
baseDirectory: __dirname, recommendedConfig: js.configs.recommended, allConfig: js.configs.all
|
|
15
15
|
});
|
|
16
16
|
|
|
17
|
-
export default defineConfig([
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
17
|
+
export default defineConfig([
|
|
18
|
+
globalIgnores([
|
|
19
|
+
"node_modules/*",
|
|
20
|
+
"lib/*"
|
|
21
|
+
]),
|
|
22
|
+
{
|
|
23
|
+
languageOptions: {
|
|
24
|
+
globals: {
|
|
25
|
+
...globals.browser,
|
|
26
|
+
...globals.amd,
|
|
27
|
+
...globals.node,
|
|
28
|
+
},
|
|
29
|
+
parser: tsParser,
|
|
30
|
+
ecmaVersion: 12,
|
|
31
|
+
sourceType: "module",
|
|
32
|
+
parserOptions: {},
|
|
23
33
|
},
|
|
24
|
-
parser: tsParser,
|
|
25
|
-
ecmaVersion: 12,
|
|
26
|
-
sourceType: "module",
|
|
27
|
-
parserOptions: {},
|
|
28
|
-
},
|
|
29
34
|
|
|
30
|
-
|
|
35
|
+
extends: compat.extends("eslint:recommended", "plugin:@typescript-eslint/recommended"),
|
|
31
36
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
}
|
|
37
|
+
plugins: {
|
|
38
|
+
"@typescript-eslint": typescriptEslint,
|
|
39
|
+
},
|
|
40
|
+
rules: {
|
|
41
|
+
"@typescript-eslint/no-require-imports": "off",
|
|
42
|
+
},
|
|
43
|
+
}
|
|
44
|
+
]);
|
package/lib/globalSetup.js
CHANGED
|
@@ -15,18 +15,28 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
|
|
|
15
15
|
}) : function(o, v) {
|
|
16
16
|
o["default"] = v;
|
|
17
17
|
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
};
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
25
35
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
37
|
};
|
|
28
|
-
var _a;
|
|
29
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.default = globalSetup;
|
|
30
40
|
const fs_1 = __importDefault(require("fs"));
|
|
31
41
|
const path_1 = __importDefault(require("path"));
|
|
32
42
|
const test_1 = require("@playwright/test");
|
|
@@ -43,7 +53,7 @@ async function globalSetup() {
|
|
|
43
53
|
// Set something up once before running auth flow
|
|
44
54
|
if (process.env.SETUP_PATH) {
|
|
45
55
|
if (fs_1.default.existsSync(process.env.SETUP_PATH)) {
|
|
46
|
-
await (
|
|
56
|
+
await Promise.resolve(`${process.env.SETUP_PATH}`).then(s => __importStar(require(s)));
|
|
47
57
|
}
|
|
48
58
|
else {
|
|
49
59
|
throw new Error(`Provided SETUP_PATH was not found.`);
|
|
@@ -58,10 +68,22 @@ async function globalSetup() {
|
|
|
58
68
|
traceFile = path_1.default.join(process.cwd(), 'results-e2e/auth/globalSetupProd.zip');
|
|
59
69
|
}
|
|
60
70
|
// Launch browser and log in if storageState.json does not exist OR auth expires soon
|
|
61
|
-
|
|
62
|
-
if (!fs_1.default.existsSync(storageFile)
|
|
63
|
-
|
|
64
|
-
|
|
71
|
+
let requireAuth = false;
|
|
72
|
+
if (!fs_1.default.existsSync(storageFile)) {
|
|
73
|
+
requireAuth = true;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
const storage = JSON.parse(fs_1.default.readFileSync(storageFile, 'utf8'));
|
|
77
|
+
const openIdProfile = storage.origins[0].localStorage.find(item => item.name.includes('openid profile email offline_access'));
|
|
78
|
+
const openIdData = JSON.parse(openIdProfile.value);
|
|
79
|
+
const expiresAt = (parseFloat(openIdData.expiresAt) || 0) * 1000; // identity refresh token lives 1 hour
|
|
80
|
+
const currentTS = new Date().getTime();
|
|
81
|
+
if (((expiresAt - currentTS) / 60000) < 10) {
|
|
82
|
+
// less than 10 minutes
|
|
83
|
+
requireAuth = true;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (requireAuth) {
|
|
65
87
|
const browser = await test_1.chromium.launch({ headless: false }); // { headless: false }
|
|
66
88
|
const context = await browser.newContext({ ignoreHTTPSErrors: true });
|
|
67
89
|
await context.grantPermissions(['local-network-access']);
|
|
@@ -99,5 +121,4 @@ async function globalSetup() {
|
|
|
99
121
|
}
|
|
100
122
|
return;
|
|
101
123
|
}
|
|
102
|
-
exports.default = globalSetup;
|
|
103
124
|
//# sourceMappingURL=globalSetup.js.map
|
package/lib/globalSetup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"globalSetup.js","sourceRoot":"","sources":["../src/globalSetup.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"globalSetup.js","sourceRoot":"","sources":["../src/globalSetup.ts"],"names":[],"mappings":"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"}
|
package/lib/loggerSetup.js
CHANGED
|
@@ -3,7 +3,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.log =
|
|
6
|
+
exports.log = void 0;
|
|
7
|
+
exports.enableLogger = enableLogger;
|
|
8
|
+
exports.disableLogger = disableLogger;
|
|
7
9
|
const fs_1 = __importDefault(require("fs"));
|
|
8
10
|
const path_1 = __importDefault(require("path"));
|
|
9
11
|
let access;
|
|
@@ -49,7 +51,6 @@ async function enableLogger(file, page) {
|
|
|
49
51
|
});
|
|
50
52
|
return;
|
|
51
53
|
}
|
|
52
|
-
exports.enableLogger = enableLogger;
|
|
53
54
|
async function disableLogger() {
|
|
54
55
|
// Finish error writing
|
|
55
56
|
if (access) {
|
|
@@ -57,6 +58,5 @@ async function disableLogger() {
|
|
|
57
58
|
}
|
|
58
59
|
return;
|
|
59
60
|
}
|
|
60
|
-
exports.disableLogger = disableLogger;
|
|
61
61
|
exports.log = console.log.bind(console);
|
|
62
62
|
//# sourceMappingURL=loggerSetup.js.map
|
package/lib/loggerSetup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loggerSetup.js","sourceRoot":"","sources":["../src/loggerSetup.ts"],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"loggerSetup.js","sourceRoot":"","sources":["../src/loggerSetup.ts"],"names":[],"mappings":";;;;;;AAMA,oCA8CC;AAED,sCAMC;AA5DD,4CAAoB;AACpB,gDAAwB;AAGxB,IAAI,MAAsB,CAAC;AAEpB,KAAK,UAAU,YAAY,CAAC,IAAc,EAAE,IAAU;IACzD,QAAQ;IACR,IAAI;IACJ,8CAA8C;IAC9C,0CAA0C;IAC1C,yBAAyB;IACzB,4DAA4D;IAC5D,IAAI;IACJ,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACtB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,QAAQ,GAAG,GAAG,KAAK,IAAI,IAAI,EAAE,CAAC;IACpC,MAAM,eAAe,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,kBAAkB,CAAC,CAAC;IAErE,2CAA2C;IAC3C,YAAE,CAAC,SAAS,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEnD,kDAAkD;IAClD,MAAM,GAAG,YAAE,CAAC,iBAAiB,CAAC,GAAG,eAAe,IAAI,QAAQ,MAAM,CAAC,CAAA;IACnE,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAExE,wFAAwF;IACxF,OAAO,CAAC,GAAG,CAAC;qCACqB,OAAO,CAAC,GAAG,CAAC,SAAS,aAAa,IAAI,EAAE,CAAC,CAAC;IAE3E,oBAAoB;IACpB,IAAI;SACC,EAAE,CAAC,SAAS,EAAE,KAAK,EAAC,OAAO,EAAC,EAAE;QAC3B,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,OAAO,EAAE,CAAC;YAC7B,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,gBAAgB,EAAE,CAAC;gBACtC,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE;oBAC5B,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;YAC3C,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,kBAAkB,OAAO,CAAC,IAAI,EAAE,KAAK,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACvE,CAAC;IACL,CAAC,CAAC;SACD,EAAE,CAAC,eAAe,EAAE,OAAO,CAAC,EAAE,CAC3B,OAAO,CAAC,GAAG,CAAC,qBAAqB,OAAO,CAAC,OAAO,EAAE,CAAC,SAAS,KAAK,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;SACrF,EAAE,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE;QACrB,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAC/D,CAAC,CAAC;SACD,EAAE,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,EAAE;QACzB,IAAI,QAAQ,CAAC,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,uBAAuB,QAAQ,CAAC,MAAM,EAAE,KAAK,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC/E,CAAC;IACL,CAAC,CAAC,CAAA;IACN,OAAO;AACX,CAAC;AAEM,KAAK,UAAU,aAAa;IAC/B,uBAAuB;IACvB,IAAI,MAAM,EAAE,CAAC;QACT,MAAM,CAAC,GAAG,EAAE,CAAC;IACjB,CAAC;IACD,OAAO;AACX,CAAC;AAEY,QAAA,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,13 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@spscommerce/e2e-core",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.9.0",
|
|
4
4
|
"description": "An automation test framework which is based on Playwright.",
|
|
5
5
|
"main": "./lib/index.js",
|
|
6
6
|
"types": "./lib/index.d.ts",
|
|
7
|
+
"engines": {
|
|
8
|
+
"node": ">=24"
|
|
9
|
+
},
|
|
7
10
|
"scripts": {
|
|
11
|
+
"clean": "find . -name 'node_modules' -type d -prune -exec rm -rf '{}' + && wait && rm -rf ./build",
|
|
12
|
+
"reset": "pnpm clean && pnpm store prune",
|
|
8
13
|
"lint": "eslint .",
|
|
9
14
|
"build": "tsc --incremental -p tsconfig.json",
|
|
10
|
-
"test": "CONFIG_PATH=$(pwd)/.env HEADLESS=false playwright test"
|
|
15
|
+
"test": "CONFIG_PATH=$(pwd)/.env HEADLESS=false playwright test",
|
|
16
|
+
"prepare": "husky || true"
|
|
11
17
|
},
|
|
12
18
|
"repository": {
|
|
13
19
|
"type": "git",
|
|
@@ -25,16 +31,27 @@
|
|
|
25
31
|
"author": "SPS Commerce",
|
|
26
32
|
"license": "UNLICENSED",
|
|
27
33
|
"dependencies": {
|
|
28
|
-
"@playwright/test": "1.
|
|
29
|
-
"@types/node": "
|
|
34
|
+
"@playwright/test": "1.58.2",
|
|
35
|
+
"@types/node": "25.0.6",
|
|
30
36
|
"@typescript-eslint/eslint-plugin": "8.49.0",
|
|
31
37
|
"@typescript-eslint/parser": "8.49.0",
|
|
32
|
-
"dotenv": "
|
|
33
|
-
"eslint": "9.39.
|
|
38
|
+
"dotenv": "17.3.1",
|
|
39
|
+
"eslint": "9.39.4",
|
|
34
40
|
"jest-expect-message": "1.1.3",
|
|
35
41
|
"jest-extended": "1.2.1",
|
|
36
42
|
"playwright-testrail-reporter": "1.3.3",
|
|
37
|
-
"typescript": "
|
|
43
|
+
"typescript": "5.9.3"
|
|
44
|
+
},
|
|
45
|
+
"packageManager": "pnpm@10.32.1+sha512.a706938f0e89ac1456b6563eab4edf1d1faf3368d1191fc5c59790e96dc918e4456ab2e67d613de1043d2e8c81f87303e6b40d4ffeca9df15ef1ad567348f2be",
|
|
46
|
+
"devDependencies": {
|
|
47
|
+
"@commitlint/cli": "20.5.0",
|
|
48
|
+
"@commitlint/config-conventional": "20.5.0",
|
|
49
|
+
"husky": "9.1.7",
|
|
50
|
+
"lint-staged": "16.4.0"
|
|
38
51
|
},
|
|
39
|
-
"
|
|
52
|
+
"lint-staged": {
|
|
53
|
+
"*.ts": [
|
|
54
|
+
"eslint --max-warnings=0 --no-warn-ignored --fix"
|
|
55
|
+
]
|
|
56
|
+
}
|
|
40
57
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
nodeLinker: hoisted
|
package/src/globalSetup.ts
CHANGED
|
@@ -28,11 +28,24 @@ export default async function globalSetup(): Promise<void> {
|
|
|
28
28
|
traceFile = path.join(process.cwd(), 'results-e2e/auth/globalSetupProd.zip');
|
|
29
29
|
}
|
|
30
30
|
// Launch browser and log in if storageState.json does not exist OR auth expires soon
|
|
31
|
-
|
|
32
|
-
if (!fs.existsSync(storageFile)
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
31
|
+
let requireAuth = false;
|
|
32
|
+
if (!fs.existsSync(storageFile)) {
|
|
33
|
+
requireAuth = true;
|
|
34
|
+
} else {
|
|
35
|
+
const storage = JSON.parse(fs.readFileSync(storageFile, 'utf8'));
|
|
36
|
+
const openIdProfile = storage.origins[0].localStorage.find(item =>
|
|
37
|
+
item.name.includes('openid profile email offline_access'),
|
|
38
|
+
);
|
|
39
|
+
const openIdData = JSON.parse(openIdProfile.value);
|
|
40
|
+
const expiresAt = (parseFloat(openIdData.expiresAt) || 0) * 1000; // identity refresh token lives 1 hour
|
|
41
|
+
const currentTS = new Date().getTime();
|
|
42
|
+
if (((expiresAt - currentTS) / 60000) < 10) {
|
|
43
|
+
// less than 10 minutes
|
|
44
|
+
requireAuth = true;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if (requireAuth) {
|
|
36
49
|
const browser = await chromium.launch({ headless: false }); // { headless: false }
|
|
37
50
|
const context = await browser.newContext({ ignoreHTTPSErrors: true });
|
|
38
51
|
await context.grantPermissions(['local-network-access']);
|
package/.yarnrc.yml
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
nodeLinker: node-modules
|