49 lines
1.1 KiB
TypeScript
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
|
|
}
|