diff options
Diffstat (limited to 'vnfmarket/src/main/webapp/vnfmarket/node_modules/karma/lib/middleware/karma.js')
-rw-r--r-- | vnfmarket/src/main/webapp/vnfmarket/node_modules/karma/lib/middleware/karma.js | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/karma/lib/middleware/karma.js b/vnfmarket/src/main/webapp/vnfmarket/node_modules/karma/lib/middleware/karma.js new file mode 100644 index 00000000..a9186fa6 --- /dev/null +++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/karma/lib/middleware/karma.js @@ -0,0 +1,176 @@ +/** + * Karma middleware is responsible for serving: + * - client.html (the entrypoint for capturing a browser) + * - debug.html + * - context.html (the execution context, loaded within an iframe) + * - karma.js + * + * The main part is generating context.html, as it contains: + * - generating mappings + * - including <script> and <link> tags + * - setting propert caching headers + */ + +var path = require('path') +var util = require('util') +var url = require('url') + +var urlparse = function (urlStr) { + var urlObj = url.parse(urlStr, true) + urlObj.query = urlObj.query || {} + return urlObj +} + +var common = require('./common') + +var VERSION = require('../constants').VERSION +var SCRIPT_TAG = '<script type="%s" src="%s"></script>' +var LINK_TAG_CSS = '<link type="text/css" href="%s" rel="stylesheet">' +var LINK_TAG_HTML = '<link href="%s" rel="import">' +var SCRIPT_TYPE = { + '.js': 'text/javascript', + '.dart': 'application/dart' +} + +var filePathToUrlPath = function (filePath, basePath) { + if (filePath.indexOf(basePath) === 0) { + return '/base' + filePath.substr(basePath.length) + } + + return '/absolute' + filePath +} + +var getXUACompatibleMetaElement = function (url) { + var tag = '' + var urlObj = urlparse(url) + if (urlObj.query['x-ua-compatible']) { + tag = '\n<meta http-equiv="X-UA-Compatible" content="' + + urlObj.query['x-ua-compatible'] + '"/>' + } + return tag +} + +var getXUACompatibleUrl = function (url) { + var value = '' + var urlObj = urlparse(url) + if (urlObj.query['x-ua-compatible']) { + value = '?x-ua-compatible=' + encodeURIComponent(urlObj.query['x-ua-compatible']) + } + return value +} + +var createKarmaMiddleware = function (filesPromise, serveStaticFile, + /* config.basePath */ basePath, /* config.urlRoot */ urlRoot, /* config.client */ client) { + return function (request, response, next) { + var requestUrl = request.normalizedUrl.replace(/\?.*/, '') + + // redirect /__karma__ to /__karma__ (trailing slash) + if (requestUrl === urlRoot.substr(0, urlRoot.length - 1)) { + response.setHeader('Location', urlRoot) + response.writeHead(301) + return response.end('MOVED PERMANENTLY') + } + + // ignore urls outside urlRoot + if (requestUrl.indexOf(urlRoot) !== 0) { + return next() + } + + // remove urlRoot prefix + requestUrl = requestUrl.substr(urlRoot.length - 1) + + // serve client.html + if (requestUrl === '/') { + return serveStaticFile('/client.html', response, function (data) { + return data + .replace('\n%X_UA_COMPATIBLE%', getXUACompatibleMetaElement(request.url)) + .replace('%X_UA_COMPATIBLE_URL%', getXUACompatibleUrl(request.url)) + }) + } + + // serve karma.js + if (requestUrl === '/karma.js') { + return serveStaticFile(requestUrl, response, function (data) { + return data.replace('%KARMA_URL_ROOT%', urlRoot) + .replace('%KARMA_VERSION%', VERSION) + }) + } + + // serve the favicon + if (requestUrl === '/favicon.ico') { + return serveStaticFile(requestUrl, response) + } + + // serve context.html - execution context within the iframe + // or debug.html - execution context without channel to the server + if (requestUrl === '/context.html' || requestUrl === '/debug.html') { + return filesPromise.then(function (files) { + serveStaticFile(requestUrl, response, function (data) { + common.setNoCacheHeaders(response) + + var scriptTags = files.included.map(function (file) { + var filePath = file.path + var fileExt = path.extname(filePath) + + if (!file.isUrl) { + // TODO(vojta): serve these files from within urlRoot as well + filePath = filePathToUrlPath(filePath, basePath) + + if (requestUrl === '/context.html') { + filePath += '?' + file.sha + } + } + + if (fileExt === '.css') { + return util.format(LINK_TAG_CSS, filePath) + } + + if (fileExt === '.html') { + return util.format(LINK_TAG_HTML, filePath) + } + + return util.format(SCRIPT_TAG, SCRIPT_TYPE[fileExt] || 'text/javascript', filePath) + }) + + // TODO(vojta): don't compute if it's not in the template + var mappings = files.served.map(function (file) { + // Windows paths contain backslashes and generate bad IDs if not escaped + var filePath = filePathToUrlPath(file.path, basePath).replace(/\\/g, '\\\\') + + return util.format(" '%s': '%s'", filePath, file.sha) + }) + + var clientConfig = '' + + if (requestUrl === '/debug.html') { + clientConfig = 'window.__karma__.config = ' + JSON.stringify(client) + ';\n' + } + + mappings = 'window.__karma__.files = {\n' + mappings.join(',\n') + '\n};\n' + + return data + .replace('%SCRIPTS%', scriptTags.join('\n')) + .replace('%CLIENT_CONFIG%', clientConfig) + .replace('%MAPPINGS%', mappings) + .replace('\n%X_UA_COMPATIBLE%', getXUACompatibleMetaElement(request.url)) + }) + }, function (errorFiles) { + serveStaticFile(requestUrl, response, function (data) { + common.setNoCacheHeaders(response) + return data.replace('%SCRIPTS%', '').replace('%CLIENT_CONFIG%', '').replace('%MAPPINGS%', + 'window.__karma__.error("TEST RUN WAS CANCELLED because ' + + (errorFiles.length > 1 ? 'these files contain' : 'this file contains') + + ' some errors:\\n ' + errorFiles.join('\\n ') + '");') + }) + }) + } + + return next() + } +} + +createKarmaMiddleware.$inject = ['filesPromise', 'serveStaticFile', + 'config.basePath', 'config.urlRoot', 'config.client'] + +// PUBLIC API +exports.create = createKarmaMiddleware |