All files / src/custom-nodes/string-array-nodes StringArrayRotateFunctionNode.ts

96.3% Statements 26/27
66.67% Branches 4/6
100% Functions 1/1
96.3% Lines 26/27
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 1111x             1x   1x   1x 1x   1x 1x 1x 1x   1x   1x       508x                                                         508x   508x 508x 508x             508x       508x             508x             508x 508x 508x   508x 502x         6x     508x                            
import 'format-unicorn';
 
import { TNodeWithBlockStatement } from '../../types/TNodeWithBlockStatement';
import { TStatement } from '../../types/TStatement';
 
import { IOptions } from '../../interfaces/IOptions';
 
import { AppendState } from '../../enums/AppendState';
 
import { NO_CUSTOM_NODES_PRESET } from '../../preset-options/NoCustomNodesPreset';
 
import { SelfDefendingTemplate } from '../../templates/custom-nodes/string-array-nodes/string-array-rotate-function-node/SelfDefendingTemplate';
import { StringArrayRotateFunctionTemplate } from '../../templates/custom-nodes/string-array-nodes/string-array-rotate-function-node/StringArrayRotateFunctionTemplate';
 
import { AbstractCustomNode } from '../AbstractCustomNode';
import { JavaScriptObfuscator } from '../../JavaScriptObfuscator';
import { NodeAppender } from '../../node/NodeAppender';
import { NodeUtils } from '../../node/NodeUtils';
import { StringArray } from '../../StringArray';
import { Utils } from '../../Utils';
 
export class StringArrayRotateFunctionNode extends AbstractCustomNode {
    /**
     * @type {AppendState}
     */
    protected appendState: AppendState = AppendState.AfterObfuscation;
 
    /**
     * @type {StringArray}
     */
    private stringArray: StringArray;
 
    /**
     * @type {string}
     */
    private stringArrayName: string;
 
    /**
     * @param {number}
     */
    private stringArrayRotateValue: number;
 
    /**
     * @param stringArrayName
     * @param stringArray
     * @param stringArrayRotateValue
     * @param options
     */
    constructor (
        stringArrayName: string,
        stringArray: StringArray,
        stringArrayRotateValue: number,
        options: IOptions
    ) {
        super(options);
 
        this.stringArrayName = stringArrayName;
        this.stringArray = stringArray;
        this.stringArrayRotateValue = stringArrayRotateValue;
    }
 
    /**
     * @param blockScopeNode
     */
    public appendNode (blockScopeNode: TNodeWithBlockStatement): void {
        Iif (!this.stringArray.getLength()) {
            return;
        }
 
        NodeAppender.insertNodeAtIndex(blockScopeNode, this.getNode(), 1);
    }
 
    /**
     * @returns {TStatement[]}
     */
    public getNode (): TStatement[] {
        return super.getNode();
    }
 
    /**
     * @returns {TStatement[]}
     */
    protected getNodeStructure (): TStatement[] {
        let code: string = '',
            timesName: string = Utils.getRandomVariableName(),
            whileFunctionName: string = Utils.getRandomVariableName();
 
        if (this.options.selfDefending) {
            code = SelfDefendingTemplate().formatUnicorn({
                timesName,
                whileFunctionName
            });
        } else {
            code = `${whileFunctionName}(++${timesName})`;
        }
 
        return NodeUtils.convertCodeToStructure(
            JavaScriptObfuscator.obfuscate(
                StringArrayRotateFunctionTemplate().formatUnicorn({
                    code,
                    timesName,
                    stringArrayName: this.stringArrayName,
                    stringArrayRotateValue: Utils.decToHex(this.stringArrayRotateValue),
                    whileFunctionName
                }),
                NO_CUSTOM_NODES_PRESET
            ).getObfuscatedCode()
        );
    }
}