| | function notNullish(v) { |
| | return v != null; |
| | } |
| | function assertTypes(value, name, types) { |
| | const receivedType = typeof value; |
| | const pass = types.includes(receivedType); |
| | if (!pass) |
| | throw new TypeError(`${name} value must be ${types.join(" or ")}, received "${receivedType}"`); |
| | } |
| | function isPrimitive(value) { |
| | return value === null || typeof value !== "function" && typeof value !== "object"; |
| | } |
| | function slash(path) { |
| | return path.replace(/\\/g, "/"); |
| | } |
| | function parseRegexp(input) { |
| | const m = input.match(/(\/?)(.+)\1([a-z]*)/i); |
| | if (!m) |
| | return /$^/; |
| | if (m[3] && !/^(?!.*?(.).*?\1)[gmixXsuUAJ]+$/.test(m[3])) |
| | return RegExp(input); |
| | return new RegExp(m[2], m[3]); |
| | } |
| | function toArray(array) { |
| | if (array === null || array === void 0) |
| | array = []; |
| | if (Array.isArray(array)) |
| | return array; |
| | return [array]; |
| | } |
| | function isObject(item) { |
| | return item != null && typeof item === "object" && !Array.isArray(item); |
| | } |
| | function isFinalObj(obj) { |
| | return obj === Object.prototype || obj === Function.prototype || obj === RegExp.prototype; |
| | } |
| | function getType(value) { |
| | return Object.prototype.toString.apply(value).slice(8, -1); |
| | } |
| | function collectOwnProperties(obj, collector) { |
| | const collect = typeof collector === "function" ? collector : (key) => collector.add(key); |
| | Object.getOwnPropertyNames(obj).forEach(collect); |
| | Object.getOwnPropertySymbols(obj).forEach(collect); |
| | } |
| | function getOwnProperties(obj) { |
| | const ownProps = new Set(); |
| | if (isFinalObj(obj)) |
| | return []; |
| | collectOwnProperties(obj, ownProps); |
| | return Array.from(ownProps); |
| | } |
| | const defaultCloneOptions = { forceWritable: false }; |
| | function deepClone(val, options = defaultCloneOptions) { |
| | const seen = new WeakMap(); |
| | return clone(val, seen, options); |
| | } |
| | function clone(val, seen, options = defaultCloneOptions) { |
| | let k, out; |
| | if (seen.has(val)) |
| | return seen.get(val); |
| | if (Array.isArray(val)) { |
| | out = Array(k = val.length); |
| | seen.set(val, out); |
| | while (k--) |
| | out[k] = clone(val[k], seen, options); |
| | return out; |
| | } |
| | if (Object.prototype.toString.call(val) === "[object Object]") { |
| | out = Object.create(Object.getPrototypeOf(val)); |
| | seen.set(val, out); |
| | const props = getOwnProperties(val); |
| | for (const k2 of props) { |
| | const descriptor = Object.getOwnPropertyDescriptor(val, k2); |
| | if (!descriptor) |
| | continue; |
| | const cloned = clone(val[k2], seen, options); |
| | if ("get" in descriptor) { |
| | Object.defineProperty(out, k2, { |
| | ...descriptor, |
| | get() { |
| | return cloned; |
| | } |
| | }); |
| | } else { |
| | Object.defineProperty(out, k2, { |
| | ...descriptor, |
| | writable: options.forceWritable ? true : descriptor.writable, |
| | value: cloned |
| | }); |
| | } |
| | } |
| | return out; |
| | } |
| | return val; |
| | } |
| | function noop() { |
| | } |
| | function objectAttr(source, path, defaultValue = void 0) { |
| | const paths = path.replace(/\[(\d+)\]/g, ".$1").split("."); |
| | let result = source; |
| | for (const p of paths) { |
| | result = Object(result)[p]; |
| | if (result === void 0) |
| | return defaultValue; |
| | } |
| | return result; |
| | } |
| | function createDefer() { |
| | let resolve = null; |
| | let reject = null; |
| | const p = new Promise((_resolve, _reject) => { |
| | resolve = _resolve; |
| | reject = _reject; |
| | }); |
| | p.resolve = resolve; |
| | p.reject = reject; |
| | return p; |
| | } |
| | function getCallLastIndex(code) { |
| | let charIndex = -1; |
| | let inString = null; |
| | let startedBracers = 0; |
| | let endedBracers = 0; |
| | let beforeChar = null; |
| | while (charIndex <= code.length) { |
| | beforeChar = code[charIndex]; |
| | charIndex++; |
| | const char = code[charIndex]; |
| | const isCharString = char === '"' || char === "'" || char === "`"; |
| | if (isCharString && beforeChar !== "\\") { |
| | if (inString === char) |
| | inString = null; |
| | else if (!inString) |
| | inString = char; |
| | } |
| | if (!inString) { |
| | if (char === "(") |
| | startedBracers++; |
| | if (char === ")") |
| | endedBracers++; |
| | } |
| | if (startedBracers && endedBracers && startedBracers === endedBracers) |
| | return charIndex; |
| | } |
| | return null; |
| | } |
| |
|
| | export { assertTypes, clone, createDefer, deepClone, getCallLastIndex, getOwnProperties, getType, isObject, isPrimitive, noop, notNullish, objectAttr, parseRegexp, slash, toArray }; |
| |
|