//! api-check version 7.5.5 built with ♥ by Kent C. Dodds (http://kent.doddsfamily.us) (ó ì_í)=óò=(ì_í ò) (function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); else if(typeof define === 'function' && define.amd) define(factory); else if(typeof exports === 'object') exports["apiCheck"] = factory(); else root["apiCheck"] = factory(); })(this, function() { return /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) /******/ return installedModules[moduleId].exports; /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ exports: {}, /******/ id: moduleId, /******/ loaded: false /******/ }; /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ // Flag the module as loaded /******/ module.loaded = true; /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ // Load entry module and return exports /******/ return __webpack_require__(0); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _apiCheck = __webpack_require__(1); var _apiCheck2 = _interopRequireDefault(_apiCheck); exports['default'] = _apiCheck2['default']; module.exports = exports['default']; /***/ }, /* 1 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; var stringify = __webpack_require__(2); var apiCheckUtil = __webpack_require__(3); var each = apiCheckUtil.each; var isError = apiCheckUtil.isError; var t = apiCheckUtil.t; var arrayify = apiCheckUtil.arrayify; var getCheckerDisplay = apiCheckUtil.getCheckerDisplay; var typeOf = apiCheckUtil.typeOf; var getError = apiCheckUtil.getError; var checkers = __webpack_require__(4); var apiCheckApis = getApiCheckApis(); module.exports = getApiCheckInstance; module.exports.VERSION = ("7.5.5"); module.exports.utils = apiCheckUtil; module.exports.globalConfig = { verbose: false, disabled: false }; var apiCheckApiCheck = getApiCheckInstance({ output: { prefix: 'apiCheck' } }); module.exports.internalChecker = apiCheckApiCheck; each(checkers, function (checker, name) { return module.exports[name] = checker; }); function getApiCheckInstance() { var config = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; var extraCheckers = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; /* eslint complexity:[2, 6] */ if (apiCheckApiCheck && arguments.length) { apiCheckApiCheck['throw'](apiCheckApis.getApiCheckInstanceCheckers, arguments, { prefix: 'creating an apiCheck instance' }); } var additionalProperties = { 'throw': getApiCheck(true), warn: getApiCheck(false), getErrorMessage: getErrorMessage, handleErrorMessage: handleErrorMessage, config: { output: config.output || { prefix: '', suffix: '', docsBaseUrl: '' }, verbose: config.verbose || false, disabled: config.disabled || false }, utils: apiCheckUtil }; each(additionalProperties, function (wrapper, name) { return apiCheck[name] = wrapper; }); var disabled = apiCheck.disabled || module.exports.globalConfig.disabled; each(checkers.getCheckers(disabled), function (checker, name) { return apiCheck[name] = checker; }); each(extraCheckers, function (checker, name) { return apiCheck[name] = checker; }); return apiCheck; /** * This is the instance function. Other things are attached to this see additional properties above. * @param {Array} api - the checkers to check with * @param {Array} args - the args to check * @param {Object} output - output options * @returns {Object} - if this has a failed = true property, then it failed */ function apiCheck(api, args, output) { /* eslint complexity:[2, 8] */ if (apiCheck.config.disabled || module.exports.globalConfig.disabled) { return { apiTypes: {}, argTypes: {}, passed: true, message: '', failed: false }; // empty version of what is normally returned } checkApiCheckApi(arguments); if (!Array.isArray(api)) { api = [api]; args = [args]; } else { // turn arguments into an array args = Array.prototype.slice.call(args); } var messages = checkEnoughArgs(api, args); if (!messages.length) { // this is where we actually go perform the checks. messages = checkApiWithArgs(api, args); } var returnObject = getTypes(api, args); returnObject.args = args; if (messages.length) { returnObject.message = apiCheck.getErrorMessage(api, args, messages, output); returnObject.failed = true; returnObject.passed = false; } else { returnObject.message = ''; returnObject.failed = false; returnObject.passed = true; } return returnObject; } /** * checkApiCheckApi, should be read like: check apiCheck api. As in, check the api for apiCheck :-) * @param {Array} checkApiArgs - args provided to apiCheck function */ function checkApiCheckApi(checkApiArgs) { var api = checkApiArgs[0]; var args = checkApiArgs[1]; var isArrayOrArgs = Array.isArray(args) || args && typeof args === 'object' && typeof args.length === 'number'; if (Array.isArray(api) && !isArrayOrArgs) { throw new Error(getErrorMessage(api, [args], ['If an array is provided for the api, an array must be provided for the args as well.'], { prefix: 'apiCheck' })); } // dog fooding here var errors = checkApiWithArgs(apiCheckApis.checkApiCheckApi, checkApiArgs); if (errors.length) { var message = apiCheck.getErrorMessage(apiCheckApis.checkApiCheckApi, checkApiArgs, errors, { prefix: 'apiCheck' }); apiCheck.handleErrorMessage(message, true); } } function getApiCheck(shouldThrow) { return function apiCheckWrapper(api, args, output) { var result = apiCheck(api, args, output); apiCheck.handleErrorMessage(result.message, shouldThrow); return result; // wont get here if an error is thrown }; } function handleErrorMessage(message, shouldThrow) { if (shouldThrow && message) { throw new Error(message); } else if (message) { /* eslint no-console:0 */ console.warn(message); } } function getErrorMessage(api, args) { var messages = arguments.length <= 2 || arguments[2] === undefined ? [] : arguments[2]; var output = arguments.length <= 3 || arguments[3] === undefined ? {} : arguments[3]; var gOut = apiCheck.config.output || {}; var prefix = getPrefix(); var suffix = getSuffix(); var url = getUrl(); var message = 'apiCheck failed! ' + messages.join(', '); var passedAndShouldHavePassed = '\n\n' + buildMessageFromApiAndArgs(api, args); return (prefix + ' ' + message + ' ' + suffix + ' ' + (url || '') + passedAndShouldHavePassed).trim(); function getPrefix() { var p = output.onlyPrefix; if (!p) { p = ((gOut.prefix || '') + ' ' + (output.prefix || '')).trim(); } return p; } function getSuffix() { var s = output.onlySuffix; if (!s) { s = ((output.suffix || '') + ' ' + (gOut.suffix || '')).trim(); } return s; } function getUrl() { var u = output.url; if (!u) { u = gOut.docsBaseUrl && output.urlSuffix && ('' + gOut.docsBaseUrl + output.urlSuffix).trim(); } return u; } } function buildMessageFromApiAndArgs(api, args) { var _getTypes = getTypes(api, args); var apiTypes = _getTypes.apiTypes; var argTypes = _getTypes.argTypes; var copy = Array.prototype.slice.call(args || []); var replacedItems = []; replaceFunctionWithName(copy); var passedArgs = getObjectString(copy); argTypes = getObjectString(argTypes); apiTypes = getObjectString(apiTypes); return generateMessage(); // functions function replaceFunctionWithName(obj) { each(obj, function (val, name) { /* eslint complexity:[2, 6] */ if (replacedItems.indexOf(val) === -1) { // avoid recursive problems replacedItems.push(val); if (typeof val === 'object') { replaceFunctionWithName(obj); } else if (typeof val === 'function') { obj[name] = val.displayName || val.name || 'anonymous function'; } } }); } function getObjectString(types) { if (!types || !types.length) { return 'nothing'; } else if (types && types.length === 1) { types = types[0]; } return stringify(types, null, 2); } function generateMessage() { var n = '\n'; var useS = true; if (args && args.length === 1) { if (typeof args[0] === 'object' && args[0] !== null) { useS = !!Object.keys(args[0]).length; } else { useS = false; } } var types = 'type' + (useS ? 's' : ''); var newLine = n + n; return 'You passed:' + n + passedArgs + newLine + ('With the ' + types + ':' + n + argTypes + newLine) + ('The API calls for:' + n + apiTypes); } } function getTypes(api, args) { api = arrayify(api); args = arrayify(args); var apiTypes = api.map(function (checker, index) { var specified = module.exports.globalConfig.hasOwnProperty('verbose'); return getCheckerDisplay(checker, { terse: specified ? !module.exports.globalConfig.verbose : !apiCheck.config.verbose, obj: args[index], addHelpers: true }); }); var argTypes = args.map(function (arg) { return getArgDisplay(arg, []); }); return { argTypes: argTypes, apiTypes: apiTypes }; } } // STATELESS FUNCTIONS /** * This is where the magic happens for actually checking the arguments with the api. * @param {Array} api - checkers * @param {Array} args - and arguments object * @returns {Array} - the error messages */ function checkApiWithArgs(api, args) { /* eslint complexity:[2, 7] */ var messages = []; var failed = false; var checkerIndex = 0; var argIndex = 0; var arg = undefined, checker = undefined, res = undefined, lastChecker = undefined, argName = undefined, argFailed = undefined, skipPreviousChecker = undefined; /* jshint -W084 */ while ((checker = api[checkerIndex++]) && argIndex < args.length) { arg = args[argIndex++]; argName = 'Argument ' + argIndex + (checker.isOptional ? ' (optional)' : ''); res = checker(arg, 'value', argName); argFailed = isError(res); lastChecker = checkerIndex >= api.length; skipPreviousChecker = checkerIndex > 1 && api[checkerIndex - 1].isOptional; if (argFailed && lastChecker || argFailed && !lastChecker && !checker.isOptional && !skipPreviousChecker) { failed = true; messages.push(getCheckerErrorMessage(res, checker, arg)); } else if (argFailed && checker.isOptional) { argIndex--; } else { messages.push(t(argName) + ' passed'); } } return failed ? messages : []; } checkerTypeType.type = 'function with __apiCheckData property and `${function.type}` property'; function checkerTypeType(checkerType, name, location) { var apiCheckDataChecker = checkers.shape({ type: checkers.string, optional: checkers.bool }); var asFunc = checkers.func.withProperties({ __apiCheckData: apiCheckDataChecker }); var asShape = checkers.shape({ __apiCheckData: apiCheckDataChecker }); var wrongShape = checkers.oneOfType([asFunc, asShape])(checkerType, name, location); if (isError(wrongShape)) { return wrongShape; } if (typeof checkerType !== 'function' && !checkerType.hasOwnProperty(checkerType.__apiCheckData.type)) { return getError(name, location, checkerTypeType.type); } } function getCheckerErrorMessage(res, checker, val) { var checkerHelp = getCheckerHelp(checker, val); checkerHelp = checkerHelp ? ' - ' + checkerHelp : ''; return res.message + checkerHelp; } function getCheckerHelp(_ref, val) { var help = _ref.help; if (!help) { return ''; } if (typeof help === 'function') { help = help(val); } return help; } function checkEnoughArgs(api, args) { var requiredArgs = api.filter(function (a) { return !a.isOptional; }); if (args.length < requiredArgs.length) { return ['Not enough arguments specified. Requires `' + requiredArgs.length + '`, you passed `' + args.length + '`']; } else { return []; } } function getArgDisplay(arg, gottenArgs) { /* eslint complexity:[2, 7] */ var cName = arg && arg.constructor && arg.constructor.name; var type = typeOf(arg); if (type === 'function') { if (hasKeys()) { var properties = stringify(getDisplayIfNotGotten()); return cName + ' (with properties: ' + properties + ')'; } return cName; } if (arg === null) { return 'null'; } if (type !== 'array' && type !== 'object') { return type; } if (hasKeys()) { return getDisplayIfNotGotten(); } return cName; // utility functions function hasKeys() { return arg && Object.keys(arg).length; } function getDisplayIfNotGotten() { if (gottenArgs.indexOf(arg) !== -1) { return '[Circular]'; } gottenArgs.push(arg); return getDisplay(arg, gottenArgs); } } function getDisplay(obj, gottenArgs) { var argDisplay = {}; each(obj, function (v, k) { return argDisplay[k] = getArgDisplay(v, gottenArgs); }); return argDisplay; } function getApiCheckApis() { var os = checkers.string.optional; var checkerFnChecker = checkers.func.withProperties({ type: checkers.oneOfType([checkers.string, checkerTypeType]).optional, displayName: checkers.string.optional, shortType: checkers.string.optional, notOptional: checkers.bool.optional, notRequired: checkers.bool.optional }); var getApiCheckInstanceCheckers = [checkers.shape({ output: checkers.shape({ prefix: checkers.string.optional, suffix: checkers.string.optional, docsBaseUrl: checkers.string.optional }).strict.optional, verbose: checkers.bool.optional, disabled: checkers.bool.optional }).strict.optional, checkers.objectOf(checkerFnChecker).optional]; var checkApiCheckApi = [checkers.typeOrArrayOf(checkerFnChecker), checkers.any.optional, checkers.shape({ prefix: os, suffix: os, urlSuffix: os, // appended case onlyPrefix: os, onlySuffix: os, url: os // override case }).strict.optional]; return { checkerFnChecker: checkerFnChecker, getApiCheckInstanceCheckers: getApiCheckInstanceCheckers, checkApiCheckApi: checkApiCheckApi }; } /***/ }, /* 2 */ /***/ function(module, exports) { module.exports = stringify; function getSerialize (fn, decycle) { var seen = [], keys = []; decycle = decycle || function(key, value) { return '[Circular ' + getPath(value, seen, keys) + ']' }; return function(key, value) { var ret = value; if (typeof value === 'object' && value) { if (seen.indexOf(value) !== -1) ret = decycle(key, value); else { seen.push(value); keys.push(key); } } if (fn) ret = fn(key, ret); return ret; } } function getPath (value, seen, keys) { var index = seen.indexOf(value); var path = [ keys[index] ]; for (index--; index >= 0; index--) { if (seen[index][ path[0] ] === value) { value = seen[index]; path.unshift(keys[index]); } } return '~' + path.join('.'); } function stringify(obj, fn, spaces, decycle) { return JSON.stringify(obj, getSerialize(fn, decycle), spaces); } stringify.getSerialize = getSerialize; /***/ }, /* 3 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var stringify = __webpack_require__(2); var checkerHelpers = { addOptional: addOptional, getRequiredVersion: getRequiredVersion, setupChecker: setupChecker, addNullable: addNullable }; module.exports = { each: each, copy: copy, typeOf: typeOf, arrayify: arrayify, getCheckerDisplay: getCheckerDisplay, isError: isError, list: list, getError: getError, nAtL: nAtL, t: t, undef: undef, checkerHelpers: checkerHelpers, noop: noop }; function copy(obj) { var type = typeOf(obj); var daCopy = undefined; if (type === 'array') { daCopy = []; } else if (type === 'object') { daCopy = {}; } else { return obj; } each(obj, function (val, key) { daCopy[key] = val; // cannot single-line this because we don't want to abort the each }); return daCopy; } function typeOf(obj) { if (Array.isArray(obj)) { return 'array'; } else if (obj instanceof RegExp) { return 'object'; } else { return typeof obj; } } function getCheckerDisplay(checker, options) { /* eslint complexity:[2, 7] */ var display = undefined; var short = options && options.short; if (short && checker.shortType) { display = checker.shortType; } else if (!short && typeof checker.type === 'object' || checker.type === 'function') { display = getCheckerType(checker, options); } else { display = getCheckerType(checker, options) || checker.displayName || checker.name; } return display; } function getCheckerType(_ref, options) { var type = _ref.type; if (typeof type === 'function') { var __apiCheckData = type.__apiCheckData; var typeTypes = type(options); type = _defineProperty({ __apiCheckData: __apiCheckData }, __apiCheckData.type, typeTypes); } return type; } function arrayify(obj) { if (!obj) { return []; } else if (Array.isArray(obj)) { return obj; } else { return [obj]; } } function each(obj, iterator, context) { if (Array.isArray(obj)) { return eachArry(obj, iterator, context); } else { return eachObj(obj, iterator, context); } } function eachObj(obj, iterator, context) { var ret = undefined; var hasOwn = Object.prototype.hasOwnProperty; /* eslint prefer-const:0 */ // some weird eslint bug? for (var key in obj) { if (hasOwn.call(obj, key)) { ret = iterator.call(context, obj[key], key, obj); if (ret === false) { return ret; } } } return true; } function eachArry(obj, iterator, context) { var ret = undefined; var length = obj.length; for (var i = 0; i < length; i++) { ret = iterator.call(context, obj[i], i, obj); if (ret === false) { return ret; } } return true; } function isError(obj) { return obj instanceof Error; } function list(arry, join, finalJoin) { arry = arrayify(arry); var copy = arry.slice(); var last = copy.pop(); if (copy.length === 1) { join = ' '; } return copy.join(join) + ('' + (copy.length ? join + finalJoin : '') + last); } function getError(name, location, checkerType) { if (typeof checkerType === 'function') { checkerType = checkerType({ short: true }); } var stringType = typeof checkerType !== 'object' ? checkerType : stringify(checkerType); return new Error(nAtL(name, location) + ' must be ' + t(stringType)); } function nAtL(name, location) { var tName = t(name || 'value'); var tLocation = !location ? '' : ' at ' + t(location); return '' + tName + tLocation; } function t(thing) { return '`' + thing + '`'; } function undef(thing) { return typeof thing === 'undefined'; } /** * This will set up the checker with all of the defaults that most checkers want like required by default and an * optional version * * @param {Function} checker - the checker to setup with properties * @param {Object} properties - properties to add to the checker * @param {boolean} disabled - when set to true, this will set the checker to a no-op function * @returns {Function} checker - the setup checker */ function setupChecker(checker, properties, disabled) { /* eslint complexity:[2, 9] */ if (disabled) { // swap out the checker for its own copy of noop checker = getNoop(); checker.isNoop = true; } if (typeof checker.type === 'string') { checker.shortType = checker.type; } // assign all properties given each(properties, function (prop, name) { return checker[name] = prop; }); if (!checker.displayName) { checker.displayName = 'apiCheck ' + t(checker.shortType || checker.type || checker.name) + ' type checker'; } if (!checker.notRequired) { checker = getRequiredVersion(checker, disabled); } if (!checker.notNullable) { addNullable(checker, disabled); } if (!checker.notOptional) { addOptional(checker, disabled); } return checker; } function getRequiredVersion(checker, disabled) { var requiredChecker = disabled ? getNoop() : function requiredChecker(val, name, location, obj) { if (undef(val) && !checker.isOptional) { var tLocation = location ? ' in ' + t(location) : ''; var type = getCheckerDisplay(checker, { short: true }); var stringType = typeof type !== 'object' ? type : stringify(type); return new Error('Required ' + t(name) + ' not specified' + tLocation + '. Must be ' + t(stringType)); } else { return checker(val, name, location, obj); } }; copyProps(checker, requiredChecker); requiredChecker.originalChecker = checker; return requiredChecker; } function addOptional(checker, disabled) { var optionalCheck = disabled ? getNoop() : function optionalCheck(val, name, location, obj) { if (!undef(val)) { return checker(val, name, location, obj); } }; // inherit all properties on the original checker copyProps(checker, optionalCheck); optionalCheck.isOptional = true; optionalCheck.displayName = checker.displayName + ' (optional)'; optionalCheck.originalChecker = checker; // the magic line that allows you to add .optional to the end of the checkers checker.optional = optionalCheck; fixType(checker, checker.optional); } function addNullable(checker, disabled) { var nullableCheck = disabled ? getNoop() : function nullableCheck(val, name, location, obj) { if (val !== null) { return checker(val, name, location, obj); } }; // inherit all properties on the original checker copyProps(checker, nullableCheck); nullableCheck.isNullable = true; nullableCheck.displayName = checker.displayName + ' (nullable)'; nullableCheck.originalChecker = checker; // the magic line that allows you to add .nullable to the end of the checkers checker.nullable = nullableCheck; fixType(checker, checker.nullable); if (!checker.notOptional) { addOptional(checker.nullable, disabled); } } function fixType(checker, checkerCopy) { // fix type, because it's not a straight copy... // the reason is we need to specify type.__apiCheckData.optional as true for the terse/verbose option. // we also want to add "(optional)" to the types with a string if (typeof checkerCopy.type === 'object') { checkerCopy.type = copy(checkerCopy.type); // make our own copy of this } else if (typeof checkerCopy.type === 'function') { checkerCopy.type = function () { return checker.type.apply(checker, arguments); }; } else { checkerCopy.type += ' (optional)'; return; } checkerCopy.type.__apiCheckData = copy(checker.type.__apiCheckData) || {}; // and this checkerCopy.type.__apiCheckData.optional = true; } // UTILS function copyProps(src, dest) { each(Object.keys(src), function (key) { return dest[key] = src[key]; }); } function noop() {} function getNoop() { /* eslint no-shadow:0 */ /* istanbul ignore next */ return function noop() {}; } /***/ }, /* 4 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; var stringify = __webpack_require__(2); var _require = __webpack_require__(3); var typeOf = _require.typeOf; var each = _require.each; var copy = _require.copy; var getCheckerDisplay = _require.getCheckerDisplay; var isError = _require.isError; var arrayify = _require.arrayify; var list = _require.list; var getError = _require.getError; var nAtL = _require.nAtL; var t = _require.t; var checkerHelpers = _require.checkerHelpers; var undef = _require.undef; var setupChecker = checkerHelpers.setupChecker; var checkers = module.exports = getCheckers(); module.exports.getCheckers = getCheckers; function getCheckers(disabled) { return { array: typeOfCheckGetter('Array'), bool: typeOfCheckGetter('Boolean'), number: typeOfCheckGetter('Number'), string: typeOfCheckGetter('String'), func: funcCheckGetter(), object: objectCheckGetter(), emptyObject: emptyObjectCheckGetter(), instanceOf: instanceCheckGetter, oneOf: oneOfCheckGetter, oneOfType: oneOfTypeCheckGetter, arrayOf: arrayOfCheckGetter, objectOf: objectOfCheckGetter, typeOrArrayOf: typeOrArrayOfCheckGetter, range: rangeCheckGetter, lessThan: lessThanCheckGetter, greaterThan: greaterThanCheckGetter, shape: getShapeCheckGetter(), args: argumentsCheckerGetter(), any: anyCheckGetter(), 'null': nullCheckGetter() }; function typeOfCheckGetter(type) { var lType = type.toLowerCase(); return setupChecker(function typeOfCheckerDefinition(val, name, location) { if (typeOf(val) !== lType) { return getError(name, location, type); } }, { type: type }, disabled); } function funcCheckGetter() { var type = 'Function'; var functionChecker = setupChecker(function functionCheckerDefinition(val, name, location) { if (typeOf(val) !== 'function') { return getError(name, location, type); } }, { type: type }, disabled); functionChecker.withProperties = function getWithPropertiesChecker(properties) { var apiError = checkers.objectOf(checkers.func)(properties, 'properties', 'apiCheck.func.withProperties'); if (isError(apiError)) { throw apiError; } var shapeChecker = checkers.shape(properties, true); shapeChecker.type.__apiCheckData.type = 'func.withProperties'; return setupChecker(function functionWithPropertiesChecker(val, name, location) { var notFunction = checkers.func(val, name, location); if (isError(notFunction)) { return notFunction; } return shapeChecker(val, name, location); }, { type: shapeChecker.type, shortType: 'func.withProperties' }, disabled); }; return functionChecker; } function objectCheckGetter() { var type = 'Object'; var nullType = 'Object (null ok)'; var objectNullOkChecker = setupChecker(function objectNullOkCheckerDefinition(val, name, location) { if (typeOf(val) !== 'object') { return getError(name, location, nullType); } }, { type: nullType }, disabled); var objectChecker = setupChecker(function objectCheckerDefinition(val, name, location) { if (val === null || isError(objectNullOkChecker(val, name, location))) { return getError(name, location, objectChecker.type); } }, { type: type, nullOk: objectNullOkChecker }, disabled); return objectChecker; } function instanceCheckGetter(classToCheck) { return setupChecker(function instanceCheckerDefinition(val, name, location) { if (!(val instanceof classToCheck)) { return getError(name, location, classToCheck.name); } }, { type: classToCheck.name }, disabled); } function oneOfCheckGetter(enums) { var type = { __apiCheckData: { optional: false, type: 'enum' }, 'enum': enums }; var shortType = 'oneOf[' + enums.map(function (enm) { return stringify(enm); }).join(', ') + ']'; return setupChecker(function oneOfCheckerDefinition(val, name, location) { if (!enums.some(function (enm) { return enm === val; })) { return getError(name, location, shortType); } }, { type: type, shortType: shortType }, disabled); } function oneOfTypeCheckGetter(typeCheckers) { var checkersDisplay = typeCheckers.map(function (checker) { return getCheckerDisplay(checker, { short: true }); }); var shortType = 'oneOfType[' + checkersDisplay.join(', ') + ']'; function type(options) { if (options && options.short) { return shortType; } return typeCheckers.map(function (checker) { return getCheckerDisplay(checker, options); }); } type.__apiCheckData = { optional: false, type: 'oneOfType' }; return setupChecker(function oneOfTypeCheckerDefinition(val, name, location) { if (!typeCheckers.some(function (checker) { return !isError(checker(val, name, location)); })) { return getError(name, location, shortType); } }, { type: type, shortType: shortType }, disabled); } function arrayOfCheckGetter(checker) { var shortCheckerDisplay = getCheckerDisplay(checker, { short: true }); var shortType = 'arrayOf[' + shortCheckerDisplay + ']'; function type(options) { if (options && options.short) { return shortType; } return getCheckerDisplay(checker, options); } type.__apiCheckData = { optional: false, type: 'arrayOf' }; return setupChecker(function arrayOfCheckerDefinition(val, name, location) { if (isError(checkers.array(val)) || !val.every(function (item) { return !isError(checker(item)); })) { return getError(name, location, shortType); } }, { type: type, shortType: shortType }, disabled); } function objectOfCheckGetter(checker) { var checkerDisplay = getCheckerDisplay(checker, { short: true }); var shortType = 'objectOf[' + checkerDisplay + ']'; function type(options) { if (options && options.short) { return shortType; } return getCheckerDisplay(checker, options); } type.__apiCheckData = { optional: false, type: 'objectOf' }; return setupChecker(function objectOfCheckerDefinition(val, name, location) { var notObject = checkers.object(val, name, location); if (isError(notObject)) { return notObject; } var allTypesSuccess = each(val, function (item, key) { if (isError(checker(item, key, name))) { return false; } }); if (!allTypesSuccess) { return getError(name, location, shortType); } }, { type: type, shortType: shortType }, disabled); } function typeOrArrayOfCheckGetter(checker) { var checkerDisplay = getCheckerDisplay(checker, { short: true }); var shortType = 'typeOrArrayOf[' + checkerDisplay + ']'; function type(options) { if (options && options.short) { return shortType; } return getCheckerDisplay(checker, options); } type.__apiCheckData = { optional: false, type: 'typeOrArrayOf' }; return setupChecker(function typeOrArrayOfDefinition(val, name, location, obj) { if (isError(checkers.oneOfType([checker, checkers.arrayOf(checker)])(val, name, location, obj))) { return getError(name, location, shortType); } }, { type: type, shortType: shortType }, disabled); } function getShapeCheckGetter() { function shapeCheckGetter(shape, nonObject) { var shapeTypes = {}; each(shape, function (checker, prop) { shapeTypes[prop] = getCheckerDisplay(checker); }); function type() { var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; var ret = {}; var terse = options.terse; var obj = options.obj; var addHelpers = options.addHelpers; var parentRequired = options.required; each(shape, function (checker, prop) { /* eslint complexity:[2, 6] */ var specified = obj && obj.hasOwnProperty(prop); var required = undef(parentRequired) ? !checker.isOptional : parentRequired; if (!terse || (specified || !checker.isOptional)) { ret[prop] = getCheckerDisplay(checker, { terse: terse, obj: obj && obj[prop], required: required, addHelpers: addHelpers }); } if (addHelpers) { modifyTypeDisplayToHelpOut(ret, prop, specified, checker, required); } }); return ret; function modifyTypeDisplayToHelpOut(theRet, prop, specified, checker, required) { if (!specified && required && !checker.isOptional) { var item = 'ITEM'; if (checker.type && checker.type.__apiCheckData) { item = checker.type.__apiCheckData.type.toUpperCase(); } addHelper('missing', 'MISSING THIS ' + item, ' <-- YOU ARE MISSING THIS'); } else if (specified) { var error = checker(obj[prop], prop, null, obj); if (isError(error)) { addHelper('error', 'THIS IS THE PROBLEM: ' + error.message, ' <-- THIS IS THE PROBLEM: ' + error.message); } } function addHelper(property, objectMessage, stringMessage) { if (typeof theRet[prop] === 'string') { theRet[prop] += stringMessage; } else { theRet[prop].__apiCheckData[property] = objectMessage; } } } } type.__apiCheckData = { strict: false, optional: false, type: 'shape' }; var shapeChecker = setupChecker(function shapeCheckerDefinition(val, name, location) { /* eslint complexity:[2, 6] */ var isObject = !nonObject && checkers.object(val, name, location); if (isError(isObject)) { return isObject; } var shapePropError = undefined; location = location ? location + (name ? '/' : '') : ''; name = name || ''; each(shape, function (checker, prop) { if (val.hasOwnProperty(prop) || !checker.isOptional) { shapePropError = checker(val[prop], prop, '' + location + name, val); return !isError(shapePropError); } }); if (isError(shapePropError)) { return shapePropError; } }, { type: type, shortType: 'shape' }, disabled); function strictType() { return type.apply(undefined, arguments); } strictType.__apiCheckData = copy(shapeChecker.type.__apiCheckData); strictType.__apiCheckData.strict = true; shapeChecker.strict = setupChecker(function strictShapeCheckerDefinition(val, name, location) { var shapeError = shapeChecker(val, name, location); if (isError(shapeError)) { return shapeError; } var allowedProperties = Object.keys(shape); var extraProps = Object.keys(val).filter(function (prop) { return allowedProperties.indexOf(prop) === -1; }); if (extraProps.length) { return new Error(nAtL(name, location) + ' cannot have extra properties: ' + t(extraProps.join('`, `')) + '.' + ('It is limited to ' + t(allowedProperties.join('`, `')))); } }, { type: strictType, shortType: 'strict shape' }, disabled); return shapeChecker; } shapeCheckGetter.ifNot = function ifNot(otherProps, propChecker) { if (!Array.isArray(otherProps)) { otherProps = [otherProps]; } var description = undefined; if (otherProps.length === 1) { description = 'specified only if ' + otherProps[0] + ' is not specified'; } else { description = 'specified only if none of the following are specified: [' + list(otherProps, ', ', 'and ') + ']'; } var shortType = 'ifNot[' + otherProps.join(', ') + ']'; var type = getTypeForShapeChild(propChecker, description, shortType); return setupChecker(function ifNotChecker(prop, propName, location, obj) { var propExists = obj && obj.hasOwnProperty(propName); var otherPropsExist = otherProps.some(function (otherProp) { return obj && obj.hasOwnProperty(otherProp); }); if (propExists === otherPropsExist) { return getError(propName, location, type); } else if (propExists) { return propChecker(prop, propName, location, obj); } }, { notRequired: true, type: type, shortType: shortType }, disabled); }; shapeCheckGetter.onlyIf = function onlyIf(otherProps, propChecker) { otherProps = arrayify(otherProps); var description = undefined; if (otherProps.length === 1) { description = 'specified only if ' + otherProps[0] + ' is also specified'; } else { description = 'specified only if all of the following are specified: [' + list(otherProps, ', ', 'and ') + ']'; } var shortType = 'onlyIf[' + otherProps.join(', ') + ']'; var type = getTypeForShapeChild(propChecker, description, shortType); return setupChecker(function onlyIfCheckerDefinition(prop, propName, location, obj) { var othersPresent = otherProps.every(function (property) { return obj.hasOwnProperty(property); }); if (!othersPresent) { return getError(propName, location, type); } else { return propChecker(prop, propName, location, obj); } }, { type: type, shortType: shortType }, disabled); }; shapeCheckGetter.requiredIfNot = function shapeRequiredIfNot(otherProps, propChecker) { if (!Array.isArray(otherProps)) { otherProps = [otherProps]; } return getRequiredIfNotChecker(false, otherProps, propChecker); }; shapeCheckGetter.requiredIfNot.all = function shapeRequiredIfNotAll(otherProps, propChecker) { if (!Array.isArray(otherProps)) { throw new Error('requiredIfNot.all must be passed an array'); } return getRequiredIfNotChecker(true, otherProps, propChecker); }; function getRequiredIfNotChecker(all, otherProps, propChecker) { var props = t(otherProps.join(', ')); var ifProps = 'if ' + (all ? 'all of' : 'at least one of'); var description = 'specified ' + ifProps + ' these are not specified: ' + props + ' (otherwise it\'s optional)'; var shortType = 'requiredIfNot' + (all ? '.all' : '') + '[' + otherProps.join(', ') + '}]'; var type = getTypeForShapeChild(propChecker, description, shortType); return setupChecker(function shapeRequiredIfNotDefinition(prop, propName, location, obj) { var propExists = obj && obj.hasOwnProperty(propName); var iteration = all ? 'every' : 'some'; var otherPropsExist = otherProps[iteration](function (otherProp) { return obj && obj.hasOwnProperty(otherProp); }); if (!otherPropsExist && !propExists) { return getError(propName, location, type); } else if (propExists) { return propChecker(prop, propName, location, obj); } }, { type: type, notRequired: true }, disabled); } return shapeCheckGetter; function getTypeForShapeChild(propChecker, description, shortType) { function type(options) { if (options && options.short) { return shortType; } return getCheckerDisplay(propChecker); } type.__apiCheckData = { optional: false, type: 'ifNot', description: description }; return type; } } function argumentsCheckerGetter() { var type = 'function arguments'; return setupChecker(function argsCheckerDefinition(val, name, location) { if (Array.isArray(val) || isError(checkers.object(val)) || isError(checkers.number(val.length))) { return getError(name, location, type); } }, { type: type }, disabled); } function anyCheckGetter() { return setupChecker(function anyCheckerDefinition() { // don't do anything }, { type: 'any' }, disabled); } function nullCheckGetter() { var type = 'null'; return setupChecker(function nullChecker(val, name, location) { if (val !== null) { return getError(name, location, type); } }, { type: type }, disabled); } function rangeCheckGetter(min, max) { var type = 'Range (' + min + ' - ' + max + ')'; return setupChecker(function rangeChecker(val, name, location) { if (typeof val !== 'number' || val < min || val > max) { return getError(name, location, type); } }, { type: type }, disabled); } function lessThanCheckGetter(min) { var type = 'lessThan[' + min + ']'; return setupChecker(function lessThanChecker(val, name, location) { if (typeof val !== 'number' || val > min) { return getError(name, location, type); } }, { type: type }, disabled); } function greaterThanCheckGetter(max) { var type = 'greaterThan[' + max + ']'; return setupChecker(function greaterThanChecker(val, name, location) { if (typeof val !== 'number' || val < max) { return getError(name, location, type); } }, { type: type }, disabled); } function emptyObjectCheckGetter() { var type = 'empty object'; return setupChecker(function emptyObjectChecker(val, name, location) { if (typeOf(val) !== 'object' || val === null || Object.keys(val).length) { return getError(name, location, type); } }, { type: type }, disabled); } } /***/ } /******/ ]) }); ;