@teambit/component 0.0.593 → 0.0.597

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.
@@ -6,3 +6,50 @@ labels: ['component', 'bit', 'extension', 'aspect']
6
6
  import { Component } from '@teambit/component.aspect-docs.component';
7
7
 
8
8
  <Component />
9
+
10
+ ## Expanding this aspect
11
+
12
+ Bit allows you to register to slots and expand the component aspect with new capabilities.
13
+
14
+ ### Available slots:
15
+
16
+ This aspect can be expanded via its available slots, to allow new capabilities to the component page ui.
17
+
18
+ #### `registerConsumeMethod`:
19
+
20
+ This method allows you to register new ways to consume a component, and present it in the component page ui. It will add any custom components to the `use-box` in the page's header.
21
+
22
+ First, require the component aspect to your aspect's code, and use `registerConsumeMethod` to add your custom **consume method**.
23
+
24
+ `registerConsumeMethod` expects a callback function that is provided with the `ComponentModel` data in it's `args` and returns an object with `Component` and a `Title` of type `ReactNode` that you would need to supply in order for them to render in the menu.
25
+
26
+ Another optional parameter is the `order`. This will allow you to decide the order of your method in the tabs.
27
+
28
+ :::note
29
+ If `Title` or `Component` are `undefined`, the method will not be presented in the menu.
30
+ :::
31
+
32
+ ```
33
+ // in your aspect
34
+
35
+ import { ComponentUI } from '@teambit/component';
36
+
37
+ private pnpmMethod: ConsumePlugin = (componentModel) => {
38
+ const registry = componentModel.packageName.split('/')[0];
39
+ return {
40
+ Title: <img src="https://static.bit.dev/brands/pnpm.svg" />,
41
+ Component: (
42
+ <Install
43
+ config={`npm config set ${registry}:registry' https://node.bit.dev`}
44
+ componentName={componentModel.id.name}
45
+ packageManager="pnpm"
46
+ copyString={`pnpm i ${componentModel.packageName}`}
47
+ registryName={registry}
48
+ />
49
+ ),
50
+ order: 1,
51
+ };
52
+ };
53
+
54
+ ComponentUI.registerConsumeMethod(YourAspect.pnpmMethod)
55
+ ```
@@ -7,12 +7,13 @@ import { NavLinkProps } from '@teambit/base-ui.routing.nav-link';
7
7
  import { UIRuntime } from '@teambit/ui';
8
8
  import { isBrowser } from '@teambit/ui-foundation.ui.is-browser';
9
9
  import React from 'react';
10
+ import { Import } from '@teambit/ui-foundation.ui.use-box.menu';
10
11
  import { RouteProps } from 'react-router-dom';
11
12
  import CommandBarAspect, { CommandBarUI, CommandEntry } from '@teambit/command-bar';
12
13
  import copy from 'copy-to-clipboard';
13
14
  import { ComponentAspect } from './component.aspect';
14
15
  import { Component, ComponentPageElement, ComponentPageSlot } from './ui/component';
15
- import { Menu, NavPlugin, OrderedNavigationSlot } from './ui/menu';
16
+ import { Menu, NavPlugin, OrderedNavigationSlot, ConsumeMethodSlot, ConsumePlugin } from './ui/menu';
16
17
  import { AspectSection } from './aspect.section';
17
18
  import { ComponentModel } from './ui';
18
19
 
@@ -40,6 +41,8 @@ export class ComponentUI {
40
41
 
41
42
  private navSlot: OrderedNavigationSlot,
42
43
 
44
+ private consumeMethodSlot: ConsumeMethodSlot,
45
+
43
46
  /**
44
47
  * slot for registering a new widget to the menu.
45
48
  */
@@ -115,6 +118,21 @@ export class ComponentUI {
115
118
  },
116
119
  ];
117
120
 
121
+ private bitMethod: ConsumePlugin = (comp) => {
122
+ const version = comp.version === comp.latest ? '' : `@${comp.version}`;
123
+ return {
124
+ Title: <img style={{ width: '20px' }} src="https://static.bit.dev/brands/bit-logo-text.svg" />,
125
+ Component: (
126
+ <Import
127
+ componentId={`${comp.id.toString({ ignoreVersion: true })}${version}`}
128
+ packageName={`${comp.packageName}${version}`}
129
+ componentName={comp.id.name}
130
+ />
131
+ ),
132
+ order: 0,
133
+ };
134
+ };
135
+
118
136
  registerPubSub() {
119
137
  this.pubsub.sub(PreviewAspect.id, (be: BitBaseEvent<any>) => {
120
138
  if (be.type === ClickInsideAnIframeEvent.TYPE) {
@@ -147,7 +165,13 @@ export class ComponentUI {
147
165
 
148
166
  getMenu(host: string) {
149
167
  return (
150
- <Menu navigationSlot={this.navSlot} widgetSlot={this.widgetSlot} host={host} menuItemSlot={this.menuItemSlot} />
168
+ <Menu
169
+ navigationSlot={this.navSlot}
170
+ consumeMethodSlot={this.consumeMethodSlot}
171
+ widgetSlot={this.widgetSlot}
172
+ host={host}
173
+ menuItemSlot={this.menuItemSlot}
174
+ />
151
175
  );
152
176
  }
153
177
 
@@ -163,6 +187,10 @@ export class ComponentUI {
163
187
  });
164
188
  }
165
189
 
190
+ registerConsumeMethod(...consumeMethods: ConsumePlugin[]) {
191
+ this.consumeMethodSlot.register(consumeMethods);
192
+ }
193
+
166
194
  registerWidget(widget: NavLinkProps, order?: number) {
167
195
  this.widgetSlot.register({ props: widget, order });
168
196
  }
@@ -183,6 +211,7 @@ export class ComponentUI {
183
211
  Slot.withType<RouteProps>(),
184
212
  Slot.withType<NavPlugin>(),
185
213
  Slot.withType<NavigationSlot>(),
214
+ Slot.withType<ConsumeMethodSlot>(),
186
215
  Slot.withType<MenuItemSlot>(),
187
216
  Slot.withType<ComponentPageSlot>(),
188
217
  ];
@@ -190,9 +219,10 @@ export class ComponentUI {
190
219
  static async provider(
191
220
  [pubsub, commandBarUI]: [PubsubUI, CommandBarUI],
192
221
  config,
193
- [routeSlot, navSlot, widgetSlot, menuItemSlot, pageSlot]: [
222
+ [routeSlot, navSlot, consumeMethodSlot, widgetSlot, menuItemSlot, pageSlot]: [
194
223
  RouteSlot,
195
224
  OrderedNavigationSlot,
225
+ ConsumeMethodSlot,
196
226
  OrderedNavigationSlot,
197
227
  MenuItemSlot,
198
228
  ComponentPageSlot
@@ -200,13 +230,23 @@ export class ComponentUI {
200
230
  ) {
201
231
  // TODO: refactor ComponentHost to a separate extension (including sidebar, host, graphql, etc.)
202
232
  // TODO: add contextual hook for ComponentHost @uri/@oded
203
- const componentUI = new ComponentUI(pubsub, routeSlot, navSlot, widgetSlot, menuItemSlot, pageSlot, commandBarUI);
233
+ const componentUI = new ComponentUI(
234
+ pubsub,
235
+ routeSlot,
236
+ navSlot,
237
+ consumeMethodSlot,
238
+ widgetSlot,
239
+ menuItemSlot,
240
+ pageSlot,
241
+ commandBarUI
242
+ );
204
243
  const section = new AspectSection();
205
244
 
206
245
  componentUI.commandBarUI.addCommand(...componentUI.keyBindings);
207
246
  componentUI.registerMenuItem(componentUI.menuItems);
208
247
  componentUI.registerRoute(section.route);
209
248
  componentUI.registerWidget(section.navigationLink, section.order);
249
+ componentUI.registerConsumeMethod(componentUI.bitMethod);
210
250
  return componentUI;
211
251
  }
212
252
  }
@@ -6,3 +6,50 @@ labels: ['component', 'bit', 'extension', 'aspect']
6
6
  import { Component } from '@teambit/component.aspect-docs.component';
7
7
 
8
8
  <Component />
9
+
10
+ ## Expanding this aspect
11
+
12
+ Bit allows you to register to slots and expand the component aspect with new capabilities.
13
+
14
+ ### Available slots:
15
+
16
+ This aspect can be expanded via its available slots, to allow new capabilities to the component page ui.
17
+
18
+ #### `registerConsumeMethod`:
19
+
20
+ This method allows you to register new ways to consume a component, and present it in the component page ui. It will add any custom components to the `use-box` in the page's header.
21
+
22
+ First, require the component aspect to your aspect's code, and use `registerConsumeMethod` to add your custom **consume method**.
23
+
24
+ `registerConsumeMethod` expects a callback function that is provided with the `ComponentModel` data in it's `args` and returns an object with `Component` and a `Title` of type `ReactNode` that you would need to supply in order for them to render in the menu.
25
+
26
+ Another optional parameter is the `order`. This will allow you to decide the order of your method in the tabs.
27
+
28
+ :::note
29
+ If `Title` or `Component` are `undefined`, the method will not be presented in the menu.
30
+ :::
31
+
32
+ ```
33
+ // in your aspect
34
+
35
+ import { ComponentUI } from '@teambit/component';
36
+
37
+ private pnpmMethod: ConsumePlugin = (componentModel) => {
38
+ const registry = componentModel.packageName.split('/')[0];
39
+ return {
40
+ Title: <img src="https://static.bit.dev/brands/pnpm.svg" />,
41
+ Component: (
42
+ <Install
43
+ config={`npm config set ${registry}:registry' https://node.bit.dev`}
44
+ componentName={componentModel.id.name}
45
+ packageManager="pnpm"
46
+ copyString={`pnpm i ${componentModel.packageName}`}
47
+ registryName={registry}
48
+ />
49
+ ),
50
+ order: 1,
51
+ };
52
+ };
53
+
54
+ ComponentUI.registerConsumeMethod(YourAspect.pnpmMethod)
55
+ ```
@@ -5,7 +5,7 @@ import { NavLinkProps } from '@teambit/base-ui.routing.nav-link';
5
5
  import { RouteProps } from 'react-router-dom';
6
6
  import { CommandBarUI } from '@teambit/command-bar';
7
7
  import { ComponentPageElement, ComponentPageSlot } from './ui/component';
8
- import { NavPlugin, OrderedNavigationSlot } from './ui/menu';
8
+ import { NavPlugin, OrderedNavigationSlot, ConsumeMethodSlot, ConsumePlugin } from './ui/menu';
9
9
  import { ComponentModel } from './ui';
10
10
  export declare type Server = {
11
11
  env: string;
@@ -22,6 +22,7 @@ export declare class ComponentUI {
22
22
  private pubsub;
23
23
  private routeSlot;
24
24
  private navSlot;
25
+ private consumeMethodSlot;
25
26
  /**
26
27
  * slot for registering a new widget to the menu.
27
28
  */
@@ -34,7 +35,7 @@ export declare class ComponentUI {
34
35
  /**
35
36
  * Pubsub aspects
36
37
  */
37
- pubsub: PubsubUI, routeSlot: RouteSlot, navSlot: OrderedNavigationSlot,
38
+ pubsub: PubsubUI, routeSlot: RouteSlot, navSlot: OrderedNavigationSlot, consumeMethodSlot: ConsumeMethodSlot,
38
39
  /**
39
40
  * slot for registering a new widget to the menu.
40
41
  */
@@ -49,12 +50,14 @@ export declare class ComponentUI {
49
50
  */
50
51
  private keyBindings;
51
52
  private menuItems;
53
+ private bitMethod;
52
54
  registerPubSub(): void;
53
55
  handleComponentChange: (activeComponent?: ComponentModel | undefined) => void;
54
56
  getComponentUI(host: string): JSX.Element;
55
57
  getMenu(host: string): JSX.Element;
56
58
  registerRoute(route: RouteProps): this;
57
59
  registerNavigation(nav: NavLinkProps, order?: number): void;
60
+ registerConsumeMethod(...consumeMethods: ConsumePlugin[]): void;
58
61
  registerWidget(widget: NavLinkProps, order?: number): void;
59
62
  registerMenuItem: (menuItems: MenuItem[]) => void;
60
63
  registerPageItem: (...items: ComponentPageElement[]) => void;
@@ -62,10 +65,11 @@ export declare class ComponentUI {
62
65
  static runtime: import("@teambit/harmony").RuntimeDefinition;
63
66
  static slots: (((registerFn: () => string) => import("@teambit/harmony").SlotRegistry<RouteProps<string, {
64
67
  [x: string]: string | undefined;
65
- }>>) | ((registerFn: () => string) => import("@teambit/harmony").SlotRegistry<MenuItemSlot>) | ((registerFn: () => string) => import("@teambit/harmony").SlotRegistry<NavPlugin>) | ((registerFn: () => string) => import("@teambit/harmony").SlotRegistry<NavigationSlot>) | ((registerFn: () => string) => import("@teambit/harmony").SlotRegistry<ComponentPageSlot>))[];
66
- static provider([pubsub, commandBarUI]: [PubsubUI, CommandBarUI], config: any, [routeSlot, navSlot, widgetSlot, menuItemSlot, pageSlot]: [
68
+ }>>) | ((registerFn: () => string) => import("@teambit/harmony").SlotRegistry<MenuItemSlot>) | ((registerFn: () => string) => import("@teambit/harmony").SlotRegistry<NavPlugin>) | ((registerFn: () => string) => import("@teambit/harmony").SlotRegistry<NavigationSlot>) | ((registerFn: () => string) => import("@teambit/harmony").SlotRegistry<ConsumeMethodSlot>) | ((registerFn: () => string) => import("@teambit/harmony").SlotRegistry<ComponentPageSlot>))[];
69
+ static provider([pubsub, commandBarUI]: [PubsubUI, CommandBarUI], config: any, [routeSlot, navSlot, consumeMethodSlot, widgetSlot, menuItemSlot, pageSlot]: [
67
70
  RouteSlot,
68
71
  OrderedNavigationSlot,
72
+ ConsumeMethodSlot,
69
73
  OrderedNavigationSlot,
70
74
  MenuItemSlot,
71
75
  ComponentPageSlot
@@ -81,6 +81,16 @@ function _react() {
81
81
  return data;
82
82
  }
83
83
 
84
+ function _uiFoundationUiUseBox() {
85
+ const data = require("@teambit/ui-foundation.ui.use-box.menu");
86
+
87
+ _uiFoundationUiUseBox = function () {
88
+ return data;
89
+ };
90
+
91
+ return data;
92
+ }
93
+
84
94
  function _commandBar() {
85
95
  const data = _interopRequireDefault(require("@teambit/command-bar"));
86
96
 
@@ -153,7 +163,7 @@ class ComponentUI {
153
163
  /**
154
164
  * Pubsub aspects
155
165
  */
156
- pubsub, routeSlot, navSlot,
166
+ pubsub, routeSlot, navSlot, consumeMethodSlot,
157
167
  /**
158
168
  * slot for registering a new widget to the menu.
159
169
  */
@@ -161,6 +171,7 @@ class ComponentUI {
161
171
  this.pubsub = pubsub;
162
172
  this.routeSlot = routeSlot;
163
173
  this.navSlot = navSlot;
174
+ this.consumeMethodSlot = consumeMethodSlot;
164
175
  this.widgetSlot = widgetSlot;
165
176
  this.menuItemSlot = menuItemSlot;
166
177
  this.pageItemSlot = pageItemSlot;
@@ -234,6 +245,25 @@ class ComponentUI {
234
245
  return (_this$commandBarUI4 = this.commandBarUI) === null || _this$commandBarUI4 === void 0 ? void 0 : _this$commandBarUI4.run('component.copyNpmId');
235
246
  }
236
247
  }]);
248
+ (0, _defineProperty2().default)(this, "bitMethod", comp => {
249
+ const version = comp.version === comp.latest ? '' : `@${comp.version}`;
250
+ return {
251
+ Title: /*#__PURE__*/_react().default.createElement("img", {
252
+ style: {
253
+ width: '20px'
254
+ },
255
+ src: "https://static.bit.dev/brands/bit-logo-text.svg"
256
+ }),
257
+ Component: /*#__PURE__*/_react().default.createElement(_uiFoundationUiUseBox().Import, {
258
+ componentId: `${comp.id.toString({
259
+ ignoreVersion: true
260
+ })}${version}`,
261
+ packageName: `${comp.packageName}${version}`,
262
+ componentName: comp.id.name
263
+ }),
264
+ order: 0
265
+ };
266
+ });
237
267
  (0, _defineProperty2().default)(this, "handleComponentChange", activeComponent => {
238
268
  this.activeComponent = activeComponent;
239
269
  });
@@ -276,6 +306,7 @@ class ComponentUI {
276
306
  getMenu(host) {
277
307
  return /*#__PURE__*/_react().default.createElement(_menu().Menu, {
278
308
  navigationSlot: this.navSlot,
309
+ consumeMethodSlot: this.consumeMethodSlot,
279
310
  widgetSlot: this.widgetSlot,
280
311
  host: host,
281
312
  menuItemSlot: this.menuItemSlot
@@ -294,6 +325,10 @@ class ComponentUI {
294
325
  });
295
326
  }
296
327
 
328
+ registerConsumeMethod(...consumeMethods) {
329
+ this.consumeMethodSlot.register(consumeMethods);
330
+ }
331
+
297
332
  registerWidget(widget, order) {
298
333
  this.widgetSlot.register({
299
334
  props: widget,
@@ -301,15 +336,16 @@ class ComponentUI {
301
336
  });
302
337
  }
303
338
 
304
- static async provider([pubsub, commandBarUI], config, [routeSlot, navSlot, widgetSlot, menuItemSlot, pageSlot]) {
339
+ static async provider([pubsub, commandBarUI], config, [routeSlot, navSlot, consumeMethodSlot, widgetSlot, menuItemSlot, pageSlot]) {
305
340
  // TODO: refactor ComponentHost to a separate extension (including sidebar, host, graphql, etc.)
306
341
  // TODO: add contextual hook for ComponentHost @uri/@oded
307
- const componentUI = new ComponentUI(pubsub, routeSlot, navSlot, widgetSlot, menuItemSlot, pageSlot, commandBarUI);
342
+ const componentUI = new ComponentUI(pubsub, routeSlot, navSlot, consumeMethodSlot, widgetSlot, menuItemSlot, pageSlot, commandBarUI);
308
343
  const section = new (_aspect().AspectSection)();
309
344
  componentUI.commandBarUI.addCommand(...componentUI.keyBindings);
310
345
  componentUI.registerMenuItem(componentUI.menuItems);
311
346
  componentUI.registerRoute(section.route);
312
347
  componentUI.registerWidget(section.navigationLink, section.order);
348
+ componentUI.registerConsumeMethod(componentUI.bitMethod);
313
349
  return componentUI;
314
350
  }
315
351
 
@@ -318,7 +354,7 @@ class ComponentUI {
318
354
  exports.ComponentUI = ComponentUI;
319
355
  (0, _defineProperty2().default)(ComponentUI, "dependencies", [_pubsub().default, _commandBar().default]);
320
356
  (0, _defineProperty2().default)(ComponentUI, "runtime", _ui().UIRuntime);
321
- (0, _defineProperty2().default)(ComponentUI, "slots", [_harmony().Slot.withType(), _harmony().Slot.withType(), _harmony().Slot.withType(), _harmony().Slot.withType(), _harmony().Slot.withType()]);
357
+ (0, _defineProperty2().default)(ComponentUI, "slots", [_harmony().Slot.withType(), _harmony().Slot.withType(), _harmony().Slot.withType(), _harmony().Slot.withType(), _harmony().Slot.withType(), _harmony().Slot.withType()]);
322
358
  var _default = ComponentUI;
323
359
  exports.default = _default;
324
360
 
@@ -1 +1 @@
1
- {"version":3,"sources":["component.ui.runtime.tsx"],"names":["componentIdUrlRegex","ComponentUI","constructor","pubsub","routeSlot","navSlot","widgetSlot","menuItemSlot","pageItemSlot","commandBarUI","packageName","activeComponent","version","id","versionString","handler","toString","displayName","keybinding","copyNpmId","category","title","keyChar","run","menuItems","register","items","isBrowser","registerPubSub","sub","PreviewAspect","be","type","ClickInsideAnIframeEvent","TYPE","event","MouseEvent","view","window","bubbles","cancelable","body","document","dispatchEvent","getComponentUI","host","handleComponentChange","getMenu","registerRoute","route","registerNavigation","nav","order","props","registerWidget","widget","provider","config","pageSlot","componentUI","section","AspectSection","addCommand","keyBindings","registerMenuItem","navigationLink","PubsubAspect","CommandBarAspect","UIRuntime","Slot","withType","ComponentAspect","addRuntime"],"mappings":"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","sourcesContent":["import PubsubAspect, { PubsubUI, BitBaseEvent } from '@teambit/pubsub';\nimport PreviewAspect, { ClickInsideAnIframeEvent } from '@teambit/preview';\nimport { MenuItemSlot, MenuItem } from '@teambit/ui-foundation.ui.main-dropdown';\nimport { Slot } from '@teambit/harmony';\nimport { NavigationSlot, RouteSlot } from '@teambit/ui-foundation.ui.react-router.slot-router';\nimport { NavLinkProps } from '@teambit/base-ui.routing.nav-link';\nimport { UIRuntime } from '@teambit/ui';\nimport { isBrowser } from '@teambit/ui-foundation.ui.is-browser';\nimport React from 'react';\nimport { RouteProps } from 'react-router-dom';\nimport CommandBarAspect, { CommandBarUI, CommandEntry } from '@teambit/command-bar';\nimport copy from 'copy-to-clipboard';\nimport { ComponentAspect } from './component.aspect';\nimport { Component, ComponentPageElement, ComponentPageSlot } from './ui/component';\nimport { Menu, NavPlugin, OrderedNavigationSlot } from './ui/menu';\nimport { AspectSection } from './aspect.section';\nimport { ComponentModel } from './ui';\n\nexport type Server = {\n env: string;\n url: string;\n};\n\nexport type ComponentMeta = {\n id: string;\n};\n\nexport const componentIdUrlRegex = '[\\\\w\\\\/-]*[\\\\w-]';\n\nexport class ComponentUI {\n readonly routePath = `/:componentId(${componentIdUrlRegex})`;\n\n constructor(\n /**\n * Pubsub aspects\n */\n private pubsub: PubsubUI,\n\n private routeSlot: RouteSlot,\n\n private navSlot: OrderedNavigationSlot,\n\n /**\n * slot for registering a new widget to the menu.\n */\n private widgetSlot: OrderedNavigationSlot,\n\n private menuItemSlot: MenuItemSlot,\n\n private pageItemSlot: ComponentPageSlot,\n\n private commandBarUI: CommandBarUI\n ) {\n if (isBrowser) this.registerPubSub();\n }\n\n /**\n * the current visible component\n */\n private activeComponent?: ComponentModel;\n\n private copyNpmId = () => {\n const packageName = this.activeComponent?.packageName;\n if (packageName) {\n const version = this.activeComponent?.id.version;\n const versionString = version ? `@${version}` : '';\n copy(`${packageName}${versionString}`);\n }\n };\n\n /**\n * key bindings used by component aspect\n */\n private keyBindings: CommandEntry[] = [\n {\n id: 'component.copyBitId', // TODO - extract to a component!\n handler: () => {\n copy(this.activeComponent?.id.toString() || '');\n },\n displayName: 'Copy component ID',\n keybinding: '.',\n },\n {\n id: 'component.copyNpmId', // TODO - extract to a component!\n handler: this.copyNpmId,\n displayName: 'Copy component package name',\n keybinding: ',',\n },\n ];\n\n private menuItems: MenuItem[] = [\n {\n category: 'general',\n title: 'Open command bar',\n keyChar: 'mod+k',\n handler: () => this.commandBarUI?.run('command-bar.open'),\n },\n {\n category: 'general',\n title: 'Toggle component list',\n keyChar: 'alt+s',\n handler: () => this.commandBarUI?.run('sidebar.toggle'),\n },\n {\n category: 'workflow',\n title: 'Copy component ID',\n keyChar: '.',\n handler: () => this.commandBarUI?.run('component.copyBitId'),\n },\n {\n category: 'workflow',\n title: 'Copy component package name',\n keyChar: ',',\n handler: () => this.commandBarUI?.run('component.copyNpmId'),\n },\n ];\n\n registerPubSub() {\n this.pubsub.sub(PreviewAspect.id, (be: BitBaseEvent<any>) => {\n if (be.type === ClickInsideAnIframeEvent.TYPE) {\n const event = new MouseEvent('mousedown', {\n view: window,\n bubbles: true,\n cancelable: true,\n });\n\n const body = document.body;\n body?.dispatchEvent(event);\n }\n });\n }\n\n handleComponentChange = (activeComponent?: ComponentModel) => {\n this.activeComponent = activeComponent;\n };\n\n getComponentUI(host: string) {\n return (\n <Component\n routeSlot={this.routeSlot}\n containerSlot={this.pageItemSlot}\n onComponentChange={this.handleComponentChange}\n host={host}\n />\n );\n }\n\n getMenu(host: string) {\n return (\n <Menu navigationSlot={this.navSlot} widgetSlot={this.widgetSlot} host={host} menuItemSlot={this.menuItemSlot} />\n );\n }\n\n registerRoute(route: RouteProps) {\n this.routeSlot.register(route);\n return this;\n }\n\n registerNavigation(nav: NavLinkProps, order?: number) {\n this.navSlot.register({\n props: nav,\n order,\n });\n }\n\n registerWidget(widget: NavLinkProps, order?: number) {\n this.widgetSlot.register({ props: widget, order });\n }\n\n registerMenuItem = (menuItems: MenuItem[]) => {\n this.menuItemSlot.register(menuItems);\n };\n\n registerPageItem = (...items: ComponentPageElement[]) => {\n this.pageItemSlot.register(items);\n };\n\n static dependencies = [PubsubAspect, CommandBarAspect];\n\n static runtime = UIRuntime;\n\n static slots = [\n Slot.withType<RouteProps>(),\n Slot.withType<NavPlugin>(),\n Slot.withType<NavigationSlot>(),\n Slot.withType<MenuItemSlot>(),\n Slot.withType<ComponentPageSlot>(),\n ];\n\n static async provider(\n [pubsub, commandBarUI]: [PubsubUI, CommandBarUI],\n config,\n [routeSlot, navSlot, widgetSlot, menuItemSlot, pageSlot]: [\n RouteSlot,\n OrderedNavigationSlot,\n OrderedNavigationSlot,\n MenuItemSlot,\n ComponentPageSlot\n ]\n ) {\n // TODO: refactor ComponentHost to a separate extension (including sidebar, host, graphql, etc.)\n // TODO: add contextual hook for ComponentHost @uri/@oded\n const componentUI = new ComponentUI(pubsub, routeSlot, navSlot, widgetSlot, menuItemSlot, pageSlot, commandBarUI);\n const section = new AspectSection();\n\n componentUI.commandBarUI.addCommand(...componentUI.keyBindings);\n componentUI.registerMenuItem(componentUI.menuItems);\n componentUI.registerRoute(section.route);\n componentUI.registerWidget(section.navigationLink, section.order);\n return componentUI;\n }\n}\n\nexport default ComponentUI;\n\nComponentAspect.addRuntime(ComponentUI);\n"]}
1
+ {"version":3,"sources":["component.ui.runtime.tsx"],"names":["componentIdUrlRegex","ComponentUI","constructor","pubsub","routeSlot","navSlot","consumeMethodSlot","widgetSlot","menuItemSlot","pageItemSlot","commandBarUI","packageName","activeComponent","version","id","versionString","handler","toString","displayName","keybinding","copyNpmId","category","title","keyChar","run","comp","latest","Title","width","Component","ignoreVersion","name","order","menuItems","register","items","isBrowser","registerPubSub","sub","PreviewAspect","be","type","ClickInsideAnIframeEvent","TYPE","event","MouseEvent","view","window","bubbles","cancelable","body","document","dispatchEvent","getComponentUI","host","handleComponentChange","getMenu","registerRoute","route","registerNavigation","nav","props","registerConsumeMethod","consumeMethods","registerWidget","widget","provider","config","pageSlot","componentUI","section","AspectSection","addCommand","keyBindings","registerMenuItem","navigationLink","bitMethod","PubsubAspect","CommandBarAspect","UIRuntime","Slot","withType","ComponentAspect","addRuntime"],"mappings":"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","sourcesContent":["import PubsubAspect, { PubsubUI, BitBaseEvent } from '@teambit/pubsub';\nimport PreviewAspect, { ClickInsideAnIframeEvent } from '@teambit/preview';\nimport { MenuItemSlot, MenuItem } from '@teambit/ui-foundation.ui.main-dropdown';\nimport { Slot } from '@teambit/harmony';\nimport { NavigationSlot, RouteSlot } from '@teambit/ui-foundation.ui.react-router.slot-router';\nimport { NavLinkProps } from '@teambit/base-ui.routing.nav-link';\nimport { UIRuntime } from '@teambit/ui';\nimport { isBrowser } from '@teambit/ui-foundation.ui.is-browser';\nimport React from 'react';\nimport { Import } from '@teambit/ui-foundation.ui.use-box.menu';\nimport { RouteProps } from 'react-router-dom';\nimport CommandBarAspect, { CommandBarUI, CommandEntry } from '@teambit/command-bar';\nimport copy from 'copy-to-clipboard';\nimport { ComponentAspect } from './component.aspect';\nimport { Component, ComponentPageElement, ComponentPageSlot } from './ui/component';\nimport { Menu, NavPlugin, OrderedNavigationSlot, ConsumeMethodSlot, ConsumePlugin } from './ui/menu';\nimport { AspectSection } from './aspect.section';\nimport { ComponentModel } from './ui';\n\nexport type Server = {\n env: string;\n url: string;\n};\n\nexport type ComponentMeta = {\n id: string;\n};\n\nexport const componentIdUrlRegex = '[\\\\w\\\\/-]*[\\\\w-]';\n\nexport class ComponentUI {\n readonly routePath = `/:componentId(${componentIdUrlRegex})`;\n\n constructor(\n /**\n * Pubsub aspects\n */\n private pubsub: PubsubUI,\n\n private routeSlot: RouteSlot,\n\n private navSlot: OrderedNavigationSlot,\n\n private consumeMethodSlot: ConsumeMethodSlot,\n\n /**\n * slot for registering a new widget to the menu.\n */\n private widgetSlot: OrderedNavigationSlot,\n\n private menuItemSlot: MenuItemSlot,\n\n private pageItemSlot: ComponentPageSlot,\n\n private commandBarUI: CommandBarUI\n ) {\n if (isBrowser) this.registerPubSub();\n }\n\n /**\n * the current visible component\n */\n private activeComponent?: ComponentModel;\n\n private copyNpmId = () => {\n const packageName = this.activeComponent?.packageName;\n if (packageName) {\n const version = this.activeComponent?.id.version;\n const versionString = version ? `@${version}` : '';\n copy(`${packageName}${versionString}`);\n }\n };\n\n /**\n * key bindings used by component aspect\n */\n private keyBindings: CommandEntry[] = [\n {\n id: 'component.copyBitId', // TODO - extract to a component!\n handler: () => {\n copy(this.activeComponent?.id.toString() || '');\n },\n displayName: 'Copy component ID',\n keybinding: '.',\n },\n {\n id: 'component.copyNpmId', // TODO - extract to a component!\n handler: this.copyNpmId,\n displayName: 'Copy component package name',\n keybinding: ',',\n },\n ];\n\n private menuItems: MenuItem[] = [\n {\n category: 'general',\n title: 'Open command bar',\n keyChar: 'mod+k',\n handler: () => this.commandBarUI?.run('command-bar.open'),\n },\n {\n category: 'general',\n title: 'Toggle component list',\n keyChar: 'alt+s',\n handler: () => this.commandBarUI?.run('sidebar.toggle'),\n },\n {\n category: 'workflow',\n title: 'Copy component ID',\n keyChar: '.',\n handler: () => this.commandBarUI?.run('component.copyBitId'),\n },\n {\n category: 'workflow',\n title: 'Copy component package name',\n keyChar: ',',\n handler: () => this.commandBarUI?.run('component.copyNpmId'),\n },\n ];\n\n private bitMethod: ConsumePlugin = (comp) => {\n const version = comp.version === comp.latest ? '' : `@${comp.version}`;\n return {\n Title: <img style={{ width: '20px' }} src=\"https://static.bit.dev/brands/bit-logo-text.svg\" />,\n Component: (\n <Import\n componentId={`${comp.id.toString({ ignoreVersion: true })}${version}`}\n packageName={`${comp.packageName}${version}`}\n componentName={comp.id.name}\n />\n ),\n order: 0,\n };\n };\n\n registerPubSub() {\n this.pubsub.sub(PreviewAspect.id, (be: BitBaseEvent<any>) => {\n if (be.type === ClickInsideAnIframeEvent.TYPE) {\n const event = new MouseEvent('mousedown', {\n view: window,\n bubbles: true,\n cancelable: true,\n });\n\n const body = document.body;\n body?.dispatchEvent(event);\n }\n });\n }\n\n handleComponentChange = (activeComponent?: ComponentModel) => {\n this.activeComponent = activeComponent;\n };\n\n getComponentUI(host: string) {\n return (\n <Component\n routeSlot={this.routeSlot}\n containerSlot={this.pageItemSlot}\n onComponentChange={this.handleComponentChange}\n host={host}\n />\n );\n }\n\n getMenu(host: string) {\n return (\n <Menu\n navigationSlot={this.navSlot}\n consumeMethodSlot={this.consumeMethodSlot}\n widgetSlot={this.widgetSlot}\n host={host}\n menuItemSlot={this.menuItemSlot}\n />\n );\n }\n\n registerRoute(route: RouteProps) {\n this.routeSlot.register(route);\n return this;\n }\n\n registerNavigation(nav: NavLinkProps, order?: number) {\n this.navSlot.register({\n props: nav,\n order,\n });\n }\n\n registerConsumeMethod(...consumeMethods: ConsumePlugin[]) {\n this.consumeMethodSlot.register(consumeMethods);\n }\n\n registerWidget(widget: NavLinkProps, order?: number) {\n this.widgetSlot.register({ props: widget, order });\n }\n\n registerMenuItem = (menuItems: MenuItem[]) => {\n this.menuItemSlot.register(menuItems);\n };\n\n registerPageItem = (...items: ComponentPageElement[]) => {\n this.pageItemSlot.register(items);\n };\n\n static dependencies = [PubsubAspect, CommandBarAspect];\n\n static runtime = UIRuntime;\n\n static slots = [\n Slot.withType<RouteProps>(),\n Slot.withType<NavPlugin>(),\n Slot.withType<NavigationSlot>(),\n Slot.withType<ConsumeMethodSlot>(),\n Slot.withType<MenuItemSlot>(),\n Slot.withType<ComponentPageSlot>(),\n ];\n\n static async provider(\n [pubsub, commandBarUI]: [PubsubUI, CommandBarUI],\n config,\n [routeSlot, navSlot, consumeMethodSlot, widgetSlot, menuItemSlot, pageSlot]: [\n RouteSlot,\n OrderedNavigationSlot,\n ConsumeMethodSlot,\n OrderedNavigationSlot,\n MenuItemSlot,\n ComponentPageSlot\n ]\n ) {\n // TODO: refactor ComponentHost to a separate extension (including sidebar, host, graphql, etc.)\n // TODO: add contextual hook for ComponentHost @uri/@oded\n const componentUI = new ComponentUI(\n pubsub,\n routeSlot,\n navSlot,\n consumeMethodSlot,\n widgetSlot,\n menuItemSlot,\n pageSlot,\n commandBarUI\n );\n const section = new AspectSection();\n\n componentUI.commandBarUI.addCommand(...componentUI.keyBindings);\n componentUI.registerMenuItem(componentUI.menuItems);\n componentUI.registerRoute(section.route);\n componentUI.registerWidget(section.navigationLink, section.order);\n componentUI.registerConsumeMethod(componentUI.bitMethod);\n return componentUI;\n }\n}\n\nexport default ComponentUI;\n\nComponentAspect.addRuntime(ComponentUI);\n"]}
package/dist/index.d.ts CHANGED
@@ -18,6 +18,7 @@ export type { ComponentMain } from './component.main.runtime';
18
18
  export type { ComponentUI } from './component.ui.runtime';
19
19
  export { Section } from './section';
20
20
  export { ComponentContext } from './ui/context/component-context';
21
+ export { ConsumePlugin } from './ui/menu';
21
22
  export { ComponentModel, ComponentModelProps } from './ui/component-model';
22
23
  export type { ShowFragment, ShowRow } from './show';
23
24
  export { default as Config } from './config';
package/dist/index.js CHANGED
@@ -71,6 +71,12 @@ Object.defineProperty(exports, "Config", {
71
71
  return _config().default;
72
72
  }
73
73
  });
74
+ Object.defineProperty(exports, "ConsumePlugin", {
75
+ enumerable: true,
76
+ get: function () {
77
+ return _menu().ConsumePlugin;
78
+ }
79
+ });
74
80
  Object.defineProperty(exports, "InvalidComponent", {
75
81
  enumerable: true,
76
82
  get: function () {
@@ -257,6 +263,16 @@ function _componentContext() {
257
263
  return data;
258
264
  }
259
265
 
266
+ function _menu() {
267
+ const data = require("./ui/menu");
268
+
269
+ _menu = function () {
270
+ return data;
271
+ };
272
+
273
+ return data;
274
+ }
275
+
260
276
  function _componentModel() {
261
277
  const data = require("./ui/component-model");
262
278
 
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["index.ts"],"names":["ComponentAspect"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAIA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAGA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAIA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAGA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAjBA;AACA;AAGA;AACA;AAaA;AACA;eAEeA,4B","sourcesContent":["import { ComponentAspect } from './component.aspect';\n\nexport { useComponentHost } from './host';\nexport { Component, InvalidComponent } from './component';\nexport { ComponentID } from '@teambit/component-id';\nexport { default as ComponentFS } from './component-fs';\nexport type { default as ComponentConfig } from './config';\nexport type { ComponentFactory } from './component-factory';\nexport type { AspectList } from './aspect-list';\nexport { AspectEntry, AspectData } from './aspect-entry';\n// TODO: check why it's not working when using the index in snap dir like this:\n// export { Snap, Author } from './snap';\nexport { Snap, SnapProps } from './snap/snap';\nexport type { Author } from './snap/author';\n// TODO: check why it's not working when using the index in tag dir like this:\n// export { Tag } from './tag';\nexport { Tag, TagProps } from './tag/tag';\nexport { State } from './state';\nexport type { Hash } from './hash';\nexport { TagMap } from './tag-map';\nexport { ComponentMap } from './component-map';\nexport type { ComponentMain } from './component.main.runtime';\nexport type { ComponentUI } from './component.ui.runtime';\nexport { Section } from './section';\nexport { ComponentContext } from './ui/context/component-context';\nexport { ComponentModel, ComponentModelProps } from './ui/component-model';\nexport type { ShowFragment, ShowRow } from './show';\nexport { default as Config } from './config';\n// export { AspectList } from './aspect-list';\n// export { AspectEntry } from './aspect-entry';\nexport { ComponentAspect };\nexport default ComponentAspect;\n"]}
1
+ {"version":3,"sources":["index.ts"],"names":["ComponentAspect"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAIA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAGA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAIA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAGA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAlBA;AACA;AAGA;AACA;AAcA;AACA;eAEeA,4B","sourcesContent":["import { ComponentAspect } from './component.aspect';\n\nexport { useComponentHost } from './host';\nexport { Component, InvalidComponent } from './component';\nexport { ComponentID } from '@teambit/component-id';\nexport { default as ComponentFS } from './component-fs';\nexport type { default as ComponentConfig } from './config';\nexport type { ComponentFactory } from './component-factory';\nexport type { AspectList } from './aspect-list';\nexport { AspectEntry, AspectData } from './aspect-entry';\n// TODO: check why it's not working when using the index in snap dir like this:\n// export { Snap, Author } from './snap';\nexport { Snap, SnapProps } from './snap/snap';\nexport type { Author } from './snap/author';\n// TODO: check why it's not working when using the index in tag dir like this:\n// export { Tag } from './tag';\nexport { Tag, TagProps } from './tag/tag';\nexport { State } from './state';\nexport type { Hash } from './hash';\nexport { TagMap } from './tag-map';\nexport { ComponentMap } from './component-map';\nexport type { ComponentMain } from './component.main.runtime';\nexport type { ComponentUI } from './component.ui.runtime';\nexport { Section } from './section';\nexport { ComponentContext } from './ui/context/component-context';\nexport { ConsumePlugin } from './ui/menu';\nexport { ComponentModel, ComponentModelProps } from './ui/component-model';\nexport type { ShowFragment, ShowRow } from './show';\nexport { default as Config } from './config';\n// export { AspectList } from './aspect-list';\n// export { AspectEntry } from './aspect-entry';\nexport { ComponentAspect };\nexport default ComponentAspect;\n"]}
@@ -21,6 +21,16 @@ function _defineProperty2() {
21
21
  return data;
22
22
  }
23
23
 
24
+ function _lodash() {
25
+ const data = require("lodash");
26
+
27
+ _lodash = function () {
28
+ return data;
29
+ };
30
+
31
+ return data;
32
+ }
33
+
24
34
  function _cliTable() {
25
35
  const data = require("@teambit/cli-table");
26
36
 
@@ -117,9 +127,10 @@ class ShowCmd {
117
127
  const fragments = this.component.getShowFragments();
118
128
  const rows = await Promise.all(fragments.map(async fragment => {
119
129
  const row = await fragment.renderRow(component);
130
+ if (!row.content) return null;
120
131
  return [row.title, row.content];
121
132
  }));
122
- const table = new (_cliTable().CLITable)([], rows);
133
+ const table = new (_cliTable().CLITable)([], (0, _lodash().compact)(rows));
123
134
  return table.render();
124
135
  }
125
136
 
@@ -1 +1 @@
1
- {"version":3,"sources":["show.cmd.ts"],"names":["ShowCmd","constructor","component","getComponent","idStr","remote","bitId","BitId","parse","host","getHost","id","resolveComponentId","getRemoteComponent","Error","get","MissingBitMapComponent","useLegacy","json","compare","legacyShow","LegacyShow","showData","action","versions","undefined","report","legacy","fragments","getShowFragments","rows","Promise","all","map","fragment","row","renderRow","title","content","table","CLITable","render","JSON","filter"],"mappings":"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","sourcesContent":["import { Command, CommandOptions } from '@teambit/cli';\n// import { Logger } from '@teambit/logger';\n// import chalk from 'chalk';\nimport { CLITable } from '@teambit/cli-table';\nimport { MissingBitMapComponent } from '@teambit/legacy/dist/consumer/bit-map/exceptions';\nimport { BitId } from '@teambit/legacy-bit-id';\nimport LegacyShow from '@teambit/legacy/dist/cli/commands/public-cmds/show-cmd';\nimport { ComponentMain } from '../component.main.runtime';\n\nexport class ShowCmd implements Command {\n name = 'show <id>';\n description = 'show a component';\n alias = '';\n group = 'info';\n options = [\n ['j', 'json', 'return the component data in json format'],\n ['l', 'legacy', 'use the legacy bit show.'],\n ['r', 'remote', 'show a remote component'],\n [\n 'c',\n 'compare',\n 'compare current file system component to latest tagged component [default=latest]. only works in legacy.',\n ],\n ] as CommandOptions;\n\n constructor(private component: ComponentMain) {}\n\n private async getComponent(idStr: string, remote: boolean) {\n if (remote) {\n const bitId: BitId = BitId.parse(idStr, true); // user used --remote so we know it has a scope\n const host = this.component.getHost('teambit.scope/scope');\n const id = await host.resolveComponentId(bitId);\n if (!host.getRemoteComponent) {\n throw new Error('Component Host does not implement getRemoteComponent()');\n }\n const component = await host.getRemoteComponent(id);\n return component;\n }\n const host = this.component.getHost();\n const id = await host.resolveComponentId(idStr);\n const component = await host.get(id);\n if (!component) throw new MissingBitMapComponent(idStr);\n return component;\n }\n\n async useLegacy(id: string, json = false, remote = false, compare = false) {\n const legacyShow = new LegacyShow();\n const showData = await legacyShow.action([id], {\n json,\n versions: undefined,\n remote,\n compare,\n });\n\n return legacyShow.report(showData);\n }\n\n async report([idStr]: [string], { legacy, remote, compare }: { legacy: boolean; remote: boolean; compare: boolean }) {\n if (legacy) return this.useLegacy(idStr, false, remote, compare);\n const component = await this.getComponent(idStr, remote);\n const fragments = this.component.getShowFragments();\n const rows = await Promise.all(\n fragments.map(async (fragment) => {\n const row = await fragment.renderRow(component);\n return [row.title, row.content];\n })\n );\n\n const table = new CLITable([], rows);\n return table.render();\n }\n\n async json([idStr]: [string], { remote, legacy }: { remote: boolean; legacy: boolean }) {\n if (legacy) return JSON.parse(await this.useLegacy(idStr, true, remote));\n const component = await this.getComponent(idStr, remote);\n const fragments = this.component.getShowFragments();\n const rows = await Promise.all(\n fragments.map(async (fragment) => {\n return fragment.json ? fragment.json(component) : undefined;\n })\n );\n\n return rows.filter((row) => !!row);\n }\n}\n"]}
1
+ {"version":3,"sources":["show.cmd.ts"],"names":["ShowCmd","constructor","component","getComponent","idStr","remote","bitId","BitId","parse","host","getHost","id","resolveComponentId","getRemoteComponent","Error","get","MissingBitMapComponent","useLegacy","json","compare","legacyShow","LegacyShow","showData","action","versions","undefined","report","legacy","fragments","getShowFragments","rows","Promise","all","map","fragment","row","renderRow","content","title","table","CLITable","render","JSON","filter"],"mappings":"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","sourcesContent":["import { Command, CommandOptions } from '@teambit/cli';\nimport { compact } from 'lodash';\n// import { Logger } from '@teambit/logger';\n// import chalk from 'chalk';\nimport { CLITable } from '@teambit/cli-table';\nimport { MissingBitMapComponent } from '@teambit/legacy/dist/consumer/bit-map/exceptions';\nimport { BitId } from '@teambit/legacy-bit-id';\nimport LegacyShow from '@teambit/legacy/dist/cli/commands/public-cmds/show-cmd';\nimport { ComponentMain } from '../component.main.runtime';\n\nexport class ShowCmd implements Command {\n name = 'show <id>';\n description = 'show a component';\n alias = '';\n group = 'info';\n options = [\n ['j', 'json', 'return the component data in json format'],\n ['l', 'legacy', 'use the legacy bit show.'],\n ['r', 'remote', 'show a remote component'],\n [\n 'c',\n 'compare',\n 'compare current file system component to latest tagged component [default=latest]. only works in legacy.',\n ],\n ] as CommandOptions;\n\n constructor(private component: ComponentMain) {}\n\n private async getComponent(idStr: string, remote: boolean) {\n if (remote) {\n const bitId: BitId = BitId.parse(idStr, true); // user used --remote so we know it has a scope\n const host = this.component.getHost('teambit.scope/scope');\n const id = await host.resolveComponentId(bitId);\n if (!host.getRemoteComponent) {\n throw new Error('Component Host does not implement getRemoteComponent()');\n }\n const component = await host.getRemoteComponent(id);\n return component;\n }\n const host = this.component.getHost();\n const id = await host.resolveComponentId(idStr);\n const component = await host.get(id);\n if (!component) throw new MissingBitMapComponent(idStr);\n return component;\n }\n\n async useLegacy(id: string, json = false, remote = false, compare = false) {\n const legacyShow = new LegacyShow();\n const showData = await legacyShow.action([id], {\n json,\n versions: undefined,\n remote,\n compare,\n });\n\n return legacyShow.report(showData);\n }\n\n async report([idStr]: [string], { legacy, remote, compare }: { legacy: boolean; remote: boolean; compare: boolean }) {\n if (legacy) return this.useLegacy(idStr, false, remote, compare);\n const component = await this.getComponent(idStr, remote);\n const fragments = this.component.getShowFragments();\n const rows = await Promise.all(\n fragments.map(async (fragment) => {\n const row = await fragment.renderRow(component);\n if (!row.content) return null;\n return [row.title, row.content];\n })\n );\n\n const table = new CLITable([], compact(rows));\n return table.render();\n }\n\n async json([idStr]: [string], { remote, legacy }: { remote: boolean; legacy: boolean }) {\n if (legacy) return JSON.parse(await this.useLegacy(idStr, true, remote));\n const component = await this.getComponent(idStr, remote);\n const fragments = this.component.getShowFragments();\n const rows = await Promise.all(\n fragments.map(async (fragment) => {\n return fragment.json ? fragment.json(component) : undefined;\n })\n );\n\n return rows.filter((row) => !!row);\n }\n}\n"]}
@@ -20,6 +20,7 @@ export declare type ComponentModelProps = {
20
20
  env?: Descriptor;
21
21
  labels?: string[];
22
22
  host?: string;
23
+ latest?: string;
23
24
  };
24
25
  export declare type ComponentServer = {
25
26
  env: string;
@@ -83,6 +84,10 @@ export declare class ComponentModel {
83
84
  * host of the component
84
85
  */
85
86
  readonly host?: string | undefined;
87
+ /**
88
+ * latest version of component
89
+ */
90
+ readonly latest?: string | undefined;
86
91
  constructor(
87
92
  /**
88
93
  * id of the component
@@ -139,12 +144,16 @@ export declare class ComponentModel {
139
144
  /**
140
145
  * host of the component
141
146
  */
142
- host?: string | undefined);
147
+ host?: string | undefined,
148
+ /**
149
+ * latest version of component
150
+ */
151
+ latest?: string | undefined);
143
152
  get version(): string;
144
153
  /**
145
154
  * create an instance of a component from a plain object.
146
155
  */
147
- static from({ id, server, displayName, compositions, packageName, elementsUrl, tags, deprecation, buildStatus, env, status, issuesCount, description, labels, host, }: ComponentModelProps): ComponentModel;
156
+ static from({ id, server, displayName, compositions, packageName, elementsUrl, tags, deprecation, buildStatus, env, status, issuesCount, description, labels, host, latest, }: ComponentModelProps): ComponentModel;
148
157
  static fromArray(componentsProps: ComponentModelProps[]): ComponentModel[];
149
158
  static empty(): ComponentModel;
150
159
  }
@@ -104,7 +104,11 @@ class ComponentModel {
104
104
  /**
105
105
  * host of the component
106
106
  */
107
- host) {
107
+ host,
108
+ /**
109
+ * latest version of component
110
+ */
111
+ latest) {
108
112
  this.id = id;
109
113
  this.displayName = displayName;
110
114
  this.packageName = packageName;
@@ -120,6 +124,7 @@ class ComponentModel {
120
124
  this.description = description;
121
125
  this.labels = labels;
122
126
  this.host = host;
127
+ this.latest = latest;
123
128
  }
124
129
 
125
130
  get version() {
@@ -146,9 +151,10 @@ class ComponentModel {
146
151
  issuesCount,
147
152
  description,
148
153
  labels,
149
- host
154
+ host,
155
+ latest
150
156
  }) {
151
- return new ComponentModel(_componentId().ComponentID.fromObject(id), displayName, packageName, server, _compositions().Composition.fromArray(compositions), _tagMap().TagMap.fromArray(tags.map(tag => _tag().Tag.fromObject(tag))), buildStatus, issuesCount, elementsUrl, status, deprecation, env, description, labels, host);
157
+ return new ComponentModel(_componentId().ComponentID.fromObject(id), displayName, packageName, server, _compositions().Composition.fromArray(compositions), _tagMap().TagMap.fromArray(tags.map(tag => _tag().Tag.fromObject(tag))), buildStatus, issuesCount, elementsUrl, status, deprecation, env, description, labels, host, latest);
152
158
  }
153
159
 
154
160
  static fromArray(componentsProps) {
@@ -1 +1 @@
1
- {"version":3,"sources":["component-model.ts"],"names":["ComponentModel","constructor","id","displayName","packageName","server","compositions","tags","buildStatus","issuesCount","elementsUrl","status","deprecation","environment","description","labels","host","version","from","env","ComponentID","fromObject","Composition","fromArray","TagMap","map","tag","Tag","componentsProps","rawComponent","empty","name","scope","url"],"mappings":"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","sourcesContent":["import { Composition, CompositionProps } from '@teambit/compositions';\nimport { DeprecationInfo } from '@teambit/deprecation';\nimport { Descriptor } from '@teambit/envs';\nimport { ComponentID, ComponentIdObj } from '@teambit/component-id';\n\nimport { Tag } from '../../tag';\nimport { TagMap } from '../../tag-map';\nimport { TagProps } from '../../tag/tag';\n// import { Snap } from '../../snap';\n\n// ADDING MORE PROPERTIES HERE IS NOT ALLOWED!!! IF YOU NEED DATA PLEASE ADD A NEW\n// HOOK FROM YOUR ASPECT!!!\n// TODO: remove all properties from here to their rightful place in their aspects.\nexport type ComponentModelProps = {\n id: ComponentIdObj;\n description: string;\n buildStatus?: string;\n server?: ComponentServer;\n displayName: string;\n packageName: string; // pkg aspect\n elementsUrl?: string; // pkg aspect\n compositions?: CompositionProps[];\n tags?: TagProps[];\n issuesCount?: number; // component/issues aspect\n status?: any; // workspace aspect.\n deprecation?: DeprecationInfo; // deprecation aspect\n env?: Descriptor; // env aspect.\n labels?: string[];\n host?: string;\n};\n\nexport type ComponentServer = {\n env: string;\n url: string;\n};\n\nexport class ComponentModel {\n constructor(\n /**\n * id of the component\n */\n readonly id: ComponentID,\n\n /**\n * display name of the component.\n */\n readonly displayName: string,\n\n /**\n * package name of the component.\n */\n readonly packageName: string,\n\n /**\n * the component server.\n */\n readonly server: ComponentServer | undefined,\n\n /**\n * array of compositions\n */\n readonly compositions: Composition[],\n\n /**\n * tags of the component.\n */\n readonly tags: TagMap,\n\n /**\n * component build status\n */\n readonly buildStatus?: string,\n\n /**\n * issues of component.\n */\n readonly issuesCount?: number,\n /**\n * elements url\n */\n readonly elementsUrl?: string,\n /**\n * status of component.\n */\n readonly status?: any,\n\n /**\n * deprecation info of the component.\n */\n readonly deprecation?: DeprecationInfo,\n\n /**\n * env descriptor.\n */\n readonly environment?: Descriptor,\n\n /**\n * description of the component.\n */\n\n readonly description = '',\n\n readonly labels: string[] = [],\n\n /**\n * host of the component\n */\n readonly host?: string\n ) {}\n\n get version() {\n if (!this.id.version) return 'new';\n return this.id.version;\n }\n\n /**\n * create an instance of a component from a plain object.\n */\n static from({\n id,\n server,\n displayName,\n compositions = [],\n packageName,\n elementsUrl,\n tags = [],\n deprecation,\n buildStatus,\n env,\n status,\n issuesCount,\n description,\n labels,\n host,\n }: ComponentModelProps) {\n return new ComponentModel(\n ComponentID.fromObject(id),\n displayName,\n packageName,\n server,\n Composition.fromArray(compositions),\n TagMap.fromArray(tags.map((tag) => Tag.fromObject(tag))),\n buildStatus,\n issuesCount,\n elementsUrl,\n status,\n deprecation,\n env,\n description,\n labels,\n host\n );\n }\n\n static fromArray(componentsProps: ComponentModelProps[]) {\n return componentsProps.map((rawComponent) => ComponentModel.from(rawComponent));\n }\n\n static empty() {\n return new ComponentModel(\n ComponentID.fromObject({ name: 'root', scope: 'temp' }),\n '',\n '',\n { env: '', url: '' },\n [],\n TagMap.empty()\n );\n }\n}\n"]}
1
+ {"version":3,"sources":["component-model.ts"],"names":["ComponentModel","constructor","id","displayName","packageName","server","compositions","tags","buildStatus","issuesCount","elementsUrl","status","deprecation","environment","description","labels","host","latest","version","from","env","ComponentID","fromObject","Composition","fromArray","TagMap","map","tag","Tag","componentsProps","rawComponent","empty","name","scope","url"],"mappings":"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","sourcesContent":["import { Composition, CompositionProps } from '@teambit/compositions';\nimport { DeprecationInfo } from '@teambit/deprecation';\nimport { Descriptor } from '@teambit/envs';\nimport { ComponentID, ComponentIdObj } from '@teambit/component-id';\n\nimport { Tag } from '../../tag';\nimport { TagMap } from '../../tag-map';\nimport { TagProps } from '../../tag/tag';\n// import { Snap } from '../../snap';\n\n// ADDING MORE PROPERTIES HERE IS NOT ALLOWED!!! IF YOU NEED DATA PLEASE ADD A NEW\n// HOOK FROM YOUR ASPECT!!!\n// TODO: remove all properties from here to their rightful place in their aspects.\nexport type ComponentModelProps = {\n id: ComponentIdObj;\n description: string;\n buildStatus?: string;\n server?: ComponentServer;\n displayName: string;\n packageName: string; // pkg aspect\n elementsUrl?: string; // pkg aspect\n compositions?: CompositionProps[];\n tags?: TagProps[];\n issuesCount?: number; // component/issues aspect\n status?: any; // workspace aspect.\n deprecation?: DeprecationInfo; // deprecation aspect\n env?: Descriptor; // env aspect.\n labels?: string[];\n host?: string;\n latest?: string;\n};\n\nexport type ComponentServer = {\n env: string;\n url: string;\n};\n\nexport class ComponentModel {\n constructor(\n /**\n * id of the component\n */\n readonly id: ComponentID,\n\n /**\n * display name of the component.\n */\n readonly displayName: string,\n\n /**\n * package name of the component.\n */\n readonly packageName: string,\n\n /**\n * the component server.\n */\n readonly server: ComponentServer | undefined,\n\n /**\n * array of compositions\n */\n readonly compositions: Composition[],\n\n /**\n * tags of the component.\n */\n readonly tags: TagMap,\n\n /**\n * component build status\n */\n readonly buildStatus?: string,\n\n /**\n * issues of component.\n */\n readonly issuesCount?: number,\n /**\n * elements url\n */\n readonly elementsUrl?: string,\n /**\n * status of component.\n */\n readonly status?: any,\n\n /**\n * deprecation info of the component.\n */\n readonly deprecation?: DeprecationInfo,\n\n /**\n * env descriptor.\n */\n readonly environment?: Descriptor,\n\n /**\n * description of the component.\n */\n\n readonly description = '',\n\n readonly labels: string[] = [],\n\n /**\n * host of the component\n */\n readonly host?: string,\n\n /**\n * latest version of component\n */\n readonly latest?: string\n ) {}\n\n get version() {\n if (!this.id.version) return 'new';\n return this.id.version;\n }\n\n /**\n * create an instance of a component from a plain object.\n */\n static from({\n id,\n server,\n displayName,\n compositions = [],\n packageName,\n elementsUrl,\n tags = [],\n deprecation,\n buildStatus,\n env,\n status,\n issuesCount,\n description,\n labels,\n host,\n latest,\n }: ComponentModelProps) {\n return new ComponentModel(\n ComponentID.fromObject(id),\n displayName,\n packageName,\n server,\n Composition.fromArray(compositions),\n TagMap.fromArray(tags.map((tag) => Tag.fromObject(tag))),\n buildStatus,\n issuesCount,\n elementsUrl,\n status,\n deprecation,\n env,\n description,\n labels,\n host,\n latest\n );\n }\n\n static fromArray(componentsProps: ComponentModelProps[]) {\n return componentsProps.map((rawComponent) => ComponentModel.from(rawComponent));\n }\n\n static empty() {\n return new ComponentModel(\n ComponentID.fromObject({ name: 'root', scope: 'temp' }),\n '',\n '',\n { env: '', url: '' },\n [],\n TagMap.empty()\n );\n }\n}\n"]}
@@ -1,2 +1,2 @@
1
1
  export { Menu } from './menu';
2
- export type { NavPlugin, OrderedNavigationSlot } from './nav-plugin';
2
+ export type { NavPlugin, OrderedNavigationSlot, ConsumePlugin, ConsumeMethodSlot } from './nav-plugin';
@@ -1 +1 @@
1
- {"version":3,"sources":["index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA","sourcesContent":["export { Menu } from './menu';\nexport type { NavPlugin, OrderedNavigationSlot } from './nav-plugin';\n"]}
1
+ {"version":3,"sources":["index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA","sourcesContent":["export { Menu } from './menu';\nexport type { NavPlugin, OrderedNavigationSlot, ConsumePlugin, ConsumeMethodSlot } from './nav-plugin';\n"]}
@@ -1,5 +1,5 @@
1
1
  import { MenuItemSlot } from '@teambit/ui-foundation.ui.main-dropdown';
2
- import { OrderedNavigationSlot } from './nav-plugin';
2
+ import { OrderedNavigationSlot, ConsumeMethodSlot } from './nav-plugin';
3
3
  export declare type MenuProps = {
4
4
  className?: string;
5
5
  /**
@@ -15,8 +15,9 @@ export declare type MenuProps = {
15
15
  * main dropdown item slot
16
16
  */
17
17
  menuItemSlot: MenuItemSlot;
18
+ consumeMethodSlot: ConsumeMethodSlot;
18
19
  };
19
20
  /**
20
21
  * top bar menu.
21
22
  */
22
- export declare function Menu({ navigationSlot, widgetSlot, className, host, menuItemSlot }: MenuProps): JSX.Element;
23
+ export declare function Menu({ navigationSlot, widgetSlot, className, host, menuItemSlot, consumeMethodSlot }: MenuProps): JSX.Element;
@@ -4,8 +4,6 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
 
5
5
  require("core-js/modules/es.array.iterator.js");
6
6
 
7
- require("core-js/modules/es.regexp.exec.js");
8
-
9
7
  Object.defineProperty(exports, "__esModule", {
10
8
  value: true
11
9
  });
@@ -133,7 +131,8 @@ function Menu({
133
131
  widgetSlot,
134
132
  className,
135
133
  host,
136
- menuItemSlot
134
+ menuItemSlot,
135
+ consumeMethodSlot
137
136
  }) {
138
137
  const {
139
138
  component
@@ -153,14 +152,16 @@ function Menu({
153
152
  }, /*#__PURE__*/_react().default.createElement(_menuNav().MenuNav, {
154
153
  navigationSlot: widgetSlot
155
154
  })), /*#__PURE__*/_react().default.createElement(VersionRelatedDropdowns, {
156
- component: component
155
+ component: component,
156
+ consumeMethods: consumeMethodSlot
157
157
  }), /*#__PURE__*/_react().default.createElement(_uiFoundationUi().MainDropdown, {
158
158
  menuItems: mainMenuItems
159
159
  })));
160
160
  }
161
161
 
162
162
  function VersionRelatedDropdowns({
163
- component
163
+ component,
164
+ consumeMethods
164
165
  }) {
165
166
  const versionList = (0, _react().useMemo)(() => {
166
167
  var _component$tags;
@@ -171,21 +172,13 @@ function VersionRelatedDropdowns({
171
172
  return tag === null || tag === void 0 ? void 0 : (_tag$version = tag.version) === null || _tag$version === void 0 ? void 0 : _tag$version.version;
172
173
  }).filter(x => x !== undefined).reverse();
173
174
  }, [component.tags]) || [];
174
- const isLatestVersion = (0, _react().useMemo)(() => component.version === versionList[0], [component.version]);
175
- const packageVersion = (0, _react().useMemo)(() => isLatestVersion ? '' : `@${component.version}`, [component.version]);
176
- const origin = typeof window !== undefined ? window.location.origin : undefined;
177
- const finalElementsUrl = origin && component.elementsUrl ? `${origin}${component.elementsUrl}` : undefined;
175
+ const methods = useConsumeMethods(consumeMethods, component);
178
176
  return /*#__PURE__*/_react().default.createElement(_react().default.Fragment, null, versionList.length > 0 && /*#__PURE__*/_react().default.createElement(_uiFoundationUiUseBox().UseBoxDropdown, {
179
177
  position: "bottom-end",
180
178
  className: _menuModule().default.useBox,
181
- Menu: () => /*#__PURE__*/_react().default.createElement(_uiFoundationUiUseBox2().Menu, {
182
- componentName: component.id.name,
183
- componentId: component.id.toString({
184
- ignoreVersion: isLatestVersion
185
- }),
186
- packageName: `${component.packageName}${packageVersion}`,
187
- elementsUrl: finalElementsUrl,
188
- registryName: component.packageName.split('/')[0]
179
+ Menu: /*#__PURE__*/_react().default.createElement(_uiFoundationUiUseBox2().Menu, {
180
+ methods: methods,
181
+ componentName: component.id.name
189
182
  })
190
183
  }), /*#__PURE__*/_react().default.createElement(_componentUi().VersionDropdown, {
191
184
  versions: versionList,
@@ -193,4 +186,10 @@ function VersionRelatedDropdowns({
193
186
  }));
194
187
  }
195
188
 
189
+ function useConsumeMethods(consumeMethods, componentModel) {
190
+ return (0, _react().useMemo)(() => (0, _lodash().flatten)(consumeMethods.values()).map(method => {
191
+ return method === null || method === void 0 ? void 0 : method(componentModel);
192
+ }).filter(x => !!x && x.Component && x.Title), [consumeMethods, componentModel]);
193
+ }
194
+
196
195
  //# sourceMappingURL=menu.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["menu.tsx"],"names":["Menu","navigationSlot","widgetSlot","className","host","menuItemSlot","component","mainMenuItems","values","styles","topBar","leftSide","rightSide","widgets","VersionRelatedDropdowns","versionList","tags","toArray","map","tag","version","filter","x","undefined","reverse","isLatestVersion","packageVersion","origin","window","location","finalElementsUrl","elementsUrl","length","useBox","id","name","toString","ignoreVersion","packageName","split"],"mappings":"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","sourcesContent":["import { MainDropdown, MenuItemSlot } from '@teambit/ui-foundation.ui.main-dropdown';\nimport { VersionDropdown } from '@teambit/component.ui.version-dropdown';\nimport { FullLoader } from '@teambit/legacy/dist/to-eject/full-loader';\nimport { flatten, groupBy } from 'lodash';\nimport classnames from 'classnames';\nimport React, { useMemo } from 'react';\nimport { UseBoxDropdown } from '@teambit/ui-foundation.ui.use-box.dropdown';\nimport { Menu as UseBoxMenu } from '@teambit/ui-foundation.ui.use-box.menu';\nimport type { ComponentModel } from '../component-model';\nimport { useComponent } from '../use-component';\nimport { MenuNav } from './menu-nav';\nimport styles from './menu.module.scss';\nimport { OrderedNavigationSlot } from './nav-plugin';\n\nexport type MenuProps = {\n className?: string;\n /**\n * slot for top bar menu nav items\n */\n navigationSlot: OrderedNavigationSlot;\n /**\n * right side menu item slot\n */\n widgetSlot: OrderedNavigationSlot;\n host: string;\n /**\n * main dropdown item slot\n */\n menuItemSlot: MenuItemSlot;\n};\n\n/**\n * top bar menu.\n */\nexport function Menu({ navigationSlot, widgetSlot, className, host, menuItemSlot }: MenuProps) {\n const { component } = useComponent(host);\n const mainMenuItems = useMemo(() => groupBy(flatten(menuItemSlot.values()), 'category'), [menuItemSlot]);\n\n if (!component) return <FullLoader />;\n\n return (\n <div className={classnames(styles.topBar, className)}>\n <div className={styles.leftSide}>\n <MenuNav navigationSlot={navigationSlot} />\n </div>\n <div className={styles.rightSide}>\n <div className={styles.widgets}>\n <MenuNav navigationSlot={widgetSlot} />\n </div>\n <VersionRelatedDropdowns component={component} />\n <MainDropdown menuItems={mainMenuItems} />\n </div>\n </div>\n );\n}\n\nfunction VersionRelatedDropdowns({ component }: { component: ComponentModel }) {\n const versionList =\n useMemo(\n () =>\n component.tags\n ?.toArray()\n .map((tag) => tag?.version?.version)\n .filter((x) => x !== undefined)\n .reverse(),\n [component.tags]\n ) || [];\n\n const isLatestVersion = useMemo(() => component.version === versionList[0], [component.version]);\n const packageVersion = useMemo(() => (isLatestVersion ? '' : `@${component.version}`), [component.version]);\n const origin = typeof window !== undefined ? window.location.origin : undefined;\n const finalElementsUrl = origin && component.elementsUrl ? `${origin}${component.elementsUrl}` : undefined;\n\n return (\n <>\n {versionList.length > 0 && (\n <UseBoxDropdown\n position=\"bottom-end\"\n className={styles.useBox}\n Menu={() => (\n <UseBoxMenu\n componentName={component.id.name}\n componentId={component.id.toString({ ignoreVersion: isLatestVersion })}\n packageName={`${component.packageName}${packageVersion}`}\n elementsUrl={finalElementsUrl}\n registryName={component.packageName.split('/')[0]}\n />\n )}\n />\n )}\n <VersionDropdown versions={versionList} currentVersion={component.version} />\n </>\n );\n}\n"]}
1
+ {"version":3,"sources":["menu.tsx"],"names":["Menu","navigationSlot","widgetSlot","className","host","menuItemSlot","consumeMethodSlot","component","mainMenuItems","values","styles","topBar","leftSide","rightSide","widgets","VersionRelatedDropdowns","consumeMethods","versionList","tags","toArray","map","tag","version","filter","x","undefined","reverse","methods","useConsumeMethods","length","useBox","id","name","componentModel","method","Component","Title"],"mappings":"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","sourcesContent":["import { MainDropdown, MenuItemSlot } from '@teambit/ui-foundation.ui.main-dropdown';\nimport { VersionDropdown } from '@teambit/component.ui.version-dropdown';\nimport { FullLoader } from '@teambit/legacy/dist/to-eject/full-loader';\nimport type { ConsumeMethod } from '@teambit/ui-foundation.ui.use-box.menu';\nimport { flatten, groupBy } from 'lodash';\nimport classnames from 'classnames';\nimport React, { useMemo } from 'react';\nimport { UseBoxDropdown } from '@teambit/ui-foundation.ui.use-box.dropdown';\nimport { Menu as ConsumeMethodsMenu } from '@teambit/ui-foundation.ui.use-box.menu';\nimport type { ComponentModel } from '../component-model';\nimport { useComponent } from '../use-component';\nimport { MenuNav } from './menu-nav';\nimport styles from './menu.module.scss';\nimport { OrderedNavigationSlot, ConsumeMethodSlot } from './nav-plugin';\n\nexport type MenuProps = {\n className?: string;\n /**\n * slot for top bar menu nav items\n */\n navigationSlot: OrderedNavigationSlot;\n /**\n * right side menu item slot\n */\n widgetSlot: OrderedNavigationSlot;\n host: string;\n /**\n * main dropdown item slot\n */\n menuItemSlot: MenuItemSlot;\n\n consumeMethodSlot: ConsumeMethodSlot;\n};\n\n/**\n * top bar menu.\n */\nexport function Menu({ navigationSlot, widgetSlot, className, host, menuItemSlot, consumeMethodSlot }: MenuProps) {\n const { component } = useComponent(host);\n const mainMenuItems = useMemo(() => groupBy(flatten(menuItemSlot.values()), 'category'), [menuItemSlot]);\n if (!component) return <FullLoader />;\n return (\n <div className={classnames(styles.topBar, className)}>\n <div className={styles.leftSide}>\n <MenuNav navigationSlot={navigationSlot} />\n </div>\n <div className={styles.rightSide}>\n <div className={styles.widgets}>\n <MenuNav navigationSlot={widgetSlot} />\n </div>\n <VersionRelatedDropdowns component={component} consumeMethods={consumeMethodSlot} />\n <MainDropdown menuItems={mainMenuItems} />\n </div>\n </div>\n );\n}\n\nfunction VersionRelatedDropdowns({\n component,\n consumeMethods,\n}: {\n component: ComponentModel;\n consumeMethods: ConsumeMethodSlot;\n}) {\n const versionList =\n useMemo(\n () =>\n component.tags\n ?.toArray()\n .map((tag) => tag?.version?.version)\n .filter((x) => x !== undefined)\n .reverse(),\n [component.tags]\n ) || [];\n\n const methods = useConsumeMethods(consumeMethods, component);\n return (\n <>\n {versionList.length > 0 && (\n <UseBoxDropdown\n position=\"bottom-end\"\n className={styles.useBox}\n Menu={<ConsumeMethodsMenu methods={methods} componentName={component.id.name} />}\n />\n )}\n <VersionDropdown versions={versionList} currentVersion={component.version} />\n </>\n );\n}\n\nfunction useConsumeMethods(consumeMethods: ConsumeMethodSlot, componentModel: ComponentModel): ConsumeMethod[] {\n return useMemo(\n () =>\n flatten(consumeMethods.values())\n .map((method) => {\n return method?.(componentModel);\n })\n .filter((x) => !!x && x.Component && x.Title) as ConsumeMethod[],\n [consumeMethods, componentModel]\n );\n}\n"]}
@@ -1,7 +1,11 @@
1
1
  import { SlotRegistry } from '@teambit/harmony';
2
2
  import { NavLinkProps } from '@teambit/base-ui.routing.nav-link';
3
+ import type { ConsumeMethod } from '@teambit/ui-foundation.ui.use-box.menu';
4
+ import { ComponentModel } from '../../ui';
3
5
  export declare type NavPlugin = {
4
6
  props: NavLinkProps;
5
7
  order?: number;
6
8
  };
7
9
  export declare type OrderedNavigationSlot = SlotRegistry<NavPlugin>;
10
+ export declare type ConsumePlugin = (componentModel: ComponentModel) => ConsumeMethod | undefined;
11
+ export declare type ConsumeMethodSlot = SlotRegistry<ConsumePlugin[]>;
@@ -96,6 +96,7 @@ const componentFields = (0, _client().gql)`
96
96
  packageName
