@indiekit/endpoint-micropub
Version:
Micropub endpoint for Indiekit. Enables publishing content to your website using the Micropub protocol.
81 lines (67 loc) • 2.14 kB
JavaScript
/**
* Return mf2 properties of a post
* @param {object} mf2 - mf2 object
* @param {Array<string>|string} requestedProperties - mf2 properties to select
* @returns {Promise<object>} mf2 with requested properties
*/
export const getMf2Properties = (mf2, requestedProperties) => {
if (!requestedProperties) {
return mf2;
}
const item = mf2.items ? mf2.items[0] : mf2;
const { properties } = item;
// Return requested properties
if (requestedProperties) {
requestedProperties = Array.isArray(requestedProperties)
? requestedProperties
: [requestedProperties];
const selectedProperties = {};
for (const key of requestedProperties) {
if (properties[key]) {
selectedProperties[key] = properties[key];
}
}
item.properties = selectedProperties;
}
// Return properties
delete item.type;
return item;
};
/**
* Convert JF2 post data to mf2
* @param {object} postData - Post data
* @param {boolean} [includeObjectId] - Include ObjectID from post data
* @returns {object} mf2
*/
export const jf2ToMf2 = (postData, includeObjectId = true) => {
const { properties, _id } = postData;
const mf2 = {
type: [`h-${properties.type}`],
properties: {
...(includeObjectId && _id && { uid: [_id] }),
},
};
delete properties.type;
// Move values to property object
for (const key in properties) {
// Convert nested vocabulary to mf2 (i.e. h-card, h-geo, h-adr)
if (Object.prototype.hasOwnProperty.call(properties[key], "type")) {
mf2.properties[key] = [jf2ToMf2({ properties: properties[key] }, false)];
}
// Convert values to arrays (i.e. 'a' => ['a'])
else if (Object.prototype.hasOwnProperty.call(properties, key)) {
const value = properties[key];
mf2.properties[key] = Array.isArray(value) ? value : [value];
}
}
// Update key for plaintext content
if (
mf2.properties.content &&
mf2.properties.content[0] &&
mf2.properties.content[0].text
) {
mf2.properties.content[0].value = properties.content.text;
delete mf2.properties.content[0].text;
}
return mf2;
};