版博士V2.0程序
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

113 lines
3.1 KiB

  1. function assertTypes(value, name, types) {
  2. const receivedType = typeof value;
  3. const pass = types.includes(receivedType);
  4. if (!pass)
  5. throw new TypeError(`${name} value must be ${types.join(" or ")}, received "${receivedType}"`);
  6. }
  7. function slash(path) {
  8. return path.replace(/\\/g, "/");
  9. }
  10. function parseRegexp(input) {
  11. const m = input.match(/(\/?)(.+)\1([a-z]*)/i);
  12. if (!m)
  13. return /$^/;
  14. if (m[3] && !/^(?!.*?(.).*?\1)[gmixXsuUAJ]+$/.test(m[3]))
  15. return RegExp(input);
  16. return new RegExp(m[2], m[3]);
  17. }
  18. function toArray(array) {
  19. if (array === null || array === void 0)
  20. array = [];
  21. if (Array.isArray(array))
  22. return array;
  23. return [array];
  24. }
  25. function isObject(item) {
  26. return item != null && typeof item === "object" && !Array.isArray(item);
  27. }
  28. function isFinalObj(obj) {
  29. return obj === Object.prototype || obj === Function.prototype || obj === RegExp.prototype;
  30. }
  31. function getType(value) {
  32. return Object.prototype.toString.apply(value).slice(8, -1);
  33. }
  34. function collectOwnProperties(obj, collector) {
  35. const collect = typeof collector === "function" ? collector : (key) => collector.add(key);
  36. Object.getOwnPropertyNames(obj).forEach(collect);
  37. Object.getOwnPropertySymbols(obj).forEach(collect);
  38. }
  39. function getOwnProperties(obj) {
  40. const ownProps = /* @__PURE__ */ new Set();
  41. if (isFinalObj(obj))
  42. return [];
  43. collectOwnProperties(obj, ownProps);
  44. return Array.from(ownProps);
  45. }
  46. function deepClone(val) {
  47. const seen = /* @__PURE__ */ new WeakMap();
  48. return clone(val, seen);
  49. }
  50. function clone(val, seen) {
  51. let k, out;
  52. if (seen.has(val))
  53. return seen.get(val);
  54. if (Array.isArray(val)) {
  55. out = Array(k = val.length);
  56. seen.set(val, out);
  57. while (k--)
  58. out[k] = clone(val[k], seen);
  59. return out;
  60. }
  61. if (Object.prototype.toString.call(val) === "[object Object]") {
  62. out = Object.create(Object.getPrototypeOf(val));
  63. seen.set(val, out);
  64. const props = getOwnProperties(val);
  65. for (const k2 of props) {
  66. const descriptor = Object.getOwnPropertyDescriptor(val, k2);
  67. if (!descriptor)
  68. continue;
  69. const cloned = clone(val[k2], seen);
  70. if ("get" in descriptor) {
  71. Object.defineProperty(out, k2, {
  72. ...descriptor,
  73. get() {
  74. return cloned;
  75. }
  76. });
  77. } else {
  78. Object.defineProperty(out, k2, {
  79. ...descriptor,
  80. value: cloned
  81. });
  82. }
  83. }
  84. return out;
  85. }
  86. return val;
  87. }
  88. function noop() {
  89. }
  90. function objectAttr(source, path, defaultValue = void 0) {
  91. const paths = path.replace(/\[(\d+)\]/g, ".$1").split(".");
  92. let result = source;
  93. for (const p of paths) {
  94. result = Object(result)[p];
  95. if (result === void 0)
  96. return defaultValue;
  97. }
  98. return result;
  99. }
  100. function createDefer() {
  101. let resolve = null;
  102. let reject = null;
  103. const p = new Promise((_resolve, _reject) => {
  104. resolve = _resolve;
  105. reject = _reject;
  106. });
  107. p.resolve = resolve;
  108. p.reject = reject;
  109. return p;
  110. }
  111. export { assertTypes, clone, createDefer, deepClone, getOwnProperties, getType, isObject, noop, objectAttr, parseRegexp, slash, toArray };