UNPKG

testcafe

Version:

Automated browser testing for the modern web development stack.

111 lines 15.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const promisified_functions_1 = require("../utils/promisified-functions"); const runtime_1 = require("../errors/runtime"); const types_1 = require("../errors/types"); const path_1 = require("path"); const testcafe_hammerhead_1 = require("testcafe-hammerhead"); const crypto_1 = require("crypto"); const BEAUTIFY_REGEXP = /[/.:\s\\]/g; const BEAUTIFY_CHAR = '_'; const EMPTY_CONTENT_STR = '{ content: <empty> }'; const CONTENT_STR_MAX_LENGTH = 30; const CONTENT_ELLIPSIS_STR = '...'; const URL_UNIQUE_PART_LENGTH = 7; class ClientScript { constructor(init, basePath) { this.init = init || null; this.url = (0, testcafe_hammerhead_1.generateUniqueId)(URL_UNIQUE_PART_LENGTH); this.content = ''; this.path = null; this.module = null; this.hash = null; this.page = testcafe_hammerhead_1.RequestFilterRule.ANY; this.basePath = basePath; } _resolvePath(path) { let resolvedPath = null; if ((0, path_1.isAbsolute)(path)) resolvedPath = path; else { if (!this.basePath) throw new runtime_1.GeneralError(types_1.RUNTIME_ERRORS.clientScriptBasePathIsNotSpecified); resolvedPath = (0, path_1.join)(this.basePath, path); } return resolvedPath; } async _loadFromPath(path) { const resolvedPath = this._resolvePath(path); try { this.path = resolvedPath; this.content = await (0, promisified_functions_1.readFile)(this.path); this.content = this.content.toString(); this.url = path || this.url; } catch (e) { throw new runtime_1.GeneralError(types_1.RUNTIME_ERRORS.cannotLoadClientScriptFromPath, path, e.message); } } async _loadFromModule(name) { let resolvedPath = null; try { resolvedPath = require.resolve(name); } catch (e) { throw new runtime_1.GeneralError(types_1.RUNTIME_ERRORS.clientScriptModuleEntryPointPathCalculationError, e.message); } await this._loadFromPath(resolvedPath); this.module = name; } _prepareUrl() { this.url = this.url.replace(BEAUTIFY_REGEXP, BEAUTIFY_CHAR).toLowerCase(); } async load() { if (this.init === null) throw new runtime_1.GeneralError(types_1.RUNTIME_ERRORS.clientScriptInitializerIsNotSpecified); else if (typeof this.init === 'string') await this._loadFromPath(this.init); else { const { path: initPath, content: initContent, module: initModule, page: initPage } = this.init; if (initPath && initContent || initPath && initModule || initContent && initModule) throw new runtime_1.GeneralError(types_1.RUNTIME_ERRORS.clientScriptInitializerMultipleContentSources); if (initPath) await this._loadFromPath(initPath); else if (initModule) await this._loadFromModule(initModule); else this.content = initContent; if (initPage) this.page = new testcafe_hammerhead_1.RequestFilterRule(initPage); } this._calculateHash(); this._prepareUrl(); } _calculateHash() { this.hash = (0, crypto_1.createHash)('sha256').update(this.content).digest(); } _contentToString() { let displayContent; if (this.content.length <= CONTENT_STR_MAX_LENGTH - CONTENT_ELLIPSIS_STR.length) displayContent = this.content; else displayContent = this.content.substring(0, CONTENT_STR_MAX_LENGTH - CONTENT_ELLIPSIS_STR.length) + CONTENT_ELLIPSIS_STR; return `{ content: '${displayContent}' }`; } toString() { if (!this.content) return EMPTY_CONTENT_STR; else if (this.content && !this.path) return this._contentToString(); return `{ path: '${this.path}' }`; } static get URL_UNIQUE_PART_LENGTH() { return URL_UNIQUE_PART_LENGTH; } getResultUrl(folderName) { return `/custom-client-scripts/${folderName}/${this.url}`; } } exports.default = ClientScript; module.exports = exports.default; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LXNjcmlwdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jdXN0b20tY2xpZW50LXNjcmlwdHMvY2xpZW50LXNjcmlwdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDBFQUEwRDtBQUMxRCwrQ0FBaUQ7QUFDakQsMkNBQWlEO0FBQ2pELCtCQUF3QztBQUN4Qyw2REFBMEU7QUFDMUUsbUNBQW9DO0FBR3BDLE1BQU0sZUFBZSxHQUFHLFlBQVksQ0FBQztBQUNyQyxNQUFNLGFBQWEsR0FBSyxHQUFHLENBQUM7QUFFNUIsTUFBTSxpQkFBaUIsR0FBUSxzQkFBc0IsQ0FBQztBQUN0RCxNQUFNLHNCQUFzQixHQUFHLEVBQUUsQ0FBQztBQUNsQyxNQUFNLG9CQUFvQixHQUFLLEtBQUssQ0FBQztBQUVyQyxNQUFNLHNCQUFzQixHQUFHLENBQUMsQ0FBQztBQUVqQyxNQUFxQixZQUFZO0lBVTdCLFlBQW9CLElBQStCLEVBQUUsUUFBZ0I7UUFDakUsSUFBSSxDQUFDLElBQUksR0FBTyxJQUFJLElBQUksSUFBSSxDQUFDO1FBQzdCLElBQUksQ0FBQyxHQUFHLEdBQVEsSUFBQSxzQ0FBZ0IsRUFBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxPQUFPLEdBQUksRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxJQUFJLEdBQU8sSUFBSSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxNQUFNLEdBQUssSUFBSSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxJQUFJLEdBQU8sSUFBSSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxJQUFJLEdBQU8sdUNBQWlCLENBQUMsR0FBRyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQzdCLENBQUM7SUFFTyxZQUFZLENBQUUsSUFBWTtRQUM5QixJQUFJLFlBQVksR0FBRyxJQUFJLENBQUM7UUFFeEIsSUFBSSxJQUFBLGlCQUFVLEVBQUMsSUFBSSxDQUFDO1lBQ2hC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bHMvcHJvbWlzaWZpZWQtZnVuY3Rpb25zJztcbmltcG9ydCB7IEdlbmVyYWxFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9ydW50aW1lJztcbmltcG9ydCB7IFJVTlRJTUVfRVJST1JTIH0gZnJvbSAnLi4vZXJyb3JzL3R5cGVzJztcbmltcG9ydCB7IGlzQWJzb2x1dGUsIGpvaW4gfSBmcm9tICdwYXRoJztcbmltcG9ydCB7IFJlcXVlc3RGaWx0ZXJSdWxlLCBnZW5lcmF0ZVVuaXF1ZUlkIH0gZnJvbSAndGVzdGNhZmUtaGFtbWVyaGVhZCc7XG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCBDbGllbnRTY3JpcHRJbml0IGZyb20gJy4vY2xpZW50LXNjcmlwdC1pbml0JztcblxuY29uc3QgQkVBVVRJRllfUkVHRVhQID0gL1svLjpcXHNcXFxcXS9nO1xuY29uc3QgQkVBVVRJRllfQ0hBUiAgID0gJ18nO1xuXG5jb25zdCBFTVBUWV9DT05URU5UX1NUUiAgICAgID0gJ3sgY29udGVudDogPGVtcHR5PiB9JztcbmNvbnN0IENPTlRFTlRfU1RSX01BWF9MRU5HVEggPSAzMDtcbmNvbnN0IENPTlRFTlRfRUxMSVBTSVNfU1RSICAgPSAnLi4uJztcblxuY29uc3QgVVJMX1VOSVFVRV9QQVJUX0xFTkdUSCA9IDc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENsaWVudFNjcmlwdCB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBpbml0OiBudWxsIHwgc3RyaW5nIHwgQ2xpZW50U2NyaXB0SW5pdDtcbiAgICBwdWJsaWMgdXJsOiBzdHJpbmc7XG4gICAgcHVibGljIGNvbnRlbnQ6IHN0cmluZztcbiAgICBwdWJsaWMgcGF0aDogc3RyaW5nIHwgbnVsbDtcbiAgICBwdWJsaWMgbW9kdWxlOiBzdHJpbmcgfCBudWxsO1xuICAgIHB1YmxpYyBoYXNoOiBCdWZmZXIgfCBudWxsO1xuICAgIHB1YmxpYyBwYWdlOiBSZXF1ZXN0RmlsdGVyUnVsZTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJhc2VQYXRoOiBzdHJpbmc7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKGluaXQ6IHN0cmluZyB8IENsaWVudFNjcmlwdEluaXQsIGJhc2VQYXRoOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5pbml0ICAgICA9IGluaXQgfHwgbnVsbDtcbiAgICAgICAgdGhpcy51cmwgICAgICA9IGdlbmVyYXRlVW5pcXVlSWQoVVJMX1VOSVFVRV9QQVJUX0xFTkdUSCk7XG4gICAgICAgIHRoaXMuY29udGVudCAgPSAnJztcbiAgICAgICAgdGhpcy5wYXRoICAgICA9IG51bGw7XG4gICAgICAgIHRoaXMubW9kdWxlICAgPSBudWxsO1xuICAgICAgICB0aGlzLmhhc2ggICAgID0gbnVsbDtcbiAgICAgICAgdGhpcy5wYWdlICAgICA9IFJlcXVlc3RGaWx0ZXJSdWxlLkFOWTtcbiAgICAgICAgdGhpcy5iYXNlUGF0aCA9IGJhc2VQYXRoO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3Jlc29sdmVQYXRoIChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBsZXQgcmVzb2x2ZWRQYXRoID0gbnVsbDtcblxuICAgICAgICBpZiAoaXNBYnNvbHV0ZShwYXRoKSlcbiAgICAgICAgICAgIHJlc29sdmVkUGF0aCA9IHBhdGg7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmJhc2VQYXRoKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXJyb3IoUlVOVElNRV9FUlJPUlMuY2xpZW50U2NyaXB0QmFzZVBhdGhJc05vdFNwZWNpZmllZCk7XG5cbiAgICAgICAgICAgIHJlc29sdmVkUGF0aCA9IGpvaW4odGhpcy5iYXNlUGF0aCwgcGF0aCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzb2x2ZWRQYXRoO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2xvYWRGcm9tUGF0aCAocGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IHRoaXMuX3Jlc29sdmVQYXRoKHBhdGgpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnBhdGggICAgPSByZXNvbHZlZFBhdGg7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZSh0aGlzLnBhdGgpO1xuICAgICAgICAgICAgdGhpcy5jb250ZW50ID0gdGhpcy5jb250ZW50LnRvU3RyaW5nKCk7XG4gICAgICAgICAgICB0aGlzLnVybCAgICAgPSBwYXRoIHx8IHRoaXMudXJsO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXJyb3IoUlVOVElNRV9FUlJPUlMuY2Fubm90TG9hZENsaWVudFNjcmlwdEZyb21QYXRoLCBwYXRoLCBlLm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfbG9hZEZyb21Nb2R1bGUgKG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgcmVzb2x2ZWRQYXRoID0gbnVsbDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzb2x2ZWRQYXRoID0gcmVxdWlyZS5yZXNvbHZlKG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXJyb3IoUlVOVElNRV9FUlJPUlMuY2xpZW50U2NyaXB0TW9kdWxlRW50cnlQb2ludFBhdGhDYWxjdWxhdGlvbkVycm9yLCBlLm1lc3NhZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5fbG9hZEZyb21QYXRoKHJlc29sdmVkUGF0aCk7XG5cbiAgICAgICAgdGhpcy5tb2R1bGUgPSBuYW1lO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3ByZXBhcmVVcmwgKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnVybCA9IHRoaXMudXJsLnJlcGxhY2UoQkVBVVRJRllfUkVHRVhQLCBCRUFVVElGWV9DSEFSKS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsb2FkICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuaW5pdCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXJyb3IoUlVOVElNRV9FUlJPUlMuY2xpZW50U2NyaXB0SW5pdGlhbGl6ZXJJc05vdFNwZWNpZmllZCk7XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB0aGlzLmluaXQgPT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fbG9hZEZyb21QYXRoKHRoaXMuaW5pdCk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgeyBwYXRoOiBpbml0UGF0aCwgY29udGVudDogaW5pdENvbnRlbnQsIG1vZHVsZTogaW5pdE1vZHVsZSwgcGFnZTogaW5pdFBhZ2UgfSA9IHRoaXMuaW5pdCBhcyBDbGllbnRTY3JpcHRJbml0O1xuXG4gICAgICAgICAgICBpZiAoaW5pdFBhdGggJiYgaW5pdENvbnRlbnQgfHwgaW5pdFBhdGggJiYgaW5pdE1vZHVsZSB8fCBpbml0Q29udGVudCAmJiBpbml0TW9kdWxlKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXJyb3IoUlVOVElNRV9FUlJPUlMuY2xpZW50U2NyaXB0SW5pdGlhbGl6ZXJNdWx0aXBsZUNvbnRlbnRTb3VyY2VzKTtcblxuICAgICAgICAgICAgaWYgKGluaXRQYXRoKVxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2xvYWRGcm9tUGF0aChpbml0UGF0aCk7XG4gICAgICAgICAgICBlbHNlIGlmIChpbml0TW9kdWxlKVxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2xvYWRGcm9tTW9kdWxlKGluaXRNb2R1bGUpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRoaXMuY29udGVudCA9IGluaXRDb250ZW50O1xuXG4gICAgICAgICAgICBpZiAoaW5pdFBhZ2UpXG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlID0gbmV3IFJlcXVlc3RGaWx0ZXJSdWxlKGluaXRQYWdlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NhbGN1bGF0ZUhhc2goKTtcbiAgICAgICAgdGhpcy5fcHJlcGFyZVVybCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2NhbGN1bGF0ZUhhc2ggKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmhhc2ggPSBjcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUodGhpcy5jb250ZW50KS5kaWdlc3QoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jb250ZW50VG9TdHJpbmcgKCk6IHN0cmluZyB7XG4gICAgICAgIGxldCBkaXNwbGF5Q29udGVudDtcblxuICAgICAgICBpZiAodGhpcy5jb250ZW50Lmxlbmd0aCA8PSBDT05URU5UX1NUUl9NQVhfTEVOR1RIIC0gQ09OVEVOVF9FTExJUFNJU19TVFIubGVuZ3RoKVxuICAgICAgICAgICAgZGlzcGxheUNvbnRlbnQgPSB0aGlzLmNvbnRlbnQ7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGRpc3BsYXlDb250ZW50ID0gdGhpcy5jb250ZW50LnN1YnN0cmluZygwLCBDT05URU5UX1NUUl9NQVhfTEVOR1RIIC0gQ09OVEVOVF9FTExJUFNJU19TVFIubGVuZ3RoKSArIENPTlRFTlRfRUxMSVBTSVNfU1RSO1xuXG4gICAgICAgIHJldHVybiBgeyBjb250ZW50OiAnJHtkaXNwbGF5Q29udGVudH0nIH1gO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b1N0cmluZyAoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRlbnQpXG4gICAgICAgICAgICByZXR1cm4gRU1QVFlfQ09OVEVOVF9TVFI7XG5cbiAgICAgICAgZWxzZSBpZiAodGhpcy5jb250ZW50ICYmICF0aGlzLnBhdGgpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudFRvU3RyaW5nKCk7XG5cbiAgICAgICAgcmV0dXJuIGB7IHBhdGg6ICcke3RoaXMucGF0aH0nIH1gO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IFVSTF9VTklRVUVfUEFSVF9MRU5HVEggKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBVUkxfVU5JUVVFX1BBUlRfTEVOR1RIO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRSZXN1bHRVcmwgKGZvbGRlck5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgL2N1c3RvbS1jbGllbnQtc2NyaXB0cy8ke2ZvbGRlck5hbWV9LyR7dGhpcy51cmx9YDtcbiAgICB9XG59XG4iXX0=