Working with Scalar Types

1. Using Built-in Scalars

ScalarJSON TypeDescription
IntnumberSigned 32-bit integer
FloatnumberSigned double-precision floating point
StringstringUTF-8 character sequence
Booleanbooleantrue or false
IDstringUnique identifier; serialized as String, accepts Int input

2. Defining Custom Scalar Types

MethodDirectionPurpose
serialize(value)Server → ClientConvert internal value to JSON
parseValue(value)Client → Server (variables)Validate runtime input
parseLiteral(ast)Client → Server (inline)Validate AST literal

Example: Custom DateTime scalar

import { GraphQLScalarType, Kind } from "graphql";

export const DateTime = new GraphQLScalarType({
  name: "DateTime",
  description: "ISO-8601 date-time string",
  serialize: (v) => (v instanceof Date ? v.toISOString() : v),
  parseValue: (v) => new Date(v),
  parseLiteral: (ast) =>
    ast.kind === Kind.STRING ? new Date(ast.value) : null
});

3. Implementing Scalar Serialization

AspectDetail
OutputMust return a JSON-serializable value
ErrorsThrow to fail field with execution error
IdempotentSame input → same output

4. Implementing Scalar Parsing

HookReceivesReturns
parseValueJSON value from variablesInternal representation
parseLiteralAST node (Kind.STRING/INT/...)Internal representation
Warning: Always implement BOTH parseValue and parseLiteral, otherwise inline literals or variables may silently fail.

5. Validating Scalar Values

Example: Throw on invalid input

import { GraphQLError } from "graphql";

parseValue(value) {
  if (typeof value !== "string" || !/^\\+?[1-9]\\d{1,14}$/.test(value)) {
    throw new GraphQLError("Invalid E.164 phone number");
  }
  return value;
}
StrategyUse
RegexFormat-bound (phone, slug, hex)
LibraryEmail, URL, UUID, JWT — use proven libs
RangeNonNegativeInt, Positive, BigInt

6. Creating Date Scalar

VariantFormatLibrary
DateTimeISO-8601 with offsetgraphql-scalars
DateYYYY-MM-DDgraphql-scalars
TimeHH:MM:SS[.sss]graphql-scalars
TimestampUnix epoch secondscustom

7. Creating JSON Scalar

ConcernNote
Use caseSchemaless blobs (analytics events, settings)
Librarygraphql-type-json
RiskLoses type safety; avoid for first-class data

8. Creating Email Scalar

Example: EmailAddress via graphql-scalars

import { EmailAddressTypeDefinition, EmailAddressResolver } from "graphql-scalars";

const typeDefs = [EmailAddressTypeDefinition, /* ... */];
const resolvers = { EmailAddress: EmailAddressResolver };
ValidationStandard
FormatRFC 5321 / 5322
Librarygraphql-scalars EmailAddress

9. Creating URL Scalar

ConcernDetail
ValidationWHATWG URL, allowed schemes (http/https)
TypeURL from graphql-scalars
SecurityReject javascript:, file: schemes server-side

10. Creating Upload Scalar

AspectDetail
Specgraphql-multipart-request-spec
Librarygraphql-upload
Resolver receives{ filename, mimetype, encoding, createReadStream() }
AlternativePre-signed S3 URLs (recommended for large files)