postgraphile-shopify-inflector
TypeScript icon, indicating that this package has built-in type declarations

2.0.0 • Public • Published

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 the company_id column follows the [table_name]_id naming convention)
  • All update mutations now accept patch instead of companyPatch / 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.

Package Sidebar

Install

npm i postgraphile-shopify-inflector

Weekly Downloads

0

Version

2.0.0

License

MIT

Unpacked Size

17.4 kB

Total Files

5

Last publish

Collaborators

  • m-sanders1989