v0.8.0
Highlights
- New
@hover-dev/transform-source— private workspace package with per-framework transforms (JSX / Vue SFC / Svelte 5 / Astro). Stamps host elements withdata-hover-source="<file>:<line>:<col>"so the widget's Fix popover can point your coding agent at the exact file location. - All 5 integration shims now wire the transform at runtime, each using the most idiomatic hook for its bundler:
vite-plugin-hover:transform()withenforce:'pre'@hover-dev/astro:load()interception + plugin re-order (Astro's own compiler runs inload(), sotransform()is too late)@hover-dev/nuxt:addVitePlugin()into Nuxt's Vite chainwebpack-plugin-hover: separatedist/loader.js+ module rule@hover-dev/next: Turbopackturbopack.rules['*.{jsx,tsx}']pointing atdist/source-loader.js. Also works onnext dev --webpack.
Bug fixes (user-reported in flight)
ERR_REQUIRE_ESMfrom mockttp + get-port under@hover-dev/security.engines.node >= 22.12declared;register-nodeprints an actionable diagnostic when the failure surfaces with the exactpnpm overridessnippet to apply. Upstream tracking: httptoolkit/mockttp#200.Cannot get schema for 'PrivateKeyInfo' targetwhen enabling security mode. Root cause:@peculiar/asn1-schemakeeps a per-module-instance schema registry; pnpm-induced multi-copy splits it. Pinned2.6.0as a direct dep;startProxy()port-retry loop now distinguishes EADDRINUSE from CA-generation failures and rewrites the error into an actionable message. Tracking: PeculiarVentures/asn1-schema#111.Module not found: Can't resolve 'atpl'onpnpm dev:example:next-app. Turbopack was pulling the source-loader (which barrel-imported Vue/Svelte/Astro transforms) into Server Component bundles, choking on@vue/compiler-sfc's optional template-enginerequire()s. Switched source-loader to sub-path import@hover-dev/transform-source/jsx; obscured the dynamic specifier so Turbopack's static tracer stops walking through it.- Widget never injected under webpack when consumed via pnpm.
HtmlWebpackPlugin.getHooks(compilation)is keyed on a per-module WeakMap; user's copy and our copy were two distinct module instances. Now wecreateRequirefromcompiler.contextso we load the same instance the user passed to webpack.
Polish
- 4 transforms (JSX/Vue/Svelte/Astro) now report the
<character's 1-indexed line+column uniformly. JSX previously pointed at the tag name's first char — different by 1 from the other three. - All Vite-side transforms gain
sourceAttribution?: booleanopt-out viaHoverOptions. pnpm dev:example:webpack-appquieted viastats: 'errors-warnings'.- Two Next-dev warnings silenced:
tsupimport.meta-in-cjs and TurbopackCan't resolve <dynamic>.
Validation
All 9 examples smoke-tested:
| Example | data-hover-source count |
|---|---|
| basic-app | 61 |
| e-commerce | 144 |
| stock-registration | 46 |
| canvas-paint | 90 |
| astro-app | 24 (Astro load() interception) |
| nuxt-app | 15 in SSR HTML |
| next-app | 6 in SSR HTML |
| webpack-app | n/a (vanilla JS, by design) |
| rn-web-app | 0 (RN components are PascalCase, by design) |
pnpm typecheck ✓ · pnpm test 209 tests pass · 2 Playwright e2e ✓.
Known limitations
- Astro
load()interception is unsupported by Astro — theserver.config.pluginsre-order trick depends on internals. Tested against Astro 5.18.1. Astro minors may break it; if so, only.astrosource attribution degrades, the rest stays working. - Next + Turbopack uses our Node-side webpack loader. A native Rust SWC plugin would be faster but is a 3–5 week project; Turbopack's webpack-loader bridge is the maintainer-blessed path and the perf cost (~1ms/file) is negligible for a one-attribute stamp.
Full diff
See PR #46 for the squashed change, or v0.7.5...v0.8.0 for everything.