(
code: string,
start: number,
urls: Set<{ url: string; start: number; end: number }>,
)
| 998 | * @returns selfAccepts |
| 999 | */ |
| 1000 | export function lexAcceptedHmrDeps( |
| 1001 | code: string, |
| 1002 | start: number, |
| 1003 | urls: Set<{ url: string; start: number; end: number }>, |
| 1004 | ): boolean { |
| 1005 | let state: LexerState = LexerState.inCall |
| 1006 | // the state can only be 2 levels deep so no need for a stack |
| 1007 | let prevState: LexerState = LexerState.inCall |
| 1008 | let currentDep: string = '' |
| 1009 | |
| 1010 | function addDep(index: number) { |
| 1011 | urls.add({ |
| 1012 | url: currentDep, |
| 1013 | start: index - currentDep.length - 1, |
| 1014 | end: index + 1, |
| 1015 | }) |
| 1016 | currentDep = '' |
| 1017 | } |
| 1018 | |
| 1019 | for (let i = start; i < code.length; i++) { |
| 1020 | const char = code.charAt(i) |
| 1021 | switch (state) { |
| 1022 | case LexerState.inCall: |
| 1023 | case LexerState.inArray: |
| 1024 | if (char === `'`) { |
| 1025 | prevState = state |
| 1026 | state = LexerState.inSingleQuoteString |
| 1027 | } else if (char === `"`) { |
| 1028 | prevState = state |
| 1029 | state = LexerState.inDoubleQuoteString |
| 1030 | } else if (char === '`') { |
| 1031 | prevState = state |
| 1032 | state = LexerState.inTemplateString |
| 1033 | } else if (whitespaceRE.test(char)) { |
| 1034 | continue |
| 1035 | } else { |
| 1036 | if (state === LexerState.inCall) { |
| 1037 | if (char === `[`) { |
| 1038 | state = LexerState.inArray |
| 1039 | } else { |
| 1040 | // reaching here means the first arg is neither a string literal |
| 1041 | // nor an Array literal (direct callback) or there is no arg |
| 1042 | // in both case this indicates a self-accepting module |
| 1043 | return true // done |
| 1044 | } |
| 1045 | } else { |
| 1046 | if (char === `]`) { |
| 1047 | return false // done |
| 1048 | } else if (char === ',') { |
| 1049 | continue |
| 1050 | } else { |
| 1051 | error(i) |
| 1052 | } |
| 1053 | } |
| 1054 | } |
| 1055 | break |
| 1056 | case LexerState.inSingleQuoteString: |
| 1057 | if (char === `'`) { |
no test coverage detected