CI: build the WSL job on ext4, skip the unused Chromium download, list tsconfig types

The Windows WSL job is the critical path of every CI run (589 to 752 s).
Its checkout sits on the Windows drive, which WSL reaches over 9P, and
writing node_modules there is what makes npm ci take about three minutes
where the Linux job takes 23 s. The step now copies the tree onto the
distro's ext4 filesystem before installing and building, as Microsoft's
WSL guidance recommends for I/O-heavy work.

The e2e job downloaded the full Chromium build (about 165 MB) on every
run, but a headless run with no channel launches chromium-headless-shell
and never opens it. `--only-shell` skips that download.

Every tsconfig now lists the @types packages it uses (node, bun,
vite/client, dom-speech-recognition) instead of relying on TypeScript
auto-including everything under node_modules/@types. On TypeScript 5.9
this is a no-op: identical diagnostics across all 48 projects and
byte-identical emitted .d.ts files. It is a prerequisite for TypeScript 7,
which drops the auto-inclusion; with these lists the Go compiler passes
all 48 projects, so that upgrade becomes a version bump once TypeDoc
supports it.

Two cache-based approaches were evaluated and rejected: an npm cache for
the WSL job (npm ci is slow there because of 9P, not downloads, and a
prefix-restored cache grows without bound) and a Playwright browser cache
(Playwright's docs advise against it; the download is under 10 s).
This commit is contained in:
Olivier Chafik 2026-09-08 18:38:58 +01:00
commit a0dcf16843
49 changed files with 56 additions and 1 deletions

View file

@ -147,8 +147,10 @@ jobs:
- run: npm ci - run: npm ci
# Headless runs without a channel use chromium-headless-shell, so the
# full Chromium build (about 165 MB) would only be downloaded, never run.
- name: Install Playwright browsers - name: Install Playwright browsers
run: npx playwright install --with-deps chromium run: npx playwright install --with-deps --only-shell chromium
- name: Run E2E tests - name: Run E2E tests
run: npx playwright test --reporter=list run: npx playwright test --reporter=list
@ -180,9 +182,14 @@ jobs:
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash - curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt-get install -y nodejs sudo apt-get install -y nodejs
# The checkout lives on the Windows drive, which WSL reaches over 9P;
# writing node_modules there is what makes this job slow (npm ci alone
# took about 3 minutes). Copy the tree onto the distro's ext4 filesystem
# first, as Microsoft's WSL guidance recommends for anything I/O heavy.
- name: Build and test in WSL - name: Build and test in WSL
shell: wsl-bash {0} shell: wsl-bash {0}
run: | run: |
cp -r "$(pwd)" ~/ext-apps && cd ~/ext-apps
npm ci npm ci
npm run build npm run build
npm run examples:build npm run examples:build

View file

@ -1,5 +1,6 @@
{ {
"compilerOptions": { "compilerOptions": {
"types": ["node", "vite/client"],
"target": "ESNext", "target": "ESNext",
"lib": ["ESNext", "DOM", "DOM.Iterable"], "lib": ["ESNext", "DOM", "DOM.Iterable"],
"module": "ESNext", "module": "ESNext",

View file

@ -1,5 +1,6 @@
{ {
"compilerOptions": { "compilerOptions": {
"types": ["node", "vite/client"],
"target": "ESNext", "target": "ESNext",
"lib": ["ESNext", "DOM", "DOM.Iterable"], "lib": ["ESNext", "DOM", "DOM.Iterable"],
"module": "ESNext", "module": "ESNext",

View file

@ -1,5 +1,6 @@
{ {
"compilerOptions": { "compilerOptions": {
"types": ["node"],
"target": "ES2022", "target": "ES2022",
"lib": ["ES2022"], "lib": ["ES2022"],
"module": "NodeNext", "module": "NodeNext",

View file

@ -1,5 +1,6 @@
{ {
"compilerOptions": { "compilerOptions": {
"types": ["node", "vite/client"],
"target": "ESNext", "target": "ESNext",
"lib": ["ESNext", "DOM", "DOM.Iterable"], "lib": ["ESNext", "DOM", "DOM.Iterable"],
"module": "ESNext", "module": "ESNext",

View file

@ -1,5 +1,6 @@
{ {
"compilerOptions": { "compilerOptions": {
"types": ["node"],
"target": "ES2022", "target": "ES2022",
"lib": ["ES2022"], "lib": ["ES2022"],
"module": "NodeNext", "module": "NodeNext",

View file

@ -1,5 +1,6 @@
{ {
"compilerOptions": { "compilerOptions": {
"types": ["node", "vite/client"],
"target": "ESNext", "target": "ESNext",
"lib": ["ESNext", "DOM", "DOM.Iterable"], "lib": ["ESNext", "DOM", "DOM.Iterable"],
"module": "ESNext", "module": "ESNext",

View file

@ -1,5 +1,6 @@
{ {
"compilerOptions": { "compilerOptions": {
"types": ["node"],
"target": "ES2022", "target": "ES2022",
"lib": ["ES2022"], "lib": ["ES2022"],
"module": "NodeNext", "module": "NodeNext",

View file

@ -1,5 +1,6 @@
{ {
"compilerOptions": { "compilerOptions": {
"types": ["node", "vite/client"],
"target": "ESNext", "target": "ESNext",
"lib": ["ESNext", "DOM", "DOM.Iterable"], "lib": ["ESNext", "DOM", "DOM.Iterable"],
"module": "ESNext", "module": "ESNext",

View file

@ -1,5 +1,6 @@
{ {
"compilerOptions": { "compilerOptions": {
"types": ["node"],
"target": "ES2022", "target": "ES2022",
"lib": ["ES2022"], "lib": ["ES2022"],
"module": "NodeNext", "module": "NodeNext",

View file

@ -1,5 +1,6 @@
{ {
"compilerOptions": { "compilerOptions": {
"types": ["node", "vite/client"],
"target": "ESNext", "target": "ESNext",
"lib": ["ESNext", "DOM", "DOM.Iterable"], "lib": ["ESNext", "DOM", "DOM.Iterable"],
"module": "ESNext", "module": "ESNext",

View file

@ -1,5 +1,6 @@
{ {
"compilerOptions": { "compilerOptions": {
"types": ["node"],
"target": "ES2022", "target": "ES2022",
"lib": ["ES2022"], "lib": ["ES2022"],
"module": "NodeNext", "module": "NodeNext",

View file

@ -1,5 +1,6 @@
{ {
"compilerOptions": { "compilerOptions": {
"types": ["node", "vite/client"],
"target": "ESNext", "target": "ESNext",
"lib": ["ESNext", "DOM", "DOM.Iterable"], "lib": ["ESNext", "DOM", "DOM.Iterable"],
"module": "ESNext", "module": "ESNext",

View file

@ -1,5 +1,6 @@
{ {
"compilerOptions": { "compilerOptions": {
"types": ["node"],
"target": "ES2022", "target": "ES2022",
"lib": ["ES2022"], "lib": ["ES2022"],
"module": "NodeNext", "module": "NodeNext",

View file

@ -1,5 +1,6 @@
{ {
"compilerOptions": { "compilerOptions": {
"types": ["node", "vite/client"],
"target": "ESNext", "target": "ESNext",
"lib": ["ESNext", "DOM", "DOM.Iterable"], "lib": ["ESNext", "DOM", "DOM.Iterable"],
"module": "ESNext", "module": "ESNext",

View file

@ -1,5 +1,6 @@
{ {
"compilerOptions": { "compilerOptions": {
"types": ["node"],
"target": "ES2022", "target": "ES2022",
"lib": ["ES2022"], "lib": ["ES2022"],
"module": "NodeNext", "module": "NodeNext",

View file

@ -1,5 +1,6 @@
{ {
"compilerOptions": { "compilerOptions": {
"types": ["node", "vite/client"],
"target": "ESNext", "target": "ESNext",
"lib": ["ESNext", "DOM", "DOM.Iterable"], "lib": ["ESNext", "DOM", "DOM.Iterable"],
"module": "ESNext", "module": "ESNext",

View file

@ -1,5 +1,6 @@
{ {
"compilerOptions": { "compilerOptions": {
"types": ["node"],
"target": "ES2022", "target": "ES2022",
"lib": ["ES2022"], "lib": ["ES2022"],
"module": "NodeNext", "module": "NodeNext",

View file

@ -1,5 +1,6 @@
{ {
"compilerOptions": { "compilerOptions": {
"types": ["node", "vite/client"],
"target": "ESNext", "target": "ESNext",
"lib": ["ESNext", "DOM", "DOM.Iterable"], "lib": ["ESNext", "DOM", "DOM.Iterable"],
"module": "ESNext", "module": "ESNext",

View file

@ -1,5 +1,6 @@
{ {
"compilerOptions": { "compilerOptions": {
"types": ["node"],
"target": "ES2022", "target": "ES2022",
"lib": ["ES2022"], "lib": ["ES2022"],
"module": "NodeNext", "module": "NodeNext",

Some files were not shown because too many files have changed in this diff Show more