@contentful/experience-design-system-cli 2.11.4-dev-build-f3b5300.0 → 2.11.4-dev-build-601ef74.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contentful/experience-design-system-cli",
3
- "version": "2.11.4-dev-build-f3b5300.0",
3
+ "version": "2.11.4-dev-build-601ef74.0",
4
4
  "description": "Contentful Experiences design system import CLI",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -196,6 +196,15 @@ export function registerAnalyzeCommand(program) {
196
196
  db.close();
197
197
  const allWarnings = [...extraction.warnings, ...filterWarnings];
198
198
  const { rows: componentRows, totalErrors } = buildAnalyzeViewRows(filteredComponents, validatedComponents, allWarnings);
199
+ // Split warnings: per-component (those whose prefix matches a surviving component name)
200
+ // are rendered under that component in the TUI; global ones (retry summaries,
201
+ // non-authorable skips, anything else) are rendered at the top of the warnings panel
202
+ // so they don't disappear into the count.
203
+ const componentNames = new Set(componentRows.map((r) => r.name));
204
+ const globalWarnings = allWarnings.filter((w) => {
205
+ const prefix = w.split(':', 1)[0]?.trim();
206
+ return !prefix || !componentNames.has(prefix);
207
+ });
199
208
  const analyzeResult = {
200
209
  sourceDirectory,
201
210
  sessionId,
@@ -203,6 +212,7 @@ export function registerAnalyzeCommand(program) {
203
212
  components: componentRows,
204
213
  totalWarnings: allWarnings.length,
205
214
  totalErrors,
215
+ globalWarnings,
206
216
  };
207
217
  if (process.stdout.isTTY) {
208
218
  const { waitUntilExit } = render(createElement(AnalyzeView, {
@@ -202,12 +202,11 @@ async function retryComponentWithProject(component, ctx, project, warnings) {
202
202
  }
203
203
  if (!members || members.length === 0)
204
204
  return false;
205
- // Snippet-only resolution is still useful it confirms the slot surface
206
- // and lets us replace the original (which may have had fewer slot entries
207
- // because the cold AST-only pass missed members declared in heritage).
208
- // Apply the recovered slots, but DON'T drop `props-type-unresolved` from
209
- // reasons (the prop side genuinely has no resolvable members).
210
- const onlySnippets = members.every((m) => m.isSnippet);
205
+ // If the resolver returned a complete member list even when it's
206
+ // Snippet-only that's a real answer, not a partial one. Apply it and
207
+ // drop `props-type-unresolved`. Whether the resulting component still
208
+ // needs review will be decided by the standard heuristics
209
+ // (no-props-or-slots, infra-fetch, etc.) downstream.
211
210
  const { props, snippetSlots } = extractFromTypeMembersOnly(members);
212
211
  // Merge any template <slot> entries that survived the original pass — we
213
212
  // can't easily re-derive those without re-parsing the fragment, but the
@@ -220,23 +219,18 @@ async function retryComponentWithProject(component, ctx, project, warnings) {
220
219
  const slotNames = new Set(finalSlots.map((s) => s.name));
221
220
  component.props = props.filter((p) => !slotNames.has(p.name));
222
221
  component.slots = finalSlots;
223
- // Recompute confidence. When only Snippets came back, keep the
224
- // `props-type-unresolved` reason slot surface is real but the prop side
225
- // is still legitimately unresolved (the extends-from-node_modules failed).
226
- // When real props came back, drop the reason: full recovery.
227
- const remainingReasons = onlySnippets
228
- ? (component.reviewReasons ?? [])
229
- : (component.reviewReasons ?? []).filter((r) => r !== 'props-type-unresolved');
222
+ // Drop `props-type-unresolved` from reasons: the type DID resolve. Other
223
+ // heuristics (no-props-or-slots, infra-fetch, etc.) decide whether the
224
+ // recovered component still needs review.
225
+ const remainingReasons = (component.reviewReasons ?? []).filter((r) => r !== 'props-type-unresolved');
230
226
  const score = computeExtractionScore(component, {
231
227
  additionalIssueCount: remainingReasons.length,
232
228
  additionalReasons: remainingReasons,
233
229
  });
234
230
  component.extractionConfidence = score.confidence;
235
231
  component.reviewReasons = score.reasons;
236
- component.needsReview = deriveNeedsReview(score.confidence) || remainingReasons.includes('props-type-unresolved');
237
- // Remove the per-component unresolved-type warning. The `props-type-unresolved`
238
- // reason on the component itself still carries the signal for TUI drill-down;
239
- // the warnings array is replaced by the collapsed summary upstream.
232
+ component.needsReview = deriveNeedsReview(score.confidence);
233
+ // Remove the per-component unresolved-type warning recovery is complete.
240
234
  const componentName = component.name;
241
235
  const idx = warnings.findIndex((w) => w.startsWith(`${componentName}: declared Props type `) && /resolved to /.test(w));
242
236
  if (idx >= 0)
@@ -21,6 +21,15 @@ export type AnalyzeViewResult = {
21
21
  }>;
22
22
  totalWarnings: number;
23
23
  totalErrors: number;
24
+ /**
25
+ * Top-level warnings not associated with any surviving component:
26
+ * - retry-pass summary lines
27
+ * - "Skipped non-authorable component: …" — the component was filtered out and has no row to attach to
28
+ * - any other extractor warning whose prefix doesn't match a component in `components`
29
+ * Always rendered at the top of the Warnings panel so they're visible in the TUI.
30
+ * Optional for backwards compatibility with older fixtures; treated as `[]` when absent.
31
+ */
32
+ globalWarnings?: string[];
24
33
  };
25
34
  type AnalyzeViewProps = {
26
35
  result: AnalyzeViewResult;
@@ -57,8 +57,8 @@ export function AnalyzeView({ result, onExit }) {
57
57
  }), showScrollDown && _jsx(Text, { dimColor: true, children: " \u25BC scroll down" }), result.totalErrors > 0 && (_jsxs(_Fragment, { children: [_jsx(Text, { children: " " }), _jsx(Text, { dimColor: true, children: '─'.repeat(70) }), _jsx(Text, { bold: true, color: "red", children: 'Errors (' + result.totalErrors + ')' }), _jsx(Text, { dimColor: true, children: '─'.repeat(70) }), _jsx(Text, { children: " " }), result.components
58
58
  .filter((c) => c.errors.length > 0)
59
59
  .flatMap((c) => c.errors.map((e) => ({ component: c.name, error: e })))
60
- .map((e, i) => (_jsx(Text, { color: "red", children: ' ✗ ' + e.component + ': ' + e.error }, i)))] })), result.totalWarnings > 0 && (_jsxs(_Fragment, { children: [_jsx(Text, { children: " " }), _jsx(Text, { dimColor: true, children: '─'.repeat(70) }), _jsx(Text, { bold: true, color: "yellow", children: 'Warnings (' + result.totalWarnings + ')' }), _jsx(Text, { dimColor: true, children: '─'.repeat(70) }), _jsx(Text, { children: " " }), result.components
60
+ .map((e, i) => (_jsx(Text, { color: "red", children: ' ✗ ' + e.component + ': ' + e.error }, i)))] })), result.totalWarnings > 0 && (_jsxs(_Fragment, { children: [_jsx(Text, { children: " " }), _jsx(Text, { dimColor: true, children: '─'.repeat(70) }), _jsx(Text, { bold: true, color: "yellow", children: 'Warnings (' + result.totalWarnings + ')' }), _jsx(Text, { dimColor: true, children: '─'.repeat(70) }), _jsx(Text, { children: " " }), (result.globalWarnings ?? []).map((w, i) => (_jsx(Text, { color: "yellow", children: ' ⚠ ' + w }, `g${i}`))), result.components
61
61
  .filter((c) => c.warnings.length > 0)
62
62
  .flatMap((c) => c.warnings.map((w) => ({ component: c.name, warning: w })))
63
- .map((w, i) => (_jsx(Text, { color: "yellow", children: ' ⚠ ' + (w.warning.startsWith(w.component + ': ') ? w.warning : w.component + ': ' + w.warning) }, i)))] })), _jsx(Text, { children: " " }), _jsx(Text, { dimColor: true, children: 'Run: analyze select --session ' + result.sessionId }), _jsx(Text, { children: " " })] }), _jsx(Box, { borderStyle: "single", paddingX: 1, children: _jsx(Text, { dimColor: true, children: "Press Enter or q to exit" }) })] }));
63
+ .map((w, i) => (_jsx(Text, { color: "yellow", children: ' ⚠ ' + (w.warning.startsWith(w.component + ': ') ? w.warning : w.component + ': ' + w.warning) }, `c${i}`)))] })), _jsx(Text, { children: " " }), _jsx(Text, { dimColor: true, children: 'Run: analyze select --session ' + result.sessionId }), _jsx(Text, { children: " " })] }), _jsx(Box, { borderStyle: "single", paddingX: 1, children: _jsx(Text, { dimColor: true, children: "Press Enter or q to exit" }) })] }));
64
64
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contentful/experience-design-system-cli",
3
- "version": "2.11.4-dev-build-f3b5300.0",
3
+ "version": "2.11.4-dev-build-601ef74.0",
4
4
  "description": "Contentful Experiences design system import CLI",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -37,7 +37,7 @@
37
37
  "svelte": "^5.56.4",
38
38
  "ts-morph": "^27.0.2",
39
39
  "typescript": "^5.9.3",
40
- "@contentful/experience-design-system-types": "2.11.4-dev-build-f3b5300.0"
40
+ "@contentful/experience-design-system-types": "2.11.4-dev-build-601ef74.0"
41
41
  },
42
42
  "devDependencies": {
43
43
  "@tsconfig/node24": "^24.0.3",