@contentful/experience-design-system-cli 2.2.1

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 (165) hide show
  1. package/README.md +532 -0
  2. package/bin/cli.js +58 -0
  3. package/dist/package.json +56 -0
  4. package/dist/src/analyze/command.d.ts +3 -0
  5. package/dist/src/analyze/command.js +175 -0
  6. package/dist/src/analyze/extract/astro.d.ts +5 -0
  7. package/dist/src/analyze/extract/astro.js +280 -0
  8. package/dist/src/analyze/extract/pipeline.d.ts +6 -0
  9. package/dist/src/analyze/extract/pipeline.js +298 -0
  10. package/dist/src/analyze/extract/react.d.ts +2 -0
  11. package/dist/src/analyze/extract/react.js +1949 -0
  12. package/dist/src/analyze/extract/slot-detection.d.ts +35 -0
  13. package/dist/src/analyze/extract/slot-detection.js +101 -0
  14. package/dist/src/analyze/extract/stencil.d.ts +2 -0
  15. package/dist/src/analyze/extract/stencil.js +293 -0
  16. package/dist/src/analyze/extract/tsx-shared.d.ts +8 -0
  17. package/dist/src/analyze/extract/tsx-shared.js +263 -0
  18. package/dist/src/analyze/extract/vue-tsx.d.ts +2 -0
  19. package/dist/src/analyze/extract/vue-tsx.js +498 -0
  20. package/dist/src/analyze/extract/vue.d.ts +5 -0
  21. package/dist/src/analyze/extract/vue.js +647 -0
  22. package/dist/src/analyze/extract/web-components.d.ts +2 -0
  23. package/dist/src/analyze/extract/web-components.js +866 -0
  24. package/dist/src/analyze/pre-classify.d.ts +17 -0
  25. package/dist/src/analyze/pre-classify.js +144 -0
  26. package/dist/src/analyze/select/command.d.ts +2 -0
  27. package/dist/src/analyze/select/command.js +256 -0
  28. package/dist/src/analyze/select/index.d.ts +6 -0
  29. package/dist/src/analyze/select/index.js +5 -0
  30. package/dist/src/analyze/select/parser.d.ts +6 -0
  31. package/dist/src/analyze/select/parser.js +53 -0
  32. package/dist/src/analyze/select/persistence.d.ts +9 -0
  33. package/dist/src/analyze/select/persistence.js +42 -0
  34. package/dist/src/analyze/select/stdout.d.ts +7 -0
  35. package/dist/src/analyze/select/stdout.js +3 -0
  36. package/dist/src/analyze/select/tui/App.d.ts +8 -0
  37. package/dist/src/analyze/select/tui/App.js +491 -0
  38. package/dist/src/analyze/select/tui/components/ComponentDetail.d.ts +20 -0
  39. package/dist/src/analyze/select/tui/components/ComponentDetail.js +43 -0
  40. package/dist/src/analyze/select/tui/components/FieldEditor.d.ts +11 -0
  41. package/dist/src/analyze/select/tui/components/FieldEditor.js +531 -0
  42. package/dist/src/analyze/select/tui/components/FinalizeDialog.d.ts +10 -0
  43. package/dist/src/analyze/select/tui/components/FinalizeDialog.js +15 -0
  44. package/dist/src/analyze/select/tui/components/HelpOverlay.d.ts +7 -0
  45. package/dist/src/analyze/select/tui/components/HelpOverlay.js +11 -0
  46. package/dist/src/analyze/select/tui/components/JsonEditor.d.ts +11 -0
  47. package/dist/src/analyze/select/tui/components/JsonEditor.js +154 -0
  48. package/dist/src/analyze/select/tui/components/JsonPanel.d.ts +11 -0
  49. package/dist/src/analyze/select/tui/components/JsonPanel.js +62 -0
  50. package/dist/src/analyze/select/tui/components/PreviewSummaryBar.d.ts +8 -0
  51. package/dist/src/analyze/select/tui/components/PreviewSummaryBar.js +29 -0
  52. package/dist/src/analyze/select/tui/components/QuitDialog.d.ts +8 -0
  53. package/dist/src/analyze/select/tui/components/QuitDialog.js +14 -0
  54. package/dist/src/analyze/select/tui/components/Sidebar.d.ts +15 -0
  55. package/dist/src/analyze/select/tui/components/Sidebar.js +48 -0
  56. package/dist/src/analyze/select/tui/components/SourcePanel.d.ts +11 -0
  57. package/dist/src/analyze/select/tui/components/SourcePanel.js +52 -0
  58. package/dist/src/analyze/select/tui/components/StatusBar.d.ts +11 -0
  59. package/dist/src/analyze/select/tui/components/StatusBar.js +6 -0
  60. package/dist/src/analyze/select/tui/components/TopBar.d.ts +10 -0
  61. package/dist/src/analyze/select/tui/components/TopBar.js +5 -0
  62. package/dist/src/analyze/select/tui/hooks/useImmediateInput.d.ts +24 -0
  63. package/dist/src/analyze/select/tui/hooks/useImmediateInput.js +68 -0
  64. package/dist/src/analyze/select/tui/hooks/useKeymap.d.ts +24 -0
  65. package/dist/src/analyze/select/tui/hooks/useKeymap.js +67 -0
  66. package/dist/src/analyze/select/tui/hooks/useSession.d.ts +19 -0
  67. package/dist/src/analyze/select/tui/hooks/useSession.js +52 -0
  68. package/dist/src/analyze/select/tui/hooks/useUndo.d.ts +8 -0
  69. package/dist/src/analyze/select/tui/hooks/useUndo.js +26 -0
  70. package/dist/src/analyze/select/types.d.ts +46 -0
  71. package/dist/src/analyze/select/types.js +20 -0
  72. package/dist/src/analyze/select-agent/command.d.ts +2 -0
  73. package/dist/src/analyze/select-agent/command.js +208 -0
  74. package/dist/src/analyze/tui/AnalyzeView.d.ts +24 -0
  75. package/dist/src/analyze/tui/AnalyzeView.js +38 -0
  76. package/dist/src/apply/api-client.d.ts +35 -0
  77. package/dist/src/apply/api-client.js +143 -0
  78. package/dist/src/apply/command.d.ts +6 -0
  79. package/dist/src/apply/command.js +787 -0
  80. package/dist/src/apply/manifest.d.ts +1 -0
  81. package/dist/src/apply/manifest.js +1 -0
  82. package/dist/src/apply/tui/SelectView.d.ts +18 -0
  83. package/dist/src/apply/tui/SelectView.js +34 -0
  84. package/dist/src/apply/tui/ServerApplyView.d.ts +32 -0
  85. package/dist/src/apply/tui/ServerApplyView.js +42 -0
  86. package/dist/src/apply/tui/ServerPreviewView.d.ts +9 -0
  87. package/dist/src/apply/tui/ServerPreviewView.js +21 -0
  88. package/dist/src/credentials-store.d.ts +8 -0
  89. package/dist/src/credentials-store.js +30 -0
  90. package/dist/src/generate/agent-runner.d.ts +86 -0
  91. package/dist/src/generate/agent-runner.js +314 -0
  92. package/dist/src/generate/command.d.ts +2 -0
  93. package/dist/src/generate/command.js +545 -0
  94. package/dist/src/generate/edit/command.d.ts +2 -0
  95. package/dist/src/generate/edit/command.js +126 -0
  96. package/dist/src/generate/prompt-builder.d.ts +18 -0
  97. package/dist/src/generate/prompt-builder.js +202 -0
  98. package/dist/src/generate/tui/GenerateView.d.ts +12 -0
  99. package/dist/src/generate/tui/GenerateView.js +10 -0
  100. package/dist/src/import/command.d.ts +2 -0
  101. package/dist/src/import/command.js +96 -0
  102. package/dist/src/import/orchestrator.d.ts +37 -0
  103. package/dist/src/import/orchestrator.js +374 -0
  104. package/dist/src/import/path-utils.d.ts +15 -0
  105. package/dist/src/import/path-utils.js +30 -0
  106. package/dist/src/import/tui/WizardApp.d.ts +10 -0
  107. package/dist/src/import/tui/WizardApp.js +906 -0
  108. package/dist/src/import/tui/steps/CredentialsStep.d.ts +15 -0
  109. package/dist/src/import/tui/steps/CredentialsStep.js +79 -0
  110. package/dist/src/import/tui/steps/DoneStep.d.ts +20 -0
  111. package/dist/src/import/tui/steps/DoneStep.js +17 -0
  112. package/dist/src/import/tui/steps/ErrorStep.d.ts +8 -0
  113. package/dist/src/import/tui/steps/ErrorStep.js +11 -0
  114. package/dist/src/import/tui/steps/GateStep.d.ts +14 -0
  115. package/dist/src/import/tui/steps/GateStep.js +20 -0
  116. package/dist/src/import/tui/steps/GenerateReviewStep.d.ts +8 -0
  117. package/dist/src/import/tui/steps/GenerateReviewStep.js +208 -0
  118. package/dist/src/import/tui/steps/PathValidationStep.d.ts +10 -0
  119. package/dist/src/import/tui/steps/PathValidationStep.js +151 -0
  120. package/dist/src/import/tui/steps/PreviewStep.d.ts +21 -0
  121. package/dist/src/import/tui/steps/PreviewStep.js +36 -0
  122. package/dist/src/import/tui/steps/RunningStep.d.ts +10 -0
  123. package/dist/src/import/tui/steps/RunningStep.js +20 -0
  124. package/dist/src/import/tui/steps/TokenInputStep.d.ts +8 -0
  125. package/dist/src/import/tui/steps/TokenInputStep.js +70 -0
  126. package/dist/src/import/tui/steps/WelcomeStep.d.ts +7 -0
  127. package/dist/src/import/tui/steps/WelcomeStep.js +33 -0
  128. package/dist/src/import/tui/steps/WizardPreviewStep.d.ts +15 -0
  129. package/dist/src/import/tui/steps/WizardPreviewStep.js +121 -0
  130. package/dist/src/import/tui/steps/preview-diff.d.ts +10 -0
  131. package/dist/src/import/tui/steps/preview-diff.js +132 -0
  132. package/dist/src/index.d.ts +1 -0
  133. package/dist/src/index.js +2 -0
  134. package/dist/src/output/format.d.ts +23 -0
  135. package/dist/src/output/format.js +110 -0
  136. package/dist/src/print/command.d.ts +2 -0
  137. package/dist/src/print/command.js +199 -0
  138. package/dist/src/print/validate/tui/ValidateView.d.ts +15 -0
  139. package/dist/src/print/validate/tui/ValidateView.js +37 -0
  140. package/dist/src/print/validate/validators/cdf-validator.d.ts +2 -0
  141. package/dist/src/print/validate/validators/cdf-validator.js +104 -0
  142. package/dist/src/print/validate/validators/dtcg-validator.d.ts +2 -0
  143. package/dist/src/print/validate/validators/dtcg-validator.js +110 -0
  144. package/dist/src/print/validate/validators/format-errors.d.ts +12 -0
  145. package/dist/src/print/validate/validators/format-errors.js +18 -0
  146. package/dist/src/program.d.ts +2 -0
  147. package/dist/src/program.js +25 -0
  148. package/dist/src/session/command.d.ts +2 -0
  149. package/dist/src/session/command.js +261 -0
  150. package/dist/src/session/db.d.ts +111 -0
  151. package/dist/src/session/db.js +1114 -0
  152. package/dist/src/session/migration.d.ts +4 -0
  153. package/dist/src/session/migration.js +117 -0
  154. package/dist/src/session/session-id.d.ts +1 -0
  155. package/dist/src/session/session-id.js +212 -0
  156. package/dist/src/session/stats.d.ts +27 -0
  157. package/dist/src/session/stats.js +89 -0
  158. package/dist/src/setup/command.d.ts +2 -0
  159. package/dist/src/setup/command.js +765 -0
  160. package/dist/src/types.d.ts +48 -0
  161. package/dist/src/types.js +1 -0
  162. package/package.json +55 -0
  163. package/skills/generate-components.md +361 -0
  164. package/skills/generate-tokens.md +194 -0
  165. package/skills/select-components.md +180 -0
