@teambit/component-compare 1.0.1166 → 1.0.1168

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.
@@ -21,6 +21,16 @@
21
21
  justify-content: center;
22
22
  }
23
23
 
24
+ .layout {
25
+ display: flex;
26
+ flex: 1 1 auto;
27
+ min-width: 0;
28
+ min-height: 0;
29
+ overflow: hidden;
30
+ container-type: inline-size;
31
+ container-name: component-compare-layout;
32
+ }
33
+
24
34
  @keyframes compareSkeletonShimmer {
25
35
  0% {
26
36
  background-position: 200% 0;
@@ -1,5 +1,5 @@
1
1
  import type { HTMLAttributes } from 'react';
2
- import React, { useContext, useEffect, useMemo, useState } from 'react';
2
+ import React, { useContext, useEffect, useMemo, useRef, useState } from 'react';
3
3
  import classnames from 'classnames';
4
4
  import { useSearchParams } from 'react-router-dom';
5
5
  import { ComponentContext, ComponentDescriptorContext, useComponent } from '@teambit/component';
@@ -16,6 +16,7 @@ import { groupByVersion } from '@teambit/component.ui.component-compare.utils.gr
16
16
  import type { LegacyComponentLog } from '@teambit/legacy-component-log';
17
17
  import {
18
18
  CompareDataProvider,
19
+ CompareSidebar,
19
20
  CompareToolbar,
20
21
  CompareToolbarActions,
21
22
  DiffModeProvider,
@@ -24,8 +25,14 @@ import {
24
25
  InlineComponentCompare,
25
26
  RegistryFeeder,
26
27
  useCompareData,
28
+ useFileRegistry,
29
+ } from '@teambit/component.ui.component-compare.component-compare';
30
+ import type {
31
+ CompareSidebarGroup,
32
+ CompareViewMode,
33
+ ComponentComparePair,
34
+ FileInfo,
27
35
  } from '@teambit/component.ui.component-compare.component-compare';
28
- import type { CompareViewMode, ComponentComparePair } from '@teambit/component.ui.component-compare.component-compare';
29
36
  import { computeDepsDiff } from '@teambit/dependencies.ui.deps-diff-table';
30
37
  import { useApiDiff } from '@teambit/semantics.ui.api-diff-view';
31
38
 
@@ -47,6 +54,12 @@ export type ComponentComparePageProps = {
47
54
  type ViewMode = 'code' | 'preview' | 'docs' | 'dependencies' | 'tests' | 'config' | 'api';
48
55
  type DiffMode = 'split' | 'unified';
49
56
 
57
+ function apiChangeStatusToFileStatus(status: string): string {
58
+ if (status === 'ADDED') return 'NEW';
59
+ if (status === 'REMOVED') return 'DELETED';
60
+ return 'MODIFIED';
61
+ }
62
+
50
63
  // The single-component compare offers the same view modes as lane-compare. Which ones actually
51
64
  // appear is driven by real per-view content counts (see `CompareView`) — mirroring how the cloud
52
65
  // changes view derives available views from each component's change types, so a user never lands
@@ -293,6 +306,10 @@ function CompareView({
293
306
  const [viewMode, setViewModeState] = useState<ViewMode>((searchParams.get('view') as ViewMode) || 'code');
294
307
  const [diffMode, setDiffModeState] = useState<DiffMode>((searchParams.get('diffMode') as DiffMode) || 'split');
295
308
  const [showAllDeps, setShowAllDeps] = useState(false);
309
+ const [selectedId, setSelectedId] = useState<string>();
310
+ const [selectedFile, setSelectedFile] = useState<string>();
311
+ const diffPaneRef = useRef<HTMLDivElement>(null);
312
+ const pendingScrollCleanupRef = useRef<(() => void) | undefined>(undefined);
296
313
 
297
314
  const syncUrl = React.useCallback((key: string, value: string | undefined) => {
298
315
  const url = new URL(window.location.href);
@@ -318,6 +335,7 @@ function CompareView({
318
335
 
319
336
  const componentCompare = useComponentCompare();
320
337
  const compareData = useCompareData();
338
+ const fileRegistry = useFileRegistry();
321
339
  const data = compareData?.compareDataFor(compareId);
322
340
  const dataLoading = compareData?.loading ?? false;
323
341
 
@@ -404,6 +422,52 @@ function CompareView({
404
422
  return acc;
405
423
  }, [loading, registeredModeIds, isNew, data, componentCompare, apiTabHasContent]);
406
424
 
425
+ const componentId = compareId.split('@')[0];
426
+ const fileRegistryVersion = fileRegistry?.getVersion();
427
+ const sidebarFiles = useMemo<FileInfo[] | undefined>(() => {
428
+ // The registry object is stable; its monotonic version invalidates this view-derived projection.
429
+ void fileRegistryVersion;
430
+ if (viewMode === 'code') return fileRegistry?.getFiles(componentId);
431
+ if (viewMode === 'config') return fileRegistry?.getAspectFiles(componentId);
432
+ if (viewMode === 'tests') {
433
+ return (data?.tests || [])
434
+ .filter((file) => file.status && file.status !== 'UNCHANGED')
435
+ .map((file) => ({ name: file.fileName, status: file.status }));
436
+ }
437
+ if (viewMode === 'api') {
438
+ return (apiDiffResult?.publicChanges || []).map((change) => ({
439
+ name: change.exportName,
440
+ status: apiChangeStatusToFileStatus(change.status),
441
+ }));
442
+ }
443
+ return undefined;
444
+ }, [viewMode, fileRegistry, fileRegistryVersion, componentId, data?.tests, apiDiffResult]);
445
+
446
+ const sidebarGroups = useMemo<CompareSidebarGroup[]>(
447
+ () => [
448
+ {
449
+ key: 'component',
450
+ label: 'Component',
451
+ items: [{ id: componentId, name, files: sidebarFiles }],
452
+ },
453
+ ],
454
+ [componentId, name, sidebarFiles]
455
+ );
456
+
457
+ useEffect(() => {
458
+ pendingScrollCleanupRef.current?.();
459
+ pendingScrollCleanupRef.current = undefined;
460
+ setSelectedId(undefined);
461
+ setSelectedFile(undefined);
462
+ }, [viewMode]);
463
+
464
+ useEffect(
465
+ () => () => {
466
+ pendingScrollCleanupRef.current?.();
467
+ },
468
+ []
469
+ );
470
+
407
471
  // If the active view has no content, fall back to the first view that does.
408
472
  useEffect(() => {
409
473
  if (loading) return;
@@ -442,33 +506,117 @@ function CompareView({
442
506
  loading={loading}
443
507
  />
444
508
 
445
- <div className={styles.diffPane} data-view-mode={viewMode}>
446
- <InlineComponentCompare
447
- name={name}
448
- baseId={baseId}
449
- compareId={compareId}
450
- baseVersion={baseVersionShort}
451
- compareVersion={compareVersionShort}
452
- allTabs={resolvedTabs}
453
- host={host}
454
- // Hand the inner context our already-resolved pair: base = the scope's published snap,
455
- // compare = the live workspace component (with local changes). Without this the inner
456
- // context re-fetches by id and, in local-changes mode (compareId === baseId), would load
457
- // the same snap for both sides — making the deps/config/preview tabs show base vs base.
458
- baseOverride={componentCompare?.base as { model?: any; descriptor?: any } | undefined}
459
- compareOverride={componentCompare?.compare as { model?: any; descriptor?: any } | undefined}
460
- >
461
- {/* The API view isn't an inline tab — render it inside the inline context (so it sees the
462
- resolved base/compare pair) only while it's the active view, so its diff query fires
463
- on-demand. CSS hides the inline `[data-tab-id]` panels when `data-view-mode='api'`. */}
464
- {viewMode === 'api' ? apiTab : null}
465
- </InlineComponentCompare>
509
+ <div className={styles.layout}>
510
+ {viewMode !== 'dependencies' && (
511
+ <CompareSidebar
512
+ groups={sidebarGroups}
513
+ selectedId={selectedId}
514
+ selectedFile={selectedFile}
515
+ defaultExpandFiles={
516
+ viewMode === 'code' || viewMode === 'config' || viewMode === 'tests' || viewMode === 'api'
517
+ }
518
+ onSelect={(id, fileName) => {
519
+ const nextId = id || undefined;
520
+ setSelectedId(nextId);
521
+ setSelectedFile(fileName);
522
+ pendingScrollCleanupRef.current?.();
523
+ pendingScrollCleanupRef.current = nextId
524
+ ? scrollToCompareSelection(diffPaneRef.current, nextId, fileName)
525
+ : undefined;
526
+ }}
527
+ />
528
+ )}
529
+
530
+ <div ref={diffPaneRef} className={styles.diffPane} data-view-mode={viewMode}>
531
+ <InlineComponentCompare
532
+ name={name}
533
+ baseId={baseId}
534
+ compareId={compareId}
535
+ baseVersion={baseVersionShort}
536
+ compareVersion={compareVersionShort}
537
+ allTabs={resolvedTabs}
538
+ host={host}
539
+ // Hand the inner context our already-resolved pair: base = the scope's published snap,
540
+ // compare = the live workspace component (with local changes). Without this the inner
541
+ // context re-fetches by id and, in local-changes mode (compareId === baseId), would load
542
+ // the same snap for both sides — making the deps/config/preview tabs show base vs base.
543
+ baseOverride={componentCompare?.base as { model?: any; descriptor?: any } | undefined}
544
+ compareOverride={componentCompare?.compare as { model?: any; descriptor?: any } | undefined}
545
+ >
546
+ {/* The API view isn't an inline tab — render it inside the inline context (so it sees the
547
+ resolved base/compare pair) only while it's the active view, so its diff query fires
548
+ on-demand. CSS hides the inline `[data-tab-id]` panels when `data-view-mode='api'`. */}
549
+ {viewMode === 'api' ? apiTab : null}
550
+ </InlineComponentCompare>
551
+ </div>
466
552
  </div>
467
553
  </DepsFilterProvider>
468
554
  </DiffModeProvider>
469
555
  );
470
556
  }
471
557
 
558
+ function scrollToCompareSelection(
559
+ pane: HTMLDivElement | null,
560
+ componentId: string,
561
+ fileName?: string
562
+ ): (() => void) | undefined {
563
+ if (!pane) return undefined;
564
+ const selector = fileName
565
+ ? `[data-file-id="${CSS.escape(componentId)}:${CSS.escape(fileName)}"]`
566
+ : `[data-component-id="${CSS.escape(componentId)}"]`;
567
+
568
+ let cancelled = false;
569
+ let observer: MutationObserver | undefined;
570
+ let timeoutId: ReturnType<typeof setTimeout> | undefined;
571
+ let frameId: number | undefined;
572
+ let settleCleanup: (() => void) | undefined;
573
+
574
+ const findAndScroll = () => {
575
+ if (cancelled) return false;
576
+ const element = pane.querySelector(selector);
577
+ if (!element) return false;
578
+ observer?.disconnect();
579
+ if (timeoutId) clearTimeout(timeoutId);
580
+ settleCleanup = scrollElementToPaneTop(pane, element);
581
+ return true;
582
+ };
583
+
584
+ frameId = requestAnimationFrame(() => {
585
+ if (findAndScroll()) return;
586
+ observer = new MutationObserver(findAndScroll);
587
+ observer.observe(pane, { childList: true, subtree: true });
588
+ timeoutId = setTimeout(() => observer?.disconnect(), 5000);
589
+ });
590
+
591
+ return () => {
592
+ cancelled = true;
593
+ if (frameId !== undefined) cancelAnimationFrame(frameId);
594
+ if (timeoutId) clearTimeout(timeoutId);
595
+ observer?.disconnect();
596
+ settleCleanup?.();
597
+ };
598
+ }
599
+
600
+ function scrollElementToPaneTop(pane: HTMLDivElement, element: Element) {
601
+ let frameId: number | undefined;
602
+ let cancelled = false;
603
+ let passes = 0;
604
+
605
+ const settle = () => {
606
+ if (cancelled || !pane.isConnected || !element.isConnected) return;
607
+ const drift = element.getBoundingClientRect().top - pane.getBoundingClientRect().top;
608
+ pane.scrollTo({ top: drift + pane.scrollTop, behavior: 'instant' });
609
+ passes += 1;
610
+ if (Math.abs(drift) > 2 && passes < 4) frameId = requestAnimationFrame(settle);
611
+ };
612
+
613
+ settle();
614
+ return () => {
615
+ cancelled = true;
616
+ if (frameId !== undefined) cancelAnimationFrame(frameId);
617
+ };
618
+ }
619
+
472
620
  function CompareViewSkeleton() {
473
621
  return (
474
622
  <>
@@ -101,6 +101,12 @@ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r
101
101
  function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
102
102
  function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
103
103
  function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
104
+ function apiChangeStatusToFileStatus(status) {
105
+ if (status === 'ADDED') return 'NEW';
106
+ if (status === 'REMOVED') return 'DELETED';
107
+ return 'MODIFIED';
108
+ }
109
+
104
110
  // The single-component compare offers the same view modes as lane-compare. Which ones actually
105
111
  // appear is driven by real per-view content counts (see `CompareView`) — mirroring how the cloud
106
112
  // changes view derives available views from each component's change types, so a user never lands
@@ -312,6 +318,10 @@ function CompareView({
312
318
  const [viewMode, setViewModeState] = (0, _react().useState)(searchParams.get('view') || 'code');
313
319
  const [diffMode, setDiffModeState] = (0, _react().useState)(searchParams.get('diffMode') || 'split');
314
320
  const [showAllDeps, setShowAllDeps] = (0, _react().useState)(false);
321
+ const [selectedId, setSelectedId] = (0, _react().useState)();
322
+ const [selectedFile, setSelectedFile] = (0, _react().useState)();
323
+ const diffPaneRef = (0, _react().useRef)(null);
324
+ const pendingScrollCleanupRef = (0, _react().useRef)(undefined);
315
325
  const syncUrl = _react().default.useCallback((key, value) => {
316
326
  const url = new URL(window.location.href);
317
327
  if (value) url.searchParams.set(key, value);else url.searchParams.delete(key);
@@ -327,6 +337,7 @@ function CompareView({
327
337
  }, [syncUrl]);
328
338
  const componentCompare = (0, _componentUiComponentCompare().useComponentCompare)();
329
339
  const compareData = (0, _componentUiComponentCompare3().useCompareData)();
340
+ const fileRegistry = (0, _componentUiComponentCompare3().useFileRegistry)();
330
341
  const data = compareData?.compareDataFor(compareId);
331
342
  const dataLoading = compareData?.loading ?? false;
332
343
 
@@ -403,6 +414,45 @@ function CompareView({
403
414
  }
404
415
  return acc;
405
416
  }, [loading, registeredModeIds, isNew, data, componentCompare, apiTabHasContent]);
417
+ const componentId = compareId.split('@')[0];
418
+ const fileRegistryVersion = fileRegistry?.getVersion();
419
+ const sidebarFiles = (0, _react().useMemo)(() => {
420
+ // The registry object is stable; its monotonic version invalidates this view-derived projection.
421
+ void fileRegistryVersion;
422
+ if (viewMode === 'code') return fileRegistry?.getFiles(componentId);
423
+ if (viewMode === 'config') return fileRegistry?.getAspectFiles(componentId);
424
+ if (viewMode === 'tests') {
425
+ return (data?.tests || []).filter(file => file.status && file.status !== 'UNCHANGED').map(file => ({
426
+ name: file.fileName,
427
+ status: file.status
428
+ }));
429
+ }
430
+ if (viewMode === 'api') {
431
+ return (apiDiffResult?.publicChanges || []).map(change => ({
432
+ name: change.exportName,
433
+ status: apiChangeStatusToFileStatus(change.status)
434
+ }));
435
+ }
436
+ return undefined;
437
+ }, [viewMode, fileRegistry, fileRegistryVersion, componentId, data?.tests, apiDiffResult]);
438
+ const sidebarGroups = (0, _react().useMemo)(() => [{
439
+ key: 'component',
440
+ label: 'Component',
441
+ items: [{
442
+ id: componentId,
443
+ name,
444
+ files: sidebarFiles
445
+ }]
446
+ }], [componentId, name, sidebarFiles]);
447
+ (0, _react().useEffect)(() => {
448
+ pendingScrollCleanupRef.current?.();
449
+ pendingScrollCleanupRef.current = undefined;
450
+ setSelectedId(undefined);
451
+ setSelectedFile(undefined);
452
+ }, [viewMode]);
453
+ (0, _react().useEffect)(() => () => {
454
+ pendingScrollCleanupRef.current?.();
455
+ }, []);
406
456
 
407
457
  // If the active view has no content, fall back to the first view that does.
408
458
  (0, _react().useEffect)(() => {
@@ -439,6 +489,21 @@ function CompareView({
439
489
  showCounts: false,
440
490
  loading: loading
441
491
  }), /*#__PURE__*/_react().default.createElement("div", {
492
+ className: _componentComparePageModule().default.layout
493
+ }, viewMode !== 'dependencies' && /*#__PURE__*/_react().default.createElement(_componentUiComponentCompare3().CompareSidebar, {
494
+ groups: sidebarGroups,
495
+ selectedId: selectedId,
496
+ selectedFile: selectedFile,
497
+ defaultExpandFiles: viewMode === 'code' || viewMode === 'config' || viewMode === 'tests' || viewMode === 'api',
498
+ onSelect: (id, fileName) => {
499
+ const nextId = id || undefined;
500
+ setSelectedId(nextId);
501
+ setSelectedFile(fileName);
502
+ pendingScrollCleanupRef.current?.();
503
+ pendingScrollCleanupRef.current = nextId ? scrollToCompareSelection(diffPaneRef.current, nextId, fileName) : undefined;
504
+ }
505
+ }), /*#__PURE__*/_react().default.createElement("div", {
506
+ ref: diffPaneRef,
442
507
  className: _componentComparePageModule().default.diffPane,
443
508
  "data-view-mode": viewMode
444
509
  }, /*#__PURE__*/_react().default.createElement(_componentUiComponentCompare3().InlineComponentCompare, {
@@ -456,7 +521,61 @@ function CompareView({
456
521
  ,
457
522
  baseOverride: componentCompare?.base,
458
523
  compareOverride: componentCompare?.compare
459
- }, viewMode === 'api' ? apiTab : null))));
524
+ }, viewMode === 'api' ? apiTab : null)))));
525
+ }
526
+ function scrollToCompareSelection(pane, componentId, fileName) {
527
+ if (!pane) return undefined;
528
+ const selector = fileName ? `[data-file-id="${CSS.escape(componentId)}:${CSS.escape(fileName)}"]` : `[data-component-id="${CSS.escape(componentId)}"]`;
529
+ let cancelled = false;
530
+ let observer;
531
+ let timeoutId;
532
+ let frameId;
533
+ let settleCleanup;
534
+ const findAndScroll = () => {
535
+ if (cancelled) return false;
536
+ const element = pane.querySelector(selector);
537
+ if (!element) return false;
538
+ observer?.disconnect();
539
+ if (timeoutId) clearTimeout(timeoutId);
540
+ settleCleanup = scrollElementToPaneTop(pane, element);
541
+ return true;
542
+ };
543
+ frameId = requestAnimationFrame(() => {
544
+ if (findAndScroll()) return;
545
+ observer = new MutationObserver(findAndScroll);
546
+ observer.observe(pane, {
547
+ childList: true,
548
+ subtree: true
549
+ });
550
+ timeoutId = setTimeout(() => observer?.disconnect(), 5000);
551
+ });
552
+ return () => {
553
+ cancelled = true;
554
+ if (frameId !== undefined) cancelAnimationFrame(frameId);
555
+ if (timeoutId) clearTimeout(timeoutId);
556
+ observer?.disconnect();
557
+ settleCleanup?.();
558
+ };
559
+ }
560
+ function scrollElementToPaneTop(pane, element) {
561
+ let frameId;
562
+ let cancelled = false;
563
+ let passes = 0;
564
+ const settle = () => {
565
+ if (cancelled || !pane.isConnected || !element.isConnected) return;
566
+ const drift = element.getBoundingClientRect().top - pane.getBoundingClientRect().top;
567
+ pane.scrollTo({
568
+ top: drift + pane.scrollTop,
569
+ behavior: 'instant'
570
+ });
571
+ passes += 1;
572
+ if (Math.abs(drift) > 2 && passes < 4) frameId = requestAnimationFrame(settle);
573
+ };
574
+ settle();
575
+ return () => {
576
+ cancelled = true;
577
+ if (frameId !== undefined) cancelAnimationFrame(frameId);
578
+ };
460
579
  }
461
580
  function CompareViewSkeleton() {
462
581
  return /*#__PURE__*/_react().default.createElement(_react().default.Fragment, null, /*#__PURE__*/_react().default.createElement("div", {
@@ -1 +1 @@
1
- {"version":3,"names":["_react","data","_interopRequireWildcard","require","_classnames","_interopRequireDefault","_reactRouterDom","_component","_componentUiComponentCompare","_componentUiComponentCompare2","_componentUiComponentCompareHooks","_componentUiComponentCompareUtils","_componentUiComponentCompareUtils2","_componentUiComponentCompare3","_dependenciesUi","_semanticsUi","_componentComparePageModule","_excluded","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_extends","assign","bind","arguments","length","apply","_objectWithoutProperties","_objectWithoutPropertiesLoose","getOwnPropertySymbols","indexOf","propertyIsEnumerable","COMPARE_VIEW_MODES","id","displayName","icon","findPrevVersionFromCurrent","currentVersion","log","index","logs","prevIndex","findIndex","l","tag","hash","ComponentComparePage","_ref","host","hostFromProps","tabs","getApiTab","className","rest","component","useContext","ComponentContext","componentDescriptor","ComponentDescriptorContext","resolvedTabs","useMemo","apiTab","baseVersion","useCompareQueryParam","compareVersionParam","isWorkspace","allVersionInfo","slice","sort","sortByDateDsc","toString","isNew","compareHasLocalChanges","lastVersionInfo","find","version","baseId","changeVersion","base","baseComponentDescriptor","loading","baseLoading","error","baseError","useComponent","skip","baseModelLoading","baseIdStr","compareIdStr","isSameVersion","logsByVersion","reduce","groupByVersion","Map","componentCompareModel","compare","model","descriptor","hasLocalChanges","isFullScreen","hidden","pair","compareId","pairs","registeredModeIds","ids","map","inlineTabIdToViewMode","filter","Boolean","push","baseVersionShort","compareVersionShort","createElement","ComponentCompareContext","Provider","value","CompareDataProvider","FileRegistryProvider","RegistryFeeder","classnames","styles","page","versionPickerRow","ComponentCompareVersionPicker","componentId","toStringWithoutVersion","compareVersion","blankState","InlineCompareEmpty","message","hint","CompareView","name","fullName","undefined","searchParams","useSearchParams","viewMode","setViewModeState","useState","diffMode","setDiffModeState","showAllDeps","setShowAllDeps","syncUrl","React","useCallback","key","url","URL","window","location","href","delete","history","replaceState","setViewMode","v","setDiffMode","d","componentCompare","useComponentCompare","compareData","useCompareData","compareDataFor","dataLoading","result","apiDiffResult","apiDiffLoading","useApiDiff","apiExtractionGap","side","available","reason","apiTabHasContent","hasChanges","unresolvedExports","counts","acc","getDeps","aspect","dependencies","depChanges","computeDepsDiff","status","compositionsCount","Math","max","compositions","changedCode","code","changedAspects","aspects","changedTests","tests","config","preview","api","useEffect","first","CompareViewSkeleton","DiffModeProvider","mode","DepsFilterProvider","showAll","CompareToolbar","onViewModeChange","endActions","CompareToolbarActions","onDiffModeChange","depsShowAll","onDepsShowAllChange","viewModes","showCounts","diffPane","InlineComponentCompare","allTabs","baseOverride","compareOverride","Fragment","toolbarSkeleton","Array","from","_","skelPill","bodySkeleton","skelHeader","skelLine","style","width"],"sources":["component-compare-page.tsx"],"sourcesContent":["import type { HTMLAttributes } from 'react';\nimport React, { useContext, useEffect, useMemo, useState } from 'react';\nimport classnames from 'classnames';\nimport { useSearchParams } from 'react-router-dom';\nimport { ComponentContext, ComponentDescriptorContext, useComponent } from '@teambit/component';\nimport type { TabItem } from '@teambit/component.ui.component-compare.models.component-compare-props';\nimport {\n ComponentCompareContext,\n InlineCompareEmpty,\n useComponentCompare,\n} from '@teambit/component.ui.component-compare.context';\nimport { ComponentCompareVersionPicker } from '@teambit/component.ui.component-compare.version-picker';\nimport { useCompareQueryParam } from '@teambit/component.ui.component-compare.hooks.use-component-compare-url';\nimport { sortByDateDsc } from '@teambit/component.ui.component-compare.utils.sort-logs';\nimport { groupByVersion } from '@teambit/component.ui.component-compare.utils.group-by-version';\nimport type { LegacyComponentLog } from '@teambit/legacy-component-log';\nimport {\n CompareDataProvider,\n CompareToolbar,\n CompareToolbarActions,\n DiffModeProvider,\n DepsFilterProvider,\n FileRegistryProvider,\n InlineComponentCompare,\n RegistryFeeder,\n useCompareData,\n} from '@teambit/component.ui.component-compare.component-compare';\nimport type { CompareViewMode, ComponentComparePair } from '@teambit/component.ui.component-compare.component-compare';\nimport { computeDepsDiff } from '@teambit/dependencies.ui.deps-diff-table';\nimport { useApiDiff } from '@teambit/semantics.ui.api-diff-view';\n\nimport styles from './component-compare-page.module.scss';\n\nexport type ComponentComparePageProps = {\n host: string;\n tabs: TabItem[] | (() => TabItem[]);\n /**\n * Lazily resolves the API compare element (contributed by the api-reference aspect). Resolved at\n * render — not construction — so it doesn't depend on UI-provider registration order. When it\n * yields an element, the page exposes an `api` view mode; the element is only mounted while that\n * view is active, so its diff query fires on-demand.\n */\n getApiTab?: () => React.ReactNode;\n className?: string;\n} & HTMLAttributes<HTMLDivElement>;\n\ntype ViewMode = 'code' | 'preview' | 'docs' | 'dependencies' | 'tests' | 'config' | 'api';\ntype DiffMode = 'split' | 'unified';\n\n// The single-component compare offers the same view modes as lane-compare. Which ones actually\n// appear is driven by real per-view content counts (see `CompareView`) — mirroring how the cloud\n// changes view derives available views from each component's change types, so a user never lands\n// on a view that has nothing to show. `api` is only listed when the api-reference aspect supplies\n// an API tab (see `getApiTab`); like lane-compare it's always available then (the view renders its\n// own \"nothing to compare\" state), since we only fetch the diff once the view is opened.\n// Order mirrors lane-compare exactly (API first), so the two compare surfaces read identically.\nconst COMPARE_VIEW_MODES: CompareViewMode[] = [\n { id: 'api', displayName: 'API', icon: 'schema' },\n { id: 'code', displayName: 'Code', icon: 'code' },\n { id: 'preview', displayName: 'Preview', icon: 'eye' },\n { id: 'docs', displayName: 'Docs', icon: 'overview' },\n { id: 'dependencies', displayName: 'Dependencies', icon: 'link' },\n { id: 'tests', displayName: 'Tests', icon: 'test' },\n { id: 'config', displayName: 'Configuration', icon: 'configuration' },\n];\n\nfunction findPrevVersionFromCurrent(currentVersion?: string) {\n return (log: LegacyComponentLog, index: number, logs: LegacyComponentLog[]) => {\n if (!currentVersion) return index === 1;\n const prevIndex = logs.findIndex((l) => (l.tag || l.hash) === currentVersion) + 1;\n return index === prevIndex;\n };\n}\n\nexport function ComponentComparePage({\n host: hostFromProps,\n tabs,\n getApiTab,\n className,\n ...rest\n}: ComponentComparePageProps) {\n // `component` from ComponentContext is authoritative for the compare side — mirrors legacy\n // `ComponentCompare` which never loaded a separate compareModel when there was no override.\n // Loading a separate copy via useComponent risks an id string that differs from the live\n // workspace component (e.g. no version), which breaks the server's local-changes detection\n // (`computeCompare`: `comparingWithLocalChanges = workspace && baseId === compareId`).\n const component = useContext(ComponentContext);\n const componentDescriptor = useContext(ComponentDescriptorContext);\n\n const resolvedTabs = useMemo(() => (typeof tabs === 'function' ? tabs() : tabs), [tabs]);\n const apiTab = useMemo(() => getApiTab?.(), [getApiTab]);\n\n const baseVersion = useCompareQueryParam('baseVersion');\n // The compare side follows the component page's main version dropdown, which sets `?version`.\n // When it's set the user is viewing a specific published version, so we compare against THAT\n // version (clean); when absent we default to the live workspace. Read the exact `version` key —\n // NOT `search.includes('version')`, which the old code used and which also matched `baseVersion`,\n // wrongly flipping this whenever a base was picked.\n const compareVersionParam = useCompareQueryParam('version');\n const isWorkspace = hostFromProps === 'teambit.workspace/workspace';\n\n const allVersionInfo = useMemo(\n () => component.logs?.slice().sort(sortByDateDsc) || [],\n [component.id.toString(), component.logs?.length]\n );\n const isNew = allVersionInfo.length === 0;\n // \"workspace\" (live on-disk files, incl. uncommitted) only when NO specific version is selected.\n // With `?version` set, the compare side is that clean version — the server then diffs it as a real\n // version instead of the live workspace (`computeCompare`'s `compareIsLiveWorkspace`).\n const compareHasLocalChanges = isWorkspace && !isNew && !compareVersionParam;\n\n // Pick the base version: explicit URL param > previous published version > current.\n // The default base is the *previous* published version so the workspace compare shows the changes\n // since that version (committed + uncommitted). Defaulting to the current checked-out version made\n // base === compare, so the diff was empty and the view collapsed to its always-on sections.\n const lastVersionInfo = useMemo(\n () => allVersionInfo.find(findPrevVersionFromCurrent(component.id.version)),\n [allVersionInfo, component.id.version]\n );\n\n const baseId = useMemo(\n () =>\n (baseVersion && component.id.changeVersion(baseVersion)) ||\n (lastVersionInfo && component.id.changeVersion(lastVersionInfo.tag || lastVersionInfo.hash)) ||\n component.id,\n [baseVersion, lastVersionInfo?.tag, lastVersionInfo?.hash, component.id.toString()]\n );\n\n const {\n component: base,\n componentDescriptor: baseComponentDescriptor,\n loading: baseLoading,\n error: baseError,\n } = useComponent('teambit.scope/scope', baseId?.toString(), { skip: !baseId || isNew });\n\n // The base model is fetched asynchronously. Until it resolves we must report `loading: true` —\n // otherwise consumers (the toolbar counts, the dependency diff, etc.) observe `base === undefined`\n // with `loading === false` and wrongly treat the component as new (no base + has compare),\n // deriving bogus \"everything changed\" data before the comparison is actually stable. We treat the\n // base as loading until the model is present (not just until Apollo's flag flips), which also\n // covers the skip→fetch transition where the flag is briefly false with no model yet.\n const baseModelLoading = !isNew && !!baseId && !baseError && (!!baseLoading || !base);\n\n // The compare side is always the checked-out component. In workspace mode the server recognises\n // this as the live workspace and diffs the base snap against the on-disk files (so uncommitted\n // changes are included) — see `computeCompare`'s `compareIsLiveWorkspace`. The base then differs\n // from the compare (previous version vs. current), which is what surfaces the real change set.\n const baseIdStr = baseId?.toString();\n const compareIdStr = component.id.toString();\n\n // When the resolved base and compare point at the exact same version (and we are not diffing\n // live workspace changes against a snap), there is nothing to diff. This is common: a\n // single-version component, or the user picking the same version on both sides. Without this\n // the whole pane just blanks out, so we show an explicit \"identical versions\" state instead.\n const isSameVersion = !isNew && !compareHasLocalChanges && !!baseIdStr && baseIdStr === compareIdStr;\n\n const logsByVersion = useMemo(\n () => (component.logs || []).slice().reduce(groupByVersion, new Map<string, LegacyComponentLog>()),\n [component.id.toString(), component.logs?.length]\n );\n\n // Build a minimal ComponentCompareContext for the version picker (it only reads\n // `compare.model.logs`, `compare.model.version`, and `base.model.version`). Data for the\n // diff itself flows through `CompareDataProvider` → `InlineContextProvider` inside\n // `InlineComponentCompare`, which sets its own inner context with the file/aspect/test maps.\n const componentCompareModel = useMemo(\n () => ({\n compare: {\n model: component,\n descriptor: componentDescriptor,\n hasLocalChanges: compareHasLocalChanges,\n },\n base: base && {\n model: base,\n descriptor: baseComponentDescriptor,\n },\n // `!component.logs` ⇒ the compare component's version history hasn't loaded yet, so `isNew`\n // (derived from it) is not yet known. Stay in loading until it resolves — otherwise we briefly\n // treat the component as new (no base) and render the wrong toolbar before the base/diff load.\n loading: !component.logs || baseModelLoading,\n logsByVersion,\n isFullScreen: true,\n hidden: false,\n }),\n [\n component,\n base?.id.toString(),\n componentDescriptor,\n baseComponentDescriptor,\n compareHasLocalChanges,\n logsByVersion,\n baseModelLoading,\n ]\n );\n\n const pair: ComponentComparePair | null = useMemo(() => {\n if (isNew || isSameVersion || !baseIdStr || !compareIdStr) return null;\n return { baseId: baseIdStr, compareId: compareIdStr };\n }, [isNew, isSameVersion, baseIdStr, compareIdStr]);\n const pairs = useMemo(() => (pair ? [pair] : []), [pair]);\n\n // Map the registered inline tabs to view-mode ids so `CompareView` only counts/shows modes that\n // are actually registered (e.g. there is no `docs` inline tab today). The `api` view is not an\n // inline tab — it's supplied separately by `getApiTab` — so append it here when available.\n const registeredModeIds = useMemo(() => {\n const ids = resolvedTabs.map((t) => inlineTabIdToViewMode(t.id)).filter(Boolean) as ViewMode[];\n if (apiTab) ids.push('api');\n return ids;\n }, [resolvedTabs, apiTab]);\n\n const baseVersionShort = baseId?.version?.slice(0, 7);\n const compareVersionShort = compareHasLocalChanges ? 'workspace' : (component.id.version || '').slice(0, 7);\n\n return (\n <ComponentCompareContext.Provider value={componentCompareModel as any}>\n <CompareDataProvider pairs={pairs}>\n <FileRegistryProvider>\n <RegistryFeeder pairs={pairs} />\n <div className={classnames(styles.page, className)} {...rest}>\n <div className={styles.versionPickerRow}>\n <ComponentCompareVersionPicker\n componentId={component.id.toStringWithoutVersion()}\n baseVersion={baseId?.version}\n compareVersion={component.id.version}\n compareHasLocalChanges={compareHasLocalChanges}\n host={hostFromProps}\n />\n </div>\n\n {isSameVersion ? (\n <div className={styles.blankState}>\n <InlineCompareEmpty\n message=\"No changes to compare\"\n baseVersion={baseVersionShort}\n compareVersion={compareVersionShort}\n hint=\"Both sides point to the same version. Pick a different base above to compare.\"\n />\n </div>\n ) : (\n <CompareView\n isNew={isNew}\n name={component.id.fullName}\n baseId={isNew ? undefined : baseIdStr}\n compareId={compareIdStr || component.id.toString()}\n baseVersionShort={baseVersionShort}\n compareVersionShort={compareVersionShort}\n resolvedTabs={resolvedTabs}\n registeredModeIds={registeredModeIds}\n apiTab={apiTab}\n host={hostFromProps}\n />\n )}\n </div>\n </FileRegistryProvider>\n </CompareDataProvider>\n </ComponentCompareContext.Provider>\n );\n}\n\ntype CompareViewProps = {\n isNew: boolean;\n name: string;\n baseId?: string;\n compareId: string;\n baseVersionShort?: string;\n compareVersionShort?: string;\n resolvedTabs: TabItem[];\n registeredModeIds: ViewMode[];\n /** API compare element, rendered only while the `api` view is active (on-demand fetch). */\n apiTab?: React.ReactNode;\n host: string;\n};\n\n/**\n * Renders the toolbar + diff pane. Lives inside `CompareDataProvider` so it can read the bulk\n * compare result and derive real per-view counts: a view mode only appears when it has content\n * (code files changed, compositions exist, aspects changed, …), so the user never clicks into an\n * empty view. Mirrors the cloud changes view, which gates each view on the component's change types.\n */\nfunction CompareView({\n isNew,\n name,\n baseId,\n compareId,\n baseVersionShort,\n compareVersionShort,\n resolvedTabs,\n registeredModeIds,\n apiTab,\n host,\n}: CompareViewProps) {\n const [searchParams] = useSearchParams();\n const [viewMode, setViewModeState] = useState<ViewMode>((searchParams.get('view') as ViewMode) || 'code');\n const [diffMode, setDiffModeState] = useState<DiffMode>((searchParams.get('diffMode') as DiffMode) || 'split');\n const [showAllDeps, setShowAllDeps] = useState(false);\n\n const syncUrl = React.useCallback((key: string, value: string | undefined) => {\n const url = new URL(window.location.href);\n if (value) url.searchParams.set(key, value);\n else url.searchParams.delete(key);\n window.history.replaceState(null, '', url.toString());\n }, []);\n\n const setViewMode = React.useCallback(\n (v: ViewMode) => {\n setViewModeState(v);\n syncUrl('view', v === 'code' ? undefined : v);\n },\n [syncUrl]\n );\n const setDiffMode = React.useCallback(\n (d: DiffMode) => {\n setDiffModeState(d);\n syncUrl('diffMode', d === 'split' ? undefined : d);\n },\n [syncUrl]\n );\n\n const componentCompare = useComponentCompare();\n const compareData = useCompareData();\n const data = compareData?.compareDataFor(compareId);\n const dataLoading = compareData?.loading ?? false;\n\n // The API view mode appears when there's something meaningful to show. Unlike the bulk\n // code/aspect/test data, the API diff is a separate query — fetch it here (cheap: one pair) so the\n // count is real. The API tab element self-fetches the same query when opened, so Apollo serves it\n // from cache (no double round-trip). Skipped entirely when there's no API tab registered.\n const { result: apiDiffResult, loading: apiDiffLoading } = useApiDiff(baseId, compareId, { skip: !apiTab });\n // A per-version extraction gap (a side built before API extraction, or a failed extraction) is a\n // \"couldn't compute\" state worth surfacing — NOT the same as \"no changes\". Distinct from a\n // component-wide DISABLED/NO_EXTRACTOR (a component that simply has no API), which stays hidden so\n // the tab isn't noise on non-API components.\n const apiExtractionGap = (side?: { available: boolean; reason?: string }) =>\n !!side && !side.available && (side.reason === 'NOT_BUILT' || side.reason === 'FAILED');\n const apiTabHasContent =\n !!apiDiffResult &&\n (apiDiffResult.hasChanges ||\n (apiDiffResult.unresolvedExports?.length ?? 0) > 0 ||\n apiExtractionGap(apiDiffResult.base) ||\n apiExtractionGap(apiDiffResult.compare));\n\n // Single stability gate. `componentCompare.loading` is true while the base/compare *models* are\n // still being fetched; `dataLoading` is true while the bulk code/aspect/test diff is in flight;\n // `apiDiffLoading` while the API diff (which gates the API tab) resolves. We must not derive any\n // per-view counts until ALL are settled — otherwise a half-loaded state (base model not yet\n // present) reads as \"no base → new → everything changed\", or the API tab flickers in late.\n const loading = (componentCompare?.loading ?? false) || dataLoading || (!!apiTab && apiDiffLoading);\n\n // All per-view derivation happens here, and ONLY in the stable branch. While anything is loading we\n // render a skeleton (below) instead of the toolbar, so we compute nothing — no counting, and most\n // importantly no dependency diff against half-loaded or absent data.\n const counts = useMemo(() => {\n const acc: Record<string, number> = {};\n if (loading) return acc;\n\n // Dependency changes come from the dependency-resolver aspect on each descriptor (the same source\n // InlineDepsCompare diffs) — there is no precomputed deps diff in the bulk gql result.\n const getDeps = (descriptor: any): any[] => {\n const aspect = descriptor?.get?.('teambit.dependencies/dependency-resolver');\n return aspect?.data?.dependencies || aspect?.dependencies || [];\n };\n const depChanges = computeDepsDiff(\n isNew ? [] : getDeps(componentCompare?.base?.descriptor),\n getDeps(componentCompare?.compare?.descriptor)\n ).filter((e) => e.status !== 'unchanged').length;\n\n // Compositions live on the component model (not the bulk diff). Show preview if either side has any.\n const compositionsCount = Math.max(\n componentCompare?.compare?.model?.compositions?.length || 0,\n componentCompare?.base?.model?.compositions?.length || 0\n );\n\n const changedCode = data ? (data.code || []).filter((f) => f.status && f.status !== 'UNCHANGED').length : 0;\n const changedAspects = data ? (data.aspects || []).length : 0;\n const changedTests = data ? (data.tests || []).filter((f) => f.status && f.status !== 'UNCHANGED').length : 0;\n\n for (const id of registeredModeIds) {\n switch (id) {\n case 'code':\n acc.code = isNew ? 1 : changedCode;\n break;\n case 'config':\n acc.config = isNew ? 1 : changedAspects;\n break;\n case 'tests':\n acc.tests = isNew ? 0 : changedTests;\n break;\n case 'preview':\n acc.preview = compositionsCount;\n break;\n case 'dependencies':\n acc.dependencies = depChanges;\n break;\n case 'api':\n // Show when there are real changes, unresolved exports, OR a per-version schema gap\n // (so \"schema unavailable for this version\" is surfaced, not silently hidden). Stays\n // hidden for a plain computed no-op and for non-API components.\n acc.api = apiTabHasContent ? 1 : 0;\n break;\n default:\n acc[id] = 1;\n }\n }\n return acc;\n }, [loading, registeredModeIds, isNew, data, componentCompare, apiTabHasContent]);\n\n // If the active view has no content, fall back to the first view that does.\n useEffect(() => {\n if (loading) return;\n if ((counts[viewMode] ?? 0) === 0) {\n const first = COMPARE_VIEW_MODES.find((v) => (counts[v.id] ?? 0) > 0);\n if (first) setViewMode(first.id as ViewMode);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [counts, viewMode, loading]);\n\n // Render a skeleton until base, compare and the bulk diff are all loaded. We must not render the\n // toolbar early: its visible view modes are derived from the counts, so a half-loaded state would\n // show the wrong set (e.g. 5 modes) and then visibly collapse (to 2) once data arrives.\n if (loading) {\n return <CompareViewSkeleton />;\n }\n\n return (\n <DiffModeProvider mode={diffMode}>\n <DepsFilterProvider showAll={showAllDeps}>\n <CompareToolbar\n viewMode={viewMode}\n onViewModeChange={(v) => setViewMode(v as ViewMode)}\n endActions={\n <CompareToolbarActions\n viewMode={viewMode}\n diffMode={diffMode}\n onDiffModeChange={setDiffMode}\n depsShowAll={showAllDeps}\n onDepsShowAllChange={setShowAllDeps}\n />\n }\n viewModes={COMPARE_VIEW_MODES}\n counts={counts}\n showCounts={false}\n loading={loading}\n />\n\n <div className={styles.diffPane} data-view-mode={viewMode}>\n <InlineComponentCompare\n name={name}\n baseId={baseId}\n compareId={compareId}\n baseVersion={baseVersionShort}\n compareVersion={compareVersionShort}\n allTabs={resolvedTabs}\n host={host}\n // Hand the inner context our already-resolved pair: base = the scope's published snap,\n // compare = the live workspace component (with local changes). Without this the inner\n // context re-fetches by id and, in local-changes mode (compareId === baseId), would load\n // the same snap for both sides — making the deps/config/preview tabs show base vs base.\n baseOverride={componentCompare?.base as { model?: any; descriptor?: any } | undefined}\n compareOverride={componentCompare?.compare as { model?: any; descriptor?: any } | undefined}\n >\n {/* The API view isn't an inline tab — render it inside the inline context (so it sees the\n resolved base/compare pair) only while it's the active view, so its diff query fires\n on-demand. CSS hides the inline `[data-tab-id]` panels when `data-view-mode='api'`. */}\n {viewMode === 'api' ? apiTab : null}\n </InlineComponentCompare>\n </div>\n </DepsFilterProvider>\n </DiffModeProvider>\n );\n}\n\nfunction CompareViewSkeleton() {\n return (\n <>\n <div className={styles.toolbarSkeleton}>\n {Array.from({ length: 4 }).map((_, i) => (\n <span key={i} className={styles.skelPill} />\n ))}\n </div>\n <div className={styles.diffPane}>\n <div className={styles.bodySkeleton}>\n <div className={styles.skelHeader} />\n {Array.from({ length: 8 }).map((_, i) => (\n <div key={i} className={styles.skelLine} style={{ width: `${45 + ((i * 7) % 45)}%` }} />\n ))}\n </div>\n </div>\n </>\n );\n}\n\nfunction inlineTabIdToViewMode(id?: string): ViewMode | undefined {\n switch (id) {\n case 'inline-code':\n return 'code';\n case 'inline-preview':\n return 'preview';\n case 'inline-docs':\n return 'docs';\n case 'inline-deps':\n return 'dependencies';\n case 'inline-tests':\n return 'tests';\n case 'inline-config':\n return 'config';\n default:\n return undefined;\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_react","data","_interopRequireWildcard","require","_classnames","_interopRequireDefault","_reactRouterDom","_component","_componentUiComponentCompare","_componentUiComponentCompare2","_componentUiComponentCompareHooks","_componentUiComponentCompareUtils","_componentUiComponentCompareUtils2","_componentUiComponentCompare3","_dependenciesUi","_semanticsUi","_componentComparePageModule","_excluded","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_extends","assign","bind","arguments","length","apply","_objectWithoutProperties","_objectWithoutPropertiesLoose","getOwnPropertySymbols","indexOf","propertyIsEnumerable","apiChangeStatusToFileStatus","status","COMPARE_VIEW_MODES","id","displayName","icon","findPrevVersionFromCurrent","currentVersion","log","index","logs","prevIndex","findIndex","l","tag","hash","ComponentComparePage","_ref","host","hostFromProps","tabs","getApiTab","className","rest","component","useContext","ComponentContext","componentDescriptor","ComponentDescriptorContext","resolvedTabs","useMemo","apiTab","baseVersion","useCompareQueryParam","compareVersionParam","isWorkspace","allVersionInfo","slice","sort","sortByDateDsc","toString","isNew","compareHasLocalChanges","lastVersionInfo","find","version","baseId","changeVersion","base","baseComponentDescriptor","loading","baseLoading","error","baseError","useComponent","skip","baseModelLoading","baseIdStr","compareIdStr","isSameVersion","logsByVersion","reduce","groupByVersion","Map","componentCompareModel","compare","model","descriptor","hasLocalChanges","isFullScreen","hidden","pair","compareId","pairs","registeredModeIds","ids","map","inlineTabIdToViewMode","filter","Boolean","push","baseVersionShort","compareVersionShort","createElement","ComponentCompareContext","Provider","value","CompareDataProvider","FileRegistryProvider","RegistryFeeder","classnames","styles","page","versionPickerRow","ComponentCompareVersionPicker","componentId","toStringWithoutVersion","compareVersion","blankState","InlineCompareEmpty","message","hint","CompareView","name","fullName","undefined","searchParams","useSearchParams","viewMode","setViewModeState","useState","diffMode","setDiffModeState","showAllDeps","setShowAllDeps","selectedId","setSelectedId","selectedFile","setSelectedFile","diffPaneRef","useRef","pendingScrollCleanupRef","syncUrl","React","useCallback","key","url","URL","window","location","href","delete","history","replaceState","setViewMode","v","setDiffMode","d","componentCompare","useComponentCompare","compareData","useCompareData","fileRegistry","useFileRegistry","compareDataFor","dataLoading","result","apiDiffResult","apiDiffLoading","useApiDiff","apiExtractionGap","side","available","reason","apiTabHasContent","hasChanges","unresolvedExports","counts","acc","getDeps","aspect","dependencies","depChanges","computeDepsDiff","compositionsCount","Math","max","compositions","changedCode","code","changedAspects","aspects","changedTests","tests","config","preview","api","split","fileRegistryVersion","getVersion","sidebarFiles","getFiles","getAspectFiles","file","fileName","publicChanges","change","exportName","sidebarGroups","label","items","files","useEffect","current","first","CompareViewSkeleton","DiffModeProvider","mode","DepsFilterProvider","showAll","CompareToolbar","onViewModeChange","endActions","CompareToolbarActions","onDiffModeChange","depsShowAll","onDepsShowAllChange","viewModes","showCounts","layout","CompareSidebar","groups","defaultExpandFiles","onSelect","nextId","scrollToCompareSelection","ref","diffPane","InlineComponentCompare","allTabs","baseOverride","compareOverride","pane","selector","CSS","escape","cancelled","observer","timeoutId","frameId","settleCleanup","findAndScroll","element","querySelector","disconnect","clearTimeout","scrollElementToPaneTop","requestAnimationFrame","MutationObserver","observe","childList","subtree","setTimeout","cancelAnimationFrame","passes","settle","isConnected","drift","getBoundingClientRect","top","scrollTo","scrollTop","behavior","abs","Fragment","toolbarSkeleton","Array","from","_","skelPill","bodySkeleton","skelHeader","skelLine","style","width"],"sources":["component-compare-page.tsx"],"sourcesContent":["import type { HTMLAttributes } from 'react';\nimport React, { useContext, useEffect, useMemo, useRef, useState } from 'react';\nimport classnames from 'classnames';\nimport { useSearchParams } from 'react-router-dom';\nimport { ComponentContext, ComponentDescriptorContext, useComponent } from '@teambit/component';\nimport type { TabItem } from '@teambit/component.ui.component-compare.models.component-compare-props';\nimport {\n ComponentCompareContext,\n InlineCompareEmpty,\n useComponentCompare,\n} from '@teambit/component.ui.component-compare.context';\nimport { ComponentCompareVersionPicker } from '@teambit/component.ui.component-compare.version-picker';\nimport { useCompareQueryParam } from '@teambit/component.ui.component-compare.hooks.use-component-compare-url';\nimport { sortByDateDsc } from '@teambit/component.ui.component-compare.utils.sort-logs';\nimport { groupByVersion } from '@teambit/component.ui.component-compare.utils.group-by-version';\nimport type { LegacyComponentLog } from '@teambit/legacy-component-log';\nimport {\n CompareDataProvider,\n CompareSidebar,\n CompareToolbar,\n CompareToolbarActions,\n DiffModeProvider,\n DepsFilterProvider,\n FileRegistryProvider,\n InlineComponentCompare,\n RegistryFeeder,\n useCompareData,\n useFileRegistry,\n} from '@teambit/component.ui.component-compare.component-compare';\nimport type {\n CompareSidebarGroup,\n CompareViewMode,\n ComponentComparePair,\n FileInfo,\n} from '@teambit/component.ui.component-compare.component-compare';\nimport { computeDepsDiff } from '@teambit/dependencies.ui.deps-diff-table';\nimport { useApiDiff } from '@teambit/semantics.ui.api-diff-view';\n\nimport styles from './component-compare-page.module.scss';\n\nexport type ComponentComparePageProps = {\n host: string;\n tabs: TabItem[] | (() => TabItem[]);\n /**\n * Lazily resolves the API compare element (contributed by the api-reference aspect). Resolved at\n * render — not construction — so it doesn't depend on UI-provider registration order. When it\n * yields an element, the page exposes an `api` view mode; the element is only mounted while that\n * view is active, so its diff query fires on-demand.\n */\n getApiTab?: () => React.ReactNode;\n className?: string;\n} & HTMLAttributes<HTMLDivElement>;\n\ntype ViewMode = 'code' | 'preview' | 'docs' | 'dependencies' | 'tests' | 'config' | 'api';\ntype DiffMode = 'split' | 'unified';\n\nfunction apiChangeStatusToFileStatus(status: string): string {\n if (status === 'ADDED') return 'NEW';\n if (status === 'REMOVED') return 'DELETED';\n return 'MODIFIED';\n}\n\n// The single-component compare offers the same view modes as lane-compare. Which ones actually\n// appear is driven by real per-view content counts (see `CompareView`) — mirroring how the cloud\n// changes view derives available views from each component's change types, so a user never lands\n// on a view that has nothing to show. `api` is only listed when the api-reference aspect supplies\n// an API tab (see `getApiTab`); like lane-compare it's always available then (the view renders its\n// own \"nothing to compare\" state), since we only fetch the diff once the view is opened.\n// Order mirrors lane-compare exactly (API first), so the two compare surfaces read identically.\nconst COMPARE_VIEW_MODES: CompareViewMode[] = [\n { id: 'api', displayName: 'API', icon: 'schema' },\n { id: 'code', displayName: 'Code', icon: 'code' },\n { id: 'preview', displayName: 'Preview', icon: 'eye' },\n { id: 'docs', displayName: 'Docs', icon: 'overview' },\n { id: 'dependencies', displayName: 'Dependencies', icon: 'link' },\n { id: 'tests', displayName: 'Tests', icon: 'test' },\n { id: 'config', displayName: 'Configuration', icon: 'configuration' },\n];\n\nfunction findPrevVersionFromCurrent(currentVersion?: string) {\n return (log: LegacyComponentLog, index: number, logs: LegacyComponentLog[]) => {\n if (!currentVersion) return index === 1;\n const prevIndex = logs.findIndex((l) => (l.tag || l.hash) === currentVersion) + 1;\n return index === prevIndex;\n };\n}\n\nexport function ComponentComparePage({\n host: hostFromProps,\n tabs,\n getApiTab,\n className,\n ...rest\n}: ComponentComparePageProps) {\n // `component` from ComponentContext is authoritative for the compare side — mirrors legacy\n // `ComponentCompare` which never loaded a separate compareModel when there was no override.\n // Loading a separate copy via useComponent risks an id string that differs from the live\n // workspace component (e.g. no version), which breaks the server's local-changes detection\n // (`computeCompare`: `comparingWithLocalChanges = workspace && baseId === compareId`).\n const component = useContext(ComponentContext);\n const componentDescriptor = useContext(ComponentDescriptorContext);\n\n const resolvedTabs = useMemo(() => (typeof tabs === 'function' ? tabs() : tabs), [tabs]);\n const apiTab = useMemo(() => getApiTab?.(), [getApiTab]);\n\n const baseVersion = useCompareQueryParam('baseVersion');\n // The compare side follows the component page's main version dropdown, which sets `?version`.\n // When it's set the user is viewing a specific published version, so we compare against THAT\n // version (clean); when absent we default to the live workspace. Read the exact `version` key —\n // NOT `search.includes('version')`, which the old code used and which also matched `baseVersion`,\n // wrongly flipping this whenever a base was picked.\n const compareVersionParam = useCompareQueryParam('version');\n const isWorkspace = hostFromProps === 'teambit.workspace/workspace';\n\n const allVersionInfo = useMemo(\n () => component.logs?.slice().sort(sortByDateDsc) || [],\n [component.id.toString(), component.logs?.length]\n );\n const isNew = allVersionInfo.length === 0;\n // \"workspace\" (live on-disk files, incl. uncommitted) only when NO specific version is selected.\n // With `?version` set, the compare side is that clean version — the server then diffs it as a real\n // version instead of the live workspace (`computeCompare`'s `compareIsLiveWorkspace`).\n const compareHasLocalChanges = isWorkspace && !isNew && !compareVersionParam;\n\n // Pick the base version: explicit URL param > previous published version > current.\n // The default base is the *previous* published version so the workspace compare shows the changes\n // since that version (committed + uncommitted). Defaulting to the current checked-out version made\n // base === compare, so the diff was empty and the view collapsed to its always-on sections.\n const lastVersionInfo = useMemo(\n () => allVersionInfo.find(findPrevVersionFromCurrent(component.id.version)),\n [allVersionInfo, component.id.version]\n );\n\n const baseId = useMemo(\n () =>\n (baseVersion && component.id.changeVersion(baseVersion)) ||\n (lastVersionInfo && component.id.changeVersion(lastVersionInfo.tag || lastVersionInfo.hash)) ||\n component.id,\n [baseVersion, lastVersionInfo?.tag, lastVersionInfo?.hash, component.id.toString()]\n );\n\n const {\n component: base,\n componentDescriptor: baseComponentDescriptor,\n loading: baseLoading,\n error: baseError,\n } = useComponent('teambit.scope/scope', baseId?.toString(), { skip: !baseId || isNew });\n\n // The base model is fetched asynchronously. Until it resolves we must report `loading: true` —\n // otherwise consumers (the toolbar counts, the dependency diff, etc.) observe `base === undefined`\n // with `loading === false` and wrongly treat the component as new (no base + has compare),\n // deriving bogus \"everything changed\" data before the comparison is actually stable. We treat the\n // base as loading until the model is present (not just until Apollo's flag flips), which also\n // covers the skip→fetch transition where the flag is briefly false with no model yet.\n const baseModelLoading = !isNew && !!baseId && !baseError && (!!baseLoading || !base);\n\n // The compare side is always the checked-out component. In workspace mode the server recognises\n // this as the live workspace and diffs the base snap against the on-disk files (so uncommitted\n // changes are included) — see `computeCompare`'s `compareIsLiveWorkspace`. The base then differs\n // from the compare (previous version vs. current), which is what surfaces the real change set.\n const baseIdStr = baseId?.toString();\n const compareIdStr = component.id.toString();\n\n // When the resolved base and compare point at the exact same version (and we are not diffing\n // live workspace changes against a snap), there is nothing to diff. This is common: a\n // single-version component, or the user picking the same version on both sides. Without this\n // the whole pane just blanks out, so we show an explicit \"identical versions\" state instead.\n const isSameVersion = !isNew && !compareHasLocalChanges && !!baseIdStr && baseIdStr === compareIdStr;\n\n const logsByVersion = useMemo(\n () => (component.logs || []).slice().reduce(groupByVersion, new Map<string, LegacyComponentLog>()),\n [component.id.toString(), component.logs?.length]\n );\n\n // Build a minimal ComponentCompareContext for the version picker (it only reads\n // `compare.model.logs`, `compare.model.version`, and `base.model.version`). Data for the\n // diff itself flows through `CompareDataProvider` → `InlineContextProvider` inside\n // `InlineComponentCompare`, which sets its own inner context with the file/aspect/test maps.\n const componentCompareModel = useMemo(\n () => ({\n compare: {\n model: component,\n descriptor: componentDescriptor,\n hasLocalChanges: compareHasLocalChanges,\n },\n base: base && {\n model: base,\n descriptor: baseComponentDescriptor,\n },\n // `!component.logs` ⇒ the compare component's version history hasn't loaded yet, so `isNew`\n // (derived from it) is not yet known. Stay in loading until it resolves — otherwise we briefly\n // treat the component as new (no base) and render the wrong toolbar before the base/diff load.\n loading: !component.logs || baseModelLoading,\n logsByVersion,\n isFullScreen: true,\n hidden: false,\n }),\n [\n component,\n base?.id.toString(),\n componentDescriptor,\n baseComponentDescriptor,\n compareHasLocalChanges,\n logsByVersion,\n baseModelLoading,\n ]\n );\n\n const pair: ComponentComparePair | null = useMemo(() => {\n if (isNew || isSameVersion || !baseIdStr || !compareIdStr) return null;\n return { baseId: baseIdStr, compareId: compareIdStr };\n }, [isNew, isSameVersion, baseIdStr, compareIdStr]);\n const pairs = useMemo(() => (pair ? [pair] : []), [pair]);\n\n // Map the registered inline tabs to view-mode ids so `CompareView` only counts/shows modes that\n // are actually registered (e.g. there is no `docs` inline tab today). The `api` view is not an\n // inline tab — it's supplied separately by `getApiTab` — so append it here when available.\n const registeredModeIds = useMemo(() => {\n const ids = resolvedTabs.map((t) => inlineTabIdToViewMode(t.id)).filter(Boolean) as ViewMode[];\n if (apiTab) ids.push('api');\n return ids;\n }, [resolvedTabs, apiTab]);\n\n const baseVersionShort = baseId?.version?.slice(0, 7);\n const compareVersionShort = compareHasLocalChanges ? 'workspace' : (component.id.version || '').slice(0, 7);\n\n return (\n <ComponentCompareContext.Provider value={componentCompareModel as any}>\n <CompareDataProvider pairs={pairs}>\n <FileRegistryProvider>\n <RegistryFeeder pairs={pairs} />\n <div className={classnames(styles.page, className)} {...rest}>\n <div className={styles.versionPickerRow}>\n <ComponentCompareVersionPicker\n componentId={component.id.toStringWithoutVersion()}\n baseVersion={baseId?.version}\n compareVersion={component.id.version}\n compareHasLocalChanges={compareHasLocalChanges}\n host={hostFromProps}\n />\n </div>\n\n {isSameVersion ? (\n <div className={styles.blankState}>\n <InlineCompareEmpty\n message=\"No changes to compare\"\n baseVersion={baseVersionShort}\n compareVersion={compareVersionShort}\n hint=\"Both sides point to the same version. Pick a different base above to compare.\"\n />\n </div>\n ) : (\n <CompareView\n isNew={isNew}\n name={component.id.fullName}\n baseId={isNew ? undefined : baseIdStr}\n compareId={compareIdStr || component.id.toString()}\n baseVersionShort={baseVersionShort}\n compareVersionShort={compareVersionShort}\n resolvedTabs={resolvedTabs}\n registeredModeIds={registeredModeIds}\n apiTab={apiTab}\n host={hostFromProps}\n />\n )}\n </div>\n </FileRegistryProvider>\n </CompareDataProvider>\n </ComponentCompareContext.Provider>\n );\n}\n\ntype CompareViewProps = {\n isNew: boolean;\n name: string;\n baseId?: string;\n compareId: string;\n baseVersionShort?: string;\n compareVersionShort?: string;\n resolvedTabs: TabItem[];\n registeredModeIds: ViewMode[];\n /** API compare element, rendered only while the `api` view is active (on-demand fetch). */\n apiTab?: React.ReactNode;\n host: string;\n};\n\n/**\n * Renders the toolbar + diff pane. Lives inside `CompareDataProvider` so it can read the bulk\n * compare result and derive real per-view counts: a view mode only appears when it has content\n * (code files changed, compositions exist, aspects changed, …), so the user never clicks into an\n * empty view. Mirrors the cloud changes view, which gates each view on the component's change types.\n */\nfunction CompareView({\n isNew,\n name,\n baseId,\n compareId,\n baseVersionShort,\n compareVersionShort,\n resolvedTabs,\n registeredModeIds,\n apiTab,\n host,\n}: CompareViewProps) {\n const [searchParams] = useSearchParams();\n const [viewMode, setViewModeState] = useState<ViewMode>((searchParams.get('view') as ViewMode) || 'code');\n const [diffMode, setDiffModeState] = useState<DiffMode>((searchParams.get('diffMode') as DiffMode) || 'split');\n const [showAllDeps, setShowAllDeps] = useState(false);\n const [selectedId, setSelectedId] = useState<string>();\n const [selectedFile, setSelectedFile] = useState<string>();\n const diffPaneRef = useRef<HTMLDivElement>(null);\n const pendingScrollCleanupRef = useRef<(() => void) | undefined>(undefined);\n\n const syncUrl = React.useCallback((key: string, value: string | undefined) => {\n const url = new URL(window.location.href);\n if (value) url.searchParams.set(key, value);\n else url.searchParams.delete(key);\n window.history.replaceState(null, '', url.toString());\n }, []);\n\n const setViewMode = React.useCallback(\n (v: ViewMode) => {\n setViewModeState(v);\n syncUrl('view', v === 'code' ? undefined : v);\n },\n [syncUrl]\n );\n const setDiffMode = React.useCallback(\n (d: DiffMode) => {\n setDiffModeState(d);\n syncUrl('diffMode', d === 'split' ? undefined : d);\n },\n [syncUrl]\n );\n\n const componentCompare = useComponentCompare();\n const compareData = useCompareData();\n const fileRegistry = useFileRegistry();\n const data = compareData?.compareDataFor(compareId);\n const dataLoading = compareData?.loading ?? false;\n\n // The API view mode appears when there's something meaningful to show. Unlike the bulk\n // code/aspect/test data, the API diff is a separate query — fetch it here (cheap: one pair) so the\n // count is real. The API tab element self-fetches the same query when opened, so Apollo serves it\n // from cache (no double round-trip). Skipped entirely when there's no API tab registered.\n const { result: apiDiffResult, loading: apiDiffLoading } = useApiDiff(baseId, compareId, { skip: !apiTab });\n // A per-version extraction gap (a side built before API extraction, or a failed extraction) is a\n // \"couldn't compute\" state worth surfacing — NOT the same as \"no changes\". Distinct from a\n // component-wide DISABLED/NO_EXTRACTOR (a component that simply has no API), which stays hidden so\n // the tab isn't noise on non-API components.\n const apiExtractionGap = (side?: { available: boolean; reason?: string }) =>\n !!side && !side.available && (side.reason === 'NOT_BUILT' || side.reason === 'FAILED');\n const apiTabHasContent =\n !!apiDiffResult &&\n (apiDiffResult.hasChanges ||\n (apiDiffResult.unresolvedExports?.length ?? 0) > 0 ||\n apiExtractionGap(apiDiffResult.base) ||\n apiExtractionGap(apiDiffResult.compare));\n\n // Single stability gate. `componentCompare.loading` is true while the base/compare *models* are\n // still being fetched; `dataLoading` is true while the bulk code/aspect/test diff is in flight;\n // `apiDiffLoading` while the API diff (which gates the API tab) resolves. We must not derive any\n // per-view counts until ALL are settled — otherwise a half-loaded state (base model not yet\n // present) reads as \"no base → new → everything changed\", or the API tab flickers in late.\n const loading = (componentCompare?.loading ?? false) || dataLoading || (!!apiTab && apiDiffLoading);\n\n // All per-view derivation happens here, and ONLY in the stable branch. While anything is loading we\n // render a skeleton (below) instead of the toolbar, so we compute nothing — no counting, and most\n // importantly no dependency diff against half-loaded or absent data.\n const counts = useMemo(() => {\n const acc: Record<string, number> = {};\n if (loading) return acc;\n\n // Dependency changes come from the dependency-resolver aspect on each descriptor (the same source\n // InlineDepsCompare diffs) — there is no precomputed deps diff in the bulk gql result.\n const getDeps = (descriptor: any): any[] => {\n const aspect = descriptor?.get?.('teambit.dependencies/dependency-resolver');\n return aspect?.data?.dependencies || aspect?.dependencies || [];\n };\n const depChanges = computeDepsDiff(\n isNew ? [] : getDeps(componentCompare?.base?.descriptor),\n getDeps(componentCompare?.compare?.descriptor)\n ).filter((e) => e.status !== 'unchanged').length;\n\n // Compositions live on the component model (not the bulk diff). Show preview if either side has any.\n const compositionsCount = Math.max(\n componentCompare?.compare?.model?.compositions?.length || 0,\n componentCompare?.base?.model?.compositions?.length || 0\n );\n\n const changedCode = data ? (data.code || []).filter((f) => f.status && f.status !== 'UNCHANGED').length : 0;\n const changedAspects = data ? (data.aspects || []).length : 0;\n const changedTests = data ? (data.tests || []).filter((f) => f.status && f.status !== 'UNCHANGED').length : 0;\n\n for (const id of registeredModeIds) {\n switch (id) {\n case 'code':\n acc.code = isNew ? 1 : changedCode;\n break;\n case 'config':\n acc.config = isNew ? 1 : changedAspects;\n break;\n case 'tests':\n acc.tests = isNew ? 0 : changedTests;\n break;\n case 'preview':\n acc.preview = compositionsCount;\n break;\n case 'dependencies':\n acc.dependencies = depChanges;\n break;\n case 'api':\n // Show when there are real changes, unresolved exports, OR a per-version schema gap\n // (so \"schema unavailable for this version\" is surfaced, not silently hidden). Stays\n // hidden for a plain computed no-op and for non-API components.\n acc.api = apiTabHasContent ? 1 : 0;\n break;\n default:\n acc[id] = 1;\n }\n }\n return acc;\n }, [loading, registeredModeIds, isNew, data, componentCompare, apiTabHasContent]);\n\n const componentId = compareId.split('@')[0];\n const fileRegistryVersion = fileRegistry?.getVersion();\n const sidebarFiles = useMemo<FileInfo[] | undefined>(() => {\n // The registry object is stable; its monotonic version invalidates this view-derived projection.\n void fileRegistryVersion;\n if (viewMode === 'code') return fileRegistry?.getFiles(componentId);\n if (viewMode === 'config') return fileRegistry?.getAspectFiles(componentId);\n if (viewMode === 'tests') {\n return (data?.tests || [])\n .filter((file) => file.status && file.status !== 'UNCHANGED')\n .map((file) => ({ name: file.fileName, status: file.status }));\n }\n if (viewMode === 'api') {\n return (apiDiffResult?.publicChanges || []).map((change) => ({\n name: change.exportName,\n status: apiChangeStatusToFileStatus(change.status),\n }));\n }\n return undefined;\n }, [viewMode, fileRegistry, fileRegistryVersion, componentId, data?.tests, apiDiffResult]);\n\n const sidebarGroups = useMemo<CompareSidebarGroup[]>(\n () => [\n {\n key: 'component',\n label: 'Component',\n items: [{ id: componentId, name, files: sidebarFiles }],\n },\n ],\n [componentId, name, sidebarFiles]\n );\n\n useEffect(() => {\n pendingScrollCleanupRef.current?.();\n pendingScrollCleanupRef.current = undefined;\n setSelectedId(undefined);\n setSelectedFile(undefined);\n }, [viewMode]);\n\n useEffect(\n () => () => {\n pendingScrollCleanupRef.current?.();\n },\n []\n );\n\n // If the active view has no content, fall back to the first view that does.\n useEffect(() => {\n if (loading) return;\n if ((counts[viewMode] ?? 0) === 0) {\n const first = COMPARE_VIEW_MODES.find((v) => (counts[v.id] ?? 0) > 0);\n if (first) setViewMode(first.id as ViewMode);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [counts, viewMode, loading]);\n\n // Render a skeleton until base, compare and the bulk diff are all loaded. We must not render the\n // toolbar early: its visible view modes are derived from the counts, so a half-loaded state would\n // show the wrong set (e.g. 5 modes) and then visibly collapse (to 2) once data arrives.\n if (loading) {\n return <CompareViewSkeleton />;\n }\n\n return (\n <DiffModeProvider mode={diffMode}>\n <DepsFilterProvider showAll={showAllDeps}>\n <CompareToolbar\n viewMode={viewMode}\n onViewModeChange={(v) => setViewMode(v as ViewMode)}\n endActions={\n <CompareToolbarActions\n viewMode={viewMode}\n diffMode={diffMode}\n onDiffModeChange={setDiffMode}\n depsShowAll={showAllDeps}\n onDepsShowAllChange={setShowAllDeps}\n />\n }\n viewModes={COMPARE_VIEW_MODES}\n counts={counts}\n showCounts={false}\n loading={loading}\n />\n\n <div className={styles.layout}>\n {viewMode !== 'dependencies' && (\n <CompareSidebar\n groups={sidebarGroups}\n selectedId={selectedId}\n selectedFile={selectedFile}\n defaultExpandFiles={\n viewMode === 'code' || viewMode === 'config' || viewMode === 'tests' || viewMode === 'api'\n }\n onSelect={(id, fileName) => {\n const nextId = id || undefined;\n setSelectedId(nextId);\n setSelectedFile(fileName);\n pendingScrollCleanupRef.current?.();\n pendingScrollCleanupRef.current = nextId\n ? scrollToCompareSelection(diffPaneRef.current, nextId, fileName)\n : undefined;\n }}\n />\n )}\n\n <div ref={diffPaneRef} className={styles.diffPane} data-view-mode={viewMode}>\n <InlineComponentCompare\n name={name}\n baseId={baseId}\n compareId={compareId}\n baseVersion={baseVersionShort}\n compareVersion={compareVersionShort}\n allTabs={resolvedTabs}\n host={host}\n // Hand the inner context our already-resolved pair: base = the scope's published snap,\n // compare = the live workspace component (with local changes). Without this the inner\n // context re-fetches by id and, in local-changes mode (compareId === baseId), would load\n // the same snap for both sides — making the deps/config/preview tabs show base vs base.\n baseOverride={componentCompare?.base as { model?: any; descriptor?: any } | undefined}\n compareOverride={componentCompare?.compare as { model?: any; descriptor?: any } | undefined}\n >\n {/* The API view isn't an inline tab — render it inside the inline context (so it sees the\n resolved base/compare pair) only while it's the active view, so its diff query fires\n on-demand. CSS hides the inline `[data-tab-id]` panels when `data-view-mode='api'`. */}\n {viewMode === 'api' ? apiTab : null}\n </InlineComponentCompare>\n </div>\n </div>\n </DepsFilterProvider>\n </DiffModeProvider>\n );\n}\n\nfunction scrollToCompareSelection(\n pane: HTMLDivElement | null,\n componentId: string,\n fileName?: string\n): (() => void) | undefined {\n if (!pane) return undefined;\n const selector = fileName\n ? `[data-file-id=\"${CSS.escape(componentId)}:${CSS.escape(fileName)}\"]`\n : `[data-component-id=\"${CSS.escape(componentId)}\"]`;\n\n let cancelled = false;\n let observer: MutationObserver | undefined;\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let frameId: number | undefined;\n let settleCleanup: (() => void) | undefined;\n\n const findAndScroll = () => {\n if (cancelled) return false;\n const element = pane.querySelector(selector);\n if (!element) return false;\n observer?.disconnect();\n if (timeoutId) clearTimeout(timeoutId);\n settleCleanup = scrollElementToPaneTop(pane, element);\n return true;\n };\n\n frameId = requestAnimationFrame(() => {\n if (findAndScroll()) return;\n observer = new MutationObserver(findAndScroll);\n observer.observe(pane, { childList: true, subtree: true });\n timeoutId = setTimeout(() => observer?.disconnect(), 5000);\n });\n\n return () => {\n cancelled = true;\n if (frameId !== undefined) cancelAnimationFrame(frameId);\n if (timeoutId) clearTimeout(timeoutId);\n observer?.disconnect();\n settleCleanup?.();\n };\n}\n\nfunction scrollElementToPaneTop(pane: HTMLDivElement, element: Element) {\n let frameId: number | undefined;\n let cancelled = false;\n let passes = 0;\n\n const settle = () => {\n if (cancelled || !pane.isConnected || !element.isConnected) return;\n const drift = element.getBoundingClientRect().top - pane.getBoundingClientRect().top;\n pane.scrollTo({ top: drift + pane.scrollTop, behavior: 'instant' });\n passes += 1;\n if (Math.abs(drift) > 2 && passes < 4) frameId = requestAnimationFrame(settle);\n };\n\n settle();\n return () => {\n cancelled = true;\n if (frameId !== undefined) cancelAnimationFrame(frameId);\n };\n}\n\nfunction CompareViewSkeleton() {\n return (\n <>\n <div className={styles.toolbarSkeleton}>\n {Array.from({ length: 4 }).map((_, i) => (\n <span key={i} className={styles.skelPill} />\n ))}\n </div>\n <div className={styles.diffPane}>\n <div className={styles.bodySkeleton}>\n <div className={styles.skelHeader} />\n {Array.from({ length: 8 }).map((_, i) => (\n <div key={i} className={styles.skelLine} style={{ width: `${45 + ((i * 7) % 45)}%` }} />\n ))}\n </div>\n </div>\n </>\n );\n}\n\nfunction inlineTabIdToViewMode(id?: string): ViewMode | undefined {\n switch (id) {\n case 'inline-code':\n return 'code';\n case 'inline-preview':\n return 'preview';\n case 'inline-docs':\n return 'docs';\n case 'inline-deps':\n return 'dependencies';\n case 'inline-tests':\n return 'tests';\n case 'inline-config':\n return 'config';\n default:\n return undefined;\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -21,6 +21,16 @@
21
21
  justify-content: center;
22
22
  }
23
23
 
24
+ .layout {
25
+ display: flex;
26
+ flex: 1 1 auto;
27
+ min-width: 0;
28
+ min-height: 0;
29
+ overflow: hidden;
30
+ container-type: inline-size;
31
+ container-name: component-compare-layout;
32
+ }
33
+
24
34
  @keyframes compareSkeletonShimmer {
25
35
  0% {
26
36
  background-position: 200% 0;
@@ -39,15 +39,15 @@ export declare class DiffCmd implements Command {
39
39
  additions: number;
40
40
  deletions: number;
41
41
  filePath: string;
42
- status: import("@teambit/legacy.component-diff/dist/components-diff").DiffStatus;
42
+ status: import("@teambit/legacy.component-diff/dist/components-diff.js").DiffStatus;
43
43
  diffOutput?: undefined;
44
44
  } | {
45
45
  filePath: string;
46
- status: import("@teambit/legacy.component-diff/dist/components-diff").DiffStatus;
46
+ status: import("@teambit/legacy.component-diff/dist/components-diff.js").DiffStatus;
47
47
  diffOutput?: undefined;
48
48
  } | {
49
49
  filePath: string;
50
- status: import("@teambit/legacy.component-diff/dist/components-diff").DiffStatus;
50
+ status: import("@teambit/legacy.component-diff/dist/components-diff.js").DiffStatus;
51
51
  diffOutput: string;
52
52
  })[] | undefined;
53
53
  fieldsDiff: import("@teambit/legacy.component-diff").FieldsDiff[] | null | undefined;
@@ -1,5 +1,5 @@
1
- import * as compositions_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad/teambit.component_component-compare@1.0.1166/dist/component-compare.compositions.js';
2
- import * as overview_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad/teambit.component_component-compare@1.0.1166/dist/component-compare.docs.mdx';
1
+ import * as compositions_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad/teambit.component_component-compare@1.0.1168/dist/component-compare.compositions.js';
2
+ import * as overview_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad/teambit.component_component-compare@1.0.1168/dist/component-compare.docs.mdx';
3
3
 
4
4
  export const compositions = [compositions_0];
5
5
  export const overview = [overview_0];
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@teambit/component-compare",
3
- "version": "1.0.1166",
3
+ "version": "1.0.1168",
4
4
  "homepage": "https://bit.cloud/teambit/component/component-compare",
5
5
  "main": "dist/index.js",
6
6
  "componentId": {
7
7
  "scope": "teambit.component",
8
8
  "name": "component-compare",
9
- "version": "1.0.1166"
9
+ "version": "1.0.1168"
10
10
  },
11
11
  "dependencies": {
12
12
  "p-map": "4.0.0",
@@ -16,41 +16,41 @@
16
16
  "lodash.flatten": "4.4.0",
17
17
  "chalk": "4.1.2",
18
18
  "@teambit/component.ui.component-compare.models.component-compare-change-type": "0.0.7",
19
- "@teambit/component.ui.component-compare.models.component-compare-props": "0.0.141",
20
19
  "@teambit/ui-foundation.ui.menu-widget-icon": "0.0.502",
21
- "@teambit/component.ui.component-compare.component-compare": "0.0.283",
22
- "@teambit/component.ui.component-compare.context": "0.0.136",
23
20
  "@teambit/component.ui.component-compare.hooks.use-component-compare-url": "0.0.13",
24
21
  "@teambit/component.ui.component-compare.utils.group-by-version": "0.0.8",
25
22
  "@teambit/component.ui.component-compare.utils.sort-logs": "0.0.8",
26
- "@teambit/component.ui.component-compare.version-picker": "0.0.264",
27
- "@teambit/dependencies.ui.deps-diff-table": "0.0.7",
28
23
  "@teambit/legacy-component-log": "0.0.432",
29
- "@teambit/semantics.ui.api-diff-view": "0.0.10",
30
24
  "@teambit/harmony": "0.4.12",
31
25
  "@teambit/bit-error": "0.0.404",
32
- "@teambit/component-id": "1.2.4",
33
- "@teambit/harmony.modules.concurrency": "0.0.45",
34
- "@teambit/component.ui.component-compare.changelog": "0.0.258",
35
- "@teambit/component.ui.component-compare.compare-aspects.compare-aspects": "0.0.155",
36
- "@teambit/ui-foundation.ui.react-router.slot-router": "0.0.531",
37
- "@teambit/legacy.constants": "0.0.44",
38
- "@teambit/component": "1.0.1166",
39
- "@teambit/graphql": "1.0.1166",
40
- "@teambit/builder": "1.0.1166",
41
26
  "@teambit/cache": "0.0.1485",
42
27
  "@teambit/cli": "0.0.1392",
43
- "@teambit/dependency-resolver": "1.0.1166",
44
- "@teambit/importer": "1.0.1166",
28
+ "@teambit/component-id": "1.2.4",
29
+ "@teambit/harmony.modules.concurrency": "0.0.45",
45
30
  "@teambit/legacy.component-diff": "0.0.219",
46
31
  "@teambit/legacy.consumer-component": "0.0.164",
47
32
  "@teambit/logger": "0.0.1485",
48
- "@teambit/objects": "0.0.673",
49
- "@teambit/schema": "1.0.1166",
50
- "@teambit/scope": "1.0.1166",
51
- "@teambit/tester": "1.0.1166",
52
- "@teambit/workspace": "1.0.1166",
53
- "@teambit/ui": "1.0.1166"
33
+ "@teambit/ui-foundation.ui.react-router.slot-router": "0.0.531",
34
+ "@teambit/legacy.constants": "0.0.44",
35
+ "@teambit/component.ui.component-compare.models.component-compare-props": "0.0.142",
36
+ "@teambit/component": "1.0.1168",
37
+ "@teambit/component.ui.component-compare.component-compare": "0.0.284",
38
+ "@teambit/component.ui.component-compare.context": "0.0.137",
39
+ "@teambit/component.ui.component-compare.version-picker": "0.0.265",
40
+ "@teambit/dependencies.ui.deps-diff-table": "0.0.8",
41
+ "@teambit/semantics.ui.api-diff-view": "0.0.11",
42
+ "@teambit/graphql": "1.0.1168",
43
+ "@teambit/builder": "1.0.1168",
44
+ "@teambit/dependency-resolver": "1.0.1168",
45
+ "@teambit/importer": "1.0.1168",
46
+ "@teambit/objects": "0.0.675",
47
+ "@teambit/schema": "1.0.1168",
48
+ "@teambit/scope": "1.0.1168",
49
+ "@teambit/tester": "1.0.1168",
50
+ "@teambit/workspace": "1.0.1168",
51
+ "@teambit/component.ui.component-compare.changelog": "0.0.259",
52
+ "@teambit/component.ui.component-compare.compare-aspects.compare-aspects": "0.0.156",
53
+ "@teambit/ui": "1.0.1168"
54
54
  },
55
55
  "devDependencies": {
56
56
  "@types/classnames": "^2.3.4",