graphql/language
模块负责解析和操作 GraphQL 语言。您可以从 graphql/language
模块或根 graphql
模块导入。例如
import { Source } from "graphql" // ES6var { Source } = require("graphql") // CommonJS
源代码
词法分析器
解析器
访问者
打印机
export class Source { constructor(body: string, name?: string)}
GraphQL 的源输入表示。名称是可选的,但主要对将 GraphQL 文档存储在源文件中的客户端有用;例如,如果 GraphQL 输入位于 Foo.graphql 文件中,则名称可能为“Foo.graphql”。
function getLocation(source: Source, position: number): SourceLocation
type SourceLocation = { line: number; column: number;}
获取 Source 和 UTF-8 字符偏移量,并返回相应的行和列作为 SourceLocation。
function lex(source: Source): Lexer;
type Lexer = (resetPosition?: number) => Token;
export type Token = { kind: number; start: number; end: number; value: ?string;};
给定一个 Source 对象,这将返回该源的词法分析器。词法分析器是一个函数,它就像一个生成器,每次调用它时,它都会返回 Source 中的下一个标记。假设源代码可以进行词法分析,词法分析器发出的最后一个标记将是 EOF 类型的,此后,无论何时调用词法分析器,它都会重复返回 EOF 标记。
词法分析器函数的参数是可选的,可用于将词法分析器回溯或快进到源代码中的新位置。
export function parse( source: Source | string, options?: ParseOptions): Document
给定一个 GraphQL 源代码,将其解析为一个文档。
如果遇到语法错误,则抛出 GraphQLError。
export function parseValue( source: Source | string, options?: ParseOptions): Value
给定包含 GraphQL 值的字符串,解析该值的 AST。
如果遇到语法错误,则抛出 GraphQLError。
这在直接操作 GraphQL 值并独立于完整 GraphQL 文档的工具中很有用。
一个枚举,描述了不同类型的 AST 节点。
function visit(root, visitor, keyMap)
visit() 将使用深度优先遍历遍历 AST,在遍历中的每个节点调用访问者的 enter 函数,并在访问该节点及其所有子节点后调用 leave 函数。
通过从 enter 和 leave 函数返回不同的值,可以改变访问者的行为,包括跳过 AST 的子树(通过返回 false),通过返回一个值或 null 来编辑 AST 以删除该值,或者通过返回 BREAK 来停止整个遍历。
当使用 visit() 编辑 AST 时,原始 AST 不会被修改,并且将从 visit 函数返回一个应用了更改的 AST 的新版本。
var editedAST = visit(ast, { enter(node, key, parent, path, ancestors) { // @return // undefined: no action // false: skip visiting this node // visitor.BREAK: stop visiting altogether // null: delete this node // any value: replace this node with the returned value }, leave(node, key, parent, path, ancestors) { // @return // undefined: no action // false: no action // visitor.BREAK: stop visiting altogether // null: delete this node // any value: replace this node with the returned value },})
除了提供 enter() 和 leave() 函数之外,访问者还可以提供与 AST 节点类型相同的名称的函数,或者在命名键处提供 enter/leave 访问者,从而导致访问者 API 的四种排列
visit(ast, { Kind(node) { // enter the "Kind" node },})
visit(ast, { Kind: { enter(node) { // enter the "Kind" node } leave(node) { // leave the "Kind" node } }})
visit(ast, { enter(node) { // enter any node }, leave(node) { // leave any node },})
visit(ast, { enter: { Kind(node) { // enter the "Kind" node }, }, leave: { Kind(node) { // leave the "Kind" node }, },})
visitor
文档中描述的哨兵 BREAK
值。
function print(ast): string
使用一组合理的格式规则将 AST 转换为字符串。