lemon-core
Version:
Lemon Serverless Micro-Service Platform
243 lines • 8.97 kB
JavaScript
"use strict";
// origin from: https://github.com/baseprime/dynamodb @20191106
// Copyright (c) 2016 Ryan Fitzgerald
/**
* `serialize.ts`
* - serialize
*
*
* @author Steve Jung <steve@lemoncloud.io>
* @date 2019-11-20 refactoring to ts via origin
*
* @copyright (C) lemoncloud.io 2019 - All Rights Reserved.
*/
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const lodash_1 = __importDefault(require("lodash"));
const utils = __importStar(require("./utils"));
// eslint-disable-next-line @typescript-eslint/no-var-requires
const DocClient = require('aws-sdk/lib/dynamodb/document_client');
const serializer = {};
const internals = {
docClient: new DocClient(),
createSet: function (value, opt) {
if (lodash_1.default.isArray(value)) {
return internals.docClient.createSet(value);
}
else {
return internals.docClient.createSet([value]);
}
},
serialize: {
binary: function (value) {
if (lodash_1.default.isString(value)) {
return utils.strToBin(value);
}
return value;
},
date: function (value) {
if (lodash_1.default.isDate(value)) {
return value.toISOString();
}
else {
return new Date(value).toISOString();
}
},
boolean: function (value) {
if (value && value !== 'false') {
return true;
}
else {
return false;
}
},
stringSet: function (value) {
return internals.createSet(value, 'S');
},
numberSet: function (value) {
return internals.createSet(value, 'N');
},
binarySet: function (value) {
let bins = value;
if (!lodash_1.default.isArray(value)) {
bins = [value];
}
const vals = lodash_1.default.map(bins, serialize.binary);
return internals.createSet(vals, 'B');
},
},
deserializeAttribute: (value) => {
if (lodash_1.default.isObject(value) && lodash_1.default.isFunction(value.detectType) && lodash_1.default.isArray(value.values)) {
// value is a Set object from document client
return value.values;
}
else {
return value;
}
},
serializeAttribute: (value, type, options) => {
if (!type) {
// if type is unknown, possibly because its an dynamic key return given value
return value;
}
if (lodash_1.default.isNull(value)) {
return null;
}
options = options || {};
switch (type) {
case 'DATE':
return serialize.date(value);
case 'BOOL':
return serialize.boolean(value);
case 'B':
return serialize.binary(value);
case 'NS':
return serialize.numberSet(value);
case 'SS':
return serialize.stringSet(value);
case 'BS':
return serialize.binarySet(value);
default:
return value;
}
},
};
const serialize = internals.serialize;
serializer.serializeAttribute = internals.serializeAttribute;
serializer.buildKey = (hashKey, rangeKey, schema) => {
const obj = {};
if (lodash_1.default.isPlainObject(hashKey)) {
obj[schema.hashKey] = hashKey[schema.hashKey];
if (schema.rangeKey && !lodash_1.default.isNull(hashKey[schema.rangeKey]) && !lodash_1.default.isUndefined(hashKey[schema.rangeKey])) {
obj[schema.rangeKey] = hashKey[schema.rangeKey];
}
lodash_1.default.each(schema.globalIndexes, function (keys) {
if (lodash_1.default.has(hashKey, keys.hashKey)) {
obj[keys.hashKey] = hashKey[keys.hashKey];
}
if (lodash_1.default.has(hashKey, keys.rangeKey)) {
obj[keys.rangeKey] = hashKey[keys.rangeKey];
}
});
lodash_1.default.each(schema.secondaryIndexes, function (keys) {
if (lodash_1.default.has(hashKey, keys.rangeKey)) {
obj[keys.rangeKey] = hashKey[keys.rangeKey];
}
});
}
else {
obj[schema.hashKey] = hashKey;
if (schema.rangeKey && !lodash_1.default.isNull(rangeKey) && !lodash_1.default.isUndefined(rangeKey)) {
obj[schema.rangeKey] = rangeKey;
}
}
return serializer.serializeItem(schema, obj);
};
serializer.serializeItem = (schema, item, options) => {
options = options || {};
const serialize = function (item, datatypes) {
datatypes = datatypes || {};
if (!item) {
return null;
}
return lodash_1.default.reduce(item, function (result, val, key) {
if (options.expected && lodash_1.default.isObject(val) && lodash_1.default.isBoolean(val.Exists)) {
result[key] = val;
return result;
}
if (lodash_1.default.isPlainObject(val)) {
result[key] = serialize(val, datatypes[key]);
return result;
}
if (lodash_1.default.isArray(val) && lodash_1.default.isArray(datatypes[key])) {
result[key] = lodash_1.default.map(val, function (item) {
return serialize(item, datatypes[key][0]);
});
return result;
}
const attr = internals.serializeAttribute(val, datatypes[key], options);
if (!lodash_1.default.isNull(attr) || options.returnNulls) {
if (options.expected) {
result[key] = { Value: attr };
}
else {
result[key] = attr;
}
}
return result;
}, {});
};
return serialize(item, schema._modelDatatypes);
};
serializer.serializeItemForUpdate = function (schema, action, item) {
const datatypes = schema._modelDatatypes;
const data = utils.omitPrimaryKeys(schema, item);
return lodash_1.default.reduce(data, function (result, value, key) {
if (lodash_1.default.isNull(value)) {
result[key] = { Action: 'DELETE' };
}
else if (lodash_1.default.isPlainObject(value) && value.$add) {
result[key] = { Action: 'ADD', Value: internals.serializeAttribute(value.$add, datatypes[key]) };
}
else if (lodash_1.default.isPlainObject(value) && value.$del) {
result[key] = { Action: 'DELETE', Value: internals.serializeAttribute(value.$del, datatypes[key]) };
}
else {
result[key] = { Action: action, Value: internals.serializeAttribute(value, datatypes[key]) };
}
return result;
}, {});
};
serializer.deserializeItem = function (item) {
if (lodash_1.default.isNull(item)) {
return null;
}
const formatter = (data) => {
let map = lodash_1.default.mapValues;
if (lodash_1.default.isArray(data)) {
map = lodash_1.default.map;
}
return map(data, function (value) {
let result;
if (lodash_1.default.isPlainObject(value)) {
result = formatter(value);
}
else if (lodash_1.default.isArray(value)) {
result = formatter(value);
}
else {
result = internals.deserializeAttribute(value);
}
return result;
});
};
return formatter(item);
};
//! export default
exports.default = serializer;
//# sourceMappingURL=serializer.js.map