UNPKG

@react-navigation/devtools

Version:

Developer tools for React Navigation

76 lines (73 loc) 2.03 kB
"use strict"; /** * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // Capturing groups: // 1. function name // 2. is this a native stack frame? // 3. is this a bytecode address or a source location? // 4. source URL (filename) // 5. line number (1 based) // 6. column number (1 based) or virtual offset (0 based) const RE_FRAME = /^ {0,4}at (.+?)(?: \((native)\)?| \((address at )?(.*?):(\d+):(\d+)\))$/; // Capturing groups: // 1. count of skipped frames const RE_SKIPPED = /^ {0,4}... skipping (\d) frames$/; function parseLine(line) { const asFrame = line.match(RE_FRAME); if (asFrame) { return { type: 'FRAME', functionName: asFrame[1], location: asFrame[2] === 'native' ? { type: 'NATIVE' } : asFrame[3] === 'address at ' ? { type: 'BYTECODE', sourceUrl: asFrame[4], line1Based: Number.parseInt(asFrame[5], 10), virtualOffset0Based: Number.parseInt(asFrame[6], 10) } : { type: 'SOURCE', sourceUrl: asFrame[4], line1Based: Number.parseInt(asFrame[5], 10), column1Based: Number.parseInt(asFrame[6], 10) } }; } const asSkipped = line.match(RE_SKIPPED); if (asSkipped) { return { type: 'SKIPPED', count: Number.parseInt(asSkipped[1], 10) }; } return undefined; } export function parseHermesStack(stack) { const lines = stack.split(/\n/); let entries = []; let lastMessageLine = -1; for (let i = 0; i < lines.length; ++i) { const line = lines[i]; if (!line) { continue; } const entry = parseLine(line); if (entry) { entries.push(entry); continue; } // No match - we're still in the message lastMessageLine = i; entries = []; } const message = lines.slice(0, lastMessageLine + 1).join('\n'); return { message, entries }; } //# sourceMappingURL=parseHermesStack.js.map