@trademe/ensure
Version:
67 lines (66 loc) • 5.83 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { EnsureError } from '../ensure-error';
import { ensure } from '../guard/guard';
/**
* @template T
* @param {?} enumValues
* @return {?}
*/
export function isEnum(enumValues) {
// Prepare the enum values so lookups work in both directions,
// with both number and string enums:
const /** @type {?} */ flipped = flipEnum(enumValues);
const /** @type {?} */ stripped = stripEnum(enumValues);
return ensure((value, key) => {
const /** @type {?} */ enumValue = stripped[value] != null ? stripped[value] : stripped[flipped[value]];
if (enumValue == null) {
throw new EnsureError(`
"${value}" is not a valid value for '${key}'. You can use one of the following:
${getValues(enumValues)}
`);
}
return enumValue;
});
}
/**
* @template T
* @param {?} enumT
* @return {?}
*/
function flipEnum(enumT) {
const /** @type {?} */ flipped = {};
Object.keys(enumT).forEach(key => {
flipped[key] = enumT[key];
flipped[enumT[key]] = key;
});
return flipped;
}
/**
* @template T
* @param {?} enumT
* @return {?}
*/
function stripEnum(enumT) {
const /** @type {?} */ stripped = {};
Object.keys(enumT).forEach(key => {
if (isNaN(parseInt(key, 10))) {
stripped[key] = enumT[key];
}
});
return stripped;
}
/**
* @template T
* @param {?} enumT
* @return {?}
*/
function getValues(enumT) {
return Object.keys(enumT)
.filter(key => isNaN(+key))
.map(key => `"${key}"`)
.join(',\n ');
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW51bS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B0cmFkZW1lL2Vuc3VyZS8iLCJzb3VyY2VzIjpbImd1YXJkcy9lbnVtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFDQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUMsT0FBTyxFQUFFLE1BQU0sRUFBUyxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7QUFFL0MsTUFBTSxpQkFBc0IsVUFBYTs7O0lBR3JDLHVCQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDckMsdUJBQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUV2QyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBVSxFQUFFLEdBQVcsRUFBZ0IsRUFBRTtRQUNwRCx1QkFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDdkYsRUFBRSxDQUFDLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDcEIsTUFBTSxJQUFJLFdBQVcsQ0FBQzttQkFDZixLQUFLLCtCQUErQixHQUFHO3NCQUNwQyxTQUFTLENBQUksVUFBVSxDQUFDO2FBQ2pDLENBQUMsQ0FBQztTQUNOO1FBQ0QsTUFBTSxDQUFDLFNBQVMsQ0FBQztLQUNwQixDQUFDLENBQUM7Q0FDTjs7Ozs7O0FBRUQsa0JBQXVCLEtBQVE7SUFDM0IsdUJBQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQztJQUNuQixNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUM3QixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFCLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7S0FDN0IsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxDQUFDLE9BQU8sQ0FBQztDQUNsQjs7Ozs7O0FBRUQsbUJBQXdCLEtBQVE7SUFDNUIsdUJBQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUNwQixNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUM3QixFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQixRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzlCO0tBQ0osQ0FBQyxDQUFDO0lBQ0gsTUFBTSxDQUFDLFFBQVEsQ0FBQztDQUNuQjs7Ozs7O0FBRUQsbUJBQXVCLEtBQVE7SUFDM0IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1NBQ3hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzFCLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7U0FDdEIsSUFBSSxDQUFDLHlCQUF5QixDQUFDLENBQUM7Q0FDcEMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBEZXBlbmRlbmNpZXM6XG5pbXBvcnQgeyBFbnN1cmVFcnJvciB9IGZyb20gJy4uL2Vuc3VyZS1lcnJvcic7XG5pbXBvcnQgeyBlbnN1cmUsIEd1YXJkIH0gZnJvbSAnLi4vZ3VhcmQvZ3VhcmQnO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNFbnVtIDxUPiAoZW51bVZhbHVlczogVCk6IEd1YXJkPFQ+IHtcbiAgICAvLyBQcmVwYXJlIHRoZSBlbnVtIHZhbHVlcyBzbyBsb29rdXBzIHdvcmsgaW4gYm90aCBkaXJlY3Rpb25zLFxuICAgIC8vIHdpdGggYm90aCBudW1iZXIgYW5kIHN0cmluZyBlbnVtczpcbiAgICBjb25zdCBmbGlwcGVkID0gZmxpcEVudW0oZW51bVZhbHVlcyk7XG4gICAgY29uc3Qgc3RyaXBwZWQgPSBzdHJpcEVudW0oZW51bVZhbHVlcyk7XG5cbiAgICByZXR1cm4gZW5zdXJlKCh2YWx1ZTogYW55LCBrZXk6IHN0cmluZyk6IG51bWJlciB8IGFueSA9PiB7XG4gICAgICAgIGNvbnN0IGVudW1WYWx1ZSA9IHN0cmlwcGVkW3ZhbHVlXSAhPSBudWxsID8gc3RyaXBwZWRbdmFsdWVdIDogc3RyaXBwZWRbZmxpcHBlZFt2YWx1ZV1dO1xuICAgICAgICBpZiAoZW51bVZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFbnN1cmVFcnJvcihgXG4gICAgICAgICAgICAgICAgXCIke3ZhbHVlfVwiIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciAnJHtrZXl9Jy4gWW91IGNhbiB1c2Ugb25lIG9mIHRoZSBmb2xsb3dpbmc6XG4gICAgICAgICAgICAgICAgICAgICR7Z2V0VmFsdWVzPFQ+KGVudW1WYWx1ZXMpfVxuICAgICAgICAgICAgYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudW1WYWx1ZTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gZmxpcEVudW0gPFQ+IChlbnVtVDogVCk6IHsgW2tleTogc3RyaW5nXTogYW55IH0ge1xuICAgIGNvbnN0IGZsaXBwZWQgPSB7fTtcbiAgICBPYmplY3Qua2V5cyhlbnVtVCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBmbGlwcGVkW2tleV0gPSBlbnVtVFtrZXldO1xuICAgICAgICBmbGlwcGVkW2VudW1UW2tleV1dID0ga2V5O1xuICAgIH0pO1xuICAgIHJldHVybiBmbGlwcGVkO1xufVxuXG5mdW5jdGlvbiBzdHJpcEVudW0gPFQ+IChlbnVtVDogVCk6IHsgW2tleTogc3RyaW5nXTogYW55IH0ge1xuICAgIGNvbnN0IHN0cmlwcGVkID0ge307XG4gICAgT2JqZWN0LmtleXMoZW51bVQpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgaWYgKGlzTmFOKHBhcnNlSW50KGtleSwgMTApKSkge1xuICAgICAgICAgICAgc3RyaXBwZWRba2V5XSA9IGVudW1UW2tleV07XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gc3RyaXBwZWQ7XG59XG5cbmZ1bmN0aW9uIGdldFZhbHVlczxUPiAoZW51bVQ6IFQpOiBzdHJpbmcge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhlbnVtVClcbiAgICAuZmlsdGVyKGtleSA9PiBpc05hTigra2V5KSlcbiAgICAubWFwKGtleSA9PiBgXCIke2tleX1cImApXG4gICAgLmpvaW4oJyxcXG4gICAgICAgICAgICAgICAgICAgICcpO1xufVxuIl19