javascript-obfuscator
Version:
JavaScript obfuscator
73 lines (61 loc) • 2.27 kB
text/typescript
import { inject, injectable, } from 'inversify';
import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
import { IOptions } from '../../interfaces/options/IOptions';
import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator';
import { CodeTransformationStage } from '../../enums/code-transformers/CodeTransformationStage';
import { AbstractCodeTransformer } from '../AbstractCodeTransformer';
()
export class HashbangOperatorTransformer extends AbstractCodeTransformer {
/**
* @type {string | null}
*/
private hashbangOperatorLine: string | null = null;
/**
* @param {IRandomGenerator} randomGenerator
* @param {IOptions} options
*/
public constructor (
(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator,
(ServiceIdentifiers.IOptions) options: IOptions
) {
super(randomGenerator, options);
}
/**
* Removes hashbang operator before AST transformation and appends it back after
*
* @param {string} code
* @param {CodeTransformationStage} codeTransformationStage
* @returns {string}
*/
public transformCode (code: string, codeTransformationStage: CodeTransformationStage): string {
switch (codeTransformationStage) {
case CodeTransformationStage.PreparingTransformers:
return this.removeAndSaveHashbangOperatorLine(code);
case CodeTransformationStage.FinalizingTransformers:
return this.appendSavedHashbangOperatorLine(code);
default:
return code;
}
}
/**
* @param {string} code
* @returns {string}
*/
private removeAndSaveHashbangOperatorLine (code: string): string {
return code
.replace(/^#!.*$(\r?\n)*/m, (substring: string) => {
if (substring) {
this.hashbangOperatorLine = substring;
}
return '';
})
.trim();
}
/**
* @param {string} code
* @returns {string}
*/
private appendSavedHashbangOperatorLine (code: string): string {
return `${this.hashbangOperatorLine ?? ''}${code}`;
}
}