{"name":"main","updatestamp":"2026-10-12T18:47:24.993060Z","head_commit":{"commitid":"12fbd4dc944cd1f82d1d6feca7b75952815826b6","message":"chore(deps): update dependency @playwright/test to v1.64.0 (#97)\n\nThis PR contains the following updates:\n\n| Package | Change |\n[Age](https://docs.renovatebot.com/merge-confidence/) |\n[Confidence](https://docs.renovatebot.com/merge-confidence/) |\n|---|---|---|---|\n| [@playwright/test](https://playwright.dev)\n([source](https://redirect.github.com/microsoft/playwright)) | [`1.63.0`\n→\n`1.64.0`](https://renovatebot.com/diffs/npm/@playwright%2ftest/1.63.0/1.64.0)\n|\n![age](https://developer.mend.io/api/mc/badges/age/npm/@playwright%2ftest/1.64.0?slim=true)\n|\n![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@playwright%2ftest/1.63.0/1.64.0?slim=true)\n|\n\n---\n\n### Release Notes\n\n<details>\n<summary>microsoft/playwright (@&#8203;playwright/test)</summary>\n\n###\n[`v1.64.0`](https://redirect.github.com/microsoft/playwright/releases/tag/v1.64.0)\n\n[Compare\nSource](https://redirect.github.com/microsoft/playwright/compare/v1.63.0...v1.64.0)\n\n#### 🧰 WebMCP\n\nNew\n[page.webmcp](https://playwright.dev/docs/api/class-page#page-webmcp)\nand\n[frame.webmcp](https://playwright.dev/docs/api/class-frame#frame-webmcp)\ngive access to the tools that a page registers through the experimental\n[WebMCP](https://playwright.dev/docs/api/class-webmcp) browser API, so\nyou can test them like any other part of your app:\n\n```js\nconst browser = await chromium.launch({ args: ['--enable-features=WebMCP'] });\nconst page = await browser.newPage();\nawait page.goto('https://example.com');\n\nfor (const tool of await page.webmcp.tools())\n  console.log(tool.name, tool.description);\n\nconst result = await page.webmcp.callTool('add', { a: 2, b: 40 });\nconsole.log(result.content[0].text); // \"42\"\n```\n\n[Playwright MCP](https://playwright.dev/docs/getting-started-mcp) also\nsupports WebMCP by default, with page-defined tools offered to the agent\nas `webmcp_<tool>`. Pass `--no-webmcp` to opt out.\n\n[`playwright-cli`](https://playwright.dev/docs/getting-started-cli)\nexposes them as well:\n\n```bash\nplaywright-cli webmcp-list\nplaywright-cli webmcp-call search_catalog --params '{\"query\":\"cats\"}'\n```\n\n#### 🎬 Better videos\n\nVideos can now be recorded at a custom frame rate, and the decorations\nfor actions are styled with plain CSS:\n\n```js\n// playwright.config.ts\nimport { defineConfig } from '@playwright/test';\n\nexport default defineConfig({\n  use: {\n    video: {\n      mode: 'on',\n      size: { width: 1920, height: 1080 },\n      fps: 60,\n      show: {\n        actions: {\n          style: {\n            point: 'width: 20px; height: 20px; border-radius: 50%; background: red',\n            highlight: 'outline: 2px solid #&#8203;333; background: rgba(0, 128, 255, .15)',\n            title: 'font-size: 16px',\n          },\n        },\n      },\n    },\n  },\n});\n```\n\n- New `fps` option in\n[testOptions.video](https://playwright.dev/docs/api/class-testoptions#test-options-video),\n[`recordVideo`](https://playwright.dev/docs/api/class-browser#browser-new-context-option-record-video)\nand\n\n[screencast.start()](https://playwright.dev/docs/api/class-screencast#screencast-start).\nFirefox and WebKit currently capture up to 25 frames per second.\n- New\n[`style`](https://playwright.dev/docs/api/class-screencast#screencast-show-actions-option-style)\noption takes CSS declarations for the `point` marker, the target\n`highlight` and the action `title`. It replaces the `fontSize` option,\nwhich is now deprecated.\n- The cursor stays visible at the last action point, survives\nnavigations and travels along a natural, eased path.\n- Videos are encoded with VP9 instead of VP8, which takes less CPU and\nproduces smaller files of the same or better\n  quality.\n- All video options are also available in [Playwright\nMCP](https://playwright.dev/docs/getting-started-mcp) and\n[`playwright-cli`](https://playwright.dev/docs/getting-started-cli).\n\n#### 🎯 Test runner\n\n- New\n[testProject.default](https://playwright.dev/docs/api/class-testproject#test-project-default)\noption keeps a project in the config without running it by default. You\ncan configure every browser you care about, and let a plain `npx\nplaywright test` run just your favourite one:\n\n  ```js\n  // playwright.config.ts\n  import { defineConfig, devices } from '@playwright/test';\n\n  export default defineConfig({\n    projects: [\n      { name: 'chromium', use: devices['Desktop Chrome'] },\n{ name: 'firefox', use: devices['Desktop Firefox'], default: false },\n{ name: 'webkit', use: devices['Desktop Safari'], default: false },\n    ],\n  });\n  ```\n\n  ```bash\n  npx playwright test                     # runs chromium only\n  npx playwright test --project=firefox   # runs firefox\nnpx playwright test --project=\"*\" # runs all three, for example on CI\n  ```\n\n- New `--shuffle` command line option schedules tests in a random order,\nwhich helps to find tests that accidentally depend on each other.\n\n  ```bash\n  npx playwright test --shuffle\n  # Running 42 tests using 4 workers, shuffle seed 271828182\n  # ...\n\n  # Pass the seed to reproduce the same order.\n  npx playwright test --shuffle 271828182\n  ```\n\n- New `lock` option in\n[test.describe.configure()](https://playwright.dev/docs/api/class-test#test-describe-configure)\nadds [test locks](https://playwright.dev/docs/test-parallel#test-locks)\nto all tests in a file or a group:\n\n  ```js\n  test.describe.configure({ lock: 'user-settings' });\n  ```\n\n- New `type` option of `toHaveScreenshot` in\n[testConfig.expect](https://playwright.dev/docs/api/class-testconfig#test-config-expect)\nstores all unnamed screenshots as WebP:\n\n  ```js\n  // playwright.config.ts\n  export default defineConfig({\n    expect: {\n      toHaveScreenshot: { type: 'webp' },\n    },\n  });\n  ```\n\n#### 🪆 Locator.within()\n\nNew\n[locator.within()](https://playwright.dev/docs/api/class-locator#locator-within)\ncombines two locators that you already have, reading in the natural\norder —\n\"this button, within that dialog\":\n\n```js\nconst saveButton = page.getByRole('button', { name: 'Save' });\nconst dialog = page.getByTestId('settings-dialog');\n\nawait saveButton.within(dialog).click();\n```\n\nRelative locators such as\n[locator.nth()](https://playwright.dev/docs/api/class-locator#locator-nth)\nor\n[locator.first()](https://playwright.dev/docs/api/class-locator#locator-first)\nare resolved inside each parent\nseparately, which makes column-like queries straightforward:\n\n```js\n// The third cell of every row, not the third cell in the table.\nconst thirdColumn = page.getByRole('cell').nth(2).within(page.getByRole('row'));\nawait expect(thirdColumn).toHaveText(['Apple', 'Banana', 'Cherry']);\n```\n\n#### New APIs\n\n- New\n[page.getByRef()](https://playwright.dev/docs/api/class-page#page-get-by-ref)\nlocates an element by its aria ref, such as `e2`, reported by\n[page.ariaSnapshot()](https://playwright.dev/docs/api/class-page#page-aria-snapshot)\nin the `'ai'` mode.\n- New option\n[`includeShadow`](https://playwright.dev/docs/api/class-page#page-content-option-include-shadow)\nin\n[page.content()](https://playwright.dev/docs/api/class-page#page-content)\nand\n[frame.content()](https://playwright.dev/docs/api/class-frame#frame-content)\nserializes open shadow roots as [declarative shadow\nDOM](https://developer.mozilla.org/en-US/docs/Web/API/Web_components/Using_shadow_DOM#declaratively_with_html).\n- New option\n[`signCount`](https://playwright.dev/docs/api/class-credentials#credentials-create-option-sign-count)\nsets the initial signature counter of a virtual credential.\n[credentials.create()](https://playwright.dev/docs/api/class-credentials#credentials-create)\nand\n[credentials.get()](https://playwright.dev/docs/api/class-credentials#credentials-get)\nreturn the current `signCount`, and it is saved and restored together\nwith the credentials in the storage state.\n- New\n[fullConfig.filteredProjects](https://playwright.dev/docs/api/class-fullconfig#full-config-filtered-projects)\nlists the projects that were selected to run after applying the\n`--project` filter. It is available in global setup and reporters.\n- New\n[apiRequestContext.addCookies()](https://playwright.dev/docs/api/class-apirequestcontext#api-request-context-add-cookies),\n[apiRequestContext.cookies()](https://playwright.dev/docs/api/class-apirequestcontext#api-request-context-cookies)\nand\n[apiRequestContext.clearCookies()](https://playwright.dev/docs/api/class-apirequestcontext#api-request-context-clear-cookies)\nmanage cookies of a request context, mirroring the\n[BrowserContext](https://playwright.dev/docs/api/class-browsercontext)\nmethods:\n\n  ```js\nawait request.addCookies([{ name: 'session-id', value: '42', url:\n'https://example.com' }]);\n  console.log(await request.cookies('https://example.com'));\n  await request.clearCookies({ name: 'session-id' });\n  ```\n\n#### Breaking changes ⚠️\n\n- `screen` property is now forwarded from the [device\ndescriptors](https://playwright.dev/docs/emulation#devices). If you use\n`...devices['Desktop Chrome']` and alike, `window.screen` and media\nqueries now see the emulated screen size. You can opt-out by explicitly\nsetting `screen` to `undefined`:\n\n  ```js\n  // playwright.config.ts\n  export default defineConfig({\n    use: {\n      ...devices['Desktop Chrome'],\n      screen: undefined,\n    },\n  });\n  ```\n\n- JSX in your test files now follows your `tsconfig.json`. Playwright\ncompiles JSX in test files according to the `jsx`, `jsxFactory`,\n`jsxFragmentFactory` and `jsxImportSource` [tsconfig\noptions](https://playwright.dev/docs/test-typescript#tsconfig-jsx-options),\nand defaults to the automatic runtime from `react/jsx-runtime`.\n\n- `--update-snapshots=missing` now passes the test run. Tests that only\ncreate missing snapshots now pass in the `'missing'` mode of\n[testConfig.updateSnapshots](https://playwright.dev/docs/api/class-testconfig#test-config-update-snapshots),\nso that CI can generate new snapshots and verify the existing ones in a\nsingle run. The mode used when the option is not specified is now called\n`'default'` and behaves as before: missing snapshots are written and the\ntest fails.\n\n- Elements inside hidden iframes are considered hidden. Elements inside\nan iframe that is not visible, for example with `visibility: hidden`,\nare now considered hidden by actions,\n[locator.isVisible()](https://playwright.dev/docs/api/class-locator#locator-is-visible)\nand\n[expect(locator).toBeVisible()](https://playwright.dev/docs/api/class-locatorassertions#locator-assertions-to-be-visible).\n\n#### Browser Versions\n\n- Chromium 156.0.8078.4\n- Mozilla Firefox 157.0\n- WebKit 27.2\n\nThis version was also tested against the following stable channels:\n\n- Google Chrome 155\n- Microsoft Edge 155\n\n</details>\n\n---\n\n### Configuration\n\n📅 **Schedule**: (UTC)\n\n- Branch creation\n  - At any time (no schedule defined)\n- Automerge\n  - At any time (no schedule defined)\n\n🚦 **Automerge**: Enabled.\n\n♻ **Rebasing**: Whenever PR is behind base branch, or you tick the\nrebase/retry checkbox.\n\n🔕 **Ignore**: Close this PR and you won't be reminded about this update\nagain.\n\n---\n\n- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check\nthis box\n\n---\n\nThis PR was generated by [Mend Renovate](https://mend.io/renovate/).\nView the [repository job\nlog](https://developer.mend.io/github/netresearch/t3x-nr-passkeys-fe).\n\n<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xMzQuMSIsInVwZGF0ZWRJblZlciI6IjQ0LjEzNC4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->","timestamp":"2026-10-12T18:46:52Z","ci_passed":true,"author":{"service":"github","username":"netresearch-project-bot[bot]","name":"netresearch-project-bot[bot]"},"branch":"main","totals":{"files":51,"lines":3669,"hits":3359,"misses":310,"partials":0,"coverage":91.55,"branches":0,"methods":274,"sessions":17,"complexity":733.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0},"state":"complete","parent":"4c95e30e6d6a111afebfcc1d267bb749a6215f4d","report":{"totals":{"files":51,"lines":3669,"hits":3359,"misses":310,"partials":0,"coverage":91.55,"branches":0,"methods":274,"messages":0,"sessions":17,"complexity":733.0,"complexity_total":0.0,"complexity_ratio":0,"diff":[0,0,0,0,0,null,0,0,0,0,null,null,0]},"files":[{"name":"Classes/Adoption/FrontendPasskeyAdoptionStatsProvider.php","totals":{"files":0,"lines":8,"hits":8,"misses":0,"partials":0,"coverage":100.0,"branches":0,"methods":2,"messages":0,"sessions":0,"complexity":2.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Authentication/PasskeyFrontendAuthenticationService.php","totals":{"files":0,"lines":236,"hits":207,"misses":29,"partials":0,"coverage":87.71,"branches":0,"methods":15,"messages":0,"sessions":0,"complexity":82.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Configuration/FrontendConfiguration.php","totals":{"files":0,"lines":50,"hits":49,"misses":1,"partials":0,"coverage":98.0,"branches":0,"methods":14,"messages":0,"sessions":0,"complexity":22.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Controller/AdminController.php","totals":{"files":0,"lines":164,"hits":162,"misses":2,"partials":0,"coverage":98.78,"branches":0,"methods":10,"messages":0,"sessions":0,"complexity":50.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Controller/AdminModuleController.php","totals":{"files":0,"lines":76,"hits":63,"misses":13,"partials":0,"coverage":82.89,"branches":0,"methods":7,"messages":0,"sessions":0,"complexity":14.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Controller/EidDispatcher.php","totals":{"files":0,"lines":41,"hits":40,"misses":1,"partials":0,"coverage":97.56,"branches":0,"methods":2,"messages":0,"sessions":0,"complexity":14.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Controller/EnrollmentController.php","totals":{"files":0,"lines":65,"hits":56,"misses":9,"partials":0,"coverage":86.15,"branches":0,"methods":5,"messages":0,"sessions":0,"complexity":18.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Controller/JsonBodyTrait.php","totals":{"files":0,"lines":16,"hits":16,"misses":0,"partials":0,"coverage":100.0,"branches":0,"methods":1,"messages":0,"sessions":0,"complexity":7.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Controller/LoginController.php","totals":{"files":0,"lines":134,"hits":109,"misses":25,"partials":0,"coverage":81.34,"branches":0,"methods":6,"messages":0,"sessions":0,"complexity":28.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Controller/ManagementController.php","totals":{"files":0,"lines":166,"hits":146,"misses":20,"partials":0,"coverage":87.95,"branches":0,"methods":7,"messages":0,"sessions":0,"complexity":36.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Controller/RecoveryController.php","totals":{"files":0,"lines":70,"hits":64,"misses":6,"partials":0,"coverage":91.42,"branches":0,"methods":4,"messages":0,"sessions":0,"complexity":15.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Controller/Plugin/EnrollmentPluginController.php","totals":{"files":0,"lines":31,"hits":31,"misses":0,"partials":0,"coverage":100.0,"branches":0,"methods":4,"messages":0,"sessions":0,"complexity":13.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Controller/Plugin/LoginPluginController.php","totals":{"files":0,"lines":75,"hits":73,"misses":2,"partials":0,"coverage":97.33,"branches":0,"methods":8,"messages":0,"sessions":0,"complexity":33.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Controller/Plugin/ManagementPluginController.php","totals":{"files":0,"lines":32,"hits":28,"misses":4,"partials":0,"coverage":87.5,"branches":0,"methods":3,"messages":0,"sessions":0,"complexity":6.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Domain/Dto/FrontendAdoptionStats.php","totals":{"files":0,"lines":2,"hits":2,"misses":0,"partials":0,"coverage":100.0,"branches":0,"methods":1,"messages":0,"sessions":0,"complexity":1.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Domain/Dto/FrontendEnforcementStatus.php","totals":{"files":0,"lines":7,"hits":7,"misses":0,"partials":0,"coverage":100.0,"branches":0,"methods":2,"messages":0,"sessions":0,"complexity":5.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Event/AfterPasskeyAuthenticationEvent.php","totals":{"files":0,"lines":2,"hits":2,"misses":0,"partials":0,"coverage":100.0,"branches":0,"methods":1,"messages":0,"sessions":0,"complexity":1.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Event/AfterPasskeyEnrollmentEvent.php","totals":{"files":0,"lines":2,"hits":2,"misses":0,"partials":0,"coverage":100.0,"branches":0,"methods":1,"messages":0,"sessions":0,"complexity":1.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Event/BeforePasskeyAuthenticationEvent.php","totals":{"files":0,"lines":2,"hits":2,"misses":0,"partials":0,"coverage":100.0,"branches":0,"methods":1,"messages":0,"sessions":0,"complexity":1.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Event/BeforePasskeyEnrollmentEvent.php","totals":{"files":0,"lines":2,"hits":2,"misses":0,"partials":0,"coverage":100.0,"branches":0,"methods":1,"messages":0,"sessions":0,"complexity":1.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Event/EnforcementLevelResolvedEvent.php","totals":{"files":0,"lines":6,"hits":6,"misses":0,"partials":0,"coverage":100.0,"branches":0,"methods":3,"messages":0,"sessions":0,"complexity":3.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Event/PasskeyRemovedEvent.php","totals":{"files":0,"lines":2,"hits":2,"misses":0,"partials":0,"coverage":100.0,"branches":0,"methods":1,"messages":0,"sessions":0,"complexity":1.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Event/RecoveryCodesGeneratedEvent.php","totals":{"files":0,"lines":2,"hits":2,"misses":0,"partials":0,"coverage":100.0,"branches":0,"methods":1,"messages":0,"sessions":0,"complexity":1.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/EventListener/InjectPasskeyBanner.php","totals":{"files":0,"lines":79,"hits":72,"misses":7,"partials":0,"coverage":91.13,"branches":0,"methods":4,"messages":0,"sessions":0,"complexity":19.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/EventListener/InjectPasskeyLoginFields.php","totals":{"files":0,"lines":10,"hits":9,"misses":1,"partials":0,"coverage":90.0,"branches":0,"methods":2,"messages":0,"sessions":0,"complexity":5.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Form/Element/PasskeyFeInfoElement.php","totals":{"files":0,"lines":92,"hits":90,"misses":2,"partials":0,"coverage":97.82,"branches":0,"methods":6,"messages":0,"sessions":0,"complexity":25.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Middleware/PasskeyEnrollmentInterstitial.php","totals":{"files":0,"lines":62,"hits":57,"misses":5,"partials":0,"coverage":91.93,"branches":0,"methods":8,"messages":0,"sessions":0,"complexity":33.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Middleware/PasskeyPublicRouteResolver.php","totals":{"files":0,"lines":13,"hits":13,"misses":0,"partials":0,"coverage":100.0,"branches":0,"methods":2,"messages":0,"sessions":0,"complexity":5.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Service/FrontendAdoptionStatsService.php","totals":{"files":0,"lines":174,"hits":172,"misses":2,"partials":0,"coverage":98.85,"branches":0,"methods":10,"messages":0,"sessions":0,"complexity":34.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Service/FrontendCredentialRepository.php","totals":{"files":0,"lines":199,"hits":189,"misses":10,"partials":0,"coverage":94.97,"branches":0,"methods":16,"messages":0,"sessions":0,"complexity":20.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Service/FrontendEnforcementService.php","totals":{"files":0,"lines":118,"hits":115,"misses":3,"partials":0,"coverage":97.45,"branches":0,"methods":9,"messages":0,"sessions":0,"complexity":30.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Service/FrontendUserLookupService.php","totals":{"files":0,"lines":42,"hits":42,"misses":0,"partials":0,"coverage":100.0,"branches":0,"methods":3,"messages":0,"sessions":0,"complexity":8.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Service/FrontendWebAuthnService.php","totals":{"files":0,"lines":291,"hits":182,"misses":109,"partials":0,"coverage":62.54,"branches":0,"methods":21,"messages":0,"sessions":0,"complexity":43.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Service/PasskeyEnrollmentService.php","totals":{"files":0,"lines":35,"hits":35,"misses":0,"partials":0,"coverage":100.0,"branches":0,"methods":4,"messages":0,"sessions":0,"complexity":5.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Service/RecoveryCodeService.php","totals":{"files":0,"lines":86,"hits":86,"misses":0,"partials":0,"coverage":100.0,"branches":0,"methods":9,"messages":0,"sessions":0,"complexity":20.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Service/SiteConfigurationService.php","totals":{"files":0,"lines":43,"hits":38,"misses":5,"partials":0,"coverage":88.37,"branches":0,"methods":7,"messages":0,"sessions":0,"complexity":22.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Updates/PluginListTypeToCTypeUpdateWizard.php","totals":{"files":0,"lines":14,"hits":14,"misses":0,"partials":0,"coverage":100.0,"branches":0,"methods":3,"messages":0,"sessions":0,"complexity":3.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Controller/RemoteAddressTrait.php","totals":{"files":0,"lines":11,"hits":11,"misses":0,"partials":0,"coverage":100.0,"branches":0,"methods":1,"messages":0,"sessions":0,"complexity":4.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Service/FrontendGroupEnforcementService.php","totals":{"files":0,"lines":28,"hits":28,"misses":0,"partials":0,"coverage":100.0,"branches":0,"methods":5,"messages":0,"sessions":0,"complexity":8.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Service/LinkablePageResolver.php","totals":{"files":0,"lines":56,"hits":56,"misses":0,"partials":0,"coverage":100.0,"branches":0,"methods":9,"messages":0,"sessions":0,"complexity":30.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/EventListener/UseSiteDiscoverableSettingWhenUnset.php","totals":{"files":0,"lines":12,"hits":12,"misses":0,"partials":0,"coverage":100.0,"branches":0,"methods":1,"messages":0,"sessions":0,"complexity":5.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Resources/Public/JavaScript/PasskeyBanner.js","totals":{"files":0,"lines":40,"hits":39,"misses":1,"partials":0,"coverage":97.5,"branches":0,"methods":0,"messages":0,"sessions":0,"complexity":0.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Resources/Public/JavaScript/PasskeyEnrollment.js","totals":{"files":0,"lines":83,"hits":80,"misses":3,"partials":0,"coverage":96.38,"branches":0,"methods":0,"messages":0,"sessions":0,"complexity":0.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Resources/Public/JavaScript/PasskeyFeAdmin.js","totals":{"files":0,"lines":200,"hits":189,"misses":11,"partials":0,"coverage":94.5,"branches":0,"methods":0,"messages":0,"sessions":0,"complexity":0.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Resources/Public/JavaScript/PasskeyLogin.js","totals":{"files":0,"lines":251,"hits":241,"misses":10,"partials":0,"coverage":96.01,"branches":0,"methods":0,"messages":0,"sessions":0,"complexity":0.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Resources/Public/JavaScript/PasskeyManagement.js","totals":{"files":0,"lines":166,"hits":152,"misses":14,"partials":0,"coverage":91.56,"branches":0,"methods":0,"messages":0,"sessions":0,"complexity":0.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Resources/Public/JavaScript/PasskeyRecovery.js","totals":{"files":0,"lines":68,"hits":65,"misses":3,"partials":0,"coverage":95.58,"branches":0,"methods":0,"messages":0,"sessions":0,"complexity":0.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Resources/Public/JavaScript/PasskeyRecoveryCodes.js","totals":{"files":0,"lines":77,"hits":74,"misses":3,"partials":0,"coverage":96.1,"branches":0,"methods":0,"messages":0,"sessions":0,"complexity":0.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Resources/Public/JavaScript/PasskeyUtils.js","totals":{"files":0,"lines":74,"hits":72,"misses":2,"partials":0,"coverage":97.29,"branches":0,"methods":0,"messages":0,"sessions":0,"complexity":0.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Domain/Model/FrontendCredential.php","totals":{"files":0,"lines":111,"hits":104,"misses":7,"partials":0,"coverage":93.69,"branches":0,"methods":38,"messages":0,"sessions":0,"complexity":41.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Domain/Model/RecoveryCode.php","totals":{"files":0,"lines":43,"hits":43,"misses":0,"partials":0,"coverage":100.0,"branches":0,"methods":16,"messages":0,"sessions":0,"complexity":18.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}}]}}}