Handlebars を lint する方法はありますか?

Discourse で Handlebars ファイルをリントする方法を探していました。実行されているように見えるコマンドが見つかったのですが、変更も問題のリストも表示されません。

yarn ember-template-lint --fix path/to/files

現時点でこれが機能するはずなのかどうかもわかりません。

yarn ember-template-lint <dir> が正しいコマンドです。

ありがとうございます。しかし、何も報告されないようです。破損したファイルで試してみましたが、エラーが表示されたり修正されたりしません。

@cvx 先ほど当社のプラグインワークフローでこれを実装されましたが、利用するために何か特別な手順が必要でしょうか?

マジックは不要です :slightly_smiling_face: ただし、Discourse のルートディレクトリでコマンドを実行してください。これに何度か引っかかっています。

比較:

# [discourse]/app/assets/javascripts 内
$ yarn ember-template-lint .
✨ 完了 (2.57 秒)
# [discourse] 内
$ yarn ember-template-lint app/assets/javascripts
app/assets/javascripts/discourse/app/templates/tags.hbs
  4:0  error  {{debugger}} の使用は予期せぬものです。  no-debugger
  4:0  error  三重中括弧の使用は安全ではありません  no-triple-curlies
  3:15  error  L1:C0 で始まる `d-section` のインデントが正しくありません。L3:C15 で終わる `{{/d-section}}` はインデント 0 になるべきですが、1 になっています。  block-indentation
  2:4  error  L2:C4 で始まる `{{outlet}}` のインデントが正しくありません。`{{outlet}}` はインデント 2 になるべきですが、4 になっています。  block-indentation
  1:23  error  テンプレートでは二重引用符を使用する必要があります  quotes

✖ 5 件の問題 (エラー 5、警告 0)
エラー: コマンドが終了コード 1 で失敗しました。

また、設定ファイル (.template-lintrc.js) が使用されるため、一部のルールが現在無効化されている場合、予想されるすべての問題が報告されない可能性がある点にも注意してください。


@justin 今気づいたのですが、当社のプラグイン GitHub Actions ワークフローは現在、この設定を共有していません。いつかそれを修正する必要がありますね :smiley:

これは plugins/ で動作しますか?@fzngagan さんがこれを使いたいと考えているのはおそらくそこだと思います。

プラグインが plugins ディレクトリにあれば、もちろん大丈夫です!:smiley:

$ yarn ember-template-lint plugins
plugins/poll/assets/javascripts/discourse/templates/modal/poll-breakdown.hbs
  1:22  error  テンプレートではダブルクォートを使用する必要があります  quotes

おそらく同じことをしていると思いますが、もう一度試してご報告します。

Ember テンプレートリンターは、eslint と同様、すべてを自動修正できるわけではありません。実際、eslint とは異なり、Ember テンプレートリンターで修正できるのはごく一部のケースに限られます。

主にエラーを報告するだけで、修正は手動で行う必要があります。

私が試したことは以下の通りです。

Discourse 自体のルールを破ることで試しました。動作します

Discourse ディレクトリ内のシンボリックリンクとして存在する discourse-custom-wizard プラグインのルールを破ることで試しました。動作しません

Discourse リポジトリの一部である poll プラグインでも同じことを試みました。また、Discourse に同梱されている他のプラグインでも試しました。動作します

discourse-custom-wizard プラグインで再度ルールを破る試みを行い、今回はそれを Discourse のプラグインフォルダにコピーしました。動作しません

discourse-assign プラグインのフォルダを plugins 内に配置してルールを破る試みを行いました。動作しません

私の場合:

動作する

yarn ember-template-lint plugins/discourse-pfaffmanager/assets/javascripts/discourse/templates/user/servers/show.hbs 

動作しない

yarn ember-template-lint plugins/discourse-pfaffmanager/assets/javascripts/discourse/templates/user/servers/

そして、私の assetsapp の中に置くべきでしょうか?

ああ、そうです。問題は、ember-template-lint が自動的に .gitignore を参照し、バンドルされていないプラグインを無視してしまうことです。

したがって、すべてのプラグインに対してテンプレートリンティングを実行するには、以下のようにしてください。

yarn ember-template-lint --no-ignore-pattern plugins

# または他の任意のディレクトリ、例えば単一のプラグイン:
yarn ember-template-lint --no-ignore-pattern plugins/discourse-calendar

ありがとうございます。完璧に機能しています。

ありがとうございます!それとは別に、自動的に修正する機能はありますか?--fix を追加してみましたが、効果はありませんでした。

動作しますが、以下の点にご注意ください:

  1. 自動修正可能なルールはごく一部です(詳細:GitHub - ember-template-lint/ember-template-lint: Linter for Ember or Handlebars templates · GitHub
  2. その中で「recommended」ルールセットに含まれているのは、link-rel-noopenerrequire-button-type の 2 つだけです。