mui-to-shadcn 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/README.de.md +22 -0
- package/README.md +27 -0
- package/dist/cli.js +39 -2
- package/dist/cli.js.map +1 -1
- package/dist/migration-doc.d.ts +27 -0
- package/dist/migration-doc.d.ts.map +1 -0
- package/dist/migration-doc.js +113 -0
- package/dist/migration-doc.js.map +1 -0
- package/dist/run.d.ts +2 -0
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +1 -0
- package/dist/run.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,13 @@ All notable changes to this project are documented here. This project adheres to
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [0.3.0] - 2026-06-18
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- **`--md` flag** — writes a `MIGRATION.md` handoff so the LLM of your choice (Claude, ChatGPT, Cursor, …) can finish what the codemod cannot do on its own. It lists, per file, every **Open / broken** item (file · line · component · what's needed, with the recipe inline) and a **Review** list of auto-changes to verify, behind a short context block addressed directly to the assistant (target stack, Radix vs Base UI, Tailwind v4, controlled-value rules). Works in both dry-run and `--write`; the CLI hints to use `--md` whenever manual work remains. Manual components are no longer echoed into the Review section.
|
|
12
|
+
- Programmatic `buildMigrationDoc` (with `FileReport` / `MigrationDocInput` types), re-exported from the package entry, so the same report can be produced from the API.
|
|
13
|
+
|
|
7
14
|
## [0.2.0] - 2026-06-17
|
|
8
15
|
|
|
9
16
|
Driven by a real-world audit (2289 files): converts the most common remaining manual components. Catalogue grows to 115 (99 full, 7 in parent, 4 partial, 5 manual).
|
package/README.de.md
CHANGED
|
@@ -13,6 +13,7 @@ npm install
|
|
|
13
13
|
```
|
|
14
14
|
npm run migrate -- <pfad> --report # Probelauf, schreibt nichts, listet benoetigte shadcn-Komponenten
|
|
15
15
|
npm run migrate -- <pfad> --write # schreibt Aenderungen in die Dateien
|
|
16
|
+
npm run migrate -- <pfad> --md # schreibt MIGRATION.md (LLM-Handoff fuer die restliche Handarbeit)
|
|
16
17
|
npm run migrate -- <pfad> --skip-sx # ueberspringt den sx/System-Props-Pass
|
|
17
18
|
```
|
|
18
19
|
|
|
@@ -76,3 +77,24 @@ npx eslint --fix <pfad>
|
|
|
76
77
|
```
|
|
77
78
|
|
|
78
79
|
Der Report zeigt geaenderte Handler-Signaturen und alle manuell zu pruefenden Stellen.
|
|
80
|
+
|
|
81
|
+
## Mit einem LLM abschliessen
|
|
82
|
+
|
|
83
|
+
Den mechanischen Teil erledigt das Tool; der Rest braucht Urteilsvermoegen. Mit `--md` wird eine einzige Datei **`MIGRATION.md`** geschrieben — ein kompakter Handoff fuer das LLM deiner Wahl (Claude, ChatGPT, Cursor, …):
|
|
84
|
+
|
|
85
|
+
```
|
|
86
|
+
npx mui-to-shadcn src --write --md
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
`MIGRATION.md` enthaelt genau das, was ein Assistent braucht — nicht mehr und nicht weniger:
|
|
90
|
+
|
|
91
|
+
- einen kurzen **Auftrag** direkt an den Assistenten (Zielstack, Radix vs. Base UI, kein `@mui/*` reimportieren, Verhalten beibehalten);
|
|
92
|
+
- die zu installierenden **shadcn-Komponenten**;
|
|
93
|
+
- **Open / broken** — jede Komponente, die das Tool offen gelassen hat, gruppiert nach Datei mit Zeile, Komponente und konkretem Rezept (z. B. `Autocomplete` → Combobox);
|
|
94
|
+
- **Review** — automatische Aenderungen, die man pruefen sollte (umbenannte Handler, Single-Select `Select`, …).
|
|
95
|
+
|
|
96
|
+
Dann uebergeben, z. B.:
|
|
97
|
+
|
|
98
|
+
> Lies `MIGRATION.md` und erledige jede dort aufgefuehrte Aufgabe. Behalte das bestehende Verhalten bei.
|
|
99
|
+
|
|
100
|
+
Nur Dateien mit offener Arbeit erscheinen, die Datei bleibt also auch bei grossen Codebasen klein.
|
package/README.md
CHANGED
|
@@ -28,6 +28,9 @@ npx mui-to-shadcn src --report
|
|
|
28
28
|
|
|
29
29
|
# write the changes
|
|
30
30
|
npx mui-to-shadcn src --write
|
|
31
|
+
|
|
32
|
+
# write the changes, plus a MIGRATION.md handoff for an LLM to finish the rest
|
|
33
|
+
npx mui-to-shadcn src --write --md
|
|
31
34
|
```
|
|
32
35
|
|
|
33
36
|
Or as a one-command setup in your project (installs the shadcn components, then migrates):
|
|
@@ -53,6 +56,7 @@ mui-to-shadcn <path...> [options]
|
|
|
53
56
|
|
|
54
57
|
--write write changes (default is a dry run)
|
|
55
58
|
--report print every warning and manual item
|
|
59
|
+
--md write MIGRATION.md — an LLM-ready handoff for the remaining manual work
|
|
56
60
|
--skip-sx skip the sx / system-props pass
|
|
57
61
|
--setup install shadcn components and run the full pipeline
|
|
58
62
|
--base <b> radix (default) or base (Base UI)
|
|
@@ -74,6 +78,8 @@ const result = runMigration(file, { base: "radix" });
|
|
|
74
78
|
console.log(result.text, result.warnings, result.manual, result.components);
|
|
75
79
|
```
|
|
76
80
|
|
|
81
|
+
`buildMigrationDoc({ files, components, base, version, generatedAt })` is also exported, if you want to generate the same `MIGRATION.md` report from your own tooling.
|
|
82
|
+
|
|
77
83
|
## Component support
|
|
78
84
|
|
|
79
85
|
115 MUI components are catalogued. As of the current version: **99 fully converted**, **7 converted inside their parent**, **4 partial**, **5 left manual** with a note. The full, always-current table is generated from the registry:
|
|
@@ -99,6 +105,27 @@ Even with `--setup`, some work needs human judgement:
|
|
|
99
105
|
|
|
100
106
|
Radix or Base UI: the generated JSX uses the public shadcn API (`@/components/ui/*`, `onValueChange`, `type single/multiple`, `AccordionItem`), which is identical across both; only the underlying primitives differ.
|
|
101
107
|
|
|
108
|
+
## Finish with an LLM
|
|
109
|
+
|
|
110
|
+
The codemod does the mechanical part; the rest needs judgement. Run with `--md` and it writes a single **`MIGRATION.md`** — a focused handoff you can give to the LLM of your choice (Claude, ChatGPT, Cursor, …):
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
npx mui-to-shadcn src --write --md
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
`MIGRATION.md` holds exactly what an assistant needs, and no more:
|
|
117
|
+
|
|
118
|
+
- a short **task brief** written to the assistant (target stack, Radix vs Base UI rules, "don't reintroduce `@mui/*`", keep behavior identical);
|
|
119
|
+
- the **shadcn components to install**;
|
|
120
|
+
- **Open / broken** — every component the codemod left for you, grouped by file with the line, the component, and a concrete recipe (e.g. `Autocomplete` → Combobox, `DataGrid` → TanStack Table);
|
|
121
|
+
- **Review** — auto-changes worth a second look (renamed handlers, single-select `Select`, …).
|
|
122
|
+
|
|
123
|
+
Then hand it over, for example:
|
|
124
|
+
|
|
125
|
+
> Read `MIGRATION.md` and complete every task it lists. Keep the existing behavior.
|
|
126
|
+
|
|
127
|
+
Only files with remaining work appear, so the report stays small even on large codebases.
|
|
128
|
+
|
|
102
129
|
## Compatibility
|
|
103
130
|
|
|
104
131
|
Targets shadcn CLI v4 (`shadcn init`/`add`, `--base radix|base`) and Tailwind CSS v4 (v4 shadow scale, container widths). Icons require [lucide-react](https://lucide.dev) (shadcn installs it). Output is valid TSX; run Prettier/ESLint afterwards (done automatically by `--setup`).
|
package/dist/cli.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { parseArgs } from "node:util";
|
|
3
3
|
import { writeFileSync } from "node:fs";
|
|
4
|
-
import { relative } from "node:path";
|
|
4
|
+
import { relative, join } from "node:path";
|
|
5
|
+
import { createRequire } from "node:module";
|
|
5
6
|
import { Project } from "ts-morph";
|
|
6
7
|
import { runMigration } from "./run.js";
|
|
7
8
|
import { collectSourceFiles } from "./paths.js";
|
|
8
9
|
import { runSetup } from "./setup.js";
|
|
10
|
+
import { buildMigrationDoc } from "./migration-doc.js";
|
|
9
11
|
function parseBase(value) {
|
|
10
12
|
return value === "base" ? "base" : "radix";
|
|
11
13
|
}
|
|
@@ -14,12 +16,22 @@ function parsePackageManager(value) {
|
|
|
14
16
|
return value;
|
|
15
17
|
return undefined;
|
|
16
18
|
}
|
|
19
|
+
function readVersion() {
|
|
20
|
+
try {
|
|
21
|
+
const pkg = createRequire(import.meta.url)("../package.json");
|
|
22
|
+
return pkg.version ?? "";
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return "";
|
|
26
|
+
}
|
|
27
|
+
}
|
|
17
28
|
function main() {
|
|
18
29
|
const { values, positionals } = parseArgs({
|
|
19
30
|
allowPositionals: true,
|
|
20
31
|
options: {
|
|
21
32
|
write: { type: "boolean", default: false },
|
|
22
33
|
report: { type: "boolean", default: false },
|
|
34
|
+
md: { type: "boolean", default: false },
|
|
23
35
|
"skip-sx": { type: "boolean", default: false },
|
|
24
36
|
setup: { type: "boolean", default: false },
|
|
25
37
|
"dry-run": { type: "boolean", default: false },
|
|
@@ -28,7 +40,7 @@ function main() {
|
|
|
28
40
|
},
|
|
29
41
|
});
|
|
30
42
|
if (positionals.length === 0) {
|
|
31
|
-
console.error("Usage: mui-to-shadcn <path...> [--write] [--report] [--skip-sx] [--setup [--base radix|base] [--pm pnpm|npm|yarn|bun] [--dry-run]]");
|
|
43
|
+
console.error("Usage: mui-to-shadcn <path...> [--write] [--report] [--md] [--skip-sx] [--setup [--base radix|base] [--pm pnpm|npm|yarn|bun] [--dry-run]]");
|
|
32
44
|
process.exit(1);
|
|
33
45
|
}
|
|
34
46
|
const applySx = values["skip-sx"] !== true;
|
|
@@ -55,10 +67,12 @@ function main() {
|
|
|
55
67
|
}
|
|
56
68
|
const write = values.write === true;
|
|
57
69
|
const report = values.report === true;
|
|
70
|
+
const md = values.md === true;
|
|
58
71
|
let changedCount = 0;
|
|
59
72
|
let warningCount = 0;
|
|
60
73
|
const manualTotals = new Map();
|
|
61
74
|
const components = new Set();
|
|
75
|
+
const reports = [];
|
|
62
76
|
for (const file of files) {
|
|
63
77
|
const result = runMigration(file, { sx: applySx, base });
|
|
64
78
|
const rel = relative(process.cwd(), file.getFilePath());
|
|
@@ -68,6 +82,9 @@ function main() {
|
|
|
68
82
|
for (const hit of result.manual) {
|
|
69
83
|
manualTotals.set(hit.component, (manualTotals.get(hit.component) ?? 0) + 1);
|
|
70
84
|
}
|
|
85
|
+
if (result.manual.length || result.warnings.length) {
|
|
86
|
+
reports.push({ file: rel, manual: result.manual, warnings: result.warnings });
|
|
87
|
+
}
|
|
71
88
|
if (result.changed) {
|
|
72
89
|
changedCount += 1;
|
|
73
90
|
if (write) {
|
|
@@ -106,6 +123,26 @@ function main() {
|
|
|
106
123
|
for (const [name, count] of sorted)
|
|
107
124
|
console.log(` ${name}: ${count}`);
|
|
108
125
|
}
|
|
126
|
+
if (md) {
|
|
127
|
+
const doc = buildMigrationDoc({
|
|
128
|
+
files: reports,
|
|
129
|
+
components: componentList,
|
|
130
|
+
base,
|
|
131
|
+
version: readVersion(),
|
|
132
|
+
generatedAt: new Date().toISOString().slice(0, 10),
|
|
133
|
+
});
|
|
134
|
+
writeFileSync(join(process.cwd(), "MIGRATION.md"), doc);
|
|
135
|
+
const taskTotal = reports.reduce((sum, r) => sum + r.manual.length, 0);
|
|
136
|
+
const reviewTotal = reports.reduce((sum, r) => sum + r.warnings.length, 0);
|
|
137
|
+
console.log("");
|
|
138
|
+
console.log(`Wrote MIGRATION.md (${taskTotal} task${taskTotal === 1 ? "" : "s"}, ` +
|
|
139
|
+
`${reviewTotal} review note${reviewTotal === 1 ? "" : "s"} across ` +
|
|
140
|
+
`${reports.length} file${reports.length === 1 ? "" : "s"}).`);
|
|
141
|
+
console.log('Hand it to the LLM of your choice: "Read MIGRATION.md and complete the migration tasks it lists."');
|
|
142
|
+
}
|
|
143
|
+
else if (warningCount > 0 || manualTotals.size > 0) {
|
|
144
|
+
console.log("Write an LLM-ready handoff with --md (MIGRATION.md).");
|
|
145
|
+
}
|
|
109
146
|
if (!report && (warningCount > 0 || manualTotals.size > 0)) {
|
|
110
147
|
console.log("Show details with --report");
|
|
111
148
|
}
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { ManualHit } from "./plan.js";
|
|
2
|
+
export interface FileReport {
|
|
3
|
+
/** Path shown to the reader (relative to the cwd in CLI use). */
|
|
4
|
+
file: string;
|
|
5
|
+
/** Components the codemod could not convert on its own. */
|
|
6
|
+
manual: ManualHit[];
|
|
7
|
+
/** Auto-changes that may need a human/LLM check. */
|
|
8
|
+
warnings: string[];
|
|
9
|
+
}
|
|
10
|
+
export interface MigrationDocInput {
|
|
11
|
+
/** Only files that have at least one manual hit or warning. */
|
|
12
|
+
files: FileReport[];
|
|
13
|
+
/** Required shadcn component slugs (sorted). */
|
|
14
|
+
components: string[];
|
|
15
|
+
/** Target variant — changes the Base UI rules emitted for the assistant. */
|
|
16
|
+
base: "radix" | "base";
|
|
17
|
+
/** Tool version, e.g. "0.3.0". Empty string if unknown. */
|
|
18
|
+
version: string;
|
|
19
|
+
/** Generation date as YYYY-MM-DD (passed in so output stays deterministic). */
|
|
20
|
+
generatedAt: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Render an LLM-ready handoff document from a migration run. Pure and
|
|
24
|
+
* deterministic: the same input always produces the same Markdown.
|
|
25
|
+
*/
|
|
26
|
+
export declare function buildMigrationDoc(input: MigrationDocInput): string;
|
|
27
|
+
//# sourceMappingURL=migration-doc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-doc.d.ts","sourceRoot":"","sources":["../src/migration-doc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE3C,MAAM,WAAW,UAAU;IACzB,iEAAiE;IACjE,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,oDAAoD;IACpD,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,+DAA+D;IAC/D,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,gDAAgD;IAChD,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,4EAA4E;IAC5E,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;IACvB,2DAA2D;IAC3D,OAAO,EAAE,MAAM,CAAC;IAChB,+EAA+E;IAC/E,WAAW,EAAE,MAAM,CAAC;CACrB;AA0BD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CA4GlE"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
function plural(n, word) {
|
|
2
|
+
return `${n} ${word}${n === 1 ? "" : "s"}`;
|
|
3
|
+
}
|
|
4
|
+
function provenance(version, date) {
|
|
5
|
+
const v = version ? ` v${version}` : "";
|
|
6
|
+
return `_Generated by mui-to-shadcn${v} on ${date}._`;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* A manual component emits both a manual hit and a paired warning
|
|
10
|
+
* ("line N <Tag>: …") from the plan layer. Drop that warning from the Review
|
|
11
|
+
* list so it isn't repeated — the Open/broken task already carries it.
|
|
12
|
+
*/
|
|
13
|
+
function isManualEcho(warning, manual) {
|
|
14
|
+
return manual.some((hit) => warning.endsWith(`: ${hit.message}`) ||
|
|
15
|
+
(hit.message.includes("not in the registry") &&
|
|
16
|
+
warning.startsWith(`line ${hit.line} `) &&
|
|
17
|
+
warning.includes("not in the registry")));
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Render an LLM-ready handoff document from a migration run. Pure and
|
|
21
|
+
* deterministic: the same input always produces the same Markdown.
|
|
22
|
+
*/
|
|
23
|
+
export function buildMigrationDoc(input) {
|
|
24
|
+
const { components, base, version, generatedAt } = input;
|
|
25
|
+
const files = input.files
|
|
26
|
+
.map((f) => ({ ...f, warnings: f.warnings.filter((w) => !isManualEcho(w, f.manual)) }))
|
|
27
|
+
.sort((a, b) => a.file.localeCompare(b.file));
|
|
28
|
+
const out = [];
|
|
29
|
+
out.push("# Migration tasks — MUI → shadcn/ui");
|
|
30
|
+
out.push("");
|
|
31
|
+
out.push(provenance(version, generatedAt));
|
|
32
|
+
out.push("");
|
|
33
|
+
if (files.length === 0) {
|
|
34
|
+
out.push("Nothing left to migrate or review 🎉 — the codemod converted everything it found.");
|
|
35
|
+
out.push("");
|
|
36
|
+
return out.join("\n");
|
|
37
|
+
}
|
|
38
|
+
const taskFiles = files.filter((f) => f.manual.length > 0);
|
|
39
|
+
const reviewFiles = files.filter((f) => f.warnings.length > 0);
|
|
40
|
+
const taskCount = taskFiles.reduce((sum, f) => sum + f.manual.length, 0);
|
|
41
|
+
const reviewCount = reviewFiles.reduce((sum, f) => sum + f.warnings.length, 0);
|
|
42
|
+
// ── Context block, addressed directly to the assistant ──
|
|
43
|
+
out.push("## Your task");
|
|
44
|
+
out.push("");
|
|
45
|
+
out.push("You are finishing a partial migration from Material UI (MUI) to shadcn/ui in this codebase. " +
|
|
46
|
+
"The codemod has already converted the mechanical parts and rewritten the imports; your job is to resolve what it could not do automatically:");
|
|
47
|
+
out.push("");
|
|
48
|
+
out.push("1. Complete every item under **Open / broken** — each names the file, line, and MUI component, plus what it needs.");
|
|
49
|
+
out.push("2. Then check each item under **Review** — those were converted automatically but may need a fix.");
|
|
50
|
+
out.push("");
|
|
51
|
+
out.push("Rules:");
|
|
52
|
+
out.push("");
|
|
53
|
+
const variant = base === "base" ? "Base UI" : "Radix";
|
|
54
|
+
out.push(`- Target stack: shadcn/ui (${variant} variant) + Tailwind CSS v4. Import components from \`@/components/ui/*\`.`);
|
|
55
|
+
out.push("- Never reintroduce `@mui/*`, `@emotion/*`, or `@mui/icons-material` imports. Icons come from `lucide-react`.");
|
|
56
|
+
out.push("- Preserve the original behavior — if a prop was dropped, re-implement its effect rather than lose it.");
|
|
57
|
+
out.push('- Use the public shadcn API: `onValueChange`/`onCheckedChange`, `type="single|multiple"`, `AccordionItem`, etc.');
|
|
58
|
+
if (base === "base") {
|
|
59
|
+
out.push("- Base UI specifics: replace `asChild` with the render prop; `checked` is strictly boolean and `value` strictly an array; the Base UI `Select` needs an `items` prop on the root and `nativeButton={false}` on non-button triggers.");
|
|
60
|
+
}
|
|
61
|
+
out.push("- Open each file at the given line and keep edits local; don't reformat unrelated code.");
|
|
62
|
+
out.push("");
|
|
63
|
+
// ── Install ──
|
|
64
|
+
if (components.length > 0) {
|
|
65
|
+
out.push("## Install the shadcn components first");
|
|
66
|
+
out.push("");
|
|
67
|
+
out.push("```bash");
|
|
68
|
+
out.push(`pnpm dlx shadcn@latest add ${components.join(" ")}`);
|
|
69
|
+
out.push("```");
|
|
70
|
+
out.push("");
|
|
71
|
+
if (taskCount > 0) {
|
|
72
|
+
out.push("Some tasks below need extra shadcn components or packages — those are noted inline in the task.");
|
|
73
|
+
out.push("");
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// ── Open / broken ──
|
|
77
|
+
if (taskCount > 0) {
|
|
78
|
+
out.push(`## Open / broken (${plural(taskCount, "task")} in ${plural(taskFiles.length, "file")})`);
|
|
79
|
+
out.push("");
|
|
80
|
+
for (const f of taskFiles) {
|
|
81
|
+
out.push(`### ${f.file}`);
|
|
82
|
+
out.push("");
|
|
83
|
+
const hits = [...f.manual].sort((a, b) => a.line - b.line);
|
|
84
|
+
for (const hit of hits) {
|
|
85
|
+
out.push(`- **L${hit.line}** \`<${hit.component}>\` — ${hit.message}`);
|
|
86
|
+
}
|
|
87
|
+
out.push("");
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
out.push("## Open / broken");
|
|
92
|
+
out.push("");
|
|
93
|
+
out.push("None — every component the codemod recognized was converted. ✅");
|
|
94
|
+
out.push("");
|
|
95
|
+
}
|
|
96
|
+
// ── Review (secondary; omitted entirely when there's nothing to verify) ──
|
|
97
|
+
if (reviewCount > 0) {
|
|
98
|
+
out.push(`## Review — auto-changes to verify (${plural(reviewCount, "note")})`);
|
|
99
|
+
out.push("");
|
|
100
|
+
out.push("The codemod made these changes automatically. Confirm they behave like the MUI original.");
|
|
101
|
+
out.push("");
|
|
102
|
+
for (const f of reviewFiles) {
|
|
103
|
+
out.push(`### ${f.file}`);
|
|
104
|
+
out.push("");
|
|
105
|
+
for (const warning of f.warnings) {
|
|
106
|
+
out.push(`- ${warning}`);
|
|
107
|
+
}
|
|
108
|
+
out.push("");
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return out.join("\n");
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=migration-doc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-doc.js","sourceRoot":"","sources":["../src/migration-doc.ts"],"names":[],"mappings":"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"}
|
package/dist/run.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import type { SourceFile } from "ts-morph";
|
|
2
2
|
import type { ManualHit } from "./plan.js";
|
|
3
|
+
export { buildMigrationDoc } from "./migration-doc.js";
|
|
4
|
+
export type { MigrationDocInput, FileReport } from "./migration-doc.js";
|
|
3
5
|
export interface MigrationResult {
|
|
4
6
|
changed: boolean;
|
|
5
7
|
text: string;
|
package/dist/run.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAU3C,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CACzB;AAgBD,wBAAgB,YAAY,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,GAAE,gBAAqB,GAAG,eAAe,CA2EpG"}
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAU3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,YAAY,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAExE,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CACzB;AAgBD,wBAAgB,YAAY,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,GAAE,gBAAqB,GAAG,eAAe,CA2EpG"}
|
package/dist/run.js
CHANGED
|
@@ -7,6 +7,7 @@ import { sxFile } from "./sx.js";
|
|
|
7
7
|
import { iconsFile } from "./icons.js";
|
|
8
8
|
import { infraFile } from "./infra.js";
|
|
9
9
|
import { handlersFile } from "./handlers.js";
|
|
10
|
+
export { buildMigrationDoc } from "./migration-doc.js";
|
|
10
11
|
const registry = buildRegistry();
|
|
11
12
|
const componentPathPrefix = "@/components/ui/";
|
|
12
13
|
const layoutComponents = new Set(["Box", "Stack", "Grid", "Grid2", "GridLegacy", "Container"]);
|
package/dist/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAGnC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACrF,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mui-to-shadcn",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "A ts-morph codemod that converts Material UI (MUI) React code to shadcn/ui, including sx and system props to Tailwind. Optional one-command setup installs the needed shadcn components.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"mui",
|