UNPKG

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
"use strict"; 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;