@spscommerce/e2e-core 2.8.0 → 2.10.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 CHANGED
@@ -3,6 +3,7 @@
3
3
  # White list the required files
4
4
  !package.json
5
5
  !pnpm-lock.yaml
6
+ !pnpm-workspace.yaml
6
7
  !.npmrc
7
8
  !playwright.config.js
8
9
  !tsconfig.json
package/Dockerfile CHANGED
@@ -1,11 +1,11 @@
1
- FROM mcr.microsoft.com/playwright:v1.57.0-noble
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 pnpm@10.28.0 --activate
8
+ RUN corepack enable && corepack prepare pnpm@10.32.1 --activate
9
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
@@ -68,10 +68,22 @@ async function globalSetup() {
68
68
  traceFile = path_1.default.join(process.cwd(), 'results-e2e/auth/globalSetupProd.zip');
69
69
  }
70
70
  // Launch browser and log in if storageState.json does not exist OR auth expires soon
71
- const currentTS = new Date().getTime();
72
- if (!fs_1.default.existsSync(storageFile) ||
73
- (fs_1.default.existsSync(storageFile) &&
74
- ((JSON.parse(fs_1.default.readFileSync(storageFile, 'utf8')).origins[0].localStorage.find(o => o.name === 'expires_at').value - currentTS) / 60000) < 30)) {
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) {
75
87
  const browser = await test_1.chromium.launch({ headless: false }); // { headless: false }
76
88
  const context = await browser.newContext({ ignoreHTTPSErrors: true });
77
89
  await context.grantPermissions(['local-network-access']);
@@ -1 +1 @@
1
- {"version":3,"file":"globalSetup.js","sourceRoot":"","sources":["../src/globalSetup.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"globalSetup.js","sourceRoot":"","sources":["../src/globalSetup.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,10 +1,15 @@
1
1
  {
2
2
  "name": "@spscommerce/e2e-core",
3
- "version": "2.8.0",
3
+ "version": "2.10.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 . -type d \\( -name 'node_modules' -o -name 'results-e2e*' \\) -prune -exec rm -rf {} +",
12
+ "reset": "pnpm clean && pnpm store prune",
8
13
  "lint": "eslint .",
9
14
  "build": "tsc --incremental -p tsconfig.json",
10
15
  "test": "CONFIG_PATH=$(pwd)/.env HEADLESS=false playwright test",
@@ -26,23 +31,23 @@
26
31
  "author": "SPS Commerce",
27
32
  "license": "UNLICENSED",
28
33
  "dependencies": {
29
- "@playwright/test": "1.57.0",
34
+ "@playwright/test": "1.58.2",
30
35
  "@types/node": "25.0.6",
31
36
  "@typescript-eslint/eslint-plugin": "8.49.0",
32
37
  "@typescript-eslint/parser": "8.49.0",
33
- "dotenv": "17.2.3",
34
- "eslint": "9.39.2",
38
+ "dotenv": "17.3.1",
39
+ "eslint": "9.39.4",
35
40
  "jest-expect-message": "1.1.3",
36
41
  "jest-extended": "1.2.1",
37
42
  "playwright-testrail-reporter": "1.3.3",
38
43
  "typescript": "5.9.3"
39
44
  },
40
- "packageManager": "pnpm@10.28.0+sha512.05df71d1421f21399e053fde567cea34d446fa02c76571441bfc1c7956e98e363088982d940465fd34480d4d90a0668bc12362f8aa88000a64e83d0b0e47be48",
45
+ "packageManager": "pnpm@10.32.1+sha512.a706938f0e89ac1456b6563eab4edf1d1faf3368d1191fc5c59790e96dc918e4456ab2e67d613de1043d2e8c81f87303e6b40d4ffeca9df15ef1ad567348f2be",
41
46
  "devDependencies": {
42
- "@commitlint/cli": "^20.3.0",
43
- "@commitlint/config-conventional": "^20.3.0",
44
- "husky": "^9.1.7",
45
- "lint-staged": "^16.2.7"
47
+ "@commitlint/cli": "20.5.0",
48
+ "@commitlint/config-conventional": "20.5.0",
49
+ "husky": "9.1.7",
50
+ "lint-staged": "16.4.0"
46
51
  },
47
52
  "lint-staged": {
48
53
  "*.ts": [
@@ -0,0 +1 @@
1
+ nodeLinker: hoisted
@@ -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
- const currentTS = new Date().getTime();
32
- if (!fs.existsSync(storageFile) ||
33
- (fs.existsSync(storageFile) &&
34
- ((JSON.parse(fs.readFileSync(storageFile, 'utf8')).origins[0].localStorage.find(o => o.name === 'expires_at').value - currentTS) / 60000) < 30)
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']);