UNPKG

@graphql-codegen/c-sharp-operations

Version:

GraphQL Code Generator plugin for generating CSharp code based on GraphQL operations

43 lines (42 loc) 1.7 kB
import { extname } from 'path'; import { concatAST, Kind } from 'graphql'; import gql from 'graphql-tag'; import { getCachedDocumentNodeFromSchema, oldVisit, } from '@graphql-codegen/plugin-helpers'; import { CSharpOperationsVisitor } from './visitor.js'; export const plugin = (schema, documents, config) => { const schemaAST = getCachedDocumentNodeFromSchema(schema); const allAst = concatAST(documents.map(v => v.document).concat(schemaAST)); const allFragments = [ ...allAst.definitions.filter(d => d.kind === Kind.FRAGMENT_DEFINITION).map(fragmentDef => ({ node: fragmentDef, name: fragmentDef.name.value, onType: fragmentDef.typeCondition.name.value, isExternal: false, })), ...(config.externalFragments || []), ]; const visitor = new CSharpOperationsVisitor(schema, allFragments, config, documents); const visitorResult = oldVisit(allAst, { leave: visitor }); const imports = visitor.getCSharpImports(); const openNameSpace = `namespace ${visitor.config.namespaceName} {`; return { prepend: [], content: [ imports, openNameSpace, ...visitorResult.definitions.filter(t => typeof t === 'string'), '}', ] .filter(a => a) .join('\n'), }; }; export const addToSchema = gql ` directive @namedClient(name: String!) on OBJECT | FIELD `; export const validate = async (schema, documents, config, outputFile) => { if (extname(outputFile) !== '.cs') { throw new Error(`Plugin "c-sharp-operations" requires extension to be ".cs"!`); } }; export { CSharpOperationsVisitor };