@trademe/ensure
Version:
213 lines (199 loc) • 19.2 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('tslib')) :
typeof define === 'function' && define.amd ? define('@trademe/ensure', ['exports', 'tslib'], factory) :
(factory((global.trademe = global.trademe || {}, global.trademe.ensure = {}),global.tslib));
}(this, (function (exports,tslib_1) { 'use strict';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var EnsureError = (function (_super) {
tslib_1.__extends(EnsureError, _super);
function EnsureError(message) {
var _newTarget = this.constructor;
var _this = _super.call(this, dedent(message)) || this;
Object.setPrototypeOf(_this, _newTarget.prototype);
return _this;
}
return EnsureError;
}(Error));
/**
* @param {?} str
* @return {?}
*/
function dedent(str) {
var /** @type {?} */ lines = str.split(/\n/);
var /** @type {?} */ minWhipeSpace = lines.reduce(function (p, n) {
var /** @type {?} */ whitespaceCount = n.search(/\S/);
if (whitespaceCount <= 0) {
return p;
}
return whitespaceCount < p ? whitespaceCount : p;
}, Infinity);
var /** @type {?} */ newLines = lines.map(function (l) { return l.substr(minWhipeSpace); });
return newLines.join('\n');
}
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
// Constants:
var /** @type {?} */ VALUE_KEY = '__value_';
/**
* @param {...?} guards
* @return {?}
*/
function Value() {
var guards = [];
for (var _i = 0; _i < arguments.length; _i++) {
guards[_i] = arguments[_i];
}
var /** @type {?} */ guardsArray = getGuardsArray(guards);
var /** @type {?} */ getters = guardsArray.filter(function (c) { return c.isGetter; });
var /** @type {?} */ setters = guardsArray.filter(function (c) { return !c.isGetter; });
return function (target, propertyKey) {
Object.defineProperty(target, propertyKey, {
get: function () {
var _this = this;
var /** @type {?} */ value = ((Reflect)).getMetadata("" + VALUE_KEY + propertyKey, this);
getters.forEach(function (getter) {
getter.call(_this, value, propertyKey);
});
return value;
},
set: function (value) {
var _this = this;
var /** @type {?} */ castValue = value;
if (castValue === 'null') {
castValue = null;
}
if (castValue != null) {
setters.forEach(function (setter) {
castValue = setter.call(_this, castValue, propertyKey);
});
}
((Reflect)).defineMetadata("" + VALUE_KEY + propertyKey, castValue, this);
}
});
};
}
/**
* @param {?} guards
* @return {?}
*/
function getGuardsArray(guards) {
// Handle old @Value([guardOne, guardTwo]) syntax:
var _a = tslib_1.__read(guards, 1), firstGuard = _a[0];
return Array.isArray(firstGuard) ? /** @type {?} */ (firstGuard) : /** @type {?} */ (guards);
}
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @template T
* @param {?} guard
* @param {?=} config
* @return {?}
*/
function ensure(guard, config) {
Object.defineProperty(guard, 'isGetter', {
get: function () {
return !!config && config.getter;
}
});
return /** @type {?} */ (guard);
}
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var /** @type {?} */ isBool = ensure(function (value, key) {
if (value === true || value === false) {
return value;
}
if (value === 'true' || value === '') {
return true;
}
if (value === 'false') {
return false;
}
throw new EnsureError("\n \"" + value + "\" is not a valid value for '" + key + "'.\n The following values will evaluate to true: true, \"true\", \"\".\n The following values will evaluate to false: false, \"false\".\n ");
});
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @template T
* @param {?} enumValues
* @return {?}
*/
function isEnum(enumValues) {
// This functions is explicitly *not* using the `=>` syntax so that
// the `this` values is bound to the instance being checked.
return ensure(function (value, key) {
var /** @type {?} */ enumValue = enumValues[value];
if (enumValue == null) {
throw new EnsureError("\n \"" + value + "\" is not a valid value for '" + key + "'. You can use one of the following:\n " + getValues(enumValues) + "\n ");
}
return typeof enumValue === 'number' ? enumValue : value;
});
}
/**
* @template T
* @param {?} enumT
* @return {?}
*/
function getValues(enumT) {
return Object.keys(enumT)
.filter(function (key) { return isNaN(+key); })
.map(function (key) { return "\"" + key + "\""; })
.join(',\n ');
}
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var /** @type {?} */ isNotNull = ensure(function (value, key) {
if (value == null) {
throw new EnsureError("\n '" + key + "' must not be \"null\" or \"undefined\".\n ");
}
return value;
}, {
getter: true
});
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var /** @type {?} */ isNumber = ensure(function (value, key) {
value = +parseFloat(value);
if (isNaN(value)) {
throw new EnsureError("\n '" + key + "' must be a number.\n ");
}
return value;
});
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
exports.EnsureError = EnsureError;
exports.dedent = dedent;
exports.Value = Value;
exports.ensure = ensure;
exports.isBool = isBool;
exports.isEnum = isEnum;
exports.isNotNull = isNotNull;
exports.isNumber = isNumber;
Object.defineProperty(exports, '__esModule', { value: true });
})));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhZGVtZS1lbnN1cmUudW1kLmpzLm1hcCIsInNvdXJjZXMiOlsibmc6Ly9AdHJhZGVtZS9lbnN1cmUvZW5zdXJlLWVycm9yLnRzIiwibmc6Ly9AdHJhZGVtZS9lbnN1cmUvdmFsdWUvdmFsdWUudHMiLCJuZzovL0B0cmFkZW1lL2Vuc3VyZS9ndWFyZC9ndWFyZC50cyIsIm5nOi8vQHRyYWRlbWUvZW5zdXJlL2d1YXJkcy9ib29sLnRzIiwibmc6Ly9AdHJhZGVtZS9lbnN1cmUvZ3VhcmRzL2VudW0udHMiLCJuZzovL0B0cmFkZW1lL2Vuc3VyZS9ndWFyZHMvbm90LW51bGwudHMiLCJuZzovL0B0cmFkZW1lL2Vuc3VyZS9ndWFyZHMvbnVtYmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBFbnN1cmVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgbWVzc2FnZT86IHN0cmluZ1xuICAgICkge1xuICAgICAgICBzdXBlcihkZWRlbnQobWVzc2FnZSkpO1xuICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgbmV3LnRhcmdldC5wcm90b3R5cGUpO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZGVudCAoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxpbmVzID0gc3RyLnNwbGl0KC9cXG4vKTtcbiAgICBjb25zdCBtaW5XaGlwZVNwYWNlID0gbGluZXMucmVkdWNlKChwLCBuKSA9PiB7XG4gICAgICAgIGNvbnN0IHdoaXRlc3BhY2VDb3VudCA9IG4uc2VhcmNoKC9cXFMvKTtcbiAgICAgICAgaWYgKHdoaXRlc3BhY2VDb3VudCA8PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd2hpdGVzcGFjZUNvdW50IDwgcCA/IHdoaXRlc3BhY2VDb3VudCA6IHA7XG4gICAgfSwgSW5maW5pdHkpO1xuXG4gICAgY29uc3QgbmV3TGluZXMgPSBsaW5lcy5tYXAobCA9PiBsLnN1YnN0cihtaW5XaGlwZVNwYWNlKSk7XG4gICAgcmV0dXJuIG5ld0xpbmVzLmpvaW4oJ1xcbicpO1xufVxuIiwiLy8gRGVwZW5kZW5jaWVzOlxuaW1wb3J0IHsgaXNOb3ROdWxsIH0gZnJvbSAnLi4vZ3VhcmRzL25vdC1udWxsJztcbmltcG9ydCB7IEd1YXJkIH0gZnJvbSAnLi4vZ3VhcmQvZ3VhcmQnO1xuXG4vLyBDb25zdGFudHM6XG5jb25zdCBWQUxVRV9LRVkgPSAnX192YWx1ZV8nO1xuXG5leHBvcnQgZnVuY3Rpb24gVmFsdWUgKC4uLmd1YXJkczogQXJyYXk8R3VhcmQ8YW55PiB8IEFycmF5PEd1YXJkPGFueT4+Pik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgICBjb25zdCBndWFyZHNBcnJheSA9IGdldEd1YXJkc0FycmF5KGd1YXJkcyk7XG5cbiAgICBjb25zdCBnZXR0ZXJzID0gZ3VhcmRzQXJyYXkuZmlsdGVyKGMgPT4gYy5pc0dldHRlcik7XG4gICAgY29uc3Qgc2V0dGVycyA9IGd1YXJkc0FycmF5LmZpbHRlcihjID0+ICFjLmlzR2V0dGVyKTtcblxuICAgIHJldHVybiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gKFJlZmxlY3QgYXMgYW55KS5nZXRNZXRhZGF0YShgJHtWQUxVRV9LRVl9JHtwcm9wZXJ0eUtleX1gLCB0aGlzKTtcbiAgICAgICAgICAgICAgICBnZXR0ZXJzLmZvckVhY2goZ2V0dGVyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0dGVyLmNhbGwodGhpcywgdmFsdWUsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBsZXQgY2FzdFZhbHVlID0gdmFsdWU7XG5cbiAgICAgICAgICAgICAgICBpZiAoY2FzdFZhbHVlID09PSAnbnVsbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzdFZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY2FzdFZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0dGVycy5mb3JFYWNoKHNldHRlciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXN0VmFsdWUgPSBzZXR0ZXIuY2FsbCh0aGlzLCBjYXN0VmFsdWUsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIChSZWZsZWN0IGFzIGFueSkuZGVmaW5lTWV0YWRhdGEoYCR7VkFMVUVfS0VZfSR7cHJvcGVydHlLZXl9YCwgY2FzdFZhbHVlLCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0R3VhcmRzQXJyYXkgKGd1YXJkczogQXJyYXk8R3VhcmQ8YW55PiB8IEFycmF5PEd1YXJkPGFueT4+Pik6IEFycmF5PEd1YXJkPGFueT4+IHtcbiAgICAvLyBIYW5kbGUgb2xkIEBWYWx1ZShbZ3VhcmRPbmUsIGd1YXJkVHdvXSkgc3ludGF4OlxuICAgIGNvbnN0IFtmaXJzdEd1YXJkXSA9IGd1YXJkcztcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShmaXJzdEd1YXJkKSA/IGZpcnN0R3VhcmQgYXMgQXJyYXk8R3VhcmQ8YW55Pj4gOiBndWFyZHMgYXMgQXJyYXk8R3VhcmQ8YW55Pj47XG59XG4iLCIvLyBEZXBlbmRlbmNpZXM6XG5pbXBvcnQgeyBHdWFyZENvbmZpZyB9IGZyb20gJy4vZ3VhcmQtY29uZmlnJztcblxuZXhwb3J0IHR5cGUgR3VhcmRGdW5jdGlvbjxUID0gYW55PiA9ICh2YWx1ZTogYW55LCBrZXk6IHN0cmluZykgPT4gVDtcbmV4cG9ydCB0eXBlIEd1YXJkPFQgPSBhbnk+ID0geyBpc0dldHRlcjogYm9vbGVhbiB9ICYgR3VhcmRGdW5jdGlvbjxUPjtcblxuZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZSA8VD4gKGd1YXJkOiBHdWFyZEZ1bmN0aW9uLCBjb25maWc/OiBHdWFyZENvbmZpZyk6IEd1YXJkPFQ+IHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZ3VhcmQsICdpc0dldHRlcicsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gISFjb25maWcgJiYgY29uZmlnLmdldHRlcjtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBndWFyZCBhcyBHdWFyZDtcbn1cbiIsIi8vIERlcGVuZGVuY2llczpcbmltcG9ydCB7IEVuc3VyZUVycm9yIH0gZnJvbSAnLi4vZW5zdXJlLWVycm9yJztcbmltcG9ydCB7IGVuc3VyZSB9IGZyb20gJy4uL2d1YXJkL2d1YXJkJztcblxuZXhwb3J0IGNvbnN0IGlzQm9vbCA9IGVuc3VyZSgodmFsdWU6IGFueSwga2V5OiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgICBpZiAodmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSAndHJ1ZScgfHwgdmFsdWUgPT09ICcnKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09ICdmYWxzZScpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFbnN1cmVFcnJvcihgXG4gICAgICAgIFwiJHt2YWx1ZX1cIiBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IgJyR7a2V5fScuXG4gICAgICAgICAgICBUaGUgZm9sbG93aW5nIHZhbHVlcyB3aWxsIGV2YWx1YXRlIHRvIHRydWU6IHRydWUsIFwidHJ1ZVwiLCBcIlwiLlxuICAgICAgICAgICAgVGhlIGZvbGxvd2luZyB2YWx1ZXMgd2lsbCBldmFsdWF0ZSB0byBmYWxzZTogZmFsc2UsIFwiZmFsc2VcIi5cbiAgICBgKTtcbn0pO1xuIiwiLy8gRGVwZW5kZW5jaWVzOlxuaW1wb3J0IHsgRW5zdXJlRXJyb3IgfSBmcm9tICcuLi9lbnN1cmUtZXJyb3InO1xuaW1wb3J0IHsgZW5zdXJlIH0gZnJvbSAnLi4vZ3VhcmQvZ3VhcmQnO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNFbnVtIDxUPiAoZW51bVZhbHVlczogVCk6IEZ1bmN0aW9uIHtcbiAgICAvLyBUaGlzIGZ1bmN0aW9ucyBpcyBleHBsaWNpdGx5ICpub3QqIHVzaW5nIHRoZSBgPT5gIHN5bnRheCBzbyB0aGF0XG4gICAgLy8gdGhlIGB0aGlzYCB2YWx1ZXMgaXMgYm91bmQgdG8gdGhlIGluc3RhbmNlIGJlaW5nIGNoZWNrZWQuXG4gICAgcmV0dXJuIGVuc3VyZTxUPigodmFsdWU6IGFueSwga2V5OiBzdHJpbmcpOiBUID0+IHtcbiAgICAgICAgY29uc3QgZW51bVZhbHVlID0gZW51bVZhbHVlc1t2YWx1ZV07XG4gICAgICAgIGlmIChlbnVtVmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVuc3VyZUVycm9yKGBcbiAgICAgICAgICAgICAgICBcIiR7dmFsdWV9XCIgaXMgbm90IGEgdmFsaWQgdmFsdWUgZm9yICcke2tleX0nLiBZb3UgY2FuIHVzZSBvbmUgb2YgdGhlIGZvbGxvd2luZzpcbiAgICAgICAgICAgICAgICAgICAgJHtnZXRWYWx1ZXM8VD4oZW51bVZhbHVlcyl9XG4gICAgICAgICAgICBgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHlwZW9mIGVudW1WYWx1ZSA9PT0gJ251bWJlcicgPyBlbnVtVmFsdWUgOiB2YWx1ZTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0VmFsdWVzPFQ+IChlbnVtVDogVCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGVudW1UKVxuICAgIC5maWx0ZXIoa2V5ID0+IGlzTmFOKCtrZXkpKVxuICAgIC5tYXAoa2V5ID0+IGBcIiR7a2V5fVwiYClcbiAgICAuam9pbignLFxcbiAgICAgICAgICAgICAgICAgICAgJyk7XG59XG4iLCIvLyBEZXBlbmRlbmNpZXM6XG5pbXBvcnQgeyBFbnN1cmVFcnJvciB9IGZyb20gJy4uL2Vuc3VyZS1lcnJvcic7XG5pbXBvcnQgeyBlbnN1cmUgfSBmcm9tICcuLi9ndWFyZC9ndWFyZCc7XG5cbmV4cG9ydCBjb25zdCBpc05vdE51bGwgPSBlbnN1cmUoKHZhbHVlOiBhbnksIGtleTogYW55KTogYW55ID0+IHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRW5zdXJlRXJyb3IoYFxuICAgICAgICAgICAgJyR7a2V5fScgbXVzdCBub3QgYmUgXCJudWxsXCIgb3IgXCJ1bmRlZmluZWRcIi5cbiAgICAgICAgYCk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn0sIHtcbiAgICBnZXR0ZXI6IHRydWVcbn0pO1xuIiwiLy8gRGVwZW5kZW5jaWVzOlxuaW1wb3J0IHsgRW5zdXJlRXJyb3IgfSBmcm9tICcuLi9lbnN1cmUtZXJyb3InO1xuaW1wb3J0IHsgZW5zdXJlIH0gZnJvbSAnLi4vZ3VhcmQvZ3VhcmQnO1xuXG5leHBvcnQgY29uc3QgaXNOdW1iZXIgPSBlbnN1cmUoKHZhbHVlOiBhbnksIGtleTogc3RyaW5nKTogbnVtYmVyID0+IHtcbiAgICB2YWx1ZSA9ICtwYXJzZUZsb2F0KHZhbHVlKTtcbiAgICBpZiAoaXNOYU4odmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFbnN1cmVFcnJvcihgXG4gICAgICAgICAgICAnJHtrZXl9JyBtdXN0IGJlIGEgbnVtYmVyLlxuICAgICAgICBgKTtcbiAgICB9XG4gICAg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