UNPKG

datocms-client

Version:

For new DatoCMS users, we recommend @datocms/cma-client-node

235 lines (179 loc) 8.75 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.serializedAttributes = serializedAttributes; exports.serializedMeta = serializedMeta; exports["default"] = serializeJsonApi; var _arrDiff = _interopRequireDefault(require("arr-diff")); var _object = _interopRequireDefault(require("object.omit")); var _keyFormatter = require("./keyFormatter"); var _findInfoForProperty = _interopRequireDefault(require("./findInfoForProperty")); var _jsonSchemaRelationships = _interopRequireDefault(require("./jsonSchemaRelationships")); var _jsonSchemaType = _interopRequireDefault(require("./jsonSchemaType")); var _jsonSchemaRequired = require("./jsonSchemaRequired"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var findAttributes = function findAttributes(schema) { var info = (0, _findInfoForProperty["default"])('attributes', schema); if (info && info.properties) { return Object.keys(info.properties); } return []; }; var findMetas = function findMetas(schema) { var info = (0, _findInfoForProperty["default"])('meta', schema); if (info && info.properties) { return Object.keys(info.properties); } return []; }; var metaProperties = function metaProperties(schema, meta) { var info = (0, _findInfoForProperty["default"])('meta', schema); if (info && info.properties) { return info.properties[meta]; } return null; }; var attributeProperties = function attributeProperties(schema, attribute) { var info = (0, _findInfoForProperty["default"])('attributes', schema); if (info && info.properties) { return info.properties[attribute]; } return null; }; var hasKey = function hasKey(o, k) { return Object.prototype.hasOwnProperty.call(o, k); }; function serializedRelationships(type, unserializedBody, schema) { var relationships = (0, _jsonSchemaRelationships["default"])(schema); return relationships.reduce(function (acc, _ref) { var relationship = _ref.relationship, collection = _ref.collection, types = _ref.types; var camelizedRelationship = (0, _keyFormatter.camelize)(relationship); if (relationship !== camelizedRelationship && hasKey(unserializedBody, relationship) && hasKey(unserializedBody, camelizedRelationship)) { throw new Error("Attribute ".concat(camelizedRelationship, " is expressed both in camelCase and snake_case")); } if (hasKey(unserializedBody, camelizedRelationship) || hasKey(unserializedBody, relationship)) { var value = unserializedBody[camelizedRelationship] || unserializedBody[relationship]; var data; if (value) { if (types.length > 1) { data = value; } else if (collection) { data = value.map(function (id) { return { type: types[0], id: id }; }); } else { data = { type: types[0], id: value }; } } else { if ((0, _jsonSchemaRequired.jsonSchemaGroupPropertyRequired)(schema).includes('relationships') && (0, _jsonSchemaRequired.jsonSchemaValueRequired)('relationships', schema).includes(relationship)) { throw new Error("Required relationship: ".concat(camelizedRelationship)); } data = null; } if (relationship !== camelizedRelationship && hasKey(unserializedBody, relationship)) { console.warn("Warning: Attribute ".concat(relationship, " should be expressed in camelCase syntax (").concat(camelizedRelationship, ")")); } return Object.assign(acc, _defineProperty({}, relationship, { data: data })); } if ((0, _jsonSchemaRequired.jsonSchemaGroupPropertyRequired)(schema).includes('relationships') && (0, _jsonSchemaRequired.jsonSchemaPropertyRequired)('relationships', schema).includes(relationship)) { if ((0, _jsonSchemaRequired.jsonSchemaValueRequired)('relationships', schema).includes(relationship)) { throw new Error("Required relationship: ".concat(camelizedRelationship)); } return Object.assign(acc, _defineProperty({}, relationship, { data: null })); } return acc; }, {}); } function serializedAttributes(type) { var unserializedBody = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var schema = arguments.length > 2 ? arguments[2] : undefined; var attrs = type === 'item' ? (0, _arrDiff["default"])(Object.keys((0, _keyFormatter.decamelizeKeys)(unserializedBody)), ['item_type', 'id', 'created_at', 'updated_at', 'creator']) : findAttributes(schema); return attrs.reduce(function (acc, attr) { var camelizedAttr = (0, _keyFormatter.camelize)(attr); var properties = attributeProperties(schema, attr); var decamelizeKeysIfRequired = function decamelizeKeysIfRequired(obj) { return !properties || !properties.keepOriginalCaseOnKeys ? (0, _keyFormatter.decamelizeKeys)(obj) : obj; }; if (attr !== camelizedAttr && hasKey(unserializedBody, attr) && hasKey(unserializedBody, camelizedAttr)) { throw new Error("Attribute ".concat(camelizedAttr, " is expressed both in camelCase and snake_case")); } if (attr !== camelizedAttr && hasKey(unserializedBody, attr)) { console.warn("Warning: Attribute ".concat(attr, " should be expressed in camelCase syntax (").concat(camelizedAttr, ")")); return Object.assign(acc, _defineProperty({}, attr, decamelizeKeysIfRequired(unserializedBody[attr]))); } if (hasKey(unserializedBody, camelizedAttr)) { return Object.assign(acc, _defineProperty({}, attr, decamelizeKeysIfRequired(unserializedBody[camelizedAttr]))); } if ((0, _jsonSchemaRequired.jsonSchemaPropertyRequired)('attributes', schema).includes(attr)) { throw new Error("Required attribute: ".concat(camelizedAttr)); } return acc; }, {}); } function serializedMeta() { var unserializedMeta = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var schema = arguments.length > 1 ? arguments[1] : undefined; var metas = findMetas(schema); if (metas.length === 0) { return null; } return metas.reduce(function (acc, attr) { var camelizedAttr = (0, _keyFormatter.camelize)(attr); var properties = metaProperties(schema, attr); var decamelizeKeysIfRequired = function decamelizeKeysIfRequired(obj) { return !properties || !properties.keepOriginalCaseOnKeys ? (0, _keyFormatter.decamelizeKeys)(obj) : obj; }; if (attr !== camelizedAttr && hasKey(unserializedMeta, attr) && hasKey(unserializedMeta, camelizedAttr)) { throw new Error("Meta ".concat(camelizedAttr, " is expressed both in camelCase and snake_case")); } if (attr !== camelizedAttr && hasKey(unserializedMeta, attr)) { console.warn("Warning: Meta ".concat(attr, " should be expressed in camelCase syntax (").concat(camelizedAttr, ")")); return Object.assign(acc, _defineProperty({}, attr, decamelizeKeysIfRequired(unserializedMeta[attr]))); } if (hasKey(unserializedMeta, camelizedAttr)) { return Object.assign(acc, _defineProperty({}, attr, decamelizeKeysIfRequired(unserializedMeta[camelizedAttr]))); } if ((0, _jsonSchemaRequired.jsonSchemaPropertyRequired)('attributes', schema).includes(attr)) { throw new Error("Required meta: ".concat(camelizedAttr)); } return acc; }, {}); } function serializeJsonApi(unserializedBody, link, itemId) { var data = {}; if (itemId || unserializedBody.id) { data.id = itemId || unserializedBody.id; } var bodyWithoutMeta = hasKey(unserializedBody, 'meta') ? (0, _object["default"])(unserializedBody, ['meta']) : unserializedBody; var type = (0, _jsonSchemaType["default"])(link.schema); data.type = type; var attributes = serializedAttributes(type, bodyWithoutMeta, link.schema); var relationships = serializedRelationships(type, bodyWithoutMeta, link.schema); var meta = unserializedBody.meta && serializedMeta(unserializedBody.meta, link.schema); if ((0, _jsonSchemaRequired.jsonSchemaGroupPropertyRequired)(link.schema).includes('attributes') || Object.keys(attributes).length > 0) { data.attributes = attributes; } if ((0, _jsonSchemaRequired.jsonSchemaGroupPropertyRequired)(link.schema).includes('relationships') || Object.keys(relationships).length > 0) { data.relationships = relationships; } if (meta) { data.meta = meta; } return { data: data }; }