Files
core/packages/api-client/utils/auto-bind.ts
2022-12-20 21:26:21 +08:00

49 lines
1.1 KiB
TypeScript

// @ts-nocheck
// @copy: https://github.com/sindresorhus/auto-bind/blob/main/index.js
// Gets all non-builtin properties up the prototype chain.
const getAllProperties = (object) => {
const properties = new Set()
do {
for (const key of Reflect.ownKeys(object)) {
properties.add([object, key])
}
} while (
(object = Reflect.getPrototypeOf(object)) &&
object !== Object.prototype
)
return properties
}
export function autoBind(self, { include, exclude } = {}) {
const filter = (key) => {
const match = (pattern) =>
typeof pattern === 'string' ? key === pattern : pattern.test(key)
if (include) {
return include.some(match)
}
if (exclude) {
return !exclude.some(match)
}
return true
}
for (const [object, key] of getAllProperties(self.constructor.prototype)) {
if (key === 'constructor' || !filter(key)) {
continue
}
const descriptor = Reflect.getOwnPropertyDescriptor(object, key)
if (descriptor && typeof descriptor.value === 'function') {
self[key] = self[key].bind(self)
}
}
return self
}