lwc-convert 1.0.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.
Files changed (117) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +719 -0
  3. package/dist/cli/commands/aura.d.ts +6 -0
  4. package/dist/cli/commands/aura.d.ts.map +1 -0
  5. package/dist/cli/commands/aura.js +225 -0
  6. package/dist/cli/commands/aura.js.map +1 -0
  7. package/dist/cli/commands/vf.d.ts +6 -0
  8. package/dist/cli/commands/vf.d.ts.map +1 -0
  9. package/dist/cli/commands/vf.js +218 -0
  10. package/dist/cli/commands/vf.js.map +1 -0
  11. package/dist/cli/interactive.d.ts +20 -0
  12. package/dist/cli/interactive.d.ts.map +1 -0
  13. package/dist/cli/interactive.js +577 -0
  14. package/dist/cli/interactive.js.map +1 -0
  15. package/dist/cli/options.d.ts +21 -0
  16. package/dist/cli/options.d.ts.map +1 -0
  17. package/dist/cli/options.js +24 -0
  18. package/dist/cli/options.js.map +1 -0
  19. package/dist/generators/full-conversion.d.ts +41 -0
  20. package/dist/generators/full-conversion.d.ts.map +1 -0
  21. package/dist/generators/full-conversion.js +538 -0
  22. package/dist/generators/full-conversion.js.map +1 -0
  23. package/dist/generators/scaffolding.d.ts +40 -0
  24. package/dist/generators/scaffolding.d.ts.map +1 -0
  25. package/dist/generators/scaffolding.js +716 -0
  26. package/dist/generators/scaffolding.js.map +1 -0
  27. package/dist/generators/test-comparison.d.ts +47 -0
  28. package/dist/generators/test-comparison.d.ts.map +1 -0
  29. package/dist/generators/test-comparison.js +855 -0
  30. package/dist/generators/test-comparison.js.map +1 -0
  31. package/dist/generators/test-generator.d.ts +27 -0
  32. package/dist/generators/test-generator.d.ts.map +1 -0
  33. package/dist/generators/test-generator.js +385 -0
  34. package/dist/generators/test-generator.js.map +1 -0
  35. package/dist/index.d.ts +6 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +226 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/mappings/aura-to-lwc.json +321 -0
  40. package/dist/mappings/vf-to-lwc.json +354 -0
  41. package/dist/parsers/aura/controller-parser.d.ts +36 -0
  42. package/dist/parsers/aura/controller-parser.d.ts.map +1 -0
  43. package/dist/parsers/aura/controller-parser.js +269 -0
  44. package/dist/parsers/aura/controller-parser.js.map +1 -0
  45. package/dist/parsers/aura/helper-parser.d.ts +21 -0
  46. package/dist/parsers/aura/helper-parser.d.ts.map +1 -0
  47. package/dist/parsers/aura/helper-parser.js +173 -0
  48. package/dist/parsers/aura/helper-parser.js.map +1 -0
  49. package/dist/parsers/aura/markup-parser.d.ts +59 -0
  50. package/dist/parsers/aura/markup-parser.d.ts.map +1 -0
  51. package/dist/parsers/aura/markup-parser.js +279 -0
  52. package/dist/parsers/aura/markup-parser.js.map +1 -0
  53. package/dist/parsers/aura/style-parser.d.ts +37 -0
  54. package/dist/parsers/aura/style-parser.d.ts.map +1 -0
  55. package/dist/parsers/aura/style-parser.js +151 -0
  56. package/dist/parsers/aura/style-parser.js.map +1 -0
  57. package/dist/parsers/vf/apex-parser.d.ts +51 -0
  58. package/dist/parsers/vf/apex-parser.d.ts.map +1 -0
  59. package/dist/parsers/vf/apex-parser.js +251 -0
  60. package/dist/parsers/vf/apex-parser.js.map +1 -0
  61. package/dist/parsers/vf/page-parser.d.ts +61 -0
  62. package/dist/parsers/vf/page-parser.d.ts.map +1 -0
  63. package/dist/parsers/vf/page-parser.js +403 -0
  64. package/dist/parsers/vf/page-parser.js.map +1 -0
  65. package/dist/transformers/aura-to-lwc/controller.d.ts +36 -0
  66. package/dist/transformers/aura-to-lwc/controller.d.ts.map +1 -0
  67. package/dist/transformers/aura-to-lwc/controller.js +372 -0
  68. package/dist/transformers/aura-to-lwc/controller.js.map +1 -0
  69. package/dist/transformers/aura-to-lwc/events.d.ts +47 -0
  70. package/dist/transformers/aura-to-lwc/events.d.ts.map +1 -0
  71. package/dist/transformers/aura-to-lwc/events.js +262 -0
  72. package/dist/transformers/aura-to-lwc/events.js.map +1 -0
  73. package/dist/transformers/aura-to-lwc/markup.d.ts +51 -0
  74. package/dist/transformers/aura-to-lwc/markup.d.ts.map +1 -0
  75. package/dist/transformers/aura-to-lwc/markup.js +465 -0
  76. package/dist/transformers/aura-to-lwc/markup.js.map +1 -0
  77. package/dist/transformers/vf-to-lwc/components.d.ts +40 -0
  78. package/dist/transformers/vf-to-lwc/components.d.ts.map +1 -0
  79. package/dist/transformers/vf-to-lwc/components.js +374 -0
  80. package/dist/transformers/vf-to-lwc/components.js.map +1 -0
  81. package/dist/transformers/vf-to-lwc/data-binding.d.ts +53 -0
  82. package/dist/transformers/vf-to-lwc/data-binding.d.ts.map +1 -0
  83. package/dist/transformers/vf-to-lwc/data-binding.js +660 -0
  84. package/dist/transformers/vf-to-lwc/data-binding.js.map +1 -0
  85. package/dist/transformers/vf-to-lwc/markup.d.ts +44 -0
  86. package/dist/transformers/vf-to-lwc/markup.d.ts.map +1 -0
  87. package/dist/transformers/vf-to-lwc/markup.js +816 -0
  88. package/dist/transformers/vf-to-lwc/markup.js.map +1 -0
  89. package/dist/utils/confidence-scorer.d.ts +100 -0
  90. package/dist/utils/confidence-scorer.d.ts.map +1 -0
  91. package/dist/utils/confidence-scorer.js +358 -0
  92. package/dist/utils/confidence-scorer.js.map +1 -0
  93. package/dist/utils/file-io.d.ts +62 -0
  94. package/dist/utils/file-io.d.ts.map +1 -0
  95. package/dist/utils/file-io.js +248 -0
  96. package/dist/utils/file-io.js.map +1 -0
  97. package/dist/utils/logger.d.ts +34 -0
  98. package/dist/utils/logger.d.ts.map +1 -0
  99. package/dist/utils/logger.js +130 -0
  100. package/dist/utils/logger.js.map +1 -0
  101. package/dist/utils/open-folder.d.ts +9 -0
  102. package/dist/utils/open-folder.d.ts.map +1 -0
  103. package/dist/utils/open-folder.js +76 -0
  104. package/dist/utils/open-folder.js.map +1 -0
  105. package/dist/utils/path-resolver.d.ts +29 -0
  106. package/dist/utils/path-resolver.d.ts.map +1 -0
  107. package/dist/utils/path-resolver.js +240 -0
  108. package/dist/utils/path-resolver.js.map +1 -0
  109. package/dist/utils/session-store.d.ts +158 -0
  110. package/dist/utils/session-store.d.ts.map +1 -0
  111. package/dist/utils/session-store.js +518 -0
  112. package/dist/utils/session-store.js.map +1 -0
  113. package/dist/utils/vf-controller-resolver.d.ts +36 -0
  114. package/dist/utils/vf-controller-resolver.d.ts.map +1 -0
  115. package/dist/utils/vf-controller-resolver.js +162 -0
  116. package/dist/utils/vf-controller-resolver.js.map +1 -0
  117. package/package.json +81 -0
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Aura to LWC conversion command
3
+ */
4
+ import { AuraConversionOptions } from '../options';
5
+ export declare function convertAura(inputPath: string, options: AuraConversionOptions): Promise<void>;
6
+ //# sourceMappingURL=aura.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aura.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/aura.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAanD,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAgNf"}
@@ -0,0 +1,225 @@
1
+ "use strict";
2
+ /**
3
+ * Aura to LWC conversion command
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.convertAura = convertAura;
40
+ const path = __importStar(require("path"));
41
+ const file_io_1 = require("../../utils/file-io");
42
+ const logger_1 = require("../../utils/logger");
43
+ const markup_parser_1 = require("../../parsers/aura/markup-parser");
44
+ const controller_parser_1 = require("../../parsers/aura/controller-parser");
45
+ const helper_parser_1 = require("../../parsers/aura/helper-parser");
46
+ const style_parser_1 = require("../../parsers/aura/style-parser");
47
+ const markup_1 = require("../../transformers/aura-to-lwc/markup");
48
+ const scaffolding_1 = require("../../generators/scaffolding");
49
+ const full_conversion_1 = require("../../generators/full-conversion");
50
+ const path_resolver_1 = require("../../utils/path-resolver");
51
+ const session_store_1 = require("../../utils/session-store");
52
+ async function convertAura(inputPath, options) {
53
+ // Resolve the path (supports just component name)
54
+ const resolved = await (0, path_resolver_1.resolveAuraPath)(inputPath);
55
+ if (!resolved.found) {
56
+ logger_1.logger.error(`Component not found: ${inputPath}`);
57
+ if (resolved.searchedLocations && resolved.searchedLocations.length > 0) {
58
+ logger_1.logger.subheader('Searched in:');
59
+ console.log((0, path_resolver_1.formatSearchLocations)(resolved.searchedLocations, process.cwd()));
60
+ }
61
+ logger_1.logger.blank();
62
+ logger_1.logger.info('Tip: You can provide just the component name (e.g., "AccountCard")');
63
+ logger_1.logger.info(' or a full path (e.g., "./force-app/main/default/aura/AccountCard")');
64
+ process.exit(1);
65
+ }
66
+ const bundlePath = resolved.path;
67
+ // Show banner and conversion info
68
+ logger_1.logger.banner();
69
+ logger_1.logger.header('Aura → LWC Conversion');
70
+ logger_1.logger.info(`Source: ${bundlePath}`);
71
+ logger_1.logger.info(`Mode: ${options.full ? 'Full Conversion' : 'Scaffolding'}`);
72
+ logger_1.logger.info(`Output: ${options.output}`);
73
+ if (options.dryRun) {
74
+ logger_1.logger.warn('Dry run mode - no files will be written');
75
+ }
76
+ logger_1.logger.divider();
77
+ try {
78
+ // Step 1: Read Aura bundle
79
+ logger_1.logger.step(1, 'Reading Aura component bundle...');
80
+ const bundle = await (0, file_io_1.readAuraBundle)(bundlePath);
81
+ logger_1.logger.success(`Read component: ${bundle.name}`);
82
+ // Step 2: Parse markup
83
+ logger_1.logger.step(2, 'Parsing component markup...');
84
+ if (!bundle.markup) {
85
+ throw new Error('No markup (.cmp) file found in bundle');
86
+ }
87
+ const parsedMarkup = (0, markup_parser_1.parseAuraMarkup)(bundle.markup, bundle.name);
88
+ logger_1.logger.success(`Parsed ${parsedMarkup.attributes.length} attributes, ${parsedMarkup.handlers.length} handlers`);
89
+ // Step 3: Parse controller (if exists)
90
+ let parsedController;
91
+ if (bundle.controller) {
92
+ logger_1.logger.step(3, 'Parsing JavaScript controller...');
93
+ parsedController = (0, controller_parser_1.parseAuraController)(bundle.controller);
94
+ logger_1.logger.success(`Parsed ${parsedController.functions.length} controller functions`);
95
+ }
96
+ else {
97
+ logger_1.logger.step(3, 'No JavaScript controller found');
98
+ }
99
+ // Step 4: Parse helper (if exists)
100
+ let parsedHelper;
101
+ if (bundle.helper) {
102
+ logger_1.logger.step(4, 'Parsing JavaScript helper...');
103
+ parsedHelper = (0, helper_parser_1.parseAuraHelper)(bundle.helper);
104
+ logger_1.logger.success(`Parsed ${parsedHelper.functions.length} helper functions`);
105
+ }
106
+ else {
107
+ logger_1.logger.step(4, 'No JavaScript helper found');
108
+ }
109
+ // Step 5: Parse styles (if exists)
110
+ let parsedStyle;
111
+ if (bundle.style) {
112
+ logger_1.logger.step(5, 'Parsing CSS styles...');
113
+ parsedStyle = (0, style_parser_1.parseAuraStyle)(bundle.style);
114
+ logger_1.logger.success(`Parsed ${parsedStyle.rules.length} CSS rules`);
115
+ }
116
+ else {
117
+ logger_1.logger.step(5, 'No CSS styles found');
118
+ }
119
+ // Step 6: Transform and generate
120
+ logger_1.logger.step(6, options.full ? 'Generating full conversion...' : 'Generating scaffolding...');
121
+ let result;
122
+ if (options.full) {
123
+ result = (0, full_conversion_1.generateAuraFullConversion)(parsedMarkup, parsedController, parsedHelper, parsedStyle);
124
+ }
125
+ else {
126
+ const transformedMarkup = (0, markup_1.transformAuraMarkup)(parsedMarkup);
127
+ result = (0, scaffolding_1.generateAuraScaffolding)(parsedMarkup, transformedMarkup, parsedController, parsedHelper, parsedStyle);
128
+ }
129
+ logger_1.logger.success(`Generated LWC: ${result.bundle.name}`);
130
+ // Step 7: Write output
131
+ logger_1.logger.step(7, 'Writing output files...');
132
+ const outputDir = path.resolve(options.output);
133
+ const writtenFiles = await (0, file_io_1.writeLwcBundle)(outputDir, result.bundle, options.dryRun);
134
+ // Write conversion notes
135
+ if (result.notes.length > 0) {
136
+ await (0, file_io_1.writeConversionNotes)(outputDir, result.bundle.name, result.notes, options.dryRun);
137
+ }
138
+ // Write Jest tests if generated
139
+ if (result.tests) {
140
+ const testDir = path.join(outputDir, result.bundle.name, '__tests__');
141
+ const testFilePath = path.join(testDir, result.tests.filename);
142
+ const { writeFile } = await Promise.resolve().then(() => __importStar(require('../../utils/file-io')));
143
+ await writeFile(testFilePath, result.tests.content, options.dryRun);
144
+ }
145
+ // Write behavior spec document
146
+ if (result.behaviorSpec) {
147
+ const specFilePath = path.join(outputDir, result.bundle.name, `${result.bundle.name}-behavior-spec.md`);
148
+ const { writeFile } = await Promise.resolve().then(() => __importStar(require('../../utils/file-io')));
149
+ await writeFile(specFilePath, result.behaviorSpec, options.dryRun);
150
+ }
151
+ // Write test comparison files (before/after tests)
152
+ if (result.testComparison) {
153
+ const { writeFile } = await Promise.resolve().then(() => __importStar(require('../../utils/file-io')));
154
+ const testDir = path.join(outputDir, result.bundle.name, '__tests__');
155
+ // Write "before" test documentation (Aura behaviors)
156
+ const beforeTestPath = path.join(testDir, `${result.bundle.name}.before.spec.js`);
157
+ await writeFile(beforeTestPath, result.testComparison.beforeTestFile, options.dryRun);
158
+ // Write "after" test file (LWC verification)
159
+ const afterTestPath = path.join(testDir, `${result.bundle.name}.after.test.js`);
160
+ await writeFile(afterTestPath, result.testComparison.afterTestFile, options.dryRun);
161
+ // Write comparison report
162
+ const comparisonReportPath = path.join(outputDir, result.bundle.name, `${result.bundle.name}-test-comparison.md`);
163
+ await writeFile(comparisonReportPath, result.testComparison.comparisonReport, options.dryRun);
164
+ }
165
+ logger_1.logger.divider();
166
+ logger_1.logger.success('Conversion complete!');
167
+ // Store conversion in session for learning
168
+ if (result.testComparison) {
169
+ const conversionRecord = await session_store_1.sessionStore.storeConversion('aura', bundle.name, result.bundle.name, bundlePath, path.join(outputDir, result.bundle.name), result.testComparison, result.warnings);
170
+ logger_1.logger.debug(`Session stored: ${conversionRecord.id}`);
171
+ }
172
+ // Calculate file count
173
+ let totalFiles = writtenFiles.length + 1; // +1 for notes
174
+ if (result.tests)
175
+ totalFiles++;
176
+ if (result.behaviorSpec)
177
+ totalFiles++;
178
+ if (result.testComparison)
179
+ totalFiles += 3; // before spec, after test, comparison report
180
+ // Summary box with key info
181
+ const sessionSummary = session_store_1.sessionStore.getSessionSummary();
182
+ logger_1.logger.summaryBox('Conversion Summary', [
183
+ { label: 'Component', value: `${bundle.name} → ${result.bundle.name}`, type: 'success' },
184
+ { label: 'Files created', value: `${totalFiles}`, type: 'info' },
185
+ { label: 'Behaviors mapped', value: `${result.testComparison?.behaviorTests.length || 0}`, type: 'info' },
186
+ { label: 'Warnings', value: `${result.warnings.length}`, type: result.warnings.length > 0 ? 'warn' : 'success' },
187
+ { label: 'Session conversions', value: `${sessionSummary.conversions}`, type: 'info' },
188
+ { label: 'Output', value: path.join(outputDir, result.bundle.name), type: 'info' },
189
+ ]);
190
+ if (result.warnings.length > 0) {
191
+ if (options.verbose) {
192
+ logger_1.logger.subheader('Warnings:');
193
+ for (const warning of result.warnings) {
194
+ logger_1.logger.todo(warning);
195
+ }
196
+ }
197
+ else {
198
+ logger_1.logger.info('Run with --verbose to see all warnings');
199
+ }
200
+ logger_1.logger.blank();
201
+ }
202
+ // Next steps guidance
203
+ logger_1.logger.nextSteps([
204
+ `Review generated files in ${result.bundle.name}/`,
205
+ 'Check conversion-notes.md for manual action items',
206
+ 'Run Jest tests: npm test -- --findRelatedTests',
207
+ 'Verify behavior matches original component',
208
+ `Session data stored in: ${session_store_1.sessionStore.getSessionDir()}`,
209
+ ]);
210
+ // Open folder if requested
211
+ if (options.open && !options.dryRun) {
212
+ const { openFolder } = await Promise.resolve().then(() => __importStar(require('../../utils/open-folder')));
213
+ logger_1.logger.info('Opening output folder...');
214
+ await openFolder(outputDir);
215
+ }
216
+ }
217
+ catch (error) {
218
+ logger_1.logger.error(error.message);
219
+ if (options.verbose && error.stack) {
220
+ console.error(error.stack);
221
+ }
222
+ process.exit(1);
223
+ }
224
+ }
225
+ //# sourceMappingURL=aura.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aura.js","sourceRoot":"","sources":["../../../src/cli/commands/aura.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBH,kCAmNC;AAjOD,2CAA6B;AAE7B,iDAA2F;AAC3F,+CAA4C;AAC5C,oEAAmE;AACnE,4EAA2E;AAC3E,oEAAmE;AACnE,kEAAiE;AACjE,kEAA4E;AAC5E,8DAAuE;AACvE,sEAA8E;AAC9E,6DAAmF;AACnF,6DAAyD;AAElD,KAAK,UAAU,WAAW,CAC/B,SAAiB,EACjB,OAA8B;IAE9B,kDAAkD;IAClD,MAAM,QAAQ,GAAG,MAAM,IAAA,+BAAe,EAAC,SAAS,CAAC,CAAC;IAElD,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACpB,eAAM,CAAC,KAAK,CAAC,wBAAwB,SAAS,EAAE,CAAC,CAAC;QAClD,IAAI,QAAQ,CAAC,iBAAiB,IAAI,QAAQ,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxE,eAAM,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,IAAA,qCAAqB,EAAC,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAChF,CAAC;QACD,eAAM,CAAC,KAAK,EAAE,CAAC;QACf,eAAM,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;QAClF,eAAM,CAAC,IAAI,CAAC,yEAAyE,CAAC,CAAC;QACvF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC;IAEjC,kCAAkC;IAClC,eAAM,CAAC,MAAM,EAAE,CAAC;IAChB,eAAM,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC;IACvC,eAAM,CAAC,IAAI,CAAC,WAAW,UAAU,EAAE,CAAC,CAAC;IACrC,eAAM,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC;IACzE,eAAM,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,eAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;IACzD,CAAC;IACD,eAAM,CAAC,OAAO,EAAE,CAAC;IAEjB,IAAI,CAAC;QACH,2BAA2B;QAC3B,eAAM,CAAC,IAAI,CAAC,CAAC,EAAE,kCAAkC,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,MAAM,IAAA,wBAAc,EAAC,UAAU,CAAC,CAAC;QAChD,eAAM,CAAC,OAAO,CAAC,mBAAmB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAEjD,uBAAuB;QACvB,eAAM,CAAC,IAAI,CAAC,CAAC,EAAE,6BAA6B,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC3D,CAAC;QACD,MAAM,YAAY,GAAG,IAAA,+BAAe,EAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QACjE,eAAM,CAAC,OAAO,CAAC,UAAU,YAAY,CAAC,UAAU,CAAC,MAAM,gBAAgB,YAAY,CAAC,QAAQ,CAAC,MAAM,WAAW,CAAC,CAAC;QAEhH,uCAAuC;QACvC,IAAI,gBAAgB,CAAC;QACrB,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACtB,eAAM,CAAC,IAAI,CAAC,CAAC,EAAE,kCAAkC,CAAC,CAAC;YACnD,gBAAgB,GAAG,IAAA,uCAAmB,EAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC1D,eAAM,CAAC,OAAO,CAAC,UAAU,gBAAgB,CAAC,SAAS,CAAC,MAAM,uBAAuB,CAAC,CAAC;QACrF,CAAC;aAAM,CAAC;YACN,eAAM,CAAC,IAAI,CAAC,CAAC,EAAE,gCAAgC,CAAC,CAAC;QACnD,CAAC;QAED,mCAAmC;QACnC,IAAI,YAAY,CAAC;QACjB,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,eAAM,CAAC,IAAI,CAAC,CAAC,EAAE,8BAA8B,CAAC,CAAC;YAC/C,YAAY,GAAG,IAAA,+BAAe,EAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC9C,eAAM,CAAC,OAAO,CAAC,UAAU,YAAY,CAAC,SAAS,CAAC,MAAM,mBAAmB,CAAC,CAAC;QAC7E,CAAC;aAAM,CAAC;YACN,eAAM,CAAC,IAAI,CAAC,CAAC,EAAE,4BAA4B,CAAC,CAAC;QAC/C,CAAC;QAED,mCAAmC;QACnC,IAAI,WAAW,CAAC;QAChB,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,eAAM,CAAC,IAAI,CAAC,CAAC,EAAE,uBAAuB,CAAC,CAAC;YACxC,WAAW,GAAG,IAAA,6BAAc,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC3C,eAAM,CAAC,OAAO,CAAC,UAAU,WAAW,CAAC,KAAK,CAAC,MAAM,YAAY,CAAC,CAAC;QACjE,CAAC;aAAM,CAAC;YACN,eAAM,CAAC,IAAI,CAAC,CAAC,EAAE,qBAAqB,CAAC,CAAC;QACxC,CAAC;QAED,iCAAiC;QACjC,eAAM,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC;QAE7F,IAAI,MAAM,CAAC;QACX,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,GAAG,IAAA,4CAA0B,EACjC,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACZ,WAAW,CACZ,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,iBAAiB,GAAG,IAAA,4BAAmB,EAAC,YAAY,CAAC,CAAC;YAC5D,MAAM,GAAG,IAAA,qCAAuB,EAC9B,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,EACZ,WAAW,CACZ,CAAC;QACJ,CAAC;QAED,eAAM,CAAC,OAAO,CAAC,kBAAkB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAEvD,uBAAuB;QACvB,eAAM,CAAC,IAAI,CAAC,CAAC,EAAE,yBAAyB,CAAC,CAAC;QAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,YAAY,GAAG,MAAM,IAAA,wBAAc,EAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAEpF,yBAAyB;QACzB,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAA,8BAAoB,EAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAC1F,CAAC;QAED,gCAAgC;QAChC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YACtE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC/D,MAAM,EAAE,SAAS,EAAE,GAAG,wDAAa,qBAAqB,GAAC,CAAC;YAC1D,MAAM,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACtE,CAAC;QAED,+BAA+B;QAC/B,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YACxB,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,mBAAmB,CAAC,CAAC;YACxG,MAAM,EAAE,SAAS,EAAE,GAAG,wDAAa,qBAAqB,GAAC,CAAC;YAC1D,MAAM,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACrE,CAAC;QAED,mDAAmD;QACnD,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;YAC1B,MAAM,EAAE,SAAS,EAAE,GAAG,wDAAa,qBAAqB,GAAC,CAAC;YAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YAEtE,qDAAqD;YACrD,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,iBAAiB,CAAC,CAAC;YAClF,MAAM,SAAS,CAAC,cAAc,EAAE,MAAM,CAAC,cAAc,CAAC,cAAc,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YAEtF,6CAA6C;YAC7C,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,gBAAgB,CAAC,CAAC;YAChF,MAAM,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC,cAAc,CAAC,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YAEpF,0BAA0B;YAC1B,MAAM,oBAAoB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,qBAAqB,CAAC,CAAC;YAClH,MAAM,SAAS,CAAC,oBAAoB,EAAE,MAAM,CAAC,cAAc,CAAC,gBAAgB,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAChG,CAAC;QAED,eAAM,CAAC,OAAO,EAAE,CAAC;QACjB,eAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;QAEvC,2CAA2C;QAC3C,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;YAC1B,MAAM,gBAAgB,GAAG,MAAM,4BAAY,CAAC,eAAe,CACzD,MAAM,EACN,MAAM,CAAC,IAAI,EACX,MAAM,CAAC,MAAM,CAAC,IAAI,EAClB,UAAU,EACV,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EACxC,MAAM,CAAC,cAAc,EACrB,MAAM,CAAC,QAAQ,CAChB,CAAC;YACF,eAAM,CAAC,KAAK,CAAC,mBAAmB,gBAAgB,CAAC,EAAE,EAAE,CAAC,CAAC;QACzD,CAAC;QAED,uBAAuB;QACvB,IAAI,UAAU,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,eAAe;QACzD,IAAI,MAAM,CAAC,KAAK;YAAE,UAAU,EAAE,CAAC;QAC/B,IAAI,MAAM,CAAC,YAAY;YAAE,UAAU,EAAE,CAAC;QACtC,IAAI,MAAM,CAAC,cAAc;YAAE,UAAU,IAAI,CAAC,CAAC,CAAC,6CAA6C;QAEzF,4BAA4B;QAC5B,MAAM,cAAc,GAAG,4BAAY,CAAC,iBAAiB,EAAE,CAAC;QACxD,eAAM,CAAC,UAAU,CAAC,oBAAoB,EAAE;YACtC,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;YACxF,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,GAAG,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;YAChE,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,cAAc,EAAE,aAAa,CAAC,MAAM,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;YACzG,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE;YAChH,EAAE,KAAK,EAAE,qBAAqB,EAAE,KAAK,EAAE,GAAG,cAAc,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;YACtF,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;SACnF,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,eAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;gBAC9B,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;oBACtC,eAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,eAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;YACxD,CAAC;YACD,eAAM,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;QAED,sBAAsB;QACtB,eAAM,CAAC,SAAS,CAAC;YACf,6BAA6B,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG;YAClD,mDAAmD;YACnD,gDAAgD;YAChD,4CAA4C;YAC5C,2BAA2B,4BAAY,CAAC,aAAa,EAAE,EAAE;SAC1D,CAAC,CAAC;QAEH,2BAA2B;QAC3B,IAAI,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACpC,MAAM,EAAE,UAAU,EAAE,GAAG,wDAAa,yBAAyB,GAAC,CAAC;YAC/D,eAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;YACxC,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,eAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5B,IAAI,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YACnC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Visualforce to LWC conversion command
3
+ */
4
+ import { VfConversionOptions } from '../options';
5
+ export declare function convertVf(inputPath: string, options: VfConversionOptions): Promise<void>;
6
+ //# sourceMappingURL=vf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vf.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/vf.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAUjD,wBAAsB,SAAS,CAC7B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAiMf"}
@@ -0,0 +1,218 @@
1
+ "use strict";
2
+ /**
3
+ * Visualforce to LWC conversion command
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.convertVf = convertVf;
40
+ const path = __importStar(require("path"));
41
+ const file_io_1 = require("../../utils/file-io");
42
+ const logger_1 = require("../../utils/logger");
43
+ const page_parser_1 = require("../../parsers/vf/page-parser");
44
+ const apex_parser_1 = require("../../parsers/vf/apex-parser");
45
+ const markup_1 = require("../../transformers/vf-to-lwc/markup");
46
+ const scaffolding_1 = require("../../generators/scaffolding");
47
+ const full_conversion_1 = require("../../generators/full-conversion");
48
+ const path_resolver_1 = require("../../utils/path-resolver");
49
+ async function convertVf(inputPath, options) {
50
+ // Resolve the VF page path (supports just page name)
51
+ const resolved = await (0, path_resolver_1.resolveVfPath)(inputPath);
52
+ if (!resolved.found) {
53
+ logger_1.logger.error(`Page not found: ${inputPath}`);
54
+ if (resolved.searchedLocations && resolved.searchedLocations.length > 0) {
55
+ logger_1.logger.subheader('Searched in:');
56
+ console.log((0, path_resolver_1.formatSearchLocations)(resolved.searchedLocations, process.cwd()));
57
+ }
58
+ logger_1.logger.blank();
59
+ logger_1.logger.info('Tip: You can provide just the page name (e.g., "ContactList")');
60
+ logger_1.logger.info(' or a full path (e.g., "./force-app/main/default/pages/ContactList.page")');
61
+ process.exit(1);
62
+ }
63
+ const pagePath = resolved.path;
64
+ // Resolve controller path if provided
65
+ let controllerPath = options.controller;
66
+ if (controllerPath) {
67
+ const resolvedController = await (0, path_resolver_1.resolveApexPath)(controllerPath);
68
+ if (!resolvedController.found) {
69
+ logger_1.logger.warn(`Controller not found: ${controllerPath}`);
70
+ if (resolvedController.searchedLocations && resolvedController.searchedLocations.length > 0) {
71
+ logger_1.logger.subheader('Searched in:');
72
+ console.log((0, path_resolver_1.formatSearchLocations)(resolvedController.searchedLocations, process.cwd()));
73
+ }
74
+ logger_1.logger.info('Continuing without controller analysis...');
75
+ logger_1.logger.blank();
76
+ controllerPath = undefined;
77
+ }
78
+ else {
79
+ controllerPath = resolvedController.path;
80
+ }
81
+ }
82
+ // Update options with resolved controller path
83
+ // Controller path is used directly below
84
+ // Show banner and conversion info
85
+ logger_1.logger.banner();
86
+ logger_1.logger.header('Visualforce → LWC Conversion');
87
+ logger_1.logger.info(`Source: ${pagePath}`);
88
+ logger_1.logger.info(`Mode: ${options.full ? 'Full Conversion' : 'Scaffolding'}`);
89
+ logger_1.logger.info(`Output: ${options.output}`);
90
+ if (controllerPath) {
91
+ logger_1.logger.info(`Controller: ${controllerPath}`);
92
+ }
93
+ if (options.dryRun) {
94
+ logger_1.logger.warn('Dry run mode - no files will be written');
95
+ }
96
+ logger_1.logger.divider();
97
+ try {
98
+ // Step 1: Read VF page
99
+ logger_1.logger.step(1, 'Reading Visualforce page...');
100
+ const vfPage = await (0, file_io_1.readVfPage)(pagePath, controllerPath);
101
+ logger_1.logger.success(`Read page: ${vfPage.name}`);
102
+ // Step 2: Parse VF markup
103
+ logger_1.logger.step(2, 'Parsing Visualforce markup...');
104
+ const parsedPage = (0, page_parser_1.parseVfPage)(vfPage.markup, vfPage.name);
105
+ logger_1.logger.success(`Parsed ${parsedPage.components.length} components, ${parsedPage.expressions.length} expressions`);
106
+ // Log page attributes
107
+ if (parsedPage.pageAttributes.controller) {
108
+ logger_1.logger.info(` Controller: ${parsedPage.pageAttributes.controller}`);
109
+ }
110
+ if (parsedPage.pageAttributes.standardController) {
111
+ logger_1.logger.info(` Standard Controller: ${parsedPage.pageAttributes.standardController}`);
112
+ }
113
+ if (parsedPage.pageAttributes.extensions) {
114
+ logger_1.logger.info(` Extensions: ${parsedPage.pageAttributes.extensions.join(', ')}`);
115
+ }
116
+ // Step 3: Parse Apex controller (if provided or detected)
117
+ let parsedController;
118
+ if (vfPage.controller) {
119
+ logger_1.logger.step(3, 'Parsing Apex controller...');
120
+ parsedController = (0, apex_parser_1.parseApexController)(vfPage.controller);
121
+ logger_1.logger.success(`Parsed ${parsedController.properties.length} properties, ${parsedController.methods.length} methods`);
122
+ // Log useful info
123
+ const auraEnabled = parsedController.methods.filter((m) => m.isAuraEnabled);
124
+ const remoteActions = parsedController.methods.filter((m) => m.isRemoteAction);
125
+ if (auraEnabled.length > 0) {
126
+ logger_1.logger.info(` @AuraEnabled methods: ${auraEnabled.map((m) => m.name).join(', ')}`);
127
+ }
128
+ if (remoteActions.length > 0) {
129
+ logger_1.logger.info(` @RemoteAction methods: ${remoteActions.map((m) => m.name).join(', ')}`);
130
+ }
131
+ }
132
+ else {
133
+ logger_1.logger.step(3, 'No Apex controller provided');
134
+ if (parsedPage.pageAttributes.controller) {
135
+ logger_1.logger.warn(`Page references controller "${parsedPage.pageAttributes.controller}" - provide with --controller flag for better conversion`);
136
+ }
137
+ }
138
+ // Step 4: Log page analysis
139
+ logger_1.logger.step(4, 'Analyzing page structure...');
140
+ if (parsedPage.actionFunctions.length > 0) {
141
+ logger_1.logger.info(` Action functions: ${parsedPage.actionFunctions.map((af) => af.name).join(', ')}`);
142
+ }
143
+ if (parsedPage.remoteActions.length > 0) {
144
+ logger_1.logger.info(` Remote actions: ${parsedPage.remoteActions.map((ra) => `${ra.controller}.${ra.method}`).join(', ')}`);
145
+ }
146
+ if (parsedPage.rerenderedSections.length > 0) {
147
+ logger_1.logger.info(` Rerendered sections: ${parsedPage.rerenderedSections.join(', ')}`);
148
+ }
149
+ if (parsedPage.includedScripts.length > 0) {
150
+ logger_1.logger.info(` Included scripts: ${parsedPage.includedScripts.length}`);
151
+ }
152
+ // Step 5: Transform and generate
153
+ logger_1.logger.step(5, options.full ? 'Generating full conversion...' : 'Generating scaffolding...');
154
+ let result;
155
+ if (options.full) {
156
+ result = (0, full_conversion_1.generateVfFullConversion)(parsedPage, parsedController);
157
+ }
158
+ else {
159
+ const transformedMarkup = (0, markup_1.transformVfMarkup)(parsedPage);
160
+ result = (0, scaffolding_1.generateVfScaffolding)(parsedPage, transformedMarkup, parsedController);
161
+ }
162
+ logger_1.logger.success(`Generated LWC: ${result.bundle.name}`);
163
+ // Step 6: Write output
164
+ logger_1.logger.step(6, 'Writing output files...');
165
+ const outputDir = path.resolve(options.output);
166
+ const writtenFiles = await (0, file_io_1.writeLwcBundle)(outputDir, result.bundle, options.dryRun);
167
+ // Write conversion notes
168
+ if (result.notes.length > 0) {
169
+ await (0, file_io_1.writeConversionNotes)(outputDir, result.bundle.name, result.notes, options.dryRun);
170
+ }
171
+ logger_1.logger.divider();
172
+ logger_1.logger.success('Conversion complete!');
173
+ // Summary box with key info
174
+ logger_1.logger.summaryBox('Conversion Summary', [
175
+ { label: 'Page', value: `${vfPage.name} → ${result.bundle.name}`, type: 'success' },
176
+ { label: 'Files created', value: `${writtenFiles.length + 1}`, type: 'info' },
177
+ { label: 'Warnings', value: `${result.warnings.length}`, type: result.warnings.length > 0 ? 'warn' : 'success' },
178
+ { label: 'Output', value: path.join(outputDir, result.bundle.name), type: 'info' },
179
+ ]);
180
+ if (result.warnings.length > 0) {
181
+ if (options.verbose) {
182
+ logger_1.logger.subheader('Warnings:');
183
+ for (const warning of result.warnings) {
184
+ logger_1.logger.todo(warning);
185
+ }
186
+ }
187
+ else {
188
+ logger_1.logger.info('Run with --verbose to see all warnings');
189
+ }
190
+ logger_1.logger.blank();
191
+ }
192
+ // Display important notes
193
+ if (parsedPage.pageAttributes.renderAs === 'pdf') {
194
+ logger_1.logger.warn('Page renders as PDF - LWC cannot directly render PDFs');
195
+ }
196
+ // Next steps guidance
197
+ logger_1.logger.nextSteps([
198
+ `Review generated files in ${result.bundle.name}/`,
199
+ 'Check conversion-notes.md for manual action items',
200
+ 'Verify Apex @AuraEnabled methods are configured',
201
+ 'Test in a scratch org before deploying',
202
+ ]);
203
+ // Open folder if requested
204
+ if (options.open && !options.dryRun) {
205
+ const { openFolder } = await Promise.resolve().then(() => __importStar(require('../../utils/open-folder')));
206
+ logger_1.logger.info('Opening output folder...');
207
+ await openFolder(outputDir);
208
+ }
209
+ }
210
+ catch (error) {
211
+ logger_1.logger.error(error.message);
212
+ if (options.verbose && error.stack) {
213
+ console.error(error.stack);
214
+ }
215
+ process.exit(1);
216
+ }
217
+ }
218
+ //# sourceMappingURL=vf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vf.js","sourceRoot":"","sources":["../../../src/cli/commands/vf.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Interactive TUI for lwc-convert CLI
3
+ * Redesigned with @clack/prompts for a modern, polished experience
4
+ */
5
+ import { VfControllerReference } from '../utils/vf-controller-resolver';
6
+ export interface TuiAnswers {
7
+ conversionType: 'aura' | 'vf';
8
+ componentPath: string;
9
+ controllerPath?: string;
10
+ controllerPaths?: string[];
11
+ detectedControllers?: VfControllerReference[];
12
+ outputDir: string;
13
+ conversionMode: 'scaffolding' | 'full';
14
+ openFolder: boolean;
15
+ }
16
+ /**
17
+ * Run the interactive TUI
18
+ */
19
+ export declare function runInteractiveTui(): Promise<TuiAnswers | null>;
20
+ //# sourceMappingURL=interactive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../../src/cli/interactive.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EAEL,qBAAqB,EAEtB,MAAM,iCAAiC,CAAC;AAEzC,MAAM,WAAW,UAAU;IACzB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,mBAAmB,CAAC,EAAE,qBAAqB,EAAE,CAAC;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,aAAa,GAAG,MAAM,CAAC;IACvC,UAAU,EAAE,OAAO,CAAC;CACrB;AAoLD;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAqZpE"}