UNPKG

@trademe/ensure

Version:

198 lines (186 loc) 17.9 kB
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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