@webiny/api-headless-cms-ddb-es
Version:
DynamoDB and Elasticsearch storage operations plugin for Headless CMS API.
107 lines (105 loc) • 3.23 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.createRichTextStorageTransformPlugin = void 0;
var _jsonpack = _interopRequireDefault(require("jsonpack"));
var _error = _interopRequireDefault(require("@webiny/error"));
var _apiHeadlessCms = require("@webiny/api-headless-cms");
/**
* Remove when jsonpack gets PR with a fix merged
* https://github.com/rgcl/jsonpack/pull/25/files
* NOTE 2021-07-28: it seems PR is not going to be merged so keep this.
*/
// TODO @ts-refactor figure better type
const transformArray = value => {
if (!value) {
return value;
}
let isArray = Array.isArray(value);
const shouldBeArray = value instanceof Array === false && isArray;
if (shouldBeArray) {
value = Array.from(value);
isArray = true;
}
if (typeof value === "object" || isArray) {
for (const k in value) {
value[k] = transformArray(value[k]);
}
}
return value;
};
const createRichTextStorageTransformPlugin = () => {
const plugin = new _apiHeadlessCms.StorageTransformPlugin({
name: "headless-cms.storage-transform.rich-text.default",
fieldType: "rich-text",
fromStorage: async ({
field,
value: storageValue
}) => {
if (!storageValue) {
return storageValue;
} else if (typeof storageValue !== "object") {
throw new _error.default(`RichText value received in "fromStorage" function is not an object in field "${field.storageId}".`);
}
/**
* This is to circumvent a bug introduced with 5.8.0 storage operations.
* Do not remove.
*/
if (!storageValue["compression"]) {
return storageValue;
}
const {
compression,
value
} = storageValue;
if (compression !== "jsonpack") {
throw new _error.default(`This plugin cannot transform something not packed with "jsonpack".`, "WRONG_COMPRESSION", {
compression
});
}
/**
* No point in going further if no value.
*/
if (!value) {
return null;
}
try {
return _jsonpack.default.unpack(value);
} catch (ex) {
return null;
}
},
toStorage: async ({
value
}) => {
/**
* There is a possibility that we are trying to compress already compressed value.
* Introduced a bug with 5.8.0 storage operations, so just return the value to correct it.
*/
if (!!value?.compression) {
return value;
}
value = transformArray(value);
let jsonValue = null;
try {
jsonValue = _jsonpack.default.pack(value);
} catch (ex) {
if (process.env.DEBUG !== "true") {
return null;
}
console.log("Error while compressing rich-text.");
console.log(ex.message);
}
return {
compression: "jsonpack",
value: jsonValue
};
}
});
plugin.name = `headless-cms.dynamodb.storageTransform.rich-text`;
return plugin;
};
exports.createRichTextStorageTransformPlugin = createRichTextStorageTransformPlugin;
//# sourceMappingURL=richText.js.map