{"_id":"@abapify/adt-playwright","_rev":"5-a16f744ecf301fe21ba5adff502b74d4","name":"@abapify/adt-playwright","dist-tags":{"latest":"0.4.1"},"versions":{"0.0.0":{"name":"@abapify/adt-playwright","version":"0.0.0","_id":"@abapify/adt-playwright@0.0.0","maintainers":[{"name":"theplenkov-npm","email":"petr.plenkov@gmail.com"}],"dist":{"shasum":"5daaff1b32d1b625916546606a688927ff8e969a","tarball":"https://registry.npmjs.org/@abapify/adt-playwright/-/adt-playwright-0.0.0.tgz","fileCount":2,"integrity":"sha512-CZWveI6ayUKN5jRUDxY3o/lbm1zRnkFt3dWggBXt+AXQu1bt0WexWe6r/4iEzbUADzc1Vph4U29kvvvZmXUltg==","signatures":[{"sig":"MEQCICATZk/pqkqsNzZMzjBJ5RxDwj1gR0isWsFDDcoT6hxhAiAXvzEeXlfap1EmYyhfw5IpAyIq2/bwZEUcmRobRO6khg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":236},"_npmUser":{"name":"theplenkov-npm","email":"petr.plenkov@gmail.com"},"_npmVersion":"11.12.1","description":"Placeholder — real package is published via CI/CD (trusted publishing).","directories":{},"_nodeVersion":"24.10.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/adt-playwright_0.0.0_1776719595972_0.3981369457249111","host":"s3://npm-registry-packages-npm-production"}},"0.3.5":{"name":"@abapify/adt-playwright","version":"0.3.5","license":"MIT","_id":"@abapify/adt-playwright@0.3.5","maintainers":[{"name":"theplenkov-npm","email":"petr.plenkov@gmail.com"}],"homepage":"https://github.com/abapify/adt-cli/tree/main/packages/adt-playwright#readme","bugs":{"url":"https://github.com/abapify/adt-cli/issues"},"dist":{"shasum":"2ba4b3e214bf72036882036eb559702a24516b68","tarball":"https://registry.npmjs.org/@abapify/adt-playwright/-/adt-playwright-0.3.5.tgz","fileCount":2,"integrity":"sha512-XqT3niv8hKCsOx04Z5G26q+v/yoeIaHekqpw1R1ICfBhxNeIPEKTssx6HozgjdicNXBrAKzFu8+U1rTpb8OjPA==","signatures":[{"sig":"MEQCIBll8XDKrhXN/4UBmS7+QJkdcOKop+TetZbbmCz4jKT3AiASwUYeUgoOMex92nG8QbHBszv2G3akwIF2q6oQlD4JdQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@abapify%2fadt-playwright@0.3.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":10155},"type":"module","types":"./dist/index.d.mts","exports":{".":"./dist/index.mjs","./package.json":"./package.json"},"gitHead":"185666fe6ccb304e7b08529eb376ec2493131a7a","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:35d36df3-9917-4605-a67a-88711b227ae7"}},"repository":{"url":"git+https://github.com/abapify/adt-cli.git","type":"git","directory":"packages/adt-playwright"},"_npmVersion":"11.12.1","description":"Playwright-based SSO authentication plugin for ADT client","directories":{},"_nodeVersion":"24.14.1","dependencies":{"playwright":"^1.57.0","@abapify/adt-auth":"0.3.5","@abapify/adt-config":"0.3.5","@abapify/browser-auth":"0.3.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^22.10.2"},"_npmOperationalInternal":{"tmp":"tmp/adt-playwright_0.3.5_1776723658632_0.7734894524798925","host":"s3://npm-registry-packages-npm-production"}},"0.3.6":{"name":"@abapify/adt-playwright","version":"0.3.6","license":"MIT","_id":"@abapify/adt-playwright@0.3.6","maintainers":[{"name":"theplenkov-npm","email":"petr.plenkov@gmail.com"}],"homepage":"https://github.com/abapify/adt-cli/tree/main/packages/adt-playwright#readme","bugs":{"url":"https://github.com/abapify/adt-cli/issues"},"dist":{"shasum":"455ca45d41228c80716624544b9e1467f8bc9b32","tarball":"https://registry.npmjs.org/@abapify/adt-playwright/-/adt-playwright-0.3.6.tgz","fileCount":2,"integrity":"sha512-FesM0mGetWtrtcoZewM6iQRF5XG67eAGBuYWQTpIWregrNVWe34oBlvqPI43+SKFtlgU88xDuL67UPy3gt7WcQ==","signatures":[{"sig":"MEUCIQDyPPCyTst+NsGGLdGVY2Go4GC0LUADIvrabq50E9xDLgIgU4OT2q4tulfhVYpOuVFFRiR/cl2N3w8wew7XA0JsD+E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@abapify%2fadt-playwright@0.3.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":10155},"type":"module","types":"./dist/index.d.mts","exports":{".":"./dist/index.mjs","./package.json":"./package.json"},"gitHead":"489b2b4ad7c2ea972f323d4c356997ac5962ba9e","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:35d36df3-9917-4605-a67a-88711b227ae7"}},"repository":{"url":"git+https://github.com/abapify/adt-cli.git","type":"git","directory":"packages/adt-playwright"},"_npmVersion":"11.11.0","description":"Playwright-based SSO authentication plugin for ADT client","directories":{},"_nodeVersion":"24.14.1","dependencies":{"playwright":"^1.57.0","@abapify/adt-auth":"0.3.6","@abapify/adt-config":"0.3.6","@abapify/browser-auth":"0.3.6"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^22.10.2"},"_npmOperationalInternal":{"tmp":"tmp/adt-playwright_0.3.6_1776744797198_0.23361056441290495","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@abapify/adt-playwright","version":"0.4.0","license":"MIT","_id":"@abapify/adt-playwright@0.4.0","maintainers":[{"name":"theplenkov-npm","email":"petr.plenkov@gmail.com"}],"homepage":"https://github.com/abapify/adt-cli/tree/main/packages/adt-playwright#readme","bugs":{"url":"https://github.com/abapify/adt-cli/issues"},"dist":{"shasum":"45e1d00567c8617eac2ef837aded83e7270e7a03","tarball":"https://registry.npmjs.org/@abapify/adt-playwright/-/adt-playwright-0.4.0.tgz","fileCount":2,"integrity":"sha512-znPbkDbOcBnTCM7mrSlkQfMzGadeESZUAvZjrxvvk6TZKwme0xn7n61Bdr0/jV6vW+L1uYZ6pxJ73W4enEpVZA==","signatures":[{"sig":"MEQCIErXL5uHM16sK5raZQRqTSClxDpTyWMXGxpZsn++qCPEAiB0DpT69cKMu8+MtlHEvc1TY7AOrYUY+D8LOjiXGc6DYw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@abapify%2fadt-playwright@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":10155},"type":"module","types":"./dist/index.d.mts","exports":{".":"./dist/index.mjs","./package.json":"./package.json"},"gitHead":"81dc9eea47fe419e41d246f0ec212fa78570a489","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:35d36df3-9917-4605-a67a-88711b227ae7"}},"repository":{"url":"git+https://github.com/abapify/adt-cli.git","type":"git","directory":"packages/adt-playwright"},"_npmVersion":"11.13.0","description":"Playwright-based SSO authentication plugin for ADT client","directories":{},"_nodeVersion":"24.16.0","dependencies":{"playwright":"^1.57.0","@abapify/adt-auth":"0.4.0","@abapify/adt-config":"0.4.0","@abapify/browser-auth":"0.4.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^22.10.2"},"_npmOperationalInternal":{"tmp":"tmp/adt-playwright_0.4.0_1780072646527_0.19300956066559904","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@abapify/adt-playwright","version":"0.4.1","description":"Playwright-based SSO authentication plugin for ADT client","license":"MIT","publishConfig":{"access":"public"},"type":"module","types":"./dist/index.d.mts","exports":{".":"./dist/index.mjs","./package.json":"./package.json"},"dependencies":{"@abapify/adt-auth":"0.4.1","@abapify/adt-config":"0.4.1","@abapify/browser-auth":"0.4.1","playwright":"^1.57.0"},"devDependencies":{"@types/node":"^22.10.2"},"repository":{"type":"git","url":"git+https://github.com/abapify/adt-cli.git","directory":"packages/adt-playwright"},"homepage":"https://github.com/abapify/adt-cli/tree/main/packages/adt-playwright#readme","bugs":{"url":"https://github.com/abapify/adt-cli/issues"},"gitHead":"9d3b996a5c760a8db67e28c4df3c30098bd29e4a","_id":"@abapify/adt-playwright@0.4.1","_nodeVersion":"24.16.0","_npmVersion":"11.13.0","dist":{"integrity":"sha512-tNgdVKKCn2uTUw8JXV8jLurMJQKx8EPteKeDCWj/+0MnVI4a1SnNIek1ngpk/9hWD9VHAx+EGEq4W3/C2kAiGQ==","shasum":"cfc77900ea00c6cd7de492531bb926043f049778","tarball":"https://registry.npmjs.org/@abapify/adt-playwright/-/adt-playwright-0.4.1.tgz","fileCount":6,"unpackedSize":35514,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@abapify%2fadt-playwright@0.4.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIC7Y6AT6SzeVc0tJhEjiGZn0cfMsX5qdLxYwbfVsA3ZHAiEAi4fP3bpwrK1qVHn/W83mrMFYUxNvRj+DuO7qZWWIAus="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:35d36df3-9917-4605-a67a-88711b227ae7"}},"directories":{},"maintainers":[{"name":"theplenkov-npm","email":"petr.plenkov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/adt-playwright_0.4.1_1780074964680_0.10370208133000647"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-20T21:13:15.918Z","modified":"2026-05-29T17:16:05.213Z","0.0.0":"2026-04-20T21:13:16.100Z","0.3.5":"2026-04-20T22:20:58.756Z","0.3.6":"2026-04-21T04:13:17.325Z","0.4.0":"2026-05-29T16:37:26.677Z","0.4.1":"2026-05-29T17:16:04.847Z"},"bugs":{"url":"https://github.com/abapify/adt-cli/issues"},"license":"MIT","homepage":"https://github.com/abapify/adt-cli/tree/main/packages/adt-playwright#readme","repository":{"type":"git","url":"git+https://github.com/abapify/adt-cli.git","directory":"packages/adt-playwright"},"description":"Playwright-based SSO authentication plugin for ADT client","maintainers":[{"name":"theplenkov-npm","email":"petr.plenkov@gmail.com"}],"readme":"# @abapify/adt-playwright\n\n[![version](https://img.shields.io/github/package-json/v/abapify/adt-cli?filename=packages/adt-playwright/package.json)](https://github.com/abapify/adt-cli/pkgs/npm/%40abapify%2Fadt-playwright)\n\nPlaywright-based SSO authentication plugin for SAP ADT systems. Modern alternative to Puppeteer with better API and maintenance.\n\n## Features\n\n- 🔐 **SSO/IDP Support** - Works with Okta, Azure AD, and other identity providers\n- 💾 **Session Persistence** - Reuse Okta tokens across runs\n- 🎭 **Playwright-powered** - Modern, reliable browser automation\n- ⚡ **Fast** - Skip login when session is still valid\n- 🔄 **AuthManager Integration** - Works seamlessly with ADT CLI\n\n## Installation\n\n```bash\nnpm install @abapify/adt-playwright playwright\n```\n\n## Quick Start\n\n```typescript\n// adt.config.ts\nimport { defineConfig } from '@abapify/adt-config';\nimport { withPlaywright } from '@abapify/adt-playwright';\n\nexport default withPlaywright(\n  defineConfig({\n    destinations: {\n      DEV: 'https://sap-dev.example.com',\n      PROD: 'https://sap-prod.example.com',\n    },\n  }),\n  {\n    userDataDir: true, // Enable session persistence\n    headless: false, // Show browser window for SSO\n    ignoreHTTPSErrors: true, // Ignore self-signed certificates\n    requiredCookies: ['SAP_SESSIONID_*', 'sap-usercontext'],\n  },\n);\n```\n\n## Direct API Usage\n\n```typescript\nimport { playwrightAuth, toCookieHeader } from '@abapify/adt-playwright';\n\n// Authenticate - opens browser for SSO login\nconst credentials = await playwrightAuth.authenticate({\n  url: 'https://sap-system.example.com',\n  userDataDir: true,\n  headless: false,\n  requiredCookies: ['SAP_SESSIONID_*', 'sap-usercontext'],\n});\n\n// Convert to Cookie header for HTTP requests\nconst cookieHeader = toCookieHeader(credentials);\n\n// Test if session is still valid\nconst result = await playwrightAuth.test(credentials);\nconsole.log(result.valid); // true/false\n```\n\n## How It Works\n\n```\n┌─────────────────────────────────────────────────────────────────┐\n│                    Authentication Flow                          │\n├─────────────────────────────────────────────────────────────────┤\n│                                                                 │\n│  1. Launch Browser ──► 2. Navigate to SAP ──► 3. SSO Redirect  │\n│         │                                           │           │\n│         ▼                                           ▼           │\n│  [Persistent Profile]                    [User completes login] │\n│         │                                           │           │\n│         ▼                                           ▼           │\n│  4. Check Session ◄─────────────────────── 5. Capture Cookies  │\n│         │                                           │           │\n│         ▼                                           ▼           │\n│  [Valid? Skip login]                      [Return credentials]  │\n│                                                                 │\n└─────────────────────────────────────────────────────────────────┘\n```\n\n1. **Launch Browser** - Opens Chromium with optional persistent profile\n2. **Navigate to SAP** - Goes to ADT discovery endpoint\n3. **SSO Redirect** - Browser redirects to Okta/IDP\n4. **User Login** - User completes 2FA/SSO in browser\n5. **Capture Cookies** - Waits for required cookies, extracts session\n\n## Options\n\n```typescript\ninterface PlaywrightAuthOptions {\n  /** SAP system URL (required) */\n  url: string;\n\n  /** Hide browser window (default: false) */\n  headless?: boolean;\n\n  /** Login timeout in ms (default: 300000 = 5 minutes) */\n  timeout?: number;\n\n  /** Custom user agent */\n  userAgent?: string;\n\n  /**\n   * Cookie patterns to wait for before completing auth.\n   * Supports wildcards: 'SAP_SESSIONID_*'\n   * @example ['SAP_SESSIONID_*', 'sap-usercontext']\n   */\n  requiredCookies?: string[];\n\n  /**\n   * Session persistence directory.\n   * - true: Use default (~/.adt/browser-profile)\n   * - string: Custom path\n   * - false/undefined: No persistence\n   */\n  userDataDir?: string | boolean;\n\n  /** Ignore HTTPS errors (default: true) */\n  ignoreHTTPSErrors?: boolean;\n}\n```\n\n## Session Persistence\n\nEnable `userDataDir` to persist browser state across runs:\n\n```typescript\n// Use default profile directory (~/.adt/browser-profile)\n{\n  userDataDir: true;\n}\n\n// Use custom directory\n{\n  userDataDir: '/path/to/profile';\n}\n\n// No persistence (fresh session each time)\n{\n  userDataDir: false;\n}\n```\n\n### Benefits\n\n- **Skip repeated logins** - Okta tokens persist across runs\n- **Faster authentication** - Only refresh SAP cookies when needed\n- **Better UX** - Same experience as using a regular browser\n\n### How It Works\n\n1. **First run**: User completes full SSO login → profile saved\n2. **Subsequent runs**:\n   - ✅ **Okta valid**: Auto-authenticates, extracts SAP cookies\n   - ❌ **Okta expired**: Prompts for re-login\n\n### Clearing Sessions\n\n```bash\n# Remove default profile\nrm -rf ~/.adt/browser-profile\n\n# Or remove custom profile\nrm -rf /path/to/custom/profile\n```\n\n## Configuration Patterns\n\n### Pattern 1: All Destinations with Playwright\n\n```typescript\nimport { defineConfig } from '@abapify/adt-config';\nimport { withPlaywright } from '@abapify/adt-playwright';\n\nexport default withPlaywright(\n  defineConfig({\n    destinations: {\n      DEV: 'https://sap-dev.example.com',\n      QAS: 'https://sap-qas.example.com',\n      PROD: 'https://sap-prod.example.com',\n    },\n  }),\n  {\n    userDataDir: true,\n    headless: false,\n    requiredCookies: ['SAP_SESSIONID_*', 'sap-usercontext'],\n  },\n);\n```\n\n### Pattern 2: Per-Destination Options\n\n```typescript\nimport { defineConfig } from '@abapify/adt-config';\nimport { playwright } from '@abapify/adt-playwright';\n\nexport default defineConfig({\n  destinations: {\n    DEV: playwright({\n      url: 'https://sap-dev.example.com',\n      timeout: 60000,\n    }),\n    PROD: playwright({\n      url: 'https://sap-prod.example.com',\n      requiredCookies: ['SAP_SESSIONID_*', 'MYSAPSSO2'],\n    }),\n  },\n});\n```\n\n### Pattern 3: Mixed Auth Types\n\n```typescript\nimport { defineConfig } from '@abapify/adt-config';\nimport { basic } from '@abapify/adt-auth/plugins/basic';\nimport { playwright } from '@abapify/adt-playwright';\n\nexport default defineConfig({\n  destinations: {\n    // Basic auth for dev\n    DEV: basic({\n      url: 'https://dev.example.com',\n      username: 'developer',\n      password: process.env.SAP_PASSWORD,\n    }),\n    // Playwright for production (SSO)\n    PROD: playwright({\n      url: 'https://prod.example.com',\n      userDataDir: true,\n    }),\n  },\n});\n```\n\n## CLI Usage\n\n```bash\n# Login to a system\nnpx adt auth login --sid DEV\n\n# Login with specific destination\nnpx adt auth login --sid PROD\n\n# Check session status\nnpx adt auth status\n\n# Logout\nnpx adt auth logout --sid DEV\n```\n\n## Architecture\n\nThis package is a thin wrapper around `@abapify/browser-auth`:\n\n```\n@abapify/browser-auth (core logic)\n├── Event-driven auth flow\n├── Cookie utilities\n└── Pattern matching\n    ↑\n@abapify/adt-playwright (this package)\n├── adapter.ts      - Playwright BrowserAdapter implementation\n├── playwright-auth.ts - Wrapper around browser-auth\n├── auth-plugin.ts  - AuthManager compatibility\n└── index.ts        - Public exports\n```\n\n## Exports\n\n```typescript\n// Main auth object\nexport { playwrightAuth, playwright } from '@abapify/adt-playwright';\n\n// Config helper\nexport { withPlaywright } from '@abapify/adt-playwright';\n\n// Utilities\nexport { toCookieHeader, toHeaders } from '@abapify/adt-playwright';\n\n// AuthManager plugin (default export)\nimport authPlugin from '@abapify/adt-playwright';\n\n// Types\nexport type {\n  PlaywrightCredentials,\n  PlaywrightAuthOptions,\n  PlaywrightPluginOptions,\n  CookieData,\n} from '@abapify/adt-playwright';\n```\n\n## Troubleshooting\n\n### Browser doesn't open\n\nEnsure `headless: false` is set:\n\n```typescript\n{\n  headless: false;\n}\n```\n\n### Cookies not captured\n\nSpecify the required cookies explicitly:\n\n```typescript\n{\n  requiredCookies: ['SAP_SESSIONID_*', 'sap-usercontext'];\n}\n```\n\n### SSL Certificate errors\n\nEnable `ignoreHTTPSErrors` (default is true):\n\n```typescript\n{\n  ignoreHTTPSErrors: true;\n}\n```\n\n### Session not persisting\n\nCheck that `userDataDir` is enabled and the directory is writable:\n\n```typescript\n{\n  userDataDir: true;\n}\n// or\n{\n  userDataDir: '/writable/path';\n}\n```\n\n## Related Packages\n\n- [`@abapify/browser-auth`](../browser-auth) - Core authentication logic\n- [`@abapify/adt-puppeteer`](../adt-puppeteer) - Puppeteer alternative\n- [`@abapify/adt-auth`](../adt-auth) - Authentication manager\n- [`@abapify/adt-config`](../adt-config) - Configuration utilities\n","readmeFilename":"README.md"}