# @futdevpro/dynamo-e2e

[![npm](https://img.shields.io/npm/v/@futdevpro/dynamo-e2e.svg?label=npm)](https://www.npmjs.com/package/@futdevpro/dynamo-e2e)
[![coverage](https://img.shields.io/badge/coverage-98.37%25-brightgreen.svg)](./coverage/)
[![specs](https://img.shields.io/badge/specs-254%2F0-brightgreen.svg)](./src/)
[![hyperplan](https://img.shields.io/badge/hyperplan-109%2F112-brightgreen.svg)](./__documentations/plans/dynamo-e2e-foundation/HYPERPLAN.md)

End-to-end testing engine for the Dynamo + FDP ecosystem.

## What

A Dynamo bedrock-package that turns Forms v2 Settings POJOs into Playwright
test suites — **auto-generated**, **typed**, **overridable**, **diffable**.

Three layers in one package:

1. **Form-coverage** — every field-type has a pre-curated positive + negative
   input matrix; the generator emits ~20-50 tests per form from a single
   Settings POJO.
2. **Viewport matrix** *(Wave-2)* — auto-fan-out tests over 7 standard
   viewports + overflow/touch-target a11y detection.
3. **Core Web Vitals diagnostics** *(Wave-3)* — synthetic LCP / CLS / INP /
   TTFB measurement + percentile aggregation + attribution.

## Status

**Wave-1..4 + MP-10/MP-11** (2026-06-10) — Layer A contracts, Layer B
generators (form-suite + viewport-suite + CWV-suite), Layer C runtime
fixtures + page-objects, Overseer CICD pipeline registered, **75%+ test
coverage gate** active (statements **97.84%**, branches **87.13%**,
functions **98.55%**, lines **97.84%**). 104 specs, 0 failures.

Plan-net: `__documentations/plans/dynamo-e2e-foundation/HYPERPLAN.md`
(11 MPs, 4900+ LOC planning).

## Install

```bash
pnpm add -D @futdevpro/dynamo-e2e @playwright/test
```

`@futdevpro/fsm-dynamo` is a peer-dep — bring your own (or no Settings
POJO source if you only use the runtime presets).

## Quick start

```typescript
import { DyFM_TextFieldNew_Settings } from '@futdevpro/fsm-dynamo/ngx-models';
import { DyE2E_FormSuite_Generator } from '@futdevpro/dynamo-e2e/generators';

const settings = new DyFM_FormNew_Settings({
  key: 'login',
  fields: [
    new DyFM_TextFieldNew_Settings({ key: 'email', /* ... */ }),
  ],
});

const specSource = DyE2E_FormSuite_Generator.emit({
  formSettings: settings,
  formRoute: '/login',
  formSelector: 'dynamo-form-new',
});

// → write specSource to `e2e/tests/generated/login-form.spec.ts`
```

## Sub-exports

- `@futdevpro/dynamo-e2e/contracts` — POJO types
- `@futdevpro/dynamo-e2e/generators` — Node-only emission engine
- `@futdevpro/dynamo-e2e/runtime` — Playwright fixtures + page-objects (Wave-4)
- `@futdevpro/dynamo-e2e/presets` — pre-built suites + `DyE2E_getPlaywrightConfig` / `DyE2E_getGlobalSetup` playwright-config factory (fleet e2e-config SSOT)
- `@futdevpro/dynamo-e2e/cwv` — Core Web Vitals (Wave-3)
