image-gin

Toolchain current: ESLint 10.7, obsidianmd rules 0.4, and types that match Obsidian's actual runtime

Image-gin's dev toolchain catches up in one pass — and Obsidian's own upgraded lint ruleset immediately starts earning its keep by pointing at the new declarative settings API.

Why Care?

A plugin that generates images through three external APIs (Recraft, Freepik, ImageKit) lives and dies by its type-checking and linting — the compiler is the only thing standing between a renamed API field and a runtime surprise in someone's vault. This pass brings every tool in that chain current, including the ruleset Obsidian's own review bot uses.

What's New?

  • eslint-plugin-obsidianmd 0.2.9 → 0.4.1 — Obsidian's official lint rules, two 0.x-majors ahead. The upgraded ruleset immediately flagged three things worth knowing about (all warnings, zero errors): two activeWindow.setTimeout calls that should use window timers, and — more interestingly — that our settings tab predates Obsidian 1.13's new declarative settings API, so it won't appear in settings search for users on 1.13+. That's a real feature nudge, logged as a follow-up.

  • ESLint 10.3 → 10.7, typescript-eslint 8.59.1 → 8.65.0, @eslint/plugin-kit 0.7.2, esbuild 0.28.1 — routine currency.

  • @types/node pinned down 25 → 22. Obsidian's desktop app ships Electron 39 = Node 22; types for Node 25 describe APIs the runtime doesn't have. Matching types to runtime means tsc can't be fooled into approving code that would crash in-app.

  • TypeScript was already at 6.0.3 — the officially-recommended stop-over before the native TypeScript 7 — so no compiler move was needed.

Verified: full pnpm build green — ESLint (0 errors), tsc -noEmit, esbuild production bundle at 93 KB.

Part of the family-wide dependency campaign: content-farm/context-v/plans/Dependency-Upgrades-Across-Plugin-Family.md.

Follow-ups surfaced by the new ruleset

  • Adopt getSettingDefinitions() (declarative settings API) so settings surface in Obsidian 1.13+ settings search — src/settings/settings.ts

  • Swap two activeWindow.setTimeoutwindow.setTimeoutsrc/modals/MagnificModal.ts and one sibling call site