97
97
  elementsUrl
98
98
  displayName
99
+ latest
99
100
  server {
100
101
  env
101
102
  url
@@ -1 +1 @@
1
- {"version":3,"sources":["use-component-query.ts"],"names":["componentIdFields","componentFields","GET_COMPONENT","SUB_SUBSCRIPTION_ADDED","SUB_COMPONENT_CHANGED","SUB_COMPONENT_REMOVED","useComponentQuery","componentId","host","idRef","current","data","error","loading","subscribeToMore","variables","id","extensionId","unsubAddition","document","updateQuery","prev","subscriptionData","prevComponent","getHost","get","addedComponent","componentAdded","component","name","unsubChanges","updatedComponent","componentChanged","isUpdated","ComponentID","isEqualObj","unsubRemoval","removedIds","componentRemoved","componentIds","length","isRemoved","some","removedId","rawComponent","ComponentModel","from","undefined","ComponentError","message"],"mappings":"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","sourcesContent":["import { useMemo, useEffect, useRef } from 'react';\nimport { gql } from '@apollo/client';\nimport { useDataQuery } from '@teambit/ui-foundation.ui.hooks.use-data-query';\nimport { ComponentID, ComponentIdObj } from '@teambit/component-id';\n\nimport { ComponentModel } from './component-model';\nimport { ComponentError } from './component-error';\n\nconst componentIdFields = gql`\n fragment componentIdFields on ComponentID {\n name\n version\n scope\n }\n`;\n\nconst componentFields = gql`\n fragment componentFields on Component {\n id {\n ...componentIdFields\n }\n packageName\n elementsUrl\n displayName\n server {\n env\n url\n }\n buildStatus\n compositions {\n identifier\n displayName\n }\n tags {\n version\n }\n env {\n id\n icon\n }\n }\n ${componentIdFields}\n`;\n\nconst GET_COMPONENT = gql`\n query Component($id: String!, $extensionId: String!) {\n getHost(id: $extensionId) {\n id # used for GQL caching\n get(id: $id) {\n ...componentFields\n }\n }\n }\n ${componentFields}\n`;\n\nconst SUB_SUBSCRIPTION_ADDED = gql`\n subscription OnComponentAdded {\n componentAdded {\n component {\n ...componentFields\n }\n }\n }\n ${componentFields}\n`;\n\nconst SUB_COMPONENT_CHANGED = gql`\n subscription OnComponentChanged {\n componentChanged {\n component {\n ...componentFields\n }\n }\n }\n ${componentFields}\n`;\n\nconst SUB_COMPONENT_REMOVED = gql`\n subscription OnComponentRemoved {\n componentRemoved {\n componentIds {\n ...componentIdFields\n }\n }\n }\n ${componentIdFields}\n`;\n\n/** provides data to component ui page, making sure both variables and return value are safely typed and memoized */\nexport function useComponentQuery(componentId: string, host: string) {\n const idRef = useRef(componentId);\n idRef.current = componentId;\n const { data, error, loading, subscribeToMore } = useDataQuery(GET_COMPONENT, {\n variables: { id: componentId, extensionId: host },\n });\n\n useEffect(() => {\n // @TODO @Kutner fix subscription for scope\n if (host !== 'teambit.workspace/workspace') {\n return () => {};\n }\n\n const unsubAddition = subscribeToMore({\n document: SUB_SUBSCRIPTION_ADDED,\n updateQuery: (prev, { subscriptionData }) => {\n const prevComponent = prev?.getHost?.get;\n const addedComponent = subscriptionData?.data?.componentAdded?.component;\n\n if (!addedComponent || prevComponent) return prev;\n\n if (idRef.current === addedComponent.id.name) {\n return {\n ...prev,\n getHost: {\n ...prev.getHost,\n get: addedComponent,\n },\n };\n }\n\n return prev;\n },\n });\n\n const unsubChanges = subscribeToMore({\n document: SUB_COMPONENT_CHANGED,\n updateQuery: (prev, { subscriptionData }) => {\n if (!subscriptionData.data) return prev;\n\n const prevComponent = prev?.getHost?.get;\n const updatedComponent = subscriptionData?.data?.componentChanged?.component;\n\n const isUpdated = updatedComponent && ComponentID.isEqualObj(prevComponent?.id, updatedComponent?.id);\n\n if (isUpdated) {\n return {\n ...prev,\n getHost: {\n ...prev.getHost,\n get: updatedComponent,\n },\n };\n }\n\n return prev;\n },\n });\n\n const unsubRemoval = subscribeToMore({\n document: SUB_COMPONENT_REMOVED,\n updateQuery: (prev, { subscriptionData }) => {\n if (!subscriptionData.data) return prev;\n\n const prevComponent = prev?.getHost?.get;\n const removedIds: ComponentIdObj[] | undefined = subscriptionData?.data?.componentRemoved?.componentIds;\n if (!prevComponent || !removedIds?.length) return prev;\n\n const isRemoved = removedIds.some((removedId) => ComponentID.isEqualObj(removedId, prevComponent.id));\n\n if (isRemoved) {\n return {\n ...prev,\n getHost: {\n ...prev.getHost,\n get: null,\n },\n };\n }\n\n return prev;\n },\n });\n\n return () => {\n unsubChanges();\n unsubAddition();\n unsubRemoval();\n };\n }, []);\n\n const rawComponent = data?.getHost?.get;\n\n return useMemo(() => {\n return {\n component: rawComponent ? ComponentModel.from({ ...rawComponent, host }) : undefined,\n // eslint-disable-next-line\n error: error\n ? new ComponentError(500, error.message)\n : !rawComponent && !loading\n ? new ComponentError(404)\n : undefined,\n };\n }, [rawComponent, host, error]);\n}\n"]}
1
+ {"version":3,"sources":["use-component-query.ts"],"names":["componentIdFields","componentFields","GET_COMPONENT","SUB_SUBSCRIPTION_ADDED","SUB_COMPONENT_CHANGED","SUB_COMPONENT_REMOVED","useComponentQuery","componentId","host","idRef","current","data","error","loading","subscribeToMore","variables","id","extensionId","unsubAddition","document","updateQuery","prev","subscriptionData","prevComponent","getHost","get","addedComponent","componentAdded","component","name","unsubChanges","updatedComponent","componentChanged","isUpdated","ComponentID","isEqualObj","unsubRemoval","removedIds","componentRemoved","componentIds","length","isRemoved","some","removedId","rawComponent","ComponentModel","from","undefined","ComponentError","message"],"mappings":"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","sourcesContent":["import { useMemo, useEffect, useRef } from 'react';\nimport { gql } from '@apollo/client';\nimport { useDataQuery } from '@teambit/ui-foundation.ui.hooks.use-data-query';\nimport { ComponentID, ComponentIdObj } from '@teambit/component-id';\n\nimport { ComponentModel } from './component-model';\nimport { ComponentError } from './component-error';\n\nconst componentIdFields = gql`\n fragment componentIdFields on ComponentID {\n name\n version\n scope\n }\n`;\n\nconst componentFields = gql`\n fragment componentFields on Component {\n id {\n ...componentIdFields\n }\n packageName\n elementsUrl\n displayName\n latest\n server {\n env\n url\n }\n buildStatus\n compositions {\n identifier\n displayName\n }\n tags {\n version\n }\n env {\n id\n icon\n }\n }\n ${componentIdFields}\n`;\n\nconst GET_COMPONENT = gql`\n query Component($id: String!, $extensionId: String!) {\n getHost(id: $extensionId) {\n id # used for GQL caching\n get(id: $id) {\n ...componentFields\n }\n }\n }\n ${componentFields}\n`;\n\nconst SUB_SUBSCRIPTION_ADDED = gql`\n subscription OnComponentAdded {\n componentAdded {\n component {\n ...componentFields\n }\n }\n }\n ${componentFields}\n`;\n\nconst SUB_COMPONENT_CHANGED = gql`\n subscription OnComponentChanged {\n componentChanged {\n component {\n ...componentFields\n }\n }\n }\n ${componentFields}\n`;\n\nconst SUB_COMPONENT_REMOVED = gql`\n subscription OnComponentRemoved {\n componentRemoved {\n componentIds {\n ...componentIdFields\n }\n }\n }\n ${componentIdFields}\n`;\n\n/** provides data to component ui page, making sure both variables and return value are safely typed and memoized */\nexport function useComponentQuery(componentId: string, host: string) {\n const idRef = useRef(componentId);\n idRef.current = componentId;\n const { data, error, loading, subscribeToMore } = useDataQuery(GET_COMPONENT, {\n variables: { id: componentId, extensionId: host },\n });\n\n useEffect(() => {\n // @TODO @Kutner fix subscription for scope\n if (host !== 'teambit.workspace/workspace') {\n return () => {};\n }\n\n const unsubAddition = subscribeToMore({\n document: SUB_SUBSCRIPTION_ADDED,\n updateQuery: (prev, { subscriptionData }) => {\n const prevComponent = prev?.getHost?.get;\n const addedComponent = subscriptionData?.data?.componentAdded?.component;\n\n if (!addedComponent || prevComponent) return prev;\n\n if (idRef.current === addedComponent.id.name) {\n return {\n ...prev,\n getHost: {\n ...prev.getHost,\n get: addedComponent,\n },\n };\n }\n\n return prev;\n },\n });\n\n const unsubChanges = subscribeToMore({\n document: SUB_COMPONENT_CHANGED,\n updateQuery: (prev, { subscriptionData }) => {\n if (!subscriptionData.data) return prev;\n\n const prevComponent = prev?.getHost?.get;\n const updatedComponent = subscriptionData?.data?.componentChanged?.component;\n\n const isUpdated = updatedComponent && ComponentID.isEqualObj(prevComponent?.id, updatedComponent?.id);\n\n if (isUpdated) {\n return {\n ...prev,\n getHost: {\n ...prev.getHost,\n get: updatedComponent,\n },\n };\n }\n\n return prev;\n },\n });\n\n const unsubRemoval = subscribeToMore({\n document: SUB_COMPONENT_REMOVED,\n updateQuery: (prev, { subscriptionData }) => {\n if (!subscriptionData.data) return prev;\n\n const prevComponent = prev?.getHost?.get;\n const removedIds: ComponentIdObj[] | undefined = subscriptionData?.data?.componentRemoved?.componentIds;\n if (!prevComponent || !removedIds?.length) return prev;\n\n const isRemoved = removedIds.some((removedId) => ComponentID.isEqualObj(removedId, prevComponent.id));\n\n if (isRemoved) {\n return {\n ...prev,\n getHost: {\n ...prev.getHost,\n get: null,\n },\n };\n }\n\n return prev;\n },\n });\n\n return () => {\n unsubChanges();\n unsubAddition();\n unsubRemoval();\n };\n }, []);\n\n const rawComponent = data?.getHost?.get;\n\n return useMemo(() => {\n return {\n component: rawComponent ? ComponentModel.from({ ...rawComponent, host }) : undefined,\n // eslint-disable-next-line\n error: error\n ? new ComponentError(500, error.message)\n : !rawComponent && !loading\n ? new ComponentError(404)\n : undefined,\n };\n }, [rawComponent, host, error]);\n}\n"]}
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@teambit/component",
3
- "version": "0.0.593",
3
+ "version": "0.0.597",
4
4
  "homepage": "https://bit.dev/teambit/component/component",
5
5
  "main": "dist/index.js",
6
6
  "componentId": {
7
7
  "scope": "teambit.component",
8
8
  "name": "component",
9
- "version": "0.0.593"
9
+ "version": "0.0.597"
10
10
  },
11
11
  "dependencies": {
12
12
  "lodash": "4.17.21",
@@ -26,38 +26,38 @@
26
26
  "@teambit/base-ui.routing.nav-link": "1.0.0",
27
27
  "@teambit/documenter.ui.heading": "4.1.1",
28
28
  "@teambit/documenter.ui.separator": "4.1.1",
29
- "@teambit/component-id": "0.0.397",
30
- "@teambit/ui-foundation.ui.menu-widget-icon": "0.0.486",
31
- "@teambit/aspect-loader": "0.0.593",
32
- "@teambit/legacy-bit-id": "0.0.396",
33
- "@teambit/toolbox.string.capitalize": "0.0.481",
34
- "@teambit/cli": "0.0.407",
35
- "@teambit/config": "0.0.419",
36
- "@teambit/express": "0.0.499",
37
- "@teambit/graphql": "0.0.593",
38
- "@teambit/bit-error": "0.0.393",
39
- "@teambit/command-bar": "0.0.593",
40
- "@teambit/preview": "0.0.593",
41
- "@teambit/pubsub": "0.0.593",
42
- "@teambit/ui-foundation.ui.is-browser": "0.0.484",
43
- "@teambit/ui-foundation.ui.main-dropdown": "0.0.484",
44
- "@teambit/ui-foundation.ui.react-router.slot-router": "0.0.486",
45
- "@teambit/ui": "0.0.593",
46
- "@teambit/component-issues": "0.0.42",
47
- "@teambit/ui-foundation.ui.hooks.use-data-query": "0.0.485",
48
- "@teambit/cli-table": "0.0.30",
49
- "@teambit/ui-foundation.ui.react-router.use-query": "0.0.484",
29
+ "@teambit/component-id": "0.0.398",
30
+ "@teambit/ui-foundation.ui.menu-widget-icon": "0.0.487",
31
+ "@teambit/aspect-loader": "0.0.597",
32
+ "@teambit/legacy-bit-id": "0.0.397",
33
+ "@teambit/toolbox.string.capitalize": "0.0.482",
34
+ "@teambit/cli": "0.0.410",
35
+ "@teambit/config": "0.0.422",
36
+ "@teambit/express": "0.0.502",
37
+ "@teambit/graphql": "0.0.597",
38
+ "@teambit/bit-error": "0.0.394",
39
+ "@teambit/command-bar": "0.0.597",
40
+ "@teambit/preview": "0.0.597",
41
+ "@teambit/pubsub": "0.0.597",
42
+ "@teambit/ui-foundation.ui.is-browser": "0.0.485",
43
+ "@teambit/ui-foundation.ui.main-dropdown": "0.0.485",
44
+ "@teambit/ui-foundation.ui.react-router.slot-router": "0.0.487",
45
+ "@teambit/ui-foundation.ui.use-box.menu": "0.0.107",
46
+ "@teambit/ui": "0.0.597",
47
+ "@teambit/component-issues": "0.0.45",
48
+ "@teambit/ui-foundation.ui.hooks.use-data-query": "0.0.486",
49
+ "@teambit/cli-table": "0.0.33",
50
+ "@teambit/ui-foundation.ui.react-router.use-query": "0.0.485",
50
51
  "@teambit/design.ui.empty-box": "0.0.352",
51
- "@teambit/harmony.ui.aspect-box": "0.0.484",
52
- "@teambit/compositions": "0.0.593",
53
- "@teambit/deprecation": "0.0.593",
54
- "@teambit/envs": "0.0.593",
52
+ "@teambit/harmony.ui.aspect-box": "0.0.485",
55
53
  "@teambit/design.ui.pages.not-found": "0.0.352",
56
54
  "@teambit/design.ui.pages.server-error": "0.0.352",
57
- "@teambit/component.ui.version-dropdown": "0.0.488",
58
- "@teambit/ui-foundation.ui.use-box.dropdown": "0.0.105",
59
- "@teambit/ui-foundation.ui.use-box.menu": "0.0.105",
60
- "@teambit/ui-foundation.ui.react-router.extend-path": "0.0.484"
55
+ "@teambit/compositions": "0.0.597",
56
+ "@teambit/deprecation": "0.0.597",
57
+ "@teambit/envs": "0.0.597",
58
+ "@teambit/component.ui.version-dropdown": "0.0.489",
59
+ "@teambit/ui-foundation.ui.use-box.dropdown": "0.0.107",
60
+ "@teambit/ui-foundation.ui.react-router.extend-path": "0.0.485"
61
61
  },
62
62
  "devDependencies": {
63
63
  "@types/lodash": "4.14.165",
@@ -72,11 +72,11 @@
72
72
  "@types/jest": "^26.0.0",
73
73
  "@types/react-dom": "^17.0.5",
74
74
  "@types/node": "12.20.4",
75
- "@teambit/component.aspect-docs.component": "0.0.129"
75
+ "@teambit/component.aspect-docs.component": "0.0.130"
76
76
  },
77
77
  "peerDependencies": {
78
78
  "@apollo/client": "^3.0.0",
79
- "@teambit/legacy": "1.0.193",
79
+ "@teambit/legacy": "1.0.197",
80
80
  "react-dom": "^16.8.0 || ^17.0.0",
81
81
  "react": "^16.8.0 || ^17.0.0"
82
82
  },
@@ -104,7 +104,7 @@
104
104
  "react": "-"
105
105
  },
