mirror of
https://github.com/javascript-obfuscator/javascript-obfuscator
synced 2026-08-09 12:42:29 +00:00
71 lines
1.9 KiB
TypeScript
71 lines
1.9 KiB
TypeScript
import { injectable, inject } from 'inversify';
|
|
import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
|
|
|
|
import * as estraverse from 'estraverse';
|
|
import * as ESTree from 'estree';
|
|
|
|
import { IOptions } from '../../interfaces/options/IOptions';
|
|
|
|
import { NodeType } from '../../enums/NodeType';
|
|
|
|
import { AbstractNodeTransformer } from '../AbstractNodeTransformer';
|
|
import { Node } from '../../node/Node';
|
|
|
|
@injectable()
|
|
export class MemberExpressionTransformer extends AbstractNodeTransformer {
|
|
/**
|
|
* @param options
|
|
*/
|
|
constructor (
|
|
@inject(ServiceIdentifiers.IOptions) options: IOptions
|
|
) {
|
|
super(options);
|
|
}
|
|
|
|
/**
|
|
* @return {estraverse.Visitor}
|
|
*/
|
|
public getVisitor (): estraverse.Visitor {
|
|
return {
|
|
enter: (node: ESTree.Node, parentNode: ESTree.Node) => {
|
|
if (Node.isMemberExpressionNode(node)) {
|
|
return this.transformNode(node, parentNode);
|
|
}
|
|
}
|
|
};
|
|
}
|
|
|
|
/**
|
|
* replaces:
|
|
* object.identifier = 1;
|
|
*
|
|
* on:
|
|
* object['identifier'] = 1;
|
|
*
|
|
* and skip:
|
|
* object[identifier] = 1;
|
|
*
|
|
* Literal node will be obfuscated by LiteralTransformer
|
|
*
|
|
* @param memberExpressionNode
|
|
* @param parentNode
|
|
* @returns {ESTree.Node}
|
|
*/
|
|
public transformNode (memberExpressionNode: ESTree.MemberExpression, parentNode: ESTree.Node): ESTree.Node {
|
|
if (Node.isIdentifierNode(memberExpressionNode.property)) {
|
|
if (memberExpressionNode.computed) {
|
|
return memberExpressionNode;
|
|
}
|
|
|
|
memberExpressionNode.computed = true;
|
|
memberExpressionNode.property = {
|
|
type: NodeType.Literal,
|
|
value: memberExpressionNode.property.name,
|
|
raw: `'${memberExpressionNode.property.name}'`
|
|
};
|
|
}
|
|
|
|
return memberExpressionNode;
|
|
}
|
|
}
|