graphql-compose
Version:
GraphQL schema builder from different data sources with middleware extensions.
57 lines (47 loc) • 1.38 kB
Flow
import { GraphQLScalarType } from 'graphql';
import { GraphQLError } from 'graphql/error';
import { Kind } from 'graphql/language';
export default new GraphQLScalarType({
name: 'Date',
serialize(value) {
if (
typeof value === 'string' &&
/^(\d{4})-(\d{2})-(\d{2})T((\d{2}):(\d{2}):(\d{2}))\.(\d{3})Z$/.test(value)
) {
return value;
}
if (!(value instanceof Date)) {
throw new TypeError('Field error: value is not an instance of Date');
}
if (isNaN(value.getTime())) {
throw new TypeError('Field error: value is an invalid Date');
}
return value.toJSON();
},
parseValue(value) {
const date = new Date(value);
if (isNaN(date.getTime())) {
throw new TypeError('Field error: value is an invalid Date');
}
return date;
},
parseLiteral(ast) {
if (ast.kind !== Kind.STRING) {
throw new GraphQLError(
`Query error: Can only parse strings to buffers but got a: ${ast.kind}`,
[ast]
);
}
const result = new Date(ast.value);
if (isNaN(result.getTime())) {
throw new GraphQLError('Query error: Invalid date', [ast]);
}
if (ast.value !== result.toJSON()) {
throw new GraphQLError(
'Query error: Invalid date format, only accepts: YYYY-MM-DDTHH:MM:SS.SSSZ',
[ast]
);
}
return result;
},
});