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
JavaScript
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);