public documentToTree()

in src/components/operations/operation-details/ko/runtime/graphql-console.ts [206:276]


    public documentToTree(): void {
        try {
            const ast = GraphQL.parse(this.document(), { noLocation: true });
            for (const node of this.globalNodes()) {
                node?.clear();
                node?.toggle(true, false);
            }
            let curNode: GraphQLTreeNode;
            let variables = [];

            // Go through every node in a new generated parsed graphQL, associate the node with the created tree from init and toggle checkmark.
            GraphQL.visit(ast, {
                enter: node => {
                    if (node.kind === GraphQL.Kind.OPERATION_DEFINITION) {
                        variables = [];
                        curNode = this.globalNodes().find(mainNode => mainNode.label() == node.operation);
                    } else if (node.kind === GraphQL.Kind.FIELD || node.kind === GraphQL.Kind.ARGUMENT
                        || node.kind === GraphQL.Kind.OBJECT_FIELD || node.kind === GraphQL.Kind.INLINE_FRAGMENT) {
                        let targetNode: GraphQLTreeNode;
                        if (node.kind === GraphQL.Kind.FIELD) {
                            targetNode = curNode.children().find(n => !n.isInputNode() && n.label() === node.name.value);
                        } else if (node.kind === GraphQL.Kind.INLINE_FRAGMENT) {
                            targetNode = curNode.children().find(n => !n.isInputNode() && n.label() === node.typeCondition.name.value);
                        } else {
                            const inputNode = <GraphQLInputTreeNode>curNode.children().find(n => n.isInputNode() && n.label() === node.name.value);
                            if (node.value.kind === GraphQL.Kind.STRING) {
                                inputNode.inputValue(`"${node.value.value}"`);
                            } else if (node.value.kind === GraphQL.Kind.BOOLEAN || node.value.kind === GraphQL.Kind.INT
                                || node.value.kind === GraphQL.Kind.FLOAT || node.value.kind === GraphQL.Kind.ENUM) {
                                inputNode.inputValue(`${node.value.value}`);
                            } else if (node.value.kind === GraphQL.Kind.VARIABLE) {
                                inputNode.inputValue(`$${node.value.name.value}`);
                            }
                            targetNode = inputNode;
                        }
                        if (targetNode) {
                            curNode = targetNode;
                            curNode.toggle(true, false);
                        }
                    } else if (node.kind === GraphQL.Kind.VARIABLE_DEFINITION &&
                        (node.type.kind === GraphQL.Kind.NAMED_TYPE || node.type.kind === GraphQL.Kind.NON_NULL_TYPE)) {
                        let typeString;
                        if (node.type.kind === GraphQL.Kind.NON_NULL_TYPE && node.type.type.kind === GraphQL.Kind.NAMED_TYPE) {
                            typeString = `${node.type.type.name.value}!`;
                        } else if (node.type.kind === GraphQL.Kind.NAMED_TYPE) {
                            typeString = node.type.name.value;
                        }
                        variables.push({
                            name: node.variable.name.value,
                            type: typeString
                        });
                    }
                },
                leave: node => {
                    if (curNode && (node.kind === GraphQL.Kind.FIELD || node.kind === GraphQL.Kind.ARGUMENT
                        || node.kind === GraphQL.Kind.OBJECT_FIELD || node.kind === GraphQL.Kind.INLINE_FRAGMENT
                        || node.kind === GraphQL.Kind.OPERATION_DEFINITION)) {
                        if (node.kind === GraphQL.Kind.OPERATION_DEFINITION) {
                            (<GraphQLOutputTreeNode>curNode).variables = variables;
                        }
                        if (!(node.kind === GraphQL.Kind.FIELD && node.name.value === GraphqlMetaField.typename)) {
                            curNode = curNode.parent();
                        }
                    }
                }
            });
        } catch (err) {
            // Do nothing here as the doc is invalidated
            return;
        }
    }