UNPKG

@graphql-mesh/transform-extend

Version:
60 lines (57 loc) 2.14 kB
import { path } from '@graphql-mesh/cross-helpers'; import { CodeFileLoader } from '@graphql-tools/code-file-loader'; import { GraphQLFileLoader } from '@graphql-tools/graphql-file-loader'; import { loadTypedefsSync } from '@graphql-tools/load'; import { mergeSchemas } from '@graphql-tools/schema'; import { asArray } from '@graphql-tools/utils'; function loadFromModuleExportExpressionSync({ expression, defaultExportName, cwd, }) { if (typeof expression !== 'string') { return expression; } const [modulePath, exportName = defaultExportName] = expression.split('#'); const mod = tryRequire(modulePath, cwd); return mod[exportName] || (mod.default && mod.default[exportName]) || mod.default || mod; } function tryRequire(modulePath, cwd) { try { return require(modulePath); } catch (_a) { if (!path.isAbsolute(modulePath)) { const absoluteModulePath = path.isAbsolute(modulePath) ? modulePath : path.join(cwd, modulePath); return require(absoluteModulePath); } } } class ExtendTransform { constructor({ baseDir, config }) { this.noWrap = true; this.config = config; this.baseDir = baseDir; } transformSchema(schema) { const sources = loadTypedefsSync(this.config.typeDefs, { cwd: path.isAbsolute(this.config.typeDefs) ? null : this.baseDir, loaders: [new CodeFileLoader(), new GraphQLFileLoader()], }); const typeDefs = sources.map(source => source.document); const resolvers = asArray(this.config.resolvers).map(resolverDef => { if (typeof resolverDef === 'string') { return loadFromModuleExportExpressionSync({ expression: resolverDef, defaultExportName: 'default', cwd: this.baseDir, }); } else { return resolverDef; } }); return mergeSchemas({ schemas: [schema], typeDefs, resolvers, }); } } export default ExtendTransform;