Skip to content

2020 Frontend School, task #3 - find and fix mistakes in vscode plugin

Notifications You must be signed in to change notification settings

hhharm/find-mistakes

Repository files navigation

Задание с испытательнык в ШРИ Яндекса. Нужно было починить плагин для VSCode и описать, как я это делала.

Приложение не собиралось

Если нажать F5, падали 2 ошибки

  1. В server.ts надо было заменить return value в conn.onInitialize

Станет

conn.onInitialize((params: InitializeParams) => {
    return {
        capabilities: {
            textDocumentSync: {
                change: TextDocumentSyncKind.Full
            }
        }
    };
});

Тут помог VS Code, т.к. он пишет причину ошибки, то есть, что типы несовместимы. Посмотрела в definition _ServerCapabilities, там написано, что можно использовать TextDocumentSyncOptions или TextDocumentSyncKind. Но про второй вариант написано, что он только для обратной совместимости оставлен, так что лучше выбрать первый.

  1. В том же файле внутри const validateProperty надо поменять property.key.loc на property.loc.

У property тип AstProperty. В описании этого типа информация, что location лежит в .loc, а не в key.loc

Приложение запустилось

Решила посмотреть, что в проекте вообще есть. Обнаружился tslint, tsconfig с mode:strict, где подробно расписано, что нельзя, и package.json, внутри которого лежала команда на запуск тестов.

Раз конфигурация tslint есть, было бы отлично проверить код линтером. Я установила в VS Code плагин для tslint, и сразу пришло 3 ошибки - в файле extension.ts двух местах не хватало ";" и if без {} использовался.

Добавила prettier: в нескольких местах код криво отформатирован, используются разные варианты кавычек, нет единого стиля и всё такое. Конфигурации для prettier в проекте нет, так что я взяла готовую из репозитория tinkoff (https://github.com/TinkoffCreditSystems/linters).

Сломанное превью (всегда пишет {{content}})

Похоже, что так работать не должно. Решила поискать, где должен подменяться content на нормальное содержимое. С помощью дебаггера VS Code дошла до функции updateContent. Внутри неё была регулярка, которая искала то, что нужно подменить в index.html, и замещала это на распаршенные значения. Но регулярка была сломана, т.к. там ожидались обязательные пробелы внутри {{}}. Если заменить + (поиск 1 или более символов) на * (поиск 0 или более символов) около \s, то работает как надо.

Теперь html в panel webview правильная, но вместо {{content}} осталась просто пустота. Перепроверив, что html точно доходит до panel, посмотрела на style.css, там селектор неправильный. В html нет класса .div, так что скорее всего нужно просто div выбирать.

Но оказалось, что этого не достаточно. Попробовала локально вне VS запустить html + css - отображается. Погуглила, наткнулась на документацию, вот этот раздел https://code.visualstudio.com/api/extension-guides/webview#loading-local-content, - там описано, что в vs нужен особый формат uri. Вот так работает:

const getMediaPath = (context: vscode.ExtensionContext, panel: vscode.WebviewPanel) => {
      return panel.webview.asWebviewUri(vscode.Uri.file(context.extensionPath)).toString() + '/';
};

Превью показывается

Перечитала, как должно работать превью. Проверила, что всё работает:

  • Доступно для любого Json.
  • Всеми вариантами открывается,
  • вкладка рядом,
  • лишний раз не открывается.
  • При обновлении json превью тоже обновляется.

Подменила style.css стилями из первого задания, добавила script.js в html. Стало отображаться красиво. Можно вернуться к отображению прямоугольниками, если в index.html заменить стили на styles_init.css

Working preview screens can be found in github repo -> media -> proofs

Линтер не работает

Посмотрела, откуда мог бы вызываться линтер. Попутно поправила в функции GetSeverity перепутанные местами типы severity. Нашла функцию client connection.

Поискала документацию, вот тут что-то хорошее написано https://code.visualstudio.com/api/language-extensions/language-server-extension-guide, прочитала.

Дальше можно было бы добиться, чтобы линтер всё-таки запустился, и скорее всего он бы неправильно парсил. Можно было бы написать автотесты, тем более что здесь уже предусмотрена для них стартовая конфигурация. С их помощью проверить, что не так, и поправить всё, что парсится неправильно. Но, увы, время закончилось, так что сделать это я уже не успею :(