Сайт

Проблемы

sdk.problems предоставляет данные для Problems: расширение сообщает об обнаруженных проблемах — вместе с решениями, которые пользователь может применить в один клик.

Регистрация

report(input: SdkProblemInput): Promise<SdkProblemHandle | undefined>

| Поле | Обязательно | Описание | | --- | --- | --- | | code | да | Машиночитаемый код проблемы. Не может быть пустым. | | message | да | Короткое человекочитаемое описание. Не может быть пустым. | | severity | да | ProblemSeverity: HINT, INFO, WARNING, ERROR. | | solutions | да | Массив решений — минимум одно. | | id | | Стабильный id. По умолчанию — сгенерированный uuid. | | description | | Развёрнутое пояснение. | | source | | Откуда проблема. По умолчанию — displayName вашего расширения или его id. | | tags | | Строки для группировки и фильтрации. | | metadata | | Любые дополнительные данные (Dictionary). |

Вызов report завершается с ошибкой, если code или message пустые, если solutions пуст или если проблема с таким id уже существует. Чтобы получить актуальную информацию о проблеме, сначала вызовите remove, затем снова report.

Решения

Решение — { id?, title, description?, execute }:

| Поле | Обязательно | Описание | | --- | --- | --- | | title | да | Название действия. | | execute | да | () => undefined \| boolean \| Promise<undefined \| boolean> — выполняется, когда пользователь выбирает решение. | | id | | Стабильный id. По умолчанию — сгенерированный uuid. | | description | | Что делает решение. |

execute не принимает аргументов. Верните true, чтобы отметить проблему как решённую, Fragmenta удалит её автоматически. Любой другой результат — false, undefined или ошибка — оставляет проблему на месте.

Дескриптор

report резолвится в SdkProblemHandle:

| Элемент | Описание | | --- | --- | | id | ProblemId зарегистрированной проблемы. | | remove() | Удаляет проблему. Резолвится в true, если она ещё существовала. | | dispose() | То же, что remove(), без ожидания — handle можно положить в context.subscriptions. |

Проблемы, о которых сообщило ваше расширение, удаляются автоматически при его деактивации.

const handle = await sdk.problems.report({
  code: 'docker-not-running',
  message: 'Docker не запущен',
  severity: ProblemSeverity.ERROR,
  solutions: [
    {
      title: 'Проверить ещё раз',
      // true решает проблему и удаляет её
      execute: async () => (await sdk.docker.isDockerInstalled()) !== false,
    },
  ],
})

// позже, если проблема решилась другим путём:
await handle?.remove()
SdkProblemInput
interface SdkProblemInput {
  readonly id?: string
  readonly code: string
  readonly message: string
  readonly description?: string
  readonly severity: ProblemSeverity
  readonly source?: string
  readonly tags?: ReadonlyArray<string>
  readonly metadata?: Dictionary
  readonly solutions: ReadonlyArray<SdkProblemSolutionInput>
}
SdkProblemSolutionInput
interface SdkProblemSolutionInput {
  readonly id?: string
  readonly title: string
  readonly description?: string
  readonly execute: () => undefined | boolean | Promise<undefined | boolean>
}
SdkProblemHandle
interface SdkProblemHandle extends IDisposable {
  readonly id: ProblemId
  remove(): Promise<boolean>
}
ProblemSeverity
enum ProblemSeverity {
  HINT = 'HINT',
  INFO = 'INFO',
  WARNING = 'WARNING',
  ERROR = 'ERROR',
}

Управление

remove(id: ProblemId): Promise<boolean>
clear(): Promise<void>
list(): Promise<ReadonlyArray<SdkProblemDescriptor>>
applySolution(problemId: ProblemId, solutionId: SolutionId): Promise<boolean>

| Метод | Описание | | --- | --- | | remove(id) | Удаляет проблему по id. Резолвится в true, если она существовала. Работает с любой проблемой в IDE, не только с вашими. | | clear() | Удаляет проблемы, зарегистрированные через report(). | | list() | Все проблемы, которые сейчас есть в Problems, — от IDE и от всех расширений. | | applySolution(problemId, solutionId) | Выполняет решение любой проблемы. Резолвится в true, только если решение решило проблему — тогда она удаляется; false — если проблемы или решения нет или решение её не решило. |

list() и onDidAdd возвращают дескрипторы — данные о проблеме без execute плюс время добавления проблемы:

SdkProblemDescriptor
interface SdkProblemDescriptor {
  readonly id: ProblemId
  readonly code: string
  readonly message: string
  readonly description?: string
  readonly severity: ProblemSeverity
  readonly source?: string
  readonly tags?: ReadonlyArray<string>
  readonly metadata?: Dictionary
  readonly createdAt: number // мс с начала эпохи
  readonly solutions: ReadonlyArray<SdkSolutionDescriptor>
}
SdkSolutionDescriptor
interface SdkSolutionDescriptor {
  readonly id: SolutionId
  readonly title: string
  readonly description?: string
}

События

События глобальные: они срабатывают для проблем от IDE и от всех расширений.

| Событие | Payload | Когда срабатывает | | --- | --- | --- | | onDidAdd | SdkProblemDescriptor | Проблема добавлена. | | onDidRemove | ProblemId | Проблема удалена — в том числе каждая, удалённая через clear() или решением, которое её решило. | | onDidClear | — | Весь список проблем очищен разом. clear() его не вызывает. | | onDidChange | — | После любого добавления, удаления или очистки. |