Node.js/Nest.js

[Nest.js - GraphQL] Object Type Scalar

BlockHead 2023. 4. 25. 16:05
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 });
        }
    };
}