A simple tool for creating AST signatures from raw strings. The tool is developed to find patterns in code, but it can be used for any purpose
Traverse source code and returns its AST pattern
source
(string)opts
(object) - optionalinput
(object)minify
(boolean/opts) uglify-js minify configuration. iftrue
the source will be minified using the default configuration (UglifyJS.minify(code);
)
parse
(object) meriyah parsing APIoutput
(object)raw
(boolean) return raw nodescompressed
(boolean) return compressed pattern (e.gVVVVV
->V5
)map
(object) override AST nodes mapping
returns the AST nodes mapping
{
Program: '',
FunctionDeclaration: 'F',
VariableDeclaration: 'V',
VariableDeclarator: 'v',
BlockStatement: 'B',
Identifier: 'I',
ExpressionStatement: 'E',
CallExpression: 'C',
ThisExpression: 'd',
Literal: 'e',
EmptyStatement: 'h',
DebuggerStatement: 'i',
WithStatement: 'j',
ReturnStatement: 'k',
LabeledStatement: 'l',
BreakStatement: 'm',
ContinueStatement: 'n',
IfStatement: 'o',
SwitchStatement: 'p',
SwitchCase: 'q',
ThrowStatement: 'r',
TryStatement: 's',
CatchClause: 't',
WhileStatement: 'u',
DoWhileStatement: 'c',
ForStatement: 'w',
ForInStatement: 'x',
Property: 'z',
ArrayExpression: 'A',
ObjectExpression: 'b',
FunctionExpression: 'P',
UnaryExpression: 'D',
UnaryOperator: 'g',
UpdateExpression: 'a',
UpdateOperator: 'G',
BinaryExpression: 'H',
BinaryOperator: 'f',
AssignmentExpression: 'J',
AssignmentOperator: 'K',
LogicalExpression: 'L',
LogicalOperator: 'M',
MemberExpression: 'N',
ConditionalExpression: 'O',
NewExpression: 'Q',
SequenceExpression: 'R',
}
const SPF = require('script-pattern-factory');
(async function () {
const code = `
const x = 10;
function foo(val){
console.log(val);
}
foo(x);
const y = 55;
`;
const pattern = await SPF.getPattern(code);
//VveIFIBECNIIIIECIIVveI
console.log(`Pattern ${pattern}`);
console.log(`Symbol Map:\n${JSON.stringify(SPF.inspect())}`);
})();
Traverse source code and returns its AST, complete with the code for each node.
source
(string)parse
(object) meriyah parsing API. Note the location (loc
) option is on by default and is required to extract the actual code for each node.
const SPF = require('script-pattern-factory');
(async function () {
const code = `
const x = 10;
function foo(val){
console.log(val);
}
foo(x);
;
const y = 55;
`;
const nodes = await SPF.getNodes(code);
console.log(`Parsed ${nodes.length}:`);
for (let node of nodes) {
console.log(`[${node.type.padEnd(19)}] ==> ${node.src.replace('\n', '')}`);
}
})();