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 111 112 1131x             1x   1x   1x 1x   1x 1x 1x 1x   1x   1x       514x                                                         514x   514x 514x 514x             514x       514x             514x             514x 514x 514x   514x 508x         6x     514x                                
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
                }),
                Object.assign({}, NO_CUSTOM_NODES_PRESET, {
                    seed: this.options.seed
                })
            ).getObfuscatedCode()
        );
    }
}