testcafe
Version:
Automated browser testing for the modern web development stack.
141 lines • 17 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const debug_1 = __importDefault(require("debug"));
const promisified_functions_1 = require("../utils/promisified-functions");
const option_1 = __importDefault(require("./option"));
const option_source_1 = __importDefault(require("./option-source"));
const lodash_1 = require("lodash");
const resolve_path_relatively_cwd_1 = __importDefault(require("../utils/resolve-path-relatively-cwd"));
const json5_1 = __importDefault(require("json5"));
const render_template_1 = __importDefault(require("../utils/render-template"));
const warning_message_1 = __importDefault(require("../notifications/warning-message"));
const log_1 = __importDefault(require("../cli/log"));
const DEBUG_LOGGER = debug_1.default('testcafe:configuration');
class Configuration {
constructor(configurationFileName) {
this._options = {};
this._filePath = resolve_path_relatively_cwd_1.default(configurationFileName);
this._overridenOptions = [];
}
static _fromObj(obj) {
const result = Object.create(null);
Object.entries(obj).forEach(([key, value]) => {
const option = new option_1.default(key, value);
result[key] = option;
});
return result;
}
static async _isConfigurationFileExists(path) {
try {
await promisified_functions_1.stat(path);
return true;
}
catch (error) {
DEBUG_LOGGER(render_template_1.default(warning_message_1.default.cannotFindConfigurationFile, path, error.stack));
return false;
}
}
static _showConsoleWarning(message) {
log_1.default.write(message);
}
static _showWarningForError(error, warningTemplate, ...args) {
const message = render_template_1.default(warningTemplate, ...args);
Configuration._showConsoleWarning(message);
DEBUG_LOGGER(message);
DEBUG_LOGGER(error);
}
async init() {
}
mergeOptions(options) {
Object.entries(options).map(([key, value]) => {
const option = this._ensureOption(key, value, option_source_1.default.input);
if (value === void 0)
return;
if (option.value !== value &&
option.source === option_source_1.default.configuration)
this._overridenOptions.push(key);
this._setOptionValue(option, value);
});
}
getOption(key) {
if (!key)
return void 0;
const option = this._options[key];
if (!option)
return void 0;
return option.value;
}
getOptions() {
const result = Object.create(null);
Object.entries(this._options).forEach(([name, option]) => {
result[name] = option.value;
});
return result;
}
clone() {
return lodash_1.cloneDeep(this);
}
get filePath() {
return this._filePath;
}
async _load() {
const configurationFileExists = await Configuration._isConfigurationFileExists(this.filePath);
if (configurationFileExists) {
const configurationFileContent = await this._readConfigurationFileContent();
if (configurationFileContent)
return this._parseConfigurationFileContent(configurationFileContent);
}
return null;
}
async _readConfigurationFileContent() {
try {
return await promisified_functions_1.readFile(this.filePath);
}
catch (error) {
Configuration._showWarningForError(error, warning_message_1.default.cannotReadConfigFile);
}
return null;
}
_parseConfigurationFileContent(configurationFileContent) {
try {
return json5_1.default.parse(configurationFileContent);
}
catch (error) {
Configuration._showWarningForError(error, warning_message_1.default.cannotParseConfigFile);
}
return null;
}
_ensureArrayOption(name) {
const options = this._options[name];
if (!options)
return;
options.value = lodash_1.castArray(options.value);
}
_ensureOption(name, value, source) {
let option = null;
if (name in this._options)
option = this._options[name];
else {
option = new option_1.default(name, value, source);
this._options[name] = option;
}
return option;
}
_ensureOptionWithValue(name, defaultValue, source) {
const option = this._ensureOption(name, defaultValue, source);
if (option.value !== void 0)
return;
option.value = defaultValue;
option.source = source;
}
_setOptionValue(option, value) {
option.value = value;
option.source = option_source_1.default.input;
}
}
exports.default = Configuration;
module.exports = exports.default;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi1iYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZ3VyYXRpb24vY29uZmlndXJhdGlvbi1iYXNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsa0RBQTBCO0FBQzFCLDBFQUFnRTtBQUNoRSxzREFBOEI7QUFDOUIsb0VBQTJDO0FBQzNDLG1DQUE4QztBQUM5Qyx1R0FBNEU7QUFDNUUsa0RBQTBCO0FBQzFCLCtFQUFzRDtBQUN0RCx1RkFBZ0U7QUFDaEUscURBQTZCO0FBRTdCLE1BQU0sWUFBWSxHQUFHLGVBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0FBRXJELE1BQXFCLGFBQWE7SUFDOUIsWUFBYSxxQkFBcUI7UUFDOUIsSUFBSSxDQUFDLFFBQVEsR0FBSSxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxxQ0FBd0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ2pFLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVELE1BQU0sQ0FBQyxRQUFRLENBQUUsR0FBRztRQUNoQixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRW5DLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtZQUN6QyxNQUFNLE1BQU0sR0FBRyxJQUFJLGdCQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBRXRDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUM7UUFDekIsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQUssQ0FBQywwQkFBMEIsQ0FBRSxJQUFJO1FBQ3pDLElBQUk7WUFDQSxNQUFNLDRCQUFJ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QztZQUV6QyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQztTQUNoQztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxzQkFBc0IsQ0FBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU07UUFDOUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRTlELElBQUksTUFBTSxDQUFDLEtBQUssS0FBSyxLQUFLLENBQUM7WUFDdkIsT0FBTztRQUVYLE1BQU0sQ0FBQyxLQUFLLEdBQUksWUFBWSxDQUFDO1FBQzdCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQzNCLENBQUM7SUFFRCxlQUFlLENBQUUsTUFBTSxFQUFFLEtBQUs7UUFDMUIsTUFBTSxDQUFDLEtBQUssR0FBSSxLQUFLLENBQUM7UUFDdEIsTUFBTSxDQUFDLE1BQU0sR0FBRyx1QkFBWSxDQUFDLEtBQUssQ0FBQztJQUN2QyxDQUFDO0NBQ0o7QUFyS0QsZ0NBcUtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCB7IHN0YXQsIHJlYWRGaWxlIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzaWZpZWQtZnVuY3Rpb25zJztcbmltcG9ydCBPcHRpb24gZnJvbSAnLi9vcHRpb24nO1xuaW1wb3J0IG9wdGlvblNvdXJjZSBmcm9tICcuL29wdGlvbi1zb3VyY2UnO1xuaW1wb3J0IHsgY2xvbmVEZWVwLCBjYXN0QXJyYXkgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHJlc29sdmVQYXRoUmVsYXRpdmVseUN3ZCBmcm9tICcuLi91dGlscy9yZXNvbHZlLXBhdGgtcmVsYXRpdmVseS1jd2QnO1xuaW1wb3J0IEpTT041IGZyb20gJ2pzb241JztcbmltcG9ydCByZW5kZXJUZW1wbGF0ZSBmcm9tICcuLi91dGlscy9yZW5kZXItdGVtcGxhdGUnO1xuaW1wb3J0IFdBUk5JTkdfTUVTU0FHRVMgZnJvbSAnLi4vbm90aWZpY2F0aW9ucy93YXJuaW5nLW1lc3NhZ2UnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi9jbGkvbG9nJztcblxuY29uc3QgREVCVUdfTE9HR0VSID0gZGVidWcoJ3Rlc3RjYWZlOmNvbmZpZ3VyYXRpb24nKTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29uZmlndXJhdGlvbiB7XG4gICAgY29uc3RydWN0b3IgKGNvbmZpZ3VyYXRpb25GaWxlTmFtZSkge1xuICAgICAgICB0aGlzLl9vcHRpb25zICA9IHt9O1xuICAgICAgICB0aGlzLl9maWxlUGF0aCA9IHJlc29sdmVQYXRoUmVsYXRpdmVseUN3ZChjb25maWd1cmF0aW9uRmlsZU5hbWUpO1xuICAgICAgICB0aGlzLl9vdmVycmlkZW5PcHRpb25zID0gW107XG4gICAgfVxuXG4gICAgc3RhdGljIF9mcm9tT2JqIChvYmopIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgICAgICBPYmplY3QuZW50cmllcyhvYmopLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9uID0gbmV3IE9wdGlvbihrZXksIHZhbHVlKTtcblxuICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBvcHRpb247XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgc3RhdGljIGFzeW5jIF9pc0NvbmZpZ3VyYXRpb25GaWxlRXhpc3RzIChwYXRoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBzdGF0KHBhdGgpO1xuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIERFQlVHX0xPR0dFUihyZW5kZXJUZW1wbGF0ZShXQVJOSU5HX01FU1NBR0VTLmNhbm5vdEZpbmRDb25maWd1cmF0aW9uRmlsZSwgcGF0aCwgZXJyb3Iuc3RhY2spKTtcblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIF9zaG93Q29uc29sZVdhcm5pbmcgKG1lc3NhZ2UpIHtcbiAgICAgICAgbG9nLndyaXRlKG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIHN0YXRpYyBfc2hvd1dhcm5pbmdGb3JFcnJvciAoZXJyb3IsIHdhcm5pbmdUZW1wbGF0ZSwgLi4uYXJncykge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gcmVuZGVyVGVtcGxhdGUod2FybmluZ1RlbXBsYXRlLCAuLi5hcmdzKTtcblxuICAgICAgICBDb25maWd1cmF0aW9uLl9zaG93Q29uc29sZVdhcm5pbmcobWVzc2FnZSk7XG5cbiAgICAgICAgREVCVUdfTE9HR0VSKG1lc3NhZ2UpO1xuICAgICAgICBERUJVR19MT0dHRVIoZXJyb3IpO1xuICAgIH1cblxuICAgIGFzeW5jIGluaXQgKCkge1xuICAgIH1cblxuICAgIG1lcmdlT3B0aW9ucyAob3B0aW9ucykge1xuICAgICAgICBPYmplY3QuZW50cmllcyhvcHRpb25zKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9uID0gdGhpcy5fZW5zdXJlT3B0aW9uKGtleSwgdmFsdWUsIG9wdGlvblNvdXJjZS5pbnB1dCk7XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdm9pZCAwKVxuICAgICAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbi52YWx1ZSAhPT0gdmFsdWUgJiZcbiAgICAgICAgICAgICAgICBvcHRpb24uc291cmNlID09PSBvcHRpb25Tb3VyY2UuY29uZmlndXJhdGlvbilcbiAgICAgICAgICAgICAgICB0aGlzLl9vdmVycmlkZW5PcHRpb25zLnB1c2goa2V5KTtcblxuICAgICAgICAgICAgdGhpcy5fc2V0T3B0aW9uVmFsdWUob3B0aW9uLCB2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldE9wdGlvbiAoa2V5KSB7XG4gICAgICAgIGlmICgha2V5KVxuICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDtcblxuICAgICAgICBjb25zdCBvcHRpb24gPSB0aGlzLl9vcHRpb25zW2tleV07XG5cbiAgICAgICAgaWYgKCFvcHRpb24pXG4gICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuXG4gICAgICAgIHJldHVybiBvcHRpb24udmFsdWU7XG4gICAgfVxuXG4gICAgZ2V0T3B0aW9ucyAoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5fb3B0aW9ucykuZm9yRWFjaCgoW25hbWUsIG9wdGlvbl0pID0+IHtcbiAgICAgICAgICAgIHJlc3VsdFtuYW1lXSA9IG9wdGlvbi52YWx1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBjbG9uZSAoKSB7XG4gICAgICAgIHJldHVybiBjbG9uZURlZXAodGhpcyk7XG4gICAgfVxuXG4gICAgZ2V0IGZpbGVQYXRoICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbGVQYXRoO1xuICAgIH1cblxuICAgIGFzeW5jIF9sb2FkICgpIHtcbiAgICAgICAgY29uc3QgY29uZmlndXJhdGlvbkZpbGVFeGlzdHMgPSBhd2FpdCBDb25maWd1cmF0aW9uLl9pc0NvbmZpZ3VyYXRpb25GaWxlRXhpc3RzKHRoaXMuZmlsZVBhdGgpO1xuXG4gICAgICAgIGlmIChjb25maWd1cmF0aW9uRmlsZUV4aXN0cykge1xuICAgICAgICAgICAgY29uc3QgY29uZmlndXJhdGlvbkZpbGVDb250ZW50ID0gYXdhaXQgdGhpcy5fcmVhZENvbmZpZ3VyYXRpb25GaWxlQ29udGVudCgpO1xuXG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbkZpbGVDb250ZW50KVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9wYXJzZUNvbmZpZ3VyYXRpb25GaWxlQ29udGVudChjb25maWd1cmF0aW9uRmlsZUNvbnRlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgYXN5bmMgX3JlYWRDb25maWd1cmF0aW9uRmlsZUNvbnRlbnQgKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlYWRGaWxlKHRoaXMuZmlsZVBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5fc2hvd1dhcm5pbmdGb3JFcnJvcihlcnJvciwgV0FSTklOR19NRVNTQUdFUy5jYW5ub3RSZWFkQ29uZmlnRmlsZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBfcGFyc2VDb25maWd1cmF0aW9uRmlsZUNvbnRlbnQgKGNvbmZpZ3VyYXRpb25GaWxlQ29udGVudCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT041LnBhcnNlKGNvbmZpZ3VyYXRpb25GaWxlQ29udGVudCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLl9zaG93V2FybmluZ0ZvckVycm9yKGVycm9yLCBXQVJOSU5HX01FU1NBR0VTLmNhbm5vdFBhcnNlQ29uZmlnRmlsZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBfZW5zdXJlQXJyYXlPcHRpb24gKG5hbWUpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuX29wdGlvbnNbbmFtZV07XG5cbiAgICAgICAgaWYgKCFvcHRpb25zKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIG9wdGlvbnMudmFsdWUgPSBjYXN0QXJyYXkob3B0aW9ucy52YWx1ZSk7XG4gICAgfVxuXG4gICAgX2Vuc3VyZU9wdGlvbiAobmFtZSwgdmFsdWUsIHNvdXJjZSkge1xuICAgICAgICBsZXQgb3B0aW9uID0gbnVsbDtcblxuICAgICAgICBpZiAobmFtZSBpbiB0aGlzLl9vcHRpb25zKVxuICAgICAgICAgICAgb3B0aW9uID0gdGhpcy5fb3B0aW9uc1tuYW1lXTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcHRpb24gPSBuZXcgT3B0aW9uKG5hbWUsIHZhbHVlLCBzb3VyY2UpO1xuXG4gICAgICAgICAgICB0aGlzLl9vcHRpb25zW25hbWVdID0gb3B0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9wdGlvbjtcbiAgICB9XG5cbiAgICBfZW5zdXJlT3B0aW9uV2l0aFZhbHVlIChuYW1lLCBkZWZhdWx0VmFsdWUsIHNvdXJjZSkge1xuICAgICAgICBjb25zdCBvcHRpb24gPSB0aGlzLl9lbnN1cmVPcHRpb24obmFtZSwgZGVmYXVsdFZhbHVlLCBzb3VyY2UpO1xuXG4gICAgICAgIGlmIChvcHRpb24udmFsdWUgIT09IHZvaWQgMClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBvcHRpb24udmFsdWUgID0gZGVmYXVsdFZhbHVlO1xuICAgICAgICBvcHRpb24uc291cmNlID0gc291cmNlO1xuICAgIH1cblxuICAgIF9zZXRPcHRpb25WYWx1ZSAob3B0aW9uLCB2YWx1ZSkge1xuICAgICAgICBvcHRpb24udmFsdWUgID0gdmFsdWU7XG4gICAgICAgIG9wdGlvbi5zb3VyY2UgPSBvcHRpb25Tb3VyY2UuaW5wdXQ7XG4gICAgfVxufVxuIl19