@revoloo/cypress6
Version:
Cypress.io end to end testing tool
55 lines (43 loc) • 1.66 kB
JavaScript
const _ = require('lodash')
const Bluebird = require('bluebird')
const $networkUtils = require('./network_utils')
const $sourceMapUtils = require('./source_map_utils')
const fetchScript = (scriptWindow, script) => {
return $networkUtils.fetch(script.relativeUrl, scriptWindow)
.then((contents) => {
return [script, contents]
})
}
const extractSourceMap = ([script, contents]) => {
script.fullyQualifiedUrl = `${window.top.location.origin}${script.relativeUrl}`.replace(/ /g, '%20')
const sourceMap = $sourceMapUtils.extractSourceMap(script, contents)
return $sourceMapUtils.initializeSourceMapConsumer(script, sourceMap)
.return([script, contents])
}
const evalScripts = (specWindow, scripts = []) => {
_.each(scripts, ([script, contents]) => {
specWindow.eval(`${contents}\n//# sourceURL=${script.fullyQualifiedUrl}`)
})
return null
}
const runScriptsFromUrls = (specWindow, scripts) => {
return Bluebird
.map(scripts, (script) => fetchScript(specWindow, script))
.map(extractSourceMap)
.then((scripts) => evalScripts(specWindow, scripts))
}
// Supports either scripts as objects or as async import functions
const runScripts = (specWindow, scripts) => {
// if scripts contains at least one promise
if (scripts.length && typeof scripts[0] === 'function') {
// chain the loading promises
// NOTE: since in evalScripts, scripts are evaluated in order,
// we chose to respect this constraint here too.
// indeed _.each goes through the array in order
return Bluebird.each(scripts, (script) => script())
}
return runScriptsFromUrls(specWindow, scripts)
}
module.exports = {
runScripts,
}