estree-walker
Advanced tools
Comparing version 0.8.1 to 0.9.0
# changelog | ||
## 0.9.0 | ||
* Add `this.remove()` method | ||
## 0.8.1 | ||
@@ -4,0 +8,0 @@ |
@@ -12,5 +12,7 @@ (function (global, factory) { | ||
let should_skip = false; | ||
let should_remove = false; | ||
let replacement = null; | ||
const context = { | ||
skip: () => should_skip = true, | ||
remove: () => should_remove = true, | ||
replace: (node) => replacement = node | ||
@@ -31,2 +33,12 @@ }; | ||
function remove(parent, prop, index) { | ||
if (parent) { | ||
if (index !== null) { | ||
parent[prop].splice(index, 1); | ||
} else { | ||
delete parent[prop]; | ||
} | ||
} | ||
} | ||
function visit( | ||
@@ -43,4 +55,6 @@ node, | ||
const _should_skip = should_skip; | ||
const _should_remove = should_remove; | ||
const _replacement = replacement; | ||
should_skip = false; | ||
should_remove = false; | ||
replacement = null; | ||
@@ -55,8 +69,15 @@ | ||
if (should_remove) { | ||
remove(parent, prop, index); | ||
} | ||
const skipped = should_skip; | ||
const removed = should_remove; | ||
should_skip = _should_skip; | ||
should_remove = _should_remove; | ||
replacement = _replacement; | ||
if (skipped) return node; | ||
if (removed) return null; | ||
} | ||
@@ -73,4 +94,9 @@ | ||
if (Array.isArray(value)) { | ||
for (let j = 0; j < value.length; j += 1) { | ||
value[j] && value[j].type && visit(value[j], node, enter, leave, key, j); | ||
for (let j = 0, k = 0; j < value.length; j += 1, k += 1) { | ||
if (value[j] && value[j].type) { | ||
if (!visit(value[j], node, enter, leave, key, k)) { | ||
// removed | ||
j--; | ||
} | ||
} | ||
} | ||
@@ -86,3 +112,5 @@ } | ||
const _replacement = replacement; | ||
const _should_remove = should_remove; | ||
replacement = null; | ||
should_remove = false; | ||
@@ -96,3 +124,12 @@ leave.call(context, node, parent, prop, index); | ||
if (should_remove) { | ||
remove(parent, prop, index); | ||
} | ||
const removed = should_remove; | ||
replacement = _replacement; | ||
should_remove = _should_remove; | ||
if (removed) return null; | ||
} | ||
@@ -99,0 +136,0 @@ } |
{ | ||
"name": "estree-walker", | ||
"description": "Traverse an ESTree-compliant AST", | ||
"version": "0.8.1", | ||
"version": "0.9.0", | ||
"author": "Rich Harris", | ||
@@ -6,0 +6,0 @@ "license": "MIT", |
@@ -35,2 +35,3 @@ # estree-walker | ||
Call `this.remove()` in either `enter` or `leave` to remove the current node. | ||
@@ -37,0 +38,0 @@ ## Why not use estraverse? |
@@ -6,5 +6,7 @@ function walk(ast, { enter, leave }) { | ||
let should_skip = false; | ||
let should_remove = false; | ||
let replacement = null; | ||
const context = { | ||
skip: () => should_skip = true, | ||
remove: () => should_remove = true, | ||
replace: (node) => replacement = node | ||
@@ -25,2 +27,12 @@ }; | ||
function remove(parent, prop, index) { | ||
if (parent) { | ||
if (index !== null) { | ||
parent[prop].splice(index, 1); | ||
} else { | ||
delete parent[prop]; | ||
} | ||
} | ||
} | ||
function visit( | ||
@@ -37,4 +49,6 @@ node, | ||
const _should_skip = should_skip; | ||
const _should_remove = should_remove; | ||
const _replacement = replacement; | ||
should_skip = false; | ||
should_remove = false; | ||
replacement = null; | ||
@@ -49,8 +63,15 @@ | ||
if (should_remove) { | ||
remove(parent, prop, index); | ||
} | ||
const skipped = should_skip; | ||
const removed = should_remove; | ||
should_skip = _should_skip; | ||
should_remove = _should_remove; | ||
replacement = _replacement; | ||
if (skipped) return node; | ||
if (removed) return null; | ||
} | ||
@@ -67,4 +88,9 @@ | ||
if (Array.isArray(value)) { | ||
for (let j = 0; j < value.length; j += 1) { | ||
value[j] && value[j].type && visit(value[j], node, enter, leave, key, j); | ||
for (let j = 0, k = 0; j < value.length; j += 1, k += 1) { | ||
if (value[j] && value[j].type) { | ||
if (!visit(value[j], node, enter, leave, key, k)) { | ||
// removed | ||
j--; | ||
} | ||
} | ||
} | ||
@@ -80,3 +106,5 @@ } | ||
const _replacement = replacement; | ||
const _should_remove = should_remove; | ||
replacement = null; | ||
should_remove = false; | ||
@@ -90,3 +118,12 @@ leave.call(context, node, parent, prop, index); | ||
if (should_remove) { | ||
remove(parent, prop, index); | ||
} | ||
const removed = should_remove; | ||
replacement = _replacement; | ||
should_remove = _should_remove; | ||
if (removed) return null; | ||
} | ||
@@ -93,0 +130,0 @@ } |
@@ -5,2 +5,3 @@ import { Node } from "estree"; | ||
skip: () => void; | ||
remove: () => void; | ||
replace: (node: Node) => void; | ||
@@ -27,5 +28,7 @@ }; | ||
let should_skip = false; | ||
let should_remove = false; | ||
let replacement: Node = null; | ||
const context: WalkerContext = { | ||
skip: () => should_skip = true, | ||
remove: () => should_remove = true, | ||
replace: (node: Node) => replacement = node | ||
@@ -46,2 +49,12 @@ }; | ||
function remove(parent: any, prop: string, index: number) { | ||
if (parent) { | ||
if (index !== null) { | ||
parent[prop].splice(index, 1); | ||
} else { | ||
delete parent[prop]; | ||
} | ||
} | ||
} | ||
function visit( | ||
@@ -58,4 +71,6 @@ node: Node, | ||
const _should_skip = should_skip; | ||
const _should_remove = should_remove; | ||
const _replacement = replacement; | ||
should_skip = false; | ||
should_remove = false; | ||
replacement = null; | ||
@@ -70,8 +85,15 @@ | ||
if (should_remove) { | ||
remove(parent, prop, index); | ||
} | ||
const skipped = should_skip; | ||
const removed = should_remove; | ||
should_skip = _should_skip; | ||
should_remove = _should_remove; | ||
replacement = _replacement; | ||
if (skipped) return node; | ||
if (removed) return null; | ||
} | ||
@@ -88,4 +110,9 @@ | ||
if (Array.isArray(value)) { | ||
for (let j = 0; j < value.length; j += 1) { | ||
value[j] && value[j].type && visit(value[j], node, enter, leave, key, j); | ||
for (let j = 0, k = 0; j < value.length; j += 1, k += 1) { | ||
if (value[j] && value[j].type) { | ||
if (!visit(value[j], node, enter, leave, key, k)) { | ||
// removed | ||
j--; | ||
} | ||
} | ||
} | ||
@@ -101,3 +128,5 @@ } | ||
const _replacement = replacement; | ||
const _should_remove = should_remove; | ||
replacement = null; | ||
should_remove = false; | ||
@@ -111,3 +140,12 @@ leave.call(context, node, parent, prop, index); | ||
if (should_remove) { | ||
remove(parent, prop, index); | ||
} | ||
const removed = should_remove; | ||
replacement = _replacement; | ||
should_remove = _should_remove; | ||
if (removed) return null; | ||
} | ||
@@ -114,0 +152,0 @@ } |
import { Node } from "estree"; | ||
declare type WalkerContext = { | ||
skip: () => void; | ||
remove: () => void; | ||
replace: (node: Node) => void; | ||
@@ -11,4 +12,4 @@ }; | ||
}; | ||
export declare function walk(ast: Node, { enter, leave }: Walker): Node; | ||
export declare function walk(ast: Node, { enter, leave }: Walker): import("estree").Identifier | import("estree").SimpleLiteral | import("estree").RegExpLiteral | import("estree").Program | import("estree").FunctionDeclaration | import("estree").FunctionExpression | import("estree").ArrowFunctionExpression | import("estree").SwitchCase | import("estree").CatchClause | import("estree").VariableDeclarator | import("estree").ExpressionStatement | import("estree").BlockStatement | import("estree").EmptyStatement | import("estree").DebuggerStatement | import("estree").WithStatement | import("estree").ReturnStatement | import("estree").LabeledStatement | import("estree").BreakStatement | import("estree").ContinueStatement | import("estree").IfStatement | import("estree").SwitchStatement | import("estree").ThrowStatement | import("estree").TryStatement | import("estree").WhileStatement | import("estree").DoWhileStatement | import("estree").ForStatement | import("estree").ForInStatement | import("estree").ForOfStatement | import("estree").VariableDeclaration | import("estree").ClassDeclaration | import("estree").ThisExpression | import("estree").ArrayExpression | import("estree").ObjectExpression | import("estree").YieldExpression | import("estree").UnaryExpression | import("estree").UpdateExpression | import("estree").BinaryExpression | import("estree").AssignmentExpression | import("estree").LogicalExpression | import("estree").MemberExpression | import("estree").ConditionalExpression | import("estree").SimpleCallExpression | import("estree").NewExpression | import("estree").SequenceExpression | import("estree").TemplateLiteral | import("estree").TaggedTemplateExpression | import("estree").ClassExpression | import("estree").MetaProperty | import("estree").AwaitExpression | import("estree").Property | import("estree").Super | import("estree").TemplateElement | import("estree").SpreadElement | import("estree").ObjectPattern | import("estree").ArrayPattern | import("estree").RestElement | import("estree").AssignmentPattern | import("estree").ClassBody | import("estree").MethodDefinition | import("estree").ImportDeclaration | import("estree").ExportNamedDeclaration | import("estree").ExportDefaultDeclaration | import("estree").ExportAllDeclaration | import("estree").ImportSpecifier | import("estree").ImportDefaultSpecifier | import("estree").ImportNamespaceSpecifier | import("estree").ExportSpecifier; | ||
export declare const childKeys: Record<string, string[]>; | ||
export {}; |
14837
358
49