UNPKG

apollo-link-contentful

Version:

Perform GraphQL queries against Contentful’s Rest API. No more, query size limits! No more, query complexities!!

109 lines (85 loc) • 5.03 kB
import _defineProperty from "@babel/runtime/helpers/defineProperty"; import _inheritsLoose from "@babel/runtime/helpers/inheritsLoose"; function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } import { ApolloLink, Observable } from '@apollo/client'; import { omit } from 'lomit'; import { graphql } from 'graphql-anywhere/lib/async'; import { contentfulResolver, graphqlParser } from 'contentful-parsers'; var contentful = require('contentful'); import { buildDefinitionMap, getRootKey, parseQueryVariables } from './utils'; /** * ApolloLink instance that allows for queries to be performed against * the Contentful REST API. * * @returns {ContentfulRestLink} */ export var ContentfulRestLink = /*#__PURE__*/function (_ApolloLink) { _inheritsLoose(ContentfulRestLink, _ApolloLink); function ContentfulRestLink(clientOptions, queryDefaults) { var _this; if (queryDefaults === void 0) { queryDefaults = {}; } _this = _ApolloLink.call(this) || this; _this.clientOptions = clientOptions; _this.queryDefaults = queryDefaults; // Create Delivery Client _this.client = contentful.createClient(_objectSpread({}, omit(clientOptions, ['previewAccessToken']))); // Create Preview Client, if required options are passed if (clientOptions.hasOwnProperty('previewAccessToken') && clientOptions.previewAccessToken) { _this.previewClient = contentful.createClient(_objectSpread(_objectSpread({}, omit(clientOptions, ['previewAccessToken'])), {}, { accessToken: clientOptions.previewAccessToken, host: 'preview.contentful.com' })); } return _this; } /** * * * @param {Operation} operation * @param {NextLink} forward * @return {Observable<FetchResult> | null} */ var _proto = ContentfulRestLink.prototype; _proto.request = function request(operation, forward) { var _this2 = this; var query = operation.query, operationName = operation.operationName; var obs = forward ? forward(operation) : Observable.of({ data: {} }); return obs.flatMap(function (_ref) { var data = _ref.data, errors = _ref.errors; return new Observable(function (observer) { // Find name to apply as root field of the GraphQL data var rootKey = getRootKey(operation); // Set queryArgs based on variables/queryMethod var queryVariables = parseQueryVariables(operation); // Define the query method to use based on variables var queryMethod = queryVariables && queryVariables.hasOwnProperty('id') ? 'getEntry' : 'getEntries'; // Define query arguments based on the set method var queryArgs = queryMethod === 'getEntry' ? [queryVariables.id, _objectSpread(_objectSpread({}, _this2.queryDefaults), omit(queryVariables, ['id', 'preview']))] : [_objectSpread(_objectSpread(_objectSpread({}, _this2.queryDefaults), omit(queryVariables, ['preview'])), {}, { content_type: rootKey.replace('Collection', '') })]; // Choose client based on `preview` variable var usePreview = _this2.previewClient && queryVariables && queryVariables.hasOwnProperty('preview') && queryVariables.preview; var client = usePreview ? _this2.previewClient : _this2.client; // Contentful query client[queryMethod].apply(client, queryArgs).then(function (contentfulData) { // Build definitionMap to supply expected shape of GraphQL query response var definitionMap = buildDefinitionMap(operation); // Parse Contentful data to expected GraphQL shape var parsedData = graphqlParser(rootKey, contentfulData, definitionMap[operationName]); // console.debug(contentfulData, parsedData) // Query contentfulData via GraphQL query graphql(contentfulResolver, query, parsedData).then(function (data) { observer.next({ data: data, errors: errors }); observer.complete(); })["catch"](function (error) { return console.error(error); }); })["catch"](function (error) { observer.error(error); }); }); }); }; return ContentfulRestLink; }(ApolloLink);