Skip to content

Commit 71d6f77

Browse files
authored
Merge pull request #111 from TechFides/chore/keep-playwright-versions-aligned
fix(deps): keep playwright and @playwright/test on one version
2 parents 6cc55d1 + f71d76a commit 71d6f77

5 files changed

Lines changed: 77 additions & 2 deletions

File tree

docs/TESTING.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ Run:
4141

4242
Config: `playwright.config.ts`. Global setup is in `tests/smoke/global-setup.ts` (builds `dist/` and prepares fixtures).
4343

44+
`@playwright/test` (devDependency) and `playwright` (runtime dependency, used by `export-pdf`) must resolve to the same version, because `@playwright/test@X` depends on `playwright@X` exactly. Both therefore carry a caret range, and `renovate.json` exempts `@playwright/test` from the exact pin devDependencies normally get. Pin it and the next lock refresh floats `playwright` ahead of it, pnpm keeps two Playwright copies and every spec fails to collect with "two different versions of @playwright/test".
45+
4446
Every sandbox installs this package from the tarball `pnpm pack` produced, via `setup --source=file --file-path=<tgz>`. Never let a sandbox resolve `@techfides/tf-doc-vault` from npm: on a `chore(release)` commit the version in `package.json` is not published yet, so the install fails. pnpm resolves every spec already in a manifest before it applies an `add`, so swapping the dependency after scaffolding does not help; the wizard has to write the tarball path in the first place.
4547

4648
## `middleware.ts`'s Basic auth

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@
127127
"devDependencies": {
128128
"@commitlint/cli": "21.2.2",
129129
"@commitlint/config-conventional": "21.2.2",
130-
"@playwright/test": "1.62.1",
130+
"@playwright/test": "^1.62.1",
131131
"@types/markdown-it-container": "4.0.0",
132132
"@types/node": "25.9.5",
133133
"@typescript-eslint/eslint-plugin": "8.67.0",

pnpm-lock.yaml

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

renovate.json

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,17 @@
1515
"description": "Auto-merge low-risk updates once CI is green. Major updates stay manual for human review.",
1616
"matchUpdateTypes": ["minor", "patch", "digest", "pin", "bump"],
1717
"automerge": true
18+
},
19+
{
20+
"description": "@playwright/test keeps a range instead of the exact pin config:best-practices gives devDependencies. It must resolve to the same version as the runtime `playwright` dependency, which is a caret range: @playwright/test@X depends on playwright@X exactly, so an exact pin falls behind whenever lock file maintenance floats `playwright` forward, pnpm then keeps two Playwright copies and every smoke spec fails with \"two different versions of @playwright/test\".",
21+
"matchPackageNames": ["@playwright/test"],
22+
"rangeStrategy": "replace"
23+
},
24+
{
25+
"description": "Major Playwright updates land in one PR. Merging one of the two packages without the other recreates the duplicate-version failure above; non-major updates already travel together via group:allNonMajor.",
26+
"matchPackageNames": ["playwright", "@playwright/test"],
27+
"matchUpdateTypes": ["major"],
28+
"groupName": "playwright"
1829
}
1930
],
2031
"lockFileMaintenance": {
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
# Playwright: udržet obě závislosti na stejné verzi
2+
3+
**Cíl:** obnova locku (Renovate `lockFileMaintenance`) už nikdy nesmí rozejít
4+
verze `playwright` a `@playwright/test`. Rozjezd shodí celý smoke tier.
5+
6+
## Mechanismus poruchy
7+
8+
`package.json` deklaruje Playwright dvakrát a s jinou strategií:
9+
10+
- `dependencies.playwright: "^1.59.1"`: runtime závislost publikovaného balíčku,
11+
používá ji `src/scripts/export-pdf.ts`. Rozsah je pro knihovnu správný, protože
12+
konzumenti si mají verzi dedupovat sami.
13+
- `devDependencies["@playwright/test"]`: Renovate ji přes `config:best-practices`
14+
(a v něm `:pinDevDependencies`) drží připíchnutou na přesné verzi.
15+
16+
`@playwright/test@X` závisí na `playwright@X` přesně. Obnova locku sahá jen na
17+
lock, ne na `package.json`: `playwright` proto vyplave na nejnovější 1.x, zatímco
18+
připíchnutý `@playwright/test` zůstane, kde byl. pnpm pak drží dvě kopie
19+
Playwrightu a runner odmítne posbírat testy s hlášením
20+
`two different versions of @playwright/test`.
21+
22+
Takhle padl PR #40 (lock file maintenance): lock vyplaval `playwright` na 1.62.1
23+
proti připíchnutému `@playwright/test` 1.60.0. Merge PR #39 to vyřešil jen shodou
24+
okolností, protože zvedl pin na 1.62.1. Příští obnova locku by chybu vyrobila
25+
znovu.
26+
27+
## Zvažované varianty
28+
29+
| varianta | zabrání rozjezdu při obnově locku? | poznámka |
30+
| ----------------------------------------------------------------- | ---------------------------------- | --------------------------------------------------------------------------------------------- |
31+
| seskupit obě závislosti do jednoho PR | ne | obnova locku rozsahy obnovuje bez ohledu na seskupení; pomůže jen u běžných update PR |
32+
| `@playwright/test` na rozsah `^`, výjimka z pinování devDeps | **ano** | obě závislosti pak plavou na stejnou nejnovější 1.x, protože Playwright je vydává v lockstepu |
33+
| `pnpm.overrides` vynucující `playwright` podle `@playwright/test` | ano | funguje, ale přidává další mechanismus a musí se držet v synchronu; těžší než potřeba |
34+
| připíchnout runtime `playwright` přesně | ano | pro publikovanou knihovnu nevhodné: svazuje verzi konzumentům |
35+
| nechat být a opravovat ručně | ne | opakuje se každou obnovu locku, tedy potenciálně každý týden |
36+
37+
## Zvolené řešení
38+
39+
1. `package.json`: `@playwright/test` z `1.62.1` na `^1.62.1`.
40+
2. `renovate.json`: packageRule s `rangeStrategy: "replace"` pro
41+
`@playwright/test`, aby ho `:pinDevDependencies` nepřipíchlo zpátky. Popis
42+
pravidla nese důvod, protože jinak to vypadá jako odchylka od konvence repa.
43+
3. `renovate.json`: druhé pravidlo seskupuje `playwright` a `@playwright/test`
44+
pro **major** update do jednoho PR. Non-major už drží pohromadě
45+
`group:allNonMajor`; u majoru by ale sloučení jednoho bez druhého rozjezd
46+
vyrobilo znovu.
47+
4. `docs/TESTING.md`: odstavec u smoke tieru, aby někdo pin nevrátil zpátky.
48+
49+
Lock se přegeneruje `pnpm install` (mění se jen specifikátor u importera).
50+
51+
## Ověření
52+
53+
- `pnpm ls playwright @playwright/test` ukáže jedinou verzi obou.
54+
- Simulace obnovy locku (smazat `pnpm-lock.yaml`, `pnpm install`) skončí opět
55+
s jedinou verzí, což je vlastní test opravy.
56+
- `pnpm test:smoke` projde.
57+
58+
## Mimo rozsah
59+
60+
Zbytek `renovate.json` se nemění. Redundantní `security:minimumReleaseAgeNpm`
61+
a vlastní blok `lockFileMaintenance` (obojí už přichází z
62+
`config:best-practices`) zůstávají, jak jsou; je to samostatné téma.

0 commit comments

Comments
 (0)