js-contracts
Version:
C# inspired Code Contracts
159 lines • 7.62 kB
JavaScript
;
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