@vc-shell/migrate 2.0.0-alpha.15 → 2.0.0-alpha.17

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.
Files changed (42) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/cli.js +3 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/runner.d.ts +2 -0
  5. package/dist/runner.js +232 -18
  6. package/dist/runner.js.map +1 -1
  7. package/dist/transforms/banner-variants.js +1 -1
  8. package/dist/transforms/banner-variants.js.map +1 -1
  9. package/dist/transforms/blade-props-simplification.js +44 -32
  10. package/dist/transforms/blade-props-simplification.js.map +1 -1
  11. package/dist/transforms/define-app-module.js +99 -27
  12. package/dist/transforms/define-app-module.js.map +1 -1
  13. package/dist/transforms/define-options-to-blade.d.ts +4 -0
  14. package/dist/transforms/define-options-to-blade.js +36 -0
  15. package/dist/transforms/define-options-to-blade.js.map +1 -0
  16. package/dist/transforms/icon-container-prop.js +1 -4
  17. package/dist/transforms/icon-container-prop.js.map +1 -1
  18. package/dist/transforms/manual-migration-audit.d.ts +4 -0
  19. package/dist/transforms/manual-migration-audit.js +39 -0
  20. package/dist/transforms/manual-migration-audit.js.map +1 -0
  21. package/dist/transforms/menu-group-config.js.map +1 -1
  22. package/dist/transforms/registry.js +24 -2
  23. package/dist/transforms/registry.js.map +1 -1
  24. package/dist/transforms/scss-safe-use.js.map +1 -1
  25. package/dist/transforms/shims-to-globals.js +1 -5
  26. package/dist/transforms/shims-to-globals.js.map +1 -1
  27. package/dist/transforms/types.d.ts +9 -0
  28. package/dist/transforms/use-blade-migration.js.map +1 -1
  29. package/dist/transforms/use-data-table-sort.d.ts +4 -0
  30. package/dist/transforms/use-data-table-sort.js +138 -0
  31. package/dist/transforms/use-data-table-sort.js.map +1 -0
  32. package/dist/transforms/widgets-migration.js.map +1 -1
  33. package/dist/utils/import-dedup.d.ts +13 -0
  34. package/dist/utils/import-dedup.js +184 -0
  35. package/dist/utils/import-dedup.js.map +1 -0
  36. package/dist/utils/template-transform.js.map +1 -1
  37. package/dist/utils/test-helpers.js.map +1 -1
  38. package/dist/utils/vue-sfc-wrapper.js +10 -7
  39. package/dist/utils/vue-sfc-wrapper.js.map +1 -1
  40. package/dist/version-detector.js +1 -3
  41. package/dist/version-detector.js.map +1 -1
  42. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,3 +1,24 @@
