Skip to content

v2.79.0: Ember.js / Glimmer plugin, JSX + class-member + worker / loader false-positive fixes

Choose a tag to compare

@BartWaardenburg BartWaardenburg released this 22 May 21:30
· 502 commits to main since this release
v2.79.0
6d5b84c

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 / .gjs template-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 bare html tagged-template asset scanning are unchanged. (Closes #640.)

  • Combined human summaries are less repetitive, and fallow explain accepts issue labels with spaces. fallow --summary no longer prints both a section header and the summary renderer's own title; the loaded config: notice is deduped per config file; fallow explain unused files and fallow explain code duplication work 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.json entry points (main, root exports, or subpath exports) had every uncalled public method reported as unused-class-member. find_unused_members now treats classes reached from non-private entry-point re-exports (including the transitive export * closure and src/**/index.* source subpath indexes in packages without an exports map) 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 any env.<name>.main override) in wrangler.{toml,json,jsonc} keep that worker entry alive; the static glob widens to src/{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. Node module.register('./hooks/loader.ts', import.meta.url) calls now credit the loader file's hook exports (initialize / resolve / load / globalPreload plus legacy getFormat / 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 as unused-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's app/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.0

or 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