{"version":3,"file":"index.cjs","sources":["../src/index.ts"],"sourcesContent":["export interface KeyboardEventLike {\n  key: string\n  which: number\n  altKey: boolean\n  ctrlKey: boolean\n  metaKey: boolean\n  shiftKey: boolean\n}\n\nexport interface HotKeyOptions {\n  byKey: boolean\n}\n\nexport interface HotKey {\n  which?: number | undefined\n  key?: string | undefined\n  altKey: boolean\n  ctrlKey: boolean\n  metaKey: boolean\n  shiftKey: boolean\n}\n\n/**\n * Constants.\n */\n\nconst IS_MAC =\n  typeof window != 'undefined' &&\n  /Mac|iPod|iPhone|iPad/.test(window.navigator.platform)\n\nconst MODIFIERS = {\n  alt: 'altKey',\n  control: 'ctrlKey',\n  meta: 'metaKey',\n  shift: 'shiftKey',\n}\n\nconst ALIASES = {\n  add: '+',\n  break: 'pause',\n  cmd: 'meta',\n  command: 'meta',\n  ctl: 'control',\n  ctrl: 'control',\n  del: 'delete',\n  down: 'arrowdown',\n  esc: 'escape',\n  ins: 'insert',\n  left: 'arrowleft',\n  mod: IS_MAC ? 'meta' : 'control',\n  opt: 'alt',\n  option: 'alt',\n  return: 'enter',\n  right: 'arrowright',\n  space: ' ',\n  spacebar: ' ',\n  up: 'arrowup',\n  win: 'meta',\n  windows: 'meta',\n}\n\nconst CODES = {\n  backspace: 8,\n  tab: 9,\n  enter: 13,\n  shift: 16,\n  control: 17,\n  alt: 18,\n  pause: 19,\n  capslock: 20,\n  escape: 27,\n  ' ': 32,\n  pageup: 33,\n  pagedown: 34,\n  end: 35,\n  home: 36,\n  arrowleft: 37,\n  arrowup: 38,\n  arrowright: 39,\n  arrowdown: 40,\n  insert: 45,\n  delete: 46,\n  meta: 91,\n  numlock: 144,\n  scrolllock: 145,\n  ';': 186,\n  '=': 187,\n  ',': 188,\n  '-': 189,\n  '.': 190,\n  '/': 191,\n  '`': 192,\n  '[': 219,\n  '\\\\': 220,\n  ']': 221,\n  \"'\": 222,\n} as const\n\nfor (var f = 1; f < 20; f++) {\n  ;(CODES as any)['f' + f] = 111 + f\n}\n\nexport function isHotkey(\n  hotkey: string | readonly string[],\n  options?: HotKeyOptions\n): (event: KeyboardEventLike) => boolean\nexport function isHotkey(\n  hotkey: string | readonly string[],\n  event: KeyboardEventLike\n): boolean\nexport function isHotkey(\n  hotkey: string | readonly string[],\n  options: HotKeyOptions,\n  event: KeyboardEventLike\n): boolean\nexport function isHotkey(\n  hotkey: string | readonly string[],\n  options?: HotKeyOptions | KeyboardEventLike,\n  event?: KeyboardEventLike\n) {\n  if (options && !('byKey' in options)) {\n    event = options\n    options = null as any\n  }\n\n  if (!Array.isArray(hotkey)) {\n    hotkey = [hotkey as any]\n  }\n\n  const array = hotkey.map((string) => parseHotkey(string, options as any))\n  const check = (e: any) => array.some((object) => compareHotkey(object, e))\n  const ret = event == null ? check : check(event)\n  return ret\n}\n\nexport function isCodeHotkey(\n  hotkey: string | readonly string[]\n): (event: KeyboardEventLike) => boolean\nexport function isCodeHotkey(\n  hotkey: string | readonly string[],\n  event: KeyboardEventLike\n): boolean\nexport function isCodeHotkey(\n  hotkey: string | readonly string[],\n  event?: KeyboardEventLike\n) {\n  // @ts-expect-error - fix later\n  return isHotkey(hotkey, event)\n}\n\nexport function isKeyHotkey(\n  hotkey: string | readonly string[]\n): (event: KeyboardEventLike) => boolean\nexport function isKeyHotkey(\n  hotkey: string | readonly string[],\n  event: KeyboardEventLike\n): boolean\nexport function isKeyHotkey(\n  hotkey: string | readonly string[],\n  event?: KeyboardEventLike\n) {\n  // @ts-expect-error - fix later\n  return isHotkey(hotkey, { byKey: true }, event)\n}\n\n/**\n * Parse.\n */\n\nexport function parseHotkey(hotkey: string, options?: HotKeyOptions): HotKey {\n  const byKey = options && options.byKey\n  const ret = {} as any\n\n  // Special case to handle the `+` key since we use it as a separator.\n  hotkey = hotkey.replace('++', '+add')\n  const values = hotkey.split('+')\n  const { length } = values\n\n  // Ensure that all the modifiers are set to false unless the hotkey has them.\n  for (const k in MODIFIERS) {\n    ;(ret as any)[(MODIFIERS as any)[k]] = false\n  }\n\n  for (let value of values) {\n    const optional = value.endsWith('?') && value.length > 1\n\n    if (optional) {\n      value = value.slice(0, -1)\n    }\n\n    const name = toKeyName(value)\n    const modifier = (MODIFIERS as any)[name]\n\n    if (\n      value.length > 1 &&\n      !modifier &&\n      !(ALIASES as any)[value] &&\n      !(CODES as any)[name]\n    ) {\n      throw new TypeError(`Unknown modifier: \"${value}\"`)\n    }\n\n    if (length === 1 || !modifier) {\n      if (byKey) {\n        ret.key = name\n      } else {\n        ret.which = toKeyCode(value)\n      }\n    }\n\n    if (modifier) {\n      ret[modifier] = optional ? null : true\n    }\n  }\n\n  return ret\n}\n\n/**\n * Compare.\n */\n\nexport function compareHotkey(\n  object: HotKey,\n  event: KeyboardEventLike\n): boolean {\n  for (const key in object) {\n    const expected = (object as any)[key]\n    let actual\n\n    if (expected == null) {\n      continue\n    }\n\n    if (key === 'key' && event.key != null) {\n      actual = event.key.toLowerCase()\n    } else if (key === 'which') {\n      actual = expected === 91 && event.which === 93 ? 91 : event.which\n    } else {\n      actual = (event as any)[key]\n    }\n\n    if (actual == null && expected === false) {\n      continue\n    }\n\n    if (actual !== expected) {\n      return false\n    }\n  }\n\n  return true\n}\n\n/**\n * Utils.\n */\n\nexport function toKeyCode(name: string): number {\n  name = toKeyName(name)\n  const code = (CODES as any)[name] || name.toUpperCase().charCodeAt(0)\n  return code\n}\n\nexport function toKeyName(name: string): string {\n  name = name.toLowerCase()\n  name = (ALIASES as any)[name] || name\n  return name\n}\n"],"names":[],"mappings":"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"}