@teambit/api-reference 1.0.1080 → 1.0.1081

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.
@@ -18,6 +18,13 @@ function _componentUiComponentCompare() {
18
18
  };
19
19
  return data;
20
20
  }
21
+ function _semanticsUi() {
22
+ const data = require("@teambit/semantics.ui.api-diff-view");
23
+ _semanticsUi = function () {
24
+ return data;
25
+ };
26
+ return data;
27
+ }
21
28
  function _apiCompareModule() {
22
29
  const data = _interopRequireDefault(require("./api-compare.module.scss"));
23
30
  _apiCompareModule = function () {
@@ -26,196 +33,66 @@ function _apiCompareModule() {
26
33
  return data;
27
34
  }
28
35
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
29
- function impactClass(impact) {
30
- switch (impact) {
31
- case 'BREAKING':
32
- return _apiCompareModule().default.removedBadge;
33
- case 'NON_BREAKING':
34
- return _apiCompareModule().default.addedBadge;
35
- case 'PATCH':
36
- return _apiCompareModule().default.modifiedBadge;
37
- default:
38
- return _apiCompareModule().default.summaryBadge;
39
- }
40
- }
41
- function impactLabel(impact) {
42
- switch (impact) {
43
- case 'BREAKING':
44
- return 'Breaking';
45
- case 'NON_BREAKING':
46
- return 'Non-breaking';
47
- case 'PATCH':
48
- return 'Patch';
49
- default:
50
- return impact;
51
- }
52
- }
53
- function getStatusClass(status) {
54
- switch (status) {
55
- case 'ADDED':
56
- return _apiCompareModule().default.statusAdded;
57
- case 'REMOVED':
58
- return _apiCompareModule().default.statusRemoved;
59
- case 'MODIFIED':
60
- return _apiCompareModule().default.statusModified;
61
- default:
62
- return _apiCompareModule().default.statusBadge;
63
- }
64
- }
65
- function getStatusLabel(status) {
66
- switch (status) {
67
- case 'ADDED':
68
- return '+ Added';
69
- case 'REMOVED':
70
- return '- Removed';
71
- case 'MODIFIED':
72
- return '~ Modified';
73
- default:
74
- return status;
75
- }
76
- }
77
- function dotClass(impact) {
78
- switch (impact) {
79
- case 'BREAKING':
80
- return _apiCompareModule().default.dotBreaking;
81
- case 'NON_BREAKING':
82
- return _apiCompareModule().default.dotNonBreaking;
83
- default:
84
- return _apiCompareModule().default.dotPatch;
85
- }
86
- }
87
- function DetailItem({
88
- detail
89
- }) {
90
- return /*#__PURE__*/_react().default.createElement("li", {
91
- className: _apiCompareModule().default.detailItem
92
- }, /*#__PURE__*/_react().default.createElement("span", {
93
- className: dotClass(detail.impact)
94
- }), /*#__PURE__*/_react().default.createElement("span", {
95
- className: _apiCompareModule().default.detailDescription
96
- }, detail.description));
97
- }
98
- function APIDiffEntry({
99
- change
100
- }) {
101
- const [expanded, setExpanded] = _react().default.useState(change.status === 'MODIFIED');
102
- const [showSignatures, setShowSignatures] = _react().default.useState(false);
103
- const hasBody = change.status === 'MODIFIED' ? change.changes && change.changes.length > 0 || change.baseSignature || change.compareSignature : change.baseSignature || change.compareSignature;
104
- return /*#__PURE__*/_react().default.createElement("div", {
105
- className: _apiCompareModule().default.diffEntry
106
- }, /*#__PURE__*/_react().default.createElement("div", {
107
- className: _apiCompareModule().default.diffEntryHeader,
108
- onClick: () => hasBody && setExpanded(!expanded),
109
- role: "button",
110
- tabIndex: 0,
111
- "aria-expanded": hasBody ? expanded : undefined,
112
- onKeyDown: e => {
113
- if (e.key === 'Enter' || e.key === ' ') {
114
- e.preventDefault();
115
- hasBody && setExpanded(!expanded);
116
- }
117
- }
118
- }, /*#__PURE__*/_react().default.createElement("span", {
119
- className: getStatusClass(change.status)
120
- }, getStatusLabel(change.status)), /*#__PURE__*/_react().default.createElement("span", {
121
- className: _apiCompareModule().default.exportName
122
- }, change.exportName), /*#__PURE__*/_react().default.createElement("span", {
123
- className: _apiCompareModule().default.schemaType
124
- }, change.schemaType), /*#__PURE__*/_react().default.createElement("span", {
125
- className: `${impactClass(change.impact)} ${_apiCompareModule().default.impactBadge}`
126
- }, impactLabel(change.impact)), hasBody && /*#__PURE__*/_react().default.createElement("span", {
127
- className: expanded ? _apiCompareModule().default.expandIconOpen : _apiCompareModule().default.expandIcon
128
- }, "\u25B6")), expanded && hasBody && /*#__PURE__*/_react().default.createElement("div", {
129
- className: _apiCompareModule().default.diffEntryBody
130
- }, change.status === 'MODIFIED' && change.changes && change.changes.length > 0 && /*#__PURE__*/_react().default.createElement("ul", {
131
- className: _apiCompareModule().default.detailsList
132
- }, change.changes.map((detail, i) => /*#__PURE__*/_react().default.createElement(DetailItem, {
133
- key: `${detail.changeKind}-${i}`,
134
- detail: detail
135
- }))), change.status === 'MODIFIED' && (change.baseSignature || change.compareSignature) && /*#__PURE__*/_react().default.createElement(_react().default.Fragment, null, /*#__PURE__*/_react().default.createElement("button", {
136
- className: _apiCompareModule().default.toggleSignatures,
137
- onClick: () => setShowSignatures(!showSignatures)
138
- }, showSignatures ? '▼ Hide signatures' : '▶ Show signatures'), showSignatures && /*#__PURE__*/_react().default.createElement(_react().default.Fragment, null, change.baseSignature && /*#__PURE__*/_react().default.createElement("div", null, /*#__PURE__*/_react().default.createElement("div", {
139
- className: _apiCompareModule().default.signatureLabel
140
- }, "Base"), /*#__PURE__*/_react().default.createElement("div", {
141
- className: _apiCompareModule().default.signatureRemoved
142
- }, change.baseSignature)), change.compareSignature && /*#__PURE__*/_react().default.createElement("div", null, /*#__PURE__*/_react().default.createElement("div", {
143
- className: _apiCompareModule().default.signatureLabel
144
- }, "Compare"), /*#__PURE__*/_react().default.createElement("div", {
145
- className: _apiCompareModule().default.signatureBlock
146
- }, change.compareSignature)))), change.status === 'ADDED' && change.compareSignature && /*#__PURE__*/_react().default.createElement("div", {
147
- className: _apiCompareModule().default.signatureBlock
148
- }, change.compareSignature), change.status === 'REMOVED' && change.baseSignature && /*#__PURE__*/_react().default.createElement("div", {
149
- className: _apiCompareModule().default.signatureRemoved
150
- }, change.baseSignature)));
151
- }
152
- function ChangeSection({
153
- title,
154
- changes
36
+ // single source of truth for the API diff model lives in api-diff-view.
37
+
38
+ /**
39
+ * the API tab of the single-component compare page. thin host around the same
40
+ * `ComponentApiDiffSection` the lane-compare API view uses — one implementation, two hosts.
41
+ * data comes from the compare context (fetched once by ComponentCompare).
42
+ */
43
+ function APICompare({
44
+ getInsights
155
45
  }) {
156
- if (changes.length === 0) return null;
157
- const sorted = [...changes].sort((a, b) => {
158
- const order = {
159
- REMOVED: 0,
160
- MODIFIED: 1,
161
- ADDED: 2
162
- };
163
- return (order[a.status] ?? 3) - (order[b.status] ?? 3);
164
- });
165
- return /*#__PURE__*/_react().default.createElement(_react().default.Fragment, null, /*#__PURE__*/_react().default.createElement("h3", {
166
- className: _apiCompareModule().default.sectionTitle
167
- }, title), /*#__PURE__*/_react().default.createElement("div", {
168
- className: _apiCompareModule().default.changeList
169
- }, sorted.map(change => /*#__PURE__*/_react().default.createElement(APIDiffEntry, {
170
- key: `${change.visibility}-${change.status}-${change.exportName}`,
171
- change: change
172
- }))));
173
- }
174
- function APICompare() {
175
46
  const compareContext = (0, _componentUiComponentCompare().useComponentCompare)();
176
- const apiDiffResult = compareContext?.apiDiffResult;
177
- if (apiDiffResult === undefined) {
178
- return /*#__PURE__*/_react().default.createElement("div", {
179
- className: _apiCompareModule().default.emptyState
180
- }, "Loading API diff...");
181
- }
182
- if (!apiDiffResult || !apiDiffResult.hasChanges) {
183
- return /*#__PURE__*/_react().default.createElement("div", {
184
- className: _apiCompareModule().default.emptyState
185
- }, "No API changes between these versions");
186
- }
47
+ const baseModel = compareContext?.base?.model;
48
+ const compareModel = compareContext?.compare?.model;
49
+
50
+ // Prefer a diff already on the context — the legacy `ComponentCompare` fetches it once and sets
51
+ // it there. The redesign single-component page does NOT put it on its inline context, so we fetch
52
+ // on our own. This hook is only mounted when the API view is the active tab (the page renders the
53
+ // element on-demand), so lane-compare — which renders one panel per component and never mounts
54
+ // this tab — pays nothing.
55
+ const contextApiDiff = compareContext?.apiDiffResult;
56
+ const shouldSelfFetch = contextApiDiff === undefined;
187
57
  const {
188
- publicChanges,
189
- internalChanges,
190
- added,
191
- removed,
192
- modified,
193
- breaking,
194
- impact
195
- } = apiDiffResult;
196
- return /*#__PURE__*/_react().default.createElement("div", {
197
- className: _apiCompareModule().default.apiCompareContainer
58
+ result: fetchedApiDiff
59
+ } = (0, _semanticsUi().useApiDiff)(baseModel?.id.toString(), compareModel?.id.toString(), {
60
+ skip: !shouldSelfFetch
61
+ });
62
+ const apiDiffResult = shouldSelfFetch ? fetchedApiDiff : contextApiDiff;
63
+
64
+ // memoized so the insights context value keeps a stable identity — otherwise a fresh array every
65
+ // render would re-render every `useApiDiffInsights` consumer (incl. the React.memo'd ApiChangeBlock).
66
+ const insights = _react().default.useMemo(() => getInsights?.(), [getInsights]);
67
+ if (!compareContext) return null;
68
+ const id = (compareModel || baseModel)?.id;
69
+ if (!id) return null;
70
+ const componentIdStr = id.toStringWithoutVersion();
71
+ const baseVersion = baseModel?.id.version;
72
+ const compareVersion = compareModel?.id.version;
73
+
74
+ // no base (first version) or identical versions — nothing to diff, not a failure.
75
+ const nothingToCompare = apiDiffResult === null && (!baseVersion || baseVersion === compareVersion);
76
+ return /*#__PURE__*/_react().default.createElement(_semanticsUi().ApiDiffInsightProvider, {
77
+ insights: insights
198
78
  }, /*#__PURE__*/_react().default.createElement("div", {
199
- className: _apiCompareModule().default.summary
200
- }, /*#__PURE__*/_react().default.createElement("span", {
201
- className: impactClass(impact)
202
- }, impactLabel(impact)), /*#__PURE__*/_react().default.createElement("span", {
203
- className: _apiCompareModule().default.summaryDivider
204
- }, "|"), added > 0 && /*#__PURE__*/_react().default.createElement("span", {
205
- className: _apiCompareModule().default.addedBadge
206
- }, "+", added, " added"), removed > 0 && /*#__PURE__*/_react().default.createElement("span", {
207
- className: _apiCompareModule().default.removedBadge
208
- }, "-", removed, " removed"), modified > 0 && /*#__PURE__*/_react().default.createElement("span", {
209
- className: _apiCompareModule().default.modifiedBadge
210
- }, "~", modified, " modified"), breaking > 0 && /*#__PURE__*/_react().default.createElement("span", {
211
- className: _apiCompareModule().default.removedBadge
212
- }, breaking, " breaking")), /*#__PURE__*/_react().default.createElement(ChangeSection, {
213
- title: "Public API",
214
- changes: publicChanges
215
- }), /*#__PURE__*/_react().default.createElement(ChangeSection, {
216
- title: "Internal (non-exported)",
217
- changes: internalChanges
218
- }));
79
+ className: _apiCompareModule().default.apiCompareContainer
80
+ }, nothingToCompare ? /*#__PURE__*/_react().default.createElement(_semanticsUi().ApiDiffSlimRow, {
81
+ componentIdStr: componentIdStr,
82
+ displayName: id.fullName,
83
+ chip: "nothing to compare",
84
+ detail: baseVersion ? 'both sides are the same version' : 'no base version to compare against',
85
+ tone: "ok"
86
+ }) : /*#__PURE__*/_react().default.createElement(_semanticsUi().ComponentApiDiffSection, {
87
+ componentIdStr: componentIdStr,
88
+ displayName: id.fullName,
89
+ baseId: baseModel?.id.toString(),
90
+ compareId: compareModel?.id.toString(),
91
+ baseVersion: baseVersion,
92
+ compareVersion: compareVersion,
93
+ result: apiDiffResult,
94
+ loading: apiDiffResult === undefined
95
+ })));
219
96
  }
220
97
 
221
98
  //# sourceMappingURL=api-compare.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_react","data","_interopRequireDefault","require","_componentUiComponentCompare","_apiCompareModule","e","__esModule","default","impactClass","impact","styles","removedBadge","addedBadge","modifiedBadge","summaryBadge","impactLabel","getStatusClass","status","statusAdded","statusRemoved","statusModified","statusBadge","getStatusLabel","dotClass","dotBreaking","dotNonBreaking","dotPatch","DetailItem","detail","createElement","className","detailItem","detailDescription","description","APIDiffEntry","change","expanded","setExpanded","React","useState","showSignatures","setShowSignatures","hasBody","changes","length","baseSignature","compareSignature","diffEntry","diffEntryHeader","onClick","role","tabIndex","undefined","onKeyDown","key","preventDefault","exportName","schemaType","impactBadge","expandIconOpen","expandIcon","diffEntryBody","detailsList","map","i","changeKind","Fragment","toggleSignatures","signatureLabel","signatureRemoved","signatureBlock","ChangeSection","title","sorted","sort","a","b","order","REMOVED","MODIFIED","ADDED","sectionTitle","changeList","visibility","APICompare","compareContext","useComponentCompare","apiDiffResult","emptyState","hasChanges","publicChanges","internalChanges","added","removed","modified","breaking","apiCompareContainer","summary","summaryDivider"],"sources":["api-compare.tsx"],"sourcesContent":["import React from 'react';\nimport { useComponentCompare } from '@teambit/component.ui.component-compare.context';\nimport type { APIDiffResult, APIDiffChange, APIDiffDetail } from './api-compare.types';\nimport styles from './api-compare.module.scss';\n\nexport type { APIDiffResult, APIDiffChange, APIDiffDetail };\n\nfunction impactClass(impact: string): string {\n switch (impact) {\n case 'BREAKING':\n return styles.removedBadge;\n case 'NON_BREAKING':\n return styles.addedBadge;\n case 'PATCH':\n return styles.modifiedBadge;\n default:\n return styles.summaryBadge;\n }\n}\n\nfunction impactLabel(impact: string): string {\n switch (impact) {\n case 'BREAKING':\n return 'Breaking';\n case 'NON_BREAKING':\n return 'Non-breaking';\n case 'PATCH':\n return 'Patch';\n default:\n return impact;\n }\n}\n\nfunction getStatusClass(status: string): string {\n switch (status) {\n case 'ADDED':\n return styles.statusAdded;\n case 'REMOVED':\n return styles.statusRemoved;\n case 'MODIFIED':\n return styles.statusModified;\n default:\n return styles.statusBadge;\n }\n}\n\nfunction getStatusLabel(status: string): string {\n switch (status) {\n case 'ADDED':\n return '+ Added';\n case 'REMOVED':\n return '- Removed';\n case 'MODIFIED':\n return '~ Modified';\n default:\n return status;\n }\n}\n\nfunction dotClass(impact: string): string {\n switch (impact) {\n case 'BREAKING':\n return styles.dotBreaking;\n case 'NON_BREAKING':\n return styles.dotNonBreaking;\n default:\n return styles.dotPatch;\n }\n}\n\nfunction DetailItem({ detail }: { detail: APIDiffDetail }) {\n return (\n <li className={styles.detailItem}>\n <span className={dotClass(detail.impact)} />\n <span className={styles.detailDescription}>{detail.description}</span>\n </li>\n );\n}\n\nfunction APIDiffEntry({ change }: { change: APIDiffChange }) {\n const [expanded, setExpanded] = React.useState(change.status === 'MODIFIED');\n const [showSignatures, setShowSignatures] = React.useState(false);\n\n const hasBody =\n change.status === 'MODIFIED'\n ? (change.changes && change.changes.length > 0) || change.baseSignature || change.compareSignature\n : change.baseSignature || change.compareSignature;\n\n return (\n <div className={styles.diffEntry}>\n <div\n className={styles.diffEntryHeader}\n onClick={() => hasBody && setExpanded(!expanded)}\n role=\"button\"\n tabIndex={0}\n aria-expanded={hasBody ? expanded : undefined}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n hasBody && setExpanded(!expanded);\n }\n }}\n >\n <span className={getStatusClass(change.status)}>{getStatusLabel(change.status)}</span>\n <span className={styles.exportName}>{change.exportName}</span>\n <span className={styles.schemaType}>{change.schemaType}</span>\n <span className={`${impactClass(change.impact)} ${styles.impactBadge}`}>{impactLabel(change.impact)}</span>\n {hasBody && <span className={expanded ? styles.expandIconOpen : styles.expandIcon}>▶</span>}\n </div>\n {expanded && hasBody && (\n <div className={styles.diffEntryBody}>\n {change.status === 'MODIFIED' && change.changes && change.changes.length > 0 && (\n <ul className={styles.detailsList}>\n {change.changes.map((detail, i) => (\n <DetailItem key={`${detail.changeKind}-${i}`} detail={detail} />\n ))}\n </ul>\n )}\n {change.status === 'MODIFIED' && (change.baseSignature || change.compareSignature) && (\n <>\n <button className={styles.toggleSignatures} onClick={() => setShowSignatures(!showSignatures)}>\n {showSignatures ? '▼ Hide signatures' : '▶ Show signatures'}\n </button>\n {showSignatures && (\n <>\n {change.baseSignature && (\n <div>\n <div className={styles.signatureLabel}>Base</div>\n <div className={styles.signatureRemoved}>{change.baseSignature}</div>\n </div>\n )}\n {change.compareSignature && (\n <div>\n <div className={styles.signatureLabel}>Compare</div>\n <div className={styles.signatureBlock}>{change.compareSignature}</div>\n </div>\n )}\n </>\n )}\n </>\n )}\n {change.status === 'ADDED' && change.compareSignature && (\n <div className={styles.signatureBlock}>{change.compareSignature}</div>\n )}\n {change.status === 'REMOVED' && change.baseSignature && (\n <div className={styles.signatureRemoved}>{change.baseSignature}</div>\n )}\n </div>\n )}\n </div>\n );\n}\n\nfunction ChangeSection({ title, changes }: { title: string; changes: APIDiffChange[] }) {\n if (changes.length === 0) return null;\n\n const sorted = [...changes].sort((a, b) => {\n const order: Record<string, number> = { REMOVED: 0, MODIFIED: 1, ADDED: 2 };\n return (order[a.status] ?? 3) - (order[b.status] ?? 3);\n });\n\n return (\n <>\n <h3 className={styles.sectionTitle}>{title}</h3>\n <div className={styles.changeList}>\n {sorted.map((change) => (\n <APIDiffEntry key={`${change.visibility}-${change.status}-${change.exportName}`} change={change} />\n ))}\n </div>\n </>\n );\n}\n\nexport function APICompare() {\n const compareContext = useComponentCompare();\n const apiDiffResult: APIDiffResult | null | undefined = (compareContext as any)?.apiDiffResult;\n\n if (apiDiffResult === undefined) {\n return <div className={styles.emptyState}>Loading API diff...</div>;\n }\n\n if (!apiDiffResult || !apiDiffResult.hasChanges) {\n return <div className={styles.emptyState}>No API changes between these versions</div>;\n }\n\n const { publicChanges, internalChanges, added, removed, modified, breaking, impact } = apiDiffResult;\n\n return (\n <div className={styles.apiCompareContainer}>\n <div className={styles.summary}>\n <span className={impactClass(impact)}>{impactLabel(impact)}</span>\n <span className={styles.summaryDivider}>|</span>\n {added > 0 && <span className={styles.addedBadge}>+{added} added</span>}\n {removed > 0 && <span className={styles.removedBadge}>-{removed} removed</span>}\n {modified > 0 && <span className={styles.modifiedBadge}>~{modified} modified</span>}\n {breaking > 0 && <span className={styles.removedBadge}>{breaking} breaking</span>}\n </div>\n <ChangeSection title=\"Public API\" changes={publicChanges} />\n <ChangeSection title=\"Internal (non-exported)\" changes={internalChanges} />\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_react","data","_interopRequireDefault","require","_componentUiComponentCompare","_semanticsUi","_apiCompareModule","e","__esModule","default","APICompare","getInsights","compareContext","useComponentCompare","baseModel","base","model","compareModel","compare","contextApiDiff","apiDiffResult","shouldSelfFetch","undefined","result","fetchedApiDiff","useApiDiff","id","toString","skip","insights","React","useMemo","componentIdStr","toStringWithoutVersion","baseVersion","version","compareVersion","nothingToCompare","createElement","ApiDiffInsightProvider","className","styles","apiCompareContainer","ApiDiffSlimRow","displayName","fullName","chip","detail","tone","ComponentApiDiffSection","baseId","compareId","loading"],"sources":["api-compare.tsx"],"sourcesContent":["import React from 'react';\nimport { useComponentCompare } from '@teambit/component.ui.component-compare.context';\nimport {\n ComponentApiDiffSection,\n ApiDiffSlimRow,\n ApiDiffInsightProvider,\n useApiDiff,\n} from '@teambit/semantics.ui.api-diff-view';\nimport type { ApiDiffInsight } from '@teambit/semantics.ui.api-diff-view';\nimport styles from './api-compare.module.scss';\n\n// single source of truth for the API diff model lives in api-diff-view.\nexport type { APIDiffResult, APIDiffChange, APIDiffDetail } from '@teambit/semantics.ui.api-diff-view';\n\nexport type APICompareProps = {\n /** resolved lazily at render time — slot registrations can land after the section is constructed */\n getInsights?: () => ApiDiffInsight[];\n};\n\n/**\n * the API tab of the single-component compare page. thin host around the same\n * `ComponentApiDiffSection` the lane-compare API view uses — one implementation, two hosts.\n * data comes from the compare context (fetched once by ComponentCompare).\n */\nexport function APICompare({ getInsights }: APICompareProps) {\n const compareContext = useComponentCompare();\n const baseModel = compareContext?.base?.model;\n const compareModel = compareContext?.compare?.model;\n\n // Prefer a diff already on the context — the legacy `ComponentCompare` fetches it once and sets\n // it there. The redesign single-component page does NOT put it on its inline context, so we fetch\n // on our own. This hook is only mounted when the API view is the active tab (the page renders the\n // element on-demand), so lane-compare — which renders one panel per component and never mounts\n // this tab — pays nothing.\n const contextApiDiff = compareContext?.apiDiffResult;\n const shouldSelfFetch = contextApiDiff === undefined;\n const { result: fetchedApiDiff } = useApiDiff(baseModel?.id.toString(), compareModel?.id.toString(), {\n skip: !shouldSelfFetch,\n });\n const apiDiffResult = shouldSelfFetch ? fetchedApiDiff : contextApiDiff;\n\n // memoized so the insights context value keeps a stable identity — otherwise a fresh array every\n // render would re-render every `useApiDiffInsights` consumer (incl. the React.memo'd ApiChangeBlock).\n const insights = React.useMemo(() => getInsights?.(), [getInsights]);\n\n if (!compareContext) return null;\n\n const id = (compareModel || baseModel)?.id;\n if (!id) return null;\n\n const componentIdStr = id.toStringWithoutVersion();\n const baseVersion = baseModel?.id.version;\n const compareVersion = compareModel?.id.version;\n\n // no base (first version) or identical versions — nothing to diff, not a failure.\n const nothingToCompare = apiDiffResult === null && (!baseVersion || baseVersion === compareVersion);\n\n return (\n <ApiDiffInsightProvider insights={insights}>\n <div className={styles.apiCompareContainer}>\n {nothingToCompare ? (\n <ApiDiffSlimRow\n componentIdStr={componentIdStr}\n displayName={id.fullName}\n chip=\"nothing to compare\"\n detail={baseVersion ? 'both sides are the same version' : 'no base version to compare against'}\n tone=\"ok\"\n />\n ) : (\n <ComponentApiDiffSection\n componentIdStr={componentIdStr}\n displayName={id.fullName}\n baseId={baseModel?.id.toString()}\n compareId={compareModel?.id.toString()}\n baseVersion={baseVersion}\n compareVersion={compareVersion}\n result={apiDiffResult}\n loading={apiDiffResult === undefined}\n />\n )}\n </div>\n </ApiDiffInsightProvider>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -3,248 +3,6 @@
3
3
  flex-direction: column;
4
4
  height: 100%;
5
5
  overflow: auto;
6
- padding: 24px;
7
- gap: 16px;
8
- }
9
-
10
- .summary {
11
- display: flex;
12
- gap: 12px;
13
- align-items: center;
14
- padding: 12px 16px;
15
- background: var(--bit-bg-dent, #f6f6f6);
16
- border-radius: 8px;
17
- font-size: 13px;
18
- }
19
-
20
- .summaryDivider {
21
- opacity: 0.3;
22
- color: var(--bit-text-color-light, #6c707c);
23
- }
24
-
25
- .summaryBadge {
26
- display: inline-flex;
27
- align-items: center;
28
- gap: 4px;
29
- padding: 3px 10px;
30
- border-radius: 12px;
31
- font-weight: 500;
32
- font-size: 12px;
33
- white-space: nowrap;
34
- }
35
-
36
- .addedBadge {
37
- composes: summaryBadge;
38
- background: color-mix(in srgb, var(--bit-color-added, #2ea043) 15%, transparent);
39
- color: var(--bit-color-added, #2ea043);
40
- }
41
-
42
- .removedBadge {
43
- composes: summaryBadge;
44
- background: color-mix(in srgb, var(--bit-color-removed, #f85149) 15%, transparent);
45
- color: var(--bit-color-removed, #f85149);
46
- }
47
-
48
- .modifiedBadge {
49
- composes: summaryBadge;
50
- background: color-mix(in srgb, var(--bit-color-modified, #d29922) 15%, transparent);
51
- color: var(--bit-color-modified, #d29922);
52
- }
53
-
54
- .changeList {
55
- display: flex;
56
- flex-direction: column;
57
- gap: 8px;
58
- }
59
-
60
- .sectionTitle {
61
- margin: 16px 0 8px;
62
- font-size: 12px;
63
- font-weight: 600;
64
- text-transform: uppercase;
65
- letter-spacing: 0.5px;
66
- color: var(--bit-text-color-light, #6c707c);
67
- }
68
-
69
- .diffEntry {
70
- border: 1px solid var(--bit-border-color-lightest, #ededed);
71
- border-radius: 8px;
72
- overflow: hidden;
73
- }
74
-
75
- .diffEntryHeader {
76
- display: flex;
77
- align-items: center;
78
- gap: 10px;
79
- padding: 10px 16px;
80
- cursor: pointer;
81
- user-select: none;
82
-
83
- &:hover {
84
- background: var(--bit-bg-dent, #f6f6f6);
85
- }
86
- }
87
-
88
- .statusBadge {
89
- display: inline-flex;
90
- align-items: center;
91
- padding: 2px 8px;
92
- border-radius: 4px;
93
- font-weight: 600;
94
- font-size: 11px;
95
- text-transform: uppercase;
96
- letter-spacing: 0.3px;
97
- flex-shrink: 0;
98
- white-space: nowrap;
99
- }
100
-
101
- .statusAdded {
102
- composes: statusBadge;
103
- background: color-mix(in srgb, var(--bit-color-added, #2ea043) 15%, transparent);
104
- color: var(--bit-color-added, #2ea043);
105
- }
106
-
107
- .statusRemoved {
108
- composes: statusBadge;
109
- background: color-mix(in srgb, var(--bit-color-removed, #f85149) 15%, transparent);
110
- color: var(--bit-color-removed, #f85149);
111
- }
112
-
113
- .statusModified {
114
- composes: statusBadge;
115
- background: color-mix(in srgb, var(--bit-color-modified, #d29922) 15%, transparent);
116
- color: var(--bit-color-modified, #d29922);
117
- }
118
-
119
- .exportName {
120
- font-weight: 600;
121
- font-size: 14px;
122
- font-family: var(--bit-font-mono, monospace);
123
- color: var(--bit-text-color-heavy, #2b2b2b);
124
- }
125
-
126
- .schemaType {
127
- color: var(--bit-text-color-light, #6c707c);
128
- font-size: 12px;
129
- }
130
-
131
- .impactBadge {
132
- composes: summaryBadge;
133
- margin-left: auto;
134
- font-size: 11px;
135
- }
136
-
137
- .expandIcon {
138
- color: var(--bit-text-color-light, #6c707c);
139
- font-size: 10px;
140
- transition: transform 0.2s;
141
- flex-shrink: 0;
142
- }
143
-
144
- .expandIconOpen {
145
- composes: expandIcon;
146
- transform: rotate(90deg);
147
- }
148
-
149
- .diffEntryBody {
150
- padding: 0 16px 16px;
151
- border-top: 1px solid var(--bit-border-color-lightest, #ededed);
152
- }
153
-
154
- .detailsList {
155
- list-style: none;
156
- padding: 12px 0 0;
157
- margin: 0;
158
- display: flex;
159
- flex-direction: column;
160
- gap: 8px;
161
- }
162
-
163
- .detailItem {
164
- display: flex;
165
- align-items: flex-start;
166
- gap: 8px;
167
- font-size: 13px;
168
- line-height: 1.5;
169
- color: var(--bit-text-color-heavy, #2b2b2b);
170
- }
171
-
172
- .detailDot {
173
- width: 7px;
174
- height: 7px;
175
- min-width: 7px;
176
- border-radius: 50%;
177
- margin-top: 6px;
178
- flex-shrink: 0;
179
- }
180
-
181
- .dotBreaking {
182
- composes: detailDot;
183
- background: var(--bit-color-removed, #f85149);
184
- }
185
-
186
- .dotNonBreaking {
187
- composes: detailDot;
188
- background: var(--bit-color-added, #2ea043);
189
- }
190
-
191
- .dotPatch {
192
- composes: detailDot;
193
- background: var(--bit-color-modified, #d29922);
194
- }
195
-
196
- .detailDescription {
197
- color: var(--bit-text-color-heavy, #2b2b2b);
198
- }
199
-
200
- .signatureBlock {
201
- margin-top: 12px;
202
- padding: 12px;
203
- background: var(--bit-bg-dent, #f6f6f6);
204
- border-radius: 6px;
205
- font-family: var(--bit-font-mono, monospace);
206
- font-size: 12px;
207
- white-space: pre-wrap;
208
- word-break: break-word;
209
- line-height: 1.6;
210
- color: var(--bit-text-color-heavy, #2b2b2b);
211
- }
212
-
213
- .signatureLabel {
214
- font-weight: 600;
215
- color: var(--bit-text-color-light, #6c707c);
216
- margin-top: 12px;
217
- margin-bottom: 4px;
218
- font-size: 11px;
219
- text-transform: uppercase;
220
- letter-spacing: 0.5px;
221
- }
222
-
223
- .signatureRemoved {
224
- composes: signatureBlock;
225
- text-decoration: line-through;
226
- opacity: 0.6;
227
- }
228
-
229
- .emptyState {
230
- display: flex;
231
- align-items: center;
232
- justify-content: center;
233
- height: 100%;
234
- color: var(--bit-text-color-light, #6c707c);
235
- font-size: 14px;
236
- }
237
-
238
- .toggleSignatures {
239
- background: none;
240
- border: none;
241
- color: var(--bit-accent-color, #0366d6);
242
- font-size: 12px;
243
- cursor: pointer;
244
- padding: 4px 0;
245
- margin-top: 12px;
246
-
247
- &:hover {
248
- text-decoration: underline;
249
- }
6
+ padding: 16px 24px;
7
+ max-width: 980px;
250
8
  }
@@ -2,7 +2,13 @@ import React from 'react';
2
2
  import type { Section } from '@teambit/component';
3
3
  import type { TabItem } from '@teambit/component.ui.component-compare.models.component-compare-props';
4
4
  import type { ChangeType } from '@teambit/component.ui.component-compare.models.component-compare-change-type';
5
+ import type { ApiDiffInsight } from '@teambit/semantics.ui.api-diff-view';
5
6
  export declare class APICompareSection implements TabItem, Section {
7
+ route: {
8
+ path: string;
9
+ element: React.ReactNode;
10
+ };
11
+ constructor(getInsights?: () => ApiDiffInsight[]);
6
12
  navigationLink: {
7
13
  href: string;
8
14
  children: string;
@@ -11,10 +17,6 @@ export declare class APICompareSection implements TabItem, Section {
11
17
  href: string;
12
18
  children: string;
13
19
  };
14
- route: {
15
- path: string;
16
- element: React.JSX.Element;
17
- };
18
20
  order: number;
19
21
  changeType: ChangeType;
20
22
  id: string;
@@ -25,19 +25,24 @@ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e =
25
25
  // Use string cast since the external ChangeType enum doesn't have API yet
26
26
  const ChangeTypeAPI = 'API';
27
27
  class APICompareSection {
28
- constructor() {
28
+ constructor(getInsights) {
29
+ _defineProperty(this, "route", void 0);
29
30
  _defineProperty(this, "navigationLink", {
30
31
  href: 'api',
31
32
  children: 'API'
32
33
  });
33
34
  _defineProperty(this, "props", this.navigationLink);
34
- _defineProperty(this, "route", {
35
- path: 'api/*',
36
- element: /*#__PURE__*/_react().default.createElement(_apiCompare().APICompare, null)
37
- });
38
35
  _defineProperty(this, "order", 15);
39
36
  _defineProperty(this, "changeType", ChangeTypeAPI);
40
37
  _defineProperty(this, "id", 'api');
38
+ // built in the constructor (not a field initializer) so the element captures the
39
+ // getter regardless of class-field initialization order.
40
+ this.route = {
41
+ path: 'api/*',
42
+ element: /*#__PURE__*/_react().default.createElement(_apiCompare().APICompare, {
43
+ getInsights: getInsights
44
+ })
45
+ };
41
46
  }
42
47
  }
43
48
  exports.APICompareSection = APICompareSection;
@@ -1 +1 @@
1
- {"version":3,"names":["_react","data","_interopRequireDefault","require","_apiCompare","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","ChangeTypeAPI","APICompareSection","constructor","href","children","navigationLink","path","element","createElement","APICompare","exports"],"sources":["api-compare.section.tsx"],"sourcesContent":["import React from 'react';\nimport type { Section } from '@teambit/component';\nimport type { TabItem } from '@teambit/component.ui.component-compare.models.component-compare-props';\nimport type { ChangeType } from '@teambit/component.ui.component-compare.models.component-compare-change-type';\nimport { APICompare } from './api-compare';\n\n// Use string cast since the external ChangeType enum doesn't have API yet\nconst ChangeTypeAPI = 'API' as unknown as ChangeType;\n\nexport class APICompareSection implements TabItem, Section {\n navigationLink = {\n href: 'api',\n children: 'API',\n };\n\n props = this.navigationLink;\n\n route = {\n path: 'api/*',\n element: <APICompare />,\n };\n\n order = 15;\n changeType = ChangeTypeAPI;\n id = 'api';\n}\n"],"mappings":";;;;;;AAAA,SAAAA,OAAA;EAAA,MAAAC,IAAA,GAAAC,sBAAA,CAAAC,OAAA;EAAAH,MAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAIA,SAAAG,YAAA;EAAA,MAAAH,IAAA,GAAAE,OAAA;EAAAC,WAAA,YAAAA,CAAA;IAAA,OAAAH,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAA2C,SAAAC,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAAA,SAAAG,gBAAAH,CAAA,EAAAI,CAAA,EAAAC,CAAA,YAAAD,CAAA,GAAAE,cAAA,CAAAF,CAAA,MAAAJ,CAAA,GAAAO,MAAA,CAAAC,cAAA,CAAAR,CAAA,EAAAI,CAAA,IAAAK,KAAA,EAAAJ,CAAA,EAAAK,UAAA,MAAAC,YAAA,MAAAC,QAAA,UAAAZ,CAAA,CAAAI,CAAA,IAAAC,CAAA,EAAAL,CAAA;AAAA,SAAAM,eAAAD,CAAA,QAAAQ,CAAA,GAAAC,YAAA,CAAAT,CAAA,uCAAAQ,CAAA,GAAAA,CAAA,GAAAA,CAAA;AAAA,SAAAC,aAAAT,CAAA,EAAAD,CAAA,2BAAAC,CAAA,KAAAA,CAAA,SAAAA,CAAA,MAAAL,CAAA,GAAAK,CAAA,CAAAU,MAAA,CAAAC,WAAA,kBAAAhB,CAAA,QAAAa,CAAA,GAAAb,CAAA,CAAAiB,IAAA,CAAAZ,CAAA,EAAAD,CAAA,uCAAAS,CAAA,SAAAA,CAAA,YAAAK,SAAA,yEAAAd,CAAA,GAAAe,MAAA,GAAAC,MAAA,EAAAf,CAAA;AAE3C;AACA,MAAMgB,aAAa,GAAG,KAA8B;AAE7C,MAAMC,iBAAiB,CAA6B;EAAAC,YAAA;IAAApB,eAAA,yBACxC;MACfqB,IAAI,EAAE,KAAK;MACXC,QAAQ,EAAE;IACZ,CAAC;IAAAtB,eAAA,gBAEO,IAAI,CAACuB,cAAc;IAAAvB,eAAA,gBAEnB;MACNwB,IAAI,EAAE,OAAO;MACbC,OAAO,eAAEjC,MAAA,GAAAO,OAAA,CAAA2B,aAAA,CAAC9B,WAAA,GAAA+B,UAAU,MAAE;IACxB,CAAC;IAAA3B,eAAA,gBAEO,EAAE;IAAAA,eAAA,qBACGkB,aAAa;IAAAlB,eAAA,aACrB,KAAK;EAAA;AACZ;AAAC4B,OAAA,CAAAT,iBAAA,GAAAA,iBAAA","ignoreList":[]}
1
+ {"version":3,"names":["_react","data","_interopRequireDefault","require","_apiCompare","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","ChangeTypeAPI","APICompareSection","constructor","getInsights","href","children","navigationLink","route","path","element","createElement","APICompare","exports"],"sources":["api-compare.section.tsx"],"sourcesContent":["import React from 'react';\nimport type { Section } from '@teambit/component';\nimport type { TabItem } from '@teambit/component.ui.component-compare.models.component-compare-props';\nimport type { ChangeType } from '@teambit/component.ui.component-compare.models.component-compare-change-type';\nimport type { ApiDiffInsight } from '@teambit/semantics.ui.api-diff-view';\nimport { APICompare } from './api-compare';\n\n// Use string cast since the external ChangeType enum doesn't have API yet\nconst ChangeTypeAPI = 'API' as unknown as ChangeType;\n\nexport class APICompareSection implements TabItem, Section {\n route: { path: string; element: React.ReactNode };\n\n constructor(getInsights?: () => ApiDiffInsight[]) {\n // built in the constructor (not a field initializer) so the element captures the\n // getter regardless of class-field initialization order.\n this.route = {\n path: 'api/*',\n element: <APICompare getInsights={getInsights} />,\n };\n }\n\n navigationLink = {\n href: 'api',\n children: 'API',\n };\n\n props = this.navigationLink;\n\n order = 15;\n changeType = ChangeTypeAPI;\n id = 'api';\n}\n"],"mappings":";;;;;;AAAA,SAAAA,OAAA;EAAA,MAAAC,IAAA,GAAAC,sBAAA,CAAAC,OAAA;EAAAH,MAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAKA,SAAAG,YAAA;EAAA,MAAAH,IAAA,GAAAE,OAAA;EAAAC,WAAA,YAAAA,CAAA;IAAA,OAAAH,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAA2C,SAAAC,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAAA,SAAAG,gBAAAH,CAAA,EAAAI,CAAA,EAAAC,CAAA,YAAAD,CAAA,GAAAE,cAAA,CAAAF,CAAA,MAAAJ,CAAA,GAAAO,MAAA,CAAAC,cAAA,CAAAR,CAAA,EAAAI,CAAA,IAAAK,KAAA,EAAAJ,CAAA,EAAAK,UAAA,MAAAC,YAAA,MAAAC,QAAA,UAAAZ,CAAA,CAAAI,CAAA,IAAAC,CAAA,EAAAL,CAAA;AAAA,SAAAM,eAAAD,CAAA,QAAAQ,CAAA,GAAAC,YAAA,CAAAT,CAAA,uCAAAQ,CAAA,GAAAA,CAAA,GAAAA,CAAA;AAAA,SAAAC,aAAAT,CAAA,EAAAD,CAAA,2BAAAC,CAAA,KAAAA,CAAA,SAAAA,CAAA,MAAAL,CAAA,GAAAK,CAAA,CAAAU,MAAA,CAAAC,WAAA,kBAAAhB,CAAA,QAAAa,CAAA,GAAAb,CAAA,CAAAiB,IAAA,CAAAZ,CAAA,EAAAD,CAAA,uCAAAS,CAAA,SAAAA,CAAA,YAAAK,SAAA,yEAAAd,CAAA,GAAAe,MAAA,GAAAC,MAAA,EAAAf,CAAA;AAE3C;AACA,MAAMgB,aAAa,GAAG,KAA8B;AAE7C,MAAMC,iBAAiB,CAA6B;EAGzDC,WAAWA,CAACC,WAAoC,EAAE;IAAArB,eAAA;IAAAA,eAAA,yBASjC;MACfsB,IAAI,EAAE,KAAK;MACXC,QAAQ,EAAE;IACZ,CAAC;IAAAvB,eAAA,gBAEO,IAAI,CAACwB,cAAc;IAAAxB,eAAA,gBAEnB,EAAE;IAAAA,eAAA,qBACGkB,aAAa;IAAAlB,eAAA,aACrB,KAAK;IAjBR;IACA;IACA,IAAI,CAACyB,KAAK,GAAG;MACXC,IAAI,EAAE,OAAO;MACbC,OAAO,eAAEnC,MAAA,GAAAO,OAAA,CAAA6B,aAAA,CAAChC,WAAA,GAAAiC,UAAU;QAACR,WAAW,EAAEA;MAAY,CAAE;IAClD,CAAC;EACH;AAYF;AAACS,OAAA,CAAAX,iBAAA,GAAAA,iBAAA","ignoreList":[]}
@@ -171,8 +171,9 @@ class APIReferenceUI {
171
171
  // register all default schema classes
172
172
  apiReferenceUI.registerSchemaClasses(() => Object.values(_semanticsEntities().Schemas));
173
173
 
174
- // register API compare tab in component compare
175
- const apiCompareSection = new (_apiCompare().APICompareSection)();
174
+ // register API compare tab in component compare. insights are resolved lazily —
175
+ // aspects can register them on componentCompareUI after this provider runs.
176
+ const apiCompareSection = new (_apiCompare().APICompareSection)(() => componentCompareUI.getApiDiffInsights());
176
177
  componentCompareUI.registerNavigation(apiCompareSection);
177
178
  componentCompareUI.registerRoutes([apiCompareSection.route]);
178
179
  return apiReferenceUI;