graphql-codegen-plugin-typescript-swr
Version:
A GraphQL code generator plug-in that automatically generates utility functions for SWR.
55 lines (47 loc) • 1.51 kB
text/typescript
import { extname } from 'path'
import {
Types,
PluginValidateFn,
PluginFunction,
oldVisit,
} from '@graphql-codegen/plugin-helpers'
import { LoadedFragment } from '@graphql-codegen/visitor-plugin-common'
import { GraphQLSchema, concatAST, Kind, FragmentDefinitionNode } from 'graphql'
import { RawSWRPluginConfig } from './config'
import { SWRVisitor } from './visitor'
export const plugin: PluginFunction<RawSWRPluginConfig> = (
schema: GraphQLSchema,
documents: Types.DocumentFile[],
config: RawSWRPluginConfig
) => {
const allAst = concatAST(documents.map((v) => v.document))
const allFragments: LoadedFragment[] = [
// prettier-ignore
...(allAst.definitions.filter(
(d) => d.kind === Kind.FRAGMENT_DEFINITION
) as FragmentDefinitionNode[]).map((fragmentDef) => ({
node: fragmentDef,
name: fragmentDef.name.value,
onType: fragmentDef.typeCondition.name.value,
isExternal: false,
})),
...(config.externalFragments || []),
]
const visitor = new SWRVisitor(schema, allFragments, config)
oldVisit(allAst, { leave: visitor })
return {
prepend: visitor.getImports(),
content: visitor.sdkContent,
}
}
export const validate: PluginValidateFn<any> = async (
_schema: GraphQLSchema,
_documents: Types.DocumentFile[],
_config: RawSWRPluginConfig,
outputFile: string
) => {
if (extname(outputFile) !== '.ts') {
throw new Error(`Plugin "typescript-swr" requires extension to be ".ts"!`)
}
}
export { SWRVisitor }