@@ -475,18 +475,13 @@ export function getFirstToken(
475475 }
476476
477477 if ( typeof filter !== "function" ) {
478- if ( typeof skip !== "number" ) {
479- // If no tokens start at or after `rangeStart`, return `null`
480- if ( startIndex >= tokensLength ) return null ;
481- // Check if the first candidate token is actually within the range
482- if ( nodeTokens [ startIndex ] . range [ 0 ] >= rangeEnd ) return null ;
483- return nodeTokens [ startIndex ] ;
484- }
478+ const skipTo = startIndex + ( skip ?? 0 ) ;
479+ // Avoid indexing out of bounds
480+ if ( skipTo >= tokensLength ) return null ;
485481
486- const firstTokenAfterSkip = nodeTokens [ startIndex + skip ] ;
487- if ( firstTokenAfterSkip === undefined ) return null ;
488- if ( firstTokenAfterSkip . range [ 0 ] >= rangeEnd ) return null ;
489- return firstTokenAfterSkip ;
482+ const token = nodeTokens [ skipTo ] ;
483+ if ( token . range [ 0 ] >= rangeEnd ) return null ;
484+ return token ;
490485 }
491486
492487 if ( typeof skip !== "number" ) {
@@ -500,7 +495,7 @@ export function getFirstToken(
500495 const token = nodeTokens [ i ] ;
501496 if ( token . range [ 0 ] >= rangeEnd ) return null ; // Token is outside the node
502497 if ( filter ( token ) ) {
503- if ( skip == = 0 ) return token ;
498+ if ( skip < = 0 ) return token ;
504499 skip -- ;
505500 }
506501 }
@@ -668,10 +663,11 @@ export function getLastToken(
668663 lastTokenIndex -- ;
669664
670665 if ( typeof filter !== "function" ) {
671- if ( typeof skip !== "number" ) return nodeTokens [ lastTokenIndex ] ?? null ;
672-
673- const token = nodeTokens [ lastTokenIndex - skip ] ;
674- if ( token === undefined || token . range [ 0 ] < rangeStart ) return null ;
666+ const skipTo = lastTokenIndex - ( skip ?? 0 ) ;
667+ // Avoid indexing out of bounds
668+ if ( skipTo < 0 ) return null ;
669+ const token = nodeTokens [ skipTo ] ;
670+ if ( token . range [ 0 ] < rangeStart ) return null ;
675671 return token ;
676672 }
677673
@@ -686,7 +682,7 @@ export function getLastToken(
686682 const token = nodeTokens [ i ] ;
687683 if ( token . range [ 0 ] < rangeStart ) return null ;
688684 if ( filter ( token ) ) {
689- if ( skip == = 0 ) return token ;
685+ if ( skip < = 0 ) return token ;
690686 skip -- ;
691687 }
692688 }
@@ -858,8 +854,10 @@ export function getTokenBefore(
858854 beforeIndex -- ;
859855
860856 if ( typeof filter !== "function" ) {
861- if ( typeof skip !== "number" ) return nodeTokens [ beforeIndex ] ?? null ;
862- return nodeTokens [ beforeIndex - skip ] ?? null ;
857+ const skipTo = beforeIndex - ( skip ?? 0 ) ;
858+ // Avoid indexing out of bounds
859+ if ( skipTo < 0 ) return null ;
860+ return nodeTokens [ skipTo ] ;
863861 }
864862
865863 if ( typeof skip !== "number" ) {
@@ -872,7 +870,7 @@ export function getTokenBefore(
872870 while ( beforeIndex >= 0 ) {
873871 const token = nodeTokens [ beforeIndex ] ;
874872 if ( filter ( token ) ) {
875- if ( skip == = 0 ) return token ;
873+ if ( skip < = 0 ) return token ;
876874 skip -- ;
877875 }
878876 beforeIndex -- ;
@@ -1006,8 +1004,8 @@ export function getTokenAfter(
10061004 typeof skipOptions === "number"
10071005 ? skipOptions
10081006 : typeof skipOptions === "object" && skipOptions !== null
1009- ? ( skipOptions . skip ?? 0 )
1010- : 0 ;
1007+ ? skipOptions . skip
1008+ : null ;
10111009
10121010 const filter =
10131011 typeof skipOptions === "function"
@@ -1049,8 +1047,10 @@ export function getTokenAfter(
10491047
10501048 // Fast path for the common case
10511049 if ( typeof filter !== "function" ) {
1052- if ( typeof skip !== "number" ) return nodeTokens [ startIndex ] ?? null ;
1053- return nodeTokens [ startIndex + skip ] ?? null ;
1050+ const skipTo = startIndex + ( skip ?? 0 ) ;
1051+ // Avoid indexing out of bounds
1052+ if ( skipTo >= tokensLength ) return null ;
1053+ return nodeTokens [ skipTo ] ;
10541054 }
10551055
10561056 if ( typeof skip !== "number" ) {
@@ -1062,7 +1062,7 @@ export function getTokenAfter(
10621062 for ( let i = startIndex ; i < tokensLength ; i ++ ) {
10631063 const token = nodeTokens [ i ] ;
10641064 if ( filter ( token ) ) {
1065- if ( skip == = 0 ) return token ;
1065+ if ( skip < = 0 ) return token ;
10661066 skip -- ;
10671067 }
10681068 }
@@ -1339,8 +1339,11 @@ export function getFirstTokenBetween(
13391339 }
13401340
13411341 if ( typeof filter !== "function" ) {
1342- const token = nodeTokens [ typeof skip === "number" ? firstTokenIndex + skip : firstTokenIndex ] ;
1343- if ( token === undefined || token . range [ 0 ] >= rangeEnd ) return null ;
1342+ const skipTo = firstTokenIndex + ( skip ?? 0 ) ;
1343+ // Avoid indexing out of bounds
1344+ if ( skipTo >= tokensLength ) return null ;
1345+ const token = nodeTokens [ skipTo ] ;
1346+ if ( token . range [ 0 ] >= rangeEnd ) return null ;
13441347 return token ;
13451348 }
13461349
@@ -1530,8 +1533,11 @@ export function getLastTokenBetween(
15301533
15311534 // Fast path for the common case
15321535 if ( typeof filter !== "function" ) {
1533- const token = nodeTokens [ typeof skip === "number" ? lastTokenIndex - skip : lastTokenIndex ] ;
1534- if ( token === undefined || token . range [ 0 ] < rangeStart ) return null ;
1536+ const skipTo = lastTokenIndex - ( skip ?? 0 ) ;
1537+ // Avoid indexing out of bounds
1538+ if ( skipTo < 0 ) return null ;
1539+ const token = nodeTokens [ skipTo ] ;
1540+ if ( token . range [ 0 ] < rangeStart ) return null ;
15351541 return token ;
15361542 }
15371543
@@ -1546,8 +1552,6 @@ export function getLastTokenBetween(
15461552 const token = nodeTokens [ i ] ;
15471553 if ( token . range [ 0 ] < rangeStart ) return null ;
15481554 if ( filter ( token ) ) {
1549- // `<=` because user input may be negative
1550- // TODO: gracefully handle the negative case in other methods
15511555 if ( skip <= 0 ) return token ;
15521556 skip -- ;
15531557 }
0 commit comments