A GraphQL parser and toolkit for MoonBit
moon add eisem/moon_graphql///|
test "解析 GraphQL 查询" {
let input =
#|query HeroQuery($id: ID!) {
#| hero(id: $id) {
#| name
#| }
#|}
let document = @parser.parse(input)
assert_true(document.definitions.length() == 1)
}///|
test "解析 GraphQL Schema" {
let input =
#|type Query {
#| hero(episode: Episode): Hero
#|}
#|type Hero {
#| name: String
#| friends: [Hero]
#|}
let schema = @parser.parse(input)
assert_true(schema.definitions.length() == 2)
}///|
test "格式化 GraphQL 文档" {
let document = @parser.parse("{ hero { name } }")
let output = @printer.print(document)
inspect(
output,
content=(
#|{
#| hero {
#| name
#| }
#|}
),
)
}///|
test "检查未定义的 Fragment" {
let document = @parser.parse("{ hero { ...missing } }")
let errors = @validation.validate(document)
assert_true(errors.length() > 0)
}///|
test "根据 Schema 验证查询" {
let schema_input =
#|type Query { hero: Hero }
#|type Hero { name: String }
let schema = @parser.parse(schema_input)
let query = @parser.parse("{ hero { name } }")
let errors = @validation.validate_against_schema(query, schema)
assert_true(errors.is_empty())
}moon run cmd/main# 格式化 GraphQL 文档
moon run cmd/format -- "{ hero { name } }"
# 检查格式是否已经规范化
moon run cmd/format -- --check "{ hero { name } }"
# 执行文档级 Lint 检查
moon run cmd/lint -- "{ hero { ...missing } }"moon check --deny-warn
moon test --deny-warn
moon fmt --check
moon run cmd/mainmoon_graphql/
ast/ # AST 类型、位置信息和辅助方法
lexer/ # GraphQL 词法分析器
parser/ # 查询语言与 SDL 解析器
printer/ # AST 格式化输出
validation/ # 文档及 Schema 感知验证
integration/ # 端到端集成测试
cmd/main/ # parse → validate → print CLI 演示A GraphQL parser and toolkit for MoonBit