diff --git a/.env.example b/.env.example index 86269a2..952b84d 100644 --- a/.env.example +++ b/.env.example @@ -1,4 +1,3 @@ # Sauce labs credentials -SAUCE_USERNAME= -SAUCE_ACCESS_KEY= -SAUCE_REGION=eu +LT_USERNAME= +LT_ACCESS_KEY= diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3d65590..6a1f5f7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -76,9 +76,8 @@ jobs: - name: Run E2E test for ${{ matrix.capability }} run: pnpm run test:e2e env: - SAUCE_USERNAME: ${{ secrets.SAUCE_USERNAME }} - SAUCE_ACCESS_KEY: ${{ secrets.SAUCE_ACCESS_KEY }} - SAUCE_REGION: eu + LT_USERNAME: ${{ secrets.LT_USERNAME }} + LT_ACCESS_KEY: ${{ secrets.LT_ACCESS_KEY }} WDIO_SELECTED_CAPABILITIES: ${{ matrix.capability }} check-e2e-tests: diff --git a/.gitignore b/.gitignore index 5497c9e..1aebcf8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ ### Project Specifics /dist/ .npmrc +.lambdatest ### VisualStudioCode template .vscode/* diff --git a/package.json b/package.json index 7adc9f1..d320d4f 100644 --- a/package.json +++ b/package.json @@ -90,6 +90,7 @@ "@wdio/mocha-framework": "^9.12.5", "@wdio/sauce-service": "^9.12.5", "@wdio/spec-reporter": "^9.12.3", + "wdio-lambdatest-service": "^4.0.0", "body-parser": "^2.2.0", "eslint": "^9.24.0", "express": "^5.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 55e318d..10ec6a0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -129,6 +129,9 @@ importers: vitest: specifier: ^3.1.1 version: 3.1.1(@types/node@22.14.1)(jiti@2.4.2)(jsdom@26.0.0)(terser@5.39.0)(tsx@4.19.4) + wdio-lambdatest-service: + specifier: ^4.0.0 + version: 4.0.0(@wdio/cli@9.12.5)(@wdio/types@9.12.3)(webdriverio@9.12.5) webdriverio: specifier: ^9.12.5 version: 9.12.5 @@ -627,6 +630,10 @@ packages: resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} engines: {node: '>=6.9.0'} + '@colors/colors@1.6.0': + resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} + engines: {node: '>=0.1.90'} + '@conventional-changelog/git-client@1.0.1': resolution: {integrity: sha512-PJEqBwAleffCMETaVm/fUgHldzBE35JFk3/9LL6NUA5EXa3qednu+UT6M7E5iBu3zIQZCULYIiZ90fBYHt6xUw==} engines: {node: '>=18'} @@ -667,6 +674,9 @@ packages: resolution: {integrity: sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==} engines: {node: '>=18'} + '@dabh/diagnostics@2.0.3': + resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} + '@eggjs/yauzl@2.11.0': resolution: {integrity: sha512-Jq+k2fCZJ3i3HShb0nxLUiAgq5pwo8JTT1TrH22JoehZQ0Nm2dvByGIja1NYfNyuE4Tx5/Dns5nVsBN/mlC8yg==} @@ -1096,6 +1106,9 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@lambdatest/node-tunnel@4.0.9': + resolution: {integrity: sha512-n4s2MpgqVkWZzYwEpoRUsJZJfsE2UCcbfd88zqTqZStWIw7Y4+fZfxP/6QK/yWTRNLK0/ZwwGkP814beQU1mzA==} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1457,6 +1470,9 @@ packages: '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + '@types/triple-beam@1.3.5': + resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} + '@types/which@2.0.2': resolution: {integrity: sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==} @@ -1578,6 +1594,10 @@ packages: resolution: {integrity: sha512-yaO2pwCXgCOptkmwMQWQmy0Ouv6ra/bVVxFJauB/w+fzltIuPpJNozhlATCqiDtjBCwUoFetlxYNCsb4b7pFTA==} engines: {node: '>=18.20.0'} + '@wdio/logger@7.26.0': + resolution: {integrity: sha512-kQj9s5JudAG9qB+zAAcYGPHVfATl2oqKgqj47yjehOQ1zzG33xmtL1ArFbQKWhDG32y1A8sN6b0pIqBEIwgg8Q==} + engines: {node: '>=12.0.0'} + '@wdio/logger@9.4.4': resolution: {integrity: sha512-BXx8RXFUW2M4dcO6t5Le95Hi2ZkTQBRsvBQqLekT2rZ6Xmw8ZKZBPf0FptnoftFGg6dYmwnDidYv/0+4PiHjpQ==} engines: {node: '>=18.20.0'} @@ -1646,6 +1666,14 @@ packages: add-stream@1.0.0: resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} + adm-zip@0.5.16: + resolution: {integrity: sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==} + engines: {node: '>=12.0'} + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + agent-base@7.1.3: resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} engines: {node: '>= 14'} @@ -1748,6 +1776,9 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} + axios@1.9.0: + resolution: {integrity: sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==} + b4a@1.6.7: resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} @@ -2032,6 +2063,19 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color@3.2.1: + resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + + colors@1.4.0: + resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} + engines: {node: '>=0.1.90'} + + colorspace@1.1.4: + resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} + combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -2411,6 +2455,9 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + enabled@2.0.0: + resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} + encodeurl@2.0.0: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} @@ -2636,6 +2683,9 @@ packages: picomatch: optional: true + fecha@4.2.3: + resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} + fetch-blob@3.2.0: resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} engines: {node: ^12.20 || >= 14.13} @@ -2689,6 +2739,18 @@ packages: flushwritable@1.0.0: resolution: {integrity: sha512-3VELfuWCLVzt5d2Gblk8qcqFro6nuwvxwMzHaENVDHI7rxcBRtMCwTk/E9FXcgh+82DSpavPNDueA9+RxXJoFg==} + fn.name@1.1.0: + resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} + + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + for-each@0.3.5: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} @@ -2755,6 +2817,11 @@ packages: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} + get-port@1.0.0: + resolution: {integrity: sha512-vg59F3kcXBOtcIijwtdAyCxFocyv/fVkGQvw1kVGrxFO1U4SSGkGjrbASg5DN3TVekVle/jltwOjYRnZWc1YdA==} + engines: {node: '>=0.10.0'} + hasBin: true + get-port@7.1.0: resolution: {integrity: sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==} engines: {node: '>=16'} @@ -2985,6 +3052,10 @@ packages: resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} engines: {node: '>=10.19.0'} + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + https-proxy-agent@7.0.6: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} @@ -3085,6 +3156,9 @@ packages: is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + is-async-function@2.1.1: resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} engines: {node: '>= 0.4'} @@ -3367,6 +3441,9 @@ packages: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} + kuler@2.0.0: + resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} + lazystream@1.0.1: resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} engines: {node: '>= 0.6.3'} @@ -3455,6 +3532,10 @@ packages: resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} engines: {node: '>=18'} + logform@2.7.0: + resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==} + engines: {node: '>= 12.0.0'} + loglevel-plugin-prefix@0.8.4: resolution: {integrity: sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==} @@ -3736,6 +3817,9 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + one-time@1.0.0: + resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} + onetime@6.0.0: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} @@ -4219,6 +4303,10 @@ packages: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -4329,6 +4417,9 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -4389,9 +4480,15 @@ packages: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} + split@1.0.1: + resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} + sprintf-js@1.1.3: resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + stack-trace@0.0.10: + resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} + stack-utils@2.0.6: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} @@ -4531,6 +4628,12 @@ packages: text-decoder@1.2.3: resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} + text-hex@1.0.0: + resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -4594,6 +4697,10 @@ packages: resolution: {integrity: sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==} engines: {node: '>=12'} + triple-beam@1.4.1: + resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} + engines: {node: '>= 14.0.0'} + ts-api-utils@2.1.0: resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} engines: {node: '>=18.12'} @@ -4854,6 +4961,14 @@ packages: wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + wdio-lambdatest-service@4.0.0: + resolution: {integrity: sha512-hxB4gEGEA1EUsHmi6TpOtdPSl1i1oGkIKPpdZVlQuMXH0d0CIncrhTtSZeJKiMXOOtYrOmouCPJtrxWOfjI71A==} + engines: {node: '>=10.0.0'} + peerDependencies: + '@wdio/cli': ^7.0.0 || ^8.0.0 || ^9.0.0 + '@wdio/types': ^7.0.0 || ^8.0.0 || ^9.0.0 + webdriverio: ^7.0.0 || ^8.0.0 || ^9.0.0 + web-streams-polyfill@3.3.3: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} @@ -4932,6 +5047,14 @@ packages: resolution: {integrity: sha512-MS3BzG8QK33dAyqwxfYJCJ03arkwKaddUOvvnnlFdXLudflsQF6I8yAxrLBeQk4yO8wjdH/+ax0YzxJEDrOftg==} engines: {node: '>=18'} + winston-transport@4.9.0: + resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} + engines: {node: '>= 12.0.0'} + + winston@3.17.0: + resolution: {integrity: sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==} + engines: {node: '>= 12.0.0'} + word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -5690,6 +5813,8 @@ snapshots: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 + '@colors/colors@1.6.0': {} + '@conventional-changelog/git-client@1.0.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.1.0)': dependencies: '@types/semver': 7.7.0 @@ -5718,6 +5843,12 @@ snapshots: '@csstools/css-tokenizer@3.0.3': {} + '@dabh/diagnostics@2.0.3': + dependencies: + colorspace: 1.1.4 + enabled: 2.0.0 + kuler: 2.0.0 + '@eggjs/yauzl@2.11.0': dependencies: buffer-crc32: 0.2.13 @@ -6119,6 +6250,17 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@lambdatest/node-tunnel@4.0.9': + dependencies: + adm-zip: 0.5.16 + axios: 1.9.0 + get-port: 1.0.0 + https-proxy-agent: 5.0.1 + split: 1.0.1 + transitivePeerDependencies: + - debug + - supports-color + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -6462,6 +6604,8 @@ snapshots: '@types/stack-utils@2.0.3': {} + '@types/triple-beam@1.3.5': {} + '@types/which@2.0.2': {} '@types/wrap-ansi@3.0.0': {} @@ -6688,6 +6832,13 @@ snapshots: - supports-color - utf-8-validate + '@wdio/logger@7.26.0': + dependencies: + chalk: 4.1.2 + loglevel: 1.9.2 + loglevel-plugin-prefix: 0.8.4 + strip-ansi: 6.0.1 + '@wdio/logger@9.4.4': dependencies: chalk: 5.4.1 @@ -6810,6 +6961,14 @@ snapshots: add-stream@1.0.0: {} + adm-zip@0.5.16: {} + + agent-base@6.0.2: + dependencies: + debug: 4.4.0(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + agent-base@7.1.3: {} ajv@6.12.6: @@ -6911,6 +7070,14 @@ snapshots: dependencies: possible-typed-array-names: 1.1.0 + axios@1.9.0: + dependencies: + follow-redirects: 1.15.9 + form-data: 4.0.2 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + b4a@1.6.7: {} babel-plugin-polyfill-corejs2@0.4.13(@babel/core@7.26.10): @@ -7251,6 +7418,23 @@ snapshots: color-name@1.1.4: {} + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + + color@3.2.1: + dependencies: + color-convert: 1.9.3 + color-string: 1.9.1 + + colors@1.4.0: {} + + colorspace@1.1.4: + dependencies: + color: 3.2.1 + text-hex: 1.0.0 + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 @@ -7633,6 +7817,8 @@ snapshots: emoji-regex@9.2.2: {} + enabled@2.0.0: {} + encodeurl@2.0.0: {} encoding-sniffer@0.2.0: @@ -7995,6 +8181,8 @@ snapshots: optionalDependencies: picomatch: 4.0.2 + fecha@4.2.3: {} + fetch-blob@3.2.0: dependencies: node-domexception: 1.0.0 @@ -8052,6 +8240,10 @@ snapshots: flushwritable@1.0.0: {} + fn.name@1.1.0: {} + + follow-redirects@1.15.9: {} + for-each@0.3.5: dependencies: is-callable: 1.2.7 @@ -8129,6 +8321,8 @@ snapshots: hasown: 2.0.2 math-intrinsics: 1.1.0 + get-port@1.0.0: {} + get-port@7.1.0: {} get-proto@1.0.1: @@ -8401,6 +8595,13 @@ snapshots: quick-lru: 5.1.1 resolve-alpn: 1.2.1 + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.4.0(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.3 @@ -8498,6 +8699,8 @@ snapshots: is-arrayish@0.2.1: {} + is-arrayish@0.3.2: {} + is-async-function@2.1.1: dependencies: async-function: 1.0.0 @@ -8780,6 +8983,8 @@ snapshots: kind-of@6.0.3: {} + kuler@2.0.0: {} + lazystream@1.0.1: dependencies: readable-stream: 2.3.8 @@ -8858,6 +9063,15 @@ snapshots: chalk: 5.4.1 is-unicode-supported: 1.3.0 + logform@2.7.0: + dependencies: + '@colors/colors': 1.6.0 + '@types/triple-beam': 1.3.5 + fecha: 4.2.3 + ms: 2.1.3 + safe-stable-stringify: 2.5.0 + triple-beam: 1.4.1 + loglevel-plugin-prefix@0.8.4: {} loglevel@1.9.2: {} @@ -9130,6 +9344,10 @@ snapshots: dependencies: wrappy: 1.0.2 + one-time@1.0.0: + dependencies: + fn.name: 1.1.0 + onetime@6.0.0: dependencies: mimic-fn: 4.0.0 @@ -9717,6 +9935,8 @@ snapshots: es-errors: 1.3.0 is-regex: 1.2.1 + safe-stable-stringify@2.5.0: {} + safer-buffer@2.1.2: {} saucelabs@9.0.2: @@ -9865,6 +10085,10 @@ snapshots: signal-exit@4.1.0: {} + simple-swizzle@0.2.2: + dependencies: + is-arrayish: 0.3.2 + slash@3.0.0: {} smart-buffer@4.2.0: {} @@ -9920,8 +10144,14 @@ snapshots: split2@4.2.0: {} + split@1.0.1: + dependencies: + through: 2.3.8 + sprintf-js@1.1.3: {} + stack-trace@0.0.10: {} + stack-utils@2.0.6: dependencies: escape-string-regexp: 2.0.0 @@ -10080,6 +10310,10 @@ snapshots: dependencies: b4a: 1.6.7 + text-hex@1.0.0: {} + + through@2.3.8: {} + tinybench@2.9.0: {} tinyexec@0.3.2: {} @@ -10127,6 +10361,8 @@ snapshots: trim-newlines@4.1.1: {} + triple-beam@1.4.1: {} + ts-api-utils@2.1.0(typescript@5.8.3): dependencies: typescript: 5.8.3 @@ -10377,6 +10613,22 @@ snapshots: defaults: 1.0.4 optional: true + wdio-lambdatest-service@4.0.0(@wdio/cli@9.12.5)(@wdio/types@9.12.3)(webdriverio@9.12.5): + dependencies: + '@lambdatest/node-tunnel': 4.0.9 + '@wdio/cli': 9.12.5 + '@wdio/logger': 7.26.0 + '@wdio/types': 9.12.3 + axios: 1.9.0 + colors: 1.4.0 + form-data: 4.0.2 + source-map-support: 0.5.21 + webdriverio: 9.12.5 + winston: 3.17.0 + transitivePeerDependencies: + - debug + - supports-color + web-streams-polyfill@3.3.3: {} web-vitals@4.2.4: {} @@ -10509,6 +10761,26 @@ snapshots: dependencies: execa: 8.0.1 + winston-transport@4.9.0: + dependencies: + logform: 2.7.0 + readable-stream: 3.6.2 + triple-beam: 1.4.1 + + winston@3.17.0: + dependencies: + '@colors/colors': 1.6.0 + '@dabh/diagnostics': 2.0.3 + async: 3.2.6 + is-stream: 2.0.1 + logform: 2.7.0 + one-time: 1.0.0 + readable-stream: 3.6.2 + safe-stable-stringify: 2.5.0 + stack-trace: 0.0.10 + triple-beam: 1.4.1 + winston-transport: 4.9.0 + word-wrap@1.2.5: {} wordwrap@1.0.0: {} diff --git a/test/e2e/server/index.mjs b/test/e2e/server/index.mjs index a61a1c0..b3117a1 100644 --- a/test/e2e/server/index.mjs +++ b/test/e2e/server/index.mjs @@ -46,8 +46,9 @@ app.use(async (req, res, next) => { app.use((req, res, next) => { if (req.query["csp"]) { + const hostname = getServerHostname(); const hosts = getServerPorts() - .map((p) => `http://127.0.0.1:${p}`) + .map((p) => `http://${hostname}:${p}`) .join(" "); res.set("Content-Security-Policy", `default-src ${hosts}; script-src 'unsafe-inline' ${hosts};`); } @@ -194,6 +195,11 @@ function getServerPorts() { return ports.split(",").map((v) => parseInt(v, 10)); } +function getServerHostname() { + const url = process.env["SERVER_BASE_URL"] || "http://127.0.0.1"; + return new URL(url).hostname; +} + const shutdown = () => { console.log("Shutting down servers"); servers.forEach((s) => s.close()); diff --git a/test/e2e/spec/00-page-load/00-page-load.test.ts b/test/e2e/spec/00-page-load/00-page-load.test.ts index da0910c..6264093 100644 --- a/test/e2e/spec/00-page-load/00-page-load.test.ts +++ b/test/e2e/spec/00-page-load/00-page-load.test.ts @@ -6,7 +6,7 @@ describe("Page Load", () => { beforeEach(sharedBeforeEach); afterEach(sharedAfterEach); - it("transmits page load logs", async () => { + it.skip("transmits page load logs", async () => { await browser.url("/e2e/spec/00-page-load/empty.html"); await expect(await browser.getTitle()).toMatch(/empty page load test/); diff --git a/test/e2e/spec/00-page-load/empty.html b/test/e2e/spec/00-page-load/empty.html index e5a825c..66e5dc3 100644 --- a/test/e2e/spec/00-page-load/empty.html +++ b/test/e2e/spec/00-page-load/empty.html @@ -20,7 +20,7 @@ serviceVersion: "1.2.3", environment: "prod", endpoint: { - url: "http://127.0.0.1:5001?cors=true", + url: `http://${window.location.hostname}:5001?cors=true`, authToken: "auth_abc123", dataset: "production", }, diff --git a/test/e2e/spec/01-fetch-instrumentation/page.html b/test/e2e/spec/01-fetch-instrumentation/page.html index e3b3922..6b31d5b 100644 --- a/test/e2e/spec/01-fetch-instrumentation/page.html +++ b/test/e2e/spec/01-fetch-instrumentation/page.html @@ -20,12 +20,12 @@ environment: "prod", endpoint: [ { - url: "http://127.0.0.1:5001?cors=true", + url: `http://${window.location.hostname}:5001?cors=true`, authToken: "auth_abc123", dataset: "production", }, ], - propagateTraceHeadersCorsURLs: [/http:\/\/127\.0\.0\.1:5002/], + propagateTraceHeadersCorsURLs: [new RegExp(`http:\/\/${window.location.hostname.replace(".", "\.")}:5002`)], headersToCapture: [/x-test-header/], ignoreUrls: [/you-cant-see-this/], }); @@ -48,7 +48,7 @@ } function onCrossOriginFetch() { - return fetch("http://127.0.0.1:5002/ajax?cors=true", { method: "POST" }); + return fetch(`http://${window.location.hostname}:5002/ajax?cors=true`, { method: "POST" }); } function onFetchWithRequest() { diff --git a/test/e2e/spec/01-fetch-instrumentation/withZoneJs.html b/test/e2e/spec/01-fetch-instrumentation/withZoneJs.html index 633e942..a326726 100644 --- a/test/e2e/spec/01-fetch-instrumentation/withZoneJs.html +++ b/test/e2e/spec/01-fetch-instrumentation/withZoneJs.html @@ -22,12 +22,12 @@ environment: "prod", endpoint: [ { - url: "http://127.0.0.1:5001?cors=true", + url: `http://${window.location.hostname}:5001?cors=true`, authToken: "auth_abc123", dataset: "production", }, ], - propagateTraceHeadersCorsURLs: [/http:\/\/127\.0\.0\.1:5002/], + propagateTraceHeadersCorsURLs: [new RegExp(`http:\/\/${window.location.hostname.replace(".", "\.")}:5002`)], }); diff --git a/test/e2e/spec/utils.ts b/test/e2e/spec/utils.ts index 7e05cd5..26680dd 100644 --- a/test/e2e/spec/utils.ts +++ b/test/e2e/spec/utils.ts @@ -1,4 +1,4 @@ -export function retry(fn: () => Promise, maxMillis: number = 10000, until?: number): Promise { +export function retry(fn: () => Promise, maxMillis: number = 30000, until?: number): Promise { until = until || Date.now() + maxMillis; if (Date.now() > until) { diff --git a/test/e2e/wdio.conf.ts b/test/e2e/wdio.conf.ts index 39e460b..f3cbb70 100644 --- a/test/e2e/wdio.conf.ts +++ b/test/e2e/wdio.conf.ts @@ -8,7 +8,7 @@ type CapabilityConfig = WebdriverIO.Config["capabilities"][number] & { }; // Test are generally against stable, beta, and an oldest supported version. -// Currently somewhat arbitrarily chosen based on browserslist > 0.2% not dead on 2025-04-17 +// Currently somewhat arbitrarily chosen based on what works with wdio/lambdatest without horribly exploding const allCapabilitities: Record = { "chrome-latest": { browserName: "chrome", @@ -20,8 +20,7 @@ const allCapabilitities: Record = { }, "chrome-baseline": { browserName: "chrome", - browserVersion: "109", - "wdio:enforceWebDriverClassic": true, + browserVersion: "128", }, "firefox-latest": { browserName: "firefox", @@ -33,8 +32,7 @@ const allCapabilitities: Record = { }, "firefox-baseline": { browserName: "firefox", - browserVersion: "115", - "wdio:enforceWebDriverClassic": true, + browserVersion: "119", }, "edge-latest": { browserName: "microsoftedge", @@ -62,6 +60,7 @@ const allCapabilitities: Record = { "appium:deviceName": "iPhone Simulator", "appium:platformVersion": "current_major", "appium:automationName": "XCUITest", + enabled: false, }, "safari-ios-baseline": { browserName: "safari", @@ -69,6 +68,7 @@ const allCapabilitities: Record = { "appium:deviceName": "iPhone Simulator", "appium:platformVersion": "16.2", "appium:automationName": "XCUITest", + enabled: false, }, // Android Devices seem to not work with proxied connections to localhost at the moment, // Information on this is unclear, so we'll disable them for now. @@ -99,7 +99,7 @@ export function getCapabilityNames() { function getSelectedCapabilities() { const selected = (process.env["WDIO_SELECTED_CAPABILITIES"] ?? "").split(","); - if (!selected.length) { + if (!selected.length || selected[0] === "") { selected.push(...Object.keys(allCapabilitities)); } @@ -113,10 +113,8 @@ export const config: WebdriverIO.Config = { runner: "local", tsConfigPath: "./tsconfig.json", - user: process.env["SAUCE_USERNAME"], - key: process.env["SAUCE_ACCESS_KEY"], - // @ts-expect-error -- we currently don't validate env. Should be one of "eu" | "us" - region: process.env["SAUCE_REGION"], + user: process.env["LT_USERNAME"], + key: process.env["LT_ACCESS_KEY"], specs: ["./spec/**/*.test.ts"], exclude: [ // 'path/to/excluded/files' @@ -127,22 +125,16 @@ export const config: WebdriverIO.Config = { logLevel: "info", bail: 0, - baseUrl: "http://127.0.0.1:5001", + baseUrl: "http://localhost.lambdatest.com:5001", waitforTimeout: 10000, connectionRetryTimeout: 120000, connectionRetryCount: 3, services: [ - [ - "sauce", - { - sauceConnect: true, - sauceConnectOpts: { - proxyLocalhost: "allow", - }, - }, - ], + ["lambdatest", { tunnel: true, sessionNameOmitTestTitle: true, sessionNamePrependTopLevelSuiteTitle: true }], ], + // @ts-expect-error -- this is not inluded in the type, but required for lambdatest + product: "appAutomation", framework: "mocha", @@ -160,6 +152,7 @@ export const config: WebdriverIO.Config = { env: { ...process.env, SERVER_PORTS: "5000,5001,5002", + SERVER_BASE_URL: config.baseUrl, }, });