A repository of tips and tricks (in both English and French) curated by Mirego’s engineering team.
  • clojure
  • graphql
  • lacinia

kebab-case tout du long dans un API GraphQL avec Lacinia

Lorsque nous bâtissons un API GraphQL en Clojure, nous utilisons la superbe lib de Walmart Labs Lacinia. Par contre, cette dernière exige que les field names exposés par le schema soient tous en camelCase.

Ce petit détail entre fortement en conflit avec les bonnes pratiques Clojurians qui sont d'avoir des vars en kebab-case.

Afin d'éviter de créer des maps mixed du genre:

{:id             id-here
 :internal-value my-internal-value
 :longName       nil
 :veryLongName   nil}

on va fournir un field resolver à Lacinia en option de configuration lors du compile, comme ceci:

(ns platform.graphql.schema
  (:require [camel-snake-kebab.core :refer :all]
            [clojure.java.io :as io]
            [clojure.edn :as edn]
            [com.walmartlabs.lacinia.schema :as lacinia-schema]
            [com.walmartlabs.lacinia.util :as lacinia-util]))

(defn- field-name->kebab-case [field-name]
  (-> (->kebab-case field-name)
      lacinia-schema/default-field-resolver))

(defn build-schema []
  (-> (io/resource "graphql/schema.edn")
      slurp
      edn/read-string
      (lacinia-util/attach-resolvers {:resolve-viewer queries/viewer})
      (lacinia-schema/compile {:default-field-resolver field-name->kebab-case})))

On indique donc à Lacinia que notre mapping de field name est en kebab-case all over the place!