"use strict"; 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); } else 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1wYWdlLXVybC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvdGVzdC1wYWdlLXVybC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw2QkFBeUM7QUFDekMsMERBQTJCO0FBQzNCLCtDQUE2QztBQUM3QywyQ0FBaUQ7QUFDakQsNkRBQXlEO0FBQ3pELCtCQUE0QjtBQUU1QixNQUFNLFdBQVcsR0FBYSxxQkFBcUIsQ0FBQztBQUNwRCxNQUFNLHFCQUFxQixHQUFHLGlCQUFpQixDQUFDO0FBQ2hELE1BQU0sb0JBQW9CLEdBQUksT0FBTyxDQUFDO0FBQ3RDLE1BQU0sZ0JBQWdCLEdBQVEsU0FBUyxDQUFDO0FBQ3hDLE1BQU0sb0JBQW9CLEdBQUksV0FBVyxDQUFDO0FBQzFDLE1BQU0sZ0JBQWdCLEdBQVEsYUFBYSxDQUFDO0FBRTVDLFNBQWdCLFVBQVUsQ0FBRSxHQUFXO0lBQ25DLE9BQU8sZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RDLENBQUM7QUFGRCxnQ0FFQztBQUVELFNBQVMsVUFBVSxDQUFFLEdBQVc7SUFDNUIsb0VBQW9FO0lBQ3BFLE9BQU8sbUJBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hGLENBQUM7QUFFRCxTQUFnQixrQkFBa0IsQ0FBRSxJQUFZLEVBQUUsSUFBUztJQUN2RCxNQUFNLEdBQUcsR0FBRyxJQUFJLFNBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFFaEMsT0FBTyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDMUIsQ0FBQztBQUpELGdEQUlDO0FBRUQsU0FBUyxjQUFjLENBQUUsR0FBVztJQUNoQyxJQUFJLHFCQUFxQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEtBQUssd0NBQWtCO1FBQzdELE9BQU8sR0FBRyxDQUFDO0lBRWYsTUFBTSxRQUFRLEdBQUcsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUV0RSxPQUFPLFFBQVEsR0FBRyxHQUFHLENBQUM7QUFDMUIsQ0FBQztBQUVELFNBQWdCLE1BQU0sQ0FBRSxHQUFXLEVBQUUsSUFBVTtJQUMzQyxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUNqQixJQUFJLENBQUMsSUFBSTtZQUNMLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztRQUV6RCxPQUFPLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztLQUN4QztTQUVJLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQztRQUNwQixPQUFPLElBQUEsbUJBQWEsRUFBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUV6QyxPQUFPLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMvQixDQUFDO0FBWkQsd0JBWUM7QUFFRCxTQUFnQixjQUFjLENBQUUsR0FBVztJQUN2QyxHQUFHLEdBQUcsSUFBQSxXQUFJLEVBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3JCLE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFBLG1CQUFhLEVBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFIRCx3Q0FHQztBQUVELFNBQWdCLGFBQWEsQ0FBRSxHQUFXLEVBQUUsWUFBb0I7SUFDNUQsY0FBYyxDQUFDLEdBQUcsRUFBRSxZQUFZLEVBQUUsZUFBZSxDQUFDLENBQUM7QUFDdkQsQ0FBQztBQUZELHNDQUVDO0FBRUQsU0FBUyxjQUFjLENBQUUsR0FBVyxFQUFFLFlBQW9CLEVBQUUsSUFBWTtJQUNwRSxNQUFNLFFBQVEsR0FBaUIsR0FBRyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN0RCxNQUFNLHNCQUFzQixHQUFHLFFBQVEsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM1RSxNQUFNLGlCQUFpQixHQUFRLG1CQUFFLENBQUMsR0FBRyxJQUFJLG9CQUFvQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUV4RSxJQUFJLHNCQUFzQixJQUFJLENBQUMsaUJBQWlCLElBQUksR0FBRyxLQUFLLHdDQUFrQjtRQUMxRSxNQUFNLElBQUksa0JBQVEsQ0FBQyxZQUFZLEVBQUUsc0JBQWMsQ0FBQyxzQkFBc0IsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxRQUFRLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUgsQ0FBQztBQUVELFNBQWdCLGFBQWEsQ0FBRSxHQUFXLEVBQUUsWUFBb0I7SUFDNUQsSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDO1FBQ2YsTUFBTSxJQUFJLGtCQUFRLENBQUMsWUFBWSxFQUFFLHNCQUFjLENBQUMsZUFBZSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBRTFFLGNBQWMsQ0FBQyxHQUFHLEVBQUUsWUFBWSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ2xELENBQUM7QUFMRCxzQ0FLQztBQUVELFNBQWdCLGFBQWEsQ0FBRSxHQUFXLEVBQUUsWUFBb0I7SUFDNUQsSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDO1FBQ2YsTUFBTSxJQUFJLGtCQUFRLENBQUMsWUFBWSxFQUFFLHNCQUFjLENBQUMsOEJBQThCLENBQUMsQ0FBQztBQUN4RixDQUFDO0FBSEQsc0NBR0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBVUkwsIHBhdGhUb0ZpbGVVUkwgfSBmcm9tICd1cmwnO1xuaW1wb3J0IE9TIGZyb20gJ29zLWZhbWlseSc7XG5pbXBvcnQgeyBBUElFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9ydW50aW1lJztcbmltcG9ydCB7IFJVTlRJTUVfRVJST1JTIH0gZnJvbSAnLi4vZXJyb3JzL3R5cGVzJztcbmltcG9ydCB7IFNQRUNJQUxfQkxBTktfUEFHRSB9IGZyb20gJ3Rlc3RjYWZlLWhhbW1lcmhlYWQnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ3BhdGgnO1xuXG5jb25zdCBQUk9UT0NPTF9SRSAgICAgICAgICAgPSAvXihbXFx3LV0rPykoPz06XFwvXFwvKS87XG5jb25zdCBTVVBQT1JURURfUFJPVE9DT0xfUkUgPSAvXihodHRwcz98ZmlsZSk6LztcbmNvbnN0IElNUExJQ0lUX1BST1RPQ09MX1JFICA9IC9eXFwvXFwvLztcbmNvbnN0IEFCU09MVVRFX1BBVEhfUkUgICAgICA9IC9eXFwvW14vXS87XG5jb25zdCBXSU5fQUJTT0xVVEVfUEFUSF9SRSAgPSAvXlxcdzpbL1xcXFxdLztcbmNvbnN0IFJFTEFUSVZFX1BBVEhfUkUgICAgICA9IC9eXFwuXFwuP1svXFxcXF0vO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNSZWxhdGl2ZSAodXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gUkVMQVRJVkVfUEFUSF9SRS50ZXN0KHVybCk7XG59XG5cbmZ1bmN0aW9uIGlzQWJzb2x1dGUgKHVybDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8gTk9URTogcGF0aC5pc0Fic29sdXRlIHRyZWF0cyB0aGUgJy8vZXhhbXBsZS5jb20nIHBhdGggYXMgYWJzb2x1dGVcbiAgICByZXR1cm4gT1Mud2luID8gV0lOX0FCU09MVVRFX1BBVEhfUkUudGVzdCh1cmwpIDogQUJTT0xVVEVfUEFUSF9SRS50ZXN0KHVybCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUmVsYXRpdmVVcmwgKHBhdGg6IHN0cmluZywgYmFzZTogVVJMKTogc3RyaW5nIHtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHBhdGgsIGJhc2UpO1xuXG4gICAgcmV0dXJuIHVybC50b1N0cmluZygpO1xufVxuXG5mdW5jdGlvbiBlbnN1cmVQcm90b2NvbCAodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChTVVBQT1JURURfUFJPVE9DT0xfUkUudGVzdCh1cmwpIHx8IHVybCA9PT0gU1BFQ0lBTF9CTEFOS19QQUdFKVxuICAgICAgICByZXR1cm4gdXJsO1xuXG4gICAgY29uc3QgcHJvdG9jb2wgPSBJTVBMSUNJVF9QUk9UT0NPTF9SRS50ZXN0KHVybCkgPyAnaHR0cDonIDogJ2h0dHA6Ly8nO1xuXG4gICAgcmV0dXJuIHByb3RvY29sICsgdXJsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VXJsICh1cmw6IHN0cmluZywgYmFzZT86IFVSTCk6IHN0cmluZyB7XG4gICAgaWYgKGlzUmVsYXRpdmUodXJsKSkge1xuICAgICAgICBpZiAoIWJhc2UpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlbGF0aXZlIHVybHMgcmVxdWlyZSBhIGJhc2UgcGF0aCcpO1xuXG4gICAgICAgIHJldHVybiByZXNvbHZlUmVsYXRpdmVVcmwodXJsLCBiYXNlKTtcbiAgICB9XG5cbiAgICBlbHNlIGlmIChpc0Fic29sdXRlKHVybCkpXG4gICAgICAgIHJldHVybiBwYXRoVG9GaWxlVVJMKHVybCkudG9TdHJpbmcoKTtcblxuICAgIHJldHVybiBlbnN1cmVQcm90b2NvbCh1cmwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZUJhc2VVcmwgKHVybDogc3RyaW5nKTogVVJMIHtcbiAgICB1cmwgPSBqb2luKHVybCwgJy8nKTtcbiAgICByZXR1cm4gaXNBYnNvbHV0ZSh1cmwpID8gcGF0aFRvRmlsZVVSTCh1cmwpIDogbmV3IFVSTCh1cmwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0UGFnZVVybCAodXJsOiBzdHJpbmcsIGNhbGxzaXRlTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgYXNzZXJ0UHJvdG9jb2wodXJsLCBjYWxsc2l0ZU5hbWUsICd0ZXN0IHBhZ2UgVVJMJyk7XG59XG5cbmZ1bmN0aW9uIGFzc2VydFByb3RvY29sICh1cmw6IHN0cmluZywgY2FsbHNpdGVOYW1lOiBzdHJpbmcsIHdoYXQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHByb3RvY29sICAgICAgICAgICAgICAgPSB1cmwubWF0Y2goUFJPVE9DT0xfUkUpO1xuICAgIGNvbnN0IGhhc1Vuc3VwcG9ydGVkUHJvdG9jb2wgPSBwcm90b2NvbCAmJiAhU1VQUE9SVEVEX1BST1RPQ09MX1JFLnRlc3QodXJsKTtcbiAgICBjb25zdCBpc1dpbkFic29sdXRlUGF0aCAgICAgID0gT1Mud2luICYmIFdJTl9BQlNPTFVURV9QQVRIX1JFLnRlc3QodXJsKTtcblxuICAgIGlmIChoYXNVbnN1cHBvcnRlZFByb3RvY29sICYmICFpc1dpbkFic29sdXRlUGF0aCAmJiB1cmwgIT09IFNQRUNJQUxfQkxBTktfUEFHRSlcbiAgICAgICAgdGhyb3cgbmV3IEFQSUVycm9yKGNhbGxzaXRlTmFtZSwgUlVOVElNRV9FUlJPUlMudW5zdXBwb3J0ZWRVcmxQcm90b2NvbCwgd2hhdCwgdXJsLCB3aGF0LCBwcm90b2NvbCAmJiBwcm90b2NvbFswXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRCYXNlVXJsICh1cmw6IHN0cmluZywgY2FsbHNpdGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoaXNSZWxhdGl2ZSh1cmwpKVxuICAgICAgICB0aHJvdyBuZXcgQVBJRXJyb3IoY2FsbHNpdGVOYW1lLCBSVU5USU1FX0VSUk9SUy5yZWxhdGl2ZUJhc2VVcmwsIHVybCk7XG5cbiAgICBhc3NlcnRQcm90b2NvbCh1cmwsIGNhbGxzaXRlTmFtZSwgJ2Jhc2UgVVJMJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRSb2xlVXJsICh1cmw6IHN0cmluZywgY2FsbHNpdGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoaXNSZWxhdGl2ZSh1cmwpKVxuICAgICAgICB0aHJvdyBuZXcgQVBJRXJyb3IoY2FsbHNpdGVOYW1lLCBSVU5USU1FX0VSUk9SUy5yb2xlSW5pdGlhbGl6ZWRXaXRoUmVsYXRpdmVVcmwpO1xufVxuIl19