Исправление устаревания `this-property-fallback`

Фон

По сути, если вы используете что-то вроде {{foo}} в шаблоне Handlebars для обращения к свойству контроллера или компонента, то это нужно обновить до {{this.foo}}.

Информация от разработчиков фреймворка: Property Fallback Lookup | Ember.js - Deprecations

Чтобы обеспечить переход Discourse на Ember 4.x, мы внедрили адаптер обратной совместимости, чтобы темы и плагины не были вынуждены срочно вносить эти изменения. Однако поддерживать этот адаптер неограниченно долго невозможно, поэтому нам необходимо обновить темы и плагины на современный синтаксис.

Устаревание

В последней версии Discourse использование устаревшего синтаксиса приведёт к выводу сообщения об устаревании в консоль. Оно будет выглядеть примерно так:

DEPRECATION: [PLUGIN discourse-calendar] Путь свойства `loading` использовался в шаблоне `discourse/plugins/discourse-calendar/discourse/templates/admin-plugins-calendar.hbs` без указания `this`. Такое поведение по умолчанию устарело: все свойства должны обращаться к `this` при использовании в шаблоне: {{this.loading}}

Как и в случае с любыми другими устареваниями, мы будем постепенно повышать заметность этого предупреждения, пока в конечном итоге не удалим адаптер обратной совместимости. В настоящее время мы ориентируемся на второе квартал 2025 года для окончательного удаления, но скорректируем эту дату на основе реальных данных.

Обновление вашего кода

Для небольших тем и плагинов вы можете вручную обновить шаблоны, добавив this. перед именем любого свойства.

Чтобы облегчить переход для крупных тем и плагинов, мы внедрили новое правило для ember-template-lint, которое включает автоматический исправитель.

Таким образом, если вы используете последнюю версию нашей стандартной конфигурации линтинга (согласно скелету плагина и скелету темы), то весь затронутый код будет автоматически обновлён при следующем запуске ember-template-lint --fix.

Если у вас есть какие-либо вопросы или опасения, пожалуйста, сообщите нам об этом ниже!

Это потрясающе! В одном из моих плагинов, где (я думаю, я) правильно обновил конфигурацию линтинга, я вижу множество случаев использования {{this.blah}}, которых, я почти уверен, не было до недавнего времени. Не могу передать, насколько это круто. :tada: :clinking_glasses: :beers:

Было бы здорово, если бы существовал автоматический способ копирования/удаления необходимых файлов в каждом плагине при обновлении шаблона. (Возможно, в этот раз я всё же сделал это вручную.) Возможно, можно было бы добавить небольшой bash-скрипт в шаблон, который проверял бы наличие файла plugin.rb в текущей директории, и если он там есть, скрипт копировал бы нужные файлы из своего расположения в текущую директорию. Что-то в этом роде.

Мы не очень широко освещали это, но вас может заинтересовать GitHub - discourse/mass-pr: A tool for applying automated changes across a large number of GitHub repositories · GitHub. Мы используем его для применения подобных изменений в более чем 600 репозиториях тем и плагинов, которые поддерживаем.

Так что в данном случае я запускаю что-то вроде:

GITHUB_TOKEN=... pnpm mass-pr \
  --message "DEV: Update linting" \
  --branch "update-linting" \
  --script scripts/update-js-linting.sh \
  discourse-solved \
  discourse-assign \
  ...

и это обновляет содержимое скелета, автоматически исправляет все проблемы линтинга и создаёт PR на GitHub.

Затем у нас есть ещё один скрипт для обработки слияния: GitHub - discourse/mass-merge: A script for mass-approving and merging Dependabot pull requests · GitHub

Однозначно приветствуем PR с более лёгким скриптом обновления! Эти же скрипты немного избыточны, если нужно обновить только один репозиторий.

Ничего себе! Это потрясающе!

Не могу дождаться, чтобы попробовать это, но также не мог дождаться, чтобы поблагодарить вас.

Нет. Один скрипт в 4 раза проще поддерживать, чем два, и если вы используете именно его, то я тоже хочу использовать его.

Как круто.

Спасибо, Дэвид! Это великолепно.

Сначала мне потребовалось немного времени, чтобы понять, что мне нужно выполнить pnpm install.

А теперь у меня есть вот что:

#!/usr/bin/env bash
# sync-with-skeleton -- предполагает, что вы находитесь в 
today=$(date +"%Y-%m-%d")
repo=$(grep url .git/config | sed -E 's/.*:([^\/]+\/[^.]+).*/\1/')
cd ~/src/discourse-repos/mass-pr
GITHUB_TOKEN=$GITHUB_TOKEN pnpm mass-pr \
--message "DEV: Обновление рабочих процессов GitHub" \
--branch "sync-with-skeleton-$today" \
--script scripts/update-workflows.sh \
$repo

Было бы лучше, если бы скрипт, например, проверял наличие файла plugin.rb в текущей директории и, возможно, даже проверял существование репозитория, но на сегодня у меня было на это только время. Или я мог бы отправить это как PR, и тогда он мог бы перейти в директорию, где он находится.

Это также научило меня, почему стоит отправлять изменения как PR, даже если работаю только я. Большое спасибо.