代码生成配置
的Apollo iOS代码生成引擎具有灵活性,可以配置为不同的行为。
代码生成配置选项由ApolloCodegenConfiguration struct
.
当使用Codegen CLI时,您的配置由CLI的init
命令创建的apollo-codegen-configuration.json
JSON文件表示。
当在您的Swift代码中运行代码生成时,配置选项由ApolloCodegenConfiguration struct
表示。
大多数配置属性都有默认值,这提供了一个良好的起点。
有一些基本配置属性,每个都代表了代码生成引擎的特定特征
属性名称 | 描述 |
---|---|
schemaNamespace | 用于限定生成的模式类型的命名空间。 |
input | 用于定位模式和操作定义文件的搜索模式。 |
output | 生成的文件和模块的位置和结构。 |
options | 规则和选项来定制生成的代码。 |
experimentalFeatures | 用于启用实验性功能。 注意:这些功能可能会随时更改,并且不能保证总是可用。 |
schemaDownload | 在生成前获取GraphQL模式的配置。 |
operationManifest | 为持久查询生成操作说明书的配置。 |
模式命名空间
此选项定义了您的模式模块或命名空间的名字。
除了您的操作定义之外,Apollo iOS还会生成一组表示您模式中类型的元数据对象。所有这些对象都被一个具有提供的名字的命名空间所包含。
如果您要将您的生成的模式类型嵌入到另一个目标中,这将是该目标的名称。
如果您将要包含您的模式类型作为独立的可以作为其他项目目标导入的目标,这将是该目标的名称。
您可以使用output.schemaTypes.moduleType
选项来配置您想如何在项目中包含您的模式类型。
文件输入
代码生成引擎需要一个GraphQL模式和至少一个操作来生成Swift代码。有关更多信息,请参阅关于GraphQL源文件的简介部分。
配置input
属性包括:
属性名称 | 描述 |
---|---|
schemaSearchPaths | 用于查找GraphQL模式文件的路径匹配模式字符串数组。 模式扩展文件可以包含在这些搜索路径中。 注意:JSON格式模式文件必须具有 .json 文件扩展名。 |
operationSearchPaths | 用于查找GraphQL操作文件的路径匹配模式字符串数组。 |
"input": {"schemaSearchPaths": ["**/*.graphqls"],"operationSearchPaths": ["**/*.graphql"]}
let configuration = ApolloCodegenConfiguration(// Other properties not showninput: ApolloCodegenConfiguration.FileInput(schemaSearchPaths: ["**/*.graphqls"],operationSearchPaths: ["**/*.graphql"]),)
搜索路径模式
每个文件输入属性都是一个[String]
搜索路径数组。搜索路径可以用于在项目目录中查找匹配glob模式的文件。可以在路径匹配模式中使用绝对或相对路径。相对路径将基于当前工作目录。
每个路径匹配模式可以包含以下字符
*
匹配除目录分隔符之外的所有内容(浅匹配),例如:*.graphql
?
匹配任意单个字符,例如:file-?.graphql
**
匹配所有子目录(深度匹配),例如:**/*.graphql
!
如果模式以!!字符开头,则排除任何匹配项,例如:
!file.graphql
文件输出
FileOutput
选项用于配置生成的文件及其输出位置。
用于配置output
属性的属性:
属性名称 | 描述 |
---|---|
schemaTypes | 生成的模式类型文件的位置和结构。 |
operations | 生成操作文件(如查询、突变、订阅和片段)的位置和结构。 |
testMocks | 测试模拟操作对象文件的位置和结构。 如果为 .none ,则不会生成测试模拟。 |
"output": {"schemaTypes": {"moduleType": {"swiftPackageManager": {}},"path": "./generated/schema/"},"operations": {"inSchemaModule": {}},"testMocks": {"none": {}},"operationManifest" : {"path" : "./generated/operationIdentifiers.json","version" : "persistedQueries"}}
let configuration = ApolloCodegenConfiguration(// Other properties not shownoutput: ApolloCodegenConfiguration.FileOutput(schemaTypes: ApolloCodegenConfiguration.SchemaTypesFileOutput(path: "./generated/schema/",moduleType: .swiftPackageManager)operations: .inSchemaModule,testMocks: .none,operationIdentifiersPath: "./generated/"))
模式类型
output.schemaTypes: SchemaTypesFileOutput
模式类型适用于所有生成的operation模型,对于生成Swift代码的编译是必需的。
用于配置output.schemaTypes
的属性:
属性名称 | 描述 |
---|---|
path | 生成模式类型时输出文件的路徑。 相对于您的项目根目录 |
moduleType | 如何将生成的模式类型链接到您的项目。 |
模块类型
output.schemaTypes.moduleType: ModuleType
使用ModuleType
的值来配置您的模式类型如何链接到您的项目。代码生成引擎使用此值以确定生成文件的结构,包括 import
语句。
针对单目标应用,可以使用embeddedInTarget(name:]
。
对于多模块项目,建议在单独的模块中创建模式类型,以帮助分离关注点。如果使用Swift Package Manager,可以使用swiftPackageManager
选项来自动创建模块。
注意:此选项必须设置正确,否则生成的代码将无法编译。
moduleType的可能值有:
值 | 描述 |
---|---|
embeddedInTarget(name:accessModifier:) | 表示您希望直接将生成的模块包含在应用程序目标中。 |
swiftPackageManager | 创建一个作为SPM包的schema模块,可以包含到您的项目中。 |
other | 表示您希望手动定义一个schema模块,使用第三方包管理器(如Cocoapods)。 |
嵌入目标中
ModuleType.embeddedInTarget(name: String, accessModifier: AccessModifier)
此选项表示您希望直接将生成的模块包含在应用程序目标中。
name参数必须指定包含schema类型的哈希文件的名称。这将用于生成导入语句,用于导入生成的操作。使用accessModifier参数来控制生成代码的可见性。
将不会为schema类型创建模块。相反,生成的schema类型将包含在一个无命名空间枚举enum
中。
当创建单目标应用程序时,此选项允许您直接将Apollo iOS生成的模块包含到应用程序目标中。
注意:使用此模块类型时,您负责确保生成的文件链接到您的应用程序目标。
"output": {"schemaTypes": {"moduleType": {"embeddedInTarget": {"name": "MyApplicationTarget","accessModifier": "internal"}},"path": "./generated/schema/"}}
let configuration = ApolloCodegenConfiguration(// Other properties not shownoutput: ApolloCodegenConfiguration.FileOutput(schemaTypes: ApolloCodegenConfiguration.SchemaTypesFileOutput(path: "./generated/schema/",moduleType: .embeddedInTarget(name: "MyApplicationTarget", accessModifier: .internal))...))
Swift包管理器
ModuleType.swiftPackageManager
此选项自动化创建用于schema类型的SPM包。这将生成一个适合使用Swift Package Manager将生成的schema类型文件链接到项目的Package.swift文件。
schema类型将包含在具有schemaNamespace
提供的独立模块中。其他含有生成的操作模型模型的目标应用必须与此目标有依赖关系。
对于使用Swift Package Manager的多模块项目,这是推荐的配置选项。
在您的Package.swift
文件中包含模式类型
此选项会生成带有自带的Package.swift
文件的SPM包。如果您想在多个项目之间共享模式模块或在Xcode的包依赖关系GUI中使用它,这是理想的选择。
如果您想在您的Package.swift
文件中将模式模块作为目标合并,您可以在您的Package.swift
文件中定义一个具有生成的名称和路径的目标。
"output": {"schemaTypes": {"moduleType": {"swiftPackageManager": {}},"path": "./generated/schema/"}}
let configuration = ApolloCodegenConfiguration(// Other properties not shownoutput: ApolloCodegenConfiguration.FileOutput(schemaTypes: ApolloCodegenConfiguration.SchemaTypesFileOutput(path: "./generated/schema/",moduleType: .swiftPackageManager)...))
其他模式模块类型
当您想使用其他包管理工具(如CocoaPods)定义模式模块或者想要比ModuleType.swiftPackageManager
允许的更多控制来生成包,或者您想手动创建目标或模块时,应使用此值。
ModuleType.other
将告知代码生成引擎,您的模式类型将被包含在其自己的目标中,而不是嵌入到您的应用程序目标中。这会影响您的生成的操作定义文件中的import语句。
使用此选项,您需要使用您首选的包管理器创建一个目标或模块,用于您的模式模块。
注意:您必须在配置的schemaNamespace
属性中指定您创建的目标或模块的名称。这将被用于导入语句以及生成操作文件中引用类型的完全限定。
"output": {"schemaTypes": {"moduleType": {"other": {}},"path": "./generated/schema/"}}
let configuration = ApolloCodegenConfiguration(// Other properties not shownoutput: ApolloCodegenConfiguration.FileOutput(schemaTypes: ApolloCodegenConfiguration.SchemaTypesFileOutput(path: "./generated/schema/",moduleType: .other)...))
操作
Operation文件是从您配置的operationSearchPaths
匹配的所有GraphQL操作定义生成的。每一个operation(query,mutation,或subscription)和fragment定义将被创建在一个单独的文件中。
想了解更多关于GraphQL操作的信息,请查看定义操作
属性值output.operations决定了生成的操作文件的位置:
值 | 描述 |
---|---|
inSchemaModule | 操作模型将被包含在模式类型模块中。 |
relative(subpath:accessModifier:) | 操作模型将被输出到它们的定义.graphql文件的相对位置。 |
absolute(path:accessModifier:) | 所有操作对象文件将位于指定的路径中。 |
模式模块中的操作
OperationsFileOutput.inSchemaModule
此选项将生成的操作模型包含在您的模式类型相同的模块中。
这意味着输出位置或您的操作模型的确定取决于output.schemaTypes.path选项。使用此选项时,您的模式模块目录将包含一个为您的模式类型、操作、片段以及本地缓存突变操作的Schema
文件夹。
使用此选项时,希望生成的操作模型包含在与模式类型相同的目标中。因此,它们不包括用于导入模式模块的import
语句。
相对操作输出
OperationsFileOutput.relative(subpath: String?, accessModifier: AccessModifier)
此选项将以其GraphQL定义(.graphql
文件)相对位置输出您生成的操作模型。
使用相对操作输出,您可以完全控制操作定义的生成位置。常见的实践是将操作和片段模型与项目中将使用它们的区域一起放置。
可选的subpath
参数可以提供以在它们定义的GraphQL定义文件目录中创建的子文件夹中生成操作模型。如果没有指定subpath
,则所有操作文件将与GraphQL定义文件一起生成。使用accessModifier
属性来控制生成代码的可见性。
多模块项目中的操作模型
如果你的项目由多个模块组成,你可以使用相对操作输出,将操作模型生成到项目不同模块的目录中。为了生成多模块项目的相对操作模型,所有操作模型应同时生成。这意味着代码生成引擎应在可以访问所有模块源文件的上下文中运行。
在生成你的操作模型后,请确保:
- 包含已生成操作模型的所有模块都与包含你的模式类型的目标链接。
- 你的操作模型所引用的片段要么:
- 包含在同一目标中引用的操作;或者
- 直接包含在模式模块中
在未来,我们计划允许你将片段包含在其他模块中,并在你的项目中跨多个模块共享。
绝对操作输出
OperationsFileOutput.absolute(path: String, accessModifier: AccessModifier)
此选项将所有生成的操作模型输出到单个目录中。
使用path
参数指定操作模型目录。在通过CLI使用时,这将作为从包含apollo-codegen-config.json
文件所在的目录 resolved 为相对路径。使用accessModifier
属性来控制生成代码的可见性。
测试模拟
output.testMocks: TestMockFileOutput
可以为你的操作模型创建测试模拟对象,以设置是否生成测试模拟以及如何将它们添加到项目中,请使用此选项。
要了解有关使用测试模拟来模拟你的操作模型的信息,请参阅测试模拟文档。
可以使用以下值配置output.testMocks选项:
值 | 描述 |
---|---|
none | 将不会生成测试模拟。 |
swiftPackage(targetName:) | 将生成测试模拟文件并将其包含在在 SPM 包中定义的目标中。 |
absolute(path:accessModifier:) | 将在指定的路径生成测试模拟文件。 |
Swift Package中的测试模拟
TestMockFileOutput.swiftPackage(targetName: String?)
此选项生成测试模拟文件并定义了在生成的模式模块中的目标 Package.swift
文件,该文件适用于使用 Swift 包管理器将测试模拟文件链接到您的测试目标。
测试模拟目标名称可以通过 targetName
参数来指定。如果未提供 targetName
,则默认目标名称为 "${schemaNamespace}TestMocks"
。
注意: 使用此选项需要您的 output.schemaTypes.moduleType
要设置为 .swiftPackageManager
。如果此选项未提供 .swiftPackageManager
模块类型,代码生成将失败。
绝对测试模拟输出
TestMockFileOutput.absolute(path: String, accessModifier: AccessModifier)
此选项将所有生成的测试模拟输出到一个单独的目录中。
使用 path
参数指定您的测试模拟目录。在在 CLI 中使用时,这被视为相对于包含您的 apollo-codegen-config.json
文件的目录的相对路径。使用 accessModifier
属性来控制生成的代码的可见性。
注意:
- 使用此选项时,您需要确保生成的测试模拟链接到您的测试目标。
- 这种方式生成的测试模拟也可以手动嵌入到由您的测试目标导入的测试实用模块中。
- 测试模拟必须位于与模式模块分开的目标或模块中,并且总是包括链接模式模块的
import
语句。
输出选项
代码生成引擎支持许多配置选项,可更改生成器的行为并调整生成的 Swift 代码以匹配您的特定需求。
顶级属性包括
属性名称 | 描述 |
---|---|
additionalInflectionRules | 任何非默认的类型名称复数化和单数化规则。 |
deprecatedEnumCases | 为使用内置的 @deprecated 指令 标注的 GraphQL 枚举案例的生成的 Swift 枚举添加 Swift @available 属性。 |
schemaDocumentation | 在生成的文件中包含或不包含 架构文档。 |
selectionSetInitializers | 为生成的选择集模型生成初始化器。 |
operationDocumentFormat | 如何为生成的操作生成操作文档。这可以用来生成与支持持久查询或自动持久查询的服务器一起使用的操作标识符。 |
cocoapodsCompatibleImportStatements | 生成与通过CocoaPods包含Apollo兼容的导入语句。 |
warningsOnDeprecatedUsage | 在所有使用过时的GraphQL架构部分的生成的Swift代码中使用Swift @available 属性和@deprecated 项进行注释。 |
conversionStrategies | 如何将架构中的值名称转换为生成的代码中的规则。 |
pruneGeneratedFiles | 是否自动删除未使用的生成的文件。 |
markOperationDefinitionsAsFinal | 生成的GraphQL操作和本地缓存变更类类型是否会被标记为final 。 |
"options": {"additionalInflectionRules": [{"pluralization": {"replacementRegex": "animals","singularRegex": "animal"}}],"deprecatedEnumCases": "include","schemaDocumentation": "include","selectionSetInitializers" : {"operations": false,"namedFragments": false,"localCacheMutations" : true,"definitionsNamed": ["MyOperation","MyFragment"]},"operationDocumentFormat" : ["definition", "operationId"],"cocoapodsCompatibleImportStatements": false,"warningsOnDeprecatedUsage": "include","conversionStrategies": {"enumCases": "camelCase","fieldAccessors": "default","inputObjects": "camelCase"},"pruneGeneratedFiles": true,"markOperationDefinitionsAsFinal": true,"schemaCustomization" : {"customTypeNames" : {"MyEnum" : {"enum" : {"cases" : {"MyCase" : "CustomCase"},"name" : "CustomEnum"}},"MyObject" : "CustomAnimal","MyInputObject" : {"inputObject" : {"fields" : {"myField" : "customField"},"name" : "CustomInputObject"}}}}}
let configuration = ApolloCodegenConfiguration(// Other properties not shownoptions: ApolloCodegenConfiguration.OutputOptions(additionalInflectionRules: [.pluralization(singularRegex: "animal",replacementRegex: "animals")],deprecatedEnumCases: .include,schemaDocumentation: .include,selectionSetInitializers: [.localCacheMutations,.operation(named: "MyOperation"),.fragment(named: "MyFragment")],operationDocumentFormat: [.document, .operationId],cocoapodsCompatibleImportStatements: false,warningsOnDeprecatedUsage: .include,conversionStrategies: ApolloCodegenConfiguration.ConversionStrategies(enumCases: .camelCase,fieldAccessors: .default,inputObjects: .camelCase),pruneGeneratedFiles: true,markOperationDefinitionsAsFinal: true,schemaCustomization: .init(customTypeNames: ["MyEnum" : .enum(name: "CustomEnum",cases: ["MyCase" : "CustomCase"]),"MyObject" : .type(name: "CustomObject"),"MyInputObject" : .inputObject(name: "CustomInputObject",fields: ["myField" : "customField"])])))
模式自定义
自定义类型名称
可以使用以下操作在Swift代码中对模式类型进行自定义命名:customTypeNames
,该选项位于schemaCustomization
下。这可以为你在Swift代码中要重命名的类型提供新名称。这不会直接影响到你的模式,或发送到服务器的网络请求,只会影响到你在Swift代码中使用到的类型名称。该customTypeNames
选项接受一个以字符串形式给出的模式类型名称到CustomSchemaTypeName
枚举实例(具有关联值以自定义给定模式类型)的映射的字典。
你可以自定义以下模式类型的名称
- 自定义
标量
- 枚举(包括单个案例名称)
- 输入对象(包括单个
字段
名称) - 接口
- 对象
- 联合
CustomSchemaTypeName
枚举包含以下可能的情况:
情况 | 描述 |
---|---|
| 此情况可以用于通过向name 参数提供表示所需新名称的字符串来自定义你方案中任何类型的名称。 |
| 当你想自定义枚举类型的情况时必须使用此情况。你可以向name 参数提供一个字符串以自定义枚举本身的名称,并向cases 参数提供一个字典以自定义任何你希望的自定义情况。 |
| 当你想自定义Input Object类型字段时必须使用此情况。你可以向name 参数提供一个字符串以自定义Input Object本身的名称,并向fields 参数提供一个字典以自定义任何你希望的 customizable fields。 |
"options": {"schemaCustomization" : {"customTypeNames" : {"MyEnum" : {"enum" : {"cases" : {"MyCase" : "CustomCase"},"name" : "CustomEnum"}},"MyObject" : "CustomAnimal","MyInputObject" : {"inputObject" : {"fields" : {"myField" : "customField"},"name" : "CustomInputObject"}}}}}
let configuration = ApolloCodegenConfiguration(// Other properties not shownoptions: ApolloCodegenConfiguration.OutputOptions(schemaCustomization: .init(customTypeNames: ["MyEnum" : .enum(name: "CustomEnum",cases: ["MyCase" : "CustomCase"]),"MyObject" : .type(name: "CustomObject"),"MyInputObject" : .inputObject(name: "CustomInputObject",fields: ["myField" : "customField"])])))
实验特性
代码生成引擎支持一些实验性质的特性,这些特性对生成代码的影响被认为是实验性的。其中一个例子是对 GraphQL 模式的指定,它尚未正式化,并且在使用建议中正在发生变化。
注意:这些功能可能会随时更改,并且不能保证总是可用。
当前支持的实验性功能有
值 | 描述 |
---|---|
clientControlledNullability | 如果启用,代码生成将理解并解析客户端控制的空值。详细信息请参阅 RFC。 |
legacySafelistingCompatibleOperations | 如果启用,生成的操作将使用试图维持与 Apollo Server 中注册持久操作到白名单的旧行为兼容的方法进行转换apollo-tooling 。注意:将查询添加到白名单是 Apollo Server 已弃用的功能,对旧用例的支持较少。在此选项中,可能不会按预期工作。 |
"experimentalFeatures": {"clientControlledNullability": false,"legacySafelistingCompatibleOperations": false}
let configuration = ApolloCodegenConfiguration(// Other properties not shownexperimentalFeatures: ApolloCodegenConfiguration.ExperimentalFeatures(clientControlledNullability: false,legacySafelistingCompatibleOperations: false))
模式下载配置
代码生成过程中的一个可选步骤是从远程服务器获取 GraphQL 模式。这一步骤确保你始终拥有最新的模式,以便基于你的操作,并且它消除了在自动化过程之外手动下载模式的需求。
配置模式下载的属性有
属性名称 | 描述 |
---|---|
downloadMethod | 如何下载模式。 |
downloadTimeout | 在指示下载超时之前等待的最大时间(以秒为单位)。 |
headers | 在检索您的方案时需要包含的任何额外标头。当方案下载需要身份验证时,这很有用。 |
outputPath | 下载的方案应写入的本地路径。 |
下载方法
从两个来源支持获取 GraphQL 模式:
1. Apollo服务器注册
Apollo模式注册表是管理您图的中央枢纽。
您需要配置的属性包括
"schemaDownload": {"downloadMethod": {"apolloRegistry": {"_0": {"graphID": "your-graphid","apiKey": "your-api-key","variant": "current"}}},"downloadTimeout": 60,"headers": {"Accept-Encoding" : "gzip","Authorization" : "Bearer <token>"},"outputPath": "./graphql/"}
let configuration = ApolloCodegenConfiguration(// Other properties not shownschemaDownload: ApolloSchemaDownloadConfiguration(using: .apolloRegistry(.init(apiKey: "your-api-key",graphID: "your-graphid",variant: "current")),timeout: 60.0,headers: [.init(key: "Accept-Encoding", value: "gzip"),.init(key: "Authorization", value: "Bearer <token>")],outputPath: "./graphql/"))
2. GraphQL反演
一个GraphQL服务支持其模式上的反演。
注意:许多生产服务器出于安全原因禁用了反演。如果反演查询失败,请检查它是否已禁用。
您需要配置的属性包括
属性名称 | 描述 |
---|---|
endpointURL | GraphQL反演服务的URL。 |
httpMethod | HTTP请求方法。 |
outputFormat | 下载模式的输出格式。 |
includeDeprecatedInputValues | 指定是否应包括带有内置@deprecated 指令注解的输入值。 |
"schemaDownload": {"downloadMethod": {"introspection": {"endpointURL": "https://server.com","httpMethod": {"POST": {}},"includeDeprecatedInputValues": false,"outputFormat": "SDL"}},"downloadTimeout": 60,"headers": [],"outputPath": "./graphql/"}
let configuration = ApolloCodegenConfiguration(// Other properties not shownschemaDownload: ApolloSchemaDownloadConfiguration(using: .introspection(endpointURL: URL(string: "https://server.com")!),timeout: 60.0,headers: [],outputPath: "./graphql/"))
有关更多详细信息,请参阅下载模式的部分。
操作声明配置
用于配置为与 持久查询 使用创建操作标识符清单的可选设置。
属性名称 | 描述 |
---|---|
路径 | 生成的操作清单文件应写入的本地路径。 |
版本 | 生成操作清单时使用的版本格式。 |
generateManifestOnCodeGeneration | 每次运行代码生成是否生成操作清单。默认为false。 |
"operationManifest" : {"generateManifestOnCodeGeneration" : false,"path" : "/operation/identifiers/path","version" : "persistedQueries"}
let configuration = ApolloCodegenConfiguration(// Other properties not shownoperationManifest: .init(path: "./manifest/operationManifest.json",version: .persistedQueries,generateManifestOnCodeGeneration: false))
完整Codegen配置示例
以下是一个示例,说明了一个 apollo-codegen-config.json
文件,其中每个选项都按某种方式进行配置,以显示其使用和格式:
{"schemaNamespace" : "MySchema","schemaDownload": {"downloadMethod": {"introspection": {"endpointURL": "https://server.com","httpMethod": {"POST": {}},"includeDeprecatedInputValues": false,"outputFormat": "SDL"}},"downloadTimeout": 60,"headers": [],"outputPath": "./graphql/"},"experimentalFeatures" : {"clientControlledNullability" : true,"legacySafelistingCompatibleOperations" : true},"operationManifest" : {"generateManifestOnCodeGeneration" : false,"path" : "/operation/identifiers/path","version" : "persistedQueries"},"input" : {"operationSearchPaths" : ["/search/path/**/*.graphql"],"schemaSearchPaths" : ["/path/to/schema.graphqls"]},"output" : {"operations" : {"absolute" : {"accessModifier" : "internal","path" : "/absolute/path"}},"schemaTypes" : {"moduleType" : {"embeddedInTarget" : {"accessModifier" : "public","name" : "SomeTarget"}},"path" : "/output/path"},"testMocks" : {"swiftPackage" : {"targetName" : "SchemaTestMocks"}}},"options" : {"additionalInflectionRules" : [{"pluralization" : {"replacementRegex" : "animals","singularRegex" : "animal"}}],"cocoapodsCompatibleImportStatements" : true,"conversionStrategies" : {"enumCases" : "none","fieldAccessors" : "camelCase","inputObjects": "camelCase"},"deprecatedEnumCases" : "exclude","operationDocumentFormat" : ["definition"],"pruneGeneratedFiles" : false,"schemaDocumentation" : "exclude","selectionSetInitializers" : {"localCacheMutations" : true},"warningsOnDeprecatedUsage" : "exclude"}}