UNPKG

@graphql-codegen/flow-operations

Version:

GraphQL Code Generator plugin for generating Flow types for GraphQL operations (query/mutation/subscription/fragment)

79 lines (78 loc) 3.3 kB
import { BaseSelectionSetProcessor, indent, } from '@graphql-codegen/visitor-plugin-common'; export class FlowWithPickSelectionSetProcessor extends BaseSelectionSetProcessor { transformAliasesPrimitiveFields(schemaType, fields) { if (fields.length === 0) { return []; } const useFlowExactObject = this.config.useFlowExactObjects; const { formatNamedField } = this.config; const fieldObj = schemaType.getFields(); const parentName = (this.config.namespacedImportName ? `${this.config.namespacedImportName}.` : '') + this.config.convertName(schemaType.name, { useTypesPrefix: true, }); return [ `{${useFlowExactObject ? '|' : ''} ${fields .map(aliasedField => `${formatNamedField(aliasedField.alias, fieldObj[aliasedField.fieldName].type)}: $ElementType<${parentName}, '${aliasedField.fieldName}'>`) .join(', ')} ${useFlowExactObject ? '|' : ''}}`, ]; } buildFieldsIntoObject(allObjectsMerged) { return `...{ ${allObjectsMerged.join(', ')} }`; } buildSelectionSetFromStrings(pieces) { if (pieces.length === 0) { return null; } if (pieces.length === 1) { return pieces[0]; } const useFlowExactObject = this.config.useFlowExactObjects; return `({${useFlowExactObject ? '|' : ''}\n ${pieces .map(t => indent(`...${t}`)) .join(`,\n`)}\n${useFlowExactObject ? '|' : ''}})`; } transformLinkFields(fields) { if (fields.length === 0) { return []; } const useFlowExactObject = this.config.useFlowExactObjects; return [ `{${useFlowExactObject ? '|' : ''} ${fields .map(field => `${field.alias || field.name}: ${field.selectionSet}`) .join(', ')} ${useFlowExactObject ? '|' : ''}}`, ]; } transformPrimitiveFields(schemaType, fields) { if (fields.length === 0) { return []; } const useFlowExactObject = this.config.useFlowExactObjects; const { formatNamedField } = this.config; const parentName = (this.config.namespacedImportName ? `${this.config.namespacedImportName}.` : '') + this.config.convertName(schemaType.name, { useTypesPrefix: true, }); const fieldObj = schemaType.getFields(); let hasConditionals = false; const conditilnalsList = []; let resString = `$Pick<${parentName}, {${useFlowExactObject ? '|' : ''} ${fields .map(field => { if (field.isConditional) { hasConditionals = true; conditilnalsList.push(field.fieldName); } return `${formatNamedField(field.fieldName, fieldObj[field.fieldName].type)}: *`; }) .join(', ')} ${useFlowExactObject ? '|' : ''}}>`; if (hasConditionals) { resString = `$MakeOptional<${resString}, ${conditilnalsList .map(field => `{ ${field}: * }`) .join(' | ')}>`; } return [resString]; } transformTypenameField(type, name) { return [`{ ${name}: ${type} }`]; } }