Skip to content

Commit 3e9cdec

Browse files
committed
feat(migration): rewrite vitest imports
1 parent 9c6c683 commit 3e9cdec

8 files changed

Lines changed: 476 additions & 19 deletions

File tree

crates/vite_migration/src/vite_config.rs

Lines changed: 330 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,39 +11,110 @@ use crate::ast_grep;
1111
///
1212
/// This rewrites:
1313
/// - `import { ... } from 'vite'` → `import { ... } from '@voidzero-dev/vite-plus'`
14+
/// - `import { ... } from 'vite/{name}'` → `import { ... } from '@voidzero-dev/vite-plus/{name}'`
15+
/// - `import { ... } from 'vitest'` → `import { ... } from '@voidzero-dev/vite-plus/test'`
1416
/// - `import { ... } from 'vitest/config'` → `import { ... } from '@voidzero-dev/vite-plus'`
17+
/// - `import { ... } from 'vitest/{name}'` → `import { ... } from '@voidzero-dev/vite-plus/test/{name}'`
18+
/// - `import { ... } from '@vitest/browser'` → `import { ... } from '@voidzero-dev/vite-plus/test/browser'`
19+
/// - `import { ... } from '@vitest/browser/{name}'` → `import { ... } from '@voidzero-dev/vite-plus/test/browser/{name}'`
20+
/// - `import { ... } from '@vitest/browser-playwright'` → `import { ... } from '@voidzero-dev/vite-plus/test/browser-playwright'`
21+
/// - `import { ... } from '@vitest/browser-playwright/{name}'` → `import { ... } from '@voidzero-dev/vite-plus/test/browser-playwright/{name}'`
1522
const REWRITE_IMPORT_RULES: &str = r#"---
1623
id: rewrite-vitest-config-import
1724
language: TypeScript
1825
rule:
19-
pattern: "'vitest/config'"
26+
pattern: $STR
27+
kind: string
28+
regex: ^['"]vitest/config['"]$
2029
inside:
2130
kind: import_statement
22-
fix: "'@voidzero-dev/vite-plus'"
31+
transform:
32+
NEW_IMPORT:
33+
replace:
34+
source: $STR
35+
replace: vitest/config
36+
by: "@voidzero-dev/vite-plus"
37+
fix: $NEW_IMPORT
2338
---
24-
id: rewrite-vitest-config-import-double-quotes
39+
id: rewrite-vite-import
2540
language: TypeScript
2641
rule:
27-
pattern: '"vitest/config"'
42+
pattern: $STR
43+
kind: string
44+
regex: ^['"]vite['"]$
2845
inside:
2946
kind: import_statement
30-
fix: '"@voidzero-dev/vite-plus"'
47+
transform:
48+
NEW_IMPORT:
49+
replace:
50+
source: $STR
51+
replace: vite
52+
by: "@voidzero-dev/vite-plus"
53+
fix: $NEW_IMPORT
3154
---
32-
id: rewrite-vite-import
55+
id: rewrite-vitest-import
56+
language: TypeScript
57+
rule:
58+
pattern: $STR
59+
kind: string
60+
regex: ^['"]vitest['"]$
61+
inside:
62+
kind: import_statement
63+
transform:
64+
NEW_IMPORT:
65+
replace:
66+
source: $STR
67+
replace: vitest
68+
by: "@voidzero-dev/vite-plus/test"
69+
fix: $NEW_IMPORT
70+
---
71+
id: rewrite-vitest-scoped-import
72+
language: TypeScript
73+
rule:
74+
pattern: $STR
75+
kind: string
76+
regex: ^['"]@vitest/(browser-playwright|browser)(/.*)?['"]$
77+
inside:
78+
kind: import_statement
79+
transform:
80+
NEW_IMPORT:
81+
replace:
82+
source: $STR
83+
replace: "@vitest/"
84+
by: "@voidzero-dev/vite-plus/test/"
85+
fix: $NEW_IMPORT
86+
---
87+
id: rewrite-vite-subpath-import
3388
language: TypeScript
3489
rule:
35-
pattern: "'vite'"
90+
pattern: $STR
91+
kind: string
92+
regex: ^['"]vite/.+['"]$
3693
inside:
3794
kind: import_statement
38-
fix: "'@voidzero-dev/vite-plus'"
95+
transform:
96+
NEW_IMPORT:
97+
replace:
98+
source: $STR
99+
replace: vite/
100+
by: "@voidzero-dev/vite-plus/"
101+
fix: $NEW_IMPORT
39102
---
40-
id: rewrite-vite-import-double-quotes
103+
id: rewrite-vitest-subpath-import
41104
language: TypeScript
42105
rule:
43-
pattern: '"vite"'
106+
pattern: $STR
107+
kind: string
108+
regex: ^['"]vitest/.+['"]$
44109
inside:
45110
kind: import_statement
46-
fix: '"@voidzero-dev/vite-plus"'
111+
transform:
112+
NEW_IMPORT:
113+
replace:
114+
source: $STR
115+
replace: vitest/
116+
by: "@voidzero-dev/vite-plus/test/"
117+
fix: $NEW_IMPORT
47118
"#;
48119

49120
/// Result of merging JSON config into vite config
@@ -1263,6 +1334,254 @@ export default defineConfig({{
12631334
12641335
export default defineConfig({
12651336
plugins: [],
1337+
});"#
1338+
);
1339+
}
1340+
1341+
#[test]
1342+
fn test_rewrite_import_content_vitest() {
1343+
let vite_config = r#"import { describe, it, expect } from 'vitest';
1344+
1345+
describe('test', () => {
1346+
it('should work', () => {
1347+
expect(true).toBe(true);
1348+
});
1349+
});"#;
1350+
1351+
let result = rewrite_import_content(vite_config).unwrap();
1352+
assert!(result.updated);
1353+
assert_eq!(
1354+
result.content,
1355+
r#"import { describe, it, expect } from '@voidzero-dev/vite-plus/test';
1356+
1357+
describe('test', () => {
1358+
it('should work', () => {
1359+
expect(true).toBe(true);
1360+
});
1361+
});"#
1362+
);
1363+
}
1364+
1365+
#[test]
1366+
fn test_rewrite_import_content_vitest_double_quotes() {
1367+
let vite_config = r#"import { describe, it, expect } from "vitest";
1368+
1369+
describe('test', () => {});"#;
1370+
1371+
let result = rewrite_import_content(vite_config).unwrap();
1372+
assert!(result.updated);
1373+
assert_eq!(
1374+
result.content,
1375+
r#"import { describe, it, expect } from "@voidzero-dev/vite-plus/test";
1376+
1377+
describe('test', () => {});"#
1378+
);
1379+
}
1380+
1381+
#[test]
1382+
fn test_rewrite_import_content_vitest_browser() {
1383+
let vite_config = r#"import { page } from '@vitest/browser';
1384+
1385+
export default page;"#;
1386+
1387+
let result = rewrite_import_content(vite_config).unwrap();
1388+
assert!(result.updated);
1389+
assert_eq!(
1390+
result.content,
1391+
r#"import { page } from '@voidzero-dev/vite-plus/test/browser';
1392+
1393+
export default page;"#
1394+
);
1395+
}
1396+
1397+
#[test]
1398+
fn test_rewrite_import_content_vitest_browser_double_quotes() {
1399+
let vite_config = r#"import { page } from "@vitest/browser";
1400+
1401+
export default page;"#;
1402+
1403+
let result = rewrite_import_content(vite_config).unwrap();
1404+
assert!(result.updated);
1405+
assert_eq!(
1406+
result.content,
1407+
r#"import { page } from "@voidzero-dev/vite-plus/test/browser";
1408+
1409+
export default page;"#
1410+
);
1411+
}
1412+
1413+
#[test]
1414+
fn test_rewrite_import_content_vitest_browser_playwright() {
1415+
let vite_config = r#"import { playwright } from '@vitest/browser-playwright';
1416+
1417+
export default playwright;"#;
1418+
1419+
let result = rewrite_import_content(vite_config).unwrap();
1420+
assert!(result.updated);
1421+
assert_eq!(
1422+
result.content,
1423+
r#"import { playwright } from '@voidzero-dev/vite-plus/test/browser-playwright';
1424+
1425+
export default playwright;"#
1426+
);
1427+
}
1428+
1429+
#[test]
1430+
fn test_rewrite_import_content_vitest_browser_playwright_double_quotes() {
1431+
let vite_config = r#"import { playwright } from "@vitest/browser-playwright";
1432+
1433+
export default playwright;"#;
1434+
1435+
let result = rewrite_import_content(vite_config).unwrap();
1436+
assert!(result.updated);
1437+
assert_eq!(
1438+
result.content,
1439+
r#"import { playwright } from "@voidzero-dev/vite-plus/test/browser-playwright";
1440+
1441+
export default playwright;"#
1442+
);
1443+
}
1444+
1445+
#[test]
1446+
fn test_rewrite_import_content_vitest_browser_subpath() {
1447+
let vite_config = r#"import { context } from '@vitest/browser/context';
1448+
1449+
export default context;"#;
1450+
1451+
let result = rewrite_import_content(vite_config).unwrap();
1452+
assert!(result.updated);
1453+
assert_eq!(
1454+
result.content,
1455+
r#"import { context } from '@voidzero-dev/vite-plus/test/browser/context';
1456+
1457+
export default context;"#
1458+
);
1459+
}
1460+
1461+
#[test]
1462+
fn test_rewrite_import_content_vitest_browser_playwright_subpath() {
1463+
let vite_config = r#"import { something } from "@vitest/browser-playwright/context";
1464+
1465+
export default something;"#;
1466+
1467+
let result = rewrite_import_content(vite_config).unwrap();
1468+
assert!(result.updated);
1469+
assert_eq!(
1470+
result.content,
1471+
r#"import { something } from "@voidzero-dev/vite-plus/test/browser-playwright/context";
1472+
1473+
export default something;"#
1474+
);
1475+
}
1476+
1477+
#[test]
1478+
fn test_rewrite_import_content_vite_subpath() {
1479+
let vite_config = r#"import { ModuleRunner } from 'vite/module-runner';
1480+
1481+
export default ModuleRunner;"#;
1482+
1483+
let result = rewrite_import_content(vite_config).unwrap();
1484+
assert!(result.updated);
1485+
assert_eq!(
1486+
result.content,
1487+
r#"import { ModuleRunner } from '@voidzero-dev/vite-plus/module-runner';
1488+
1489+
export default ModuleRunner;"#
1490+
);
1491+
}
1492+
1493+
#[test]
1494+
fn test_rewrite_import_content_vite_subpath_double_quotes() {
1495+
let vite_config = r#"import { ModuleRunner } from "vite/module-runner";
1496+
1497+
export default ModuleRunner;"#;
1498+
1499+
let result = rewrite_import_content(vite_config).unwrap();
1500+
assert!(result.updated);
1501+
assert_eq!(
1502+
result.content,
1503+
r#"import { ModuleRunner } from "@voidzero-dev/vite-plus/module-runner";
1504+
1505+
export default ModuleRunner;"#
1506+
);
1507+
}
1508+
1509+
#[test]
1510+
fn test_rewrite_import_content_vitest_subpath() {
1511+
// Test vitest/node subpath
1512+
let vite_config = r#"import { startVitest } from 'vitest/node';
1513+
1514+
export default startVitest;"#;
1515+
1516+
let result = rewrite_import_content(vite_config).unwrap();
1517+
assert!(result.updated);
1518+
assert_eq!(
1519+
result.content,
1520+
r#"import { startVitest } from '@voidzero-dev/vite-plus/test/node';
1521+
1522+
export default startVitest;"#
1523+
);
1524+
1525+
// Test vitest/plugins/runner subpath
1526+
let vite_config = r#"import { somePlugin } from 'vitest/plugins/runner';
1527+
1528+
export default somePlugin;"#;
1529+
1530+
let result = rewrite_import_content(vite_config).unwrap();
1531+
assert!(result.updated);
1532+
assert_eq!(
1533+
result.content,
1534+
r#"import { somePlugin } from '@voidzero-dev/vite-plus/test/plugins/runner';
1535+
1536+
export default somePlugin;"#
1537+
);
1538+
}
1539+
1540+
#[test]
1541+
fn test_rewrite_import_content_vitest_subpath_double_quotes() {
1542+
let vite_config = r#"import { startVitest } from "vitest/node";
1543+
1544+
export default startVitest;"#;
1545+
1546+
let result = rewrite_import_content(vite_config).unwrap();
1547+
assert!(result.updated);
1548+
assert_eq!(
1549+
result.content,
1550+
r#"import { startVitest } from "@voidzero-dev/vite-plus/test/node";
1551+
1552+
export default startVitest;"#
1553+
);
1554+
}
1555+
1556+
#[test]
1557+
fn test_rewrite_import_content_mixed_imports() {
1558+
// Test multiple different imports in the same file
1559+
let vite_config = r#"import { defineConfig } from 'vite';
1560+
import { ModuleRunner } from 'vite/module-runner';
1561+
import { describe, it, expect } from 'vitest';
1562+
import { startVitest } from 'vitest/node';
1563+
import { page } from '@vitest/browser';
1564+
import { playwright } from '@vitest/browser-playwright';
1565+
import react from '@vitejs/plugin-react';
1566+
1567+
export default defineConfig({
1568+
plugins: [react()],
1569+
});"#;
1570+
1571+
let result = rewrite_import_content(vite_config).unwrap();
1572+
assert!(result.updated);
1573+
assert_eq!(
1574+
result.content,
1575+
r#"import { defineConfig } from '@voidzero-dev/vite-plus';
1576+
import { ModuleRunner } from '@voidzero-dev/vite-plus/module-runner';
1577+
import { describe, it, expect } from '@voidzero-dev/vite-plus/test';
1578+
import { startVitest } from '@voidzero-dev/vite-plus/test/node';
1579+
import { page } from '@voidzero-dev/vite-plus/test/browser';
1580+
import { playwright } from '@voidzero-dev/vite-plus/test/browser-playwright';
1581+
import react from '@vitejs/plugin-react';
1582+
1583+
export default defineConfig({
1584+
plugins: [react()],
12661585
});"#
12671586
);
12681587
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"name": "migration-from-vitest",
3+
"devDependencies": {
4+
"vite": "^7.0.0",
5+
"vitest": "^4.0.0",
6+
"@vitest/browser": "^4.0.0",
7+
"@vitest/browser-playwright": "^4.0.0"
8+
},
9+
"scripts": {
10+
"test:run": "vitest run",
11+
"test:ui": "vitest --ui",
12+
"test:coverage": "vitest run --coverage",
13+
"test:watch": "vitest --watch",
14+
"test": "vitest"
15+
}
16+
}

0 commit comments

Comments
 (0)