@grapes-agency/apollo-link-local-schema
Advanced tools
Comparing version 1.0.0-alpha.6 to 1.0.0-alpha.7
@@ -5,2 +5,9 @@ # Changelog | ||
## [1.0.0-alpha.7](https://github.com/grapes-agency/apollo-link-local-schema/compare/v1.0.0-alpha.6...v1.0.0-alpha.7) (2020-10-08) | ||
### Bug Fixes | ||
* correctly resolve subscription response fields ([ebf501b](https://github.com/grapes-agency/apollo-link-local-schema/commit/ebf501b0b974c3c8b1c00e8929fdf645983abe03)) | ||
## [1.0.0-alpha.6](https://github.com/grapes-agency/apollo-link-local-schema/compare/v1.0.0-alpha.5...v1.0.0-alpha.6) (2020-10-08) | ||
@@ -7,0 +14,0 @@ |
@@ -264,5 +264,8 @@ 'use strict'; | ||
const isSubscriptionResolver = (resolver) => resolver && 'subscribe' in resolver && typeof resolver.subscribe === 'function'; | ||
const mapSubscription = ({ fieldName, resolver, objectType, typeMap }) => (root, args, context, info) => { | ||
const transform = resolver.resolve || ((value) => value[fieldName]); | ||
const isSubscriptionResolver = (resolver) => typeof resolver === 'object' && 'subscribe' in resolver && typeof resolver.subscribe === 'function'; | ||
const mapSubscription = ({ fieldName, resolver, objectType, typeMap, }) => (root, args, context, info) => { | ||
if (context.__subscription) { | ||
const transform = resolver.resolve || ((value) => value[fieldName]); | ||
return transform(root, args, context, info); | ||
} | ||
return new client.Observable(observer => { | ||
@@ -279,12 +282,7 @@ let stopped = false; | ||
if (value) { | ||
Promise.resolve(transform(value, args, context, info)).then(transformedValue => { | ||
if (stopped) { | ||
return; | ||
} | ||
observer.next({ | ||
[fieldName]: objectType | ||
? addTypesnames(Object.assign(Object.assign({}, info), { data: transformedValue, objectType, | ||
typeMap })) | ||
: transformedValue, | ||
}); | ||
observer.next({ | ||
[fieldName]: objectType | ||
? addTypesnames(Object.assign(Object.assign({}, info), { data: value[fieldName], objectType, | ||
typeMap })) | ||
: value[fieldName], | ||
}); | ||
@@ -658,2 +656,3 @@ } | ||
/* eslint-disable no-shadow */ | ||
class LocalSchemaLink extends client.ApolloLink { | ||
@@ -685,2 +684,8 @@ constructor({ typeDefs, resolvers, context, assumeLocal, validateQuery = true, introspection = true, discriminationDirective = 'local', }) { | ||
} | ||
getContext() { | ||
if (typeof this.context === 'function') { | ||
return this.context(); | ||
} | ||
return this.context; | ||
} | ||
splitDocumentByDirective(document) { | ||
@@ -710,3 +715,2 @@ if (this.processedDocuments.has(document)) { | ||
const localState = this.getLocalState(operation); | ||
let context; | ||
if (normalQuery) { | ||
@@ -723,3 +727,2 @@ return nonLocalObservable.flatMap(remoteResult => new client.Observable(observer => { | ||
} | ||
context = typeof this.context === 'function' ? this.context() : this.context; | ||
localState | ||
@@ -729,8 +732,7 @@ .runResolvers({ | ||
remoteResult, | ||
context, | ||
context: this.getContext(), | ||
variables, | ||
}) | ||
.then(({ data, errors }) => { | ||
const cleanedData = cleanResult({ data, document: localQuery }); | ||
observer.next({ data: cleanedData, errors }); | ||
observer.next({ data: cleanResult({ data, document: localQuery }), errors }); | ||
observer.complete(); | ||
@@ -746,3 +748,3 @@ }) | ||
localState | ||
.runResolvers({ document: subscriptionQuery, remoteResult: { data: {} }, context, variables }) | ||
.runResolvers({ document: subscriptionQuery, remoteResult: { data: {} }, context: this.getContext(), variables }) | ||
.then(({ data, errors }) => { | ||
@@ -759,4 +761,17 @@ if (!data) { | ||
const observables = []; | ||
Object.entries(data).forEach(([key, observable]) => { | ||
observables.push(observable.map(result => ({ [key]: result }))); | ||
Object.values(data).forEach(observable => { | ||
observables.push(observable | ||
.flatMap(result => new client.Observable(o => { | ||
localState | ||
.runResolvers({ | ||
document: subscriptionQuery, | ||
remoteResult: { data: result }, | ||
context: Object.assign(Object.assign({}, this.getContext()), { __subscription: true }), | ||
variables, | ||
}) | ||
.then(enrichtedResult => o.next(enrichtedResult)); | ||
})) | ||
.map(({ data }) => ({ | ||
data: cleanResult({ data, document: subscriptionQuery }), | ||
}))); | ||
}); | ||
@@ -763,0 +778,0 @@ if (observables.length === 0) { |
@@ -25,2 +25,3 @@ /// <reference types="zen-observable" /> | ||
private getLocalState; | ||
private getContext; | ||
private splitDocumentByDirective; | ||
@@ -27,0 +28,0 @@ request(operation: Operation, forward?: NextLink): Observable<FetchResult> | null; |
@@ -13,2 +13,3 @@ import { ApolloLink, Observable } from '@apollo/client'; | ||
/* eslint-disable no-shadow */ | ||
class LocalSchemaLink extends ApolloLink { | ||
@@ -40,2 +41,8 @@ constructor({ typeDefs, resolvers, context, assumeLocal, validateQuery = true, introspection = true, discriminationDirective = 'local', }) { | ||
} | ||
getContext() { | ||
if (typeof this.context === 'function') { | ||
return this.context(); | ||
} | ||
return this.context; | ||
} | ||
splitDocumentByDirective(document) { | ||
@@ -65,3 +72,2 @@ if (this.processedDocuments.has(document)) { | ||
const localState = this.getLocalState(operation); | ||
let context; | ||
if (normalQuery) { | ||
@@ -78,3 +84,2 @@ return nonLocalObservable.flatMap(remoteResult => new Observable(observer => { | ||
} | ||
context = typeof this.context === 'function' ? this.context() : this.context; | ||
localState | ||
@@ -84,8 +89,7 @@ .runResolvers({ | ||
remoteResult, | ||
context, | ||
context: this.getContext(), | ||
variables, | ||
}) | ||
.then(({ data, errors }) => { | ||
const cleanedData = cleanResult({ data, document: localQuery }); | ||
observer.next({ data: cleanedData, errors }); | ||
observer.next({ data: cleanResult({ data, document: localQuery }), errors }); | ||
observer.complete(); | ||
@@ -101,3 +105,3 @@ }) | ||
localState | ||
.runResolvers({ document: subscriptionQuery, remoteResult: { data: {} }, context, variables }) | ||
.runResolvers({ document: subscriptionQuery, remoteResult: { data: {} }, context: this.getContext(), variables }) | ||
.then(({ data, errors }) => { | ||
@@ -114,4 +118,17 @@ if (!data) { | ||
const observables = []; | ||
Object.entries(data).forEach(([key, observable]) => { | ||
observables.push(observable.map(result => ({ [key]: result }))); | ||
Object.values(data).forEach(observable => { | ||
observables.push(observable | ||
.flatMap(result => new Observable(o => { | ||
localState | ||
.runResolvers({ | ||
document: subscriptionQuery, | ||
remoteResult: { data: result }, | ||
context: Object.assign(Object.assign({}, this.getContext()), { __subscription: true }), | ||
variables, | ||
}) | ||
.then(enrichtedResult => o.next(enrichtedResult)); | ||
})) | ||
.map(({ data }) => ({ | ||
data: cleanResult({ data, document: subscriptionQuery }), | ||
}))); | ||
}); | ||
@@ -118,0 +135,0 @@ if (observables.length === 0) { |
{ | ||
"name": "@grapes-agency/apollo-link-local-schema", | ||
"version": "1.0.0-alpha.6", | ||
"version": "1.0.0-alpha.7", | ||
"description": "Lightweight local schema resolver for @apollo/client", | ||
@@ -5,0 +5,0 @@ "main": "index.cjs.js", |
@@ -14,3 +14,5 @@ import { ObjectTypeDefinitionNode } from 'graphql'; | ||
} | ||
export declare const mapSubscription: <C, T>({ fieldName, resolver, objectType, typeMap }: MapSubscriptionOptions<T>) => Resolver<C>; | ||
export declare const mapSubscription: <C, T>({ fieldName, resolver, objectType, typeMap, }: MapSubscriptionOptions<T>) => Resolver<C & { | ||
__subscription?: boolean | undefined; | ||
}>; | ||
export {}; |
import { Observable } from '@apollo/client'; | ||
import { addTypesnames } from './addTypenames.js'; | ||
const isSubscriptionResolver = (resolver) => resolver && 'subscribe' in resolver && typeof resolver.subscribe === 'function'; | ||
const mapSubscription = ({ fieldName, resolver, objectType, typeMap }) => (root, args, context, info) => { | ||
const transform = resolver.resolve || ((value) => value[fieldName]); | ||
const isSubscriptionResolver = (resolver) => typeof resolver === 'object' && 'subscribe' in resolver && typeof resolver.subscribe === 'function'; | ||
const mapSubscription = ({ fieldName, resolver, objectType, typeMap, }) => (root, args, context, info) => { | ||
if (context.__subscription) { | ||
const transform = resolver.resolve || ((value) => value[fieldName]); | ||
return transform(root, args, context, info); | ||
} | ||
return new Observable(observer => { | ||
@@ -18,12 +21,7 @@ let stopped = false; | ||
if (value) { | ||
Promise.resolve(transform(value, args, context, info)).then(transformedValue => { | ||
if (stopped) { | ||
return; | ||
} | ||
observer.next({ | ||
[fieldName]: objectType | ||
? addTypesnames(Object.assign(Object.assign({}, info), { data: transformedValue, objectType, | ||
typeMap })) | ||
: transformedValue, | ||
}); | ||
observer.next({ | ||
[fieldName]: objectType | ||
? addTypesnames(Object.assign(Object.assign({}, info), { data: value[fieldName], objectType, | ||
typeMap })) | ||
: value[fieldName], | ||
}); | ||
@@ -30,0 +28,0 @@ } |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
152041
1742