diff --git a/src/extensions/endpoints/EndpointsExtension.ts b/src/extensions/endpoints/EndpointsExtension.ts index 80e6434c2..408613f10 100644 --- a/src/extensions/endpoints/EndpointsExtension.ts +++ b/src/extensions/endpoints/EndpointsExtension.ts @@ -26,7 +26,7 @@ export type GraphQLConfigEnpointsMapData = { } export type GraphQLConfigEnpointsMap = { - [env: string]: GraphQLConfigEnpointConfig + [env: string]: GraphQLConfigEnpointConfig | GraphQLEndpoint } export type GraphQLConfigEnpointsData = GraphQLConfigEnpointsMapData @@ -68,7 +68,15 @@ export class GraphQLEndpointsExtension { ): GraphQLEndpoint { const endpoint = this.getRawEndpoint(endpointName) try { - return new GraphQLEndpoint(resolveEnvsInValues(endpoint, env)) + const resolved = resolveEnvsInValues(endpoint, env) + + // graphql-config extensions might have already instantiated a GraphQLEndpoint + // or derived class from the GraphQLConfigEndpointConfig data. In that case, + // getRawEndpoint will already return a GraphQLEndpoint and it should not be overwritten. + if (!(resolved instanceof GraphQLEndpoint)) { + return new GraphQLEndpoint(resolved) + } + return resolved } catch (e) { e.message = `${this.configPath}: ${e.message}` throw e @@ -99,7 +107,7 @@ export class GraphQLEndpointsExtension { ) } - if (!endpoint.url) { + if (!endpoint.url && !(endpoint instanceof GraphQLEndpoint)) { throw new Error( `${this .configPath}: "url" is required but is not specified for "${endpointName}" endpoint`, diff --git a/src/extensions/endpoints/resolveRefString.ts b/src/extensions/endpoints/resolveRefString.ts index 533a0acf9..992a4d334 100644 --- a/src/extensions/endpoints/resolveRefString.ts +++ b/src/extensions/endpoints/resolveRefString.ts @@ -15,7 +15,6 @@ export function resolveEnvsInValues( config: T, env: { [name: string]: string | undefined }, ): T { - config = Object.assign({}, config) for (let key in config) { const value = config[key] if (typeof value === 'string') {