import type { Node } from 'web-tree-sitter'; import type { EnumTypeDefinitionNode } from './enum_type_definition.js'; import type { InputObjectTypeDefinitionNode } from './input_object_type_definition.js'; import type { InterfaceTypeDefinitionNode } from './interface_type_definition.js'; import type { ObjectTypeDefinitionNode } from './object_type_definition.js'; import type { ScalarTypeDefinitionNode } from './scalar_type_definition.js'; import type { UnionTypeDefinitionNode } from './union_type_definition.js'; const TYPE = 'type_definition' as const; // ================================================================ // ================================================================ // // TypeDefinitionNode // // GraphQL type definition node // // ================================================================ // ================================================================ /** * Represents a type definition in the GraphQL AST. * * Children: * {@link EnumTypeDefinitionNode}, {@link InputObjectTypeDefinitionNode}, {@link InterfaceTypeDefinitionNode}, {@link ObjectTypeDefinitionNode}, {@link ScalarTypeDefinitionNode}, {@link UnionTypeDefinitionNode} * */ export interface TypeDefinitionNode extends Node { type: typeof TYPE; } // ================================================================ // ================================================================ // // Type Guard // // ================================================================ // ================================================================ /** * Type guard to check if a node is a {@link TypeDefinitionNode}. * * @param node - The node to check * @returns True if the node is a {@link TypeDefinitionNode} * * @example * ```typescript * if (isTypeDefinitionNode(node)) { * // TypeScript now knows node is TypeDefinitionNode * console.log(node.type); // 'type_definition' * } * ``` */ export function isTypeDefinitionNode(node: unknown): node is TypeDefinitionNode { return (node as any)?.type === TYPE; } // ================================================================ // ================================================================ // // Constructor // // ================================================================ // ================================================================ /** * Creates a new {@link TypeDefinitionNode} with the specified properties. * * @param props - The node properties * @param props.enumtypedefinition - {@link EnumTypeDefinitionNode} * @param props.inputobjecttypedefinition - {@link InputObjectTypeDefinitionNode} * @param props.interfacetypedefinition - {@link InterfaceTypeDefinitionNode} * @param props.objecttypedefinition - {@link ObjectTypeDefinitionNode} * @param props.scalartypedefinition - {@link ScalarTypeDefinitionNode} * @param props.uniontypedefinition - {@link UnionTypeDefinitionNode} * @returns A new {@link TypeDefinitionNode} * * @example * ```typescript * const node = TypeDefinitionNode({ * // properties... * }); * ``` */ export function TypeDefinitionNode(props: Omit): TypeDefinitionNode { return { type: TYPE, ...props }; }