@@ -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}'`
1522const REWRITE_IMPORT_RULES : & str = r#"---
1623id: rewrite-vitest-config-import
1724language: TypeScript
1825rule:
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
2540language: TypeScript
2641rule:
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
3388language: TypeScript
3489rule:
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
41104language: TypeScript
42105rule:
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
12641335export 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 }
0 commit comments