OptionsNormalizer.ts 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. import { IInputOptions } from '../interfaces/options/IInputOptions';
  2. import { IOptions } from '../interfaces/options/IOptions';
  3. import { TOptionsNormalizerRule } from '../types/options/TOptionsNormalizerRule';
  4. import { Utils } from '../Utils';
  5. export class OptionsNormalizer {
  6. /**
  7. * @type {IInputOptions}
  8. */
  9. private static readonly DISABLED_UNICODE_ARRAY_OPTIONS: IInputOptions = {
  10. rotateStringArray: false,
  11. stringArray: false,
  12. stringArrayEncoding: false,
  13. stringArrayThreshold: 0
  14. };
  15. /**
  16. * @type {IInputOptions}
  17. */
  18. private static readonly SELF_DEFENDING_OPTIONS: IInputOptions = {
  19. compact: true,
  20. selfDefending: true
  21. };
  22. /**
  23. * @type {IInputOptions}
  24. */
  25. private static readonly UNICODE_ARRAY_ENCODING_OPTIONS: IInputOptions = {
  26. stringArrayEncoding: 'base64'
  27. };
  28. /**
  29. * @type {TOptionsNormalizerRule[]}
  30. */
  31. private static readonly normalizerRules: TOptionsNormalizerRule[] = [
  32. OptionsNormalizer.domainLockRule,
  33. OptionsNormalizer.selfDefendingRule,
  34. OptionsNormalizer.sourceMapBaseUrlRule,
  35. OptionsNormalizer.sourceMapFileNameRule,
  36. OptionsNormalizer.stringArrayRule,
  37. OptionsNormalizer.stringArrayEncodingRule,
  38. OptionsNormalizer.stringArrayThresholdRule,
  39. ];
  40. /**
  41. * @param options
  42. * @returns {IOptions}
  43. */
  44. public static normalizeOptions (options: IOptions): IOptions {
  45. let normalizedOptions: IOptions = Object.assign({}, options);
  46. for (const normalizerRule of OptionsNormalizer.normalizerRules) {
  47. normalizedOptions = normalizerRule(normalizedOptions);
  48. }
  49. return normalizedOptions;
  50. }
  51. /**
  52. * @param options
  53. * @returns {IOptions}
  54. */
  55. private static domainLockRule (options: IOptions): IOptions {
  56. if (options.domainLock.length) {
  57. const normalizedDomains: string[] = [];
  58. for (const domain of options.domainLock) {
  59. normalizedDomains.push(Utils.extractDomainFromUrl(domain));
  60. }
  61. Object.assign(options, {
  62. domainLock: normalizedDomains
  63. });
  64. }
  65. return options;
  66. }
  67. /**
  68. * @param options
  69. * @returns {IOptions}
  70. */
  71. private static selfDefendingRule (options: IOptions): IOptions {
  72. if (options.selfDefending) {
  73. Object.assign(options, OptionsNormalizer.SELF_DEFENDING_OPTIONS);
  74. }
  75. return options;
  76. }
  77. /**
  78. * @param options
  79. * @returns {IOptions}
  80. */
  81. private static sourceMapBaseUrlRule (options: IOptions): IOptions {
  82. const sourceMapBaseUrl: string = options.sourceMapBaseUrl;
  83. if (!options.sourceMapFileName) {
  84. Object.assign(options, {
  85. sourceMapBaseUrl: ''
  86. });
  87. return options;
  88. }
  89. if (sourceMapBaseUrl && !sourceMapBaseUrl.endsWith('/')) {
  90. Object.assign(options, {
  91. sourceMapBaseUrl: `${sourceMapBaseUrl}/`
  92. });
  93. }
  94. return options;
  95. }
  96. /**
  97. * @param options
  98. * @returns {IOptions}
  99. */
  100. private static sourceMapFileNameRule (options: IOptions): IOptions {
  101. let sourceMapFileName: string = options.sourceMapFileName;
  102. if (sourceMapFileName) {
  103. sourceMapFileName = sourceMapFileName
  104. .replace(/^\/+/, '')
  105. .split('.')[0];
  106. Object.assign(options, {
  107. sourceMapFileName: `${sourceMapFileName}.js.map`
  108. });
  109. }
  110. return options;
  111. }
  112. /**
  113. * @param options
  114. * @returns {IOptions}
  115. */
  116. private static stringArrayRule (options: IOptions): IOptions {
  117. if (!options.stringArray) {
  118. Object.assign(options, OptionsNormalizer.DISABLED_UNICODE_ARRAY_OPTIONS);
  119. }
  120. return options;
  121. }
  122. /**
  123. * @param options
  124. * @returns {IOptions}
  125. */
  126. private static stringArrayEncodingRule (options: IOptions): IOptions {
  127. if (options.stringArrayEncoding === true) {
  128. Object.assign(options, OptionsNormalizer.UNICODE_ARRAY_ENCODING_OPTIONS);
  129. }
  130. return options;
  131. }
  132. /**
  133. * @param options
  134. * @returns {IOptions}
  135. */
  136. private static stringArrayThresholdRule (options: IOptions): IOptions {
  137. if (options.stringArrayThreshold === 0) {
  138. Object.assign(options, OptionsNormalizer.DISABLED_UNICODE_ARRAY_OPTIONS);
  139. }
  140. return options;
  141. }
  142. }