UNPKG

10.9 kBSource Map (JSON)View Raw
1{"version":3,"file":"bundle.umd.js","sources":["../src/utils.ts","../src/index.ts"],"sourcesContent":["// importing print is a reasonable thing to do, since Apollo Link Http requires\n// it to be present\nimport { DocumentNode, DirectiveNode, print } from 'graphql';\n\nimport { checkDocument, removeDirectivesFromDocument } from 'apollo-utilities';\n\nconst connectionRemoveConfig = {\n test: (directive: DirectiveNode) => directive.name.value === 'client',\n remove: true,\n};\n\nconst removed = new Map();\nexport function removeClientSetsFromDocument(\n query: DocumentNode,\n): DocumentNode {\n // caching\n const cached = removed.get(query);\n if (cached) return cached;\n\n checkDocument(query);\n\n const docClone = removeDirectivesFromDocument(\n [connectionRemoveConfig],\n query,\n );\n\n // caching\n removed.set(query, docClone);\n return docClone;\n}\n\nexport function normalizeTypeDefs(\n typeDefs: string | string[] | DocumentNode | DocumentNode[],\n) {\n const defs = Array.isArray(typeDefs) ? typeDefs : [typeDefs];\n\n return defs\n .map(typeDef => (typeof typeDef === 'string' ? typeDef : print(typeDef)))\n .map(str => str.trim())\n .join('\\n');\n}\n","import {\n ApolloLink,\n Observable,\n Operation,\n NextLink,\n FetchResult,\n} from 'apollo-link';\nimport { ApolloCache } from 'apollo-cache';\nimport { DocumentNode } from 'graphql';\n\nimport { hasDirectives, getMainDefinition } from 'apollo-utilities';\n\nimport * as Async from 'graphql-anywhere/lib/async';\nconst { graphql } = Async;\n\nimport { FragmentMatcher } from 'graphql-anywhere';\n\nimport { removeClientSetsFromDocument, normalizeTypeDefs } from './utils';\n\nconst capitalizeFirstLetter = str => str.charAt(0).toUpperCase() + str.slice(1);\n\nexport type ClientStateConfig = {\n cache?: ApolloCache<any>;\n resolvers: any | (() => any);\n defaults?: any;\n typeDefs?: string | string[] | DocumentNode | DocumentNode[];\n fragmentMatcher?: FragmentMatcher;\n};\n\nexport const withClientState = (\n clientStateConfig: ClientStateConfig = { resolvers: {}, defaults: {} },\n) => {\n const { defaults, cache, typeDefs, fragmentMatcher } = clientStateConfig;\n if (cache && defaults) {\n cache.writeData({ data: defaults });\n }\n\n return new class StateLink extends ApolloLink {\n public writeDefaults() {\n if (cache && defaults) {\n cache.writeData({ data: defaults });\n }\n }\n\n public request(\n operation: Operation,\n forward: NextLink = () => Observable.of({ data: {} }),\n ): Observable<FetchResult> {\n if (typeDefs) {\n const directives = 'directive @client on FIELD';\n\n const definition = normalizeTypeDefs(typeDefs);\n\n operation.setContext(({ schemas = [] }) => ({\n schemas: schemas.concat([{ definition, directives }]),\n }));\n }\n\n const isClient = hasDirectives(['client'], operation.query);\n\n if (!isClient) return forward(operation);\n\n const resolvers =\n typeof clientStateConfig.resolvers === 'function'\n ? clientStateConfig.resolvers()\n : clientStateConfig.resolvers;\n const server = removeClientSetsFromDocument(operation.query);\n const { query } = operation;\n const type =\n capitalizeFirstLetter(\n (getMainDefinition(query) || ({} as any)).operation,\n ) || 'Query';\n\n const resolver = (fieldName, rootValue = {}, args, context, info) => {\n const { resultKey } = info;\n\n // rootValue[fieldName] is where the data is stored in the \"canonical model\"\n // rootValue[info.resultKey] is where the user wants the data to be.\n // If fieldName != info.resultKey -- then GraphQL Aliases are in play\n // See also:\n // - https://github.com/apollographql/apollo-client/tree/master/packages/graphql-anywhere#resolver-info\n // - https://github.com/apollographql/apollo-link-rest/pull/113\n\n // Support GraphQL Aliases!\n const aliasedNode = rootValue[resultKey];\n const preAliasingNode = rootValue[fieldName];\n const aliasNeeded = resultKey !== fieldName;\n\n // If aliasedValue is defined, some other link or server already returned a value\n if (aliasedNode !== undefined || preAliasingNode !== undefined) {\n return aliasedNode || preAliasingNode;\n }\n\n // Look for the field in the custom resolver map\n const resolverMap = resolvers[(rootValue as any).__typename || type];\n if (resolverMap) {\n const resolve = resolverMap[fieldName];\n if (resolve) return resolve(rootValue, args, context, info);\n }\n\n // TODO: the proper thing to do here is throw an error saying to\n // add `client.onResetStore(link.writeDefaults);`\n // waiting on https://github.com/apollographql/apollo-client/pull/3010\n\n return (\n // Support nested fields\n (aliasNeeded ? aliasedNode : preAliasingNode) ||\n (defaults || {})[fieldName]\n );\n };\n\n if (server) operation.query = server;\n const obs =\n server && forward\n ? forward(operation)\n : Observable.of({\n data: {},\n });\n\n return new Observable(observer => {\n // Works around race condition between completion and graphql execution\n // finishing. If complete is called during the graphql call, we will\n // miss out on the result, since the observer will have completed\n let complete = false;\n let handlingNext = false;\n obs.subscribe({\n next: ({ data, errors }) => {\n const observerErrorHandler = observer.error.bind(observer);\n const context = operation.getContext();\n\n handlingNext = true;\n //data is from the server and provides the root value to this GraphQL resolution\n //when there is no resolver, the data is taken from the context\n graphql(resolver, query, data, context, operation.variables, {\n fragmentMatcher,\n })\n .then(nextData => {\n observer.next({\n data: nextData,\n errors,\n });\n if (complete) {\n observer.complete();\n }\n handlingNext = false;\n })\n .catch(observerErrorHandler);\n },\n error: observer.error.bind(observer),\n complete: () => {\n if (!handlingNext) {\n observer.complete();\n }\n complete = true;\n },\n });\n });\n }\n }();\n};\n"],"names":["checkDocument","removeDirectivesFromDocument","print","graphql","Observable","hasDirectives","getMainDefinition","ApolloLink"],"mappings":"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"}
\No newline at end of file