@trademe/ensure
Version:
198 lines (186 loc) • 17.9 kB
JavaScript
import { __extends, __read } from 'tslib';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var EnsureError = /** @class */ (function (_super) {
__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 = (/** @type {?} */ (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);
});
}
(/** @type {?} */ (Reflect)).defineMetadata("" + VALUE_KEY + propertyKey, castValue, this);
}
});
};
}
/**
* @param {?} guards
* @return {?}
*/
function getGuardsArray(guards) {
// Handle old @Value([guardOne, guardTwo]) syntax:
var _a = __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
*/
export { EnsureError, dedent, Value, ensure, isBool, isEnum, isNotNull, isNumber };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhZGVtZS1lbnN1cmUuanMubWFwIiwic291cmNlcyI6WyJuZzovL0B0cmFkZW1lL2Vuc3VyZS9lbnN1cmUtZXJyb3IudHMiLCJuZzovL0B0cmFkZW1lL2Vuc3VyZS92YWx1ZS92YWx1ZS50cyIsIm5nOi8vQHRyYWRlbWUvZW5zdXJlL2d1YXJkL2d1YXJkLnRzIiwibmc6Ly9AdHJhZGVtZS9lbnN1cmUvZ3VhcmRzL2Jvb2wudHMiLCJuZzovL0B0cmFkZW1lL2Vuc3VyZS9ndWFyZHMvZW51bS50cyIsIm5nOi8vQHRyYWRlbWUvZW5zdXJlL2d1YXJkcy9ub3QtbnVsbC50cyIsIm5nOi8vQHRyYWRlbWUvZW5zdXJlL2d1YXJkcy9udW1iZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIEVuc3VyZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBtZXNzYWdlPzogc3RyaW5nXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGRlZGVudChtZXNzYWdlKSk7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBuZXcudGFyZ2V0LnByb3RvdHlwZSk7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVkZW50IChzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbGluZXMgPSBzdHIuc3BsaXQoL1xcbi8pO1xuICAgIGNvbnN0IG1pbldoaXBlU3BhY2UgPSBsaW5lcy5yZWR1Y2UoKHAsIG4pID0+IHtcbiAgICAgICAgY29uc3Qgd2hpdGVzcGFjZUNvdW50ID0gbi5zZWFyY2goL1xcUy8pO1xuICAgICAgICBpZiAod2hpdGVzcGFjZUNvdW50IDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybiBwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3aGl0ZXNwYWNlQ291bnQgPCBwID8gd2hpdGVzcGFjZUNvdW50IDogcDtcbiAgICB9LCBJbmZpbml0eSk7XG5cbiAgICBjb25zdCBuZXdMaW5lcyA9IGxpbmVzLm1hcChsID0+IGwuc3Vic3RyKG1pbldoaXBlU3BhY2UpKTtcbiAgICByZXR1cm4gbmV3TGluZXMuam9pbignXFxuJyk7XG59XG4iLCIvLyBEZXBlbmRlbmNpZXM6XG5pbXBvcnQgeyBpc05vdE51bGwgfSBmcm9tICcuLi9ndWFyZHMvbm90LW51bGwnO1xuaW1wb3J0IHsgR3VhcmQgfSBmcm9tICcuLi9ndWFyZC9ndWFyZCc7XG5cbi8vIENvbnN0YW50czpcbmNvbnN0IFZBTFVFX0tFWSA9ICdfX3ZhbHVlXyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBWYWx1ZSAoLi4uZ3VhcmRzOiBBcnJheTxHdWFyZDxhbnk+IHwgQXJyYXk8R3VhcmQ8YW55Pj4+KTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICAgIGNvbnN0IGd1YXJkc0FycmF5ID0gZ2V0R3VhcmRzQXJyYXkoZ3VhcmRzKTtcblxuICAgIGNvbnN0IGdldHRlcnMgPSBndWFyZHNBcnJheS5maWx0ZXIoYyA9PiBjLmlzR2V0dGVyKTtcbiAgICBjb25zdCBzZXR0ZXJzID0gZ3VhcmRzQXJyYXkuZmlsdGVyKGMgPT4gIWMuaXNHZXR0ZXIpO1xuXG4gICAgcmV0dXJuICh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IHN0cmluZykgPT4ge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSwge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAoUmVmbGVjdCBhcyBhbnkpLmdldE1ldGFkYXRhKGAke1ZBTFVFX0tFWX0ke3Byb3BlcnR5S2V5fWAsIHRoaXMpO1xuICAgICAgICAgICAgICAgIGdldHRlcnMuZm9yRWFjaChnZXR0ZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBnZXR0ZXIuY2FsbCh0aGlzLCB2YWx1ZSwgcHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGxldCBjYXN0VmFsdWUgPSB2YWx1ZTtcblxuICAgICAgICAgICAgICAgIGlmIChjYXN0VmFsdWUgPT09ICdudWxsJykge1xuICAgICAgICAgICAgICAgICAgICBjYXN0VmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjYXN0VmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBzZXR0ZXJzLmZvckVhY2goc2V0dGVyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc3RWYWx1ZSA9IHNldHRlci5jYWxsKHRoaXMsIGNhc3RWYWx1ZSwgcHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKFJlZmxlY3QgYXMgYW55KS5kZWZpbmVNZXRhZGF0YShgJHtWQUxVRV9LRVl9JHtwcm9wZXJ0eUtleX1gLCBjYXN0VmFsdWUsIHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBnZXRHdWFyZHNBcnJheSAoZ3VhcmRzOiBBcnJheTxHdWFyZDxhbnk+IHwgQXJyYXk8R3VhcmQ8YW55Pj4+KTogQXJyYXk8R3VhcmQ8YW55Pj4ge1xuICAgIC8vIEhhbmRsZSBvbGQgQFZhbHVlKFtndWFyZE9uZSwgZ3VhcmRUd29dKSBzeW50YXg6XG4gICAgY29uc3QgW2ZpcnN0R3VhcmRdID0gZ3VhcmRzO1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGZpcnN0R3VhcmQpID8gZmlyc3RHdWFyZCBhcyBBcnJheTxHdWFyZDxhbnk+PiA6IGd1YXJkcyBhcyBBcnJheTxHdWFyZDxhbnk+Pjtcbn1cbiIsIi8vIERlcGVuZGVuY2llczpcbmltcG9ydCB7IEd1YXJkQ29uZmlnIH0gZnJvbSAnLi9ndWFyZC1jb25maWcnO1xuXG5leHBvcnQgdHlwZSBHdWFyZEZ1bmN0aW9uPFQgPSBhbnk+ID0gKHZhbHVlOiBhbnksIGtleTogc3RyaW5nKSA9PiBUO1xuZXhwb3J0IHR5cGUgR3VhcmQ8VCA9IGFueT4gPSB7IGlzR2V0dGVyOiBib29sZWFuIH0gJiBHdWFyZEZ1bmN0aW9uPFQ+O1xuXG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlIDxUPiAoZ3VhcmQ6IEd1YXJkRnVuY3Rpb24sIGNvbmZpZz86IEd1YXJkQ29uZmlnKTogR3VhcmQ8VD4ge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShndWFyZCwgJ2lzR2V0dGVyJywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiAhIWNvbmZpZyAmJiBjb25maWcuZ2V0dGVyO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGd1YXJkIGFzIEd1YXJkO1xufVxuIiwiLy8gRGVwZW5kZW5jaWVzOlxuaW1wb3J0IHsgRW5zdXJlRXJyb3IgfSBmcm9tICcuLi9lbnN1cmUtZXJyb3InO1xuaW1wb3J0IHsgZW5zdXJlIH0gZnJvbSAnLi4vZ3VhcmQvZ3VhcmQnO1xuXG5leHBvcnQgY29uc3QgaXNCb29sID0gZW5zdXJlKCh2YWx1ZTogYW55LCBrZXk6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09ICd0cnVlJyB8fCB2YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gJ2ZhbHNlJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVuc3VyZUVycm9yKGBcbiAgICAgICAgXCIke3ZhbHVlfVwiIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciAnJHtrZXl9Jy5cbiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgdmFsdWVzIHdpbGwgZXZhbHVhdGUgdG8gdHJ1ZTogdHJ1ZSwgXCJ0cnVlXCIsIFwiXCIuXG4gICAgICAgICAgICBUaGUgZm9sbG93aW5nIHZhbHVlcyB3aWxsIGV2YWx1YXRlIHRvIGZhbHNlOiBmYWxzZSwgXCJmYWxzZVwiLlxuICAgIGApO1xufSk7XG4iLCIvLyBEZXBlbmRlbmNpZXM6XG5pbXBvcnQgeyBFbnN1cmVFcnJvciB9IGZyb20gJy4uL2Vuc3VyZS1lcnJvcic7XG5pbXBvcnQgeyBlbnN1cmUgfSBmcm9tICcuLi9ndWFyZC9ndWFyZCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0VudW0gPFQ+IChlbnVtVmFsdWVzOiBUKTogRnVuY3Rpb24ge1xuICAgIC8vIFRoaXMgZnVuY3Rpb25zIGlzIGV4cGxpY2l0bHkgKm5vdCogdXNpbmcgdGhlIGA9PmAgc3ludGF4IHNvIHRoYXRcbiAgICAvLyB0aGUgYHRoaXNgIHZhbHVlcyBpcyBib3VuZCB0byB0aGUgaW5zdGFuY2UgYmVpbmcgY2hlY2tlZC5cbiAgICByZXR1cm4gZW5zdXJlPFQ+KCh2YWx1ZTogYW55LCBrZXk6IHN0cmluZyk6IFQgPT4ge1xuICAgICAgICBjb25zdCBlbnVtVmFsdWUgPSBlbnVtVmFsdWVzW3ZhbHVlXTtcbiAgICAgICAgaWYgKGVudW1WYWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRW5zdXJlRXJyb3IoYFxuICAgICAgICAgICAgICAgIFwiJHt2YWx1ZX1cIiBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IgJyR7a2V5fScuIFlvdSBjYW4gdXNlIG9uZSBvZiB0aGUgZm9sbG93aW5nOlxuICAgICAgICAgICAgICAgICAgICAke2dldFZhbHVlczxUPihlbnVtVmFsdWVzKX1cbiAgICAgICAgICAgIGApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0eXBlb2YgZW51bVZhbHVlID09PSAnbnVtYmVyJyA/IGVudW1WYWx1ZSA6IHZhbHVlO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRWYWx1ZXM8VD4gKGVudW1UOiBUKTogc3RyaW5nIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoZW51bVQpXG4gICAgLmZpbHRlcihrZXkgPT4gaXNOYU4oK2tleSkpXG4gICAgLm1hcChrZXkgPT4gYFwiJHtrZXl9XCJgKVxuICAgIC5qb2luKCcsXFxuICAgICAgICAgICAgICAgICAgICAnKTtcbn1cbiIsIi8vIERlcGVuZGVuY2llczpcbmltcG9ydCB7IEVuc3VyZUVycm9yIH0gZnJvbSAnLi4vZW5zdXJlLWVycm9yJztcbmltcG9ydCB7IGVuc3VyZSB9IGZyb20gJy4uL2d1YXJkL2d1YXJkJztcblxuZXhwb3J0IGNvbnN0IGlzTm90TnVsbCA9IGVuc3VyZSgodmFsdWU6IGFueSwga2V5OiBhbnkpOiBhbnkgPT4ge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFbnN1cmVFcnJvcihgXG4gICAgICAgICAgICAnJHtrZXl9JyBtdXN0IG5vdCBiZSBcIm51bGxcIiBvciBcInVuZGVmaW5lZFwiLlxuICAgICAgICBgKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufSwge1xuICAgIGdldHRlcjogdHJ1ZVxufSk7XG4iLCIvLyBEZXBlbmRlbmNpZXM6XG5pbXBvcnQgeyBFbnN1cmVFcnJvciB9IGZyb20gJy4uL2Vuc3VyZS1lcnJvcic7XG5pbXBvcnQgeyBlbnN1cmUgfSBmcm9tICcuLi9ndWFyZC9ndWFyZCc7XG5cbmV4cG9ydCBjb25zdCBpc051bWJlciA9IGVuc3VyZSgodmFsdWU6IGFueSwga2V5OiBzdHJpbmcpOiBudW1iZXIgPT4ge1xuICAgIHZhbHVlID0gK3BhcnNlRmxvYXQodmFsdWUpO1xuICAgIGlmIChpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVuc3VyZUVycm9yKGBcbiAgICAgICAgICAgICcke2tleX0nIG11c3QgYmUgYSBudW1iZXIuXG4gICAgICAgIGApO1xuICAgIH1cbiAgICByZXR1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