From 9afbb5a497ff424df7dfc9977f361e7d898cce59 Mon Sep 17 00:00:00 2001 From: Niels Mentink Date: Sun, 31 May 2026 19:44:37 +0200 Subject: [PATCH 1/2] fix: mark vercel ts config as used --- crates/core/src/plugins/mod.rs | 1 + crates/core/src/plugins/registry/builtin.rs | 8 ++-- crates/core/src/plugins/vercel.rs | 20 ++++++++++ crates/core/tests/integration_test.rs | 2 + .../issue_819_vercel_ts_config.rs | 39 +++++++++++++++++++ .../issue-819-vercel-ts-config/package.json | 10 +++++ .../issue-819-vercel-ts-config/src/index.ts | 3 ++ .../issue-819-vercel-ts-config/src/orphan.ts | 1 + .../issue-819-vercel-ts-config/vercel.ts | 6 +++ 9 files changed, 87 insertions(+), 3 deletions(-) create mode 100644 crates/core/src/plugins/vercel.rs create mode 100644 crates/core/tests/integration_test/issue_819_vercel_ts_config.rs create mode 100644 tests/fixtures/issue-819-vercel-ts-config/package.json create mode 100644 tests/fixtures/issue-819-vercel-ts-config/src/index.ts create mode 100644 tests/fixtures/issue-819-vercel-ts-config/src/orphan.ts create mode 100644 tests/fixtures/issue-819-vercel-ts-config/vercel.ts diff --git a/crates/core/src/plugins/mod.rs b/crates/core/src/plugins/mod.rs index c491d3a55..bf4aca4f2 100644 --- a/crates/core/src/plugins/mod.rs +++ b/crates/core/src/plugins/mod.rs @@ -1228,6 +1228,7 @@ mod typescript; mod unocss; mod varlock; mod velite; +mod vercel; mod vite; mod vitepress; mod vitest; diff --git a/crates/core/src/plugins/registry/builtin.rs b/crates/core/src/plugins/registry/builtin.rs index 8f688aed9..fb950ed11 100644 --- a/crates/core/src/plugins/registry/builtin.rs +++ b/crates/core/src/plugins/registry/builtin.rs @@ -34,9 +34,10 @@ use super::super::{ tailwind::TailwindPlugin, tanstack_router::TanstackRouterPlugin, tap::TapPlugin, tsd::TsdPlugin, tsdown::TsdownPlugin, tsup::TsupPlugin, turborepo::TurborepoPlugin, typedoc::TypedocPlugin, typeorm::TypeormPlugin, typescript::TypeScriptPlugin, - unocss::UnoCssPlugin, varlock::VarlockPlugin, velite::VelitePlugin, vite::VitePlugin, - vitepress::VitePressPlugin, vitest::VitestPlugin, webdriverio::WebdriverioPlugin, - webpack::WebpackPlugin, wrangler::WranglerPlugin, wuchale::WuchalePlugin, wxt::WxtPlugin, + unocss::UnoCssPlugin, varlock::VarlockPlugin, velite::VelitePlugin, vercel::VercelPlugin, + vite::VitePlugin, vitepress::VitePressPlugin, vitest::VitestPlugin, + webdriverio::WebdriverioPlugin, webpack::WebpackPlugin, wrangler::WranglerPlugin, + wuchale::WuchalePlugin, wxt::WxtPlugin, }; /// Create all built-in plugin instances, categorized by domain. @@ -145,6 +146,7 @@ pub fn create_builtin_plugins() -> Vec> { // Blockchain Box::new(HardhatPlugin), // Deployment + Box::new(VercelPlugin), Box::new(WranglerPlugin), Box::new(OpenNextCloudflarePlugin), Box::new(SentryPlugin), diff --git a/crates/core/src/plugins/vercel.rs b/crates/core/src/plugins/vercel.rs new file mode 100644 index 000000000..4f85c1b80 --- /dev/null +++ b/crates/core/src/plugins/vercel.rs @@ -0,0 +1,20 @@ +//! Vercel plugin. + +use super::{Plugin, PluginResult}; + +const ENABLERS: &[&str] = &["vercel", "@vercel/config"]; + +const CONFIG_PATTERNS: &[&str] = &["vercel.{ts,js,mjs,cjs,mts}"]; + +const ALWAYS_USED: &[&str] = &["vercel.{ts,js,mjs,cjs,mts}"]; + +const TOOLING_DEPENDENCIES: &[&str] = &["vercel", "@vercel/config"]; + +define_plugin! { + struct VercelPlugin => "vercel", + enablers: ENABLERS, + config_patterns: CONFIG_PATTERNS, + always_used: ALWAYS_USED, + tooling_dependencies: TOOLING_DEPENDENCIES, + resolve_config: imports_only, +} diff --git a/crates/core/tests/integration_test.rs b/crates/core/tests/integration_test.rs index f87af1ffb..c169e23c6 100644 --- a/crates/core/tests/integration_test.rs +++ b/crates/core/tests/integration_test.rs @@ -191,6 +191,8 @@ mod issue_635_scaffold_template_assets; mod issue_638_node_script_entrypoints; #[path = "integration_test/issue_754_eslint_meta_preset.rs"] mod issue_754_eslint_meta_preset; +#[path = "integration_test/issue_819_vercel_ts_config.rs"] +mod issue_819_vercel_ts_config; #[path = "integration_test/lexical_nodes.rs"] mod lexical_nodes; #[path = "integration_test/script_multiplexers.rs"] diff --git a/crates/core/tests/integration_test/issue_819_vercel_ts_config.rs b/crates/core/tests/integration_test/issue_819_vercel_ts_config.rs new file mode 100644 index 000000000..d149d768e --- /dev/null +++ b/crates/core/tests/integration_test/issue_819_vercel_ts_config.rs @@ -0,0 +1,39 @@ +//! Issue #819: Vercel programmatic config files are convention entrypoints. + +use super::common::{create_config, fixture_path}; + +fn unused_file_paths( + root: &std::path::Path, + results: &fallow_types::results::AnalysisResults, +) -> Vec { + results + .unused_files + .iter() + .map(|finding| { + finding + .file + .path + .strip_prefix(root) + .unwrap_or(&finding.file.path) + .to_string_lossy() + .replace('\\', "/") + }) + .collect() +} + +#[test] +fn vercel_ts_config_is_not_reported_as_unused() { + let root = fixture_path("issue-819-vercel-ts-config"); + let config = create_config(root.clone()); + let results = fallow_core::analyze(&config).expect("analysis should succeed"); + + let unused_paths = unused_file_paths(&root, &results); + assert!( + !unused_paths.contains(&"vercel.ts".to_string()), + "vercel.ts is loaded by Vercel convention and must be credited, got {unused_paths:?}" + ); + assert!( + unused_paths.contains(&"src/orphan.ts".to_string()), + "ordinary unused file should still be reported, got {unused_paths:?}" + ); +} diff --git a/tests/fixtures/issue-819-vercel-ts-config/package.json b/tests/fixtures/issue-819-vercel-ts-config/package.json new file mode 100644 index 000000000..345a2f09c --- /dev/null +++ b/tests/fixtures/issue-819-vercel-ts-config/package.json @@ -0,0 +1,10 @@ +{ + "name": "issue-819-vercel-ts-config", + "version": "1.0.0", + "type": "module", + "main": "src/index.ts", + "devDependencies": { + "@vercel/config": "latest", + "vercel": "latest" + } +} diff --git a/tests/fixtures/issue-819-vercel-ts-config/src/index.ts b/tests/fixtures/issue-819-vercel-ts-config/src/index.ts new file mode 100644 index 000000000..a62d878c2 --- /dev/null +++ b/tests/fixtures/issue-819-vercel-ts-config/src/index.ts @@ -0,0 +1,3 @@ +export const greeting = "hello"; + +console.log(greeting); diff --git a/tests/fixtures/issue-819-vercel-ts-config/src/orphan.ts b/tests/fixtures/issue-819-vercel-ts-config/src/orphan.ts new file mode 100644 index 000000000..bd93db0a4 --- /dev/null +++ b/tests/fixtures/issue-819-vercel-ts-config/src/orphan.ts @@ -0,0 +1 @@ +export const orphan = "unused"; diff --git a/tests/fixtures/issue-819-vercel-ts-config/vercel.ts b/tests/fixtures/issue-819-vercel-ts-config/vercel.ts new file mode 100644 index 000000000..c9860e2d3 --- /dev/null +++ b/tests/fixtures/issue-819-vercel-ts-config/vercel.ts @@ -0,0 +1,6 @@ +import type { VercelConfig } from "@vercel/config/v1"; + +export const config = { + regions: ["dub1"], + fluid: true, +} satisfies VercelConfig; From 7591896d5f0950e2aa36c7a427273f127e17c9fe Mon Sep 17 00:00:00 2001 From: Bart Waardenburg Date: Mon, 1 Jun 2026 09:01:05 +0200 Subject: [PATCH 2/2] chore: address Vercel plugin review follow-ups Update the documented built-in plugin count after adding the Vercel plugin and list deployment-oriented plugins separately in the README table. Rename the Vercel regression fixture and integration test from issue 819 to issue 820 so the test history matches the bug this PR closes. Refs #820. --- README.md | 5 +++-- crates/core/tests/integration_test.rs | 4 ++-- ...819_vercel_ts_config.rs => issue_820_vercel_ts_config.rs} | 4 ++-- .../package.json | 2 +- .../src/index.ts | 0 .../src/orphan.ts | 0 .../vercel.ts | 0 7 files changed, 8 insertions(+), 7 deletions(-) rename crates/core/tests/integration_test/{issue_819_vercel_ts_config.rs => issue_820_vercel_ts_config.rs} (89%) rename tests/fixtures/{issue-819-vercel-ts-config => issue-820-vercel-ts-config}/package.json (79%) rename tests/fixtures/{issue-819-vercel-ts-config => issue-820-vercel-ts-config}/src/index.ts (100%) rename tests/fixtures/{issue-819-vercel-ts-config => issue-820-vercel-ts-config}/src/orphan.ts (100%) rename tests/fixtures/{issue-819-vercel-ts-config => issue-820-vercel-ts-config}/vercel.ts (100%) diff --git a/README.md b/README.md index c622224bb..4a7ce2789 100644 --- a/README.md +++ b/README.md @@ -84,7 +84,7 @@ For cleanup-specific findings: npx fallow dead-code ``` -116 framework plugins. No Node.js runtime required for static analysis. No config needed for the first run. +117 framework plugins. No Node.js runtime required for static analysis. No config needed for the first run. ## What is Fallow? @@ -749,7 +749,7 @@ See the [full configuration reference](https://docs.fallow.tools/configuration/o ## Framework plugins -116 built-in plugins detect entry points, convention exports, config-defined aliases, and template-visible usage for your framework automatically. +117 built-in plugins detect entry points, convention exports, config-defined aliases, and template-visible usage for your framework automatically. | Category | Plugins | |---|---| @@ -757,6 +757,7 @@ See the [full configuration reference](https://docs.fallow.tools/configuration/o | **Bundlers** | Vite, Webpack, Rspack, Rsbuild, Rollup, Rolldown, Tsup, Tsdown, pkg-utils, Parcel | | **Testing** | Vitest, Jest, Playwright, Cypress, Storybook, Stryker, Mocha, Ava, tap, tsd | | **CI/CD & Release** | Danger, Commitlint, Commitizen, Semantic Release | +| **Deployment** | Vercel, Wrangler, Sentry, OpenNext Cloudflare | | **CSS** | Tailwind, PostCSS, UnoCSS, PandaCSS | | **Databases & Backend** | Prisma, Drizzle, Knex, TypeORM, Kysely, Convex | | **Blockchain** | Hardhat | diff --git a/crates/core/tests/integration_test.rs b/crates/core/tests/integration_test.rs index c169e23c6..340aaf362 100644 --- a/crates/core/tests/integration_test.rs +++ b/crates/core/tests/integration_test.rs @@ -191,8 +191,8 @@ mod issue_635_scaffold_template_assets; mod issue_638_node_script_entrypoints; #[path = "integration_test/issue_754_eslint_meta_preset.rs"] mod issue_754_eslint_meta_preset; -#[path = "integration_test/issue_819_vercel_ts_config.rs"] -mod issue_819_vercel_ts_config; +#[path = "integration_test/issue_820_vercel_ts_config.rs"] +mod issue_820_vercel_ts_config; #[path = "integration_test/lexical_nodes.rs"] mod lexical_nodes; #[path = "integration_test/script_multiplexers.rs"] diff --git a/crates/core/tests/integration_test/issue_819_vercel_ts_config.rs b/crates/core/tests/integration_test/issue_820_vercel_ts_config.rs similarity index 89% rename from crates/core/tests/integration_test/issue_819_vercel_ts_config.rs rename to crates/core/tests/integration_test/issue_820_vercel_ts_config.rs index d149d768e..ca58e7115 100644 --- a/crates/core/tests/integration_test/issue_819_vercel_ts_config.rs +++ b/crates/core/tests/integration_test/issue_820_vercel_ts_config.rs @@ -1,4 +1,4 @@ -//! Issue #819: Vercel programmatic config files are convention entrypoints. +//! Issue #820: Vercel programmatic config files are convention entrypoints. use super::common::{create_config, fixture_path}; @@ -23,7 +23,7 @@ fn unused_file_paths( #[test] fn vercel_ts_config_is_not_reported_as_unused() { - let root = fixture_path("issue-819-vercel-ts-config"); + let root = fixture_path("issue-820-vercel-ts-config"); let config = create_config(root.clone()); let results = fallow_core::analyze(&config).expect("analysis should succeed"); diff --git a/tests/fixtures/issue-819-vercel-ts-config/package.json b/tests/fixtures/issue-820-vercel-ts-config/package.json similarity index 79% rename from tests/fixtures/issue-819-vercel-ts-config/package.json rename to tests/fixtures/issue-820-vercel-ts-config/package.json index 345a2f09c..49c922ad9 100644 --- a/tests/fixtures/issue-819-vercel-ts-config/package.json +++ b/tests/fixtures/issue-820-vercel-ts-config/package.json @@ -1,5 +1,5 @@ { - "name": "issue-819-vercel-ts-config", + "name": "issue-820-vercel-ts-config", "version": "1.0.0", "type": "module", "main": "src/index.ts", diff --git a/tests/fixtures/issue-819-vercel-ts-config/src/index.ts b/tests/fixtures/issue-820-vercel-ts-config/src/index.ts similarity index 100% rename from tests/fixtures/issue-819-vercel-ts-config/src/index.ts rename to tests/fixtures/issue-820-vercel-ts-config/src/index.ts diff --git a/tests/fixtures/issue-819-vercel-ts-config/src/orphan.ts b/tests/fixtures/issue-820-vercel-ts-config/src/orphan.ts similarity index 100% rename from tests/fixtures/issue-819-vercel-ts-config/src/orphan.ts rename to tests/fixtures/issue-820-vercel-ts-config/src/orphan.ts diff --git a/tests/fixtures/issue-819-vercel-ts-config/vercel.ts b/tests/fixtures/issue-820-vercel-ts-config/vercel.ts similarity index 100% rename from tests/fixtures/issue-819-vercel-ts-config/vercel.ts rename to tests/fixtures/issue-820-vercel-ts-config/vercel.ts