Переход на нативный синтаксис классов JS в темах и плагинах

За последние несколько лет мы постепенно отказываемся от устаревшего синтаксиса Ember .extend({ ... }) в пользу синтаксиса нативных классов, такого как class extends Foo {...}.

Хотя устаревший синтаксис технически всё ещё поддерживается, современные инструменты для работы с JS, включая IDE и Prettier 3.0, не поддерживают декораторы в устаревших синтаксисах на основе объектных литералов. В последней версии нашей рекомендуемой конфигурации линтера вы увидите следующие ошибки при использовании устаревшего синтаксиса:

ESLint: error Native JS classes should be used instead of classic classes ember/no-classic-classes

Prettier: SyntaxError: Decorators cannot be used to decorate object literal properties

Поэтому, если вы ещё этого не сделали, самое время обновить код вашей темы и плагинов до нового синтаксиса. Необходимо обновить два основных элемента: определения новых классов и вызовы modifyClass.

Определения классов

Значительную часть работы можно выполнить с помощью ember-native-class-codemod. Выполните следующую команду из корневого каталога вашего репозитория темы/плагина:

NO_TELEMETRY=true npx ember-native-class-codemod@4.1.1 --no-classic-decorator **/*.js

Этот скрипт пройдёт по всем вашим файлам и преобразует их в новый синтаксис нативных классов. Иногда он может потребовать вашего ручного вмешательства. Всегда проверяйте внесённые изменения — скрипт не идеален.

Если у вас много тем или плагинов для обновления, вам может быть интересен наш скрипт массовых PR.

Вызовы modifyClass

Если вы используете декораторы внутри вызовов modifyClass, то вам необходимо перейти на новый синтаксис, основанный на нативных классах. Дополнительную информацию об этом можно найти в документации. При внесении этих изменений, пожалуйста, учитывайте задокументированные ограничения.

Ошибка, из-за которой я решил найти эту тему, обсуждалась в посте Prettier жалуется, что @discourseComputed нельзя использовать для декорирования свойств литералов

SyntaxError: Декораторы нельзя использовать для декорирования свойств литералов объектов. (9:3)

РЕДАКТИРОВАНИЕ: О, всё просто. Это прямо здесь, в тексте, но клянусь, поиск не нашёл это, и ИИ отправил меня к моей теме годичной давности.

И, к сожалению, хотя магия сработала на моих контроллерах и маршрутах, похоже, она не исправила мои компоненты.