v2.82.0: framework plugins, quieter output, safer fixes
Highlights
A broad framework-plugin release: ng-packagr Angular libraries, electron-vite, Playwright webServer, SvelteKit remote functions, k6, Supabase Edge Functions, Mintlify, and Iconify icon packages all stop producing false unused findings out of the box. Plus quieter JSON output, smarter fallow fix, and a binary-verification model that no longer relies on npm install scripts.
Features
Framework plugins
- Angular ng-packagr libraries:
lib.entryFilefromng-package.json/ng-package.prod.json(defaultsrc/public_api.ts) is now a package entry point, resolved relative to the config directory, so the library public API and everything reachable through its re-export chain stays alive instead of reporting as unused. Nested secondary-entry-point configs (packages/lib/client/ng-package.json) are scanned too, and the plugin also activates on ang-packagrdependency. (#606) - electron-vite: renderer, preload, and main entries declared in
electron.vite.config.*build.rollupOptions.input(string, array, and object forms, includingresolve(__dirname, ...)path helpers) are treated as entry points. (#600) - Playwright
webServer.command: CLI dependencies and local server scripts launched bywebServer.command(object and array forms) are credited and kept reachable, with paths resolved relative to the config directory. (#621) - Vitest
test.alias/resolve.alias: now recognized invite.config.*, intest.projects[*], and invitest.workspace.*files, covering mock and virtual-module aliases so they stop reporting as unresolved imports, unlisted dependencies, or unused exports. (#601) - SvelteKit remote functions:
src/**/*.remote.{ts,js}files and their exportedquery/command/form/prerenderfunctions are kept reachable. (#611) - k6: load-test scripts (
*.k6.{js,ts,...}) act as runtime entry surfaces, thek6CLI is credited, and thek6/k6/*runtime namespace is recognized. (#625) - Supabase Edge Functions: Deno
jsr:/npm:/ URL imports resolve correctly, andsupabase/functions/*/index.*files are runtime entry roots. (#624) - Mintlify:
docs.json/mint.json, themint/mintlifyCLI, and MDX content under the docs root are recognized via a new built-in plugin. (#626) - Iconify:
@iconify-json/<prefix>packages used only through static icon strings (<Icon name="jam:github" />) are credited as referenced. Thanks @nicolas-deyros for the report. (#608)
Bug fixes
- Vite path-helper entries:
build.rollupOptions.input/build.lib.entrywritten asresolve(__dirname, ...)/path.resolve(...)/join(...)/import.meta.dirnamecalls are evaluated to entry patterns; the shared extractor also benefits Webpack, Rspack, Rsbuild, Rolldown, Rollup, Vitest, and Drizzle. (#604) - Error subclass
name: anamemember on a class whose heritage reaches a native error constructor (Error,TypeError, ...) is treated as runtime-used rather than an unused class member. (#620) new Class().method()receivers: methods called on a freshly-constructed instance, directly or through a self-returning fluent chain, are credited. (#605)fallow fixlow-confidence exports: export removals are withheld for files under off-graph consumer directories (__mocks__,e2e,fixtures, ...) and files with unresolved imports, so a fix never turns an analysis false positive into a broken build. Askipped_low_confidence_exportscount and per-entryskip_reasonare added to JSON output. (#602)- Quieter JSON / CI output: repeated workspace and plugin diagnostics on stderr are aggregated into one summary line per glob pattern or framework, instead of one line per directory. The structured
workspace_diagnostics[]array is unchanged. (#637)
Changed
- Binary verification moved from
npm install'spostinstallhook to first-run insidefallow,fallow-lsp, andfallow-mcp. The Ed25519 signature + SHA-256 digest check is preserved bit-for-bit (same key, same fail-closed behavior); a sentinel caches the verified state per install dir + binary hash. This removes the dependency on npm install scripts ahead of npm RFC 868.fallow --versionnow prints averified: yesline;FALLOW_SKIP_BINARY_VERIFY=1warns once per invocation when active, andFALLOW_VERIFY_CACHE_DIRredirects the sentinel for read-only install dirs. --performanceannotations: theparse/extractline gains a(parallel: ~Nms CPU)suffix, reused health stages read(measured above), and both breakdowns gain an(other)row so stages reconcile withTOTAL. JSON output gains observationalparse_cpu_ms/shared_parsefields. (#481)