1 | var __extends = (this && this.__extends) || (function () {
|
2 | var extendStatics = Object.setPrototypeOf ||
|
3 | ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
4 | function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
|
5 | return function (d, b) {
|
6 | extendStatics(d, b);
|
7 | function __() { this.constructor = d; }
|
8 | d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
9 | };
|
10 | })();
|
11 | import { ApolloLink, Observable, } from 'apollo-link';
|
12 | import { hasDirectives, getMainDefinition } from 'apollo-utilities';
|
13 | import * as Async from 'graphql-anywhere/lib/async';
|
14 | var graphql = Async.graphql;
|
15 | import { removeClientSetsFromDocument, normalizeTypeDefs } from './utils';
|
16 | var capitalizeFirstLetter = function (str) { return str.charAt(0).toUpperCase() + str.slice(1); };
|
17 | export var withClientState = function (clientStateConfig) {
|
18 | if (clientStateConfig === void 0) { clientStateConfig = { resolvers: {}, defaults: {} }; }
|
19 | var defaults = clientStateConfig.defaults, cache = clientStateConfig.cache, typeDefs = clientStateConfig.typeDefs, fragmentMatcher = clientStateConfig.fragmentMatcher;
|
20 | if (cache && defaults) {
|
21 | cache.writeData({ data: defaults });
|
22 | }
|
23 | return new (function (_super) {
|
24 | __extends(StateLink, _super);
|
25 | function StateLink() {
|
26 | return _super !== null && _super.apply(this, arguments) || this;
|
27 | }
|
28 | StateLink.prototype.writeDefaults = function () {
|
29 | if (cache && defaults) {
|
30 | cache.writeData({ data: defaults });
|
31 | }
|
32 | };
|
33 | StateLink.prototype.request = function (operation, forward) {
|
34 | if (forward === void 0) { forward = function () { return Observable.of({ data: {} }); }; }
|
35 | if (typeDefs) {
|
36 | var directives_1 = 'directive @client on FIELD';
|
37 | var definition_1 = normalizeTypeDefs(typeDefs);
|
38 | operation.setContext(function (_a) {
|
39 | var _b = _a.schemas, schemas = _b === void 0 ? [] : _b;
|
40 | return ({
|
41 | schemas: schemas.concat([{ definition: definition_1, directives: directives_1 }]),
|
42 | });
|
43 | });
|
44 | }
|
45 | var isClient = hasDirectives(['client'], operation.query);
|
46 | if (!isClient)
|
47 | return forward(operation);
|
48 | var resolvers = typeof clientStateConfig.resolvers === 'function'
|
49 | ? clientStateConfig.resolvers()
|
50 | : clientStateConfig.resolvers;
|
51 | var server = removeClientSetsFromDocument(operation.query);
|
52 | var query = operation.query;
|
53 | var type = capitalizeFirstLetter((getMainDefinition(query) || {}).operation) || 'Query';
|
54 | var resolver = function (fieldName, rootValue, args, context, info) {
|
55 | if (rootValue === void 0) { rootValue = {}; }
|
56 | var resultKey = info.resultKey;
|
57 | var aliasedNode = rootValue[resultKey];
|
58 | var preAliasingNode = rootValue[fieldName];
|
59 | var aliasNeeded = resultKey !== fieldName;
|
60 | if (aliasedNode !== undefined || preAliasingNode !== undefined) {
|
61 | return aliasedNode || preAliasingNode;
|
62 | }
|
63 | var resolverMap = resolvers[rootValue.__typename || type];
|
64 | if (resolverMap) {
|
65 | var resolve = resolverMap[fieldName];
|
66 | if (resolve)
|
67 | return resolve(rootValue, args, context, info);
|
68 | }
|
69 | return ((aliasNeeded ? aliasedNode : preAliasingNode) ||
|
70 | (defaults || {})[fieldName]);
|
71 | };
|
72 | if (server)
|
73 | operation.query = server;
|
74 | var obs = server && forward
|
75 | ? forward(operation)
|
76 | : Observable.of({
|
77 | data: {},
|
78 | });
|
79 | return new Observable(function (observer) {
|
80 | var complete = false;
|
81 | var handlingNext = false;
|
82 | obs.subscribe({
|
83 | next: function (_a) {
|
84 | var data = _a.data, errors = _a.errors;
|
85 | var observerErrorHandler = observer.error.bind(observer);
|
86 | var context = operation.getContext();
|
87 | handlingNext = true;
|
88 | graphql(resolver, query, data, context, operation.variables, {
|
89 | fragmentMatcher: fragmentMatcher,
|
90 | })
|
91 | .then(function (nextData) {
|
92 | observer.next({
|
93 | data: nextData,
|
94 | errors: errors,
|
95 | });
|
96 | if (complete) {
|
97 | observer.complete();
|
98 | }
|
99 | handlingNext = false;
|
100 | })
|
101 | .catch(observerErrorHandler);
|
102 | },
|
103 | error: observer.error.bind(observer),
|
104 | complete: function () {
|
105 | if (!handlingNext) {
|
106 | observer.complete();
|
107 | }
|
108 | complete = true;
|
109 | },
|
110 | });
|
111 | });
|
112 | };
|
113 | return StateLink;
|
114 | }(ApolloLink))();
|
115 | };
|
116 |
|
\ | No newline at end of file |