intra-mart開発のためのESLint設定
- AirbnbのJavaScript Style Guideをベースに、最小限のルール変更を追加
- prettier/prettier: Prettier is an opinionated code formatter. を使う
- intra-mart スクリプト開発API定義を追加
JSDocを記述することを強制します。本ルールでは、各関数について以下の記載を求めます。
- 関数についての説明
- すべての名前付き引数の型(順番も含めて正しいこと)
- 戻り値の型
特に、何も返さない関数についても戻り値の型を記載する必要があります。JavaScriptはreturn
に遭遇しなかった場合やreturn
文に何も与えなかった場合、undefined
を返却するため、次のように記載すると正しいと判定されます。
@returns {void}
@returns {undefined}
引数および戻り値の説明については、型名や変数名から自明な場合は必要ありません。そうでない場合は記載してください。
strictモードを使用します。Strict モード - JavaScript | MDN
このルール定義はESLint Shareable Configsの仕組みで提供されています。
npm i -D eslint eslint-config-airbnb-base eslint-plugin-import eslint-config-imart
See: eslint-config-airbnb-base
プロジェクトのルートディレクトリに.eslintrc
ファイルを以下のように作成します。
{
"root": true,
"extends": [
"airbnb-base/legacy",
"imart",
"prettier"
],
"globals": {
"require": false
}
}
./node_modules/.bin/eslint .
ESLintでは、未定義のグローバルオブジェクトへの参照はエラーとなります。したがって、intra-martのAPIオブジェクトはすべてglobals
として定義される必要があります。
このプロジェクトでは、intra-mart APIのグローバル定義ファイルを提供しています。
必要に応じてextends
として利用してください。
{
"extends": [
"airbnb-base/legacy",
"imart",
"imart/globals/iap-server-core",
"imart/globals/iap-client-core",
"prettier"
]
}
ファイル名のルールは以下の通りです。
${platform}-${environment}-${app}
それぞれの変数間を-
で繋ぎ、各変数内の単語区切りには_
を使います。すべて小文字です。
どのようなAPI定義があるかはglobalsディレクトリを参照してください。
node.jsモジュールを書く場合等、ES6の機能が必要な場合はairbnb-base
を利用してください。
{
"extends": [
"airbnb-base",
"imart",
"prettier"
],
}
ESLintでは、.eslintrc
をlint対象ファイルの位置からファイルシステムを上へ再帰的に適用します: Configuration Cascading and Hierarchy
よって、各プロジェクトに配置する.eslintrc
は次のようになっているべきです:
$PROJECT_HOME/.eslintrc
{
"root": true,
"extends": [
"airbnb-base",
"imart",
"prettier"
]
}
$PROJECT_HOME/src/main/jssp/.eslintrc
{
"extends": ["imart/globals/iap-server-core"]
}
$PROJECT_HOME/src/main/public/.eslintrc
{
"extends": ["imart/globals/iap-client-core"]
}
これにより、ルール定義は共通のまま、サーバサイドJSではサーバ側のAPIのみ、クライアントサイドJSではクライアント側のAPIのみが定義されている状態になります。
ルールのリリース前には、必ずテストを実行してください:
npm test
あるルールを変更する場合、本リポジトリのissueにて議論を行ってください。
npm run
を実行すると、実行可能なコマンドが一覧表示されます。
現時点では以下のコマンドが実行可能です。
npm test
: ルールについてのテストを実行しますnpm run build
: intra-mart APIのグローバル定義を生成します
init関数、action関数などjavascriptファイル内から直接呼ばれない関数/変数は、no-unused-vars
オプションによって未使用の警告が出ます。これを回避するため、eslintに該当変数が他で利用されていることをexported
ディレクティブで通知する必要があります。
/* exported init */
function init(request) {
// code
}
※注: "env": { "node": true }
の環境下ではexported
は機能ません。node.jsでは変数は常にスクリプトローカルであるためです。