Vize

スクリプトのルール設定

実行環境のグローバル変数や特定のプロパティへのアクセスを制限したいとき、イベント名や コンパイラーマクロの順序を揃えたいとき、props の分割代入の方針を決めたいときに、 このページの例を使ってください。 設定できるオプションの一覧、未定義のフィールドを指定した場合の動作、ファイルごとの設定の置き換え方は、 ルールのオプションで確認できます。

script/no-restricted-globals

実行環境のグローバル変数を、プロジェクトで用意したヘルパー経由で使う場合に、このルールを使います。 オプションを省略すると、process、localStorage、sessionStorage を報告します。 空でない globals のリストを指定すると、組み込みのリストを置き換えます。空のリストでは組み込みの 設定に戻るため、リストを空にしてもルールの検査は無効になりません。

import { defineConfig } from "@vizejs/vite-plugin/vite-plus";

export default defineConfig({
  vue: {
    linter: {
      "rules": {
        "script/no-restricted-globals": "error"
      },
      "ruleOptions": {
        "script/no-restricted-globals": {
          "globals": [
            {
              "name": "process",
              "message": "Read env through useRuntimeConfig()."
            },
            {
              "name": "localStorage"
            }
          ]
        }
      }
    }
  }
});

悪い:

const flag = process.env.FEATURE_FLAG;
const token = localStorage.getItem("auth.token");

良い:

const flag = useRuntimeConfig().featureFlag;
const token = authStorage.read("auth.token");

script/no-restricted-members

ブラウザーの API を SSR を考慮したヘルパー経由で呼び出すなど、特定のプロパティへの直接アクセスを プロジェクトごとに禁止する場合に、このルールを使います。組み込みの禁止リストはありません。 members が空でなく、ルールを有効にしている場合だけ報告します。各項目は、変数名で指定した オブジェクトと、静的なプロパティ名の組み合わせに一致します。

import { defineConfig } from "@vizejs/vite-plugin/vite-plus";

export default defineConfig({
  vue: {
    linter: {
      "rules": {
        "script/no-restricted-members": "error"
      },
      "ruleOptions": {
        "script/no-restricted-members": {
          "members": [
            {
              "object": "window",
              "property": "localStorage",
              "message": "Use authStorage."
            },
            {
              "object": "globalThis",
              "property": "process"
            }
          ]
        }
      }
    }
  }
});

悪い:

const token = window.localStorage.getItem("auth.token");
const env = globalThis.process.env;

良い:

const token = authStorage.read("auth.token");
const env = readServerEnv();

script/custom-event-name-casing

スクリプトとテンプレートで使うカスタムイベント名の表記を揃えるための設定です。 既定は camelCase です。テンプレートで使うハイフン区切りの表記に揃える場合は、kebab-case を指定します。

import { defineConfig } from "@vizejs/vite-plugin/vite-plus";

export default defineConfig({
  vue: {
    linter: {
      "rules": {
        "script/custom-event-name-casing": "error"
      },
      "ruleOptions": {
        "script/custom-event-name-casing": {
          "casing": "kebab-case"
        }
      }
    }
  }
});

悪い(上の設定では違反):

const emit = defineEmits(["saveItem"]);
emit("saveItem");

良い:

const emit = defineEmits(["save-item"]);
emit("save-item");

script/define-macros-order

order には、<script setup> の先頭に置くコンパイラーマクロと、その順序を指定します。 既定は ["defineProps", "defineEmits"] です。リストに含めないマクロは、通常の文として扱います。

import { defineConfig } from "@vizejs/vite-plugin/vite-plus";

export default defineConfig({
  vue: {
    linter: {
      rules: { "script/define-macros-order": "warn" },
      ruleOptions: {
        "script/define-macros-order": {
          order: ["defineOptions", "defineProps", "defineEmits", "defineSlots"],
        },
      },
    },
  },
});

悪い(上の設定では違反):

<script setup lang="ts">
const props = defineProps<{ label: string }>();
defineOptions({ inheritAttrs: false });
</script>

良い:

<script setup lang="ts">
defineOptions({ inheritAttrs: false });
const props = defineProps<{ label: string }>();
</script>

script/define-props-destructuring

既定の only-when-assigned では、戻り値を変数に代入する場合に分割代入を要求します。 戻り値を代入しない defineProps<Props>() は許可します。always は戻り値を代入しない呼び出しも報告し、 never は反対に分割代入を報告します。Vue 3.5 では、props を分割代入してもリアクティビティを保ちます。

import { defineConfig } from "@vizejs/vite-plugin/vite-plus";

export default defineConfig({
  vue: {
    linter: {
      preset: "incremental",
      rules: { "script/define-props-destructuring": "warn" },
      ruleOptions: { "script/define-props-destructuring": { destructure: "only-when-assigned" } },
    },
  },
});

悪い:

<script setup lang="ts">
const props = defineProps<{ size?: string }>();
</script>

良い:

<script setup lang="ts">
const { size = "md" } = defineProps<{ size?: string }>();
</script>

ESLint から移行する場合は、Vize のルール ID と型付きオプションを別に指定します。

 rules: { "vue/define-props-destructuring": ["warn", "always"] }
 rules: { "script/define-props-destructuring": "warn" },
 ruleOptions: { "script/define-props-destructuring": { destructure: "always" } }

追加する設定は、上記の Vite+ 設定の vue.linter に指定してください。