const digits = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']; export default class Key { public readonly key: string; public readonly shift: boolean; public readonly ctrl: boolean; public readonly alt: boolean; public readonly meta: boolean; constructor({ key, shift = false, ctrl = false, alt = false, meta = false, }: { key: string; shift?: boolean; ctrl?: boolean; alt?: boolean; meta?: boolean; }) { this.key = key; this.shift = shift; this.ctrl = ctrl; this.alt = alt; this.meta = meta; } static fromMapKey(str: string): Key { if (str.startsWith('<') && str.endsWith('>')) { const inner = str.slice(1, -1); const shift = inner.includes('S-'); let base = inner.slice(inner.lastIndexOf('-') + 1); if (shift && base.length === 1) { base = base.toUpperCase(); } else if (!shift && base.length === 1) { base = base.toLowerCase(); } return new Key({ key: base, shift: shift, ctrl: inner.includes('C-'), alt: inner.includes('A-'), meta: inner.includes('M-'), }); } return new Key({ key: str, shift: str.toLowerCase() !== str, ctrl: false, alt: false, meta: false, }); } isDigit(): boolean { return digits.includes(this.key) && !this.ctrl && !this.alt && !this.meta; } equals(key: Key) { return this.key === key.key && this.ctrl === key.ctrl && this.meta === key.meta && this.alt === key.alt && this.shift === key.shift; } }