|
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 (options.forceWritable) { |
|
Object.defineProperty(out, k2, { |
|
enumerable: descriptor.enumerable, |
|
configurable: true, |
|
writable: true, |
|
value: cloned |
|
}); |
|
} else if ("get" in descriptor) { |
|
Object.defineProperty(out, k2, { |
|
...descriptor, |
|
get() { |
|
return cloned; |
|
} |
|
}); |
|
} else { |
|
Object.defineProperty(out, k2, { |
|
...descriptor, |
|
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 }; |
|
|