106
106
  "peerDependencies": {
107
- "@teambit/legacy": "1.0.193",
107
+ "@teambit/legacy": "1.0.197",
108
108
  "react-dom": "^16.8.0 || ^17.0.0",
109
109
  "react": "^16.8.0 || ^17.0.0"
110
110
  }
package/show/show.cmd.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { Command, CommandOptions } from '@teambit/cli';
2
+ import { compact } from 'lodash';
2
3
  // import { Logger } from '@teambit/logger';
3
4
  // import chalk from 'chalk';
4
5
  import { CLITable } from '@teambit/cli-table';
@@ -62,11 +63,12 @@ export class ShowCmd implements Command {
62
63
  const rows = await Promise.all(
63
64
  fragments.map(async (fragment) => {
64
65
  const row = await fragment.renderRow(component);
66
+ if (!row.content) return null;
65
67
  return [row.title, row.content];
66
68
  })
67
69
  );
68
70
 
69
- const table = new CLITable([], rows);
71
+ const table = new CLITable([], compact(rows));
70
72
  return table.render();
71
73
  }
72
74
 
@@ -27,6 +27,7 @@ export type ComponentModelProps = {
27
27
  env?: Descriptor; // env aspect.
28
28
  labels?: string[];
29
29
  host?: string;
30
+ latest?: string;
30
31
  };
