UNPKG

testcafe

Version:

Automated browser testing for the modern web development stack.

76 lines 10.6 kB
"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 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) { if (!url.endsWith('/')) 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1wYWdlLXVybC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvdGVzdC1wYWdlLXVybC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw2QkFBeUM7QUFDekMsMERBQTJCO0FBQzNCLCtDQUE2QztBQUM3QywyQ0FBaUQ7QUFDakQsNkRBQXlEO0FBRXpELE1BQU0sV0FBVyxHQUFhLHFCQUFxQixDQUFDO0FBQ3BELE1BQU0scUJBQXFCLEdBQUcsaUJBQWlCLENBQUM7QUFDaEQsTUFBTSxvQkFBb0IsR0FBSSxPQUFPLENBQUM7QUFDdEMsTUFBTSxnQkFBZ0IsR0FBUSxTQUFTLENBQUM7QUFDeEMsTUFBTSxvQkFBb0IsR0FBSSxXQUFXLENBQUM7QUFDMUMsTUFBTSxnQkFBZ0IsR0FBUSxhQUFhLENBQUM7QUFFNUMsU0FBZ0IsVUFBVSxDQUFFLEdBQVc7SUFDbkMsT0FBTyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEMsQ0FBQztBQUZELGdDQUVDO0FBRUQsU0FBUyxVQUFVLENBQUUsR0FBVztJQUM1QixvRUFBb0U7SUFDcEUsT0FBTyxtQkFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEYsQ0FBQztBQUVELFNBQWdCLGtCQUFrQixDQUFFLElBQVksRUFBRSxJQUFTO0lBQ3ZELE1BQU0sR0FBRyxHQUFHLElBQUksU0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUVoQyxPQUFPLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUMxQixDQUFDO0FBSkQsZ0RBSUM7QUFFRCxTQUFTLGNBQWMsQ0FBRSxHQUFXO0lBQ2hDLElBQUkscUJBQXFCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsS0FBSyx3Q0FBa0I7UUFDN0QsT0FBTyxHQUFHLENBQUM7SUFFZixNQUFNLFFBQVEsR0FBRyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBRXRFLE9BQU8sUUFBUSxHQUFHLEdBQUcsQ0FBQztBQUMxQixDQUFDO0FBRUQsU0FBZ0IsTUFBTSxDQUFFLEdBQVcsRUFBRSxJQUFVO0lBQzNDLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ2pCLElBQUksQ0FBQyxJQUFJO1lBQ0wsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1FBRXpELE9BQU8sa0JBQWtCLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQ3hDO0lBRUQsSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDO1FBQ2YsT0FBTyxJQUFBLG1CQUFhLEVBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7SUFFekMsT0FBTyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDL0IsQ0FBQztBQVpELHdCQVlDO0FBRUQsU0FBZ0IsY0FBYyxDQUFFLEdBQVc7SUFDdkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1FBQ2xCLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFFZixPQUFPLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBQSxtQkFBYSxFQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFNBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBTEQsd0NBS0M7QUFFRCxTQUFnQixhQUFhLENBQUUsR0FBVyxFQUFFLFlBQW9CO0lBQzVELGNBQWMsQ0FBQyxHQUFHLEVBQUUsWUFBWSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0FBQ3ZELENBQUM7QUFGRCxzQ0FFQztBQUVELFNBQVMsY0FBYyxDQUFFLEdBQVcsRUFBRSxZQUFvQixFQUFFLElBQVk7SUFDcEUsTUFBTSxRQUFRLEdBQWlCLEdBQUcsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDdEQsTUFBTSxzQkFBc0IsR0FBRyxRQUFRLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDNUUsTUFBTSxpQkFBaUIsR0FBUSxtQkFBRSxDQUFDLEdBQUcsSUFBSSxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFeEUsSUFBSSxzQkFBc0IsSUFBSSxDQUFDLGlCQUFpQixJQUFJLEdBQUcsS0FBSyx3Q0FBa0I7UUFDMUUsTUFBTSxJQUFJLGtCQUFRLENBQUMsWUFBWSxFQUFFLHNCQUFjLENBQUMsc0JBQXNCLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsUUFBUSxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFILENBQUM7QUFFRCxTQUFnQixhQUFhLENBQUUsR0FBVyxFQUFFLFlBQW9CO0lBQzVELElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQztRQUNmLE1BQU0sSUFBSSxrQkFBUSxDQUFDLFlBQVksRUFBRSxzQkFBYyxDQUFDLGVBQWUsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUUxRSxjQUFjLENBQUMsR0FBRyxFQUFFLFlBQVksRUFBRSxVQUFVLENBQUMsQ0FBQztBQUNsRCxDQUFDO0FBTEQsc0NBS0M7QUFFRCxTQUFnQixhQUFhLENBQUUsR0FBVyxFQUFFLFlBQW9CO0lBQzVELElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQztRQUNmLE1BQU0sSUFBSSxrQkFBUSxDQUFDLFlBQVksRUFBRSxzQkFBYyxDQUFDLDhCQUE4QixDQUFDLENBQUM7QUFDeEYsQ0FBQztBQUhELHNDQUdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVVJMLCBwYXRoVG9GaWxlVVJMIH0gZnJvbSAndXJsJztcbmltcG9ydCBPUyBmcm9tICdvcy1mYW1pbHknO1xuaW1wb3J0IHsgQVBJRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvcnVudGltZSc7XG5pbXBvcnQgeyBSVU5USU1FX0VSUk9SUyB9IGZyb20gJy4uL2Vycm9ycy90eXBlcyc7XG5pbXBvcnQgeyBTUEVDSUFMX0JMQU5LX1BBR0UgfSBmcm9tICd0ZXN0Y2FmZS1oYW1tZXJoZWFkJztcblxuY29uc3QgUFJPVE9DT0xfUkUgICAgICAgICAgID0gL14oW1xcdy1dKz8pKD89OlxcL1xcLykvO1xuY29uc3QgU1VQUE9SVEVEX1BST1RPQ09MX1JFID0gL14oaHR0cHM/fGZpbGUpOi87XG5jb25zdCBJTVBMSUNJVF9QUk9UT0NPTF9SRSAgPSAvXlxcL1xcLy87XG5jb25zdCBBQlNPTFVURV9QQVRIX1JFICAgICAgPSAvXlxcL1teL10vO1xuY29uc3QgV0lOX0FCU09MVVRFX1BBVEhfUkUgID0gL15cXHc6Wy9cXFxcXS87XG5jb25zdCBSRUxBVElWRV9QQVRIX1JFICAgICAgPSAvXlxcLlxcLj9bL1xcXFxdLztcblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVsYXRpdmUgKHVybDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIFJFTEFUSVZFX1BBVEhfUkUudGVzdCh1cmwpO1xufVxuXG5mdW5jdGlvbiBpc0Fic29sdXRlICh1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vIE5PVEU6IHBhdGguaXNBYnNvbHV0ZSB0cmVhdHMgdGhlICcvL2V4YW1wbGUuY29tJyBwYXRoIGFzIGFic29sdXRlXG4gICAgcmV0dXJuIE9TLndpbiA/IFdJTl9BQlNPTFVURV9QQVRIX1JFLnRlc3QodXJsKSA6IEFCU09MVVRFX1BBVEhfUkUudGVzdCh1cmwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVJlbGF0aXZlVXJsIChwYXRoOiBzdHJpbmcsIGJhc2U6IFVSTCk6IHN0cmluZyB7XG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChwYXRoLCBiYXNlKTtcblxuICAgIHJldHVybiB1cmwudG9TdHJpbmcoKTtcbn1cblxuZnVuY3Rpb24gZW5zdXJlUHJvdG9jb2wgKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoU1VQUE9SVEVEX1BST1RPQ09MX1JFLnRlc3QodXJsKSB8fCB1cmwgPT09IFNQRUNJQUxfQkxBTktfUEFHRSlcbiAgICAgICAgcmV0dXJuIHVybDtcblxuICAgIGNvbnN0IHByb3RvY29sID0gSU1QTElDSVRfUFJPVE9DT0xfUkUudGVzdCh1cmwpID8gJ2h0dHA6JyA6ICdodHRwOi8vJztcblxuICAgIHJldHVybiBwcm90b2NvbCArIHVybDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVybCAodXJsOiBzdHJpbmcsIGJhc2U/OiBVUkwpOiBzdHJpbmcge1xuICAgIGlmIChpc1JlbGF0aXZlKHVybCkpIHtcbiAgICAgICAgaWYgKCFiYXNlKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWxhdGl2ZSB1cmxzIHJlcXVpcmUgYSBiYXNlIHBhdGgnKTtcblxuICAgICAgICByZXR1cm4gcmVzb2x2ZVJlbGF0aXZlVXJsKHVybCwgYmFzZSk7XG4gICAgfVxuXG4gICAgaWYgKGlzQWJzb2x1dGUodXJsKSlcbiAgICAgICAgcmV0dXJuIHBhdGhUb0ZpbGVVUkwodXJsKS50b1N0cmluZygpO1xuXG4gICAgcmV0dXJuIGVuc3VyZVByb3RvY29sKHVybCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmVwYXJlQmFzZVVybCAodXJsOiBzdHJpbmcpOiBVUkwge1xuICAgIGlmICghdXJsLmVuZHNXaXRoKCcvJykpXG4gICAgICAgIHVybCArPSAnLyc7XG5cbiAgICByZXR1cm4gaXNBYnNvbHV0ZSh1cmwpID8gcGF0aFRvRmlsZVVSTCh1cmwpIDogbmV3IFVSTCh1cmwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0UGFnZVVybCAodXJsOiBzdHJpbmcsIGNhbGxzaXRlTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgYXNzZXJ0UHJvdG9jb2wodXJsLCBjYWxsc2l0ZU5hbWUsICd0ZXN0IHBhZ2UgVVJMJyk7XG59XG5cbmZ1bmN0aW9uIGFzc2VydFByb3RvY29sICh1cmw6IHN0cmluZywgY2FsbHNpdGVOYW1lOiBzdHJpbmcsIHdoYXQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHByb3RvY29sICAgICAgICAgICAgICAgPSB1cmwubWF0Y2goUFJPVE9DT0xfUkUpO1xuICAgIGNvbnN0IGhhc1Vuc3VwcG9ydGVkUHJvdG9jb2wgPSBwcm90b2NvbCAmJiAhU1VQUE9SVEVEX1BST1RPQ09MX1JFLnRlc3QodXJsKTtcbiAgICBjb25zdCBpc1dpbkFic29sdXRlUGF0aCAgICAgID0gT1Mud2luICYmIFdJTl9BQlNPTFVURV9QQVRIX1JFLnRlc3QodXJsKTtcblxuICAgIGlmIChoYXNVbnN1cHBvcnRlZFByb3RvY29sICYmICFpc1dpbkFic29sdXRlUGF0aCAmJiB1cmwgIT09IFNQRUNJQUxfQkxBTktfUEFHRSlcbiAgICAgICAgdGhyb3cgbmV3IEFQSUVycm9yKGNhbGxzaXRlTmFtZSwgUlVOVElNRV9FUlJPUlMudW5zdXBwb3J0ZWRVcmxQcm90b2NvbCwgd2hhdCwgdXJsLCB3aGF0LCBwcm90b2NvbCAmJiBwcm90b2NvbFswXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRCYXNlVXJsICh1cmw6IHN0cmluZywgY2FsbHNpdGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoaXNSZWxhdGl2ZSh1cmwpKVxuICAgICAgICB0aHJvdyBuZXcgQVBJRXJyb3IoY2FsbHNpdGVOYW1lLCBSVU5USU1FX0VSUk9SUy5yZWxhdGl2ZUJhc2VVcmwsIHVybCk7XG5cbiAgICBhc3NlcnRQcm90b2NvbCh1cmwsIGNhbGxzaXRlTmFtZSwgJ2Jhc2UgVVJMJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRSb2xlVXJsICh1cmw6IHN0cmluZywgY2FsbHNpdGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoaXNSZWxhdGl2ZSh1cmwpKVxuICAgICAgICB0aHJvdyBuZXcgQVBJRXJyb3IoY2FsbHNpdGVOYW1lLCBSVU5USU1FX0VSUk9SUy5yb2xlSW5pdGlhbGl6ZWRXaXRoUmVsYXRpdmVVcmwpO1xufVxuIl19