UNPKG

@revoloo/cypress6

Version:

Cypress.io end to end testing tool

87 lines (63 loc) 2.21 kB
const _ = require('lodash') const { SourceMapConsumer } = require('source-map') const Promise = require('bluebird') const $utils = require('./utils') const sourceMapExtractionRegex = /\/\/\s*[@#]\s*sourceMappingURL\s*=\s*(data:[^\s]*)/g const regexDataUrl = /data:[^;\n]+(?:;charset=[^;\n]+)?;base64,([a-zA-Z0-9+/]+={0,2})/ // matches data urls let sourceMapConsumers = {} const initializeSourceMapConsumer = (file, sourceMap) => { if (!sourceMap) return Promise.resolve(null) SourceMapConsumer.initialize({ 'lib/mappings.wasm': require('source-map/lib/mappings.wasm'), }) return Promise.resolve(new SourceMapConsumer(sourceMap)).then((consumer) => { sourceMapConsumers[file.fullyQualifiedUrl] = consumer return consumer }) } const extractSourceMap = (file, fileContents) => { let sourceMapMatch = fileContents.match(sourceMapExtractionRegex) if (!sourceMapMatch) return null const url = _.last(sourceMapMatch) const dataUrlMatch = url.match(regexDataUrl) if (!dataUrlMatch) return null const sourceMapBase64 = dataUrlMatch[1] const sourceMap = base64toJs(sourceMapBase64) return sourceMap } const getSourceContents = (filePath, sourceFile) => { if (!sourceMapConsumers[filePath]) return null try { return sourceMapConsumers[filePath].sourceContentFor(sourceFile) } catch (err) { // ignore the sourceFile not being in the source map. there's nothing we // can do about it and we don't want to thrown an exception if (err && err.message.indexOf('not in the SourceMap') > -1) return throw err } } const getSourcePosition = (filePath, position) => { if (!sourceMapConsumers[filePath]) return null const sourcePosition = sourceMapConsumers[filePath].originalPositionFor(position) const { source: file, line, column } = sourcePosition if (!file || line == null || column == null) return return { file, line, column, } } const base64toJs = (base64) => { const mapString = $utils.decodeBase64Unicode(base64) try { return JSON.parse(mapString) } catch (err) { return null } } module.exports = { extractSourceMap, getSourceContents, getSourcePosition, initializeSourceMapConsumer, }