31
32
 
32
33
  export type ComponentServer = {
@@ -105,7 +106,12 @@ export class ComponentModel {
105
106
  /**
106
107
  * host of the component
107
108
  */
108
- readonly host?: string
109
+ readonly host?: string,
110
+
111
+ /**
112
+ * latest version of component
113
+ */
114
+ readonly latest?: string
109
115
  ) {}
110
116
 
111
117
  get version() {
@@ -132,6 +138,7 @@ export class ComponentModel {
132
138
  description,
133
139
  labels,
134
140
  host,
141
+ latest,
135
142
  }: ComponentModelProps) {
136
143
  return new ComponentModel(
137
144
  ComponentID.fromObject(id),
@@ -148,7 +155,8 @@ export class ComponentModel {
148
155
  env,
149
156
  description,
150
157
  labels,
151
- host
158
+ host,
159
+ latest
152
160
  );
153
161
  }
154
162
 
package/ui/menu/index.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  export { Menu } from './menu';
2
- export type { NavPlugin, OrderedNavigationSlot } from './nav-plugin';
2
+ export type { NavPlugin, OrderedNavigationSlot, ConsumePlugin, ConsumeMethodSlot } from './nav-plugin';
package/ui/menu/menu.tsx CHANGED
@@ -1,16 +1,17 @@
1
1
  import { MainDropdown, MenuItemSlot } from '@teambit/ui-foundation.ui.main-dropdown';
2
2
  import { VersionDropdown } from '@teambit/component.ui.version-dropdown';
3
3
  import { FullLoader } from '@teambit/legacy/dist/to-eject/full-loader';
4
+ import type { ConsumeMethod } from '@teambit/ui-foundation.ui.use-box.menu';
4
5
  import { flatten, groupBy } from 'lodash';
5
6
  import classnames from 'classnames';
6
7
  import React, { useMemo } from 'react';
7
8
  import { UseBoxDropdown } from '@teambit/ui-foundation.ui.use-box.dropdown';
8
- import { Menu as UseBoxMenu } from '@teambit/ui-foundation.ui.use-box.menu';
9
+ import { Menu as ConsumeMethodsMenu } from '@teambit/ui-foundation.ui.use-box.menu';
9
10
  import type { ComponentModel } from '../component-model';
10
11
  import { useComponent } from '../use-component';
11
12
  import { MenuNav } from './menu-nav';
12
13
  import styles from './menu.module.scss';
13
- import { OrderedNavigationSlot } from './nav-plugin';
14
+ import { OrderedNavigationSlot, ConsumeMethodSlot } from './nav-plugin';
14
15
 
15
16
  export type MenuProps = {
16
17
  className?: string;
@@ -27,17 +28,17 @@ export type MenuProps = {
27
28
  * main dropdown item slot
28
29
  */
29
30
  menuItemSlot: MenuItemSlot;
31
+
32
+ consumeMethodSlot: ConsumeMethodSlot;
30
33
  };
31
34
 
32
35
  /**
33
36
  * top bar menu.
34
37
  */
35
- export function Menu({ navigationSlot, widgetSlot, className, host, menuItemSlot }: MenuProps) {
38
+ export function Menu({ navigationSlot, widgetSlot, className, host, menuItemSlot, consumeMethodSlot }: MenuProps) {
36
39
  const { component } = useComponent(host);
37
40
  const mainMenuItems = useMemo(() => groupBy(flatten(menuItemSlot.values()), 'category'), [menuItemSlot]);
38
-
39
41
  if (!component) return <FullLoader />;
40
-
41
42
  return (
42
43
  <div className={classnames(styles.topBar, className)}>
43
44
  <div className={styles.leftSide}>
@@ -47,14 +48,20 @@ export function Menu({ navigationSlot, widgetSlot, className, host, menuItemSlot
47
48
  <div className={styles.widgets}>
48
49
  <MenuNav navigationSlot={widgetSlot} />
49
50
  </div>
50
- <VersionRelatedDropdowns component={component} />
51
+ <VersionRelatedDropdowns component={component} consumeMethods={consumeMethodSlot} />
51
52
  <MainDropdown menuItems={mainMenuItems} />
52
53
  </div>
53
54
  </div>
54
55
  );
55
56
  }
56
57
 
57
- function VersionRelatedDropdowns({ component }: { component: ComponentModel }) {
58
+ function VersionRelatedDropdowns({
59
+ component,
60
+ consumeMethods,
61
+ }: {
62
+ component: ComponentModel;
63
+ consumeMethods: ConsumeMethodSlot;
64
+ }) {
58
65
  const versionList =
59
66
  useMemo(
60
67
  () =>
@@ -66,29 +73,29 @@ function VersionRelatedDropdowns({ component }: { component: ComponentModel }) {
66
73
  [component.tags]
67
74
  ) || [];
68
75
 
69
- const isLatestVersion = useMemo(() => component.version === versionList[0], [component.version]);
70
- const packageVersion = useMemo(() => (isLatestVersion ? '' : `@${component.version}`), [component.version]);
71
- const origin = typeof window !== undefined ? window.location.origin : undefined;
72
- const finalElementsUrl = origin && component.elementsUrl ? `${origin}${component.elementsUrl}` : undefined;
73
-
76
+ const methods = useConsumeMethods(consumeMethods, component);
74
77
  return (
75
78
  <>
76
79
  {versionList.length > 0 && (
77
80
  <UseBoxDropdown
78
81
  position="bottom-end"
79
82
  className={styles.useBox}
80
- Menu={() => (
81
- <UseBoxMenu
82
- componentName={component.id.name}
83
- componentId={component.id.toString({ ignoreVersion: isLatestVersion })}
84
- packageName={`${component.packageName}${packageVersion}`}
85
- elementsUrl={finalElementsUrl}
86
- registryName={component.packageName.split('/')[0]}
87
- />
88
- )}
83
+ Menu={<ConsumeMethodsMenu methods={methods} componentName={component.id.name} />}
89
84
  />
90
85
  )}
91
86
  <VersionDropdown versions={versionList} currentVersion={component.version} />
92
87
  </>
93
88
  );
94
89
  }
90
+
91
+ function useConsumeMethods(consumeMethods: ConsumeMethodSlot, componentModel: ComponentModel): ConsumeMethod[] {
92
+ return useMemo(
93
+ () =>
94
+ flatten(consumeMethods.values())
95
+ .map((method) => {
96
+ return method?.(componentModel);
97
+ })
98
+ .filter((x) => !!x && x.Component && x.Title) as ConsumeMethod[],
99
+ [consumeMethods, componentModel]
100
+ );
101
+ }
@@ -1,5 +1,8 @@
1
+ // import { ReactNode } from 'react';
1
2
  import { SlotRegistry } from '@teambit/harmony';
2
3
  import { NavLinkProps } from '@teambit/base-ui.routing.nav-link';
4
+ import type { ConsumeMethod } from '@teambit/ui-foundation.ui.use-box.menu';
5
+ import { ComponentModel } from '../../ui';
3
6
 
4
7
  export type NavPlugin = {
5
8
  props: NavLinkProps;
@@ -7,3 +10,7 @@ export type NavPlugin = {
7
10
  };
8
11
 
9
12
  export type OrderedNavigationSlot = SlotRegistry<NavPlugin>;
13
+
14
+ export type ConsumePlugin = (componentModel: ComponentModel) => ConsumeMethod | undefined;
15
+
16
+ export type ConsumeMethodSlot = SlotRegistry<ConsumePlugin[]>;
@@ -22,6 +22,7 @@ const componentFields = gql`
22
22
  packageName
23
23
  elementsUrl
24
24
  displayName
25
+ latest
25
26
  server {
26
27
  env
27
28
  url