@saeris/graphql-scalars
Version:
A collection of scalar types using Joi for validation
341 lines (240 loc) • 10.6 kB
Markdown
<h1 align="center" style="display: block; text-align: center;">📐 GraphQL Scalars</h1>
<p align="center"><a href="https://www.npmjs.org/package/@saeris/graphql-scalars"><img src="https://img.shields.io/npm/v/@saeris/graphql-scalars.svg?style=flat" alt="npm"></a><a href="https://travis-ci.com/Saeris/graphql-scalars"><img src="https://travis-ci.com/Saeris/graphql-scalars.svg?branch=master" alt="travis"></a><a href="https://codecov.io/gh/Saeris/graphql-scalars"><img src="https://codecov.io/gh/Saeris/graphql-scalars/branch/master/graph/badge.svg" alt="codecov"/></a></p>
<p align="center">A library of custom <a href="http://graphql.org/learn/schema/#scalar-types">GraphQL scalar types</a> for creating precise type-safe GraphQL schemas, with validation powered by <a href="https://github.com/jquense/yup">Yup</a>.</p>
---
## 📦 Installation
```bash
npm install --save graphql @saeris/graphql-scalars
# or
yarn add graphql @saeris/graphql-scalars
```
## 🔧 Usage
To use these scalars you'll need to add them in two places, your schema and your resolvers map. Here is an example of how to use them with [Apollo Server](https://github.com/apollographql/apollo-server):
```js
import { ApolloServer } from "apollo-server"
import { makeExecutableSchema } from "graphql-tools"
import CustomScalars, { RegularExpressionFactory } from "@saeris/graphql-scalars"
// Alternatively, import individual scalars and resolvers:
// import { DateTimeScalar, DateTime } from "@saeris/graphql-scalars"
const { scalar: MyRegexScalar, resolver: MyRegex } = RegularExpressionFactory(`MyRegex`, /^abc$/)
const server = new ApolloServer({
schema: makeExecutableSchema({
typeDefs: [
...CustomScalars.keys(),
// DateTimeScalar,
MyRegexScalar
],
resolvers: {
...CustomScalars.values(),
// DateTime,
MyRegex
}
})
})
server.listen().then(({ url }) => {
console.log(`🚀 Server ready at ${url}`)
})
```
Now you can use them in your schema just like you would any other Type/Scalar:
```graphql
type Person {
birthDate: DateTime
ageInYears: PositiveInt
heightInInches: PositiveFloat
minimumHourlyRate: UnsignedFloat
currentlyActiveProjects: UnsignedInt
email: EmailAddress
homePage: URL
phoneNumber: PhoneNumber
homePostalCode: PostalCode
}
```
## 🏖️ Example
You can quickly take this library for a spin by running the example either locally under the `example` directory (just run `yarn && yarn start` and open your browser to http://localhost:4000) or live inside of CodeSandbox [here](https://codesandbox.io/s/github/Saeris/graphql-scalars/).
## 📐 Scalars
### DateTime
```js
import { DateTimeScalar, DateTime } from "@saeris/graphql-scalars"
```
Use real JavaScript Dates for GraphQL fields. Currently you can use a String or an Int (e.g., a
timestamp in milliseconds) to represent a date/time. This scalar makes it easy to be explicit about
the type and have a real JavaScript Date returned that the client can use _without_ doing the
inevitable parsing or conversion themselves.
### EmailAddress
```js
import { EmailAddressScalar, EmailAddress } from "@saeris/graphql-scalars"
```
A field whose value conforms to the standard internet email address format as specified in
[RFC822](https://www.w3.org/Protocols/rfc822/).
### GUID
```js
import { GUIDScalar, GUID } from "@saeris/graphql-scalars"
```
A field whose value is a generic [Globally Unique Identifier](https://en.wikipedia.org/wiki/Universally_unique_identifier).
### Hexadecimal
```js
import { HexadecimalScalar, Hexadecimal } from "@saeris/graphql-scalars"
```
A field whose value is a [hexadecimal](https://en.wikipedia.org/wiki/Hexadecimal).
### HexColorCode
```js
import { HexColorCodeScalar, HexColorCode } from "@saeris/graphql-scalars"
```
A field whose value is a [hex color code](https://en.wikipedia.org/wiki/Web_colors).
### HSL
```js
import { HSLScalar, HSL } from "@saeris/graphql-scalars"
```
A field whose value is a [CSS HSL color](https://developer.mozilla.org/en-US/docs/Web/CSS/color_value#hsl()_and_hsla()).
### HSLA
```js
import { HSLAScalar, HSLA } from "@saeris/graphql-scalars"
```
A field whose value is a [CSS HSLA color](https://developer.mozilla.org/en-US/docs/Web/CSS/color_value#hsl()_and_hsla()).
### IPv4
```js
import { IPv4Scalar, IPv4 } from "@saeris/graphql-scalars"
```
A field whose value is a [IPv4 address](https://en.wikipedia.org/wiki/IPv4).
### IPv6
```js
import { IPv6Scalar, IPv6 } from "@saeris/graphql-scalars"
```
A field whose value is a [IPv6 address](https://en.wikipedia.org/wiki/IPv6).
### ISBN
```js
import { ISBNScalar, ISBN } from "@saeris/graphql-scalars"
```
A field whose value is a [ISBN-10 or ISBN-13 number](https://en.wikipedia.org/wiki/International_Standard_Book_Number).
### MAC
```js
import { MACScalar, MAC } from "@saeris/graphql-scalars"
```
A field whose value is a IEEE 802 48-bit [MAC address](https://en.wikipedia.org/wiki/MAC_address).
### NegativeFloat
```js
import { NegativeFloatScalar, NegativeFloat } from "@saeris/graphql-scalars"
```
Floats that will have a value less than 0. Uses [`parseFloat()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseFloat).
### NegativeInt
```js
import { NegativeIntScalar, NegativeInt } from "@saeris/graphql-scalars"
```
Integers that will have a value less than 0. Uses [`parseInt()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt).
### NonPositiveFloat
```js
import { NonPositiveFloatScalar, NonPositiveFloat } from "@saeris/graphql-scalars"
```
Floats that will have a value of 0 or less. Uses [`parseFloat()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseFloat).
### NonPositiveInt
```js
import { NonPositiveIntScalar, NonPositiveInt } from "@saeris/graphql-scalars"
```
Integers that will have a value of 0 or less. Uses [`parseInt()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt).
### PhoneNumber
```js
import { PhoneNumberScalar, PhoneNumber } from "@saeris/graphql-scalars"
```
A field whose value conforms to the standard E.164 format as specified in
[E.164 specification](https://en.wikipedia.org/wiki/E.164). Basically this is `+17895551234`.
The very powerful
[`libphonenumber` library](https://github.com/googlei18n/libphonenumber) is available to take
_that_ format, parse and display it in whatever display format you want. It can also be used to
parse user input and _get_ the E.164 format to pass _into_ a schema.
### Port
```js
import { PortScalar, Port } from "@saeris/graphql-scalars"
```
A field whose value is a valid [TCP port](https://en.wikipedia.org/wiki/Transmission_Control_Protocol#TCP_ports) within the range of 0 to 65535.
### PositiveFloat
```js
import { PositiveFloatScalar, PositiveFloat } from "@saeris/graphql-scalars"
```
Floats that will have a value greater than 0. Uses [`parseFloat()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseFloat).
### PositiveInt
```js
import { PositiveIntScalar, PositiveInt } from "@saeris/graphql-scalars"
```
Integers that will have a value greater than 0. Uses [`parseInt()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt).
### PostalCode
```js
import { PostalCodeScalar, PostalCode } from "@saeris/graphql-scalars"
```
A field whose value conforms to the standard Portal Code format of any of the following countries:
* US - United States
* GB - United Kingdom
* DE - Germany
* CA - Canada
* FR - France
* IT - Italy
* AU - Australia
* NL - Netherlands
* ES - Spain
* DK - Denmark
* SE - Sweden
* BE - Belgium
* IN - India
Uses [`joi-postalcode`](https://github.com/abythell/joi-postalcode) for validation, which uses [`postal-codes-js`](https://github.com/Cimpress-MCP/postal-codes-js) under the hood.
### RGB
```js
import { RGBScalar, RGB } from "@saeris/graphql-scalars"
```
A field whose value is a [CSS RGB color](https://developer.mozilla.org/en-US/docs/Web/CSS/color_value#rgb()_and_rgba()).
### RGBA
```js
import { RGBAScalar, RGBA } from "@saeris/graphql-scalars"
```
A field whose value is a [CSS RGBA color](https://developer.mozilla.org/en-US/docs/Web/CSS/color_value#rgb()_and_rgba()).
### UnsignedFloat
```js
import { UnsignedFloatScalar, UnsignedFloat } from "@saeris/graphql-scalars"
```
Floats that will have a value of 0 or more. Uses [`parseFloat()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseFloat).
### UnsignedInt
```js
import { UnsignedIntScalar, UnsignedInt } from "@saeris/graphql-scalars"
```
Integers that will have a value of 0 or more. Uses [`parseInt()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt).
### URL
```js
import { URLScalar, URL } from "@saeris/graphql-scalars"
```
A field whose value conforms to the standard URL format as specified in
[RFC3986](https://www.ietf.org/rfc/rfc3986.txt).
## 🏭 Factories
### rangeFactory
```js
import { rangeFactory } from "@saeris/graphql-scalars"
```
A `GraphQLScalarType` factory that takes the following config:
* `name` - The name of your custom scalar
* `start` - Minimum value this scalar will accept
* `end` - Maximum value this scalar will accept
* `float` - Set to `true` to accept Floats, `false` to accept Integers (Optional, default: `false`)
The following will create a scalar that accepts any Float between 1 and 1000 as a valid value
```js
const { scalar: RangeScalar, resolver: Range } = new RegularExpressionFactory({
name: 'Range',
start: 1,
end: 1000,
float: true
});
```
### regularExpressionFactory
```js
import { regularExpressionFactory } from "@saeris/graphql-scalars"
```
A `GraphQLScalarType` factory that takes the following config:
* `name` - The name of your custom scalar
* `regex` - The regex to be used to check against any values for fields with this new type
The following will create a scalar that accepts only Strings that match `ABC` as a valid value
```js
const { scalar: RegexScalar, resolver: Regex } = new RegularExpressionFactory({
name: 'Regex',
regex: /^ABC$/
});
```
## 📣 Acknowledgements
This library was forked from [@okgrow/graphql-scalars](https://github.com/okgrow/graphql-scalars) and uses [Yup](https://github.com/jquense/yup) for validation.
## 🥂 License
Released under the [MIT license](https://github.com/Saeris/graphql-scalars/blob/master/LICENSE.md).