UNPKG

@specifai-net/appsync-template-tester

Version:

Unit test AppSync VTL resolvers, with popular frameworks such as Jest

165 lines 14.9 kB
"use strict"; 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==