Files
apf_portal/apps/portal-admin-e2e/playwright.config.ts
T
Julien Gautier a9b36efb75
CI / scan (pull_request) Successful in 2m34s
CI / commits (pull_request) Successful in 2m43s
CI / check (pull_request) Successful in 2m49s
CI / a11y (pull_request) Successful in 2m36s
CI / perf (pull_request) Successful in 6m37s
feat(portal-admin): skeleton app per ADR-0020
First step of the admin track. Scaffold the second Angular SPA in
the workspace alongside `portal-shell`, with the architectural
decisions from the v1 ADRs already wired so subsequent feature PRs
can drop straight into modules.

What lands:

- App generated via `nx g @nx/angular:application` (with the
  matching e2e project skeleton). Standalone, zoneless-ready,
  prefix `app`, scss component styles, css root stylesheet, no SSR.
- Tags `scope:portal-admin, type:app` so module-boundary lint
  treats `portal-admin` distinctly from `portal-shell` and only
  allows it to depend on `scope:portal-admin` + `scope:shared`
  libs.
- Tailwind v4 wired (`.postcssrc.json` + `@import 'tailwindcss'`),
  class-based dark mode (`@custom-variant dark ...`), brand palette
  imported from `libs/shared/tokens/src/brand-tokens.css` —
  identical visual baseline to portal-shell. ADR-0016 a11y baseline
  applies; ADR-0017 perf budget relaxed to **500 KB gzip initial**
  per ADR-0020 §"Performance budgets".
- i18n configured to mirror portal-shell (per ADR-0019): sourceLocale
  `en`, target `fr`, baseHref `/{locale}/` per locale,
  `@angular/localize/init` polyfill, `localize: ["en", "fr"]` on
  production, `i18nMissingTranslation: "error"` so CI blocks any PR
  that adds a marker without translating it. Seed `messages.fr.xlf`
  carries the four marked strings used by the placeholder page +
  skip-link + route title.
- Skeleton home page at `/` with a placeholder `<h1>`, intro
  paragraph, and a small "Skeleton — coming soon" status chip in
  the brand-accent palette. Marked for i18n.
- Skip-link landmark (WCAG 2.4.1) at the App level, with the same
  styling as portal-shell (component-scoped scss).
- Wildcard catch-all route bounces unknown paths to home, same
  defensive pattern as PR #96 on portal-shell.
- Dev server on port **4300** (vs 4200 for portal-shell) so both
  can run in parallel during cross-app development.
- `serve-static` target without `spa: true` — locale-prefixed
  routing in production will be handled by the reverse proxy (per
  ADR-0019), same as portal-shell since PR #92.

Production build: 62 KB gzip initial per locale (vs the 500 KB
relaxed budget). Both `dist/apps/portal-admin/browser/{en,fr}/`
emitted with the right `<html lang>` and `<base href>`.

Out of scope (each its own follow-up PR):

- Admin app shell (header / sidebar / footer with "Admin" badge).
- OpenTelemetry tracing setup (will register as
  `service.name=portal-admin` per ADR-0012).
- `environment.ts` wiring (per ADR-0018) for the admin's own BFF
  endpoints.
- BFF `AdminModule` + `AdminRoleGuard` + first `/api/admin/me`
  smoke route (per ADR-0020 §"Auth").
- First functional module (CMS / menu / users / audit viewer).

CLAUDE.md picks up the second app in its naming + commands sections.
2026-05-12 01:41:50 +02:00

69 lines
1.7 KiB
TypeScript

import { defineConfig, devices } from '@playwright/test';
import { nxE2EPreset } from '@nx/playwright/preset';
import { workspaceRoot } from '@nx/devkit';
// For CI, you may want to set BASE_URL to the deployed application.
const baseURL = process.env['BASE_URL'] || 'http://localhost:4200';
/**
* Read environment variables from file.
* https://github.com/motdotla/dotenv
*/
// require('dotenv').config();
/**
* See https://playwright.dev/docs/test-configuration.
*/
export default defineConfig({
...nxE2EPreset(__filename, { testDir: './src' }),
/* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
use: {
baseURL,
/* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
trace: 'on-first-retry',
},
/* Run your local dev server before starting the tests */
webServer: {
command: 'pnpm exec nx run portal-admin:serve',
url: 'http://localhost:4200',
reuseExistingServer: true,
cwd: workspaceRoot,
},
projects: [
{
name: 'chromium',
use: { ...devices['Desktop Chrome'] },
},
{
name: 'firefox',
use: { ...devices['Desktop Firefox'] },
},
{
name: 'webkit',
use: { ...devices['Desktop Safari'] },
},
// Uncomment for mobile browsers support
/* {
name: 'Mobile Chrome',
use: { ...devices['Pixel 5'] },
},
{
name: 'Mobile Safari',
use: { ...devices['iPhone 12'] },
}, */
// Uncomment for branded browsers
/* {
name: 'Microsoft Edge',
use: { ...devices['Desktop Edge'], channel: 'msedge' },
},
{
name: 'Google Chrome',
use: { ...devices['Desktop Chrome'], channel: 'chrome' },
} */
],
});