UNPKG

@graphql-mesh/serve-runtime

Version:
67 lines (66 loc) 2.71 kB
import { buildASTSchema, isSchema, parse, print } from 'graphql'; import { defaultImportFn, isUrl, mapMaybePromise, readFileOrUrl } from '@graphql-mesh/utils'; import { getDocumentNodeFromSchema, isDocumentNode, isValidPath } from '@graphql-tools/utils'; export function handleUnifiedGraphConfig(config, configContext) { return mapMaybePromise(typeof config === 'function' ? config() : config, schema => handleUnifiedGraphSchema(schema, configContext)); } export const unifiedGraphASTMap = new WeakMap(); export const unifiedGraphSDLMap = new WeakMap(); export function getUnifiedGraphSDL(schema) { let sdl = unifiedGraphSDLMap.get(schema); if (!sdl) { const ast = getUnifiedGraphAST(schema); sdl = print(ast); unifiedGraphSDLMap.set(schema, sdl); } return sdl; } export function getUnifiedGraphAST(schema) { let ast = unifiedGraphASTMap.get(schema); if (!ast) { ast = getDocumentNodeFromSchema(schema); unifiedGraphASTMap.set(schema, ast); } return ast; } export function handleUnifiedGraphSchema(unifiedGraphSchema, configContext) { if (isSchema(unifiedGraphSchema)) { return unifiedGraphSchema; } if (isDocumentNode(unifiedGraphSchema)) { const schema = buildASTSchema(unifiedGraphSchema, { assumeValid: true, assumeValidSDL: true, }); unifiedGraphASTMap.set(schema, unifiedGraphSchema); return schema; } if (typeof unifiedGraphSchema === 'string') { if (isValidPath(unifiedGraphSchema) || isUrl(unifiedGraphSchema)) { return readFileOrUrl(unifiedGraphSchema, { fetch: configContext.fetch, cwd: configContext.cwd, logger: configContext.logger, allowUnknownExtensions: true, importFn: defaultImportFn, }).then(sdl => handleUnifiedGraphSchema(sdl, configContext)); } try { const ast = parse(unifiedGraphSchema, { noLocation: true, }); const schema = buildASTSchema(ast, { assumeValid: true, assumeValidSDL: true, }); unifiedGraphSDLMap.set(schema, unifiedGraphSchema); unifiedGraphASTMap.set(schema, ast); return schema; } catch (e) { configContext.logger.error(`Failed to build UnifiedGraphSchema from "${unifiedGraphSchema}"`); throw e; } } throw new Error(`Invalid UnifiedGraphSchema "${unifiedGraphSchema}". It can be an SDL string, an instance of GraphQLSchema or DocumentNode, or a function that returns/resolves any of these.`); }