gatsby-source-sanity
Version:
Gatsby source plugin for building websites using Sanity.io as a backend.
107 lines • 4.32 kB
JavaScript
;
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
Object.defineProperty(exports, "__esModule", { value: true });
var lodash_1 = require("lodash");
var mutator_1 = require("@sanity/mutator");
var graphql_1 = require("gatsby/graphql");
var documentIds_1 = require("./documentIds");
var unprefixDraftId_1 = require("./unprefixDraftId");
var scalarTypeNames = graphql_1.specifiedScalarTypes.map(function (def) { return def.name; }).concat(['JSON', 'Date']);
// Movie => SanityMovie
var typePrefix = 'Sanity';
// Node fields used internally by Gatsby.
exports.RESTRICTED_NODE_FIELDS = ['id', 'children', 'parent', 'fields', 'internal'];
// Transform a Sanity document into a Gatsby node
function processDocument(doc, options) {
var createNode = options.createNode, createNodeId = options.createNodeId, createContentDigest = options.createContentDigest, overlayDrafts = options.overlayDrafts, skipCreate = options.skipCreate;
var rawAliases = getRawAliases(doc, options);
var safe = prefixConflictingKeys(doc);
var withRefs = rewriteNodeReferences(safe, options);
var node = __assign(__assign(__assign({}, withRefs), rawAliases), { id: documentIds_1.safeId(overlayDrafts ? unprefixDraftId_1.unprefixDraftId(doc._id) : doc._id, createNodeId), parent: null, children: [], internal: {
type: getTypeName(doc._type),
contentDigest: createContentDigest(JSON.stringify(withRefs)),
} });
if (!skipCreate) {
createNode(node);
}
return node;
}
exports.processDocument = processDocument;
// movie => SanityMovie
// blog_post => SanityBlogPost
// sanity.imageAsset => SanityImageAsset
function getTypeName(type) {
if (!type) {
return type;
}
var typeName = lodash_1.startCase(type);
if (scalarTypeNames.includes(typeName)) {
return typeName;
}
return "" + typePrefix + typeName.replace(/\s+/g, '').replace(/^Sanity/, '');
}
exports.getTypeName = getTypeName;
// {foo: 'bar', children: []} => {foo: 'bar', sanityChildren: []}
function prefixConflictingKeys(obj) {
// Will be overwritten, but initialize for type safety
var initial = { _id: '', _type: '' };
return Object.keys(obj).reduce(function (target, key) {
var targetKey = getConflictFreeFieldName(key);
target[targetKey] = obj[key];
return target;
}, initial);
}
function getConflictFreeFieldName(fieldName) {
return exports.RESTRICTED_NODE_FIELDS.includes(fieldName)
? "" + lodash_1.camelCase(typePrefix) + lodash_1.upperFirst(fieldName)
: fieldName;
}
exports.getConflictFreeFieldName = getConflictFreeFieldName;
function getRawAliases(doc, options) {
var typeMap = options.typeMap;
var typeName = getTypeName(doc._type);
var type = typeMap.objects[typeName];
if (!type) {
return {};
}
var initial = {};
return Object.keys(type.fields).reduce(function (acc, fieldName) {
var field = type.fields[fieldName];
var namedType = field.namedType.name.value;
if (field.aliasFor) {
var aliasName_1 = '_' + lodash_1.camelCase("raw_data_" + field.aliasFor);
acc[aliasName_1] = doc[field.aliasFor];
return acc;
}
if (typeMap.scalars.includes(namedType)) {
return acc;
}
var aliasName = '_' + lodash_1.camelCase("raw_data_" + fieldName);
acc[aliasName] = doc[fieldName];
return acc;
}, initial);
}
// Tranform Sanity refs ({_ref: 'foo'}) to Gatsby refs ({_ref: 'someOtherId'})
function rewriteNodeReferences(doc, options) {
var createNodeId = options.createNodeId;
var refs = mutator_1.extractWithPath('..[_ref]', doc);
if (refs.length === 0) {
return doc;
}
var newDoc = lodash_1.cloneDeep(doc);
refs.forEach(function (match) {
lodash_1.set(newDoc, match.path, documentIds_1.safeId(match.value, createNodeId));
});
return newDoc;
}
//# sourceMappingURL=normalize.js.map