v2.79.0: Ember.js / Glimmer plugin, JSX + class-member + worker / loader false-positive fixes
Highlights
Ember.js / Glimmer / Embroider plugin. First-class support for strict-mode Ember apps and v2 addons: ember-source / ember-cli / @embroider/* packages stay credited, framework-invoked lifecycle methods on Component / Route / Controller / Service / Helper / Modifier / Application / Router subclasses are no longer flagged as unused class members, the @ember/* virtual-module paths exposed through the AMD loader and Embroider rewriter stop reporting as unresolved imports, and classic-layout filesystem conventions (app/components/**, app/routes/**, tests/**/*-test.{js,ts,gjs,gts}, ember-cli-build.js, etc.) are added as entry-point globs. .gts / .gjs single-file components are first-class: imports referenced inside <template>...</template> blocks (PascalCase tag invocation, mustache / triple-stash / sub-expression helpers, element modifiers, dotted refs) are credited; Handlebars built-ins (if, unless, each, let, yield), this.* chains, and @arg references are not. Thanks @mike-engel for the plugin (PR #369).
False-positive fixes across JSX, class members, Cloudflare Workers, Content Collections, Node loaders, and HTML scaffolding.
Added
- Ember.js / Glimmer / Embroider plugin with strict-mode
.gts/.gjstemplate-binding usage tracking. See above.
Fixed
-
JSX resource attributes no longer report as unresolved imports. Generic TSX metadata like
<link rel="stylesheet" href="style-a.css" />,<link rel="modulepreload" href="/vendor.js" />, and<script src="./script-a.js" />no longer emit synthetic side-effect imports; HTML files and barehtmltagged-template asset scanning are unchanged. (Closes #640.) -
Combined human summaries are less repetitive, and
fallow explainaccepts issue labels with spaces.fallow --summaryno longer prints both a section header and the summary renderer's own title; theloaded config:notice is deduped per config file;fallow explain unused filesandfallow explain code duplicationwork the same as the hyphenated spellings. -
Public class members exposed through non-private package entry points are no longer reported as removable internals. Library packages that re-export builder or database classes from
package.jsonentry points (main, rootexports, or subpathexports) had every uncalled public method reported asunused-class-member.find_unused_membersnow treats classes reached from non-private entry-point re-exports (including the transitiveexport *closure andsrc/**/index.*source subpath indexes in packages without anexportsmap) as public API and skips class member findings for those exports. Enum members, private app packages, and internal reachable classes are unchanged. (Closes #643.) -
Cloudflare Workers, Content Collections, and Node
module.register()loaders no longer surface as false positives. Cloudflare Workers projects with"main": "src/worker.tsx"(or anyenv.<name>.mainoverride) inwrangler.{toml,json,jsonc}keep that worker entry alive; the static glob widens tosrc/{index,worker}.{ts,tsx,js,jsx,mts,mjs}. Content Collections projects (@content-collections/{core,vite,next,solid-start,remix-vite,qwik,vinxi}) keep their root config alive and the integration packages stay credited. Nodemodule.register('./hooks/loader.ts', import.meta.url)calls now credit the loader file's hook exports (initialize/resolve/load/globalPreloadplus legacygetFormat/getSource/transformSource). Thanks @M-Hassan-Raza for the patch. (Closes #588, #589, #590.) -
Playwright
extend()fixture helpers are credited as used class members. Helper classes referenced only as Playwright fixtures (test.extend({ helper: async ({}, use) => use(new MyHelper(page)) })) no longer report every public method asunused-class-member. Playwright Page Object Model patterns no longer surface false-positive removable-internal findings. -
HTML asset scanner skips build-time template-placeholder specifiers.
<script src="{{rootURL}}assets/app.js">(Ember'sapp/index.html),<script src="###APPNAME###/...">(ember-cli blueprint scaffolds), and equivalent shapes from Handlebars / Mustache / Jinja2 / pre-compiled Vue or Angular templates are filtered at extraction time instead of being seeded as unresolvable specifiers.{{and###are never valid in a real<script src>/<link href>path, so the filter is generic across template engines.
Install
npm install -g fallow@2.79.0or via Homebrew, cargo install fallow-cli, or the install script. See INSTALL.md for the full matrix.
Full Changelog: v2.78.1...v2.79.0