{"version":3,"file":"Registry.cjs","sources":["../../../src/utils/Registry.ts"],"sourcesContent":["import { PluginState } from '../types/plugin';\nimport { SelectableValue } from '../types/select';\n\nexport interface RegistryItem {\n  id: string; // Unique Key -- saved in configs\n  name: string; // Display Name, can change without breaking configs\n  description?: string;\n  aliasIds?: string[]; // when the ID changes, we may want backwards compatibility ('current' => 'last')\n\n  /**\n   * Some extensions should not be user selectable\n   *  like: 'all' and 'any' matchers;\n   */\n  excludeFromPicker?: boolean;\n\n  /**\n   * Optional feature state\n   */\n  state?: PluginState;\n}\n\nexport interface RegistryItemWithOptions<TOptions = any> extends RegistryItem {\n  /**\n   * Convert the options to a string\n   */\n  getOptionsDisplayText?: (options: TOptions) => string;\n\n  /**\n   * Default options used if nothing else is specified\n   */\n  defaultOptions?: TOptions;\n}\n\ninterface RegistrySelectInfo {\n  options: Array<SelectableValue<string>>;\n  current: Array<SelectableValue<string>>;\n}\n\nexport class Registry<T extends RegistryItem> {\n  private ordered: T[] = [];\n  private byId = new Map<string, T>();\n  private initialized = false;\n\n  constructor(private init?: () => T[]) {\n    this.init = init;\n  }\n\n  setInit = (init: () => T[]) => {\n    if (this.initialized) {\n      throw new Error('Registry already initialized');\n    }\n    this.init = init;\n  };\n\n  getIfExists(id: string | undefined): T | undefined {\n    if (!this.initialized) {\n      this.initialize();\n    }\n\n    if (id) {\n      return this.byId.get(id);\n    }\n\n    return undefined;\n  }\n\n  private initialize() {\n    if (this.init) {\n      for (const ext of this.init()) {\n        this.register(ext);\n      }\n    }\n    this.sort();\n    this.initialized = true;\n  }\n\n  get(id: string): T {\n    const v = this.getIfExists(id);\n    if (!v) {\n      throw new Error(`\"${id}\" not found in: ${this.list().map((v) => v.id)}`);\n    }\n    return v;\n  }\n\n  selectOptions(current?: string[], filter?: (ext: T) => boolean): RegistrySelectInfo {\n    if (!this.initialized) {\n      this.initialize();\n    }\n\n    const select: RegistrySelectInfo = {\n      options: [],\n      current: [],\n    };\n\n    const currentOptions: Record<string, SelectableValue<string>> = {};\n    if (current) {\n      for (const id of current) {\n        currentOptions[id] = {};\n      }\n    }\n\n    for (const ext of this.ordered) {\n      if (ext.excludeFromPicker) {\n        continue;\n      }\n      if (filter && !filter(ext)) {\n        continue;\n      }\n\n      const option = {\n        value: ext.id,\n        label: ext.name,\n        description: ext.description,\n      };\n\n      if (ext.state === PluginState.alpha) {\n        option.label += ' (alpha)';\n      }\n\n      select.options.push(option);\n      if (currentOptions[ext.id]) {\n        currentOptions[ext.id] = option;\n      }\n    }\n\n    if (current) {\n      // this makes sure we preserve the order of ids\n      select.current = Object.values(currentOptions);\n    }\n\n    return select;\n  }\n\n  /**\n   * Return a list of values by ID, or all values if not specified\n   */\n  list(ids?: string[]): T[] {\n    if (!this.initialized) {\n      this.initialize();\n    }\n\n    if (ids) {\n      const found: T[] = [];\n      for (const id of ids) {\n        const v = this.getIfExists(id);\n        if (v) {\n          found.push(v);\n        }\n      }\n      return found;\n    }\n\n    return this.ordered;\n  }\n\n  isEmpty(): boolean {\n    if (!this.initialized) {\n      this.initialize();\n    }\n\n    return this.ordered.length === 0;\n  }\n\n  register(ext: T) {\n    if (this.byId.has(ext.id)) {\n      throw new Error('Duplicate Key:' + ext.id);\n    }\n\n    this.byId.set(ext.id, ext);\n    this.ordered.push(ext);\n\n    if (ext.aliasIds) {\n      for (const alias of ext.aliasIds) {\n        if (!this.byId.has(alias)) {\n          this.byId.set(alias, ext);\n        }\n      }\n    }\n\n    if (this.initialized) {\n      this.sort();\n    }\n  }\n\n  private sort() {\n    // TODO sort the list\n  }\n}\n"],"names":["v","PluginState"],"mappings":"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"}