esrecurse-browser
v1.0.1
Published
Browser-ready standalone build of esrecurse ( UMD + ESM )
Maintainers
Readme
esrecurse-browser
This package provides esrecurse bundled for use in the browser without the need to npm install anything
you can use this tool to see what is exposed in both the script src and esm modules
global state diff -- https://ext-code.com/utils/misc/global-state-diff/global-state-diff.html
this tool can be used to experiment with the package
nodejs terminal -- https://ext-code.com/utils/misc/nodejs-terminal/nodejs-terminal.html
For script
<script src='https://libs.ext-code.com/external/js/esrecurse/esrecurse.js'></script>
test it out with this tool
html editor -- https://ext-code.com/utils/editors/html-editor/html-editor.html
For esm
import {esrecurse} from 'https://libs.ext-code.com/external/js/esrecurse/esrecurse.m.js';
//
var {esrecurse} = await import('https://libs.ext-code.com/external/js/esrecurse/esrecurse.m.js');
test it out with this tool
js console -- https://ext-code.com/utils/editors/js-console/js-console.html
Further Reading
https://github.com/estools/esrecurse
https://www.npmjs.com/package/esrecurse
See also
https://www.npmjs.com/package/estraverse-browser
https://www.npmjs.com/package/espree-browser
https://www.npmjs.com/package/acorn-browser
examples
<script type=module>
import {acorn} from 'https://libs.ext-code.com/external/js/acorn/acorn.m.js';
import {esrecurse} from 'https://libs.ext-code.com/external/js/esrecurse/esrecurse.m.js';
const code = `
const x = 1;
let y,z = 3;
var w = 10;
function foo(a,b){
let c = a+b;
}//foo
try{
throw new Error();
}//try
catch(err){
let handled = true;
}//catch
`;
const ast = acorn.parse(code,{range:true,ecmaVersion:'latest'});
const variables = new Set();
const visitor = new esrecurse.Visitor({
VariableDeclaration(node){
for(const decl of node.declarations){
collectPattern(decl.id);
}//for
},
FunctionDeclaration(node){
node.params.forEach(collectPattern);
this.visitChildren(node);
},
FunctionExpression(node){
node.params.forEach(collectPattern);
this.visitChildren(node);
},
ArrowFunctionExpression(node){
node.params.forEach(collectPattern);
this.visitChildren(node);
},
CatchClause(node){
if (node.param) collectPattern(node.param);
this.visitChildren(node);
}
});
// Helper: handles identifiers, object patterns, array patterns, rest patterns
function collectPattern(pattern){
switch(pattern.type){
case "Identifier":
variables.add(pattern.name);
break;
case "ObjectPattern":
pattern.properties.forEach(prop=>{
if(prop.type==="Property"){
collectPattern(prop.value);
}else if(prop.type==="RestElement"){
collectPattern(prop.argument);
}
});
break;
case "ArrayPattern":
pattern.elements.forEach(el=>{
if(el)collectPattern(el);
});
break;
case "RestElement":
collectPattern(pattern.argument);
break;
case "AssignmentPattern":
collectPattern(pattern.left);
break;
}//switch
}//collectPatterns
// Run visitor
visitor.visit(ast);
console.log("Collected variables:",[...variables]);
</script>
<script type=module>
var [{acorn},{esrecurse}] = await Promise.all([
import('https://libs.ext-code.com/external/js/acorn/acorn.m.js'),
import('https://libs.ext-code.com/external/js/esrecurse/esrecurse.m.js'),
]);
const code = `
const x = 1;
let y,z = 3;
var w = 10;
function foo(a,b){
let c = a+b;
}//foo
try{
throw new Error();
}//try
catch(err){
let handled = true;
}//catch
`;
const ast = acorn.parse(code,{range:true,ecmaVersion:'latest'});
const variables = new Set();
const visitor = new esrecurse.Visitor({
VariableDeclaration(node){
for(const decl of node.declarations){
collectPattern(decl.id);
}//for
},
FunctionDeclaration(node){
node.params.forEach(collectPattern);
this.visitChildren(node);
},
FunctionExpression(node){
node.params.forEach(collectPattern);
this.visitChildren(node);
},
ArrowFunctionExpression(node){
node.params.forEach(collectPattern);
this.visitChildren(node);
},
CatchClause(node){
if (node.param) collectPattern(node.param);
this.visitChildren(node);
}
});
// Helper: handles identifiers, object patterns, array patterns, rest patterns
function collectPattern(pattern){
switch(pattern.type){
case "Identifier":
variables.add(pattern.name);
break;
case "ObjectPattern":
pattern.properties.forEach(prop=>{
if(prop.type==="Property"){
collectPattern(prop.value);
}else if(prop.type==="RestElement"){
collectPattern(prop.argument);
}
});
break;
case "ArrayPattern":
pattern.elements.forEach(el=>{
if(el)collectPattern(el);
});
break;
case "RestElement":
collectPattern(pattern.argument);
break;
case "AssignmentPattern":
collectPattern(pattern.left);
break;
}//switch
}//collectPatterns
// Run visitor
visitor.visit(ast);
console.log("Collected variables:",[...variables]);
</script>
<script src='https://libs.ext-code.com/external/js/acorn/acorn.js'></script>
<script src='https://libs.ext-code.com/external/js/esrecurse/esrecurse.js'></script>
<script>
const code = `
const x = 1;
let y,z = 3;
var w = 10;
function foo(a,b){
let c = a+b;
}//foo
try{
throw new Error();
}//try
catch(err){
let handled = true;
}//catch
`;
const ast = acorn.parse(code,{range:true,ecmaVersion:'latest'});
const variables = new Set();
const visitor = new esrecurse.Visitor({
VariableDeclaration(node){
for(const decl of node.declarations){
collectPattern(decl.id);
}//for
},
FunctionDeclaration(node){
node.params.forEach(collectPattern);
this.visitChildren(node);
},
FunctionExpression(node){
node.params.forEach(collectPattern);
this.visitChildren(node);
},
ArrowFunctionExpression(node){
node.params.forEach(collectPattern);
this.visitChildren(node);
},
CatchClause(node){
if (node.param) collectPattern(node.param);
this.visitChildren(node);
}
});
// Helper: handles identifiers, object patterns, array patterns, rest patterns
function collectPattern(pattern){
switch(pattern.type){
case "Identifier":
variables.add(pattern.name);
break;
case "ObjectPattern":
pattern.properties.forEach(prop=>{
if(prop.type==="Property"){
collectPattern(prop.value);
}else if(prop.type==="RestElement"){
collectPattern(prop.argument);
}
});
break;
case "ArrayPattern":
pattern.elements.forEach(el=>{
if(el)collectPattern(el);
});
break;
case "RestElement":
collectPattern(pattern.argument);
break;
case "AssignmentPattern":
collectPattern(pattern.left);
break;
}//switch
}//collectPatterns
// Run visitor
visitor.visit(ast);
console.log("Collected variables:",[...variables]);
</script>