@@ -0,0 +1,298 @@
1
+ import { extractStencilComponents } from './stencil.js';
2
+ import { extractReactComponents } from './react.js';
3
+ import { extractVueTsxComponents } from './vue-tsx.js';
4
+ import { extractVueComponents } from './vue.js';
5
+ import { extractAstroComponents } from './astro.js';
6
+ import { extractWebComponentDefinitions } from './web-components.js';
7
+ const extractors = [
8
+ {
9
+ name: 'stencil',
10
+ fileFilter: (f) => /\.[jt]sx$/.test(f),
11
+ extract: extractStencilComponents,
12
+ },
13
+ {
14
+ name: 'react',
15
+ fileFilter: (f) => /\.[jt]sx?$/.test(f) && !f.endsWith('.d.ts'),
16
+ extract: extractReactComponents,
17
+ },
18
+ {
19
+ name: 'vue-tsx',
20
+ fileFilter: (f) => /\.[jt]sx?$/.test(f) && !f.endsWith('.d.ts'),
21
+ extract: extractVueTsxComponents,
22
+ },
23
+ {
24
+ name: 'vue',
25
+ fileFilter: (f) => f.endsWith('.vue'),
26
+ extract: extractVueComponents,
27
+ },
28
+ {
29
+ name: 'astro',
30
+ fileFilter: (f) => f.endsWith('.astro'),
31
+ extract: extractAstroComponents,
32
+ },
33
+ {
34
+ name: 'web-components',
35
+ fileFilter: (f) => /\.[jt]s$/.test(f) && !/\.[jt]sx$/.test(f) && !f.endsWith('.d.ts'),
36
+ extract: extractWebComponentDefinitions,
37
+ },
38
+ ];
39
+ function getPathPreferenceScore(filePath) {
40
+ const normalized = filePath.replace(/\\/g, '/');
41
+ const segments = normalized.split('/').filter(Boolean);
42
+ const filename = segments.at(-1) ?? '';
43
+ const basename = filename.replace(/\.[^.]+$/, '');
44
+ let score = 0;
45
+ if (/^index\.[jt]sx?$/.test(filename))
46
+ score += 100;
47
+ if (basename && segments.at(-2) === basename)
48
+ score -= 10;
49
+ const componentsSegmentCount = segments.filter((segment) => segment === 'components').length;
50
+ score -= componentsSegmentCount * 8;
51
+ score -= segments.length;
52
+ return score;
53
+ }
54
+ function getPackageRootInfo(segments) {
55
+ for (let index = 0; index < segments.length; index += 1) {
56
+ const segment = segments[index];
57
+ if ((segment === '.packages' || segment === 'packages') && segments[index + 1]) {
58
+ return {
59
+ rootSegments: segments.slice(0, index + 2),
60
+ relativeSegments: segments.slice(index + 2),
61
+ };
62
+ }
63
+ }
64
+ const srcIndex = segments.lastIndexOf('src');
65
+ if (srcIndex >= 0) {
66
+ return {
67
+ rootSegments: segments.slice(0, srcIndex),
68
+ relativeSegments: segments.slice(srcIndex),
69
+ };
70
+ }
71
+ return null;
72
+ }
73
+ function getScopeInfo(filePath) {
74
+ const normalized = filePath.replace(/\\/g, '/');
75
+ const segments = normalized.split('/').filter(Boolean);
76
+ const rootInfo = getPackageRootInfo(segments);
77
+ if (!rootInfo) {
78
+ return null;
79
+ }
80
+ const { rootSegments, relativeSegments } = rootInfo;
81
+ return {
82
+ rootKey: rootSegments.join('/'),
83
+ relativeSegments,
84
+ };
85
+ }
86
+ function getTopLevelFamilyName(relativeSegments) {
87
+ const [first, second, third] = relativeSegments;
88
+ if (relativeSegments.length === 1 && first) {
89
+ return first.replace(/\.[^.]+$/, '');
90
+ }
91
+ if (first === 'src' && second === 'components' && third) {
92
+ const fileSegment = relativeSegments[3];
93
+ if (fileSegment &&
94
+ (fileSegment === `${third}.tsx` ||
95
+ fileSegment === `${third}.ts` ||
96
+ fileSegment === 'index.tsx' ||
97
+ fileSegment === 'index.ts')) {
98
+ return third;
99
+ }
100
+ return null;
101
+ }
102
+ if (first === 'src' && second) {
103
+ const fileSegment = relativeSegments[2];
104
+ if (fileSegment &&
105
+ (fileSegment === `${second}.vue` ||
106
+ fileSegment === `${second}.tsx` ||
107
+ fileSegment === `${second}.ts` ||
108
+ fileSegment === 'index.tsx' ||
109
+ fileSegment === 'index.ts' ||
110
+ fileSegment === 'index.vue')) {
111
+ return second;
112
+ }
113
+ return null;
114
+ }
115
+ if (first) {
116
+ const fileSegment = relativeSegments[1];
117
+ if (fileSegment === `${first}.tsx` ||
118
+ fileSegment === `${first}.ts` ||
119
+ fileSegment === `${first}.vue` ||
120
+ fileSegment === 'index.tsx' ||
121
+ fileSegment === 'index.ts' ||
122
+ fileSegment === 'index.vue') {
123
+ return first;
124
+ }
125
+ }
126
+ return null;
127
+ }
128
+ function isWithinTopLevelFamily(relativeSegments, componentName) {
129
+ const [first, second, third] = relativeSegments;
130
+ const componentFilenames = new Set([
131
+ `${componentName}.tsx`,
132
+ `${componentName}.ts`,
133
+ `${componentName}.vue`,
134
+ 'index.tsx',
135
+ 'index.ts',
136
+ 'index.vue',
137
+ ]);
138
+ if (relativeSegments.length === 1) {
139
+ return new Set([`${componentName}.tsx`, `${componentName}.ts`, `${componentName}.vue`]).has(first);
140
+ }
141
+ if (first === 'src' && second === 'components' && third === componentName) {
142
+ return true;
143
+ }
144
+ if (first === 'components' && second === componentName) {
145
+ return true;
146
+ }
147
+ if (first === 'src' && second === componentName) {
148
+ return true;
149
+ }
150
+ if (first === componentName) {
151
+ return componentFilenames.has(second) || relativeSegments.length > 2;
152
+ }
153
+ return false;
154
+ }
155
+ function getFamilyScopeKey(filePath, componentName, topLevelFamiliesByRoot) {
156
+ const normalized = filePath.replace(/\\/g, '/');
157
+ const scopeInfo = getScopeInfo(filePath);
158
+ if (!scopeInfo) {
159
+ return normalized;
160
+ }
161
+ const { rootKey, relativeSegments } = scopeInfo;
162
+ const topLevelFamilies = topLevelFamiliesByRoot.get(rootKey);
163
+ if (topLevelFamilies?.has(componentName) && isWithinTopLevelFamily(relativeSegments, componentName)) {
164
+ return `${rootKey}::${componentName}`;
165
+ }
166
+ const [first, second, third] = relativeSegments;
167
+ if (first === 'src' && second === 'components' && third) {
168
+ return `${rootKey}/src/components/${third}`;
169
+ }
170
+ if (first === 'components' && second) {
171
+ return `${rootKey}/components/${second}`;
172
+ }
173
+ if (first === 'src' && second && relativeSegments.length > 2) {
174
+ return `${rootKey}/src/${second}`;
175
+ }
176
+ if (first && relativeSegments.length > 1) {
177
+ return `${rootKey}/${first}`;
178
+ }
179
+ return rootKey;
180
+ }
181
+ function choosePreferredComponent(existing, candidate) {
182
+ const existingScore = getPathPreferenceScore(existing.source);
183
+ const candidateScore = getPathPreferenceScore(candidate.source);
184
+ if (candidateScore > existingScore) {
185
+ return {
186
+ winner: candidate,
187
+ loser: existing,
188
+ reason: `preferred ${candidate.source} over ${existing.source} based on path heuristics`,
189
+ };
190
+ }
191
+ if (candidateScore < existingScore) {
192
+ return {
193
+ winner: existing,
194
+ loser: candidate,
195
+ reason: `kept ${existing.source} over ${candidate.source} based on path heuristics`,
196
+ };
197
+ }
198
+ if (candidate.source.length < existing.source.length) {
199
+ return {
200
+ winner: candidate,
201
+ loser: existing,
202
+ reason: `preferred shorter path ${candidate.source} over ${existing.source}`,
203
+ };
204
+ }
205
+ return {
206
+ winner: existing,
207
+ loser: candidate,
208
+ reason: `kept ${existing.source} over ${candidate.source} by stable first-seen order`,
209
+ };
210
+ }
211
+ export async function extractComponents(filePaths, onProgress) {
212
+ const filesByExtractor = new Map();
213
+ for (const extractor of extractors) {
214
+ filesByExtractor.set(extractor, []);
215
+ }
216
+ for (const filePath of filePaths) {
217
+ for (const extractor of extractors) {
218
+ if (extractor.fileFilter(filePath)) {
219
+ filesByExtractor.get(extractor).push(filePath);
220
+ }
221
+ }
222
+ }
223
+ const perExtractorFiles = new Map();
224
+ const perExtractorComponents = new Map();
225
+ let totalFilesProcessed = 0;
226
+ let totalComponentsFound = 0;
227
+ const results = await Promise.all(extractors.map(async (extractor) => {
228
+ const files = filesByExtractor.get(extractor);
229
+ if (files.length === 0)
230
+ return { components: [], warnings: [] };
231
+ perExtractorFiles.set(extractor, 0);
232
+ perExtractorComponents.set(extractor, 0);
233
+ const result = await extractor.extract(files, (p) => {
234
+ const prevFiles = perExtractorFiles.get(extractor) ?? 0;
235
+ const prevComponents = perExtractorComponents.get(extractor) ?? 0;
236
+ totalFilesProcessed += p.filesProcessed - prevFiles;
237
+ totalComponentsFound += p.componentsFound - prevComponents;
238
+ perExtractorFiles.set(extractor, p.filesProcessed);
239
+ perExtractorComponents.set(extractor, p.componentsFound);
240
+ onProgress?.({ filesProcessed: totalFilesProcessed, componentsFound: totalComponentsFound });
241
+ });
242
+ return result;
243
+ }));
244
+ const allWarnings = [];
245
+ const componentsByKey = new Map();
246
+ const keysByName = new Map();
247
+ const topLevelFamiliesByRoot = new Map();
248
+ for (const result of results) {
249
+ for (const component of result.components) {
250
+ const scopeInfo = getScopeInfo(component.source);
251
+ if (!scopeInfo)
252
+ continue;
253
+ const familyName = getTopLevelFamilyName(scopeInfo.relativeSegments);
254
+ if (!familyName)
255
+ continue;
256
+ const existingFamilies = topLevelFamiliesByRoot.get(scopeInfo.rootKey) ?? new Set();
257
+ existingFamilies.add(familyName);
258
+ topLevelFamiliesByRoot.set(scopeInfo.rootKey, existingFamilies);
259
+ }
260
+ }
261
+ for (const result of results) {
262
+ allWarnings.push(...result.warnings);
263
+ for (const component of result.components) {
264
+ const scopeKey = getFamilyScopeKey(component.source, component.name, topLevelFamiliesByRoot);
265
+ const identityKey = `${component.name}::${scopeKey}`;
266
+ const existing = componentsByKey.get(identityKey);
267
+ if (existing) {
268
+ const selected = choosePreferredComponent(existing, component);
269
+ allWarnings.push(`Duplicate component "${component.name}" found in ${component.source} (already seen in ${existing.source}); ${selected.reason}`);
270
+ componentsByKey.set(identityKey, selected.winner);
271
+ continue;
272
+ }
273
+ const existingKeys = keysByName.get(component.name) ?? [];
274
+ const crossPackageKey = existingKeys.find((key) => key !== identityKey);
275
+ if (crossPackageKey) {
276
+ const crossPackageComponent = componentsByKey.get(crossPackageKey);
277
+ if (crossPackageComponent) {
278
+ allWarnings.push(`Component name collision "${component.name}" found in ${component.source} (also seen in ${crossPackageComponent.source})`);
279
+ }
280
+ }
281
+ componentsByKey.set(identityKey, component);
282
+ keysByName.set(component.name, [...existingKeys, identityKey]);
283
+ }
284
+ }
285
+ const allComponents = [...componentsByKey.values()];
286
+ const filteredComponents = [];
287
+ for (const component of allComponents) {
288
+ if (/^use[A-Z]/.test(component.name)) {
289
+ allWarnings.push(`Skipped hook: ${component.name} (hooks are not renderable components)`);
290
+ continue;
291
+ }
292
+ filteredComponents.push(component);
293
+ }
294
+ return {
295
+ components: filteredComponents.sort((a, b) => a.name.localeCompare(b.name)),
296
+ warnings: allWarnings,
297
+ };
298
+ }
@@ -0,0 +1,2 @@
1
+ import type { ComponentExtractionResult } from '../../types.js';
2
+ export declare function extractReactComponents(filePaths: string[]): Promise<ComponentExtractionResult>;