packages/@fbcmobile-ui/Utils/StringUtils.js (47 lines of code) (raw):
/**
 * Copyright (c) Facebook, Inc. and its affiliates.
 * All rights reserved.
 *
 * This source code is licensed under the BSD-style license found in the
 * LICENSE file in the root directory of this source tree.
 *
 * @flow strict-local
 * @format
 */
'use strict';
import 'moment/min/locales';
/**
 * Returns true only for strings composed by digits and
 * strings starting with `-` and followed by digits.
 *
 * Does not allow `.` or `,`.
 *
 * Note: Does not handle overflow/BigInt numbers.
 *
 * e.g.
 * 23,123 will return false
 * 234.00 will return false
 * +324   will return false
 *
 * -324  will return true
 * 34215 will return true
 */
export function isStrictNumber(text: string): boolean {
  const isDigit = (char: string): boolean => {
    return char >= '0' && char <= '9';
  };
  const isInteger = (str: string): boolean => {
    if (str == null || str.length == 0) {
      return false;
    }
    let index = 0;
    if (str[index] === '-') {
      // accept `-` only as the first character
      index = 1;
    }
    for (; index < str.length; index++) {
      if (!isDigit(str[index])) {
        return false;
      }
    }
    return true;
  };
  return isInteger(text);
}
/**
 * Same as `isStrictNumber` but does not allow negative numbers
 */
export function isStrictPositiveNumber(text: string): boolean {
  if (text == null || text.length == 0) {
    return false;
  }
  return text[0] !== '-' && isStrictNumber(text);
}
/**
 * Returns true if the string matches an IPv4 address
 *
 * Taken from:
 * https://www.w3resource.com/javascript/form/ip-address-validation.php
 */
export function isValidIPAddress(ipAddress: string): boolean {
  /* eslint-disable max-len */
  const ipRegex = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
  if (ipRegex.test(ipAddress)) {
    return true;
  }
  return false;
}
/**
 * Returns true if the string matches an IPv6 address
 *
 * Taken from:
 * https://www.regexpal.com/?fam=104037
 */
export function isValidIPv6Address(ipAddress: string): boolean {
  /* eslint-disable max-len */
  const ipV6Regex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/;
  if (ipV6Regex.test(ipAddress)) {
    return true;
  }
  return false;
}
export const MAX_PORT_NUMBER = 65535;
export function isValidPortNumber(text: string) {
  return isStrictPositiveNumber(text) && parseInt(text) <= MAX_PORT_NUMBER;
}