mam_mol
mam_mol copied to clipboard
Отдельный tree-plugin для babel или ts
Нет ли standalone версии tree? Что б генерировал чистые классы из tree пока хотя бы в template strings и его можно было встроить в babel или ts.
PS
Я попытался для реакта применить подход "все содержимое компонента - в точки расширения". без tree получается некрасиво. Каждая хрень в JSX-верстке должна иметь уникальный идентификатор или быть функцией.
Вам нужны только эти два файла:
https://github.com/eigenmethod/mol/blob/master/tree/tree.ts - для работы с форматом tree https://github.com/eigenmethod/mol/blob/master/view/tree/tree.ts - для работы с языком view.tree
А как поддержка типов делается у вас. Вот скомпилился tree в ts-классы, а откуда возьмется информация о типах или все считается строками?
Как ide выдаст предупреждение? Есть какая-то тулза, которая слушает изменения в tree, компилит ts и спустя какое-то время, watch ts сработает и ide покажет ошибки?
Типы выводятся TS компилятором. Единственный нюанс - списки и словари могут содержать любые значения.
Тулза, конечно, есть, но она лишь при сборке сейчас транслирует view.tree в ts: https://github.com/eigenmethod/mol/issues/254
Хотелось бы конечно в ts или в flow поддержку, с автокомплитом прям в tree без всяких компиляций, вы не оценивали трудозатраты? Вроде во flow/ts обещают поддержку syntax-плагинов. Или как в ангуларе сделали - форкнули ts и сляпали ngc.
А не покажите пример, где лажает ts со словарями или списками? Я б во flow по аналогии попробовал бы проверить.
Да ещё и под все IDE.. Боюсь трудоёмкость слишком высока.
Под IDE не надо, достаточно под ts, сейчас тенденция, что IDE - просто морды к стандартным анализаторам, вроде flow/ts.
Тенденция-то хорошая, но она ещё в зачаточном состоянии.
Вы не думали о том, как лучше встроить tree в ts? что б плагином все это конвертить в классы. Например, в template strings работала бы типизация переменных.
Не очень понял что вы имеете ввиду
Преобразовать tree в функцию с шаблоном, по которому ts сгенерит класс:
// some.tree.js
const Some = (t: ISome) => `
prop1:
${t.value}
`
Хотя тут наверное больше проблем будет с интерфейсом.
Пока не знаю как лучше, идея в том, что бы задействовать Compiler-API для генерации ts AST из tree. И написать language service plugin для его нормальной поддержки в ide
Интересная штука, правда как-то не завелась у меня.
Судя по-всему для поддержки типов нужно дождаться Providing types.
Еще упоминается Custom module resolution, но пока нет видимо api для этого. Максимум transformation-plugin можно сделать из валидного ts. Например, когда tree в строке.
Вот, кстати ts-graphql-plugin. Вполне себя норм комплитит, не думали что-то подобное сделать для tree в виде template strings? Проще будет песочницу сделать.
Боюсь я не осилю в ближайшее время.
Описание требуемого функционала для плагина к .tree:
- Навигация по клику на имя компонента к его определению (или к скомпиленной версии .tree, откуда можно средствами ts перейти к определению компонента) Здесь вопрос к компонентам, которые не скомпилены и для них нет сорсмап (дефолтные мол компоненты?). Должны ли мы поддерживать навигацию по таким? Если да, то сорс мапы здесь не помогут. В таком случае фолбэчим до текстового поиска?
- По клику на атрибут/функцию навигация к а) Скомпиленной версии б) Переопределенной в наследнике версии, фолбэк к скомпиленной, если не переопределено.
- Подсказки по ходу набора текста. Если идет выбор компонента, от которого наследуемся, то соответственно должен выдаваться полный список доступных компонентов. Если описываются атрибуты, то должны быть подсказки по атрибутам и т.д..
- Рефакторинг?
- Навигация к файлу с переводами?
- Подсветка
Открыто к обсуждению )
@gituser3000 Давай сделаем todo, где в порядке приоритетов все это перечислим, сперва надо диагностику выводить в tree. Основая идея в том, что б проксировать как можно больше фич от сгенеренного view.ts и tsservr, через маппинг позиций.
Плагин к ide - должен быть самой простой и тонкой прослойкой в tsserver. Сам tsserver расширивается между двумя плагинами, штатным ts-плагином и tree-плагином.
Можно выделить 3 истории в порядке значимости и удобства реализации: