Resolução da depreciação `this-property-fallback`

Contexto

Essencialmente, se você estiver usando algo como {{foo}} em um template Handlebars para referenciar uma propriedade no controller/componente, ela precisará ser atualizada para {{this.foo}}.

Informações upstream: Property Fallback Lookup | Ember.js - Deprecations

Para que o Discourse passe pela atualização do Ember 4.x, introduzimos um shim de retrocompatibilidade para que temas e plugins não precisassem apressar essa mudança. No entanto, não é viável manter esse shim indefinidamente, então precisamos que temas e plugins sejam atualizados para a sintaxe moderna.

Depreciação

Na versão mais recente do Discourse, o uso da sintaxe legada causará a exibição de uma mensagem de depreciação no console. Ela se parecerá com algo assim:

DEPRECATION: [PLUGIN discourse-calendar] O caminho da propriedade `loading` foi usado no template `discourse/plugins/discourse-calendar/discourse/templates/admin-plugins-calendar.hbs` sem usar `this`. Esse comportamento de fallback foi depreciado, todas as propriedades devem ser procuradas em `this` quando usadas no template: {{this.loading}}

Assim como em qualquer outra depreciação, aumentaremos gradualmente a visibilidade deste aviso, até que eventualmente removamos o shim de retrocompatibilidade. Estamos visando provisoriamente o segundo trimestre de 2025 para a remoção final, mas ajustaremos isso com base em dados do mundo real.

Atualizando seu código

Para temas/plugins pequenos, você pode atualizar os templates manualmente para adicionar this. antes de qualquer nome de propriedade.

Para facilitar a transição para temas/plugins maiores, introduzimos uma nova regra do ember-template-lint que inclui um auto-corretor.

Portanto, se você usar a versão mais recente de nossa configuração de linting padrão (conforme o esqueleto do plugin e o esqueleto do tema), todo o código afetado será atualizado automaticamente na próxima vez que você executar ember-template-lint --fix.

Se tiver alguma dúvida/preocupação, por favor, nos avise abaixo!

6 curtidas

Isso é incrível! Em um dos meus plugins onde (acho que) atualizei corretamente a configuração de lint, vejo um monte de instâncias de {{this.blah}} que tenho certeza que não estavam lá até recentemente. Não consigo exagerar o quão legal isso é. :tada: :clinking_glasses: :beers:

Seria bom se houvesse uma maneira automatizada de copiar/remover os arquivos corretos em cada plugin quando houvesse uma atualização do esqueleto. (Posso ou não ter criado uma maneira de fazer isso manualmente desta vez.) Talvez fosse possível colocar um pequeno script bash no esqueleto que verificasse plugin.rb no diretório atual e, se estivesse lá, pudesse copiar coisas de onde o script estava para o diretório atual. Algo assim.

1 curtida

Nós não o divulgamos muito, mas você pode se interessar por GitHub - discourse/mass-pr: A tool for applying automated changes across a large number of GitHub repositories. Nós o usamos para aplicar esses tipos de alterações em mais de 600 repositórios de temas/plugins que mantemos.

Então, neste caso, eu executo algo como:

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

e ele atualiza as coisas do esqueleto, corrige automaticamente toda a lintagem e cria o PR no GitHub.

Então, temos outro script para lidar com a mesclagem: GitHub - discourse/mass-merge: A script for mass-approving and merging Dependabot pull requests

Definitivamente #pr_welcome em um script de atualização mais leve! Estes são um pouco pesados se você tiver apenas um repositório para atualizar.

5 curtidas

Não. Acredito. Isso é incrível!

Mal posso esperar para experimentar, mas também não pude esperar para agradecer.

Não. Um script é 4x mais fácil de manter do que 2, e se vocês estiverem usando aquele, então é aquele que eu quero usar.

Muito legal.

Obrigado, David! Isso é fantástico.

Primeiro, demorei um pouco para descobrir que preciso executar pnpm install.

E agora tenho isto:

#!/usr/bin/env bash
# sync-with-skeleton -- assume que você está em um
hoje=$(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: Update GitHub workflows" \
--branch "sync-with-skeleton-$hoje" \
--script scripts/update-workflows.sh \
$repo

Seria melhor se, digamos, ele verificasse a existência de um plugin.rb no diretório atual e talvez até verificasse se o repositório existe, mas é o que tive tempo para hoje. Ou eu poderia enviá-lo como um PR e ele poderia navegar até o diretório onde ele residia.

E isso também me ensinou por que devo enviar coisas como PRs, mesmo quando sou só eu. Muito obrigado.

2 curtidas