UNPKG

js-contracts

Version:
159 lines 7.62 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); var log_1 = __importDefault(require("./log")); var lodash_set_1 = __importDefault(require("lodash.set")); var lodash_get_1 = __importDefault(require("lodash.get")); var lodash_clone_1 = __importDefault(require("lodash.clone")); var contract_1 = __importDefault(require("./contract")); var contract_error_1 = __importDefault(require("./contract-error")); var crypto_1 = __importDefault(require("crypto")); var RESULT = '__RESULT'; var ContractInternal = /** @class */ (function () { function ContractInternal() { } Object.defineProperty(ContractInternal, "shouldSkipContractChecks", { get: function () { return ContractInternal._settings.shouldSkipContractChecks; }, enumerable: true, configurable: true }); ContractInternal._setSettings = function (settings) { ContractInternal._settings = settings; }; ContractInternal.initContextParameters = function (contractInstance, condition, target, key) { var _this = this; var randomId = crypto_1.default.randomBytes(20).toString('hex'); var hasOldValueParameter = ContractInternal.hasOldValueParameter(condition.toString()); var populateCache = function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } return ContractInternal.populateCache(randomId, target.constructor.name, key, ContractInternal.getParameters(condition), args); }; var populateResultCache = function (result) { return ContractInternal.populateFunctionResultCache(randomId, result, target.constructor.name, key); }; var destroyCache = function () { return ContractInternal.destroyClassCache(randomId, target.constructor.name, key); }; var bindOldValue = function () { contract_1.default.OldValue = ContractInternal._oldValue.bind(_this, randomId, target.constructor.name, key, ContractInternal.getOldValueParameter(condition.toString())); }; var bindOldValueByPath = function (context) { contract_1.default.OldValueByPath = function (path) { return ContractInternal._oldValue.apply(context, [randomId, target.constructor.name, key, path]); }; }; var bindFunctionResult = function () { contract_1.default.ContractResult = ContractInternal._contractResult.bind(_this, randomId, target.constructor.name, key); }; return { hasOldValueParameter: hasOldValueParameter, populateCache: populateCache, populateResultCache: populateResultCache, destroyCache: destroyCache, bindOldValue: bindOldValue, bindOldValueByPath: bindOldValueByPath, bindFunctionResult: bindFunctionResult }; }; ContractInternal._ensures = function (condition, message) { if (!condition) { this._executeError(message); } return condition; }; ContractInternal._assert = function (condition, message) { if (!condition) { this._executeError(message); } return condition; }; ContractInternal._exists = function (collection, predicate, message) { var result = !!collection.find(predicate); if (!result) { this._executeError(message); } return result; }; ContractInternal._forAll = function (collection, predicate, message) { var result = collection.every(predicate); if (!result) { this._executeError(message); } return result; }; ContractInternal._requires = function (condition, message) { if (!condition) { this._executeError(message); } return condition; }; ContractInternal._executeError = function (message) { var _a = this._settings, shouldFailOnCondition = _a.shouldFailOnCondition, shouldLogError = _a.shouldLogError, defaultLogger = _a.defaultLogger, defaultContractError = _a.defaultContractError; if (shouldFailOnCondition) { throw new defaultContractError(message || ''); } else if (shouldLogError) { defaultLogger.log(message); } }; ContractInternal.getParameters = function (func) { var regex = new RegExp('(?:' + func.name + '\\s*|^)\\s*\\((.*?)\\)') .exec(func.toString().replace(/\n/g, '')); if (regex === null) { throw new Error("No parameters found for function " + func.toString()); } return regex[1] .replace(/\/\*.*?\*\//g, '') .replace(/ /g, '') .split(','); }; ContractInternal.hasOldValueParameter = function (func) { return func.indexOf('OldValue') > -1; }; ContractInternal.hasResultParameter = function (func) { return func.indexOf('ContractResult') > -1; }; ContractInternal._oldValue = function (randomId, className, functionName, path) { var cachedValue = lodash_get_1.default(ContractInternal._cache, randomId + "." + className + "." + functionName + "." + path); if (!cachedValue) { log_1.default.log('Cached value has not been found, replace with passed value'); } console.log('cachedValue', cachedValue); return cachedValue; }; ContractInternal.getOldValueParameter = function (func) { var result = new RegExp(/OldValue\(([^)]+)\)/).exec(func); return result && result[1]; }; ContractInternal.populateCache = function (randomId, className, functionName, paramsName, values) { lodash_set_1.default(ContractInternal._cache, randomId + "." + className + "." + String(functionName), {}); for (var i = 0; i < paramsName.length; i++) { lodash_set_1.default(ContractInternal._cache[randomId][className][functionName], paramsName[i], lodash_clone_1.default(values[i])); } }; ContractInternal.populateFunctionResultCache = function (randomId, result, className, functionName) { if (!lodash_get_1.default(ContractInternal._cache, randomId + "." + className)) { lodash_set_1.default(ContractInternal._cache, randomId + "." + className + "." + String(functionName), {}); } ContractInternal._cache[randomId][className][String(functionName)][RESULT] = result; }; ContractInternal.destroyClassCache = function (randomId, className, functionName) { delete ContractInternal._cache[randomId][className][functionName]; }; ContractInternal._contractResult = function (randomId, className, functionName) { var cachedValue = lodash_get_1.default(ContractInternal._cache, randomId + "." + className + "." + functionName + "." + RESULT); if (!cachedValue) { log_1.default.log('Cached value has not been found, replace undefined'); } return cachedValue; }; ContractInternal._cache = {}; ContractInternal.defaultSettings = { defaultLogger: log_1.default, defaultContractError: contract_error_1.default, shouldFailOnCondition: true, shouldLogError: true, shouldSkipContractChecks: false }; ContractInternal._settings = ContractInternal.defaultSettings; return ContractInternal; }()); exports.default = ContractInternal; //# sourceMappingURL=contract-internal.js.map