apollo-link-contentful
Version:
Perform GraphQL queries against Contentful’s Rest API. No more, query size limits! No more, query complexities!!
122 lines (90 loc) • 5.42 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
exports.__esModule = true;
exports.ContentfulRestLink = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _inheritsLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/inheritsLoose"));
var _client = require("@apollo/client");
var _lomit = require("lomit");
var _async = require("graphql-anywhere/lib/async");
var _contentfulParsers = require("contentful-parsers");
var _utils = require("./utils");
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) { (0, _defineProperty2["default"])(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; }
var contentful = require('contentful');
/**
* ApolloLink instance that allows for queries to be performed against
* the Contentful REST API.
*
* @returns {ContentfulRestLink}
*/
var ContentfulRestLink = /*#__PURE__*/function (_ApolloLink) {
(0, _inheritsLoose2["default"])(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({}, (0, _lomit.omit)(clientOptions, ['previewAccessToken']))); // Create Preview Client, if required options are passed
if (clientOptions.hasOwnProperty('previewAccessToken') && clientOptions.previewAccessToken) {
_this.previewClient = contentful.createClient(_objectSpread(_objectSpread({}, (0, _lomit.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) : _client.Observable.of({
data: {}
});
return obs.flatMap(function (_ref) {
var data = _ref.data,
errors = _ref.errors;
return new _client.Observable(function (observer) {
// Find name to apply as root field of the GraphQL data
var rootKey = (0, _utils.getRootKey)(operation); // Set queryArgs based on variables/queryMethod
var queryVariables = (0, _utils.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), (0, _lomit.omit)(queryVariables, ['id', 'preview']))] : [_objectSpread(_objectSpread(_objectSpread({}, _this2.queryDefaults), (0, _lomit.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 = (0, _utils.buildDefinitionMap)(operation); // Parse Contentful data to expected GraphQL shape
var parsedData = (0, _contentfulParsers.graphqlParser)(rootKey, contentfulData, definitionMap[operationName]); // console.debug(contentfulData, parsedData)
// Query contentfulData via GraphQL query
(0, _async.graphql)(_contentfulParsers.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;
}(_client.ApolloLink);
exports.ContentfulRestLink = ContentfulRestLink;