Skip to content

chore(deps): jsdom 30, knip 6, Kotlin 2.4.10 / Gradle 9.7.1 / commonmark 0.30 — with the code changes the bumps need - #377

Merged
itsdestin merged 3 commits into
masterfrom
chore/deps-jsdom30-knip6-gradle
Sep 1, 2026
Merged

chore(deps): jsdom 30, knip 6, Kotlin 2.4.10 / Gradle 9.7.1 / commonmark 0.30 — with the code changes the bumps need#377
itsdestin merged 3 commits into
masterfrom
chore/deps-jsdom30-knip6-gradle

Conversation

@itsdestin

Copy link
Copy Markdown
Owner

Lands three dependabot bumps that were red because each needs a small accompanying change. Supersedes #271 (jsdom), #338 (gradle group), and #270 (knip) — those can be closed once this merges. Also unblocks the knip prerequisite for the TypeScript 7 bump (#242).

One commit per bump:

jsdom 29.1.1 → 30.0.1 (supersedes #271)

tests/dialog-shell.test.tsx failed because jsdom 30's CSSOM re-serializes math functions on the way in: min(476px, calc(100vh - 6rem)) reads back as min(476px, -6rem + 100vh). The two assertions compared the panel's inline style to the raw DIALOG_MAX_HEIGHTS constant, so they were pinning jsdom's spelling rather than the Dialog's behaviour. They now round-trip the constant through the same CSSOM and compare against that, with a non-empty guard so a jsdom that silently drops the value can't pass as '' === ''. jsdom 30 also parses height: min(...) (29 dropped it), so the fill test reads .style.height directly.

Gradle group: Kotlin 2.4.10, Gradle 9.7.1, commonmark 0.30.0 (supersedes #338)

Same four versions dependabot proposed (wrapper jar taken from its branch).

  • app/build.gradle.kts: Kotlin 2.4 removed the android { kotlinOptions {} } DSL, so the build script itself stopped compiling → migrated to top-level kotlin { compilerOptions { jvmTarget.set(JvmTarget.JVM_17) } }.
  • Three JVM unit tests used kotlin.io.createTempDir(), which Kotlin 2.4 makes a compile error → migrated to kotlin.io.path.createTempDirectory (the replacement PluginInstallerUpgradeTest already used).

knip 5.88.1 → 6.32.2 (supersedes #270)

What actually made npm run knip exit 1 is one new category: knip 6 reads command names out of execFile/spawn calls and reports "unlisted binaries" (ss, tasklist, rclone), which defaults to error. Verified: knip 6 with --exclude binaries exits 0 on the same tree. The 77 unused exports / 172 unused types are not new — they were already warn (knip 5 reports 81 / 379 on the same tree and exits 0), so no code was deleted.

knip.jsonc changes, each per a knip 6 configuration hint (all WHY-commented in the file):

  • $schema → knip@6; classMembers rule dropped (issue type removed in v6).
  • entry: main.ts / renderer/index.tsx / vite.config.ts removed — the vite and electron plugins derive them; listing them is flagged as redundant.
  • ignore: ["dist/**"] removed (redundant).
  • project now includes .css so CSS @imports are followed; that lets knip see @import "tailwindcss" in globals.css, so the tailwindcss ignoreDependencies entry is gone too.
  • ignoreBinaries: ss (Linux, engine-supervisor port-owner lookup), tasklist (Windows, sync PID liveness), rclone (Drive sync transport, user-installed). binaries stays at error so a new unlisted binary still fails CI.

Result: npm run knip exits 0 with zero configuration hints.

Verification

  • bash scripts/verify.sh worktrees/deps-desktopOK — all checks passed (tsc, full vitest suite 606 files / 7790 tests, knip, eslint, ast-grep).
  • JAVA_HOME=java-21 ANDROID_HOME=~/.android-sdk ./gradlew test -x bundleWebUiBUILD SUCCESSFUL, 636 tests / 0 failures across debug, release, releaseTest.

For the reviewer

  • The jsdom test helper (cssSerialized) is the one judgement call: it asserts "the panel carries exactly this cap as the CSSOM serializes it" rather than a literal string. The non-empty guard is what keeps it from being vacuous.
  • No live code was deleted for knip; the exports/types warnings are the same backlog as before.

🤖 Generated with Claude Code

https://claude.ai/code/session_017RfiCWxEQuKBW4vM7GWkhY

itsdestin and others added 3 commits September 1, 2026 13:00
…s CSS through the CSSOM

Supersedes dependabot #271, which was red on tests/dialog-shell.test.tsx.

Why the test change: jsdom 30's cssstyle re-serializes math functions on the
way in — `min(476px, calc(100vh - 6rem))` reads back as
`min(476px, -6rem + 100vh)` (jsdom 29 echoed the source text). The two
assertions compared the panel's inline style to the raw DIALOG_MAX_HEIGHTS
constant, so they were pinning jsdom's spelling rather than the Dialog's
behaviour. They now round-trip the constant through the same CSSOM and compare
against that, with a non-empty guard so a jsdom that silently drops the value
cannot pass as '' === ''. jsdom 30 also parses `height: min(...)` (29 dropped
it), so the fill test reads `.style.height` directly instead of the attribute.

Full desktop suite under jsdom 30: 606 files / 7790 tests passed.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017RfiCWxEQuKBW4vM7GWkhY
…30.0) — kotlinOptions → compilerOptions, createTempDir → createTempDirectory

Supersedes dependabot #338 (4 updates: org.jetbrains.kotlin.android 2.1.0 →
2.4.10, org.jetbrains.kotlin.plugin.compose 2.1.0 → 2.4.10, gradle wrapper
9.6.1 → 9.7.1, org.commonmark:commonmark 0.29.0 → 0.30.0). The wrapper jar is
the one from dependabot's branch.

Why the accompanying changes:
- app/build.gradle.kts: Kotlin 2.4 removed the `android { kotlinOptions {} }`
  DSL (deprecated since 2.0), so the build script itself no longer compiled.
  Replaced with the top-level `kotlin { compilerOptions { jvmTarget } }` DSL.
- Three JVM unit tests used kotlin.io.createTempDir(), whose deprecation is a
  compile ERROR in Kotlin 2.4; migrated to kotlin.io.path.createTempDirectory,
  the same replacement PluginInstallerUpgradeTest already used.

Verified in the worktree with
`JAVA_HOME=java-21 ANDROID_HOME=~/.android-sdk ./gradlew test -x bundleWebUi`:
BUILD SUCCESSFUL, 636 tests / 0 failures across debug, release, releaseTest.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017RfiCWxEQuKBW4vM7GWkhY
… three OS binaries it now detects

Supersedes dependabot #270, which was red because `npm run knip` exited 1.

What actually changed the exit code: knip 6 reads the command name out of
child_process execFile/spawn calls and reports "unlisted binaries" (`ss`,
`tasklist`, `rclone`) — a category whose rule defaults to error. Verified by
running knip 6 with `--exclude binaries` on the same tree: exit 0. The 77
unused exports / 172 unused types are NOT new — they were already `warn` (knip 5
reported 81 / 379 on the same tree and exited 0), so no code was deleted.

knip.jsonc changes, each per a knip 6 configuration hint:
- $schema → knip@6; `classMembers` rule dropped (issue type removed in v6).
- entry: main.ts / renderer/index.tsx / vite.config.ts removed — the vite and
  electron plugins derive them, and listing them is flagged as redundant.
- ignore `dist/**` removed (redundant; never under `project`).
- project now includes .css so CSS `@import`s are followed; that lets knip see
  `@import "tailwindcss"` in globals.css, so the tailwindcss ignoreDependencies
  entry is gone too.
- ignoreBinaries: ss (Linux, engine-supervisor port owner lookup), tasklist
  (Windows, sync PID liveness), rclone (Drive sync transport, user-installed).
  `binaries` stays at error so a NEW unlisted binary still fails CI.

Result: `npm run knip` exits 0 with zero configuration hints.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017RfiCWxEQuKBW4vM7GWkhY
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant