Utils.ts 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. import { JSFuck } from '../enums/JSFuck';
  2. import { RandomGeneratorUtils } from './RandomGeneratorUtils';
  3. export class Utils {
  4. /**
  5. * @type {string}
  6. */
  7. public static readonly hexadecimalPrefix: string = '0x';
  8. /**
  9. * @type {Map<string, string>}
  10. */
  11. private static readonly stringToUnicodeEscapeSequenceCache: Map <string, string> = new Map();
  12. /**
  13. * @param array
  14. * @param times
  15. * @returns {T[]}
  16. */
  17. public static arrayRotate <T> (array: T[], times: number): T[] {
  18. if (!array.length) {
  19. throw new ReferenceError(`Cannot rotate empty array.`);
  20. }
  21. if (times <= 0) {
  22. return array;
  23. }
  24. const newArray: T[] = array;
  25. let temp: T | undefined;
  26. while (times--) {
  27. temp = newArray.pop()!;
  28. newArray.unshift(temp);
  29. }
  30. return newArray;
  31. }
  32. /**
  33. * @param array
  34. * @return {T[]}
  35. */
  36. public static arrayShuffle <T> (array: T[]): T[] {
  37. const shuffledArray: T[] = [...array];
  38. for (let i: number = shuffledArray.length; i; i--) {
  39. const j: number = Math.floor(RandomGeneratorUtils.getRandomFloat(0, 1) * i);
  40. [shuffledArray[i - 1], shuffledArray[j]] = [shuffledArray[j], shuffledArray[i - 1]];
  41. }
  42. return shuffledArray;
  43. }
  44. /**
  45. * @param dec
  46. * @returns {string}
  47. */
  48. public static decToHex (dec: number): string {
  49. const radix: number = 16;
  50. return Number(dec).toString(radix);
  51. }
  52. /**
  53. * @param url
  54. * @returns {string}
  55. */
  56. public static extractDomainFromUrl (url: string): string {
  57. let domain: string;
  58. if (url.indexOf('://') > -1 || url.indexOf('//') === 0) {
  59. domain = url.split('/')[2];
  60. } else {
  61. domain = url.split('/')[0];
  62. }
  63. domain = domain.split(':')[0];
  64. return domain;
  65. }
  66. /**
  67. * @param number
  68. * @returns {boolean}
  69. */
  70. public static isCeilNumber (number: number): boolean {
  71. return number % 1 === 0;
  72. }
  73. /**
  74. * @param obj
  75. * @returns {T}
  76. */
  77. public static strEnumify <T extends {[prop: string]: ''|string}> (obj: T): T {
  78. return obj;
  79. }
  80. /**
  81. * @param string
  82. * @param times
  83. * @returns {string}
  84. */
  85. public static stringRotate (string: string, times: number): string {
  86. if (!string) {
  87. throw new ReferenceError(`Cannot rotate empty string.`);
  88. }
  89. for (let i: number = 0; i < times; i++) {
  90. string = string[string.length - 1] + string.substring(0, string.length - 1);
  91. }
  92. return string;
  93. }
  94. /**
  95. * @param string
  96. * @returns {string}
  97. */
  98. public static stringToJSFuck (string: string): string {
  99. return Array
  100. .from(string)
  101. .map((character: string): string => {
  102. return JSFuck[character] || character;
  103. })
  104. .join(' + ');
  105. }
  106. /**
  107. * @param string
  108. * @param nonLatinAndNonDigitsOnly
  109. * @returns {string}
  110. */
  111. public static stringToUnicodeEscapeSequence (string: string, nonLatinAndNonDigitsOnly: boolean = false): string {
  112. const cacheKey: string = `${string}-${String(nonLatinAndNonDigitsOnly)}`;
  113. if (Utils.stringToUnicodeEscapeSequenceCache.has(cacheKey)) {
  114. return <string>Utils.stringToUnicodeEscapeSequenceCache.get(cacheKey);
  115. }
  116. const radix: number = 16;
  117. const replaceRegExp: RegExp = new RegExp('[\\s\\S]', 'g');
  118. const escapeRegExp: RegExp = new RegExp('[^a-zA-Z0-9]');
  119. const regexp: RegExp = new RegExp('[\\x00-\\x7F]');
  120. let prefix: string,
  121. template: string;
  122. const result: string = string.replace(replaceRegExp, (escape: string): string => {
  123. if (nonLatinAndNonDigitsOnly && !escapeRegExp.test(escape)) {
  124. return escape;
  125. }
  126. if (regexp.test(escape)) {
  127. prefix = '\\x';
  128. template = '0'.repeat(2);
  129. } else {
  130. prefix = '\\u';
  131. template = '0'.repeat(4);
  132. }
  133. return `${prefix}${(template + escape.charCodeAt(0).toString(radix)).slice(-template.length)}`;
  134. });
  135. Utils.stringToUnicodeEscapeSequenceCache.set(cacheKey, result);
  136. return result;
  137. }
  138. }