Skip to content

Commit 78dbe56

Browse files
authored
feat(migration): add tsdown to vite lib migration support (#362)
- Add import rewriting: `import { defineConfig } from 'tsdown'` → `import { defineConfig } from '@voidzero-dev/vite-plus/lib'` - Add declare module rewriting for tsdown - Add script rewriting: `tsdown` → `vite lib` - Add unit tests for tsdown import and declare module rewriting - Add snap test fixture for migration-from-tsdown 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <[email protected]> <!-- CURSOR_SUMMARY --> --- > [!NOTE] > Introduces automated migration from `tsdown` to Vite+. > > - Adds import/declare rewrite rules mapping `tsdown` to `@voidzero-dev/vite-plus/lib` with unit tests > - New `merge_tsdown_config` (Rust core, NAPI binding, and JS export) imports `tsdown.config.*` into `vite.config.*` and injects `lib: tsdownConfig` (idempotent) > - Migrator detects `tsdown.config.*`; merges JSON config content into `lib` and deletes the file, or adds an import for TS/JS; removes `tsdown` and replaces scripts via rules (`tsdown` → `vite lib`) > - Updates CLI rules (`vite-tools.yml`) and adds snap tests for `migration-from-tsdown*`; minor scripts: adds `test:unit` > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit f0e76cc. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
1 parent 29897cd commit 78dbe56

23 files changed

Lines changed: 848 additions & 39 deletions

File tree

crates/vite_migration/src/import_rewriter.rs

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ use crate::{ast_grep, file_walker};
2222
/// - `import { ... } from '@vitest/browser-preview/{name}'` → `import { ... } from '@voidzero-dev/vite-plus/test/browser-preview/{name}'`
2323
/// - `import { ... } from '@vitest/browser-webdriverio'` → `import { ... } from '@voidzero-dev/vite-plus/test/browser-webdriverio'`
2424
/// - `import { ... } from '@vitest/browser-webdriverio/{name}'` → `import { ... } from '@voidzero-dev/vite-plus/test/browser-webdriverio/{name}'`
25+
/// - `import { ... } from 'tsdown'` → `import { ... } from '@voidzero-dev/vite-plus/lib'`
2526
///
2627
/// **Declare module statements:**
2728
/// - `declare module 'vite' { ... }` → `declare module '@voidzero-dev/vite-plus' { ... }`
@@ -37,6 +38,7 @@ use crate::{ast_grep, file_walker};
3738
/// - `declare module '@vitest/browser-preview/{name}' { ... }` → `declare module '@voidzero-dev/vite-plus/test/browser-preview/{name}' { ... }`
3839
/// - `declare module '@vitest/browser-webdriverio' { ... }` → `declare module '@voidzero-dev/vite-plus/test/browser-webdriverio' { ... }`
3940
/// - `declare module '@vitest/browser-webdriverio/{name}' { ... }` → `declare module '@voidzero-dev/vite-plus/test/browser-webdriverio/{name}' { ... }`
41+
/// - `declare module 'tsdown' { ... }` → `declare module '@voidzero-dev/vite-plus/lib' { ... }`
4042
const REWRITE_IMPORT_RULES: &str = r#"---
4143
id: rewrite-vitest-config-import
4244
language: TypeScript
@@ -229,6 +231,38 @@ transform:
229231
replace: vitest/
230232
by: "@voidzero-dev/vite-plus/test/"
231233
fix: $NEW_IMPORT
234+
---
235+
id: rewrite-tsdown-import
236+
language: TypeScript
237+
rule:
238+
pattern: $STR
239+
kind: string
240+
regex: ^['"]tsdown['"]$
241+
inside:
242+
kind: import_statement
243+
transform:
244+
NEW_IMPORT:
245+
replace:
246+
source: $STR
247+
replace: tsdown
248+
by: "@voidzero-dev/vite-plus/lib"
249+
fix: $NEW_IMPORT
250+
---
251+
id: rewrite-declare-module-tsdown
252+
language: TypeScript
253+
rule:
254+
pattern: $STR
255+
kind: string
256+
regex: ^['"]tsdown['"]$
257+
inside:
258+
kind: module
259+
transform:
260+
NEW_IMPORT:
261+
replace:
262+
source: $STR
263+
replace: tsdown
264+
by: "@voidzero-dev/vite-plus/lib"
265+
fix: $NEW_IMPORT
232266
"#;
233267

234268
/// Result of rewriting imports in a file
@@ -1393,6 +1427,86 @@ declare module '@voidzero-dev/vite-plus/test/browser' {
13931427
name: string;
13941428
configResolved?: (config: ResolvedConfig) => void;
13951429
}
1430+
}"#
1431+
);
1432+
}
1433+
1434+
#[test]
1435+
fn test_rewrite_import_content_tsdown() {
1436+
let tsdown_config = r#"import { defineConfig } from 'tsdown';
1437+
1438+
export default defineConfig({
1439+
entry: 'src/index.ts',
1440+
});"#;
1441+
1442+
let result = rewrite_import_content(tsdown_config).unwrap();
1443+
assert!(result.updated);
1444+
assert_eq!(
1445+
result.content,
1446+
r#"import { defineConfig } from '@voidzero-dev/vite-plus/lib';
1447+
1448+
export default defineConfig({
1449+
entry: 'src/index.ts',
1450+
});"#
1451+
);
1452+
}
1453+
1454+
#[test]
1455+
fn test_rewrite_import_content_tsdown_double_quotes() {
1456+
let tsdown_config = r#"import { defineConfig } from "tsdown";
1457+
1458+
export default defineConfig({
1459+
entry: "src/index.ts",
1460+
});"#;
1461+
1462+
let result = rewrite_import_content(tsdown_config).unwrap();
1463+
assert!(result.updated);
1464+
assert_eq!(
1465+
result.content,
1466+
r#"import { defineConfig } from "@voidzero-dev/vite-plus/lib";
1467+
1468+
export default defineConfig({
1469+
entry: "src/index.ts",
1470+
});"#
1471+
);
1472+
}
1473+
1474+
#[test]
1475+
fn test_rewrite_declare_module_tsdown() {
1476+
let content = r#"declare module 'tsdown' {
1477+
interface BuildConfig {
1478+
custom?: boolean;
1479+
}
1480+
}"#;
1481+
1482+
let result = rewrite_import_content(content).unwrap();
1483+
assert!(result.updated);
1484+
assert_eq!(
1485+
result.content,
1486+
r#"declare module '@voidzero-dev/vite-plus/lib' {
1487+
interface BuildConfig {
1488+
custom?: boolean;
1489+
}
1490+
}"#
1491+
);
1492+
}
1493+
1494+
#[test]
1495+
fn test_rewrite_declare_module_tsdown_double_quotes() {
1496+
let content = r#"declare module "tsdown" {
1497+
interface BuildConfig {
1498+
custom?: boolean;
1499+
}
1500+
}"#;
1501+
1502+
let result = rewrite_import_content(content).unwrap();
1503+
assert!(result.updated);
1504+
assert_eq!(
1505+
result.content,
1506+
r#"declare module "@voidzero-dev/vite-plus/lib" {
1507+
interface BuildConfig {
1508+
custom?: boolean;
1509+
}
13961510
}"#
13971511
);
13981512
}

crates/vite_migration/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,4 @@ mod vite_config;
77
pub use file_walker::{WalkResult, find_ts_files};
88
pub use import_rewriter::{BatchRewriteResult, rewrite_imports_in_directory};
99
pub use package::rewrite_scripts;
10-
pub use vite_config::{MergeResult, merge_json_config};
10+
pub use vite_config::{MergeResult, merge_json_config, merge_tsdown_config};

0 commit comments

Comments
 (0)