text: /**
   * @module format
   */
  
  const NUMBER = '0-9\u0660-\u0669';
  const TIME_PART = `[:${NUMBER}]+`;
  const MERIDIAN_PART = `[^: ${NUMBER}]+`;
  const HAS_MERIDIAN = new RegExp(
      `^(${TIME_PART} ?(${MERIDIAN_PART}))|((${MERIDIAN_PART}) ?${TIME_PART})$`
  );
  
  /**
   * Transforms time to a cleaned-up localized time.
   *
   * @param {Date} dt - date object
   * @return {string} cleaned-up localized time
   */
  function _getCleanLocalTime(dt) {
      dt = typeof dt === 'undefined' ? new Date() : dt;
  
      return _cleanSpecialChars(dt.toLocaleTimeString(format.locale));
  }
  
  /**
   * Remove unneeded and problematic special characters in (date)time string.
   *
   * @param {string} timeStr - (date)time string to clean up
   * @return {string} transformed (date)time string with removed unneeded special characters that cause issues
   */
  function _cleanSpecialChars(timeStr) {
      return timeStr.replace(/[\u200E\u200F]/g, '');
  }
  
  /**
   * @namespace time
   */
  const time = {
      // For now we just look at a subset of numbers in Arabic and Latin. There are actually over 20 number scripts and :digit: doesn't work in browsers
      /**
       * @type {string}
       */
      get hour12() {
          return this.hasMeridian(_getCleanLocalTime());
      },
      /**
       * @type {string}
       */
      get pmNotation() {
          return this.meridianNotation(new Date(2000, 1, 1, 23, 0, 0));
      },
      /**
       * @type {string}
       */
      get amNotation() {
          return this.meridianNotation(new Date(2000, 1, 1, 1, 0, 0));
      },
      /**
       * @type {Function}
       * @param {Date} dt - datetime string
       */
      meridianNotation(dt) {
          let matches = _getCleanLocalTime(dt).match(HAS_MERIDIAN);
          if (matches && matches.length) {
              matches = matches.filter((item) => !!item);
  
              return matches[matches.length - 1].trim();
          }
  
          return null;
      },
      /**
       * Whether time string has meridian parts
       *
       * @type {Function}
       * @param {string} time - Time string
       */
      hasMeridian(time) {
          return HAS_MERIDIAN.test(_cleanSpecialChars(time));
      },
  };
  
  /**
   * @namespace format
   */
  const format = {
      locale: navigator.language,
  };
  
  export { format, time };
  