SourceMapCorrector.ts 2.4 KB

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