index.js 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. 'use strict';
  2. function hasKey(obj, keys) {
  3. var o = obj;
  4. keys.slice(0, -1).forEach(function (key) {
  5. o = o[key] || {};
  6. });
  7. var key = keys[keys.length - 1];
  8. return key in o;
  9. }
  10. function isNumber(x) {
  11. if (typeof x === 'number') { return true; }
  12. if ((/^0x[0-9a-f]+$/i).test(x)) { return true; }
  13. return (/^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/).test(x);
  14. }
  15. function isConstructorOrProto(obj, key) {
  16. return (key === 'constructor' && typeof obj[key] === 'function') || key === '__proto__';
  17. }
  18. module.exports = function (args, opts) {
  19. if (!opts) { opts = {}; }
  20. var flags = {
  21. bools: {},
  22. strings: {},
  23. unknownFn: null,
  24. };
  25. if (typeof opts.unknown === 'function') {
  26. flags.unknownFn = opts.unknown;
  27. }
  28. if (typeof opts.boolean === 'boolean' && opts.boolean) {
  29. flags.allBools = true;
  30. } else {
  31. [].concat(opts.boolean).filter(Boolean).forEach(function (key) {
  32. flags.bools[key] = true;
  33. });
  34. }
  35. var aliases = {};
  36. function aliasIsBoolean(key) {
  37. return aliases[key].some(function (x) {
  38. return fl