testcafe
Version:
Automated browser testing for the modern web development stack.
76 lines • 10.6 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.assertRoleUrl = exports.assertBaseUrl = exports.assertPageUrl = exports.prepareBaseUrl = exports.getUrl = exports.resolveRelativeUrl = exports.isRelative = void 0;
const url_1 = require("url");
const os_family_1 = __importDefault(require("os-family"));
const runtime_1 = require("../errors/runtime");
const types_1 = require("../errors/types");
const testcafe_hammerhead_1 = require("testcafe-hammerhead");
const path_1 = require("path");
const PROTOCOL_RE = /^([\w-]+?)(?=:\/\/)/;
const SUPPORTED_PROTOCOL_RE = /^(https?|file):/;
const IMPLICIT_PROTOCOL_RE = /^\/\//;
const ABSOLUTE_PATH_RE = /^\/[^/]/;
const WIN_ABSOLUTE_PATH_RE = /^\w:[/\\]/;
const RELATIVE_PATH_RE = /^\.\.?[/\\]/;
function isRelative(url) {
return RELATIVE_PATH_RE.test(url);
}
exports.isRelative = isRelative;
function isAbsolute(url) {
// NOTE: path.isAbsolute treats the '//example.com' path as absolute
return os_family_1.default.win ? WIN_ABSOLUTE_PATH_RE.test(url) : ABSOLUTE_PATH_RE.test(url);
}
function resolveRelativeUrl(path, base) {
const url = new url_1.URL(path, base);
return url.toString();
}
exports.resolveRelativeUrl = resolveRelativeUrl;
function ensureProtocol(url) {
if (SUPPORTED_PROTOCOL_RE.test(url) || url === testcafe_hammerhead_1.SPECIAL_BLANK_PAGE)
return url;
const protocol = IMPLICIT_PROTOCOL_RE.test(url) ? 'http:' : 'http://';
return protocol + url;
}
function getUrl(url, base) {
if (isRelative(url)) {
if (!base)
throw new Error('Relative urls require a base path');
return resolveRelativeUrl(url, base);
}
if (isAbsolute(url))
return (0, url_1.pathToFileURL)(url).toString();
return ensureProtocol(url);
}
exports.getUrl = getUrl;
function prepareBaseUrl(url) {
url = (0, path_1.join)(url, '/');
return isAbsolute(url) ? (0, url_1.pathToFileURL)(url) : new url_1.URL(url);
}
exports.prepareBaseUrl = prepareBaseUrl;
function assertPageUrl(url, callsiteName) {
assertProtocol(url, callsiteName, 'test page URL');
}
exports.assertPageUrl = assertPageUrl;
function assertProtocol(url, callsiteName, what) {
const protocol = url.match(PROTOCOL_RE);
const hasUnsupportedProtocol = protocol && !SUPPORTED_PROTOCOL_RE.test(url);
const isWinAbsolutePath = os_family_1.default.win && WIN_ABSOLUTE_PATH_RE.test(url);
if (hasUnsupportedProtocol && !isWinAbsolutePath && url !== testcafe_hammerhead_1.SPECIAL_BLANK_PAGE)
throw new runtime_1.APIError(callsiteName, types_1.RUNTIME_ERRORS.unsupportedUrlProtocol, what, url, what, protocol && protocol[0]);
}
function assertBaseUrl(url, callsiteName) {
if (isRelative(url))
throw new runtime_1.APIError(callsiteName, types_1.RUNTIME_ERRORS.relativeBaseUrl, url);
assertProtocol(url, callsiteName, 'base URL');
}
exports.assertBaseUrl = assertBaseUrl;
function assertRoleUrl(url, callsiteName) {
if (isRelative(url))
throw new runtime_1.APIError(callsiteName, types_1.RUNTIME_ERRORS.roleInitializedWithRelativeUrl);
}
exports.assertRoleUrl = assertRoleUrl;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1wYWdlLXVybC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvdGVzdC1wYWdlLXVybC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw2QkFBeUM7QUFDekMsMERBQTJCO0FBQzNCLCtDQUE2QztBQUM3QywyQ0FBaUQ7QUFDakQsNkRBQXlEO0FBQ3pELCtCQUE0QjtBQUU1QixNQUFNLFdBQVcsR0FBYSxxQkFBcUIsQ0FBQztBQUNwRCxNQUFNLHFCQUFxQixHQUFHLGlCQUFpQixDQUFDO0FBQ2hELE1BQU0sb0JBQW9CLEdBQUksT0FBTyxDQUFDO0FBQ3RDLE1BQU0sZ0JBQWdCLEdBQVEsU0FBUyxDQUFDO0FBQ3hDLE1BQU0sb0JBQW9CLEdBQUksV0FBVyxDQUFDO0FBQzFDLE1BQU0sZ0JBQWdCLEdBQVEsYUFBYSxDQUFDO0FBRTVDLFNBQWdCLFVBQVUsQ0FBRSxHQUFXO0lBQ25DLE9BQU8sZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RDLENBQUM7QUFGRCxnQ0FFQztBQUVELFNBQVMsVUFBVSxDQUFFLEdBQVc7SUFDNUIsb0VBQW9FO0lBQ3BFLE9BQU8sbUJBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hGLENBQUM7QUFFRCxTQUFnQixrQkFBa0IsQ0FBRSxJQUFZLEVBQUUsSUFBUztJQUN2RCxNQUFNLEdBQUcsR0FBRyxJQUFJLFNBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFFaEMsT0FBTyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDMUIsQ0FBQztBQUpELGdEQUlDO0FBRUQsU0FBUyxjQUFjLENBQUUsR0FBVztJQUNoQyxJQUFJLHFCQUFxQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEtBQUssd0NBQWtCO1FBQzdELE9BQU8sR0FBRyxDQUFDO0lBRWYsTUFBTSxRQUFRLEdBQUcsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUV0RSxPQUFPLFFBQVEsR0FBRyxHQUFHLENBQUM7QUFDMUIsQ0FBQztBQUVELFNBQWdCLE1BQU0sQ0FBRSxHQUFXLEVBQUUsSUFBVTtJQUMzQyxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUNqQixJQUFJLENBQUMsSUFBSTtZQUNMLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztRQUV6RCxPQUFPLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztLQUN4QztJQUVELElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQztRQUNmLE9BQU8sSUFBQSxtQkFBYSxFQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBRXpDLE9BQU8sY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQy9CLENBQUM7QUFaRCx3QkFZQztBQUVELFNBQWdCLGNBQWMsQ0FBRSxHQUFXO0lBQ3ZDLEdBQUcsR0FBRyxJQUFBLFdBQUksRUFBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDckIsT0FBTyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUEsbUJBQWEsRUFBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxTQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDL0QsQ0FBQztBQUhELHdDQUdDO0FBRUQsU0FBZ0IsYUFBYSxDQUFFLEdBQVcsRUFBRSxZQUFvQjtJQUM1RCxjQUFjLENBQUMsR0FBRyxFQUFFLFlBQVksRUFBRSxlQUFlLENBQUMsQ0FBQztBQUN2RCxDQUFDO0FBRkQsc0NBRUM7QUFFRCxTQUFTLGNBQWMsQ0FBRSxHQUFXLEVBQUUsWUFBb0IsRUFBRSxJQUFZO0lBQ3BFLE1BQU0sUUFBUSxHQUFpQixHQUFHLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3RELE1BQU0sc0JBQXNCLEdBQUcsUUFBUSxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzVFLE1BQU0saUJBQWlCLEdBQVEsbUJBQUUsQ0FBQyxHQUFHLElBQUksb0JBQW9CLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRXhFLElBQUksc0JBQXNCLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxHQUFHLEtBQUssd0NBQWtCO1FBQzFFLE1BQU0sSUFBSSxrQkFBUSxDQUFDLFlBQVksRUFBRSxzQkFBYyxDQUFDLHNCQUFzQixFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFFBQVEsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxSCxDQUFDO0FBRUQsU0FBZ0IsYUFBYSxDQUFFLEdBQVcsRUFBRSxZQUFvQjtJQUM1RCxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUM7UUFDZixNQUFNLElBQUksa0JBQVEsQ0FBQyxZQUFZLEVBQUUsc0JBQWMsQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFFMUUsY0FBYyxDQUFDLEdBQUcsRUFBRSxZQUFZLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDbEQsQ0FBQztBQUxELHNDQUtDO0FBRUQsU0FBZ0IsYUFBYSxDQUFFLEdBQVcsRUFBRSxZQUFvQjtJQUM1RCxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUM7UUFDZixNQUFNLElBQUksa0JBQVEsQ0FBQyxZQUFZLEVBQUUsc0JBQWMsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO0FBQ3hGLENBQUM7QUFIRCxzQ0FHQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFVSTCwgcGF0aFRvRmlsZVVSTCB9IGZyb20gJ3VybCc7XG5pbXBvcnQgT1MgZnJvbSAnb3MtZmFtaWx5JztcbmltcG9ydCB7IEFQSUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL3J1bnRpbWUnO1xuaW1wb3J0IHsgUlVOVElNRV9FUlJPUlMgfSBmcm9tICcuLi9lcnJvcnMvdHlwZXMnO1xuaW1wb3J0IHsgU1BFQ0lBTF9CTEFOS19QQUdFIH0gZnJvbSAndGVzdGNhZmUtaGFtbWVyaGVhZCc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAncGF0aCc7XG5cbmNvbnN0IFBST1RPQ09MX1JFICAgICAgICAgICA9IC9eKFtcXHctXSs/KSg/PTpcXC9cXC8pLztcbmNvbnN0IFNVUFBPUlRFRF9QUk9UT0NPTF9SRSA9IC9eKGh0dHBzP3xmaWxlKTovO1xuY29uc3QgSU1QTElDSVRfUFJPVE9DT0xfUkUgID0gL15cXC9cXC8vO1xuY29uc3QgQUJTT0xVVEVfUEFUSF9SRSAgICAgID0gL15cXC9bXi9dLztcbmNvbnN0IFdJTl9BQlNPTFVURV9QQVRIX1JFICA9IC9eXFx3OlsvXFxcXF0vO1xuY29uc3QgUkVMQVRJVkVfUEFUSF9SRSAgICAgID0gL15cXC5cXC4/Wy9cXFxcXS87XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1JlbGF0aXZlICh1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBSRUxBVElWRV9QQVRIX1JFLnRlc3QodXJsKTtcbn1cblxuZnVuY3Rpb24gaXNBYnNvbHV0ZSAodXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBOT1RFOiBwYXRoLmlzQWJzb2x1dGUgdHJlYXRzIHRoZSAnLy9leGFtcGxlLmNvbScgcGF0aCBhcyBhYnNvbHV0ZVxuICAgIHJldHVybiBPUy53aW4gPyBXSU5fQUJTT0xVVEVfUEFUSF9SRS50ZXN0KHVybCkgOiBBQlNPTFVURV9QQVRIX1JFLnRlc3QodXJsKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVSZWxhdGl2ZVVybCAocGF0aDogc3RyaW5nLCBiYXNlOiBVUkwpOiBzdHJpbmcge1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocGF0aCwgYmFzZSk7XG5cbiAgICByZXR1cm4gdXJsLnRvU3RyaW5nKCk7XG59XG5cbmZ1bmN0aW9uIGVuc3VyZVByb3RvY29sICh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKFNVUFBPUlRFRF9QUk9UT0NPTF9SRS50ZXN0KHVybCkgfHwgdXJsID09PSBTUEVDSUFMX0JMQU5LX1BBR0UpXG4gICAgICAgIHJldHVybiB1cmw7XG5cbiAgICBjb25zdCBwcm90b2NvbCA9IElNUExJQ0lUX1BST1RPQ09MX1JFLnRlc3QodXJsKSA/ICdodHRwOicgOiAnaHR0cDovLyc7XG5cbiAgICByZXR1cm4gcHJvdG9jb2wgKyB1cmw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRVcmwgKHVybDogc3RyaW5nLCBiYXNlPzogVVJMKTogc3RyaW5nIHtcbiAgICBpZiAoaXNSZWxhdGl2ZSh1cmwpKSB7XG4gICAgICAgIGlmICghYmFzZSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVsYXRpdmUgdXJscyByZXF1aXJlIGEgYmFzZSBwYXRoJyk7XG5cbiAgICAgICAgcmV0dXJuIHJlc29sdmVSZWxhdGl2ZVVybCh1cmwsIGJhc2UpO1xuICAgIH1cblxuICAgIGlmIChpc0Fic29sdXRlKHVybCkpXG4gICAgICAgIHJldHVybiBwYXRoVG9GaWxlVVJMKHVybCkudG9TdHJpbmcoKTtcblxuICAgIHJldHVybiBlbnN1cmVQcm90b2NvbCh1cmwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZUJhc2VVcmwgKHVybDogc3RyaW5nKTogVVJMIHtcbiAgICB1cmwgPSBqb2luKHVybCwgJy8nKTtcbiAgICByZXR1cm4gaXNBYnNvbHV0ZSh1cmwpID8gcGF0aFRvRmlsZVVSTCh1cmwpIDogbmV3IFVSTCh1cmwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0UGFnZVVybCAodXJsOiBzdHJpbmcsIGNhbGxzaXRlTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgYXNzZXJ0UHJvdG9jb2wodXJsLCBjYWxsc2l0ZU5hbWUsICd0ZXN0IHBhZ2UgVVJMJyk7XG59XG5cbmZ1bmN0aW9uIGFzc2VydFByb3RvY29sICh1cmw6IHN0cmluZywgY2FsbHNpdGVOYW1lOiBzdHJpbmcsIHdoYXQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHByb3RvY29sICAgICAgICAgICAgICAgPSB1cmwubWF0Y2goUFJPVE9DT0xfUkUpO1xuICAgIGNvbnN0IGhhc1Vuc3VwcG9ydGVkUHJvdG9jb2wgPSBwcm90b2NvbCAmJiAhU1VQUE9SVEVEX1BST1RPQ09MX1JFLnRlc3QodXJsKTtcbiAgICBjb25zdCBpc1dpbkFic29sdXRlUGF0aCAgICAgID0gT1Mud2luICYmIFdJTl9BQlNPTFVURV9QQVRIX1JFLnRlc3QodXJsKTtcblxuICAgIGlmIChoYXNVbnN1cHBvcnRlZFByb3RvY29sICYmICFpc1dpbkFic29sdXRlUGF0aCAmJiB1cmwgIT09IFNQRUNJQUxfQkxBTktfUEFHRSlcbiAgICAgICAgdGhyb3cgbmV3IEFQSUVycm9yKGNhbGxzaXRlTmFtZSwgUlVOVElNRV9FUlJPUlMudW5zdXBwb3J0ZWRVcmxQcm90b2NvbCwgd2hhdCwgdXJsLCB3aGF0LCBwcm90b2NvbCAmJiBwcm90b2NvbFswXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRCYXNlVXJsICh1cmw6IHN0cmluZywgY2FsbHNpdGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoaXNSZWxhdGl2ZSh1cmwpKVxuICAgICAgICB0aHJvdyBuZXcgQVBJRXJyb3IoY2FsbHNpdGVOYW1lLCBSVU5USU1FX0VSUk9SUy5yZWxhdGl2ZUJhc2VVcmwsIHVybCk7XG5cbiAgICBhc3NlcnRQcm90b2NvbCh1cmwsIGNhbGxzaXRlTmFtZSwgJ2Jhc2UgVVJMJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRSb2xlVXJsICh1cmw6IHN0cmluZywgY2FsbHNpdGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoaXNSZWxhdGl2ZSh1cmwpKVxuICAgICAgICB0aHJvdyBuZXcgQVBJRXJyb3IoY2FsbHNpdGVOYW1lLCBSVU5USU1FX0VSUk9SUy5yb2xlSW5pdGlhbGl6ZWRXaXRoUmVsYXRpdmVVcmwpO1xufVxuIl19