Repository navigation
chore(deps): update dependency fallow to v3.37.0 - #967
renovate[bot] wants to merge 1 commit into
Conversation
|
Important Review skippedBot user detected. To trigger a single review, invoke the
|
|
Review the following changes in direct dependencies. Learn more about Socket for GitHub.
|
commit: |
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## master #967 +/- ##
=======================================
Coverage 94.77% 94.77%
=======================================
Files 10 10
Lines 746 746
Branches 235 235
=======================================
Hits 707 707
Misses 36 36
Partials 3 3 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
This PR contains the following updates:
3.36.0→3.37.0Release Notes
fallow-rs/fallow (fallow)
v3.37.0Compare Source
Added
fallow health --cssreads server-side template files as class references. Before, a class that only a Shopify.liquidsection applied was reported as anunreferenced-css-class. Fallow now reads files with the extensionsliquid,njk,hbs,handlebars,twig, andblade.php, and any class-like word in them counts as used. Templates are more lenient than Markdown: the whole text of a template counts, so a common word such ashiddenortitlein a template also credits that class, while a Markdown file counts only when it has dynamic class syntax. A class prefix before a{{echo, as ingrid--{{ columns }}, also counts.{{is a shared interpolation marker, so it also applies to.vue,.html,.mdand.astrosources with dynamic class syntax, and these can report fewer classes too. The new top-levelmarkupExtensionskey adds other template extensions, for example["tpl", "erb"]. A value that ends in a script, stylesheet, data or asset extension, such asmodule.cssord.ts, is a config error. The walk honors.gitignore,ignorePatternsand--max-file-size. These files do not join source discovery, so they never become unused files. Thanks @james2doyle for the report. (Closes #3917)The npm package now ships
rule-pack-schema.json. A rule pack can point$schemaat./node_modules/fallow/rule-pack-schema.jsonand get a schema that matches the installed Fallow version. The package also exports the file asfallow/rule-pack-schema.json. Thanks @hckhanh for the report and @tahodev for the change. (Closes #3851)An interrupted
fallow mutationrun keeps its finished results, and--resumecontinues it. Each run writes the killed and the retry-confirmed survived mutants to.fallow/mutation/journal.jsonlwhen each result is final, also with--no-cache.fallow mutation --resumereuses these results and runs only the other mutants. A journal of other inputs exits 2 withFALLOW_MUTATION_RESUME_MISMATCHand names each input that differs. A resumed mutant hasresumed: true, and the report has aresumeobject. A complete run removes the journal, and a partial run keeps it. (Closes #3783)Changed
A bare machine run that exits 0 on a failing gate now says so on stderr. Bare
fallowin--format json,sarif,codeclimate, the GitHub formats and the comment and review formats exits 0 on findings, whilefallow dead-code --format jsonexits 1 on the same findings. Before, nothing showed why. Now such a run prints one stderr line, also under--quiet, that names each failing findings gate and the flag that enforces it:[W] Exit code 0: gate error-severity-findings (2 at or above error) failed, but bare fallow does not enforce it in --format json. To exit 1 on it, pass --fail-on-issues.The exit code and stdout do not change. Thanks @Smrtnyk for the report. (Closes #3826)The exit-code contract no longer says that exit 0 means a clean run.
fallow schema(exit_codes), the fallow skill,AGENTS.mdand the npm README said that 0 means no error-severity findings. For barefallowin a machine format, that was false. They now say that 0 means no enforced gate failed, that 1 means findings and not a tool failure, and that a bare machine run gates on findings only with--fail-on-issues. To see a failing gate that did not set the exit code, readgate_outcomes.fallow mutationgives no mutant for a pure condition whose only effect is a logging call. Anifstatement such asif (count > 0) { console.info("Items", count); }gave mutants for its test that could only change which message was logged. The collector already skips eachconsole.*anddebug(...)call, and it now also skips such anifstatement. The test must be pure, and each branch must hold only logging calls with pure arguments. Anelse ifchain must meet the same conditions. The callee must be the globalconsoleordebug: a file that declares or imports one of these names keeps the conditions that call it. A condition with a call, an assignment or another statement in a branch keeps its mutants. (Closes #3719)Fixed
thin-wrapperandduplicate-prop-shapeset toerrornow fail the gates. These rules count in issue totals, the dead-code and audit gates, and CI reports when their severity iserror. Warnings stay advisory, also with--fail-on-issues. Per-file overrides and saved baselines use the component that owns each finding. Thanks @luciocabrera for the report. (Closes #3867)A CommonJS
postcss.config.cjsno longer reports itsmodule.exportskeys as unused exports. Since 3.35.0, Fallow credited only thedefaultexport of a PostCSS config. A tool that loads a CommonJS file readsmodule.exportsas its default export. When a plugin credits onlydefaultfor a CommonJS module, Fallow now credits every key ofmodule.exports. This applies to the CommonJS config files of all plugins that read the default export. UserignoreExportsrules do not change. Thanks @waldoluisribeiro for the report. (Closes #3876)fallow securityresolves a string enum member in the same module. It now reads the member like aconststring. A template literal such as`<meta name="${MetaName.BUILD_NUMBER}">`that goes to an HTML sink is no longer reported as non-literal HTML. Enums and constants that you import from another module stay unresolved, because sink extraction reads one module at a time. The extraction cache version changes, so the first run after the update parses all files again. Thanks @Smrtnyk for the report. (Closes #3854)Component export queries no longer stop type-aware refinement for the whole run. Vue, Astro, Svelte and MDX query files receive an
unsupported-syntaxabstention before the semantic backend opens them. Supported TypeScript and JavaScript queries continue to resolve in the same batch. (Closes #3763)fallow dead-codefollowschild_process.forktargets built from the module directory. A file thatfork(path.join(path.dirname(fileURLToPath(import.meta.url)), "child.ts"))starts is no longer an unused file. Fallow also readspath.resolve,__dirname,import.meta.dirnameand a constant that holds the module directory. A target with a computed segment stays unresolved. Thanks @VariableVince for the report. (Closes #3919)Config values in a same-file constant are now read. A config can keep a
part of its value in a top-level constant, for example
const UNIT = { test: { setupFiles: [...] } }withprojects: [UNIT], orsetupFiles: SETUPandtest: TEST. Fallow read only inline values, so itreported the setup files of such a Vitest project as unused files. The config
parser now uses the value of the constant in each property value and array
element that names it. This applies to all plugins that read config files. A
constant that the file declares more than one time or writes to stays
unresolved. Thanks @Smrtnyk for the report.
(Closes #3852)
fallow dead-codeno longer reports a class member as unused when an array pattern or a held getter is its only read. Without--type-aware,unused-class-membersmissed two destructure forms. The first is an array pattern around an object pattern, such asconst [{ m }] = [service]orfor (const [{ m }] of [[service]]). The second is a getter on an object literal that a variable holds, such asconst src = { get k() { return service } }with a latersrc.k.mread or{ k: { m } } = srcdestructure. Each form now credits the member. An array element after a spread, or a getter with more than one statement, gives no credit. The extraction cache version is 386. (Closes #3799)Package scripts and CI steps that run a local shell helper now credit the commands of that helper. For
bash scripts/build.shor./scripts/release.sh, Fallow reads the helper without running it. A binary that the helper runs makes its package used, and a file that the helper runs withtsxornodebecomes an entry. The helper path resolves in the package directory or in theworking-directoryof the CI step, and it must stay inside the project. Fallow follows nested helpers and stops at a cycle. It follows acdto a literal directory or to the helper directory (cd "$(dirname "$0")/.."). After anothercd, the remaining commands of the helper credit packages but do not add entries. Thanks @VariableVince for the report in #3918. (Closes #3886)fallow dead-codenow credits a store member that a helper reads through a store alias declared in a function body.unused-store-memberresolvedtype X = ReturnType<typeof useXStore>only at the top level of a module or through an import. An alias in a function body or a block now credits the store member for a parameter in the same scope. An inner type of the same name for another type still shadows the alias. A local non-store type alias also shadows a module-level store alias of the same name, so a read through the local type credits no store member. A parameter type resolves in the scope outside the function body, the same as in TypeScript. The extraction cache version is 386. (Closes #3550)Deeply nested defaults in an object pattern no longer make extraction hang. In a declaration such as
const { k: { k: { m } = s } = s } = s, each default walked its left pattern again against the fallback. The work doubled at each level of nesting, so a short file could stop the analysis. A step budget now bounds the walk of one declaration.fallow dead-codenow credits Expo config plugins that come from a local array binding. An app config can hold itspluginslist in a top-levelconstorlet, such asconst plugins = [...]; export default { plugins }. Fallow now reads that list, its spreads of array literals or other stable bindings, and entries or tuples that a binding holds. Apush,unshiftorsplicecall on the list adds its arguments, also inside a top-level block orifstatement. Anexpoobject with a type assertion, such asexpo: { ... } satisfies ExpoConfig, is read too. Fallow credits nothing from a binding that the config reassigns, from a name that the config declares more than once, or from a dynamic value. (Closes #3883)--production --type-awareno longer credits an export that only a test file uses. A type-aware reference from a file outside the analysis scope, such as a test file that production mode excludes, no longer removes a dead-code finding. Thanks @Smrtnyk for the report. (Closes #3869)Audit cleanup preserves unrelated Git worktree registrations. Removing legacy
Fallow snapshots keeps user worktrees registered when their directories are
temporarily unavailable.
(Closes #3884)
Astro extraction avoids repeated scans of malformed script and style tags. Quoted attributes retain their original source offsets and Unicode tag matching while incomplete tags no longer cause quadratic region scanning.
CODEOWNERS lookups avoid excessive memory use and slow matching with long patterns. Pattern batches bound regex fallback costs while preserving last-match precedence and GitLab section behavior.
Vue and Angular template extraction avoids repeated scans of incomplete tags. Recovery from an incomplete template tag or component interpolation no longer scans the same suffix again. Recovered references and source offsets stay the same.
MDX extraction avoids repeated parser runs on unfinished imports and exports. A multiline import or export that does not end no longer makes the parser try again for each line, and blank continuation lines are skipped.
Type-aware refinement on the
tsrsbackend no longer fails on public APIs with many non-generic interfaces. The semantic sidecar asked the checker for the type arguments of every type in the public API walk. Ontsrs, each call on a type that is not a type reference panicked and wrote the panic to stderr. With enough such interfaces, stderr went past its 16384-byte limit and Fallow dropped the type-aware result. The sidecar now asks for type arguments only on type references, sotsrsgives the same result astypescript-go. Thanks to @Smrtnyk for the report and the reproduction. (Closes #3872)Programmatic and MCP audits no longer show their base snapshot in
git worktree list.The API, the MCP
audittool, and the decision surface now remove the Gitregistration of the base snapshot before the base analysis starts, as
fallow auditdoes. They also remove the snapshots that a stopped processleft behind. A snapshot stays when its owner process can still run, when
Fallow cannot inspect that process, or when the snapshot is younger than one
minute.
(Closes #3885)
fallow dead-codeno longer reports the default export of a local OxlintjsPluginsfile. Oxlint loads the default export of each local plugin file. WithincludeEntryExports, fallow reported this export as unused. Fallow now credits the default export, as it does for the Oxlint config file. Other exports of the plugin file stay reportable. Thanks to @Smrtnyk for the report.(Closes #3871)
fallow dead-codeno longer reportstsrsandfallow-type-awareas unused devDependencies. Fallow loads these type-aware backend packages at run time, so no script or import names them. The tooling catalogue now credits both packages by name. Thanks @Smrtnyk for the report. (Closes #3873)fallow dead-codecredits the packages in tsconfigcontentMappers. TypeScript 7.1 loads eachcontentMappers[].packageto map files such as.vueor.astrointo the program. Fallow did not read this field, so it reported the mapper package as an unused dependency. The TypeScript plugin now credits the package name. Relative and absolute paths credit no dependency. Thanks to @Smrtnyk for the report.(Closes #3870)
fallow securityfollows per-path overrides for its dead-code note. A sink in a file where an override setsunused-filesorunused-exportstooffno longer shows the "also reported as unused-file" or "unused-export" note, and no longer gets the delete or remove action. Thanks to @Smrtnyk for the report.(Closes #3853)
fallow securityno longer reports module-relative paths as path-traversal candidates. A path that starts fromimport.meta.url,import.meta.dirname,import.meta.filename,__dirname,__filenameorprocess.cwd()and adds only literal segments cannot carry caller input. Examples arepath.resolve(fileURLToPath(new URL(".", import.meta.url)), "..")andfs.readFileSync(path.join(__dirname, "template.html")). A module-scopeconstthat holds such a path is also trusted. The rule applies to every sink argument, sores.sendFile(path.join(__dirname, "index.html"))is also clear.fileURLToPath(value)andnew URL(value, import.meta.url)stay candidates whenvalueis not known.(Closes #3711)
fallow securitynow checks everypath.joinandpath.resolvesegment. Before, the path-traversal matcher checked only the first argument, sopath.resolve(".", input)andpath.join(".", input)gave no candidate. The matcher now checks each argument and reports one candidate for each call. Apath.relativecontainment guard on the result still clears the call.(Closes #3712)
fallow health --csscredits classes that plain.jsand.tsDOM code applies. Before, a class was reported asunreferenced-css-classwhen only a.js,.ts,.mjsor.cjsfile applied it. Fallow now reads the values ofel.className = ...,el.classList.add / remove / toggle / replace / contains(...),el.setAttribute('class', ...)andclass:orclassName:object properties. A template value such as`panel-${kind}`credits itspanel-prefix. Other strings in these files still do not credit a class. A.jsfile that holds JSX is now scanned the same as a.jsxfile. Thanks to @osazemeu for the report and the clear reproduction.(Closes #3865)
fallow mutationnow runs Vitest projects in ahappy-domorjsdomenvironment when the cache is outside the project. A client test environment loads the setup file of the mutation runtime through Vite. Vite refused that file whenFALLOW_CACHE_DIRwas outside the project, so the project failed its baseline withCannot find module '/@fs/.../vitest-setup.mjs'. The Vitest adapter now adds the companion directory toserver.fs.allowof the root server and of each inline project.(Closes #3793)
fallow dead-codecredits a member access on the declared return type of an instance method. A call such asmanager.current()?.onDown?.(), wherecurrent(): Tool | undefined, now creditsTool.onDown. The implementerSelectTool.onDownis no longer reported as an unused class member. A class return type, such asmanager.widget().paint()withwidget(): Widget, now creditsWidget.paint. Static, private, and method-generic return types give no credit. Thanks to @Smrtnyk for the report.(Closes #3868)
fallow dead-codeno longer reports an aliased asset import as an unlisted dependency when the alias is in a referenced tsconfig. A solution-style roottsconfig.jsoncan reference a config whoseincludestarts with./, for example"./app/javascript/**/*". Fallow did not match that pattern to the source files, so it did not apply thepathsof that config. An import such as@circle-assets/images/logo.pngthen gave the unlisted dependency@circle-assets/images. Fallow now removes./and..segments fromincludeandexcludepatterns before it matches them. Thanks to @agneym for the report and the public reproduction.(Closes #3946)
A tsconfig in a directory whose name holds glob characters now applies to its files. Fallow matched the
includeandexcludepatterns of a tsconfig with the directory of that tsconfig as part of the glob. A directory such asapp/[id],{a,b},*or?then changed the meaning of the pattern, so the pattern did not match the files in that directory. Fallow then could drop a referenced config, and itspathsaliases did not apply. Fallow now treats the tsconfig directory as literal text. In the entry itself, Fallow reads only*and?as wildcards, the same astsc, so an entry such asapp/[id]/**/*matches the[id]directory.Security
The Windows binaries now carry an Authenticode signature from Fallow B.V. Windows 11 Smart App Control blocked
fallow.exefrom the npm package, because the file had no Authenticode signature and no reputation (Code Integrity event 3077). The release now signs every Fallow Windows file before packaging: the CLI, LSP, MCP, multicall and similar-code executables and the Node addon. The signed files ship in the GitHub release archives, the npm packages and the VS Code extension. TheEd25519signatures do not change. Thanks @Rednas83 for the report. (Closes #3807)Git commands in an audit base snapshot no longer read a repository from the base commit.
The
.gitfile of a base snapshot pointed at a relative path. A base commitcould supply a directory at that path, or a directory shaped as a bare
repository, and Git then read its config. That config can run commands, for
example through
core.fsmonitor. The.gitfile now names an absolute paththat cannot exist, and each Git command that Fallow runs inside a snapshot
gets a
GIT_DIRthat does not exist. Every Git command that Fallow startsalso sets
safe.bareRepository=explicit, so Git does not use a directoryshaped as a bare repository that it finds on its own.
fallow hooks installvalidates the detected default branch name.Without
--branch, the command reads the remote default branch name fromorigin/HEADand writes it into the generated pre-commit hook. A craftedname could put shell code into the hook. The command now applies the same
ref validator that
--branchuses. When the name fails, the command printsa warning and uses
mainas the fallback. The existing-hook and lefthookhints and the install summary get the same validated name.
Configuration
📅 Schedule: (UTC)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.