exadel-inc/esl

View on GitHub
src/polyfills/list/dom.event.keyboard.ts

Summary

Maintainability
A
2 hrs
Test Coverage
/**
 * Group: DOM API shims
 * Target Browsers: `IE11`, `Edge < 18`
 * KeyboardEvent polyfill: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/KeyboardEvent
 */
try {
  new window.KeyboardEvent('event', {bubbles: true, cancelable: true});
} catch (error) {
  const KeyboardEventOriginal = window.KeyboardEvent || window.Event;
  // eslint-disable-next-line sonarjs/cognitive-complexity
  const KeyboardEvent = function (eventName: string, params: KeyboardEventInit): KeyboardEvent {
    params = params || {};
    const event: any = document.createEvent('KeyboardEvent');

    // https://msdn.microsoft.com/en-us/library/ff975297(v=vs.85).aspx
    event.initKeyboardEvent(
      eventName,
      (params.bubbles === void 0) ? false : params.bubbles,
      (params.cancelable === void 0) ? false : params.cancelable,
      (params.view === void 0) ? window : params.view,
      (params.key === void 0) ? '' : params.key,
      (params.location === void 0) ? 0 : params.location,
      params.ctrlKey === true,
      params.altKey === true,
      params.shiftKey === true,
      params.metaKey === true
    );

    event.keyCode   = (params.keyCode === void 0) ? 0 : params.keyCode;
    event.code      = (params.code === void 0) ? '' : params.code;
    event.charCode  = (params.charCode === void 0) ? 0 : params.charCode;
    event.char      = (params.charCode === void 0) ? '' : params.charCode;
    event.which     = (params.which === void 0) ? 0 : params.which;

    return event;
  };
  KeyboardEvent.prototype = KeyboardEventOriginal.prototype;
  Object.defineProperty(window, 'KeyboardEvent', {
    value: KeyboardEvent,
    writable: true,
    configurable: true
  });
}