INTER-2322: e2e test CI matrix for examples (React 18 & 19)#204
Conversation
Widen the react peer range to >=18 <20, verify the SDK against React 19 via a second CI matrix job (catalog stays pinned to 18 as the default dev/test toolchain), and bump the Next.js examples to 16.2.10. Add @next/eslint-plugin-next lint rules scoped to the Next examples instead of eslint-config-next, since the latter bundles eslint-plugin-react which only supports ESLint below version 10. Re-add the two @eslint-react rule overrides for React 19-only idioms so linting stays green under both supported versions.
Next.js 16 requires Node >=20.9.0; declare it explicitly so contributors on older Node get a clear engine error instead of a confusing runtime failure.
no-html-link-for-pages (and other core-web-vitals rules) default to looking for pages/app at the repo root, so they silently no-op since both Next examples live under examples/. Set settings.next.rootDir to point at them explicitly.
Add a CI matrix that boots each example app with Playwright and asserts the
Fingerprint React SDK identifies the visitor (a visitor ID renders in the
browser). Each example is tested against the React versions it supports.
- e2e/: a single Playwright harness driven by an EXAMPLE env var, with a
per-example registry (examples.ts) and one framework-agnostic spec.
- .github/workflows/e2e.yml: matrix of {example} x {React 18, 19}. React 19
jobs flip the pnpm catalog so the SDK and every example move in lockstep
(a single @types/react, which the Next App Router type-check requires).
The preact example runs once (it uses Preact via preact/compat).
- examples: optional region env support (the CI key is EU) that leaves the
default behavior unchanged. Also fixes pre-existing build breakage: the CRA
example was missing react-app-env.d.ts, and the preact example's ESM
preact.config.js failed to load on Node 22 (and was redundant with
preact-cli's native .env / PREACT_APP_* injection) so it was removed and a
scoped process type declaration added.
INTER-2322
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014F14pjZxadmtLq8uTuzwXb
Read the Fingerprint region from the FPJS_REGION Actions variable (defaulting to eu) instead of hardcoding it, so the region is configurable alongside the public key secret. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014F14pjZxadmtLq8uTuzwXb
Drop the eu fallback so the region comes solely from the FPJS_REGION repo variable, and fail fast in the pre-flight check when it (or the API key secret) is missing. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014F14pjZxadmtLq8uTuzwXb
Coverage report
Test suite run success23 tests passing in 15 suites. Report generated by 🧪jest coverage report action from 0e47870 Show full coverage report
|
The Fingerprint public key isn't sensitive, so read FPJS_PUBLIC_API_KEY from either a repo secret or a repo variable. Fixes the matrix failing when the key was added under the Variables tab alongside FPJS_REGION. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014F14pjZxadmtLq8uTuzwXb
preact-cli's dev server (`preact watch`) fails to resolve its entrypoint on the CI Node version and never serves, so the e2e job timed out. Build the example once and serve the static output with sirv instead. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014F14pjZxadmtLq8uTuzwXb
Align examples on a shared data-testid for successful identifies, flip React via pnpm overrides instead of sed, and verify the installed React major in CI.
There was a problem hiding this comment.
Pull request overview
Adds a Playwright end-to-end test suite and GitHub Actions matrix to build+serve each example app (React 18 + React 19; plus a one-off Preact run), then assert a visitor ID renders in the browser. This also standardizes example outputs for e2e by adding a shared data-testid="visitor-id" target and optional *_FPJS_REGION env support across examples.
Changes:
- Introduces
e2e/Playwright config + tests, plus a CI workflow that runs a per-example matrix across React 18/19. - Updates examples to render a consistent visitor-id test target and to optionally pass
regionintoFingerprintProvider. - Adjusts example build/serve scripts and adds required tooling deps (
@playwright/test,sirv-cli) and ignores Playwright artifacts.
Reviewed changes
Copilot reviewed 37 out of 42 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| tsconfig.eslint.json | Includes e2e/**/*.ts in ESLint’s TS project scope. |
| pnpm-lock.yaml | Locks new dev deps (Playwright + sirv-cli) and related transitive changes. |
| package.json | Adds test:e2e script and Playwright dev dependency. |
| examples/webpack-based/webpack.config.js | Makes dotenv loading tolerant of missing .env.local and allows CI env fallback. |
| examples/webpack-based/src/index.js | Adds optional region env parsing and passes region to provider. |
| examples/webpack-based/src/App.js | Renders visitor ID in a consistent data-testid="visitor-id" span. |
| examples/webpack-based/package.json | Adds production build mode and serve command (sirv). |
| examples/webpack-based/.env.example | Documents optional REACT_APP_FPJS_REGION. |
| examples/vite/src/vite-env.d.ts | Declares optional VITE_FPJS_REGION. |
| examples/vite/src/main.tsx | Parses optional region env and passes region to provider. |
| examples/vite/src/App.tsx | Renders visitor ID in a data-testid="visitor-id" span and simplifies hook usage. |
| examples/vite/package.json | Pins preview port/strictPort and adds typecheck script. |
| examples/vite/.env.example | Documents optional VITE_FPJS_REGION. |
| examples/preact/src/index.tsx | Parses optional region env and passes region to provider. |
| examples/preact/src/env.d.ts | Adds a minimal process.env.PREACT_APP_* declaration for TS without Node types. |
| examples/preact/src/components/app.tsx | Adds data-testid="visitor-id" to the visitor-id element. |
| examples/preact/preact.config.js | Removes custom dotenv/DefinePlugin injection. |
| examples/preact/package.json | Adds typecheck and runs it as part of build; removes dotenv dep. |
| examples/preact/.env.example | Documents optional PREACT_APP_FPJS_REGION. |
| examples/next/pages/index.tsx | Adds data-testid="visitor-id" around the visitor ID. |
| examples/next/pages/_app.tsx | Parses optional NEXT_PUBLIC_FPJS_REGION and passes region to provider. |
| examples/next/package.json | Fixes start port and adds typecheck. |
| examples/next/.env.example | Documents optional NEXT_PUBLIC_FPJS_REGION. |
| examples/next-appDir/package.json | Fixes start port and adds typecheck. |
| examples/next-appDir/app/layout.tsx | Parses optional NEXT_PUBLIC_FPJS_REGION and passes region to provider. |
| examples/next-appDir/app/HomePage.tsx | Adds data-testid="visitor-id" around the visitor ID. |
| examples/next-appDir/.env.example | Documents optional NEXT_PUBLIC_FPJS_REGION. |
| examples/create-react-app/src/shared/utils/env.ts | Adds optional REACT_APP_FPJS_REGION parsing/export. |
| examples/create-react-app/src/shared/components/VisitorDataPresenter.tsx | Wraps visitor ID in data-testid="visitor-id" for e2e targeting and tightens rendering checks. |
| examples/create-react-app/src/session_storage_cache/SessionStorageCache.tsx | Passes region into provider. |
| examples/create-react-app/src/react-app-env.d.ts | Adds CRA type refs and CSS module declaration to fix TS compatibility. |
| examples/create-react-app/src/no_cache/WithoutCache.tsx | Passes region into provider. |
| examples/create-react-app/src/local_storage_cache/LocalStorageCache.tsx | Passes region into provider. |
| examples/create-react-app/src/in_memory_cache/InMemoryCache.tsx | Passes region into provider. |
| examples/create-react-app/package.json | Adds sirv-based serve and a typecheck script. |
| examples/create-react-app/.env.example | Documents optional REACT_APP_FPJS_REGION. |
| e2e/tests/example.spec.ts | Adds a framework-agnostic Playwright test asserting the visitor ID renders. |
| e2e/README.md | Documents how the e2e system works and how to run it locally. |
| e2e/playwright.config.ts | Adds Playwright config that builds+serves the selected example via EXAMPLE. |
| e2e/examples.ts | Defines the example→command/port mapping and resolveExample. |
| .gitignore | Ignores Playwright reports, test results, and e2e cache. |
| .github/workflows/e2e.yml | Adds CI job matrix to run e2e per-example across React 18/19 (+ Preact). |
Files not reviewed (1)
- pnpm-lock.yaml: Generated file
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
|
@copilot resolve the merge conflicts in this pull request |
Resolved the merge conflicts with |
🚀 Following releases will be created using changesets from this PR:@fingerprint/react@3.1.0Minor Changes
Patch Changes
|
preact/compat).e2e/examples.tsis the single source of truth (example → build+serve command + port); CI selects one viaEXAMPLE.*_FPJS_REGIONsupport in every example (default behavior unchanged).react-app-env.d.ts; remove broken Preactpreact.config.js(redundant with CLI env injection).Closes INTER-2322.
Discussion point: build+serve instead of
devE2e boots production builds (
buildthenstart/preview/serve) so bundling failures (and each example’s own typecheck, where it has one) fail before Playwright. Preact foldstscinto itsbuildscript because preact-cli itself does not typecheck.Required CI config
Settings → Secrets and variables → Actions:
FPJS_PUBLIC_API_KEY— public API key (secret or variable)FPJS_REGION— optionalus|eu|ap(must match the key when set)The workflow fails fast if the API key is missing, or if
FPJS_REGIONis set to an invalid value.Matrix
preact/compat)