Settings
- Node.js v18.14.0
- @nestjs/graphql v10.2.0
object.scalar.ts
import { CustomScalar, Scalar } from '@nestjs/graphql';
import { GraphQLError, Kind, ObjectValueNode, ValueNode } from 'graphql';
@Scalar('Object', () => Object)
export class ObjectScalar implements CustomScalar<Object, Object> {
description = 'Arbitrary object';
parseObject = (ast: ObjectValueNode) => {
const obj = {};
for (const field of ast.fields) {
obj[field.name.value] = this.parseAst(field.value);
}
return obj;
};
parseAst = (ast: ValueNode) => {
switch (ast.kind) {
case Kind.STRING:
case Kind.BOOLEAN:
return ast.value;
case Kind.INT:
return parseInt(ast.value);
case Kind.FLOAT:
return parseFloat(ast.value);
case Kind.OBJECT:
return this.parseObject(ast);
case Kind.LIST:
return ast.values.map(this.parseAst);
default:
return null;
}
};
parseValue = (value) => {
switch (typeof value) {
case 'object':
return value;
case 'string':
return JSON.parse(value);
default:
return null;
}
};
serialize = this.parseValue;
parseLiteral = (ast: ValueNode) => {
switch (ast.kind) {
case Kind.STRING:
return JSON.parse(ast.value);
case Kind.OBJECT:
return this.parseObject(ast);
default:
throw new GraphQLError(`${ast.kind} is not supported.`, { nodes: ast });
}
};
}