1
+ # [2.0.0-alpha.17](https://github.com/VirtoCommerce/vc-shell/compare/v2.0.0-alpha.16...v2.0.0-alpha.17) (2026-03-23)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * **migrate:** remove empty export type {} stubs after Props/Emits removal ([e6164ba](https://github.com/VirtoCommerce/vc-shell/commit/e6164ba267c737aee8990f271173d05e844e81a9))
7
+
8
+
9
+ ### Features
10
+
11
+ * **migrate:** add defineOptions → defineBlade transform ([676caea](https://github.com/VirtoCommerce/vc-shell/commit/676caea421fe960b589041ef74679d5fdb5336d8))
12
+ * **migrate:** add import dedup utility and improve vue-sfc-wrapper resilience ([c87e065](https://github.com/VirtoCommerce/vc-shell/commit/c87e06554b3f538d1ee45a65269e53c94fe40683))
13
+ * **migrate:** add manual-migration-audit diagnostic transform ([a069aad](https://github.com/VirtoCommerce/vc-shell/commit/a069aadd1816eb6363dd5e95ccd175b9e464d43e))
14
+ * **migrate:** add use-data-table-sort codemod transform ([655aef7](https://github.com/VirtoCommerce/vc-shell/commit/655aef7b98405b1243c00ed1cdc2a2320600d780))
15
+ * **migrate:** auto-migrate notificationTemplates to notifications config ([a9ccbe5](https://github.com/VirtoCommerce/vc-shell/commit/a9ccbe5e30a3f4b30a2c22e2911629d0a86dbb2d))
16
+ * **migrate:** fix defineAppModule 2-arg to use blades key ([a92f444](https://github.com/VirtoCommerce/vc-shell/commit/a92f44400ac5253900c0b9377113614fac931753))
17
+ * **migrate:** fix defineAppModule 3/4-arg to use object syntax with blades key ([31a1ef3](https://github.com/VirtoCommerce/vc-shell/commit/31a1ef3ae2b87fb77290ec79ff79cf13e65a7bf6))
18
+ # [2.0.0-alpha.16](https://github.com/VirtoCommerce/vc-shell/compare/v2.0.0-alpha.15...v2.0.0-alpha.16) (2026-03-20)
19
+
20
+ **Note:** Version bump only for package @vc-shell/migrate
21
+
1
22
  # [2.0.0-alpha.15](https://github.com/VirtoCommerce/vc-shell/compare/v2.0.0-alpha.14...v2.0.0-alpha.15) (2026-03-20)
2
23
 
3
24
  **Note:** Version bump only for package @vc-shell/migrate
package/dist/cli.js CHANGED
@@ -14,6 +14,7 @@ program
14
14
  .option("--list", "List available transforms", false)
15
15
  .option("--cwd <path>", "Working directory", ".")
16
16
  .option("--update-deps", "Also update dependency versions in package.json", false)
17
+ .option("--exclude <patterns...>", "Additional exclude patterns for files/directories", [])
17
18
  .action(async (options) => {
18
19
  const cwd = resolve(options.cwd);
19
20
  // Pre-flight: dirty working tree check
@@ -39,6 +40,8 @@ program
39
40
  transform: options.transform,
40
41
  dryRun: options.dryRun,
41
42
  list: options.list,
43
+ updateDeps: options.updateDeps,
44
+ exclude: options.exclude ?? [],
42
45
  });
43
46
  });
44
47
  program.parse();
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAElC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,kBAAkB,CAAC;KACxB,WAAW,CACV,6DAA6D,CAC9D;KACA,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,gBAAgB,EAAE,4CAA4C,CAAC;KACtE,MAAM,CAAC,oBAAoB,EAAE,+BAA+B,CAAC;KAC7D,MAAM,CAAC,WAAW,EAAE,uCAAuC,EAAE,KAAK,CAAC;KACnE,MAAM,CAAC,QAAQ,EAAE,2BAA2B,EAAE,KAAK,CAAC;KACpD,MAAM,CAAC,cAAc,EAAE,mBAAmB,EAAE,GAAG,CAAC;KAChD,MAAM,CACL,eAAe,EACf,iDAAiD,EACjD,KAAK,CACN;KACA,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAEjC,uCAAuC;IACvC,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;YAC5D,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE;gBAC5D,GAAG;gBACH,QAAQ,EAAE,OAAO;aAClB,CAAC,CAAC;YACH,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,yCAAyC;oBACvC,gEAAgE,CACnE,CACF,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,mDAAmD;QACrD,CAAC;IACH,CAAC;IAED,MAAM,GAAG,CAAC;QACR,GAAG;QACH,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,IAAI,EAAE,OAAO,CAAC,IAAI;KACnB,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAElC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,kBAAkB,CAAC;KACxB,WAAW,CAAC,6DAA6D,CAAC;KAC1E,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,gBAAgB,EAAE,4CAA4C,CAAC;KACtE,MAAM,CAAC,oBAAoB,EAAE,+BAA+B,CAAC;KAC7D,MAAM,CAAC,WAAW,EAAE,uCAAuC,EAAE,KAAK,CAAC;KACnE,MAAM,CAAC,QAAQ,EAAE,2BAA2B,EAAE,KAAK,CAAC;KACpD,MAAM,CAAC,cAAc,EAAE,mBAAmB,EAAE,GAAG,CAAC;KAChD,MAAM,CAAC,eAAe,EAAE,iDAAiD,EAAE,KAAK,CAAC;KACjF,MAAM,CAAC,yBAAyB,EAAE,mDAAmD,EAAE,EAAE,CAAC;KAC1F,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAEjC,uCAAuC;IACvC,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;YAC5D,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE;gBAC5D,GAAG;gBACH,QAAQ,EAAE,OAAO;aAClB,CAAC,CAAC;YACH,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,yCAAyC;oBACvC,gEAAgE,CACnE,CACF,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,mDAAmD;QACrD,CAAC;IACH,CAAC;IAED,MAAM,GAAG,CAAC;QACR,GAAG;QACH,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;KAC/B,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
package/dist/runner.d.ts CHANGED
@@ -4,5 +4,7 @@ export interface RunOptions {
4
4
  transform?: string;
5
5
  dryRun: boolean;
6
6
  list: boolean;
7
+ updateDeps?: boolean;
8
+ exclude?: string[];
7
9
  }
8
10
  export declare function run(options: RunOptions): Promise<void>;
package/dist/runner.js CHANGED
@@ -1,10 +1,13 @@
1
1
  import chalk from "chalk";
2
- import { resolve, join } from "node:path";
3
- import { readFileSync, readdirSync, statSync } from "node:fs";
2
+ import { resolve, join, dirname } from "node:path";
3
+ import { readFileSync, readdirSync, statSync, existsSync } from "node:fs";
4
4
  import writeFileAtomic from "write-file-atomic";
5
5
  import jscodeshift from "jscodeshift";
6
6
  import { detectFrameworkVersion } from "./version-detector.js";
7
7
  import { selectTransforms, transforms } from "./transforms/registry.js";
8
+ import { parse as parseSFC } from "@vue/compiler-sfc";
9
+ import { deduplicateImportSpecifiers } from "./utils/import-dedup.js";
10
+ const DEFAULT_EXCLUDES = ["api_client", "*.generated.ts", "*.d.ts"];
8
11
  export async function run(options) {
9
12
  if (options.list) {
10
13
  listTransforms();
@@ -32,12 +35,22 @@ export async function run(options) {
32
35
  }
33
36
  console.log(chalk.blue(`Running ${selected.length} transform(s)${options.dryRun ? " (dry run)" : ""}:`));
34
37
  selected.forEach((t) => console.log(chalk.gray(` - ${t.name}: ${t.description}`)));
35
- // Glob source files for per-file transforms
36
38
  const srcDir = join(cwd, "src");
37
- const sourceFiles = findFiles(srcDir, [".ts", ".vue"]);
39
+ if (!existsSync(srcDir)) {
40
+ console.log(chalk.yellow(`Warning: No src/ directory found in ${cwd}. Is --cwd correct?`));
41
+ return;
42
+ }
43
+ const allExcludes = [...DEFAULT_EXCLUDES, ...(options.exclude ?? [])];
44
+ const sourceFiles = findFiles(srcDir, [".ts", ".vue"], allExcludes);
45
+ // Pre-pass: collect notification type mappings for auto-migration
46
+ const notifyMap = collectNotifyTypeMap(srcDir);
47
+ let totalModified = 0;
48
+ let totalSkipped = 0;
49
+ let totalExcluded = 0;
50
+ let totalRolledBack = 0;
51
+ let totalWarnings = 0;
38
52
  for (const t of selected) {
39
53
  console.log(chalk.blue(`\nRunning: ${t.name}...`));
40
- // Dynamic import of transform module
41
54
  const mod = await import(t.transformPath);
42
55
  const transform = mod.default;
43
56
  const parser = mod.parser ?? "tsx";
@@ -47,6 +60,8 @@ export async function run(options) {
47
60
  filesModified: [],
48
61
  filesSkipped: [],
49
62
  filesErrored: [],
63
+ filesExcluded: [],
64
+ filesRolledBack: [],
50
65
  reports: [],
51
66
  };
52
67
  const api = {
@@ -56,7 +71,6 @@ export async function run(options) {
56
71
  report: (msg) => report.reports.push(msg),
57
72
  };
58
73
  if (t.scope === "project") {
59
- // Project-scoped transforms run once with cwd
60
74
  try {
61
75
  transform({ path: cwd, source: "" }, api, { cwd, dryRun: options.dryRun });
62
76
  }
@@ -68,16 +82,42 @@ export async function run(options) {
68
82
  }
69
83
  }
70
84
  else {
71
- // Per-file transforms
72
- for (const filePath of sourceFiles) {
85
+ const files = sourceFiles.filter((f) => {
86
+ if (t.fileExtensions) {
87
+ return t.fileExtensions.some((ext) => f.endsWith(ext));
88
+ }
89
+ return true;
90
+ });
91
+ for (const filePath of files) {
73
92
  try {
74
- const source = readFileSync(filePath, "utf-8");
75
- const result = transform({ path: filePath, source }, api, { cwd });
93
+ let source = readFileSync(filePath, "utf-8");
94
+ // Pre-dedup: clean up any duplicate imports from previous partial migrations
95
+ try {
96
+ source = preDedupSource(source, filePath, j);
97
+ }
98
+ catch {
99
+ // Pre-dedup failed — proceed with original source
100
+ }
101
+ // Pass per-file notifyTypeMap if this file's module has notifications
102
+ const fileNotifyMap = notifyMap.get(dirname(filePath));
103
+ let result = transform({ path: filePath, source }, api, { cwd, ...(fileNotifyMap ? { notifyTypeMap: fileNotifyMap } : {}) });
76
104
  if (result != null && result !== source) {
77
- if (!options.dryRun) {
78
- writeFileAtomic.sync(filePath, result);
105
+ try {
106
+ result = deduplicateImportSpecifiers(result, j);
107
+ }
108
+ catch {
109
+ // Dedup failed — use result as-is, validation will catch issues
110
+ }
111
+ const validationError = parseValidate(filePath, result, parser);
112
+ if (validationError) {
113
+ report.filesRolledBack.push({ path: filePath, error: validationError });
114
+ }
115
+ else {
116
+ if (!options.dryRun) {
117
+ writeFileAtomic.sync(filePath, result);
118
+ }
119
+ report.filesModified.push(filePath);
79
120
  }
80
- report.filesModified.push(filePath);
81
121
  }
82
122
  else {
83
123
  report.filesSkipped.push(filePath);
@@ -91,25 +131,112 @@ export async function run(options) {
91
131
  }
92
132
  }
93
133
  }
94
- // Print report
95
134
  if (report.filesModified.length > 0) {
96
135
  console.log(chalk.green(` Modified: ${report.filesModified.length} file(s)`));
97
136
  }
98
137
  if (report.reports.length > 0) {
99
138
  report.reports.forEach((w) => console.log(chalk.yellow(` ⚠ ${w}`)));
100
139
  }
140
+ if (report.filesRolledBack.length > 0) {
141
+ report.filesRolledBack.forEach((e) => console.log(chalk.yellow(` ⟲ ${e.path}: rolled back (${e.error})`)));
142
+ }
101
143
  if (report.filesErrored.length > 0) {
102
144
  report.filesErrored.forEach((e) => console.log(chalk.red(` ✗ ${e.path}: ${e.error}`)));
103
145
  }
146
+ totalModified += report.filesModified.length;
147
+ totalSkipped += report.filesSkipped.length;
148
+ totalExcluded += report.filesExcluded.length;
149
+ totalRolledBack += report.filesRolledBack.length;
150
+ totalWarnings += report.reports.length;
151
+ }
152
+ let depChanges = [];
153
+ if (options.updateDeps) {
154
+ depChanges = updateDependencyVersions(cwd, targetVersion, options.dryRun);
155
+ }
156
+ console.log(chalk.blue("\n─── Migration Summary ───"));
157
+ console.log(` Files modified: ${totalModified}`);
158
+ console.log(` Files skipped: ${totalSkipped}`);
159
+ if (totalExcluded > 0) {
160
+ console.log(chalk.gray(` Files excluded: ${totalExcluded}`));
161
+ }
162
+ if (totalRolledBack > 0) {
163
+ console.log(chalk.yellow(` Files rolled back: ${totalRolledBack}`));
164
+ }
165
+ if (totalWarnings > 0) {
166
+ console.log(chalk.yellow(` Warnings: ${totalWarnings} (manual review needed)`));
167
+ }
168
+ if (depChanges.length > 0) {
169
+ console.log(chalk.blue("\n Dependencies updated:"));
170
+ depChanges.forEach((c) => console.log(` ${c}`));
171
+ console.log(chalk.yellow("\n ⚠ Run `yarn install` to update the lockfile."));
104
172
  }
105
173
  if (options.dryRun) {
106
174
  console.log(chalk.yellow("\nDry run complete. No files were modified."));
107
175
  }
108
176
  else {
109
- console.log(chalk.green("\nAll transforms applied successfully."));
177
+ console.log(chalk.green("\nMigration complete."));
178
+ }
179
+ }
180
+ // Scan src/modules/{module}/components/notifications/{file}.vue to build a mapping
181
+ // of notifyType event names to file names, keyed by module directory.
182
+ function collectNotifyTypeMap(srcDir) {
183
+ const result = new Map();
184
+ const modulesDir = join(srcDir, "modules");
185
+ if (!existsSync(modulesDir))
186
+ return result;
187
+ let moduleEntries;
188
+ try {
189
+ moduleEntries = readdirSync(modulesDir, { encoding: "utf-8" });
190
+ }
191
+ catch {
192
+ return result;
193
+ }
194
+ for (const moduleEntry of moduleEntries) {
195
+ const moduleDir = join(modulesDir, moduleEntry);
196
+ try {
197
+ if (!statSync(moduleDir).isDirectory())
198
+ continue;
199
+ }
200
+ catch {
201
+ continue;
202
+ }
203
+ const notifDir = join(moduleDir, "components", "notifications");
204
+ if (!existsSync(notifDir))
205
+ continue;
206
+ const notifications = {};
207
+ let files;
208
+ try {
209
+ files = readdirSync(notifDir, { encoding: "utf-8" });
210
+ }
211
+ catch {
212
+ continue;
213
+ }
214
+ for (const file of files) {
215
+ if (!file.endsWith(".vue"))
216
+ continue;
217
+ try {
218
+ const filePath = join(notifDir, file);
219
+ const source = readFileSync(filePath, "utf-8");
220
+ const { descriptor } = parseSFC(source, { filename: filePath });
221
+ const scriptBlock = descriptor.scriptSetup ?? descriptor.script;
222
+ if (!scriptBlock)
223
+ continue;
224
+ const match = scriptBlock.content.match(/(?:defineOptions|defineBlade)\s*\(\s*\{[^}]*notifyType\s*:\s*["']([^"']+)["']/s);
225
+ if (match) {
226
+ notifications[match[1]] = file;
227
+ }
228
+ }
229
+ catch {
230
+ continue;
231
+ }
232
+ }
233
+ if (Object.keys(notifications).length > 0) {
234
+ result.set(moduleDir, { "./components/notifications": notifications });
235
+ }
110
236
  }
237
+ return result;
111
238
  }
112
- function findFiles(dir, extensions) {
239
+ function findFiles(dir, extensions, excludes) {
113
240
  const results = [];
114
241
  let entries;
115
242
  try {
@@ -121,14 +248,24 @@ function findFiles(dir, extensions) {
121
248
  for (const entry of entries) {
122
249
  if (entry === "node_modules" || entry.startsWith(".") || entry === "dist")
123
250
  continue;
251
+ if (excludes.includes(entry))
252
+ continue;
124
253
  const full = join(dir, entry);
125
254
  try {
126
255
  const stat = statSync(full);
127
256
  if (stat.isDirectory()) {
128
- results.push(...findFiles(full, extensions));
257
+ results.push(...findFiles(full, extensions, excludes));
129
258
  }
130
259
  else if (extensions.some((ext) => entry.endsWith(ext))) {
131
- results.push(full);
260
+ const excluded = excludes.some((pattern) => {
261
+ if (pattern.startsWith("*")) {
262
+ return entry.endsWith(pattern.slice(1));
263
+ }
264
+ return entry === pattern;
265
+ });
266
+ if (!excluded) {
267
+ results.push(full);
268
+ }
132
269
  }
133
270
  }
134
271
  catch {
@@ -137,6 +274,83 @@ function findFiles(dir, extensions) {
137
274
  }
138
275
  return results;
139
276
  }
277
+ /**
278
+ * Pre-dedup source before passing to transform.
279
+ * For .vue files: extract script block, dedup, splice back.
280
+ * For .ts files: dedup directly.
281
+ */
282
+ /**
283
+ * Collapse multi-line import statements into single lines so the
284
+ * text-based dedup can process them. Only affects import blocks.
285
+ */
286
+ function collapseMultiLineImports(script) {
287
+ return script.replace(/import\s*\{[^}]*\}\s*from\s*['"][^'"]+['"]\s*;?/gs, (match) => match.replace(/\s*\n\s*/g, " "));
288
+ }
289
+ function preDedupSource(source, filePath, j) {
290
+ if (filePath.endsWith(".vue")) {
291
+ const { descriptor } = parseSFC(source, { filename: filePath });
292
+ const scriptBlock = descriptor.scriptSetup ?? descriptor.script;
293
+ if (!scriptBlock)
294
+ return source;
295
+ // Collapse multi-line imports so text-based dedup can handle them
296
+ const collapsed = collapseMultiLineImports(scriptBlock.content);
297
+ const deduped = deduplicateImportSpecifiers(collapsed, j);
298
+ if (deduped === scriptBlock.content)
299
+ return source;
300
+ const start = scriptBlock.loc.start.offset;
301
+ const end = scriptBlock.loc.end.offset;
302
+ return source.substring(0, start) + deduped + source.substring(end);
303
+ }
304
+ return deduplicateImportSpecifiers(source, j);
305
+ }
306
+ function parseValidate(filePath, source, parser) {
307
+ try {
308
+ if (filePath.endsWith(".vue")) {
309
+ const { descriptor, errors } = parseSFC(source, { filename: filePath });
310
+ if (errors.length > 0) {
311
+ return `SFC parse error: ${errors[0].message}`;
312
+ }
313
+ const scriptBlock = descriptor.scriptSetup ?? descriptor.script;
314
+ if (scriptBlock) {
315
+ jscodeshift.withParser(parser)(scriptBlock.content);
316
+ }
317
+ }
318
+ else {
319
+ jscodeshift.withParser(parser)(source);
320
+ }
321
+ return null;
322
+ }
323
+ catch (err) {
324
+ return err instanceof Error ? err.message : String(err);
325
+ }
326
+ }
327
+ function updateDependencyVersions(cwd, targetVersion, dryRun) {
328
+ const pkgPath = join(cwd, "package.json");
329
+ if (!existsSync(pkgPath))
330
+ return [];
331
+ const pkgRaw = readFileSync(pkgPath, "utf-8");
332
+ const pkg = JSON.parse(pkgRaw);
333
+ const changes = [];
334
+ for (const depType of ["dependencies", "devDependencies"]) {
335
+ const deps = pkg[depType];
336
+ if (!deps)
337
+ continue;
338
+ for (const name of Object.keys(deps)) {
339
+ if (name.startsWith("@vc-shell/")) {
340
+ const oldVersion = deps[name];
341
+ const newVersion = `^${targetVersion}`;
342
+ if (oldVersion !== newVersion) {
343
+ changes.push(`${name}: ${oldVersion} → ${newVersion}`);
344
+ deps[name] = newVersion;
345
+ }
346
+ }
347
+ }
348
+ }
349
+ if (changes.length > 0 && !dryRun) {
350
+ writeFileAtomic.sync(pkgPath, JSON.stringify(pkg, null, 2) + "\n");
351
+ }
352
+ return changes;
353
+ }
140
354
  function listTransforms() {
141
355
  console.log(chalk.blue("Available transforms:\n"));
142
356
  for (const t of transforms) {
@@ -1 +1 @@
1
- {"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,WAAW,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAWxE,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,OAAmB;IAC3C,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,cAAc,EAAE,CAAC;QACjB,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,cAAc,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAEnD,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kDAAkD,GAAG,GAAG,CAAC,CAAC,CAAC;QACjF,OAAO;IACT,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,CAAC,EAAE,IAAI,OAAO,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,cAAc,MAAM,aAAa,EAAE,CAAC,CAAC,CAAC;IAE/E,IAAI,QAAQ,GAAG,gBAAgB,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;IAE/D,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;QAChE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,cAAc,OAAO,CAAC,SAAS,uDAAuD,CACvF,CACF,CAAC;YACF,OAAO;QACT,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC,CAAC;QACzE,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CACR,WAAW,QAAQ,CAAC,MAAM,gBAAgB,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,GAAG,CAChF,CACF,CAAC;IACF,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;IAEpF,4CAA4C;IAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAChC,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IAEvD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;QAEnD,qCAAqC;QACrC,MAAM,GAAG,GAAoB,MAAM,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;QAC3D,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC;QAC9B,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC;QACnC,MAAM,CAAC,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAEzC,MAAM,MAAM,GAAoB;YAC9B,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,aAAa,EAAE,EAAE;YACjB,YAAY,EAAE,EAAE;YAChB,YAAY,EAAE,EAAE;YAChB,OAAO,EAAE,EAAE;SACZ,CAAC;QAEF,MAAM,GAAG,GAAG;YACV,WAAW,EAAE,CAAC;YACd,CAAC;YACD,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;YACf,MAAM,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;SAClD,CAAC;QAEF,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC1B,8CAA8C;YAC9C,IAAI,CAAC;gBACH,SAAS,CACP,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,EACzB,GAAU,EACV,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAS,CACvC,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC;oBACvB,IAAI,EAAE,GAAG;oBACT,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBACxD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,CAAC;YACN,sBAAsB;YACtB,KAAK,MAAM,QAAQ,IAAI,WAAW,EAAE,CAAC;gBACnC,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;oBAC/C,MAAM,MAAM,GAAG,SAAS,CACtB,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAC1B,GAAU,EACV,EAAE,GAAG,EAAS,CACf,CAAC;oBAEF,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;wBACxC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;4BACpB,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;wBACzC,CAAC;wBACD,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBACtC,CAAC;yBAAM,CAAC;wBACN,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBACrC,CAAC;gBACH,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC;wBACvB,IAAI,EAAE,QAAQ;wBACd,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;qBACxD,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,eAAe;QACf,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,MAAM,CAAC,aAAa,CAAC,MAAM,UAAU,CAAC,CAAC,CAAC;QACjF,CAAC;QACD,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACvE,CAAC;QACD,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CACpD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,6CAA6C,CAAC,CAAC,CAAC;IAC3E,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC,CAAC;IACrE,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,GAAW,EAAE,UAAoB;IAClD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,KAAK,cAAc,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,KAAK,MAAM;YAAE,SAAS;QACpF,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACvB,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;YAC/C,CAAC;iBAAM,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBACzD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,cAAc;IACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;IACnD,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,QAAQ,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,CAAC,qBAAqB,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,qBAAqB,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@ import { wrapForSFCTemplate } from "../utils/vue-sfc-wrapper.js";
2
2
  const VARIANT_MAP = {
3
3
  "light-danger": "danger",
4
4
  "info-dark": "info",
5
- "primary": "info",
5
+ primary: "info",
6
6
  };
7
7
  function templateTransform(template, _filePath) {
8
8
  const tagRe = /(<(?:VcBanner|vc-banner)\b[^>]*?)(variant="(?:light-danger|info-dark|primary)")/gs;
@@ -1 +1 @@
1
- {"version":3,"file":"banner-variants.js","sourceRoot":"","sources":["../../src/transforms/banner-variants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAGjE,MAAM,WAAW,GAA2B;IAC1C,cAAc,EAAE,QAAQ;IACxB,WAAW,EAAE,MAAM;IACnB,SAAS,EAAE,MAAM;CAClB,CAAC;AAEF,SAAS,iBAAiB,CAAC,QAAgB,EAAE,SAAiB;IAC5D,MAAM,KAAK,GAAG,mFAAmF,CAAC;IAClG,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE;QACvE,KAAK,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YACnE,IAAI,WAAW,KAAK,YAAY,UAAU,GAAG,EAAE,CAAC;gBAC9C,OAAO,MAAM,GAAG,YAAY,UAAU,GAAG,CAAC;YAC5C,CAAC;QACH,CAAC;QACD,OAAO,MAAM,GAAG,WAAW,CAAC;IAC9B,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,KAAK,QAAQ,EAAE,CAAC;AAC/D,CAAC;AAED,eAAe,kBAAkB,CAAC,iBAAiB,CAAc,CAAC;AAClE,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,CAAC"}
1
+ {"version":3,"file":"banner-variants.js","sourceRoot":"","sources":["../../src/transforms/banner-variants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAGjE,MAAM,WAAW,GAA2B;IAC1C,cAAc,EAAE,QAAQ;IACxB,WAAW,EAAE,MAAM;IACnB,OAAO,EAAE,MAAM;CAChB,CAAC;AAEF,SAAS,iBAAiB,CAAC,QAAgB,EAAE,SAAiB;IAC5D,MAAM,KAAK,GAAG,mFAAmF,CAAC;IAClG,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE;QACvE,KAAK,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YACnE,IAAI,WAAW,KAAK,YAAY,UAAU,GAAG,EAAE,CAAC;gBAC9C,OAAO,MAAM,GAAG,YAAY,UAAU,GAAG,CAAC;YAC5C,CAAC;QACH,CAAC;QACD,OAAO,MAAM,GAAG,WAAW,CAAC;IAC9B,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,KAAK,QAAQ,EAAE,CAAC;AAC/D,CAAC;AAED,eAAe,kBAAkB,CAAC,iBAAiB,CAAc,CAAC;AAClE,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,CAAC"}
@@ -43,31 +43,23 @@ function coreTransform(fileInfo, api, _options) {
43
43
  // --- Track needed useBlade members ---
44
44
  const neededMembers = new Set();
45
45
  // Check props.param / props.options usage
46
- const usesParam = root
47
- .find(j.MemberExpression, { object: { name: "props" }, property: { name: "param" } })
48
- .size() > 0;
49
- const usesOptions = root
50
- .find(j.MemberExpression, { object: { name: "props" }, property: { name: "options" } })
51
- .size() > 0;
46
+ const usesParam = root.find(j.MemberExpression, { object: { name: "props" }, property: { name: "param" } }).size() > 0;
47
+ const usesOptions = root.find(j.MemberExpression, { object: { name: "props" }, property: { name: "options" } }).size() > 0;
52
48
  if (usesParam)
53
49
  neededMembers.add("param");
54
50
  if (usesOptions)
55
51
  neededMembers.add("options");
56
52
  // Check emit("parent:call", ...) usage
57
- const parentCallEmits = root
58
- .find(j.CallExpression, { callee: { name: "emit" } })
59
- .filter((path) => {
53
+ const parentCallEmits = root.find(j.CallExpression, { callee: { name: "emit" } }).filter((path) => {
60
54
  const args = path.node.arguments;
61
- return (args.length > 0 && args[0].type === "StringLiteral" && args[0].value === "parent:call");
55
+ return args.length > 0 && args[0].type === "StringLiteral" && args[0].value === "parent:call";
62
56
  });
63
57
  if (parentCallEmits.size() > 0)
64
58
  neededMembers.add("callParent");
65
59
  // Check emit("close:blade") usage
66
- const closeBladeEmits = root
67
- .find(j.CallExpression, { callee: { name: "emit" } })
68
- .filter((path) => {
60
+ const closeBladeEmits = root.find(j.CallExpression, { callee: { name: "emit" } }).filter((path) => {
69
61
  const args = path.node.arguments;
70
- return (args.length > 0 && args[0].type === "StringLiteral" && args[0].value === "close:blade");
62
+ return args.length > 0 && args[0].type === "StringLiteral" && args[0].value === "close:blade";
71
63
  });
72
64
  if (closeBladeEmits.size() > 0)
73
65
  neededMembers.add("closeSelf");
@@ -76,7 +68,7 @@ function coreTransform(fileInfo, api, _options) {
76
68
  .find(j.CallExpression, { callee: { name: "emit" } })
77
69
  .filter((path) => {
78
70
  const args = path.node.arguments;
79
- return (args.length > 0 && args[0].type === "StringLiteral" && args[0].value === "parent:call");
71
+ return args.length > 0 && args[0].type === "StringLiteral" && args[0].value === "parent:call";
80
72
  })
81
73
  .forEach((path) => {
82
74
  const args = path.node.arguments;
@@ -101,23 +93,19 @@ function coreTransform(fileInfo, api, _options) {
101
93
  .find(j.CallExpression, { callee: { name: "emit" } })
102
94
  .filter((path) => {
103
95
  const args = path.node.arguments;
104
- return (args.length > 0 && args[0].type === "StringLiteral" && args[0].value === "close:blade");
96
+ return args.length > 0 && args[0].type === "StringLiteral" && args[0].value === "close:blade";
105
97
  })
106
98
  .forEach((path) => {
107
99
  j(path).replaceWith(j.callExpression(j.identifier("closeSelf"), []));
108
100
  });
109
101
  // --- Step 5: Replace props.param → param.value, props.options → options.value ---
110
102
  if (usesParam) {
111
- root
112
- .find(j.MemberExpression, { object: { name: "props" }, property: { name: "param" } })
113
- .forEach((path) => {
103
+ root.find(j.MemberExpression, { object: { name: "props" }, property: { name: "param" } }).forEach((path) => {
114
104
  j(path).replaceWith(j.memberExpression(j.identifier("param"), j.identifier("value")));
115
105
  });
116
106
  }
117
107
  if (usesOptions) {
118
- root
119
- .find(j.MemberExpression, { object: { name: "props" }, property: { name: "options" } })
120
- .forEach((path) => {
108
+ root.find(j.MemberExpression, { object: { name: "props" }, property: { name: "options" } }).forEach((path) => {
121
109
  j(path).replaceWith(j.memberExpression(j.identifier("options"), j.identifier("value")));
122
110
  });
123
111
  }
@@ -163,7 +151,14 @@ function coreTransform(fileInfo, api, _options) {
163
151
  addUseBladeImport(root, j);
164
152
  addUseBladeCall(root, j, neededMembers);
165
153
  }
166
- return root.toSource();
154
+ let result = root.toSource();
155
+ // --- Remove leftover `export type {};` stubs ---
156
+ // When jscodeshift removes an `export interface`, it leaves behind `export type {};`.
157
+ // These stubs are not tracked in the AST after removal, so we clean them via string replacement.
158
+ if (propsRemoved || hasBladeEmits) {
159
+ result = result.replace(/^\s*export type \{\};\s*\n?/gm, "");
160
+ }
161
+ return result;
167
162
  }
168
163
  function removeDefinePropsStatement(root, j) {
169
164
  // Find variable declarations containing defineProps or withDefaults
@@ -183,9 +178,7 @@ function removeDefinePropsStatement(root, j) {
183
178
  }
184
179
  function simplifyWithDefaults(root, j) {
185
180
  // Find withDefaults(defineProps<Props>(), { expanded: true, closable: true })
186
- root
187
- .find(j.CallExpression, { callee: { name: "withDefaults" } })
188
- .forEach((path) => {
181
+ root.find(j.CallExpression, { callee: { name: "withDefaults" } }).forEach((path) => {
189
182
  const args = path.node.arguments;
190
183
  if (args.length < 2)
191
184
  return;
@@ -247,9 +240,7 @@ function addUseBladeImport(root, j) {
247
240
  let alreadyImported = false;
248
241
  frameworkImports.forEach((path) => {
249
242
  const specifiers = path.node.specifiers || [];
250
- if (specifiers.some((s) => s.type === "ImportSpecifier" &&
251
- s.imported.type === "Identifier" &&
252
- s.imported.name === "useBlade")) {
243
+ if (specifiers.some((s) => s.type === "ImportSpecifier" && s.imported.type === "Identifier" && s.imported.name === "useBlade")) {
253
244
  alreadyImported = true;
254
245
  }
255
246
  });
@@ -282,10 +273,31 @@ function addUseBladeImport(root, j) {
282
273
  }
283
274
  }
284
275
  function addUseBladeCall(root, j, neededMembers) {
285
- // Check if useBlade() call already exists
286
- const existingCalls = root.find(j.CallExpression, { callee: { name: "useBlade" } });
287
- if (existingCalls.size() > 0)
276
+ // Check if useBlade() call already exists in a variable declaration
277
+ const existingCalls = root.find(j.VariableDeclaration).filter((path) => {
278
+ return (j(path)
279
+ .find(j.CallExpression, { callee: { name: "useBlade" } })
280
+ .size() > 0);
281
+ });
282
+ if (existingCalls.size() > 0) {
283
+ // Merge missing members into the FIRST existing destructuring only
284
+ const firstCall = existingCalls.at(0);
285
+ const declarator = firstCall.get().node.declarations[0];
286
+ if (declarator.id.type === "ObjectPattern") {
287
+ const existingNames = new Set(declarator.id.properties
288
+ .filter((p) => p.type === "ObjectProperty" && p.key.type === "Identifier")
289
+ .map((p) => p.key.name));
290
+ for (const name of neededMembers) {
291
+ if (!existingNames.has(name)) {
292
+ const prop = j.objectProperty(j.identifier(name), j.identifier(name));
293
+ prop.shorthand = true;
294
+ declarator.id.properties.push(prop);
295
+ }
296
+ }
297
+ }
288
298
  return;
299
+ }
300
+ // No existing call — create new one
289
301
  const members = Array.from(neededMembers).sort();
290
302
  const properties = members.map((name) => {
291
303
  const prop = j.objectProperty(j.identifier(name), j.identifier(name));