postgraphile-shopify-inflector
v2.0.0
Published
Simplifies the graphile-build-pg inflector to follow Shopify style naming conventions
Downloads
3
Maintainers
Readme
postgraphile-shopify-inflector
This plugin simplifies field names in the PostGraphile schema; e.g.
allUsers
becomes simply users
, User.postsByAuthorId
becomes simply
User.posts
, and Post.userByAuthorId
becomes simply Post.author
.
Mutations follow the Shopify style naming conventions. e.g. createUser
becomes
userCreate
.
Adding this plugin to your schema is almost certainly a breaking change, so do it before you ship anything!
Changes:
Given these tables:
create table companies (
id serial primary key,
name text not null
);
create table beverages (
id serial primary key,
company_id int not null references companies,
distributor_id int references companies,
name text not null
);
Query.allCompanies
👉Query.companies
Query.allBeverages
👉Query.beverages
Beverage.companyByCompanyId
👉Beverage.company
Beverage.companyByDistributorId
👉Beverage.distributor
Company.beveragesByCompanyId
👉Company.beverages
(because thecompany_id
column follows the[table_name]_id
naming convention)- All update mutations now accept
patch
instead ofcompanyPatch
/beveragePatch
- All lists must either be a simple list or a connection. Not both.
- Fields where the singular and plural are the same and a distinct plural is required are force-pluralised ("fishes") to avoid conflicts (e.g.
singularize("fish") === pluralize("fish")
).
Installation:
yarn add postgraphile-shopify-inflector
or
npm install --save postgraphile-shopify-inflector
Usage:
CLI:
postgraphile --append-plugins postgraphile-shopify-inflector
Library:
const PgShopifyInflectorPlugin = require("postgraphile-shopify-inflector");
// ...
app.use(
postgraphile(process.env.AUTH_DATABASE_URL, "app_public", {
appendPlugins: [PgShopifyInflectorPlugin],
})
);
Naming your foreign key fields
By naming your foreign key along the lines of author_id
or author_fk
, e.g.:
CREATE TABLE posts (
id serial primary key,
author_id int not null references users,
...
);
We can automatically extract the field prefix: author
and call the relation
author
rather than the default: user
. This allows for a post to have an
author
, editor
, reviewer
, etc. all which point to users
.
The reverse, however, is not so easy. On the User type, we can't call the
reverse of all these different relations posts
. The default inflector
refers to these as postsByAuthorId
, postsByEditorId
, etc. However we'd
rather use shorter names, so we introduce a new inflector:
getOppositeBaseName
. This inflector is passed a baseName (the part without
the _id
/_fk
suffix, e.g. author
, editor
, reviewer
above) and should
return the opposite of that base name which will be prepended to the target
type to produce, e.g. authoredPosts
, editedPosts
, reviewedPosts
.
Failing this, we just fall back to the default (verbose) inflector; it will be
up to you to add smart comments or a custom inflector to override these.
Handling field conflicts:
In most cases, the conflict errors will guide you on how to fix these issues using smart comments.