UNPKG

@trademe/ensure

Version:

67 lines (66 loc) 5.83 kB
/** * @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