@specifai-net/appsync-template-tester
Version:
Unit test AppSync VTL resolvers, with popular frameworks such as Jest
165 lines • 14.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.matches = exports.typeOf = exports.isMap = exports.isList = exports.isBoolean = exports.isNumber = exports.isString = exports.defaultIfNullOrBlank = exports.defaultIfNullOrEmpty = exports.defaultIfNull = exports.isNullOrBlank = exports.isNullOrEmpty = exports.isNull = exports.validate = exports.appendError = exports.error = exports.unauthorized = exports.autoId = exports.toJson = exports.parseJson = exports.base64Decode = exports.base64Encode = exports.urlDecode = exports.urlEncode = exports.escapeJavaScript = exports.quiet = exports.qr = void 0;
/* eslint-disable import/prefer-default-export */
const uuid_1 = require("uuid");
function qr() {
return "";
}
exports.qr = qr;
function quiet() {
return "";
}
exports.quiet = quiet;
function escapeJavaScript(code) {
// Appsync actually has it's own escape functionality which handles some characters differently
return encodeURI(code);
}
exports.escapeJavaScript = escapeJavaScript;
function urlEncode(url) {
// Appsync also encodes the / character
return escape(url).replace("/", "%2F");
}
exports.urlEncode = urlEncode;
function urlDecode(url) {
// Appsync also decodes the / character
const urlWithSlash = url.replace("%2F", "/");
return unescape(urlWithSlash);
}
exports.urlDecode = urlDecode;
function base64Encode(data) {
return Buffer.from(data).toString("base64");
}
exports.base64Encode = base64Encode;
function base64Decode(buffer) {
return Buffer.from(buffer, "base64").toString("ascii");
}
exports.base64Decode = base64Decode;
function parseJson(json) {
return JSON.parse(json);
}
exports.parseJson = parseJson;
function toJson(obj) {
return JSON.stringify(obj);
}
exports.toJson = toJson;
function autoId() {
return (0, uuid_1.v4)();
}
exports.autoId = autoId;
function unauthorized() {
throw Error("Unauthorized");
}
exports.unauthorized = unauthorized;
function error(message) {
// Whilst this function takes up to 4 inputs, it only throws the first input in the AWS AppSync resolver tester
if (message) {
throw Error(message);
}
}
exports.error = error;
function appendError() {
// Does nothing as side-effects can't be handled by velocityjs - in practice this would add items to the errors array
}
exports.appendError = appendError;
function validate(bool, message) {
if (!bool) {
throw new Error(message);
}
return "";
}
exports.validate = validate;
function isNull(input) {
// Technically undefined returns null, however the javascript VTL tool then gets confused when this is used in
// conditionals (the most common use case) so we'll keep the simple approach here.
return input === null || typeof input === "undefined";
}
exports.isNull = isNull;
function isNullOrEmpty(input) {
return !input;
}
exports.isNullOrEmpty = isNullOrEmpty;
function isNullOrBlank(input) {
if (!input) {
return true;
}
if (typeof input === "string" && input.match(/^[\n\t\r\s]*$/)) {
return true;
}
return false;
}
exports.isNullOrBlank = isNullOrBlank;
function defaultIfNull(obj, defaultObj) {
if (obj === null || typeof obj === "undefined") {
return defaultObj;
}
return obj;
}
exports.defaultIfNull = defaultIfNull;
function defaultIfNullOrEmpty(obj, defaultObj) {
if (!obj) {
return defaultObj;
}
return obj;
}
exports.defaultIfNullOrEmpty = defaultIfNullOrEmpty;
function defaultIfNullOrBlank(obj, defaultObj) {
if (!obj) {
return defaultObj;
}
if (typeof obj === "string" && obj.match(/^[\n\t\r\s]*$/)) {
return defaultObj;
}
return obj;
}
exports.defaultIfNullOrBlank = defaultIfNullOrBlank;
function isString(i) {
return typeof i === "string";
}
exports.isString = isString;
function isNumber(i) {
return typeof i === "number";
}
exports.isNumber = isNumber;
function isBoolean(i) {
return typeof i === "boolean";
}
exports.isBoolean = isBoolean;
function isList(i) {
return Array.isArray(i);
}
exports.isList = isList;
function isMap(i) {
// See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object for details as to why
// this works
return i === Object(i) && !Array.isArray(i) && typeof i === "object";
}
exports.isMap = isMap;
function typeOf(i) {
if (isNull(i)) {
return "Null";
}
if (isNumber(i)) {
return "Number";
}
if (isString(i)) {
return "String";
}
if (isMap(i)) {
return "Map";
}
if (isList(i)) {
return "List";
}
if (isBoolean(i)) {
return "Boolean";
}
return "Object";
}
exports.typeOf = typeOf;
function matches(patternString, str) {
const pattern = new RegExp(patternString);
return !!str.match(pattern);
}
exports.matches = matches;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGlEQUFpRDtBQUNqRCwrQkFBMEI7QUFFMUIsU0FBZ0IsRUFBRTtJQUNoQixPQUFPLEVBQUUsQ0FBQztBQUNaLENBQUM7QUFGRCxnQkFFQztBQUVELFNBQWdCLEtBQUs7SUFDbkIsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDO0FBRkQsc0JBRUM7QUFFRCxTQUFnQixnQkFBZ0IsQ0FBQyxJQUFZO0lBQzNDLCtGQUErRjtJQUMvRixPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6QixDQUFDO0FBSEQsNENBR0M7QUFFRCxTQUFnQixTQUFTLENBQUMsR0FBVztJQUNuQyx1Q0FBdUM7SUFDdkMsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBSEQsOEJBR0M7QUFFRCxTQUFnQixTQUFTLENBQUMsR0FBVztJQUNuQyx1Q0FBdUM7SUFDdkMsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDN0MsT0FBTyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDaEMsQ0FBQztBQUpELDhCQUlDO0FBRUQsU0FBZ0IsWUFBWSxDQUFDLElBQVk7SUFDdkMsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUM5QyxDQUFDO0FBRkQsb0NBRUM7QUFFRCxTQUFnQixZQUFZLENBQUMsTUFBYztJQUN6QyxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN6RCxDQUFDO0FBRkQsb0NBRUM7QUFFRCxTQUFnQixTQUFT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QkFHQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9wcmVmZXItZGVmYXVsdC1leHBvcnQgKi9cbmltcG9ydCB7IHY0IH0gZnJvbSBcInV1aWRcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHFyKCkge1xuICByZXR1cm4gXCJcIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHF1aWV0KCkge1xuICByZXR1cm4gXCJcIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZUphdmFTY3JpcHQoY29kZTogc3RyaW5nKSB7XG4gIC8vIEFwcHN5bmMgYWN0dWFsbHkgaGFzIGl0J3Mgb3duIGVzY2FwZSBmdW5jdGlvbmFsaXR5IHdoaWNoIGhhbmRsZXMgc29tZSBjaGFyYWN0ZXJzIGRpZmZlcmVudGx5XG4gIHJldHVybiBlbmNvZGVVUkkoY29kZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cmxFbmNvZGUodXJsOiBzdHJpbmcpIHtcbiAgLy8gQXBwc3luYyBhbHNvIGVuY29kZXMgdGhlIC8gY2hhcmFjdGVyXG4gIHJldHVybiBlc2NhcGUodXJsKS5yZXBsYWNlKFwiL1wiLCBcIiUyRlwiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVybERlY29kZSh1cmw6IHN0cmluZykge1xuICAvLyBBcHBzeW5jIGFsc28gZGVjb2RlcyB0aGUgLyBjaGFyYWN0ZXJcbiAgY29uc3QgdXJsV2l0aFNsYXNoID0gdXJsLnJlcGxhY2UoXCIlMkZcIiwgXCIvXCIpO1xuICByZXR1cm4gdW5lc2NhcGUodXJsV2l0aFNsYXNoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJhc2U2NEVuY29kZShkYXRhOiBzdHJpbmcpIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKGRhdGEpLnRvU3RyaW5nKFwiYmFzZTY0XCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYmFzZTY0RGVjb2RlKGJ1ZmZlcjogc3RyaW5nKSB7XG4gIHJldHVybiBCdWZmZXIuZnJvbShidWZmZXIsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKFwiYXNjaWlcIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUpzb24oanNvbjogc3RyaW5nKSB7XG4gIHJldHVybiBKU09OLnBhcnNlKGpzb24pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uKG9iajogT2JqZWN0KSB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmopO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXV0b0lkKCkge1xuICByZXR1cm4gdjQoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVuYXV0aG9yaXplZCgpIHtcbiAgdGhyb3cgRXJyb3IoXCJVbmF1dGhvcml6ZWRcIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlcnJvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gIC8vIFdoaWxzdCB0aGlzIGZ1bmN0aW9uIHRha2VzIHVwIHRvIDQgaW5wdXRzLCBpdCBvbmx5IHRocm93cyB0aGUgZmlyc3QgaW5wdXQgaW4gdGhlIEFXUyBBcHBTeW5jIHJlc29sdmVyIHRlc3RlclxuICBpZiAobWVzc2FnZSkge1xuICAgIHRocm93IEVycm9yKG1lc3NhZ2UpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBlbmRFcnJvcigpIHtcbiAgLy8gRG9lcyBub3RoaW5nIGFzIHNpZGUtZWZmZWN0cyBjYW4ndCBiZSBoYW5kbGVkIGJ5IHZlbG9jaXR5anMgLSBpbiBwcmFjdGljZSB0aGlzIHdvdWxkIGFkZCBpdGVtcyB0byB0aGUgZXJyb3JzIGFycmF5XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZShib29sOiBCb29sZWFuLCBtZXNzYWdlPzogc3RyaW5nKSB7XG4gIGlmICghYm9vbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgfVxuICByZXR1cm4gXCJcIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTnVsbChpbnB1dD86IGFueSkge1xuICAvLyBUZWNobmljYWxseSB1bmRlZmluZWQgcmV0dXJucyBudWxsLCBob3dldmVyIHRoZSBqYXZhc2NyaXB0IFZUTCB0b29sIHRoZW4gZ2V0cyBjb25mdXNlZCB3aGVuIHRoaXMgaXMgdXNlZCBpblxuICAvLyBjb25kaXRpb25hbHMgKHRoZSBtb3N0IGNvbW1vbiB1c2UgY2FzZSkgc28gd2UnbGwga2VlcCB0aGUgc2ltcGxlIGFwcHJvYWNoIGhlcmUuXG4gIHJldHVybiBpbnB1dCA9PT0gbnVsbCB8fCB0eXBlb2YgaW5wdXQgPT09IFwidW5kZWZpbmVkXCI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc051bGxPckVtcHR5KGlucHV0PzogYW55KSB7XG4gIHJldHVybiAhaW5wdXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc051bGxPckJsYW5rKGlucHV0PzogYW55KSB7XG4gIGlmICghaW5wdXQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAodHlwZW9mIGlucHV0ID09PSBcInN0cmluZ1wiICYmIGlucHV0Lm1hdGNoKC9eW1xcblxcdFxcclxcc10qJC8pKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdElmTnVsbChvYmo6IGFueSwgZGVmYXVsdE9iajogYW55KSB7XG4gIGlmIChvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiBkZWZhdWx0T2JqO1xuICB9XG4gIHJldHVybiBvYmo7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0SWZOdWxsT3JFbXB0eShvYmo6IGFueSwgZGVmYXVsdE9iajogYW55KSB7XG4gIGlmICghb2JqKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRPYmo7XG4gIH1cbiAgcmV0dXJuIG9iajtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRJZk51bGxPckJsYW5rKG9iajogYW55LCBkZWZhdWx0T2JqOiBhbnkpIHtcbiAgaWYgKCFvYmopIHtcbiAgICByZXR1cm4gZGVmYXVsdE9iajtcbiAgfVxuICBpZiAodHlwZW9mIG9iaiA9PT0gXCJzdHJpbmdcIiAmJiBvYmoubWF0Y2goL15bXFxuXFx0XFxyXFxzXSokLykpIHtcbiAgICByZXR1cm4gZGVmYXVsdE9iajtcbiAgfVxuICByZXR1cm4gb2JqO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmcoaTogYW55KSB7XG4gIHJldHVybiB0eXBlb2YgaSA9PT0gXCJzdHJpbmdcIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTnVtYmVyKGk6IGFueSkge1xuICByZXR1cm4gdHlwZW9mIGkgPT09IFwibnVtYmVyXCI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Jvb2xlYW4oaTogYW55KSB7XG4gIHJldHVybiB0eXBlb2YgaSA9PT0gXCJib29sZWFuXCI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0xpc3QoaTogYW55KSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNNYXAoaTogYW55KSB7XG4gIC8vIFNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QgZm9yIGRldGFpbHMgYXMgdG8gd2h5XG4gIC8vIHRoaXMgd29ya3NcbiAgcmV0dXJuIGkgPT09IE9iamVjdChpKSAmJiAhQXJyYXkuaXNBcnJheShpKSAmJiB0eXBlb2YgaSA9PT0gXCJvYmplY3RcIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHR5cGVPZihpOiBhbnkpIHtcbiAgaWYgKGlzTnVsbChpKSkge1xuICAgIHJldHVybiBcIk51bGxcIjtcbiAgfVxuICBpZiAoaXNOdW1iZXIoaSkpIHtcbiAgICByZXR1cm4gXCJOdW1iZXJcIjtcbiAgfVxuICBpZiAoaXNTdHJpbmcoaSkpIHtcbiAgICByZXR1cm4gXCJTdHJpbmdcIjtcbiAgfVxuICBpZiAoaXNNYXAoaSkpIHtcbiAgICByZXR1cm4gXCJNYXBcIjtcbiAgfVxuICBpZiAoaXNMaXN0KGkpKSB7XG4gICAgcmV0dXJuIFwiTGlzdFwiO1xuICB9XG4gIGlmIChpc0Jvb2xlYW4oaSkpIHtcbiAgICByZXR1cm4gXCJCb29sZWFuXCI7XG4gIH1cbiAgcmV0dXJuIFwiT2JqZWN0XCI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaGVzKHBhdHRlcm5TdHJpbmc6IHN0cmluZywgc3RyOiBzdHJpbmcpIHtcbiAgY29uc3QgcGF0dGVybiA9IG5ldyBSZWdFeHAocGF0dGVyblN0cmluZyk7XG4gIHJldHVybiAhIXN0ci5tYXRjaChwYXR0ZXJuKTtcbn1cbiJdfQ==