/ commands / plugin / pluginDetailsHelpers.tsx
pluginDetailsHelpers.tsx
  1  import { c as _c } from "react/compiler-runtime";
  2  /**
  3   * Shared helper functions and types for plugin details views
  4   *
  5   * Used by both DiscoverPlugins and BrowseMarketplace components.
  6   */
  7  
  8  import * as React from 'react';
  9  import { ConfigurableShortcutHint } from '../../components/ConfigurableShortcutHint.js';
 10  import { Byline } from '../../components/design-system/Byline.js';
 11  import { Box, Text } from '../../ink.js';
 12  import type { PluginMarketplaceEntry } from '../../utils/plugins/schemas.js';
 13  
 14  /**
 15   * Represents a plugin available for installation from a marketplace
 16   */
 17  export type InstallablePlugin = {
 18    entry: PluginMarketplaceEntry;
 19    marketplaceName: string;
 20    pluginId: string;
 21    isInstalled: boolean;
 22  };
 23  
 24  /**
 25   * Menu option for plugin details view
 26   */
 27  export type PluginDetailsMenuOption = {
 28    label: string;
 29    action: string;
 30  };
 31  
 32  /**
 33   * Extract GitHub repo info from a plugin's source
 34   */
 35  export function extractGitHubRepo(plugin: InstallablePlugin): string | null {
 36    const isGitHub = plugin.entry.source && typeof plugin.entry.source === 'object' && 'source' in plugin.entry.source && plugin.entry.source.source === 'github';
 37    if (isGitHub && typeof plugin.entry.source === 'object' && 'repo' in plugin.entry.source) {
 38      return plugin.entry.source.repo;
 39    }
 40    return null;
 41  }
 42  
 43  /**
 44   * Build menu options for plugin details view with scoped installation options
 45   */
 46  export function buildPluginDetailsMenuOptions(hasHomepage: string | undefined, githubRepo: string | null): PluginDetailsMenuOption[] {
 47    const options: PluginDetailsMenuOption[] = [{
 48      label: 'Install for you (user scope)',
 49      action: 'install-user'
 50    }, {
 51      label: 'Install for all collaborators on this repository (project scope)',
 52      action: 'install-project'
 53    }, {
 54      label: 'Install for you, in this repo only (local scope)',
 55      action: 'install-local'
 56    }];
 57    if (hasHomepage) {
 58      options.push({
 59        label: 'Open homepage',
 60        action: 'homepage'
 61      });
 62    }
 63    if (githubRepo) {
 64      options.push({
 65        label: 'View on GitHub',
 66        action: 'github'
 67      });
 68    }
 69    options.push({
 70      label: 'Back to plugin list',
 71      action: 'back'
 72    });
 73    return options;
 74  }
 75  
 76  /**
 77   * Key hint component for plugin selection screens
 78   */
 79  export function PluginSelectionKeyHint(t0) {
 80    const $ = _c(7);
 81    const {
 82      hasSelection
 83    } = t0;
 84    let t1;
 85    if ($[0] !== hasSelection) {
 86      t1 = hasSelection && <ConfigurableShortcutHint action="plugin:install" context="Plugin" fallback="i" description="install" bold={true} />;
 87      $[0] = hasSelection;
 88      $[1] = t1;
 89    } else {
 90      t1 = $[1];
 91    }
 92    let t2;
 93    let t3;
 94    let t4;
 95    if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
 96      t2 = <ConfigurableShortcutHint action="plugin:toggle" context="Plugin" fallback="Space" description="toggle" />;
 97      t3 = <ConfigurableShortcutHint action="select:accept" context="Select" fallback="Enter" description="details" />;
 98      t4 = <ConfigurableShortcutHint action="confirm:no" context="Confirmation" fallback="Esc" description="back" />;
 99      $[2] = t2;
100      $[3] = t3;
101      $[4] = t4;
102    } else {
103      t2 = $[2];
104      t3 = $[3];
105      t4 = $[4];
106    }
107    let t5;
108    if ($[5] !== t1) {
109      t5 = <Box marginTop={1}><Text dimColor={true} italic={true}><Byline>{t1}{t2}{t3}{t4}</Byline></Text></Box>;
110      $[5] = t1;
111      $[6] = t5;
112    } else {
113      t5 = $[6];
114    }
115    return t5;
116  }
117  //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIkNvbmZpZ3VyYWJsZVNob3J0Y3V0SGludCIsIkJ5bGluZSIsIkJveCIsIlRleHQiLCJQbHVnaW5NYXJrZXRwbGFjZUVudHJ5IiwiSW5zdGFsbGFibGVQbHVnaW4iLCJlbnRyeSIsIm1hcmtldHBsYWNlTmFtZSIsInBsdWdpbklkIiwiaXNJbnN0YWxsZWQiLCJQbHVnaW5EZXRhaWxzTWVudU9wdGlvbiIsImxhYmVsIiwiYWN0aW9uIiwiZXh0cmFjdEdpdEh1YlJlcG8iLCJwbHVnaW4iLCJpc0dpdEh1YiIsInNvdXJjZSIsInJlcG8iLCJidWlsZFBsdWdpbkRldGFpbHNNZW51T3B0aW9ucyIsImhhc0hvbWVwYWdlIiwiZ2l0aHViUmVwbyIsIm9wdGlvbnMiLCJwdXNoIiwiUGx1Z2luU2VsZWN0aW9uS2V5SGludCIsInQwIiwiJCIsIl9jIiwiaGFzU2VsZWN0aW9uIiwidDEiLCJ0MiIsInQzIiwidDQiLCJTeW1ib2wiLCJmb3IiLCJ0NSJdLCJzb3VyY2VzIjpbInBsdWdpbkRldGFpbHNIZWxwZXJzLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNoYXJlZCBoZWxwZXIgZnVuY3Rpb25zIGFuZCB0eXBlcyBmb3IgcGx1Z2luIGRldGFpbHMgdmlld3NcbiAqXG4gKiBVc2VkIGJ5IGJvdGggRGlzY292ZXJQbHVnaW5zIGFuZCBCcm93c2VNYXJrZXRwbGFjZSBjb21wb25lbnRzLlxuICovXG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgQ29uZmlndXJhYmxlU2hvcnRjdXRIaW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9Db25maWd1cmFibGVTaG9ydGN1dEhpbnQuanMnXG5pbXBvcnQgeyBCeWxpbmUgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2Rlc2lnbi1zeXN0ZW0vQnlsaW5lLmpzJ1xuaW1wb3J0IHsgQm94LCBUZXh0IH0gZnJvbSAnLi4vLi4vaW5rLmpzJ1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5NYXJrZXRwbGFjZUVudHJ5IH0gZnJvbSAnLi4vLi4vdXRpbHMvcGx1Z2lucy9zY2hlbWFzLmpzJ1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBwbHVnaW4gYXZhaWxhYmxlIGZvciBpbnN0YWxsYXRpb24gZnJvbSBhIG1hcmtldHBsYWNlXG4gKi9cbmV4cG9ydCB0eXBlIEluc3RhbGxhYmxlUGx1Z2luID0ge1xuICBlbnRyeTogUGx1Z2luTWFya2V0cGxhY2VFbnRyeVxuICBtYXJrZXRwbGFjZU5hbWU6IHN0cmluZ1xuICBwbHVnaW5JZDogc3RyaW5nXG4gIGlzSW5zdGFsbGVkOiBib29sZWFuXG59XG5cbi8qKlxuICogTWVudSBvcHRpb24gZm9yIHBsdWdpbiBkZXRhaWxzIHZpZXdcbiAqL1xuZXhwb3J0IHR5cGUgUGx1Z2luRGV0YWlsc01lbnVPcHRpb24gPSB7XG4gIGxhYmVsOiBzdHJpbmdcbiAgYWN0aW9uOiBzdHJpbmdcbn1cblxuLyoqXG4gKiBFeHRyYWN0IEdpdEh1YiByZXBvIGluZm8gZnJvbSBhIHBsdWdpbidzIHNvdXJjZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdEdpdEh1YlJlcG8ocGx1Z2luOiBJbnN0YWxsYWJsZVBsdWdpbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBpc0dpdEh1YiA9XG4gICAgcGx1Z2luLmVudHJ5LnNvdXJjZSAmJlxuICAgIHR5cGVvZiBwbHVnaW4uZW50cnkuc291cmNlID09PSAnb2JqZWN0JyAmJlxuICAgICdzb3VyY2UnIGluIHBsdWdpbi5lbnRyeS5zb3VyY2UgJiZcbiAgICBwbHVnaW4uZW50cnkuc291cmNlLnNvdXJjZSA9PT0gJ2dpdGh1YidcblxuICBpZiAoXG4gICAgaXNHaXRIdWIgJiZcbiAgICB0eXBlb2YgcGx1Z2luLmVudHJ5LnNvdXJjZSA9PT0gJ29iamVjdCcgJiZcbiAgICAncmVwbycgaW4gcGx1Z2luLmVudHJ5LnNvdXJjZVxuICApIHtcbiAgICByZXR1cm4gcGx1Z2luLmVudHJ5LnNvdXJjZS5yZXBvXG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG4vKipcbiAqIEJ1aWxkIG1lbnUgb3B0aW9ucyBmb3IgcGx1Z2luIGRldGFpbHMgdmlldyB3aXRoIHNjb3BlZCBpbnN0YWxsYXRpb24gb3B0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQbHVnaW5EZXRhaWxzTWVudU9wdGlvbnMoXG4gIGhhc0hvbWVwYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGdpdGh1YlJlcG86IHN0cmluZyB8IG51bGwsXG4pOiBQbHVnaW5EZXRhaWxzTWVudU9wdGlvbltdIHtcbiAgY29uc3Qgb3B0aW9uczogUGx1Z2luRGV0YWlsc01lbnVPcHRpb25bXSA9IFtcbiAgICB7IGxhYmVsOiAnSW5zdGFsbCBmb3IgeW91ICh1c2VyIHNjb3BlKScsIGFjdGlvbjogJ2luc3RhbGwtdXNlcicgfSxcbiAgICB7XG4gICAgICBsYWJlbDogJ0luc3RhbGwgZm9yIGFsbCBjb2xsYWJvcmF0b3JzIG9uIHRoaXMgcmVwb3NpdG9yeSAocHJvamVjdCBzY29wZSknLFxuICAgICAgYWN0aW9uOiAnaW5zdGFsbC1wcm9qZWN0JyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGxhYmVsOiAnSW5zdGFsbCBmb3IgeW91LCBpbiB0aGlzIHJlcG8gb25seSAobG9jYWwgc2NvcGUpJyxcbiAgICAgIGFjdGlvbjogJ2luc3RhbGwtbG9jYWwnLFxuICAgIH0sXG4gIF1cbiAgaWYgKGhhc0hvbWVwYWdlKSB7XG4gICAgb3B0aW9ucy5wdXNoKHsgbGFiZWw6ICdPcGVuIGhvbWVwYWdlJywgYWN0aW9uOiAnaG9tZXBhZ2UnIH0pXG4gIH1cbiAgaWYgKGdpdGh1YlJlcG8pIHtcbiAgICBvcHRpb25zLnB1c2goeyBsYWJlbDogJ1ZpZXcgb24gR2l0SHViJywgYWN0aW9uOiAnZ2l0aHViJyB9KVxuICB9XG4gIG9wdGlvbnMucHVzaCh7IGxhYmVsOiAnQmFjayB0byBwbHVnaW4gbGlzdCcsIGFjdGlvbjogJ2JhY2snIH0pXG4gIHJldHVybiBvcHRpb25zXG59XG5cbi8qKlxuICogS2V5IGhpbnQgY29tcG9uZW50IGZvciBwbHVnaW4gc2VsZWN0aW9uIHNjcmVlbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFBsdWdpblNlbGVjdGlvbktleUhpbnQoe1xuICBoYXNTZWxlY3Rpb24sXG59OiB7XG4gIGhhc1NlbGVjdGlvbjogYm9vbGVhblxufSk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIHJldHVybiAoXG4gICAgPEJveCBtYXJnaW5Ub3A9ezF9PlxuICAgICAgPFRleHQgZGltQ29sb3IgaXRhbGljPlxuICAgICAgICA8QnlsaW5lPlxuICAgICAgICAgIHtoYXNTZWxlY3Rpb24gJiYgKFxuICAgICAgICAgICAgPENvbmZpZ3VyYWJsZVNob3J0Y3V0SGludFxuICAgICAgICAgICAgICBhY3Rpb249XCJwbHVnaW46aW5zdGFsbFwiXG4gICAgICAgICAgICAgIGNvbnRleHQ9XCJQbHVnaW5cIlxuICAgICAgICAgICAgICBmYWxsYmFjaz1cImlcIlxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbj1cImluc3RhbGxcIlxuICAgICAgICAgICAgICBib2xkXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICl9XG4gICAgICAgICAgPENvbmZpZ3VyYWJsZVNob3J0Y3V0SGludFxuICAgICAgICAgICAgYWN0aW9uPVwicGx1Z2luOnRvZ2dsZVwiXG4gICAgICAgICAgICBjb250ZXh0PVwiUGx1Z2luXCJcbiAgICAgICAgICAgIGZhbGxiYWNrPVwiU3BhY2VcIlxuICAgICAgICAgICAgZGVzY3JpcHRpb249XCJ0b2dnbGVcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPENvbmZpZ3VyYWJsZVNob3J0Y3V0SGludFxuICAgICAgICAgICAgYWN0aW9uPVwic2VsZWN0OmFjY2VwdFwiXG4gICAgICAgICAgICBjb250ZXh0PVwiU2VsZWN0XCJcbiAgICAgICAgICAgIGZhbGxiYWNrPVwiRW50ZXJcIlxuICAgICAgICAgICAgZGVzY3JpcHRpb249XCJkZXRhaWxzXCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIDxDb25maWd1cmFibGVTaG9ydGN1dEhpbnRcbiAgICAgICAgICAgIGFjdGlvbj1cImNvbmZpcm06bm9cIlxuICAgICAgICAgICAgY29udGV4dD1cIkNvbmZpcm1hdGlvblwiXG4gICAgICAgICAgICBmYWxsYmFjaz1cIkVzY1wiXG4gICAgICAgICAgICBkZXNjcmlwdGlvbj1cImJhY2tcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvQnlsaW5lPlxuICAgICAgPC9UZXh0PlxuICAgIDwvQm94PlxuICApXG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE9BQU8sS0FBS0EsS0FBSyxNQUFNLE9BQU87QUFDOUIsU0FBU0Msd0JBQXdCLFFBQVEsOENBQThDO0FBQ3ZGLFNBQVNDLE1BQU0sUUFBUSwwQ0FBMEM7QUFDakUsU0FBU0MsR0FBRyxFQUFFQyxJQUFJLFFBQVEsY0FBYztBQUN4QyxjQUFjQyxzQkFBc0IsUUFBUSxnQ0FBZ0M7O0FBRTVFO0FBQ0E7QUFDQTtBQUNBLE9BQU8sS0FBS0MsaUJBQWlCLEdBQUc7RUFDOUJDLEtBQUssRUFBRUYsc0JBQXNCO0VBQzdCRyxlQUFlLEVBQUUsTUFBTTtFQUN2QkMsUUFBUSxFQUFFLE1BQU07RUFDaEJDLFdBQVcsRUFBRSxPQUFPO0FBQ3RCLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0EsT0FBTyxLQUFLQyx1QkFBdUIsR0FBRztFQUNwQ0MsS0FBSyxFQUFFLE1BQU07RUFDYkMsTUFBTSxFQUFFLE1BQU07QUFDaEIsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxPQUFPLFNBQVNDLGlCQUFpQkEsQ0FBQ0MsTUFBTSxFQUFFVCxpQkFBaUIsQ0FBQyxFQUFFLE1BQU0sR0FBRyxJQUFJLENBQUM7RUFDMUUsTUFBTVUsUUFBUSxHQUNaRCxNQUFNLENBQUNSLEtBQUssQ0FBQ1UsTUFBTSxJQUNuQixPQUFPRixNQUFNLENBQUNSLEtBQUssQ0FBQ1UsTUFBTSxLQUFLLFFBQVEsSUFDdkMsUUFBUSxJQUFJRixNQUFN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