SourceMapCorrector.ts 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import { inject, injectable } from 'inversify';
  2. import { ServiceIdentifiers } from '../container/ServiceIdentifiers';
  3. import { TObfuscationResultFactory } from '../types/container/TObfuscationResultFactory';
  4. import { ICryptUtils } from '../interfaces/utils/ICryptUtils';
  5. import { IObfuscationResult } from '../interfaces/IObfuscationResult';
  6. import { IOptions } from '../interfaces/options/IOptions';
  7. import { ISourceMapCorrector } from '../interfaces/source-map/ISourceMapCorrector';
  8. import { SourceMapMode } from '../enums/source-map/SourceMapMode';
  9. @injectable()
  10. export class SourceMapCorrector implements ISourceMapCorrector {
  11. /**
  12. * @type {ICryptUtils}
  13. */
  14. private readonly cryptUtils: ICryptUtils;
  15. /**
  16. * @type {TObfuscationResultFactory}
  17. */
  18. private readonly obfuscationResultFactory: TObfuscationResultFactory;
  19. /**
  20. * @type {IOptions}
  21. */
  22. private readonly options: IOptions;
  23. /**
  24. * @param {TObfuscationResultFactory} obfuscationResultFactory
  25. * @param {ICryptUtils} cryptUtils
  26. * @param {IOptions} options
  27. */
  28. constructor (
  29. @inject(ServiceIdentifiers.Factory__IObfuscationResult) obfuscationResultFactory: TObfuscationResultFactory,
  30. @inject(ServiceIdentifiers.ICryptUtils) cryptUtils: ICryptUtils,
  31. @inject(ServiceIdentifiers.IOptions) options: IOptions
  32. ) {
  33. this.obfuscationResultFactory = obfuscationResultFactory;
  34. this.cryptUtils = cryptUtils;
  35. this.options = options;
  36. }
  37. /**
  38. * @param {string} obfuscatedCode
  39. * @param {string} sourceMap
  40. * @returns {IObfuscationResult}
  41. */
  42. public correct (obfuscatedCode: string, sourceMap: string): IObfuscationResult {
  43. return this.obfuscationResultFactory(
  44. this.correctObfuscatedCode(obfuscatedCode, sourceMap),
  45. sourceMap
  46. );
  47. }
  48. /**
  49. * @param {string} obfuscatedCode
  50. * @param {string} sourceMap
  51. * @returns {string}
  52. */
  53. private correctObfuscatedCode (obfuscatedCode: string, sourceMap: string): string {
  54. if (!sourceMap) {
  55. return obfuscatedCode;
  56. }
  57. const sourceMapUrl: string = this.options.sourceMapBaseUrl + this.options.sourceMapFileName;
  58. let sourceMappingUrl: string = '//# sourceMappingURL=';
  59. switch (this.options.sourceMapMode) {
  60. case SourceMapMode.Inline:
  61. sourceMappingUrl += `data:application/json;base64,${this.cryptUtils.btoa(sourceMap)}`;
  62. break;
  63. case SourceMapMode.Separate:
  64. default:
  65. if (!sourceMapUrl) {
  66. return obfuscatedCode;
  67. }
  68. sourceMappingUrl += sourceMapUrl;
  69. }
  70. return `${obfuscatedCode}\n${sourceMappingUrl}`;
  71. }
  72. }