{"version":3,"file":"index.server.mjs","sources":["../src/lib/paramCaseObject.ts","../src/lib/parseArParam.ts","../src/constants.ts","../src/resolvers/resolveFixed.ts","../src/buildFixedImageData.ts","../src/resolvers/resolveFluid.ts","../src/buildFluidImageData.ts","../src/lib/generateGatsbyImageDataSource.ts","../src/getGatsbyImageData.ts","../src/ImgixGatsbyImage.tsx","../src/graphql/buildFixedFieldConfig.server.ts","../src/lib/fetchBase64Image.server.ts","../src/graphql/buildFixedObjectType.server.ts","../src/graphql/buildFluidFieldConfig.server.ts","../src/graphql/buildFluidObjectType.server.ts","../src/graphql/buildGatsbyImageDataPlaceholderEnum.server.ts","../src/resolvers/resolveGatsbyImageData.server.ts","../src/graphql/buildGatsbyImageDataFieldConfig.server.ts","../src/graphql/buildUrlFieldConfig.server.ts","../src/graphql/buildImgixParamsInputObjectType.server.ts","../src/lib/fetchImageDimensions.server.ts","../src/lib/generateImageSourceFromUrl.server.ts","../src/plugin/constants.ts"],"sourcesContent":["import { paramCase } from \"param-case\";\nimport { KebabCase as ParamCase } from \"type-fest\";\n\ntype ParamCaseObject<T extends Record<string, unknown>> = {\n\t[P in keyof T as ParamCase<P>]: T[P];\n};\n\nexport const paramCaseObject = <T extends Record<string, unknown>>(\n\tobj: T,\n): ParamCaseObject<T> => {\n\tconst result = {} as ParamCaseObject<T>;\n\n\tfor (const key in obj) {\n\t\tconst paramKey = paramCase(key) as keyof typeof result;\n\n\t\tresult[paramKey] = obj[key as keyof typeof obj];\n\t}\n\n\treturn result;\n};\n","export const parseArParam = (ar: string): number => {\n\tconst [antecedent, consequent] = ar.split(\":\");\n\n\treturn Number.parseFloat(antecedent) / Number.parseFloat(consequent);\n};\n","import { ImgixParams } from \"./types\";\n\n/**\n * The default width for fixed images.\n */\nexport const DEFAULT_FIXED_WIDTH = 400;\n\n/**\n * The default max width for fluid images.\n */\nexport const DEFAULT_FLUID_MAX_WIDTH = 800;\n\n/**\n * A set of factors used to compute a default setSetBreakpoint argument for fluid images.\n */\nexport const DEFAULT_FLUID_SRC_SET_BREAKPOINT_FACTORS = [0.25, 0.5, 1.5, 2];\n\n/**\n * Default Imgix parameters applied to all images.\n */\nexport const DEFAULT_IMGIX_PARAMS: ImgixParams = {\n\tfit: \"crop\",\n};\n\n/**\n * Default Imgix parameters applied to all placeholder images.\n */\nexport const DEFAULT_PLACEHOLDER_IMGIX_PARAMS: ImgixParams = {\n\tw: 20,\n\th: undefined,\n\tblur: 15,\n\tq: 20,\n};\n\n/**\n * GraphQL type names used for GraphQL type and field builders.\n */\nexport enum GraphQLTypeName {\n\t/**\n\t * Gatsby Image placeholder kinds.\n\t */\n\tGatsbyImageDataPlaceholderEnum = \"GatsbyImageDataPlaceholder\",\n\n\t/**\n\t * Imgix parameters used in Imgix's URL API.\n\t */\n\tImgixParamsInputObject = \"ImgixParams\",\n\n\t/**\n\t * `gatsby-plugin-image` gatsbyImageData objects.\n\t */\n\tGatsbyImageDataObject = \"GatsbyImageData\",\n\n\t/**\n\t * `gatsby-image` fixed objects.\n\t */\n\tFixedObject = \"Fixed\",\n\n\t/**\n\t * `gatsby-image` fluid objects.\n\t */\n\tFluidObject = \"Fluid\",\n}\n\n/**\n * Gatsby Image placeholder kinds.\n *\n * @see Gatsby Image plugin documentation: {@link https://www.gatsbyjs.com/docs/reference/built-in-components/gatsby-plugin-image/#placeholder}\n */\nexport enum GatsbyImageDataPlaceholderKind {\n\tBlurred = \"blurred\",\n\tDominantColor = \"dominantColor\",\n\tNone = \"none\",\n}\n\n/**\n * Gatsby Image layout kinds.\n *\n * @see Gatsby Image plugin documentation: {@link https://www.gatsbyjs.com/docs/reference/built-in-components/gatsby-plugin-image/#layout}\n */\nexport enum GatsbyImageDataLayoutKind {\n\tConstrained = \"constrained\",\n\tFixed = \"fixed\",\n\tFullWidth = \"fullWidth\",\n}\n","import type { FixedObject } from \"gatsby-image\";\nimport ImgixClient from \"@imgix/js-core\";\n\nimport { paramCaseObject } from \"../lib/paramCaseObject\";\nimport { parseArParam } from \"../lib/parseArParam\";\n\nimport { ImageSource, ImgixParams, ImgixClientConfig } from \"../types\";\nimport {\n\tDEFAULT_FIXED_WIDTH,\n\tDEFAULT_IMGIX_PARAMS,\n\tDEFAULT_PLACEHOLDER_IMGIX_PARAMS,\n} from \"../constants\";\n\nexport type FixedArgs = {\n\twidth?: number;\n\theight?: number | null;\n\timgixParams?: ImgixParams;\n\tplaceholderImgixParams?: ImgixParams;\n};\n\nexport type ResolveFluidConfig = {\n\timgixClientConfig?: Partial<ImgixClientConfig>;\n};\n\nexport const resolveFixed = (\n\tsource: ImageSource,\n\toptions: FixedArgs = {},\n\tconfig: ResolveFluidConfig = {},\n): FixedObject => {\n\tconst url = new URL(source.url);\n\tconst filename = decodeURIComponent(url.pathname);\n\tconst client = new ImgixClient({\n\t\tdomain: url.hostname,\n\t\t...config.imgixClientConfig,\n\t});\n\n\tlet aspectRatio = source.width / source.height;\n\tif (typeof options.imgixParams?.ar === \"string\") {\n\t\tconst parsedAr = parseArParam(options.imgixParams.ar);\n\n\t\tif (!Number.isNaN(parsedAr)) {\n\t\t\taspectRatio = parsedAr;\n\t\t}\n\t}\n\n\tlet width = DEFAULT_FIXED_WIDTH;\n\tlet height = Math.round(width / aspectRatio);\n\tif (options.width != null) {\n\t\twidth = options.width;\n\t\tif (options.height != null) {\n\t\t\theight = options.height;\n\t\t} else {\n\t\t\theight = Math.round(width / aspectRatio);\n\t\t}\n\t} else if (options.height != null) {\n\t\theight = options.height;\n\t\tif (options.width != null) {\n\t\t\twidth = options.width;\n\t\t} else {\n\t\t\twidth = Math.round(height * aspectRatio);\n\t\t}\n\t}\n\n\tconst imgixParams: ImgixParams = paramCaseObject({\n\t\t...DEFAULT_IMGIX_PARAMS,\n\t\t...options.imgixParams,\n\t\tw: width,\n\t\th: height,\n\t});\n\n\tconst imgixParamsWebp: ImgixParams = {\n\t\t...imgixParams,\n\t\tfm: \"webp\",\n\t};\n\n\tconst placeholderImgixParams: ImgixParams = paramCaseObject({\n\t\t...DEFAULT_IMGIX_PARAMS,\n\t\t...options.imgixParams,\n\t\t...DEFAULT_PLACEHOLDER_IMGIX_PARAMS,\n\t\t...options.placeholderImgixParams,\n\t});\n\n\treturn {\n\t\twidth,\n\t\theight,\n\t\tbase64: client.buildURL(filename, placeholderImgixParams),\n\t\tsrc: client.buildURL(filename, imgixParams),\n\t\tsrcWebp: client.buildURL(filename, imgixParamsWebp),\n\t\tsrcSet: client.buildSrcSet(filename, imgixParams),\n\t\tsrcSetWebp: client.buildSrcSet(filename, imgixParamsWebp),\n\t};\n};\n","import { FixedObject } from \"gatsby-image\";\n\nimport { ImgixParams } from \"./types\";\nimport { resolveFixed } from \"./resolvers/resolveFixed\";\n\nexport type BuildFixedObjectTypeConfig = {\n\tincludeLibraryParam?: boolean;\n};\n\n/**\n * @deprecated `gatsby-image` is deprecated (\"fixed\" and \"fluid\" images). Use\n *   `gatsby-plugin-image` instead. You can use the `getGatsbyImageData`\n *   function to build an object like `buildFixedObjectType`.\n * @see {@link https://www.gatsbyjs.com/docs/reference/release-notes/image-migration-guide/ | Migrating from gatsby-image to gatsby-plugin-image}\n */\nexport const buildFixedImageData = (\n\tsrc: string,\n\timgixParams: ImgixParams & { w: number; h: number },\n\toptions: BuildFixedObjectTypeConfig = {},\n): FixedObject => {\n\treturn resolveFixed(\n\t\t{\n\t\t\turl: src,\n\t\t\twidth: imgixParams.w,\n\t\t\theight: imgixParams.h,\n\t\t},\n\t\t{\n\t\t\twidth: imgixParams.w,\n\t\t\theight: imgixParams.h,\n\t\t\timgixParams,\n\t\t},\n\t\t{\n\t\t\timgixClientConfig: {\n\t\t\t\tincludeLibraryParam: options.includeLibraryParam,\n\t\t\t},\n\t\t},\n\t);\n};\n","import type { FluidObject } from \"gatsby-image\";\nimport ImgixClient, { SrcSetOptions } from \"@imgix/js-core\";\n\nimport { paramCaseObject } from \"../lib/paramCaseObject\";\nimport { parseArParam } from \"../lib/parseArParam\";\n\nimport { ImageSource, ImgixClientConfig, ImgixParams } from \"../types\";\nimport {\n\tDEFAULT_FLUID_MAX_WIDTH,\n\tDEFAULT_FLUID_SRC_SET_BREAKPOINT_FACTORS,\n\tDEFAULT_IMGIX_PARAMS,\n\tDEFAULT_PLACEHOLDER_IMGIX_PARAMS,\n} from \"../constants\";\n\nexport type FluidArgs = {\n\tmaxWidth?: number;\n\tmaxHeight?: number | null;\n\tsrcSetBreakpoints?: number[];\n\timgixParams?: ImgixParams;\n\tplaceholderImgixParams?: ImgixParams;\n};\n\ntype ResolveFluidConfig = {\n\timgixClientConfig?: Partial<ImgixClientConfig>;\n};\n\nexport const resolveFluid = (\n\tsource: ImageSource,\n\toptions: FluidArgs = {},\n\tconfig: ResolveFluidConfig = {},\n): FluidObject => {\n\tconst url = new URL(source.url);\n\tconst filename = decodeURIComponent(url.pathname);\n\tconst client = new ImgixClient({\n\t\tdomain: url.hostname,\n\t\t...config.imgixClientConfig,\n\t});\n\n\tlet aspectRatio = source.width / source.height;\n\tif (typeof options.imgixParams?.ar === \"string\") {\n\t\tconst parsedAr = parseArParam(options.imgixParams.ar);\n\n\t\tif (!Number.isNaN(parsedAr)) {\n\t\t\taspectRatio = parsedAr;\n\t\t}\n\t} else if (options.maxWidth != null && options.maxHeight != null) {\n\t\taspectRatio = options.maxWidth / options.maxHeight;\n\t}\n\n\tlet maxWidth = DEFAULT_FLUID_MAX_WIDTH;\n\tif (options.maxWidth != null) {\n\t\tmaxWidth = options.maxWidth;\n\t} else if (options.maxHeight != null) {\n\t\tmaxWidth = Math.round(options.maxHeight * aspectRatio);\n\t}\n\n\tconst imgixParams: ImgixParams = paramCaseObject({\n\t\t...DEFAULT_IMGIX_PARAMS,\n\t\t...options.imgixParams,\n\t\tw: maxWidth,\n\t\tar: `${aspectRatio}:1`,\n\t});\n\n\tconst imgixParamsWebp = {\n\t\t...imgixParams,\n\t\tfm: \"webp\",\n\t};\n\n\tconst placeholderImgixParams: ImgixParams = paramCaseObject({\n\t\t...imgixParams,\n\t\t...DEFAULT_PLACEHOLDER_IMGIX_PARAMS,\n\t\t...options.placeholderImgixParams,\n\t});\n\n\tconst srcSetOptions: SrcSetOptions = {\n\t\tmaxWidth,\n\t\twidths:\n\t\t\toptions.srcSetBreakpoints ||\n\t\t\tDEFAULT_FLUID_SRC_SET_BREAKPOINT_FACTORS.map(\n\t\t\t\t(factor) => (options.maxWidth ?? DEFAULT_FLUID_MAX_WIDTH) * factor,\n\t\t\t),\n\t};\n\n\treturn {\n\t\taspectRatio,\n\t\tbase64: client.buildURL(filename, placeholderImgixParams),\n\t\tsrc: client.buildURL(filename, imgixParams),\n\t\tsrcWebp: client.buildURL(filename, imgixParamsWebp),\n\t\tsrcSet: client.buildSrcSet(filename, imgixParams, srcSetOptions),\n\t\tsrcSetWebp: client.buildSrcSet(filename, imgixParamsWebp, srcSetOptions),\n\t\tsizes: \"(min-width: 8192px) 8192px 100vw\",\n\t};\n};\n","import { FluidObject } from \"gatsby-image\";\n\nimport { parseArParam } from \"./lib/parseArParam\";\n\nimport { ImgixParams } from \"./types\";\nimport { resolveFluid } from \"./resolvers/resolveFluid\";\n\nexport type BuildFluidObjectTypeConfig = {\n\tincludeLibraryParam?: boolean;\n\tsizes?: string;\n};\n\n/**\n * @deprecated `gatsby-image` is deprecated (\"fixed\" and \"fluid\" images). Use\n *   `gatsby-plugin-image` instead. You can use the `getGatsbyImageData`\n *   function to build an object like `buildFluidObjectType`.\n * @see {@link https://www.gatsbyjs.com/docs/reference/release-notes/image-migration-guide/ | Migrating from gatsby-image to gatsby-plugin-image}\n */\nexport const buildFluidImageData = (\n\tsrc: string,\n\timgixParams: ImgixParams & { ar: string },\n\toptions: BuildFluidObjectTypeConfig = {},\n): FluidObject => {\n\tconst aspectRatio = parseArParam(imgixParams.ar);\n\n\tconst fluid = resolveFluid(\n\t\t{\n\t\t\turl: src,\n\t\t\twidth: aspectRatio,\n\t\t\theight: 1,\n\t\t},\n\t\t{\n\t\t\timgixParams,\n\t\t},\n\t\t{\n\t\t\timgixClientConfig: {\n\t\t\t\tincludeLibraryParam: options.includeLibraryParam,\n\t\t\t},\n\t\t},\n\t);\n\tfluid.sizes = options.sizes ?? fluid.sizes;\n\n\treturn fluid;\n};\n","import type { IGatsbyImageHelperArgs } from \"gatsby-plugin-image\";\nimport ImgixClient from \"@imgix/js-core\";\n\nimport { DEFAULT_IMGIX_PARAMS } from \"../constants\";\nimport type { ImgixClientConfig, ImgixParams } from \"../types\";\n\n// NOTE: This *server* file can only be imported for types!\nimport type { GatsbyImageDataArgs } from \"../resolvers/resolveGatsbyImageData.server\";\n\nimport { paramCaseObject } from \"./paramCaseObject\";\n\ntype GenerateGatsbyImageDataSourceConig = {\n\timgixClientConfig?: Partial<ImgixClientConfig>;\n};\n\nexport const generateGatsbyImageDataSource = (\n\tconfig: GenerateGatsbyImageDataSourceConig,\n): IGatsbyImageHelperArgs[\"generateImageSource\"] => {\n\treturn (\n\t\tsourceUrl,\n\t\twidth,\n\t\theight,\n\t\tformat,\n\t\t_fit,\n\t\toptions?: GatsbyImageDataArgs,\n\t) => {\n\t\tconst url = new URL(sourceUrl);\n\t\tconst filename = decodeURIComponent(url.pathname);\n\t\tconst client = new ImgixClient({\n\t\t\tdomain: url.hostname,\n\t\t\t...config.imgixClientConfig,\n\t\t});\n\n\t\tconst imgixParams: ImgixParams = paramCaseObject({\n\t\t\t...DEFAULT_IMGIX_PARAMS,\n\t\t\t...options?.imgixParams,\n\t\t\tw: width,\n\t\t\th: height,\n\t\t});\n\n\t\tif (format && format !== \"auto\") {\n\t\t\timgixParams.fm = format;\n\t\t}\n\n\t\treturn {\n\t\t\tsrc: client.buildURL(filename, imgixParams),\n\t\t\twidth,\n\t\t\theight,\n\t\t\tformat,\n\t\t};\n\t};\n};\n","import {\n\tIGatsbyImageData,\n\tIGetImageDataArgs,\n\tgetImageData,\n} from \"gatsby-plugin-image\";\n\nimport { name as packageName } from \"../package.json\";\n\nimport { generateGatsbyImageDataSource } from \"./lib/generateGatsbyImageDataSource\";\n\nimport { ImgixParams } from \"./types\";\n\nexport type GetGatsbyImageDataConfig = Omit<\n\tIGetImageDataArgs<never>,\n\t| \"baseUrl\"\n\t| \"urlBuilder\"\n\t| \"sourceWidth\"\n\t| \"sourceHeight\"\n\t| \"width\"\n\t| \"aspectRatio\"\n\t| \"pluginName\"\n\t| \"options\"\n> & {\n\tsrc: string;\n\timgixParams?: ImgixParams;\n} & (\n\t\t| {\n\t\t\t\tsourceWidth: number;\n\t\t\t\tsourceHeight: number;\n\t\t  }\n\t\t| {\n\t\t\t\twidth: number;\n\t\t\t\taspectRatio: number;\n\t\t  }\n\t);\n\nexport const getGatsbyImageData = (\n\tconfig: GetGatsbyImageDataConfig,\n): IGatsbyImageData => {\n\tlet sourceWidth: number;\n\tlet sourceHeight: number;\n\tif (\"sourceWidth\" in config && \"sourceHeight\" in config) {\n\t\tsourceWidth = config.sourceWidth;\n\t\tsourceHeight = config.sourceHeight;\n\t} else {\n\t\tsourceWidth = config.width;\n\t\tsourceHeight = config.width / config.aspectRatio;\n\t}\n\n\treturn getImageData({\n\t\t...config,\n\t\tbaseUrl: config.src,\n\t\turlBuilder: (args) => {\n\t\t\tconst gatsbyImageDataSource = generateGatsbyImageDataSource({\n\t\t\t\t// The client cannot be configured in browser-only settings.\n\t\t\t\timgixClientConfig: undefined,\n\t\t\t})(\n\t\t\t\targs.baseUrl,\n\t\t\t\targs.width,\n\t\t\t\targs.height,\n\t\t\t\targs.format,\n\t\t\t\tundefined,\n\t\t\t\targs.options,\n\t\t\t);\n\n\t\t\treturn gatsbyImageDataSource.src;\n\t\t},\n\t\tsourceWidth,\n\t\tsourceHeight,\n\t\tpluginName: packageName,\n\t\toptions: {\n\t\t\timgixParams: config.imgixParams,\n\t\t},\n\t});\n};\n","import * as React from \"react\";\nimport { GatsbyImage, GatsbyImageProps } from \"gatsby-plugin-image\";\n\nimport {\n\tgetGatsbyImageData,\n\tGetGatsbyImageDataConfig,\n} from \"./getGatsbyImageData\";\n\nexport type ImgixGatsbyImageProps = GetGatsbyImageDataConfig &\n\tOmit<GatsbyImageProps, \"image\">;\n\nexport const ImgixGatsbyImage = (props: ImgixGatsbyImageProps): JSX.Element => {\n\tconst data = getGatsbyImageData(props);\n\n\treturn <GatsbyImage image={data} {...props} />;\n};\n","import type { ObjectTypeComposerFieldConfigAsObjectDefinition } from \"graphql-compose\";\n\nimport { GenerateImageSource, ImgixClientConfig, ImgixParams } from \"../types\";\nimport { DEFAULT_FIXED_WIDTH, GraphQLTypeName } from \"../constants\";\nimport { resolveFixed, FixedArgs } from \"../resolvers/resolveFixed\";\n\nexport type BuildFixedFieldConfigConfig<TSource> = {\n\tnamespace: string;\n\tgenerateImageSource: GenerateImageSource<TSource>;\n\tdefaultImgixParams?: ImgixParams;\n\tdefaultPlaceholderImgixParams?: ImgixParams;\n\timgixClientConfig?: Partial<ImgixClientConfig>;\n};\n\nexport const buildFixedFieldConfig = <TSource, TContext>(\n\tconfig: BuildFixedFieldConfigConfig<TSource>,\n): ObjectTypeComposerFieldConfigAsObjectDefinition<\n\tTSource,\n\tTContext,\n\tFixedArgs\n> => {\n\treturn {\n\t\ttype: config.namespace + GraphQLTypeName.FixedObject,\n\t\tdeprecationReason:\n\t\t\t\"`gatsby-image` is replaced by `gatsby-plugin-image`. [See the migration guide](https://www.gatsbyjs.com/docs/reference/release-notes/image-migration-guide/)\",\n\t\t// IMPORTANT: These types must be kept in sync with `FixedArgs`.\n\t\targs: {\n\t\t\twidth: {\n\t\t\t\ttype: \"Int\",\n\t\t\t\tdefaultValue: DEFAULT_FIXED_WIDTH,\n\t\t\t},\n\t\t\theight: {\n\t\t\t\ttype: \"Int\",\n\t\t\t},\n\t\t\timgixParams: {\n\t\t\t\ttype: config.namespace + GraphQLTypeName.ImgixParamsInputObject,\n\t\t\t},\n\t\t\tplaceholderImgixParams: {\n\t\t\t\ttype: config.namespace + GraphQLTypeName.ImgixParamsInputObject,\n\t\t\t},\n\t\t},\n\t\tresolve: async (source, args) => {\n\t\t\tconst imageSource = await config.generateImageSource(source);\n\n\t\t\tif (imageSource !== null) {\n\t\t\t\treturn resolveFixed(\n\t\t\t\t\t{\n\t\t\t\t\t\turl: imageSource.url,\n\t\t\t\t\t\twidth: imageSource.width,\n\t\t\t\t\t\theight: imageSource.height,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t...args,\n\t\t\t\t\t\timgixParams: {\n\t\t\t\t\t\t\t...config.defaultImgixParams,\n\t\t\t\t\t\t\t...args.imgixParams,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tplaceholderImgixParams: {\n\t\t\t\t\t\t\t...config.defaultPlaceholderImgixParams,\n\t\t\t\t\t\t\t...args.placeholderImgixParams,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\timgixClientConfig: config.imgixClientConfig,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t},\n\t};\n};\n","import type { GatsbyCache } from \"gatsby\";\nimport fetch from \"node-fetch\";\n\ntype FetchBase64ImageConfig = {\n\turl: string;\n\tcache: GatsbyCache;\n};\n\nexport const fetchBase64Image = async (\n\tconfig: FetchBase64ImageConfig,\n): Promise<string> => {\n\tconst cacheKey = `base64___${config.url}`;\n\tconst cacheValue: string | undefined = await config.cache.get(cacheKey);\n\n\tif (cacheValue) {\n\t\treturn cacheValue;\n\t} else {\n\t\tconst res = await fetch(config.url);\n\t\tconst buffer = await res.buffer();\n\t\tconst contentType = res.headers.get(\"content-type\");\n\t\tconst base64 = `data:${contentType};base64,${buffer.toString(\"base64\")}`;\n\n\t\tconfig.cache.set(cacheKey, base64);\n\n\t\treturn base64;\n\t}\n};\n","import type {\n\tNodePluginSchema,\n\tGatsbyCache,\n\tGatsbyGraphQLObjectType,\n} from \"gatsby\";\nimport type { FixedObject } from \"gatsby-image\";\n\nimport { fetchBase64Image } from \"../lib/fetchBase64Image.server\";\n\nimport { GraphQLTypeName } from \"../constants\";\n\nexport type BuildFixedObjectTypeConfig = {\n\tnamespace: string;\n\tschema: NodePluginSchema;\n\tcache: GatsbyCache;\n};\n\nexport const buildFixedObjectType = (\n\tconfig: BuildFixedObjectTypeConfig,\n): GatsbyGraphQLObjectType => {\n\treturn config.schema.buildObjectType({\n\t\tname: config.namespace + GraphQLTypeName.FixedObject,\n\t\tfields: {\n\t\t\tbase64: {\n\t\t\t\ttype: \"String!\",\n\t\t\t\tresolve: async (source: FixedObject | null) => {\n\t\t\t\t\tif (source?.base64 != null) {\n\t\t\t\t\t\treturn await fetchBase64Image({\n\t\t\t\t\t\t\turl: source.base64,\n\t\t\t\t\t\t\tcache: config.cache,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t\tsrc: { type: \"String!\" },\n\t\t\tsrcSet: { type: \"String!\" },\n\t\t\tsrcWebp: { type: \"String!\" },\n\t\t\tsrcSetWebp: { type: \"String!\" },\n\t\t\tsizes: { type: \"String!\" },\n\t\t\twidth: { type: \"Int!\" },\n\t\t\theight: { type: \"Int!\" },\n\t\t},\n\t});\n};\n","import type { ObjectTypeComposerFieldConfigAsObjectDefinition } from \"graphql-compose\";\n\nimport { GenerateImageSource, ImgixClientConfig, ImgixParams } from \"../types\";\nimport { DEFAULT_FLUID_MAX_WIDTH, GraphQLTypeName } from \"../constants\";\nimport { resolveFluid, FluidArgs } from \"../resolvers/resolveFluid\";\n\nexport type BuildFluidFieldConfigConfig<TSource> = {\n\tnamespace: string;\n\tgenerateImageSource: GenerateImageSource<TSource>;\n\tdefaultImgixParams?: ImgixParams;\n\tdefaultPlaceholderImgixParams?: ImgixParams;\n\timgixClientConfig?: Partial<ImgixClientConfig>;\n};\n\nexport const buildFluidFieldConfig = <TSource, TContext>(\n\tconfig: BuildFluidFieldConfigConfig<TSource>,\n): ObjectTypeComposerFieldConfigAsObjectDefinition<\n\tTSource,\n\tTContext,\n\tFluidArgs\n> => {\n\treturn {\n\t\ttype: config.namespace + GraphQLTypeName.FluidObject,\n\t\tdeprecationReason:\n\t\t\t\"`gatsby-image` is replaced by `gatsby-plugin-image`. [See the migration guide](https://www.gatsbyjs.com/docs/reference/release-notes/image-migration-guide/)\",\n\t\t// IMPORTANT: These types must be kept in sync with `FluidArgs`.\n\t\targs: {\n\t\t\tmaxWidth: {\n\t\t\t\ttype: \"Int\",\n\t\t\t\tdefaultValue: DEFAULT_FLUID_MAX_WIDTH,\n\t\t\t},\n\t\t\tmaxHeight: {\n\t\t\t\ttype: \"Int\",\n\t\t\t},\n\t\t\tsrcSetBreakpoints: {\n\t\t\t\ttype: \"[Int!]\",\n\t\t\t},\n\t\t\timgixParams: {\n\t\t\t\ttype: config.namespace + GraphQLTypeName.ImgixParamsInputObject,\n\t\t\t},\n\t\t\tplaceholderImgixParams: {\n\t\t\t\ttype: config.namespace + GraphQLTypeName.ImgixParamsInputObject,\n\t\t\t},\n\t\t},\n\t\tresolve: async (source, args) => {\n\t\t\tconst imageSource = await config.generateImageSource(source);\n\n\t\t\tif (imageSource !== null) {\n\t\t\t\treturn resolveFluid(\n\t\t\t\t\t{\n\t\t\t\t\t\turl: imageSource.url,\n\t\t\t\t\t\twidth: imageSource.width,\n\t\t\t\t\t\theight: imageSource.height,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t...args,\n\t\t\t\t\t\timgixParams: {\n\t\t\t\t\t\t\t...config.defaultImgixParams,\n\t\t\t\t\t\t\t...args.imgixParams,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tplaceholderImgixParams: {\n\t\t\t\t\t\t\t...config.defaultPlaceholderImgixParams,\n\t\t\t\t\t\t\t...args.placeholderImgixParams,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\timgixClientConfig: config.imgixClientConfig,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t},\n\t};\n};\n","import type {\n\tNodePluginSchema,\n\tGatsbyCache,\n\tGatsbyGraphQLObjectType,\n} from \"gatsby\";\nimport type { FluidObject } from \"gatsby-image\";\n\nimport { fetchBase64Image } from \"../lib/fetchBase64Image.server\";\n\nimport { GraphQLTypeName } from \"../constants\";\n\nexport type BuildFluidObjectTypeConfig = {\n\tnamespace: string;\n\tschema: NodePluginSchema;\n\tcache: GatsbyCache;\n};\n\nexport const buildFluidObjectType = (\n\tconfig: BuildFluidObjectTypeConfig,\n): GatsbyGraphQLObjectType => {\n\treturn config.schema.buildObjectType({\n\t\tname: config.namespace + GraphQLTypeName.FluidObject,\n\t\tfields: {\n\t\t\tbase64: {\n\t\t\t\ttype: \"String!\",\n\t\t\t\tresolve: async (source: FluidObject | null) => {\n\t\t\t\t\tif (source?.base64 != null) {\n\t\t\t\t\t\treturn await fetchBase64Image({\n\t\t\t\t\t\t\turl: source.base64,\n\t\t\t\t\t\t\tcache: config.cache,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t\tsrc: { type: \"String!\" },\n\t\t\tsrcSet: { type: \"String!\" },\n\t\t\tsrcWebp: { type: \"String!\" },\n\t\t\tsrcSetWebp: { type: \"String!\" },\n\t\t\tsizes: { type: \"String!\" },\n\t\t\taspectRatio: { type: \"Float!\" },\n\t\t},\n\t});\n};\n","import type { NodePluginSchema, GatsbyGraphQLEnumType } from \"gatsby\";\n\nimport { GatsbyImageDataPlaceholderKind, GraphQLTypeName } from \"../constants\";\n\nexport type BuildGatsbyImageDataPlaceholderEnumConfig = {\n\tnamespace: string;\n\tschema: NodePluginSchema;\n};\n\nexport const buildGatsbyImageDataPlaceholderEnum = (\n\tconfig: BuildGatsbyImageDataPlaceholderEnumConfig,\n): GatsbyGraphQLEnumType => {\n\treturn config.schema.buildEnumType({\n\t\tname: config.namespace + GraphQLTypeName.GatsbyImageDataPlaceholderEnum,\n\t\tvalues: {\n\t\t\tBLURRED: {\n\t\t\t\tvalue: GatsbyImageDataPlaceholderKind.Blurred,\n\t\t\t},\n\t\t\tDOMINANT_COLOR: {\n\t\t\t\tvalue: GatsbyImageDataPlaceholderKind.DominantColor,\n\t\t\t},\n\t\t\tNONE: {\n\t\t\t\tvalue: GatsbyImageDataPlaceholderKind.None,\n\t\t\t},\n\t\t},\n\t});\n};\n","import type { GatsbyCache } from \"gatsby\";\nimport {\n\tIGatsbyImageData,\n\tIGatsbyImageHelperArgs,\n\tgenerateImageData,\n\tgetLowResolutionImageURL,\n} from \"gatsby-plugin-image\";\nimport ImgixClient from \"@imgix/js-core\";\nimport fetch from \"node-fetch\";\n\nimport { fetchBase64Image } from \"../lib/fetchBase64Image.server\";\nimport { generateGatsbyImageDataSource } from \"../lib/generateGatsbyImageDataSource\";\nimport { paramCaseObject } from \"../lib/paramCaseObject\";\n\nimport { name as packageName } from \"../../package.json\";\n\nimport {\n\tImageSource,\n\tImgixParams,\n\tImgixPalleteLike,\n\tImgixClientConfig,\n} from \"../types\";\nimport {\n\tDEFAULT_IMGIX_PARAMS,\n\tGatsbyImageDataLayoutKind,\n\tGatsbyImageDataPlaceholderKind,\n} from \"../constants\";\n\nexport type GatsbyImageDataArgs = {\n\tplaceholder?: GatsbyImageDataPlaceholderKind;\n\timgixParams?: ImgixParams;\n\tplaceholderImgixParams?: ImgixParams;\n\tlayout?: GatsbyImageDataLayoutKind;\n};\n\ntype ResolveGatsbyImageDataConfig = {\n\tcache: GatsbyCache;\n\tpluginName?: string;\n\timgixClientConfig?: Partial<ImgixClientConfig>;\n};\n\nexport const resolveGatsbyImageData = async (\n\timage: ImageSource,\n\toptions: GatsbyImageDataArgs = {},\n\tconfig: ResolveGatsbyImageDataConfig,\n): Promise<IGatsbyImageData | null> => {\n\tconst imageDataArgs: IGatsbyImageHelperArgs = {\n\t\tpluginName: config.pluginName || packageName,\n\t\tsourceMetadata: {\n\t\t\twidth: image.width,\n\t\t\theight: image.height,\n\t\t\tformat: \"auto\",\n\t\t},\n\t\tfilename: image.url,\n\t\tgenerateImageSource: generateGatsbyImageDataSource({\n\t\t\timgixClientConfig: config.imgixClientConfig,\n\t\t}),\n\t\toptions,\n\t\tlayout: options.layout,\n\t};\n\n\tif (options.placeholder === GatsbyImageDataPlaceholderKind.Blurred) {\n\t\timageDataArgs.placeholderURL = await fetchBase64Image({\n\t\t\turl: getLowResolutionImageURL(imageDataArgs),\n\t\t\tcache: config.cache,\n\t\t});\n\t}\n\n\tif (options.placeholder === GatsbyImageDataPlaceholderKind.DominantColor) {\n\t\tconst cacheKey = `${GatsbyImageDataPlaceholderKind.DominantColor}___${image.url}`;\n\t\tconst cacheValue: string | undefined = await config.cache.get(cacheKey);\n\n\t\tif (cacheValue) {\n\t\t\timageDataArgs.backgroundColor = cacheValue;\n\t\t} else {\n\t\t\tconst url = new URL(image.url);\n\t\t\tconst filename = decodeURIComponent(url.pathname);\n\t\t\tconst client = new ImgixClient({\n\t\t\t\tdomain: url.hostname,\n\t\t\t\t...config.imgixClientConfig,\n\t\t\t});\n\n\t\t\tconst palleteUrl = client.buildURL(\n\t\t\t\tfilename,\n\t\t\t\tparamCaseObject({\n\t\t\t\t\t...DEFAULT_IMGIX_PARAMS,\n\t\t\t\t\t...options.imgixParams,\n\t\t\t\t\tpalette: \"json\",\n\t\t\t\t}),\n\t\t\t);\n\t\t\tconst res = await fetch(palleteUrl);\n\t\t\tconst json = (await res.json()) as ImgixPalleteLike;\n\n\t\t\tconst dominantColor = json.dominant_colors.vibrant.hex;\n\n\t\t\tconfig.cache.set(cacheKey, dominantColor);\n\n\t\t\timageDataArgs.backgroundColor = dominantColor;\n\t\t}\n\t}\n\n\treturn generateImageData(imageDataArgs);\n};\n","import type { GatsbyCache } from \"gatsby\";\nimport type { ObjectTypeComposerFieldConfigAsObjectDefinition } from \"graphql-compose\";\nimport { getGatsbyImageFieldConfig } from \"gatsby-plugin-image/graphql-utils\";\n\nimport { GenerateImageSource, ImgixClientConfig, ImgixParams } from \"../types\";\nimport { GraphQLTypeName, GatsbyImageDataPlaceholderKind } from \"../constants\";\nimport {\n\tGatsbyImageDataArgs,\n\tresolveGatsbyImageData,\n} from \"../resolvers/resolveGatsbyImageData.server\";\n\nexport type BuildGatsbyImageDataFieldConfigConfig<TSource> = {\n\tnamespace: string;\n\tpluginName: string;\n\tgenerateImageSource: GenerateImageSource<TSource>;\n\tcache: GatsbyCache;\n\tdefaultImgixParams?: ImgixParams;\n\tdefaultPlaceholderImgixParams?: ImgixParams;\n\timgixClientConfig?: Partial<ImgixClientConfig>;\n};\n\nexport const buildGatsbyImageDataFieldConfig = <TSource, TContext>(\n\tconfig: BuildGatsbyImageDataFieldConfigConfig<TSource>,\n): ObjectTypeComposerFieldConfigAsObjectDefinition<\n\tTSource,\n\tTContext,\n\tGatsbyImageDataArgs\n> => {\n\tconst fieldConfig = getGatsbyImageFieldConfig<\n\t\tTSource,\n\t\tTContext,\n\t\tGatsbyImageDataArgs\n\t>(async (source, args) => {\n\t\tconst imageSource = await config.generateImageSource(source);\n\n\t\tif (imageSource !== null) {\n\t\t\treturn resolveGatsbyImageData(\n\t\t\t\t{\n\t\t\t\t\turl: imageSource.url,\n\t\t\t\t\twidth: imageSource.width,\n\t\t\t\t\theight: imageSource.height,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t...args,\n\t\t\t\t\timgixParams: {\n\t\t\t\t\t\t...config.defaultImgixParams,\n\t\t\t\t\t\t...args.imgixParams,\n\t\t\t\t\t},\n\t\t\t\t\tplaceholderImgixParams: {\n\t\t\t\t\t\t...config.defaultPlaceholderImgixParams,\n\t\t\t\t\t\t...args.placeholderImgixParams,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tcache: config.cache,\n\t\t\t\t\tpluginName: config.pluginName,\n\t\t\t\t\timgixClientConfig: config.imgixClientConfig,\n\t\t\t\t},\n\t\t\t);\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}) as ObjectTypeComposerFieldConfigAsObjectDefinition<\n\t\tTSource,\n\t\tTContext,\n\t\tGatsbyImageDataArgs\n\t>;\n\n\t// We need to set this separately since the above type case raises the field\n\t// config to a graphql-compose definition. This allows us to reference types\n\t// by name, which is needed for the arguments.\n\tfieldConfig.args = {\n\t\t...(fieldConfig.args as NonNullable<typeof fieldConfig.args>),\n\t\tplaceholder: {\n\t\t\ttype: config.namespace + GraphQLTypeName.GatsbyImageDataPlaceholderEnum,\n\t\t\tdefaultValue: GatsbyImageDataPlaceholderKind.DominantColor,\n\t\t},\n\t\timgixParams: {\n\t\t\ttype: config.namespace + GraphQLTypeName.ImgixParamsInputObject,\n\t\t},\n\t\tplaceholderImgixParams: {\n\t\t\ttype: config.namespace + GraphQLTypeName.ImgixParamsInputObject,\n\t\t},\n\t};\n\n\t// `getGatsbyImageFieldConfig` returns a \"JSON!\" type. This is undesired when\n\t// the source does not contain a value (i.e. null). Here, we are manually\n\t// overriding the type to be nullable.\n\tfieldConfig.type = \"JSON\";\n\n\treturn fieldConfig;\n};\n","import type { ObjectTypeComposerFieldConfigAsObjectDefinition } from \"graphql-compose\";\nimport ImgixClient from \"@imgix/js-core\";\n\nimport { paramCaseObject } from \"../lib/paramCaseObject\";\n\nimport { GenerateImageSource, ImgixClientConfig, ImgixParams } from \"../types\";\nimport { DEFAULT_IMGIX_PARAMS, GraphQLTypeName } from \"../constants\";\n\nexport type UrlArgs = {\n\timgixParams?: ImgixParams;\n};\n\nexport type BuildUrlFieldConfigConfig<TSource> = {\n\tnamespace: string;\n\tgenerateImageSource: GenerateImageSource<TSource>;\n\tdefaultImgixParams?: ImgixParams;\n\timgixClientConfig?: Partial<ImgixClientConfig>;\n};\n\nexport const buildUrlFieldConfig = <TSource, TContext>(\n\tconfig: BuildUrlFieldConfigConfig<TSource>,\n): ObjectTypeComposerFieldConfigAsObjectDefinition<\n\tTSource,\n\tTContext,\n\tUrlArgs\n> => {\n\treturn {\n\t\ttype: \"String\",\n\t\t// IMPORTANT: These types must be kept in sync with `ImgixUrlArgs`.\n\t\targs: {\n\t\t\timgixParams: {\n\t\t\t\ttype: config.namespace + GraphQLTypeName.ImgixParamsInputObject,\n\t\t\t},\n\t\t},\n\t\tresolve: async (source, args) => {\n\t\t\tconst imageSource = await config.generateImageSource(source);\n\n\t\t\tif (imageSource !== null) {\n\t\t\t\tconst url = new URL(imageSource.url);\n\t\t\t\tconst client = new ImgixClient({\n\t\t\t\t\tdomain: url.hostname,\n\t\t\t\t\t...config.imgixClientConfig,\n\t\t\t\t});\n\n\t\t\t\treturn client.buildURL(\n\t\t\t\t\tdecodeURIComponent(url.pathname),\n\t\t\t\t\tparamCaseObject({\n\t\t\t\t\t\t...DEFAULT_IMGIX_PARAMS,\n\t\t\t\t\t\t...config.defaultImgixParams,\n\t\t\t\t\t\t...args.imgixParams,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t},\n\t};\n};\n","import type { NodePluginSchema, GatsbyGraphQLInputObjectType } from \"gatsby\";\nimport { parameters as imgixParamSpecs } from \"imgix-url-params/dist/parameters.json\";\nimport { camelCase } from \"camel-case\";\n\nimport { GraphQLTypeName } from \"../constants\";\n\nexport type BuildImgixParamsInputObjectTypeConfig = {\n\tnamespace: string;\n\tschema: NodePluginSchema;\n};\n\nexport const buildImgixParamsInputObjectType = (\n\tconfig: BuildImgixParamsInputObjectTypeConfig,\n): GatsbyGraphQLInputObjectType => {\n\tconst fields: GatsbyGraphQLInputObjectType[\"config\"][\"fields\"] = {};\n\n\tfor (const paramKey in imgixParamSpecs) {\n\t\tconst paramSpec = imgixParamSpecs[paramKey as keyof typeof imgixParamSpecs];\n\n\t\tconst normalizedName = camelCase(paramKey);\n\n\t\tconst expects = paramSpec.expects;\n\t\tconst expectsTypes = Array.from(\n\t\t\tnew Set(expects.map((expect) => expect.type)),\n\t\t);\n\n\t\tconst type = expectsTypes.every(\n\t\t\t(type) => type === \"integer\" || type === \"unit_scalar\",\n\t\t)\n\t\t\t? \"Int\"\n\t\t\t: expectsTypes.every(\n\t\t\t\t\t(type) =>\n\t\t\t\t\t\ttype === \"integer\" || type === \"unit_scalar\" || type === \"number\",\n\t\t\t  )\n\t\t\t? \"Float\"\n\t\t\t: expectsTypes.every((type) => type === \"boolean\")\n\t\t\t? \"Boolean\"\n\t\t\t: \"String\";\n\n\t\tconst fieldDefinition: typeof fields[string] = {\n\t\t\ttype,\n\t\t\tdescription:\n\t\t\t\tparamSpec.short_description +\n\t\t\t\t// Ensure the description ends with a period.\n\t\t\t\t(paramSpec.short_description.slice(-1) === \".\" ? \"\" : \".\"),\n\t\t};\n\n\t\t// Add the default value as part of the description. Setting it as a\n\t\t// GraphQL default value will automatically assign it in the final URL.\n\t\t// Doing so would result in a huge number of unwanted params.\n\t\tif (\"default\" in paramSpec) {\n\t\t\tfieldDefinition.description =\n\t\t\t\tfieldDefinition.description + ` Default: \\`${paramSpec.default}\\`.`;\n\t\t}\n\n\t\t// Add Imgix documentation URL as part of the description.\n\t\tif (\"url\" in paramSpec) {\n\t\t\tfieldDefinition.description =\n\t\t\t\tfieldDefinition.description + ` [See docs](${paramSpec.url}).`;\n\t\t}\n\n\t\tfields[normalizedName] = fieldDefinition;\n\n\t\t// Create aliased fields.\n\t\tif (\"aliases\" in paramSpec) {\n\t\t\tfor (const alias of paramSpec.aliases) {\n\t\t\t\tfields[camelCase(alias)] = {\n\t\t\t\t\t...fieldDefinition,\n\t\t\t\t\tdescription: `Alias for \\`${normalizedName}\\`.`,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t}\n\n\treturn config.schema.buildInputObjectType({\n\t\tname: config.namespace + GraphQLTypeName.ImgixParamsInputObject,\n\t\tfields,\n\t});\n};\n","import type { GatsbyCache } from \"gatsby\";\nimport fetch from \"node-fetch\";\n\nimport { ImageSourceDimensions, ImgixJSONDimensionsLike } from \"../types\";\n\ntype FetchImageDimensionsConfig = {\n\turl: string;\n\tcache: GatsbyCache;\n};\n\nexport const fetchImageDimensions = async (\n\tconfig: FetchImageDimensionsConfig,\n): Promise<ImageSourceDimensions> => {\n\tconst cacheKey = `dimensions___${config.url}`;\n\tconst cacheValue: ImageSourceDimensions | undefined = await config.cache.get(\n\t\tcacheKey,\n\t);\n\n\tif (cacheValue) {\n\t\treturn cacheValue;\n\t} else {\n\t\tconst url = new URL(config.url);\n\t\turl.searchParams.set(\"fm\", \"json\");\n\n\t\tconst res = await fetch(url);\n\t\tconst json = (await res.json()) as ImgixJSONDimensionsLike;\n\t\tconst dimensions = {\n\t\t\twidth: json.PixelWidth,\n\t\t\theight: json.PixelHeight,\n\t\t};\n\n\t\tconfig.cache.set(cacheKey, dimensions);\n\n\t\treturn dimensions;\n\t}\n};\n","import { GatsbyCache } from \"gatsby\";\n\nimport { ImageSource } from \"../types\";\n\nimport { fetchImageDimensions } from \"./fetchImageDimensions.server\";\n\ntype GenerateImageSourceFromUrlConfig = {\n\tcache: GatsbyCache;\n};\n\nexport const generateImageSourceFromUrl = async (\n\turl: string,\n\tconfig: GenerateImageSourceFromUrlConfig,\n): Promise<ImageSource | null> => {\n\tconst dimensions = await fetchImageDimensions({\n\t\turl,\n\t\tcache: config.cache,\n\t});\n\n\treturn {\n\t\turl,\n\t\twidth: dimensions.width,\n\t\theight: dimensions.height,\n\t};\n};\n","export const NAMESPACE = \"Imgix\";\n\nexport enum SourceType {\n\tAmazonS3 = \"s3\",\n\tGoogleCloudStorage = \"gcs\",\n\tMicrosoftAzure = \"azure\",\n\tWebFolder = \"webFolder\",\n\tWebProxy = \"webProxy\",\n}\n\n/**\n * GraphQL type names used for GraphQL type and field builders.\n */\nexport enum GraphQLTypeName {\n\t/**\n\t * Collection of Imgix image resolvers.\n\t */\n\tImage = \"Image\",\n}\n"],"names":["GraphQLTypeName","packageName","imgixParamSpecs"],"mappings":"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"}