屈折形のカスタマイズ

Mirageは、いくつかの規約にインフレクタを利用しています。インフレクタとは、単語の単数形と複数形を変換する役割を担うオブジェクトです。

例えば、UserモデルとGETショートハンドを定義するとします。

createServer({
  models: {
    user: Model,
  },

  routes() {
    this.get("/users/:id")
  },
})

Mirageは、インフレクタを使用して「users」が「user」の複数形であることを認識します。そのため、userモデル定義から自動的にschema.users.all()コレクションを作成し、/users/:idショートハンドを見て、単一のuserモデルインスタンスを返す必要があることを認識します。

一貫性のある命名規則を使用することで、Mirageはモックサーバーの接続に必要な定型コードを大幅に削減できますが、ドメインで使用される屈折規則をカスタマイズする必要がある場合があります。

例えば、アプリケーションにHeadOfStateモデルがあり、システムの他の場所では「head-of-state」の複数形を「heads-of-state」として扱っている場合を考えてみましょう。

サーバーをこのように設定した場合

createServer({
  models: {
    headOfState: Model,
  },

  routes() {
    this.get("/heads-of-state/:id")
  },
})

Mirageは期待通りに動作しません。これは、Mirageのインフレクタがこの特別なケースを知らないためです。デフォルトでは、「head-of-state」の複数形は「head-of-states」になります。

server.inflector.pluralizeメソッドを呼び出すことで確認できます。

let server = createServer({
  models: {
    headOfState: Model,
  },
})

server.inflector.pluralize("head-of-state") // head-of-states

これを修正するには、独自の屈折規則を追加する必要があります。Mirageは、屈折のためにinflectedパッケージを使用しており、次のようにカスタマイズできます。

import { inflections } from "inflected"
import { createServer, Model } from "miragejs"

inflections("en", function (inflect) {
  inflect.irregular("head-of-state", "heads-of-state")
})

createServer({
  headOfState: Model,

  routes() {
    this.get("/heads-of-state/:id")
  },
})

Mirageサーバーをnewする前に、屈折のカスタマイズコードを実行してください。

複数形化規則が有効になったことを確認します。

server.inflector.pluralize("head-of-state") // heads-of-state

これで、MirageのすべてのショートハンドとORM規約が期待通りに動作するはずです。

Inflectedパッケージを使用すると、複数形、単数形、不規則な単語、不可算名詞をカスタマイズできます。

inflections('en', function(inflect) {
  inflect.plural(/^(ox)$/i, '$1$2en');
  inflect.singular /^(ox)en/i, '$1');

  inflect.irregular('octopus', 'octopi');

  inflect.uncountable('equipment', 'snow');
});

詳細が必要な場合は、屈折のカスタマイズに関するドキュメントを参照してください。

完全に別のライブラリを使用するか、またはpluralizeメソッドとsingularizeメソッドをMirageサーバーにinflector設定オプションとして渡すことで、独自のインフレクター実装を使用することもできます。

createServer({
  inflector: {
    pluralize,
    singularize,
  },
})