import type { ObjectTypeComposerFieldConfigAsObjectDefinition } from "graphql-compose"; import { GenerateImageSource, ImgixClientConfig, ImgixParams } from "../types"; import { DEFAULT_FLUID_MAX_WIDTH, GraphQLTypeName } from "../constants"; import { resolveFluid, FluidArgs } from "../resolvers/resolveFluid"; export type BuildFluidFieldConfigConfig = { namespace: string; generateImageSource: GenerateImageSource; defaultImgixParams?: ImgixParams; defaultPlaceholderImgixParams?: ImgixParams; imgixClientConfig?: Partial; }; export const buildFluidFieldConfig = ( config: BuildFluidFieldConfigConfig, ): ObjectTypeComposerFieldConfigAsObjectDefinition< TSource, TContext, FluidArgs > => { return { type: config.namespace + GraphQLTypeName.FluidObject, deprecationReason: "`gatsby-image` is replaced by `gatsby-plugin-image`. [See the migration guide](https://www.gatsbyjs.com/docs/reference/release-notes/image-migration-guide/)", // IMPORTANT: These types must be kept in sync with `FluidArgs`. args: { maxWidth: { type: "Int", defaultValue: DEFAULT_FLUID_MAX_WIDTH, }, maxHeight: { type: "Int", }, srcSetBreakpoints: { type: "[Int!]", }, imgixParams: { type: config.namespace + GraphQLTypeName.ImgixParamsInputObject, }, placeholderImgixParams: { type: config.namespace + GraphQLTypeName.ImgixParamsInputObject, }, }, resolve: async (source, args) => { const imageSource = await config.generateImageSource(source); if (imageSource !== null) { return resolveFluid( { url: imageSource.url, width: imageSource.width, height: imageSource.height, }, { ...args, imgixParams: { ...config.defaultImgixParams, ...args.imgixParams, }, placeholderImgixParams: { ...config.defaultPlaceholderImgixParams, ...args.placeholderImgixParams, }, }, { imgixClientConfig: config.imgixClientConfig, }, ); } else { return null; } }, }; };