import devAssert from "../jsutils/devAssert.mjs"; import { Kind } from "../language/kinds.mjs"; import { parse } from "../language/parser.mjs"; import { assertValidSDL } from "../validation/validate.mjs"; import { GraphQLSchema } from "../type/schema.mjs"; import { GraphQLSkipDirective, GraphQLIncludeDirective, GraphQLDeprecatedDirective, GraphQLSpecifiedByDirective } from "../type/directives.mjs"; import { extendSchemaImpl } from "./extendSchema.mjs"; /** * This takes the ast of a schema document produced by the parse function in * src/language/parser.js. * * If no schema definition is provided, then it will look for types named Query * and Mutation. * * Given that AST it constructs a GraphQLSchema. The resulting schema * has no resolve methods, so execution will use default resolvers. * * Accepts options as a second argument: * * - commentDescriptions: * Provide true to use preceding comments as the description. * */ export function buildASTSchema(documentAST, options) { documentAST != null && documentAST.kind === Kind.DOCUMENT || devAssert(0, 'Must provide valid Document AST.'); if ((options === null || options === void 0 ? void 0 : options.assumeValid) !== true && (options === null || options === void 0 ? void 0 : options.assumeValidSDL) !== true) { assertValidSDL(documentAST); } var emptySchemaConfig = { description: undefined, types: [], directives: [], extensions: undefined, extensionASTNodes: [], assumeValid: false }; var config = extendSchemaImpl(emptySchemaConfig, documentAST, options); if (config.astNode == null) { for (var _i2 = 0, _config$types2 = config.types; _i2 < _config$types2.length; _i2++) { var type = _config$types2[_i2]; switch (type.name) { // Note: While this could make early assertions to get the correctly // typed values below, that would throw immediately while type system // validation with validateSchema() will produce more actionable results. case 'Query': config.query = type; break; case 'Mutation': config.mutation = type; break; case 'Subscription': config.subscription = type; break; } } } var directives = config.directives; // If specified directives were not explicitly declared, add them. if (!directives.some(function (directive) { return directive.name === 'skip'; })) { directives.push(GraphQLSkipDirective); } if (!directives.some(function (directive) { return directive.name === 'include'; })) { directives.push(GraphQLIncludeDirective); } if (!directives.some(function (directive) { return directive.name === 'deprecated'; })) { directives.push(GraphQLDeprecatedDirective); } if (!directives.some(function (directive) { return directive.name === 'specifiedBy'; })) { directives.push(GraphQLSpecifiedByDirective); } return new GraphQLSchema(config); } /** * A helper function to build a GraphQLSchema directly from a source * document. */ export function buildSchema(source, options) { var document = parse(source, { noLocation: options === null || options === void 0 ? void 0 : options.noLocation, allowLegacySDLEmptyFields: options === null || options === void 0 ? void 0 : options.allowLegacySDLEmptyFields, allowLegacySDLImplementsInterfaces: options === null || options === void 0 ? void 0 : options.allowLegacySDLImplementsInterfaces, experimentalFragmentVariables: options === null || options === void 0 ? void 0 : options.experimentalFragmentVariables }); return buildASTSchema(document, { commentDescriptions: options === null || options === void 0 ? void 0 : options.commentDescriptions, assumeValidSDL: options === null || options === void 0 ? void 0 : options.assumeValidSDL, assumeValid: options === null || options === void 0 ? void 0 : options.assumeValid }); }