"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: }'; 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)('md5').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; } } exports.default = ClientScript; module.exports = exports.default; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LXNjcmlwdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jdXN0b20tY2xpZW50LXNjcmlwdHMvY2xpZW50LXNjcmlwdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDBFQUEwRDtBQUMxRCwrQ0FBaUQ7QUFDakQsMkNBQWlEO0FBQ2pELCtCQUF3QztBQUN4Qyw2REFBMEU7QUFDMUUsbUNBQW9DO0FBR3BDLE1BQU0sZUFBZSxHQUFHLFlBQVksQ0FBQztBQUNyQyxNQUFNLGFBQWEsR0FBSyxHQUFHLENBQUM7QUFFNUIsTUFBTSxpQkFBaUIsR0FBUSxzQkFBc0IsQ0FBQztBQUN0RCxNQUFNLHNCQUFzQixHQUFHLEVBQUUsQ0FBQztBQUNsQyxNQUFNLG9CQUFvQixHQUFLLEtBQUssQ0FBQztBQUVyQyxNQUFNLHNCQUFzQixHQUFHLENBQUMsQ0FBQztBQUVqQyxNQUFxQixZQUFZO0lBVTdCLFlBQW9CLElBQStCLEVBQUUsUUFBZ0I7UUFDakUsSUFBSSxDQUFDLElBQUksR0FBTyxJQUFJLElBQUksSUFBSSxDQUFDO1FBQzdCLElBQUksQ0FBQyxHQUFHLEdBQVEsSUFBQSxzQ0FBZ0IsRUFBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxPQUFPLEdBQUksRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxJQUFJLEdBQU8sSUFBSSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxNQUFNLEdBQUssSUFBSSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxJQUFJLEdBQU8sSUFBSSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxJQUFJLEdBQU8sdUNBQWlCLENBQUMsR0FBRyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQzdCLENBQUM7SUFFTyxZQUFZLENBQUUsSUFBWTtRQUM5QixJQUFJLFlBQVksR0FBRyxJQUFJLENBQUM7UUFFeEIsSUFBSSxJQUFBLGlCQUFVLEVBQUMsSUFBSSxDQUFDO1lBQ2hC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RCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFTyxjQUFjO1FBQ2xCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBQSxtQkFBVSxFQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDaEUsQ0FBQztJQUVPLGdCQUFnQjtRQUNwQixJQUFJLGNBQWMsQ0FBQztRQUVuQixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxJQUFJLHNCQUFzQixHQUFHLG9CQUFvQixDQUFDLE1BQU07WUFDM0UsY0FBYyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7O1lBRTlCLGNBQWMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsc0JBQXNCLEdBQUcsb0JBQW9CLENBQUMsTUFBTSxDQUFDLEdBQUcsb0JBQW9CLENBQUM7UUFFNUgsT0FBTyxlQUFlLGNBQWMsS0FBSyxDQUFDO0lBQzlDLENBQUM7SUFFTSxRQUFRO1FBQ1gsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPO1lBQ2IsT0FBTyxpQkFBaUIsQ0FBQzthQUV4QixJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSTtZQUMvQixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBRW5DLE9BQU8sWUFBWSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUM7SUFDdEMsQ0FBQztJQUVNLE1BQU0sS0FBSyxzQkFBc0I7UUFDcEMsT0FBTyxzQkFBc0IsQ0FBQztJQUNsQyxDQUFDO0NBQ0o7QUEzSEQsK0JBMkhDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVhZEZpbGUgfSBmcm9tICcuLi91dGlscy9wcm9taXNpZmllZC1mdW5jdGlvbnMnO1xuaW1wb3J0IHsgR2VuZXJhbEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL3J1bnRpbWUnO1xuaW1wb3J0IHsgUlVOVElNRV9FUlJPUlMgfSBmcm9tICcuLi9lcnJvcnMvdHlwZXMnO1xuaW1wb3J0IHsgaXNBYnNvbHV0ZSwgam9pbiB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgUmVxdWVzdEZpbHRlclJ1bGUsIGdlbmVyYXRlVW5pcXVlSWQgfSBmcm9tICd0ZXN0Y2FmZS1oYW1tZXJoZWFkJztcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IENsaWVudFNjcmlwdEluaXQgZnJvbSAnLi9jbGllbnQtc2NyaXB0LWluaXQnO1xuXG5jb25zdCBCRUFVVElGWV9SRUdFWFAgPSAvWy8uOlxcc1xcXFxdL2c7XG5jb25zdCBCRUFVVElGWV9DSEFSICAgPSAnXyc7XG5cbmNvbnN0IEVNUFRZX0NPTlRFTlRfU1RSICAgICAgPSAneyBjb250ZW50OiA8ZW1wdHk+IH0nO1xuY29uc3QgQ09OVEVOVF9TVFJfTUFYX0xFTkdUSCA9IDMwO1xuY29uc3QgQ09OVEVOVF9FTExJUFNJU19TVFIgICA9ICcuLi4nO1xuXG5jb25zdCBVUkxfVU5JUVVFX1BBUlRfTEVOR1RIID0gNztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2xpZW50U2NyaXB0IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGluaXQ6IG51bGwgfCBzdHJpbmcgfCBDbGllbnRTY3JpcHRJbml0O1xuICAgIHB1YmxpYyB1cmw6IHN0cmluZztcbiAgICBwdWJsaWMgY29udGVudDogc3RyaW5nO1xuICAgIHB1YmxpYyBwYXRoOiBzdHJpbmcgfCBudWxsO1xuICAgIHB1YmxpYyBtb2R1bGU6IHN0cmluZyB8IG51bGw7XG4gICAgcHVibGljIGhhc2g6IEJ1ZmZlciB8IG51bGw7XG4gICAgcHVibGljIHBhZ2U6IFJlcXVlc3RGaWx0ZXJSdWxlO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYmFzZVBhdGg6IHN0cmluZztcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAoaW5pdDogc3RyaW5nIHwgQ2xpZW50U2NyaXB0SW5pdCwgYmFzZVBhdGg6IHN0cmluZykge1xuICAgICAgICB0aGlzLmluaXQgICAgID0gaW5pdCB8fCBudWxsO1xuICAgICAgICB0aGlzLnVybCAgICAgID0gZ2VuZXJhdGVVbmlxdWVJZChVUkxfVU5JUVVFX1BBUlRfTEVOR1RIKTtcbiAgICAgICAgdGhpcy5jb250ZW50ICA9ICcnO1xuICAgICAgICB0aGlzLnBhdGggICAgID0gbnVsbDtcbiAgICAgICAgdGhpcy5tb2R1bGUgICA9IG51bGw7XG4gICAgICAgIHRoaXMuaGFzaCAgICAgPSBudWxsO1xuICAgICAgICB0aGlzLnBhZ2UgICAgID0gUmVxdWVzdEZpbHRlclJ1bGUuQU5ZO1xuICAgICAgICB0aGlzLmJhc2VQYXRoID0gYmFzZVBhdGg7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVzb2x2ZVBhdGggKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGxldCByZXNvbHZlZFBhdGggPSBudWxsO1xuXG4gICAgICAgIGlmIChpc0Fic29sdXRlKHBhdGgpKVxuICAgICAgICAgICAgcmVzb2x2ZWRQYXRoID0gcGF0aDtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuYmFzZVBhdGgpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFcnJvcihSVU5USU1FX0VSUk9SUy5jbGllbnRTY3JpcHRCYXNlUGF0aElzTm90U3BlY2lmaWVkKTtcblxuICAgICAgICAgICAgcmVzb2x2ZWRQYXRoID0gam9pbih0aGlzLmJhc2VQYXRoLCBwYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXNvbHZlZFBhdGg7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfbG9hZEZyb21QYXRoIChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRQYXRoID0gdGhpcy5fcmVzb2x2ZVBhdGgocGF0aCk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMucGF0aCAgICA9IHJlc29sdmVkUGF0aDtcbiAgICAgICAgICAgIHRoaXMuY29udGVudCA9IGF3YWl0IHJlYWRGaWxlKHRoaXMucGF0aCk7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnQgPSB0aGlzLmNvbnRlbnQudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIHRoaXMudXJsICAgICA9IHBhdGggfHwgdGhpcy51cmw7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFcnJvcihSVU5USU1FX0VSUk9SUy5jYW5ub3RMb2FkQ2xpZW50U2NyaXB0RnJvbVBhdGgsIHBhdGgsIGUubWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9sb2FkRnJvbU1vZHVsZSAobmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCByZXNvbHZlZFBhdGggPSBudWxsO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXNvbHZlZFBhdGggPSByZXF1aXJlLnJlc29sdmUobmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFcnJvcihSVU5USU1FX0VSUk9SUy5jbGllbnRTY3JpcHRNb2R1bGVFbnRyeVBvaW50UGF0aENhbGN1bGF0aW9uRXJyb3IsIGUubWVzc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLl9sb2FkRnJvbVBhdGgocmVzb2x2ZWRQYXRoKTtcblxuICAgICAgICB0aGlzLm1vZHVsZSA9IG5hbWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcHJlcGFyZVVybCAoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudXJsID0gdGhpcy51cmwucmVwbGFjZShCRUFVVElGWV9SRUdFWFAsIEJFQVVUSUZZX0NIQVIpLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGxvYWQgKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5pbml0ID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFcnJvcihSVU5USU1FX0VSUk9SUy5jbGllbnRTY3JpcHRJbml0aWFsaXplcklzTm90U3BlY2lmaWVkKTtcbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHRoaXMuaW5pdCA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9sb2FkRnJvbVBhdGgodGhpcy5pbml0KTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB7IHBhdGg6IGluaXRQYXRoLCBjb250ZW50OiBpbml0Q29udGVudCwgbW9kdWxlOiBpbml0TW9kdWxlLCBwYWdlOiBpbml0UGFnZSB9ID0gdGhpcy5pbml0IGFzIENsaWVudFNjcmlwdEluaXQ7XG5cbiAgICAgICAgICAgIGlmIChpbml0UGF0aCAmJiBpbml0Q29udGVudCB8fCBpbml0UGF0aCAmJiBpbml0TW9kdWxlIHx8IGluaXRDb250ZW50ICYmIGluaXRNb2R1bGUpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFcnJvcihSVU5USU1FX0VSUk9SUy5jbGllbnRTY3JpcHRJbml0aWFsaXplck11bHRpcGxlQ29udGVudFNvdXJjZXMpO1xuXG4gICAgICAgICAgICBpZiAoaW5pdFBhdGgpXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fbG9hZEZyb21QYXRoKGluaXRQYXRoKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGluaXRNb2R1bGUpXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fbG9hZEZyb21Nb2R1bGUoaW5pdE1vZHVsZSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZW50ID0gaW5pdENvbnRlbnQ7XG5cbiAgICAgICAgICAgIGlmIChpbml0UGFnZSlcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2UgPSBuZXcgUmVxdWVzdEZpbHRlclJ1bGUoaW5pdFBhZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2FsY3VsYXRlSGFzaCgpO1xuICAgICAgICB0aGlzLl9wcmVwYXJlVXJsKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY2FsY3VsYXRlSGFzaCAoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaGFzaCA9IGNyZWF0ZUhhc2goJ21kNScpLnVwZGF0ZSh0aGlzLmNvbnRlbnQpLmRpZ2VzdCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2NvbnRlbnRUb1N0cmluZyAoKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGRpc3BsYXlDb250ZW50O1xuXG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnQubGVuZ3RoIDw9IENPTlRFTlRfU1RSX01BWF9MRU5HVEggLSBDT05URU5UX0VMTElQU0lTX1NUUi5sZW5ndGgpXG4gICAgICAgICAgICBkaXNwbGF5Q29udGVudCA9IHRoaXMuY29udGVudDtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZGlzcGxheUNvbnRlbnQgPSB0aGlzLmNvbnRlbnQuc3Vic3RyaW5nKDAsIENPTlRFTlRfU1RSX01BWF9MRU5HVEggLSBDT05URU5UX0VMTElQU0lTX1NUUi5sZW5ndGgpICsgQ09OVEVOVF9FTExJUFNJU19TVFI7XG5cbiAgICAgICAgcmV0dXJuIGB7IGNvbnRlbnQ6ICcke2Rpc3BsYXlDb250ZW50fScgfWA7XG4gICAgfVxuXG4gICAgcHVibGljIHRvU3RyaW5nICgpOiBzdHJpbmcge1xuICAgICAgICBpZiAoIXRoaXMuY29udGVudClcbiAgICAgICAgICAgIHJldHVybiBFTVBUWV9DT05URU5UX1NUUjtcblxuICAgICAgICBlbHNlIGlmICh0aGlzLmNvbnRlbnQgJiYgIXRoaXMucGF0aClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb250ZW50VG9TdHJpbmcoKTtcblxuICAgICAgICByZXR1cm4gYHsgcGF0aDogJyR7dGhpcy5wYXRofScgfWA7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXQgVVJMX1VOSVFVRV9QQVJUX0xFTkdUSCAoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIFVSTF9VTklRVUVfUEFSVF9MRU5HVEg7XG4gICAgfVxufVxuIl19