serverless-spy
Version:
CDK-based library for writing elegant integration tests on AWS serverless architecture and an additional web console to monitor events in real time.
350 lines (341 loc) • 13.5 kB
JavaScript
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/index.ts
var src_exports = {};
__export(src_exports, {
NumberValueImpl: () => NumberValue,
convertToAttr: () => convertToAttr,
convertToNative: () => convertToNative,
marshall: () => marshall,
unmarshall: () => unmarshall
});
module.exports = __toCommonJS(src_exports);
// src/NumberValue.ts
var _NumberValue = class _NumberValue {
/**
* This class does not validate that your string input is a valid number.
*
* @param value - a precise number, or any BigInt or string, or AttributeValue.
*/
constructor(value) {
if (typeof value === "object" && "N" in value) {
this.value = String(value.N);
} else {
this.value = String(value);
}
const valueOf = typeof value.valueOf() === "number" ? value.valueOf() : 0;
const imprecise = valueOf > Number.MAX_SAFE_INTEGER || valueOf < Number.MIN_SAFE_INTEGER || Math.abs(valueOf) === Infinity || Number.isNaN(valueOf);
if (imprecise) {
throw new Error(
`NumberValue should not be initialized with an imprecise number=${valueOf}. Use a string instead.`
);
}
}
/**
* This class does not validate that your string input is a valid number.
*
* @param value - a precise number, or any BigInt or string, or AttributeValue.
*/
static from(value) {
return new _NumberValue(value);
}
/**
* @returns the AttributeValue form for DynamoDB.
*/
toAttributeValue() {
return {
N: this.toString()
};
}
/**
* @returns BigInt representation.
*
* @throws SyntaxError if the string representation is not convertable to a BigInt.
*/
toBigInt() {
const stringValue = this.toString();
return BigInt(stringValue);
}
/**
* @override
*
* @returns string representation. This is the canonical format in DynamoDB.
*/
toString() {
return String(this.value);
}
/**
* @override
*/
valueOf() {
return this.toString();
}
};
__name(_NumberValue, "NumberValue");
var NumberValue = _NumberValue;
// src/convertToAttr.ts
var convertToAttr = /* @__PURE__ */ __name((data, options) => {
var _a, _b, _c, _d, _e, _f;
if (data === void 0) {
throw new Error(`Pass options.removeUndefinedValues=true to remove undefined values from map/array/set.`);
} else if (data === null && typeof data === "object") {
return convertToNullAttr();
} else if (Array.isArray(data)) {
return convertToListAttr(data, options);
} else if (((_a = data == null ? void 0 : data.constructor) == null ? void 0 : _a.name) === "Set") {
return convertToSetAttr(data, options);
} else if (((_b = data == null ? void 0 : data.constructor) == null ? void 0 : _b.name) === "Map") {
return convertToMapAttrFromIterable(data, options);
} else if (((_c = data == null ? void 0 : data.constructor) == null ? void 0 : _c.name) === "Object" || // for object which is result of Object.create(null), which doesn't have constructor defined
!data.constructor && typeof data === "object") {
return convertToMapAttrFromEnumerableProps(data, options);
} else if (isBinary(data)) {
if (data.length === 0 && (options == null ? void 0 : options.convertEmptyValues)) {
return convertToNullAttr();
}
return convertToBinaryAttr(data);
} else if (typeof data === "boolean" || ((_d = data == null ? void 0 : data.constructor) == null ? void 0 : _d.name) === "Boolean") {
return { BOOL: data.valueOf() };
} else if (typeof data === "number" || ((_e = data == null ? void 0 : data.constructor) == null ? void 0 : _e.name) === "Number") {
return convertToNumberAttr(data, options);
} else if (data instanceof NumberValue) {
return data.toAttributeValue();
} else if (typeof data === "bigint") {
return convertToBigIntAttr(data);
} else if (typeof data === "string" || ((_f = data == null ? void 0 : data.constructor) == null ? void 0 : _f.name) === "String") {
if (data.length === 0 && (options == null ? void 0 : options.convertEmptyValues)) {
return convertToNullAttr();
}
return convertToStringAttr(data);
} else if ((options == null ? void 0 : options.convertClassInstanceToMap) && typeof data === "object") {
return convertToMapAttrFromEnumerableProps(data, options);
}
throw new Error(
`Unsupported type passed: ${data}. Pass options.convertClassInstanceToMap=true to marshall typeof object as map attribute.`
);
}, "convertToAttr");
var convertToListAttr = /* @__PURE__ */ __name((data, options) => ({
L: data.filter(
(item) => typeof item !== "function" && (!(options == null ? void 0 : options.removeUndefinedValues) || (options == null ? void 0 : options.removeUndefinedValues) && item !== void 0)
).map((item) => convertToAttr(item, options))
}), "convertToListAttr");
var convertToSetAttr = /* @__PURE__ */ __name((set, options) => {
const setToOperate = (options == null ? void 0 : options.removeUndefinedValues) ? new Set([...set].filter((value) => value !== void 0)) : set;
if (!(options == null ? void 0 : options.removeUndefinedValues) && setToOperate.has(void 0)) {
throw new Error(`Pass options.removeUndefinedValues=true to remove undefined values from map/array/set.`);
}
if (setToOperate.size === 0) {
if (options == null ? void 0 : options.convertEmptyValues) {
return convertToNullAttr();
}
throw new Error(`Pass a non-empty set, or options.convertEmptyValues=true.`);
}
const item = setToOperate.values().next().value;
if (item instanceof NumberValue) {
return {
NS: Array.from(setToOperate).map((_) => _.toString())
};
} else if (typeof item === "number") {
return {
NS: Array.from(setToOperate).map((num) => convertToNumberAttr(num, options)).map((item2) => item2.N)
};
} else if (typeof item === "bigint") {
return {
NS: Array.from(setToOperate).map(convertToBigIntAttr).map((item2) => item2.N)
};
} else if (typeof item === "string") {
return {
SS: Array.from(setToOperate).map(convertToStringAttr).map((item2) => item2.S)
};
} else if (isBinary(item)) {
return {
// Do not alter binary data passed https://github.com/aws/aws-sdk-js-v3/issues/1530
// @ts-expect-error Type 'ArrayBuffer' is not assignable to type 'Uint8Array'
BS: Array.from(setToOperate).map(convertToBinaryAttr).map((item2) => item2.B)
};
} else {
throw new Error(`Only Number Set (NS), Binary Set (BS) or String Set (SS) are allowed.`);
}
}, "convertToSetAttr");
var convertToMapAttrFromIterable = /* @__PURE__ */ __name((data, options) => ({
M: ((data2) => {
const map = {};
for (const [key, value] of data2) {
if (typeof value !== "function" && (value !== void 0 || !(options == null ? void 0 : options.removeUndefinedValues))) {
map[key] = convertToAttr(value, options);
}
}
return map;
})(data)
}), "convertToMapAttrFromIterable");
var convertToMapAttrFromEnumerableProps = /* @__PURE__ */ __name((data, options) => ({
M: ((data2) => {
const map = {};
for (const key in data2) {
const value = data2[key];
if (typeof value !== "function" && (value !== void 0 || !(options == null ? void 0 : options.removeUndefinedValues))) {
map[key] = convertToAttr(value, options);
}
}
return map;
})(data)
}), "convertToMapAttrFromEnumerableProps");
var convertToNullAttr = /* @__PURE__ */ __name(() => ({ NULL: true }), "convertToNullAttr");
var convertToBinaryAttr = /* @__PURE__ */ __name((data) => ({ B: data }), "convertToBinaryAttr");
var convertToStringAttr = /* @__PURE__ */ __name((data) => ({ S: data.toString() }), "convertToStringAttr");
var convertToBigIntAttr = /* @__PURE__ */ __name((data) => ({ N: data.toString() }), "convertToBigIntAttr");
var validateBigIntAndThrow = /* @__PURE__ */ __name((errorPrefix) => {
throw new Error(`${errorPrefix} Use NumberValue from @aws-sdk/lib-dynamodb.`);
}, "validateBigIntAndThrow");
var convertToNumberAttr = /* @__PURE__ */ __name((num, options) => {
if ([Number.NaN, Number.POSITIVE_INFINITY, Number.NEGATIVE_INFINITY].map((val) => val.toString()).includes(num.toString())) {
throw new Error(`Special numeric value ${num.toString()} is not allowed`);
} else if (!(options == null ? void 0 : options.allowImpreciseNumbers)) {
if (num > Number.MAX_SAFE_INTEGER) {
validateBigIntAndThrow(`Number ${num.toString()} is greater than Number.MAX_SAFE_INTEGER.`);
} else if (num < Number.MIN_SAFE_INTEGER) {
validateBigIntAndThrow(`Number ${num.toString()} is lesser than Number.MIN_SAFE_INTEGER.`);
}
}
return { N: num.toString() };
}, "convertToNumberAttr");
var isBinary = /* @__PURE__ */ __name((data) => {
const binaryTypes = [
"ArrayBuffer",
"Blob",
"Buffer",
"DataView",
"File",
"Int8Array",
"Uint8Array",
"Uint8ClampedArray",
"Int16Array",
"Uint16Array",
"Int32Array",
"Uint32Array",
"Float32Array",
"Float64Array",
"BigInt64Array",
"BigUint64Array"
];
if (data == null ? void 0 : data.constructor) {
return binaryTypes.includes(data.constructor.name);
}
return false;
}, "isBinary");
// src/convertToNative.ts
var convertToNative = /* @__PURE__ */ __name((data, options) => {
for (const [key, value] of Object.entries(data)) {
if (value !== void 0) {
switch (key) {
case "NULL":
return null;
case "BOOL":
return Boolean(value);
case "N":
return convertNumber(value, options);
case "B":
return convertBinary(value);
case "S":
return convertString(value);
case "L":
return convertList(value, options);
case "M":
return convertMap(value, options);
case "NS":
return new Set(value.map((item) => convertNumber(item, options)));
case "BS":
return new Set(value.map(convertBinary));
case "SS":
return new Set(value.map(convertString));
default:
throw new Error(`Unsupported type passed: ${key}`);
}
}
}
throw new Error(`No value defined: ${JSON.stringify(data)}`);
}, "convertToNative");
var convertNumber = /* @__PURE__ */ __name((numString, options) => {
if (typeof (options == null ? void 0 : options.wrapNumbers) === "function") {
return options == null ? void 0 : options.wrapNumbers(numString);
}
if (options == null ? void 0 : options.wrapNumbers) {
return NumberValue.from(numString);
}
const num = Number(numString);
const infinityValues = [Number.POSITIVE_INFINITY, Number.NEGATIVE_INFINITY];
const isLargeFiniteNumber = (num > Number.MAX_SAFE_INTEGER || num < Number.MIN_SAFE_INTEGER) && !infinityValues.includes(num);
if (isLargeFiniteNumber) {
if (typeof BigInt === "function") {
try {
return BigInt(numString);
} catch (error) {
throw new Error(`${numString} can't be converted to BigInt. Set options.wrapNumbers to get string value.`);
}
} else {
throw new Error(`${numString} is outside SAFE_INTEGER bounds. Set options.wrapNumbers to get string value.`);
}
}
return num;
}, "convertNumber");
var convertString = /* @__PURE__ */ __name((stringValue) => stringValue, "convertString");
var convertBinary = /* @__PURE__ */ __name((binaryValue) => binaryValue, "convertBinary");
var convertList = /* @__PURE__ */ __name((list, options) => list.map((item) => convertToNative(item, options)), "convertList");
var convertMap = /* @__PURE__ */ __name((map, options) => Object.entries(map).reduce(
(acc, [key, value]) => (acc[key] = convertToNative(value, options), acc),
{}
), "convertMap");
// src/marshall.ts
function marshall(data, options) {
const attributeValue = convertToAttr(data, options);
const [key, value] = Object.entries(attributeValue)[0];
switch (key) {
case "M":
case "L":
return (options == null ? void 0 : options.convertTopLevelContainer) ? attributeValue : value;
case "SS":
case "NS":
case "BS":
case "S":
case "N":
case "B":
case "NULL":
case "BOOL":
case "$unknown":
default:
return attributeValue;
}
}
__name(marshall, "marshall");
// src/unmarshall.ts
var unmarshall = /* @__PURE__ */ __name((data, options) => {
if (options == null ? void 0 : options.convertWithoutMapWrapper) {
return convertToNative(data, options);
}
return convertToNative({ M: data }, options);
}, "unmarshall");
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
NumberValueImpl,
convertToAttr,
convertToNative,
marshall,
unmarshall
});
;