oxc-walker-skilld
ใช้เสมอเมื่อเขียนโค้ดที่นำเข้า "oxc-walker" ปรึกษาเพื่อการดีบัก แนวทางปฏิบัติที่ดีที่สุด หรือการปรับเปลี่ยน oxc-walker, oxc walker
npx skills add https://github.com/nuxt/scripts --skill oxc-walker-skilldoxc-project/oxc-walker oxc-walker
Version: 0.7.0 (Jan 2026) Deps: magic-regexp@^0.10.0 Tags: latest: 0.7.0 (Jan 2026)
References: package.json — exports, entry points • README — setup, basic usage • GitHub Issues — bugs, workarounds, edge cases • Releases — changelog, breaking changes, new APIs
Search
Use skilld search instead of grepping .skilld/ directories — hybrid semantic + keyword search across all indexed docs, issues, and releases. If skilld is unavailable, use npx -y skilld search.
skilld search "query" -p oxc-walker
skilld search "issues:error handling" -p oxc-walker
skilld search "releases:deprecated" -p oxc-walker
Filters: docs:, issues:, releases: prefix narrows by source type.
API Changes
This section documents version-specific API changes -- prioritize recent major/minor releases.
-
NEW:
ScopeTrackerVariable-- exported class in v0.7.0, enablesinstanceofchecks on results fromscopeTracker.getDeclaration(). Previously internal-only; LLMs will not know these classes are importable source -
NEW:
ScopeTrackerFunction-- exported class in v0.7.0, represents function declarations tracked byScopeTracker. Import directly fromoxc-walkerfor type narrowing source -
NEW:
ScopeTrackerImport-- exported class in v0.7.0, represents import declarations tracked byScopeTracker. Has.importNodeproperty for accessing the fullImportDeclarationsource -
NEW:
ScopeTrackerFunctionParam-- exported class in v0.7.0, represents function parameters tracked byScopeTracker. Has.fnNodefor accessing the parent function node source -
NEW:
ScopeTrackerIdentifier-- exported class in v0.7.0, represents plain identifiers (e.g. class/enum names) tracked byScopeTrackersource -
NEW:
ScopeTrackerCatchParam-- exported class in v0.7.0, represents catch clause parameters tracked byScopeTracker. Has.catchNodefor the parentCatchClausesource -
NEW:
getUndeclaredIdentifiersInFunction(node)-- exported in v0.7.0, returnsstring[]of identifier names referenced but not declared within aFunctionorArrowFunctionExpressionnode source -
NEW:
isBindingIdentifier(node, parent)-- exported in v0.7.0, returnsbooleanindicating whether a node is a binding identifier given its parent context source -
DEPRECATED:
ScopeTrackerFunctionParam.start-- use.fnNode.startinstead. The representation of this position may change in future versions source -
DEPRECATED:
ScopeTrackerFunctionParam.end-- use.fnNode.endinstead. The representation of this position may change in future versions source -
NEW:
ScopeTrackerNodetype -- union type exported in v0.7.0:ScopeTrackerFunctionParam | ScopeTrackerFunction | ScopeTrackerVariable | ScopeTrackerIdentifier | ScopeTrackerImport | ScopeTrackerCatchParam. Use for typinggetDeclaration()results source -
BREAKING:
oxc-parserpeer dependency -- v0.6.0 requiresoxc-parserv0.98.0+. Older oxc-parser versions are no longer compatible source
Also changed: WalkOptions type exported v0.7.0 · WalkerEnter type exported v0.7.0 · WalkerLeave type exported v0.7.0 · WalkerCallbackContext type exported v0.7.0 · WalkerThisContextEnter type exported v0.7.0 · WalkerThisContextLeave type exported v0.7.0 · Identifier type exported v0.7.0 · ScopeTrackerOptions type exported v0.7.0
Best Practices
- Use regular function expressions (not arrow functions) for
enter/leavecallbacks --this.skip(),this.replace(), andthis.remove()are bound viathiscontext and won't work with arrow functions source
// correct
walk(ast, { enter(node) { this.skip() } })
// broken -- this.skip is undefined
walk(ast, { enter: (node) => { this.skip() } })
-
Use
parseAndWalkover separateparseSync+walkwhen you only need a single pass -- it returnsParseResult(includingprogram) so you can still re-walk the AST if needed later source -
For hoisted declaration resolution, use the two-pass pattern: create
ScopeTracker({ preserveExitedScopes: true }), runparseAndWalkas a pre-pass to collect all declarations, callscopeTracker.freeze(), thenwalk(program, { scopeTracker })for analysis -- without this,getDeclaration()returnsnullfor identifiers declared after their usage in source order source -
Do not use
this.replace()orthis.remove()when aScopeTrackeris attached -- the scope tracker will not update its internal declarations, leaving stale scope data source -
this.remove()takes precedence overthis.replace()-- if both are called in the same callback, the node is removed regardless of replacement source -
this.skip()is only available inenter, notleave, and skipping a node also prevents itsleave()callback from firing -- this means ScopeTracker state can become inconsistent if you skip nodes that create scopes source -
Type-narrow
ScopeTrackerNodeusing the.typediscriminant orinstanceof(v0.7.0+) to access parent declaration nodes --ScopeTrackerVariableexposes.variableNode,ScopeTrackerImportexposes.importNode,ScopeTrackerCatchParamexposes.catchNode,ScopeTrackerFunctionParamexposes.fnNodesource -
isCurrentScopeUnder(scope)uses strict child checking -- it returnsfalsewhen the current scope equals the given scope, onlytruefor descendants source -
Use
getUndeclaredIdentifiersInFunction(node)to find free variables (closures) in a function or arrow function expression -- useful for tree-shaking analysis and determining if a function can be safely hoisted or moved source -
ScopeTrackerFunctionParam.startand.endare deprecated -- access the function's position via.fnNode.startand.fnNode.endinstead source