api-check.js 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332
  1. //! api-check version 7.5.5 built with ♥ by Kent C. Dodds <kent@doddsfamily.us> (http://kent.doddsfamily.us) (ó ì_í)=óò=(ì_í ò)
  2. (function webpackUniversalModuleDefinition(root, factory) {
  3. if(typeof exports === 'object' && typeof module === 'object')
  4. module.exports = factory();
  5. else if(typeof define === 'function' && define.amd)
  6. define(factory);
  7. else if(typeof exports === 'object')
  8. exports["apiCheck"] = factory();
  9. else
  10. root["apiCheck"] = factory();
  11. })(this, function() {
  12. return /******/ (function(modules) { // webpackBootstrap
  13. /******/ // The module cache
  14. /******/ var installedModules = {};
  15. /******/ // The require function
  16. /******/ function __webpack_require__(moduleId) {
  17. /******/ // Check if module is in cache
  18. /******/ if(installedModules[moduleId])
  19. /******/ return installedModules[moduleId].exports;
  20. /******/ // Create a new module (and put it into the cache)
  21. /******/ var module = installedModules[moduleId] = {
  22. /******/ exports: {},
  23. /******/ id: moduleId,
  24. /******/ loaded: false
  25. /******/ };
  26. /******/ // Execute the module function
  27. /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
  28. /******/ // Flag the module as loaded
  29. /******/ module.loaded = true;
  30. /******/ // Return the exports of the module
  31. /******/ return module.exports;
  32. /******/ }
  33. /******/ // expose the modules object (__webpack_modules__)
  34. /******/ __webpack_require__.m = modules;
  35. /******/ // expose the module cache
  36. /******/ __webpack_require__.c = installedModules;
  37. /******/ // __webpack_public_path__
  38. /******/ __webpack_require__.p = "";
  39. /******/ // Load entry module and return exports
  40. /******/ return __webpack_require__(0);
  41. /******/ })
  42. /************************************************************************/
  43. /******/ ([
  44. /* 0 */
  45. /***/ function(module, exports, __webpack_require__) {
  46. 'use strict';
  47. Object.defineProperty(exports, '__esModule', {
  48. value: true
  49. });
  50. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
  51. var _apiCheck = __webpack_require__(1);
  52. var _apiCheck2 = _interopRequireDefault(_apiCheck);
  53. exports['default'] = _apiCheck2['default'];
  54. module.exports = exports['default'];
  55. /***/ },
  56. /* 1 */
  57. /***/ function(module, exports, __webpack_require__) {
  58. 'use strict';
  59. var stringify = __webpack_require__(2);
  60. var apiCheckUtil = __webpack_require__(3);
  61. var each = apiCheckUtil.each;
  62. var isError = apiCheckUtil.isError;
  63. var t = apiCheckUtil.t;
  64. var arrayify = apiCheckUtil.arrayify;
  65. var getCheckerDisplay = apiCheckUtil.getCheckerDisplay;
  66. var typeOf = apiCheckUtil.typeOf;
  67. var getError = apiCheckUtil.getError;
  68. var checkers = __webpack_require__(4);
  69. var apiCheckApis = getApiCheckApis();
  70. module.exports = getApiCheckInstance;
  71. module.exports.VERSION = ("7.5.5");
  72. module.exports.utils = apiCheckUtil;
  73. module.exports.globalConfig = {
  74. verbose: false,
  75. disabled: false
  76. };
  77. var apiCheckApiCheck = getApiCheckInstance({
  78. output: { prefix: 'apiCheck' }
  79. });
  80. module.exports.internalChecker = apiCheckApiCheck;
  81. each(checkers, function (checker, name) {
  82. return module.exports[name] = checker;
  83. });
  84. function getApiCheckInstance() {
  85. var config = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
  86. var extraCheckers = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
  87. /* eslint complexity:[2, 6] */
  88. if (apiCheckApiCheck && arguments.length) {
  89. apiCheckApiCheck['throw'](apiCheckApis.getApiCheckInstanceCheckers, arguments, {
  90. prefix: 'creating an apiCheck instance'
  91. });
  92. }
  93. var additionalProperties = {
  94. 'throw': getApiCheck(true),
  95. warn: getApiCheck(false),
  96. getErrorMessage: getErrorMessage,
  97. handleErrorMessage: handleErrorMessage,
  98. config: {
  99. output: config.output || {
  100. prefix: '',
  101. suffix: '',
  102. docsBaseUrl: ''
  103. },
  104. verbose: config.verbose || false,
  105. disabled: config.disabled || false
  106. },
  107. utils: apiCheckUtil
  108. };
  109. each(additionalProperties, function (wrapper, name) {
  110. return apiCheck[name] = wrapper;
  111. });
  112. var disabled = apiCheck.disabled || module.exports.globalConfig.disabled;
  113. each(checkers.getCheckers(disabled), function (checker, name) {
  114. return apiCheck[name] = checker;
  115. });
  116. each(extraCheckers, function (checker, name) {
  117. return apiCheck[name] = checker;
  118. });
  119. return apiCheck;
  120. /**
  121. * This is the instance function. Other things are attached to this see additional properties above.
  122. * @param {Array} api - the checkers to check with
  123. * @param {Array} args - the args to check
  124. * @param {Object} output - output options
  125. * @returns {Object} - if this has a failed = true property, then it failed
  126. */
  127. function apiCheck(api, args, output) {
  128. /* eslint complexity:[2, 8] */
  129. if (apiCheck.config.disabled || module.exports.globalConfig.disabled) {
  130. return {
  131. apiTypes: {}, argTypes: {},
  132. passed: true, message: '',
  133. failed: false
  134. }; // empty version of what is normally returned
  135. }
  136. checkApiCheckApi(arguments);
  137. if (!Array.isArray(api)) {
  138. api = [api];
  139. args = [args];
  140. } else {
  141. // turn arguments into an array
  142. args = Array.prototype.slice.call(args);
  143. }
  144. var messages = checkEnoughArgs(api, args);
  145. if (!messages.length) {
  146. // this is where we actually go perform the checks.
  147. messages = checkApiWithArgs(api, args);
  148. }
  149. var returnObject = getTypes(api, args);
  150. returnObject.args = args;
  151. if (messages.length) {
  152. returnObject.message = apiCheck.getErrorMessage(api, args, messages, output);
  153. returnObject.failed = true;
  154. returnObject.passed = false;
  155. } else {
  156. returnObject.message = '';
  157. returnObject.failed = false;
  158. returnObject.passed = true;
  159. }
  160. return returnObject;
  161. }
  162. /**
  163. * checkApiCheckApi, should be read like: check apiCheck api. As in, check the api for apiCheck :-)
  164. * @param {Array} checkApiArgs - args provided to apiCheck function
  165. */
  166. function checkApiCheckApi(checkApiArgs) {
  167. var api = checkApiArgs[0];
  168. var args = checkApiArgs[1];
  169. var isArrayOrArgs = Array.isArray(args) || args && typeof args === 'object' && typeof args.length === 'number';
  170. if (Array.isArray(api) && !isArrayOrArgs) {
  171. 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' }));
  172. }
  173. // dog fooding here
  174. var errors = checkApiWithArgs(apiCheckApis.checkApiCheckApi, checkApiArgs);
  175. if (errors.length) {
  176. var message = apiCheck.getErrorMessage(apiCheckApis.checkApiCheckApi, checkApiArgs, errors, {
  177. prefix: 'apiCheck'
  178. });
  179. apiCheck.handleErrorMessage(message, true);
  180. }
  181. }
  182. function getApiCheck(shouldThrow) {
  183. return function apiCheckWrapper(api, args, output) {
  184. var result = apiCheck(api, args, output);
  185. apiCheck.handleErrorMessage(result.message, shouldThrow);
  186. return result; // wont get here if an error is thrown
  187. };
  188. }
  189. function handleErrorMessage(message, shouldThrow) {
  190. if (shouldThrow && message) {
  191. throw new Error(message);
  192. } else if (message) {
  193. /* eslint no-console:0 */
  194. console.warn(message);
  195. }
  196. }
  197. function getErrorMessage(api, args) {
  198. var messages = arguments.length <= 2 || arguments[2] === undefined ? [] : arguments[2];
  199. var output = arguments.length <= 3 || arguments[3] === undefined ? {} : arguments[3];
  200. var gOut = apiCheck.config.output || {};
  201. var prefix = getPrefix();
  202. var suffix = getSuffix();
  203. var url = getUrl();
  204. var message = 'apiCheck failed! ' + messages.join(', ');
  205. var passedAndShouldHavePassed = '\n\n' + buildMessageFromApiAndArgs(api, args);
  206. return (prefix + ' ' + message + ' ' + suffix + ' ' + (url || '') + passedAndShouldHavePassed).trim();
  207. function getPrefix() {
  208. var p = output.onlyPrefix;
  209. if (!p) {
  210. p = ((gOut.prefix || '') + ' ' + (output.prefix || '')).trim();
  211. }
  212. return p;
  213. }
  214. function getSuffix() {
  215. var s = output.onlySuffix;
  216. if (!s) {
  217. s = ((output.suffix || '') + ' ' + (gOut.suffix || '')).trim();
  218. }
  219. return s;
  220. }
  221. function getUrl() {
  222. var u = output.url;
  223. if (!u) {
  224. u = gOut.docsBaseUrl && output.urlSuffix && ('' + gOut.docsBaseUrl + output.urlSuffix).trim();
  225. }
  226. return u;
  227. }
  228. }
  229. function buildMessageFromApiAndArgs(api, args) {
  230. var _getTypes = getTypes(api, args);
  231. var apiTypes = _getTypes.apiTypes;
  232. var argTypes = _getTypes.argTypes;
  233. var copy = Array.prototype.slice.call(args || []);
  234. var replacedItems = [];
  235. replaceFunctionWithName(copy);
  236. var passedArgs = getObjectString(copy);
  237. argTypes = getObjectString(argTypes);
  238. apiTypes = getObjectString(apiTypes);
  239. return generateMessage();
  240. // functions
  241. function replaceFunctionWithName(obj) {
  242. each(obj, function (val, name) {
  243. /* eslint complexity:[2, 6] */
  244. if (replacedItems.indexOf(val) === -1) {
  245. // avoid recursive problems
  246. replacedItems.push(val);
  247. if (typeof val === 'object') {
  248. replaceFunctionWithName(obj);
  249. } else if (typeof val === 'function') {
  250. obj[name] = val.displayName || val.name || 'anonymous function';
  251. }
  252. }
  253. });
  254. }
  255. function getObjectString(types) {
  256. if (!types || !types.length) {
  257. return 'nothing';
  258. } else if (types && types.length === 1) {
  259. types = types[0];
  260. }
  261. return stringify(types, null, 2);
  262. }
  263. function generateMessage() {
  264. var n = '\n';
  265. var useS = true;
  266. if (args && args.length === 1) {
  267. if (typeof args[0] === 'object' && args[0] !== null) {
  268. useS = !!Object.keys(args[0]).length;
  269. } else {
  270. useS = false;
  271. }
  272. }
  273. var types = 'type' + (useS ? 's' : '');
  274. var newLine = n + n;
  275. return 'You passed:' + n + passedArgs + newLine + ('With the ' + types + ':' + n + argTypes + newLine) + ('The API calls for:' + n + apiTypes);
  276. }
  277. }
  278. function getTypes(api, args) {
  279. api = arrayify(api);
  280. args = arrayify(args);
  281. var apiTypes = api.map(function (checker, index) {
  282. var specified = module.exports.globalConfig.hasOwnProperty('verbose');
  283. return getCheckerDisplay(checker, {
  284. terse: specified ? !module.exports.globalConfig.verbose : !apiCheck.config.verbose,
  285. obj: args[index],
  286. addHelpers: true
  287. });
  288. });
  289. var argTypes = args.map(function (arg) {
  290. return getArgDisplay(arg, []);
  291. });
  292. return { argTypes: argTypes, apiTypes: apiTypes };
  293. }
  294. }
  295. // STATELESS FUNCTIONS
  296. /**
  297. * This is where the magic happens for actually checking the arguments with the api.
  298. * @param {Array} api - checkers
  299. * @param {Array} args - and arguments object
  300. * @returns {Array} - the error messages
  301. */
  302. function checkApiWithArgs(api, args) {
  303. /* eslint complexity:[2, 7] */
  304. var messages = [];
  305. var failed = false;
  306. var checkerIndex = 0;
  307. var argIndex = 0;
  308. var arg = undefined,
  309. checker = undefined,
  310. res = undefined,
  311. lastChecker = undefined,
  312. argName = undefined,
  313. argFailed = undefined,
  314. skipPreviousChecker = undefined;
  315. /* jshint -W084 */
  316. while ((checker = api[checkerIndex++]) && argIndex < args.length) {
  317. arg = args[argIndex++];
  318. argName = 'Argument ' + argIndex + (checker.isOptional ? ' (optional)' : '');
  319. res = checker(arg, 'value', argName);
  320. argFailed = isError(res);
  321. lastChecker = checkerIndex >= api.length;
  322. skipPreviousChecker = checkerIndex > 1 && api[checkerIndex - 1].isOptional;
  323. if (argFailed && lastChecker || argFailed && !lastChecker && !checker.isOptional && !skipPreviousChecker) {
  324. failed = true;
  325. messages.push(getCheckerErrorMessage(res, checker, arg));
  326. } else if (argFailed && checker.isOptional) {
  327. argIndex--;
  328. } else {
  329. messages.push(t(argName) + ' passed');
  330. }
  331. }
  332. return failed ? messages : [];
  333. }
  334. checkerTypeType.type = 'function with __apiCheckData property and `${function.type}` property';
  335. function checkerTypeType(checkerType, name, location) {
  336. var apiCheckDataChecker = checkers.shape({
  337. type: checkers.string,
  338. optional: checkers.bool
  339. });
  340. var asFunc = checkers.func.withProperties({ __apiCheckData: apiCheckDataChecker });
  341. var asShape = checkers.shape({ __apiCheckData: apiCheckDataChecker });
  342. var wrongShape = checkers.oneOfType([asFunc, asShape])(checkerType, name, location);
  343. if (isError(wrongShape)) {
  344. return wrongShape;
  345. }
  346. if (typeof checkerType !== 'function' && !checkerType.hasOwnProperty(checkerType.__apiCheckData.type)) {
  347. return getError(name, location, checkerTypeType.type);
  348. }
  349. }
  350. function getCheckerErrorMessage(res, checker, val) {
  351. var checkerHelp = getCheckerHelp(checker, val);
  352. checkerHelp = checkerHelp ? ' - ' + checkerHelp : '';
  353. return res.message + checkerHelp;
  354. }
  355. function getCheckerHelp(_ref, val) {
  356. var help = _ref.help;
  357. if (!help) {
  358. return '';
  359. }
  360. if (typeof help === 'function') {
  361. help = help(val);
  362. }
  363. return help;
  364. }
  365. function checkEnoughArgs(api, args) {
  366. var requiredArgs = api.filter(function (a) {
  367. return !a.isOptional;
  368. });
  369. if (args.length < requiredArgs.length) {
  370. return ['Not enough arguments specified. Requires `' + requiredArgs.length + '`, you passed `' + args.length + '`'];
  371. } else {
  372. return [];
  373. }
  374. }
  375. function getArgDisplay(arg, gottenArgs) {
  376. /* eslint complexity:[2, 7] */
  377. var cName = arg && arg.constructor && arg.constructor.name;
  378. var type = typeOf(arg);
  379. if (type === 'function') {
  380. if (hasKeys()) {
  381. var properties = stringify(getDisplayIfNotGotten());
  382. return cName + ' (with properties: ' + properties + ')';
  383. }
  384. return cName;
  385. }
  386. if (arg === null) {
  387. return 'null';
  388. }
  389. if (type !== 'array' && type !== 'object') {
  390. return type;
  391. }
  392. if (hasKeys()) {
  393. return getDisplayIfNotGotten();
  394. }
  395. return cName;
  396. // utility functions
  397. function hasKeys() {
  398. return arg && Object.keys(arg).length;
  399. }
  400. function getDisplayIfNotGotten() {
  401. if (gottenArgs.indexOf(arg) !== -1) {
  402. return '[Circular]';
  403. }
  404. gottenArgs.push(arg);
  405. return getDisplay(arg, gottenArgs);
  406. }
  407. }
  408. function getDisplay(obj, gottenArgs) {
  409. var argDisplay = {};
  410. each(obj, function (v, k) {
  411. return argDisplay[k] = getArgDisplay(v, gottenArgs);
  412. });
  413. return argDisplay;
  414. }
  415. function getApiCheckApis() {
  416. var os = checkers.string.optional;
  417. var checkerFnChecker = checkers.func.withProperties({
  418. type: checkers.oneOfType([checkers.string, checkerTypeType]).optional,
  419. displayName: checkers.string.optional,
  420. shortType: checkers.string.optional,
  421. notOptional: checkers.bool.optional,
  422. notRequired: checkers.bool.optional
  423. });
  424. var getApiCheckInstanceCheckers = [checkers.shape({
  425. output: checkers.shape({
  426. prefix: checkers.string.optional,
  427. suffix: checkers.string.optional,
  428. docsBaseUrl: checkers.string.optional
  429. }).strict.optional,
  430. verbose: checkers.bool.optional,
  431. disabled: checkers.bool.optional
  432. }).strict.optional, checkers.objectOf(checkerFnChecker).optional];
  433. var checkApiCheckApi = [checkers.typeOrArrayOf(checkerFnChecker), checkers.any.optional, checkers.shape({
  434. prefix: os, suffix: os, urlSuffix: os, // appended case
  435. onlyPrefix: os, onlySuffix: os, url: os // override case
  436. }).strict.optional];
  437. return {
  438. checkerFnChecker: checkerFnChecker,
  439. getApiCheckInstanceCheckers: getApiCheckInstanceCheckers,
  440. checkApiCheckApi: checkApiCheckApi
  441. };
  442. }
  443. /***/ },
  444. /* 2 */
  445. /***/ function(module, exports) {
  446. module.exports = stringify;
  447. function getSerialize (fn, decycle) {
  448. var seen = [], keys = [];
  449. decycle = decycle || function(key, value) {
  450. return '[Circular ' + getPath(value, seen, keys) + ']'
  451. };
  452. return function(key, value) {
  453. var ret = value;
  454. if (typeof value === 'object' && value) {
  455. if (seen.indexOf(value) !== -1)
  456. ret = decycle(key, value);
  457. else {
  458. seen.push(value);
  459. keys.push(key);
  460. }
  461. }
  462. if (fn) ret = fn(key, ret);
  463. return ret;
  464. }
  465. }
  466. function getPath (value, seen, keys) {
  467. var index = seen.indexOf(value);
  468. var path = [ keys[index] ];
  469. for (index--; index >= 0; index--) {
  470. if (seen[index][ path[0] ] === value) {
  471. value = seen[index];
  472. path.unshift(keys[index]);
  473. }
  474. }
  475. return '~' + path.join('.');
  476. }
  477. function stringify(obj, fn, spaces, decycle) {
  478. return JSON.stringify(obj, getSerialize(fn, decycle), spaces);
  479. }
  480. stringify.getSerialize = getSerialize;
  481. /***/ },
  482. /* 3 */
  483. /***/ function(module, exports, __webpack_require__) {
  484. 'use strict';
  485. 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; }
  486. var stringify = __webpack_require__(2);
  487. var checkerHelpers = {
  488. addOptional: addOptional, getRequiredVersion: getRequiredVersion, setupChecker: setupChecker, addNullable: addNullable
  489. };
  490. module.exports = {
  491. each: each, copy: copy, typeOf: typeOf, arrayify: arrayify, getCheckerDisplay: getCheckerDisplay,
  492. isError: isError, list: list, getError: getError, nAtL: nAtL, t: t, undef: undef, checkerHelpers: checkerHelpers,
  493. noop: noop
  494. };
  495. function copy(obj) {
  496. var type = typeOf(obj);
  497. var daCopy = undefined;
  498. if (type === 'array') {
  499. daCopy = [];
  500. } else if (type === 'object') {
  501. daCopy = {};
  502. } else {
  503. return obj;
  504. }
  505. each(obj, function (val, key) {
  506. daCopy[key] = val; // cannot single-line this because we don't want to abort the each
  507. });
  508. return daCopy;
  509. }
  510. function typeOf(obj) {
  511. if (Array.isArray(obj)) {
  512. return 'array';
  513. } else if (obj instanceof RegExp) {
  514. return 'object';
  515. } else {
  516. return typeof obj;
  517. }
  518. }
  519. function getCheckerDisplay(checker, options) {
  520. /* eslint complexity:[2, 7] */
  521. var display = undefined;
  522. var short = options && options.short;
  523. if (short && checker.shortType) {
  524. display = checker.shortType;
  525. } else if (!short && typeof checker.type === 'object' || checker.type === 'function') {
  526. display = getCheckerType(checker, options);
  527. } else {
  528. display = getCheckerType(checker, options) || checker.displayName || checker.name;
  529. }
  530. return display;
  531. }
  532. function getCheckerType(_ref, options) {
  533. var type = _ref.type;
  534. if (typeof type === 'function') {
  535. var __apiCheckData = type.__apiCheckData;
  536. var typeTypes = type(options);
  537. type = _defineProperty({
  538. __apiCheckData: __apiCheckData
  539. }, __apiCheckData.type, typeTypes);
  540. }
  541. return type;
  542. }
  543. function arrayify(obj) {
  544. if (!obj) {
  545. return [];
  546. } else if (Array.isArray(obj)) {
  547. return obj;
  548. } else {
  549. return [obj];
  550. }
  551. }
  552. function each(obj, iterator, context) {
  553. if (Array.isArray(obj)) {
  554. return eachArry(obj, iterator, context);
  555. } else {
  556. return eachObj(obj, iterator, context);
  557. }
  558. }
  559. function eachObj(obj, iterator, context) {
  560. var ret = undefined;
  561. var hasOwn = Object.prototype.hasOwnProperty;
  562. /* eslint prefer-const:0 */ // some weird eslint bug?
  563. for (var key in obj) {
  564. if (hasOwn.call(obj, key)) {
  565. ret = iterator.call(context, obj[key], key, obj);
  566. if (ret === false) {
  567. return ret;
  568. }
  569. }
  570. }
  571. return true;
  572. }
  573. function eachArry(obj, iterator, context) {
  574. var ret = undefined;
  575. var length = obj.length;
  576. for (var i = 0; i < length; i++) {
  577. ret = iterator.call(context, obj[i], i, obj);
  578. if (ret === false) {
  579. return ret;
  580. }
  581. }
  582. return true;
  583. }
  584. function isError(obj) {
  585. return obj instanceof Error;
  586. }
  587. function list(arry, join, finalJoin) {
  588. arry = arrayify(arry);
  589. var copy = arry.slice();
  590. var last = copy.pop();
  591. if (copy.length === 1) {
  592. join = ' ';
  593. }
  594. return copy.join(join) + ('' + (copy.length ? join + finalJoin : '') + last);
  595. }
  596. function getError(name, location, checkerType) {
  597. if (typeof checkerType === 'function') {
  598. checkerType = checkerType({ short: true });
  599. }
  600. var stringType = typeof checkerType !== 'object' ? checkerType : stringify(checkerType);
  601. return new Error(nAtL(name, location) + ' must be ' + t(stringType));
  602. }
  603. function nAtL(name, location) {
  604. var tName = t(name || 'value');
  605. var tLocation = !location ? '' : ' at ' + t(location);
  606. return '' + tName + tLocation;
  607. }
  608. function t(thing) {
  609. return '`' + thing + '`';
  610. }
  611. function undef(thing) {
  612. return typeof thing === 'undefined';
  613. }
  614. /**
  615. * This will set up the checker with all of the defaults that most checkers want like required by default and an
  616. * optional version
  617. *
  618. * @param {Function} checker - the checker to setup with properties
  619. * @param {Object} properties - properties to add to the checker
  620. * @param {boolean} disabled - when set to true, this will set the checker to a no-op function
  621. * @returns {Function} checker - the setup checker
  622. */
  623. function setupChecker(checker, properties, disabled) {
  624. /* eslint complexity:[2, 9] */
  625. if (disabled) {
  626. // swap out the checker for its own copy of noop
  627. checker = getNoop();
  628. checker.isNoop = true;
  629. }
  630. if (typeof checker.type === 'string') {
  631. checker.shortType = checker.type;
  632. }
  633. // assign all properties given
  634. each(properties, function (prop, name) {
  635. return checker[name] = prop;
  636. });
  637. if (!checker.displayName) {
  638. checker.displayName = 'apiCheck ' + t(checker.shortType || checker.type || checker.name) + ' type checker';
  639. }
  640. if (!checker.notRequired) {
  641. checker = getRequiredVersion(checker, disabled);
  642. }
  643. if (!checker.notNullable) {
  644. addNullable(checker, disabled);
  645. }
  646. if (!checker.notOptional) {
  647. addOptional(checker, disabled);
  648. }
  649. return checker;
  650. }
  651. function getRequiredVersion(checker, disabled) {
  652. var requiredChecker = disabled ? getNoop() : function requiredChecker(val, name, location, obj) {
  653. if (undef(val) && !checker.isOptional) {
  654. var tLocation = location ? ' in ' + t(location) : '';
  655. var type = getCheckerDisplay(checker, { short: true });
  656. var stringType = typeof type !== 'object' ? type : stringify(type);
  657. return new Error('Required ' + t(name) + ' not specified' + tLocation + '. Must be ' + t(stringType));
  658. } else {
  659. return checker(val, name, location, obj);
  660. }
  661. };
  662. copyProps(checker, requiredChecker);
  663. requiredChecker.originalChecker = checker;
  664. return requiredChecker;
  665. }
  666. function addOptional(checker, disabled) {
  667. var optionalCheck = disabled ? getNoop() : function optionalCheck(val, name, location, obj) {
  668. if (!undef(val)) {
  669. return checker(val, name, location, obj);
  670. }
  671. };
  672. // inherit all properties on the original checker
  673. copyProps(checker, optionalCheck);
  674. optionalCheck.isOptional = true;
  675. optionalCheck.displayName = checker.displayName + ' (optional)';
  676. optionalCheck.originalChecker = checker;
  677. // the magic line that allows you to add .optional to the end of the checkers
  678. checker.optional = optionalCheck;
  679. fixType(checker, checker.optional);
  680. }
  681. function addNullable(checker, disabled) {
  682. var nullableCheck = disabled ? getNoop() : function nullableCheck(val, name, location, obj) {
  683. if (val !== null) {
  684. return checker(val, name, location, obj);
  685. }
  686. };
  687. // inherit all properties on the original checker
  688. copyProps(checker, nullableCheck);
  689. nullableCheck.isNullable = true;
  690. nullableCheck.displayName = checker.displayName + ' (nullable)';
  691. nullableCheck.originalChecker = checker;
  692. // the magic line that allows you to add .nullable to the end of the checkers
  693. checker.nullable = nullableCheck;
  694. fixType(checker, checker.nullable);
  695. if (!checker.notOptional) {
  696. addOptional(checker.nullable, disabled);
  697. }
  698. }
  699. function fixType(checker, checkerCopy) {
  700. // fix type, because it's not a straight copy...
  701. // the reason is we need to specify type.__apiCheckData.optional as true for the terse/verbose option.
  702. // we also want to add "(optional)" to the types with a string
  703. if (typeof checkerCopy.type === 'object') {
  704. checkerCopy.type = copy(checkerCopy.type); // make our own copy of this
  705. } else if (typeof checkerCopy.type === 'function') {
  706. checkerCopy.type = function () {
  707. return checker.type.apply(checker, arguments);
  708. };
  709. } else {
  710. checkerCopy.type += ' (optional)';
  711. return;
  712. }
  713. checkerCopy.type.__apiCheckData = copy(checker.type.__apiCheckData) || {}; // and this
  714. checkerCopy.type.__apiCheckData.optional = true;
  715. }
  716. // UTILS
  717. function copyProps(src, dest) {
  718. each(Object.keys(src), function (key) {
  719. return dest[key] = src[key];
  720. });
  721. }
  722. function noop() {}
  723. function getNoop() {
  724. /* eslint no-shadow:0 */
  725. /* istanbul ignore next */
  726. return function noop() {};
  727. }
  728. /***/ },
  729. /* 4 */
  730. /***/ function(module, exports, __webpack_require__) {
  731. 'use strict';
  732. var stringify = __webpack_require__(2);
  733. var _require = __webpack_require__(3);
  734. var typeOf = _require.typeOf;
  735. var each = _require.each;
  736. var copy = _require.copy;
  737. var getCheckerDisplay = _require.getCheckerDisplay;
  738. var isError = _require.isError;
  739. var arrayify = _require.arrayify;
  740. var list = _require.list;
  741. var getError = _require.getError;
  742. var nAtL = _require.nAtL;
  743. var t = _require.t;
  744. var checkerHelpers = _require.checkerHelpers;
  745. var undef = _require.undef;
  746. var setupChecker = checkerHelpers.setupChecker;
  747. var checkers = module.exports = getCheckers();
  748. module.exports.getCheckers = getCheckers;
  749. function getCheckers(disabled) {
  750. return {
  751. array: typeOfCheckGetter('Array'),
  752. bool: typeOfCheckGetter('Boolean'),
  753. number: typeOfCheckGetter('Number'),
  754. string: typeOfCheckGetter('String'),
  755. func: funcCheckGetter(),
  756. object: objectCheckGetter(),
  757. emptyObject: emptyObjectCheckGetter(),
  758. instanceOf: instanceCheckGetter,
  759. oneOf: oneOfCheckGetter,
  760. oneOfType: oneOfTypeCheckGetter,
  761. arrayOf: arrayOfCheckGetter,
  762. objectOf: objectOfCheckGetter,
  763. typeOrArrayOf: typeOrArrayOfCheckGetter,
  764. range: rangeCheckGetter,
  765. lessThan: lessThanCheckGetter,
  766. greaterThan: greaterThanCheckGetter,
  767. shape: getShapeCheckGetter(),
  768. args: argumentsCheckerGetter(),
  769. any: anyCheckGetter(),
  770. 'null': nullCheckGetter()
  771. };
  772. function typeOfCheckGetter(type) {
  773. var lType = type.toLowerCase();
  774. return setupChecker(function typeOfCheckerDefinition(val, name, location) {
  775. if (typeOf(val) !== lType) {
  776. return getError(name, location, type);
  777. }
  778. }, { type: type }, disabled);
  779. }
  780. function funcCheckGetter() {
  781. var type = 'Function';
  782. var functionChecker = setupChecker(function functionCheckerDefinition(val, name, location) {
  783. if (typeOf(val) !== 'function') {
  784. return getError(name, location, type);
  785. }
  786. }, { type: type }, disabled);
  787. functionChecker.withProperties = function getWithPropertiesChecker(properties) {
  788. var apiError = checkers.objectOf(checkers.func)(properties, 'properties', 'apiCheck.func.withProperties');
  789. if (isError(apiError)) {
  790. throw apiError;
  791. }
  792. var shapeChecker = checkers.shape(properties, true);
  793. shapeChecker.type.__apiCheckData.type = 'func.withProperties';
  794. return setupChecker(function functionWithPropertiesChecker(val, name, location) {
  795. var notFunction = checkers.func(val, name, location);
  796. if (isError(notFunction)) {
  797. return notFunction;
  798. }
  799. return shapeChecker(val, name, location);
  800. }, { type: shapeChecker.type, shortType: 'func.withProperties' }, disabled);
  801. };
  802. return functionChecker;
  803. }
  804. function objectCheckGetter() {
  805. var type = 'Object';
  806. var nullType = 'Object (null ok)';
  807. var objectNullOkChecker = setupChecker(function objectNullOkCheckerDefinition(val, name, location) {
  808. if (typeOf(val) !== 'object') {
  809. return getError(name, location, nullType);
  810. }
  811. }, { type: nullType }, disabled);
  812. var objectChecker = setupChecker(function objectCheckerDefinition(val, name, location) {
  813. if (val === null || isError(objectNullOkChecker(val, name, location))) {
  814. return getError(name, location, objectChecker.type);
  815. }
  816. }, { type: type, nullOk: objectNullOkChecker }, disabled);
  817. return objectChecker;
  818. }
  819. function instanceCheckGetter(classToCheck) {
  820. return setupChecker(function instanceCheckerDefinition(val, name, location) {
  821. if (!(val instanceof classToCheck)) {
  822. return getError(name, location, classToCheck.name);
  823. }
  824. }, { type: classToCheck.name }, disabled);
  825. }
  826. function oneOfCheckGetter(enums) {
  827. var type = {
  828. __apiCheckData: { optional: false, type: 'enum' },
  829. 'enum': enums
  830. };
  831. var shortType = 'oneOf[' + enums.map(function (enm) {
  832. return stringify(enm);
  833. }).join(', ') + ']';
  834. return setupChecker(function oneOfCheckerDefinition(val, name, location) {
  835. if (!enums.some(function (enm) {
  836. return enm === val;
  837. })) {
  838. return getError(name, location, shortType);
  839. }
  840. }, { type: type, shortType: shortType }, disabled);
  841. }
  842. function oneOfTypeCheckGetter(typeCheckers) {
  843. var checkersDisplay = typeCheckers.map(function (checker) {
  844. return getCheckerDisplay(checker, { short: true });
  845. });
  846. var shortType = 'oneOfType[' + checkersDisplay.join(', ') + ']';
  847. function type(options) {
  848. if (options && options.short) {
  849. return shortType;
  850. }
  851. return typeCheckers.map(function (checker) {
  852. return getCheckerDisplay(checker, options);
  853. });
  854. }
  855. type.__apiCheckData = { optional: false, type: 'oneOfType' };
  856. return setupChecker(function oneOfTypeCheckerDefinition(val, name, location) {
  857. if (!typeCheckers.some(function (checker) {
  858. return !isError(checker(val, name, location));
  859. })) {
  860. return getError(name, location, shortType);
  861. }
  862. }, { type: type, shortType: shortType }, disabled);
  863. }
  864. function arrayOfCheckGetter(checker) {
  865. var shortCheckerDisplay = getCheckerDisplay(checker, { short: true });
  866. var shortType = 'arrayOf[' + shortCheckerDisplay + ']';
  867. function type(options) {
  868. if (options && options.short) {
  869. return shortType;
  870. }
  871. return getCheckerDisplay(checker, options);
  872. }
  873. type.__apiCheckData = { optional: false, type: 'arrayOf' };
  874. return setupChecker(function arrayOfCheckerDefinition(val, name, location) {
  875. if (isError(checkers.array(val)) || !val.every(function (item) {
  876. return !isError(checker(item));
  877. })) {
  878. return getError(name, location, shortType);
  879. }
  880. }, { type: type, shortType: shortType }, disabled);
  881. }
  882. function objectOfCheckGetter(checker) {
  883. var checkerDisplay = getCheckerDisplay(checker, { short: true });
  884. var shortType = 'objectOf[' + checkerDisplay + ']';
  885. function type(options) {
  886. if (options && options.short) {
  887. return shortType;
  888. }
  889. return getCheckerDisplay(checker, options);
  890. }
  891. type.__apiCheckData = { optional: false, type: 'objectOf' };
  892. return setupChecker(function objectOfCheckerDefinition(val, name, location) {
  893. var notObject = checkers.object(val, name, location);
  894. if (isError(notObject)) {
  895. return notObject;
  896. }
  897. var allTypesSuccess = each(val, function (item, key) {
  898. if (isError(checker(item, key, name))) {
  899. return false;
  900. }
  901. });
  902. if (!allTypesSuccess) {
  903. return getError(name, location, shortType);
  904. }
  905. }, { type: type, shortType: shortType }, disabled);
  906. }
  907. function typeOrArrayOfCheckGetter(checker) {
  908. var checkerDisplay = getCheckerDisplay(checker, { short: true });
  909. var shortType = 'typeOrArrayOf[' + checkerDisplay + ']';
  910. function type(options) {
  911. if (options && options.short) {
  912. return shortType;
  913. }
  914. return getCheckerDisplay(checker, options);
  915. }
  916. type.__apiCheckData = { optional: false, type: 'typeOrArrayOf' };
  917. return setupChecker(function typeOrArrayOfDefinition(val, name, location, obj) {
  918. if (isError(checkers.oneOfType([checker, checkers.arrayOf(checker)])(val, name, location, obj))) {
  919. return getError(name, location, shortType);
  920. }
  921. }, { type: type, shortType: shortType }, disabled);
  922. }
  923. function getShapeCheckGetter() {
  924. function shapeCheckGetter(shape, nonObject) {
  925. var shapeTypes = {};
  926. each(shape, function (checker, prop) {
  927. shapeTypes[prop] = getCheckerDisplay(checker);
  928. });
  929. function type() {
  930. var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
  931. var ret = {};
  932. var terse = options.terse;
  933. var obj = options.obj;
  934. var addHelpers = options.addHelpers;
  935. var parentRequired = options.required;
  936. each(shape, function (checker, prop) {
  937. /* eslint complexity:[2, 6] */
  938. var specified = obj && obj.hasOwnProperty(prop);
  939. var required = undef(parentRequired) ? !checker.isOptional : parentRequired;
  940. if (!terse || (specified || !checker.isOptional)) {
  941. ret[prop] = getCheckerDisplay(checker, { terse: terse, obj: obj && obj[prop], required: required, addHelpers: addHelpers });
  942. }
  943. if (addHelpers) {
  944. modifyTypeDisplayToHelpOut(ret, prop, specified, checker, required);
  945. }
  946. });
  947. return ret;
  948. function modifyTypeDisplayToHelpOut(theRet, prop, specified, checker, required) {
  949. if (!specified && required && !checker.isOptional) {
  950. var item = 'ITEM';
  951. if (checker.type && checker.type.__apiCheckData) {
  952. item = checker.type.__apiCheckData.type.toUpperCase();
  953. }
  954. addHelper('missing', 'MISSING THIS ' + item, ' <-- YOU ARE MISSING THIS');
  955. } else if (specified) {
  956. var error = checker(obj[prop], prop, null, obj);
  957. if (isError(error)) {
  958. addHelper('error', 'THIS IS THE PROBLEM: ' + error.message, ' <-- THIS IS THE PROBLEM: ' + error.message);
  959. }
  960. }
  961. function addHelper(property, objectMessage, stringMessage) {
  962. if (typeof theRet[prop] === 'string') {
  963. theRet[prop] += stringMessage;
  964. } else {
  965. theRet[prop].__apiCheckData[property] = objectMessage;
  966. }
  967. }
  968. }
  969. }
  970. type.__apiCheckData = { strict: false, optional: false, type: 'shape' };
  971. var shapeChecker = setupChecker(function shapeCheckerDefinition(val, name, location) {
  972. /* eslint complexity:[2, 6] */
  973. var isObject = !nonObject && checkers.object(val, name, location);
  974. if (isError(isObject)) {
  975. return isObject;
  976. }
  977. var shapePropError = undefined;
  978. location = location ? location + (name ? '/' : '') : '';
  979. name = name || '';
  980. each(shape, function (checker, prop) {
  981. if (val.hasOwnProperty(prop) || !checker.isOptional) {
  982. shapePropError = checker(val[prop], prop, '' + location + name, val);
  983. return !isError(shapePropError);
  984. }
  985. });
  986. if (isError(shapePropError)) {
  987. return shapePropError;
  988. }
  989. }, { type: type, shortType: 'shape' }, disabled);
  990. function strictType() {
  991. return type.apply(undefined, arguments);
  992. }
  993. strictType.__apiCheckData = copy(shapeChecker.type.__apiCheckData);
  994. strictType.__apiCheckData.strict = true;
  995. shapeChecker.strict = setupChecker(function strictShapeCheckerDefinition(val, name, location) {
  996. var shapeError = shapeChecker(val, name, location);
  997. if (isError(shapeError)) {
  998. return shapeError;
  999. }
  1000. var allowedProperties = Object.keys(shape);
  1001. var extraProps = Object.keys(val).filter(function (prop) {
  1002. return allowedProperties.indexOf(prop) === -1;
  1003. });
  1004. if (extraProps.length) {
  1005. return new Error(nAtL(name, location) + ' cannot have extra properties: ' + t(extraProps.join('`, `')) + '.' + ('It is limited to ' + t(allowedProperties.join('`, `'))));
  1006. }
  1007. }, { type: strictType, shortType: 'strict shape' }, disabled);
  1008. return shapeChecker;
  1009. }
  1010. shapeCheckGetter.ifNot = function ifNot(otherProps, propChecker) {
  1011. if (!Array.isArray(otherProps)) {
  1012. otherProps = [otherProps];
  1013. }
  1014. var description = undefined;
  1015. if (otherProps.length === 1) {
  1016. description = 'specified only if ' + otherProps[0] + ' is not specified';
  1017. } else {
  1018. description = 'specified only if none of the following are specified: [' + list(otherProps, ', ', 'and ') + ']';
  1019. }
  1020. var shortType = 'ifNot[' + otherProps.join(', ') + ']';
  1021. var type = getTypeForShapeChild(propChecker, description, shortType);
  1022. return setupChecker(function ifNotChecker(prop, propName, location, obj) {
  1023. var propExists = obj && obj.hasOwnProperty(propName);
  1024. var otherPropsExist = otherProps.some(function (otherProp) {
  1025. return obj && obj.hasOwnProperty(otherProp);
  1026. });
  1027. if (propExists === otherPropsExist) {
  1028. return getError(propName, location, type);
  1029. } else if (propExists) {
  1030. return propChecker(prop, propName, location, obj);
  1031. }
  1032. }, { notRequired: true, type: type, shortType: shortType }, disabled);
  1033. };
  1034. shapeCheckGetter.onlyIf = function onlyIf(otherProps, propChecker) {
  1035. otherProps = arrayify(otherProps);
  1036. var description = undefined;
  1037. if (otherProps.length === 1) {
  1038. description = 'specified only if ' + otherProps[0] + ' is also specified';
  1039. } else {
  1040. description = 'specified only if all of the following are specified: [' + list(otherProps, ', ', 'and ') + ']';
  1041. }
  1042. var shortType = 'onlyIf[' + otherProps.join(', ') + ']';
  1043. var type = getTypeForShapeChild(propChecker, description, shortType);
  1044. return setupChecker(function onlyIfCheckerDefinition(prop, propName, location, obj) {
  1045. var othersPresent = otherProps.every(function (property) {
  1046. return obj.hasOwnProperty(property);
  1047. });
  1048. if (!othersPresent) {
  1049. return getError(propName, location, type);
  1050. } else {
  1051. return propChecker(prop, propName, location, obj);
  1052. }
  1053. }, { type: type, shortType: shortType }, disabled);
  1054. };
  1055. shapeCheckGetter.requiredIfNot = function shapeRequiredIfNot(otherProps, propChecker) {
  1056. if (!Array.isArray(otherProps)) {
  1057. otherProps = [otherProps];
  1058. }
  1059. return getRequiredIfNotChecker(false, otherProps, propChecker);
  1060. };
  1061. shapeCheckGetter.requiredIfNot.all = function shapeRequiredIfNotAll(otherProps, propChecker) {
  1062. if (!Array.isArray(otherProps)) {
  1063. throw new Error('requiredIfNot.all must be passed an array');
  1064. }
  1065. return getRequiredIfNotChecker(true, otherProps, propChecker);
  1066. };
  1067. function getRequiredIfNotChecker(all, otherProps, propChecker) {
  1068. var props = t(otherProps.join(', '));
  1069. var ifProps = 'if ' + (all ? 'all of' : 'at least one of');
  1070. var description = 'specified ' + ifProps + ' these are not specified: ' + props + ' (otherwise it\'s optional)';
  1071. var shortType = 'requiredIfNot' + (all ? '.all' : '') + '[' + otherProps.join(', ') + '}]';
  1072. var type = getTypeForShapeChild(propChecker, description, shortType);
  1073. return setupChecker(function shapeRequiredIfNotDefinition(prop, propName, location, obj) {
  1074. var propExists = obj && obj.hasOwnProperty(propName);
  1075. var iteration = all ? 'every' : 'some';
  1076. var otherPropsExist = otherProps[iteration](function (otherProp) {
  1077. return obj && obj.hasOwnProperty(otherProp);
  1078. });
  1079. if (!otherPropsExist && !propExists) {
  1080. return getError(propName, location, type);
  1081. } else if (propExists) {
  1082. return propChecker(prop, propName, location, obj);
  1083. }
  1084. }, { type: type, notRequired: true }, disabled);
  1085. }
  1086. return shapeCheckGetter;
  1087. function getTypeForShapeChild(propChecker, description, shortType) {
  1088. function type(options) {
  1089. if (options && options.short) {
  1090. return shortType;
  1091. }
  1092. return getCheckerDisplay(propChecker);
  1093. }
  1094. type.__apiCheckData = { optional: false, type: 'ifNot', description: description };
  1095. return type;
  1096. }
  1097. }
  1098. function argumentsCheckerGetter() {
  1099. var type = 'function arguments';
  1100. return setupChecker(function argsCheckerDefinition(val, name, location) {
  1101. if (Array.isArray(val) || isError(checkers.object(val)) || isError(checkers.number(val.length))) {
  1102. return getError(name, location, type);
  1103. }
  1104. }, { type: type }, disabled);
  1105. }
  1106. function anyCheckGetter() {
  1107. return setupChecker(function anyCheckerDefinition() {
  1108. // don't do anything
  1109. }, { type: 'any' }, disabled);
  1110. }
  1111. function nullCheckGetter() {
  1112. var type = 'null';
  1113. return setupChecker(function nullChecker(val, name, location) {
  1114. if (val !== null) {
  1115. return getError(name, location, type);
  1116. }
  1117. }, { type: type }, disabled);
  1118. }
  1119. function rangeCheckGetter(min, max) {
  1120. var type = 'Range (' + min + ' - ' + max + ')';
  1121. return setupChecker(function rangeChecker(val, name, location) {
  1122. if (typeof val !== 'number' || val < min || val > max) {
  1123. return getError(name, location, type);
  1124. }
  1125. }, { type: type }, disabled);
  1126. }
  1127. function lessThanCheckGetter(min) {
  1128. var type = 'lessThan[' + min + ']';
  1129. return setupChecker(function lessThanChecker(val, name, location) {
  1130. if (typeof val !== 'number' || val > min) {
  1131. return getError(name, location, type);
  1132. }
  1133. }, { type: type }, disabled);
  1134. }
  1135. function greaterThanCheckGetter(max) {
  1136. var type = 'greaterThan[' + max + ']';
  1137. return setupChecker(function greaterThanChecker(val, name, location) {
  1138. if (typeof val !== 'number' || val < max) {
  1139. return getError(name, location, type);
  1140. }
  1141. }, { type: type }, disabled);
  1142. }
  1143. function emptyObjectCheckGetter() {
  1144. var type = 'empty object';
  1145. return setupChecker(function emptyObjectChecker(val, name, location) {
  1146. if (typeOf(val) !== 'object' || val === null || Object.keys(val).length) {
  1147. return getError(name, location, type);
  1148. }
  1149. }, { type: type }, disabled);
  1150. }
  1151. }
  1152. /***/ }
  1153. /******/ ])
  1154. });
  1155. ;