UNPKG

@browserstack/testcafe

Version:

Automated browser testing for the modern web development stack.

102 lines 13 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const lodash_1 = require("lodash"); const _1 = require("./"); const types_1 = require("../types"); const hook_1 = __importDefault(require("../../api/request-hooks/hook")); const START_FROM_VOWEL_RE = /^[aeiou]/i; function getIndefiniteArticle(text) { return START_FROM_VOWEL_RE.test(text) ? 'an' : 'a'; } function isNonNegativeValue(value) { return lodash_1.isFinite(value) && value >= 0; } function getNumberTypeActualValueMsg(value, type) { if (type !== 'number') return type; if (Number.isNaN(value)) return NaN; if (!lodash_1.isFinite(value)) return Infinity; return value; } exports.is = { number: { name: 'number', predicate: lodash_1.isFinite, getActualValueMsg: getNumberTypeActualValueMsg }, nonNegativeNumber: { name: 'non-negative number', predicate: isNonNegativeValue, getActualValueMsg: getNumberTypeActualValueMsg }, nonNegativeNumberString: { name: 'non-negative number', predicate: value => isNonNegativeValue(parseInt(value, 10)), getActualValueMsg: value => { const number = parseInt(value, 10); return isNaN(number) ? JSON.stringify(value) : number; } }, boolean: { name: 'boolean', predicate: (value, type) => type === 'boolean' }, string: { name: 'string', predicate: (value, type) => type === 'string' }, function: { name: 'function', predicate: (value, type) => type === 'function' }, regExp: { name: 'regular expression', predicate: lodash_1.isRegExp }, array: { name: 'array', predicate: value => Array.isArray(value) }, nonNullObject: { name: 'non-null object', predicate: (value, type) => type === 'object' && !lodash_1.isNil(value), getActualValueMsg: (value, type) => lodash_1.isNil(value) ? String(value) : type }, requestHookSubclass: { name: 'RequestHook subclass', predicate: value => value instanceof hook_1.default && value.constructor && value.constructor !== hook_1.default }, clientScriptInitializer: { name: 'client script initializer', predicate: value => typeof value === 'object' && ['path', 'content', 'module'].some(prop => value && prop in value) } }; function assertType(types, callsiteName, what, value) { types = Array.isArray(types) ? types : [types]; let pass = false; const actualType = typeof value; let actualMsg = actualType; let expectedTypeMsg = ''; const last = types.length - 1; types.forEach((type, i) => { pass = pass || type.predicate(value, actualType); if (type.getActualValueMsg) actualMsg = type.getActualValueMsg(value, actualType); if (i === 0) expectedTypeMsg += type.name; else expectedTypeMsg += (i === last ? ' or ' + getIndefiniteArticle(type.name) + ' ' : ', ') + type.name; }); if (!pass) { throw callsiteName ? new _1.APIError(callsiteName, types_1.RUNTIME_ERRORS.invalidValueType, what, expectedTypeMsg, actualMsg) : new _1.GeneralError(types_1.RUNTIME_ERRORS.invalidValueType, what, expectedTypeMsg, actualMsg); } } exports.assertType = assertType; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZS1hc3NlcnRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2Vycm9ycy9ydW50aW1lL3R5cGUtYXNzZXJ0aW9ucy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG1DQUEwRjtBQUMxRix5QkFBNEM7QUFDNUMsb0NBQTBDO0FBQzFDLHdFQUF1RDtBQUV2RCxNQUFNLG1CQUFtQixHQUFHLFdBQVcsQ0FBQztBQUV4QyxTQUFTLG9CQUFvQixDQUFFLElBQUk7SUFDL0IsT0FBTyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQ3ZELENBQUM7QUFFRCxTQUFTLGtCQUFrQixDQUFFLEtBQUs7SUFDOUIsT0FBTyxpQkFBYyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUM7QUFDL0MsQ0FBQztBQUVELFNBQVMsMkJBQTJCLENBQUUsS0FBSyxFQUFFLElBQUk7SUFDN0MsSUFBSSxJQUFJLEtBQUssUUFBUTtRQUNqQixPQUFPLElBQUksQ0FBQztJQUVoQixJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQ25CLE9BQU8sR0FBRyxDQUFDO0lBRWYsSUFBSSxDQUFDLGlCQUFjLENBQUMsS0FBSyxDQUFDO1FBQ3RCLE9BQU8sUUFBUSxDQUFDO0lBRXBCLE9BQU8sS0FBSyxDQUFDO0FBQ2pCLENBQUM7QUFFWSxRQUFBLEVBQUUsR0FBRztJQUNkLE1BQU0sRUFBRTtRQUNKLElBQUksRUFBZSxRQUFRO1FBQzNCLFNBQVMsRUFBVSxpQkFBYztRQUNqQyxpQkFBaUIsRUFBRSwyQkFBMkI7S0FDakQ7SUFFRCxpQkFBaUIsRUFBRTtRQUNmLElBQUksRUFBZSxxQkFBcUI7UUFDeEMsU0FBUyxFQUFVLGtCQUFrQjtRQUNyQyxpQkFBaUIsRUFBRSwyQkFBMkI7S0FDakQ7SUFFRCx1QkFBdUIs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LENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDdEIsSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztRQUVqRCxJQUFJLElBQUksQ0FBQyxpQkFBaUI7WUFDdEIsU0FBUyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFMUQsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUNQLGVBQWUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDOztZQUU3QixlQUFlLElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztJQUM1RyxDQUFDLENBQUMsQ0FBQztJQUVILElBQUksQ0FBQyxJQUFJLEVBQUU7UUFDUCxNQUFNLFlBQVksQ0FBQyxDQUFDO1lBQ2hCLElBQUksV0FBUSxDQUFDLFlBQVksRUFBRSxzQkFBYyxDQUFDLGdCQUFnQixFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUMvRixJQUFJLGVBQVksQ0FBQyxzQkFBYyxDQUFDLGdCQUFnQixFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsU0FBUyxDQUFDLENBQUM7S0FDM0Y7QUFDTCxDQUFDO0FBMUJELGdDQTBCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzRmluaXRlIGFzIGlzRmluaXRlTnVtYmVyLCBpc1JlZ0V4cCwgaXNOaWwgYXMgaXNOdWxsT3JVbmRlZmluZWQgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgQVBJRXJyb3IsIEdlbmVyYWxFcnJvciB9IGZyb20gJy4vJztcbmltcG9ydCB7IFJVTlRJTUVfRVJST1JTIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IFJlcXVlc3RIb29rIGZyb20gJy4uLy4uL2FwaS9yZXF1ZXN0LWhvb2tzL2hvb2snO1xuXG5jb25zdCBTVEFSVF9GUk9NX1ZPV0VMX1JFID0gL15bYWVpb3VdL2k7XG5cbmZ1bmN0aW9uIGdldEluZGVmaW5pdGVBcnRpY2xlICh0ZXh0KSB7XG4gICAgcmV0dXJuIFNUQVJUX0ZST01fVk9XRUxfUkUudGVzdCh0ZXh0KSA/ICdhbicgOiAnYSc7XG59XG5cbmZ1bmN0aW9uIGlzTm9uTmVnYXRpdmVWYWx1ZSAodmFsdWUpIHtcbiAgICByZXR1cm4gaXNGaW5pdGVOdW1iZXIodmFsdWUpICYmIHZhbHVlID49IDA7XG59XG5cbmZ1bmN0aW9uIGdldE51bWJlclR5cGVBY3R1YWxWYWx1ZU1zZyAodmFsdWUsIHR5cGUpIHtcbiAgICBpZiAodHlwZSAhPT0gJ251bWJlcicpXG4gICAgICAgIHJldHVybiB0eXBlO1xuXG4gICAgaWYgKE51bWJlci5pc05hTih2YWx1ZSkpXG4gICAgICAgIHJldHVybiBOYU47XG5cbiAgICBpZiAoIWlzRmluaXRlTnVtYmVyKHZhbHVlKSlcbiAgICAgICAgcmV0dXJuIEluZmluaXR5O1xuXG4gICAgcmV0dXJuIHZhbHVlO1xufVxuXG5leHBvcnQgY29uc3QgaXMgPSB7XG4gICAgbnVtYmVyOiB7XG4gICAgICAgIG5hbWU6ICAgICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgcHJlZGljYXRlOiAgICAgICAgIGlzRmluaXRlTnVtYmVyLFxuICAgICAgICBnZXRBY3R1YWxWYWx1ZU1zZzogZ2V0TnVtYmVyVHlwZUFjdHVhbFZhbHVlTXNnXG4gICAgfSxcblxuICAgIG5vbk5lZ2F0aXZlTnVtYmVyOiB7XG4gICAgICAgIG5hbWU6ICAgICAgICAgICAgICAnbm9uLW5lZ2F0aXZlIG51bWJlcicsXG4gICAgICAgIHByZWRpY2F0ZTogICAgICAgICBpc05vbk5lZ2F0aXZlVmFsdWUsXG4gICAgICAgIGdldEFjdHVhbFZhbHVlTXNnOiBnZXROdW1iZXJUeXBlQWN0dWFsVmFsdWVNc2dcbiAgICB9LFxuXG4gICAgbm9uTmVnYXRpdmVOdW1iZXJTdHJpbmc6IHtcbiAgICAgICAgbmFtZTogICAgICAnbm9uLW5lZ2F0aXZlIG51bWJlcicsXG4gICAgICAgIHByZWRpY2F0ZTogdmFsdWUgPT4gaXNOb25OZWdhdGl2ZVZhbHVlKHBhcnNlSW50KHZhbHVlLCAxMCkpLFxuXG4gICAgICAgIGdldEFjdHVhbFZhbHVlTXNnOiB2YWx1ZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBudW1iZXIgPSBwYXJzZUludCh2YWx1ZSwgMTApO1xuXG4gICAgICAgICAgICByZXR1cm4gaXNOYU4obnVtYmVyKSA/IEpTT04uc3RyaW5naWZ5KHZhbHVlKSA6IG51bWJlcjtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBib29sZWFuOiB7XG4gICAgICAgIG5hbWU6ICAgICAgJ2Jvb2xlYW4nLFxuICAgICAgICBwcmVkaWNhdGU6ICh2YWx1ZSwgdHlwZSkgPT4gdHlwZSA9PT0gJ2Jvb2xlYW4nXG4gICAgfSxcblxuICAgIHN0cmluZzoge1xuICAgICAgICBuYW1lOiAgICAgICdzdHJpbmcnLFxuICAgICAgICBwcmVkaWNhdGU6ICh2YWx1ZSwgdHlwZSkgPT4gdHlwZSA9PT0gJ3N0cmluZydcbiAgICB9LFxuXG4gICAgZnVuY3Rpb246IHtcbiAgICAgICAgbmFtZTogICAgICAnZnVuY3Rpb24nLFxuICAgICAgICBwcmVkaWNhdGU6ICh2YWx1ZSwgdHlwZSkgPT4gdHlwZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgIH0sXG5cbiAgICByZWdFeHA6IHtcbiAgICAgICAgbmFtZTogICAgICAncmVndWxhciBleHByZXNzaW9uJyxcbiAgICAgICAgcHJlZGljYXRlOiBpc1JlZ0V4cFxuICAgIH0sXG5cbiAgICBhcnJheToge1xuICAgICAgICBuYW1lOiAgICAgICdhcnJheScsXG4gICAgICAgIHByZWRpY2F0ZTogdmFsdWUgPT4gQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICB9LFxuXG4gICAgbm9uTnVsbE9iamVjdDoge1xuICAgICAgICBuYW1lOiAgICAgICAgICAgICAgJ25vbi1udWxsIG9iamVjdCcsXG4gICAgICAgIHByZWRpY2F0ZTogICAgICAgICAodmFsdWUsIHR5cGUpID0+IHR5cGUgPT09ICdvYmplY3QnICYmICFpc051bGxPclVuZGVmaW5lZCh2YWx1ZSksXG4gICAgICAgIGdldEFjdHVhbFZhbHVlTXNnOiAodmFsdWUsIHR5cGUpID0+IGlzTnVsbE9yVW5kZWZpbmVkKHZhbHVlKSA/IFN0cmluZyh2YWx1ZSkgOiB0eXBlXG4gICAgfSxcblxuICAgIHJlcXVlc3RIb29rU3ViY2xhc3M6IHtcbiAgICAgICAgbmFtZTogICAgICAnUmVxdWVzdEhvb2sgc3ViY2xhc3MnLFxuICAgICAgICBwcmVkaWNhdGU6IHZhbHVlID0+IHZhbHVlIGluc3RhbmNlb2YgUmVxdWVzdEhvb2sgJiYgdmFsdWUuY29uc3RydWN0b3IgJiYgdmFsdWUuY29uc3RydWN0b3IgIT09IFJlcXVlc3RIb29rXG4gICAgfSxcblxuICAgIGNsaWVudFNjcmlwdEluaXRpYWxpemVyOiB7XG4gICAgICAgIG5hbWU6ICAgICAgJ2NsaWVudCBzY3JpcHQgaW5pdGlhbGl6ZXInLFxuICAgICAgICBwcmVkaWNhdGU6IHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgWydwYXRoJywgJ2NvbnRlbnQnLCAnbW9kdWxlJ10uc29tZShwcm9wID0+IHZhbHVlICYmIHByb3AgaW4gdmFsdWUpXG4gICAgfVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFR5cGUgKHR5cGVzLCBjYWxsc2l0ZU5hbWUsIHdoYXQsIHZhbHVlKSB7XG4gICAgdHlwZXMgPSBBcnJheS5pc0FycmF5KHR5cGVzKSA/IHR5cGVzIDogW3R5cGVzXTtcblxuICAgIGxldCBwYXNzICAgICAgICAgICAgPSBmYWxzZTtcbiAgICBjb25zdCBhY3R1YWxUeXBlICAgICAgPSB0eXBlb2YgdmFsdWU7XG4gICAgbGV0IGFjdHVhbE1zZyAgICAgICA9IGFjdHVhbFR5cGU7XG4gICAgbGV0IGV4cGVjdGVkVHlwZU1zZyA9ICcnO1xuICAgIGNvbnN0IGxhc3QgICAgICAgICAgICA9IHR5cGVzLmxlbmd0aCAtIDE7XG5cbiAgICB0eXBlcy5mb3JFYWNoKCh0eXBlLCBpKSA9PiB7XG4gICAgICAgIHBhc3MgPSBwYXNzIHx8IHR5cGUucHJlZGljYXRlKHZhbHVlLCBhY3R1YWxUeXBlKTtcblxuICAgICAgICBpZiAodHlwZS5nZXRBY3R1YWxWYWx1ZU1zZylcbiAgICAgICAgICAgIGFjdHVhbE1zZyA9IHR5cGUuZ2V0QWN0dWFsVmFsdWVNc2codmFsdWUsIGFjdHVhbFR5cGUpO1xuXG4gICAgICAgIGlmIChpID09PSAwKVxuICAgICAgICAgICAgZXhwZWN0ZWRUeXBlTXNnICs9IHR5cGUubmFtZTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZXhwZWN0ZWRUeXBlTXNnICs9IChpID09PSBsYXN0ID8gJyBvciAnICsgZ2V0SW5kZWZpbml0ZUFydGljbGUodHlwZS5uYW1lKSArICcgJyA6ICcsICcpICsgdHlwZS5uYW1lO1xuICAgIH0pO1xuXG4gICAgaWYgKCFwYXNzKSB7XG4gICAgICAgIHRocm93IGNhbGxzaXRlTmFtZSA/XG4gICAgICAgICAgICBuZXcgQVBJRXJyb3IoY2FsbHNpdGVOYW1lLCBSVU5USU1FX0VSUk9SUy5pbnZhbGlkVmFsdWVUeXBlLCB3aGF0LCBleHBlY3RlZFR5cGVNc2csIGFjdHVhbE1zZykgOlxuICAgICAgICAgICAgbmV3IEdlbmVyYWxFcnJvcihSVU5USU1FX0VSUk9SUy5pbnZhbGlkVmFsdWVUeXBlLCB3aGF0LCBleHBlY3RlZFR5cGVNc2csIGFjdHVhbE1zZyk7XG4gICAgfVxufVxuIl19