package.lib.callable-instance.js Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of unified Show documentation
Show all versions of unified Show documentation
parse, inspect, transform, and serialize content through syntax trees
The newest version!
export const CallableInstance =
/**
* @type {new , Result>(property: string | symbol) => (...parameters: Parameters) => Result}
*/
(
/** @type {unknown} */
(
/**
* @this {Function}
* @param {string | symbol} property
* @returns {(...parameters: Array) => unknown}
*/
function (property) {
const self = this
const constr = self.constructor
const proto = /** @type {Record} */ (
// Prototypes do exist.
// type-coverage:ignore-next-line
constr.prototype
)
const value = proto[property]
/** @type {(...parameters: Array) => unknown} */
const apply = function () {
return value.apply(apply, arguments)
}
Object.setPrototypeOf(apply, proto)
// Not needed for us in `unified`: we only call this on the `copy`
// function,
// and we don't need to add its fields (`length`, `name`)
// over.
// See also: GH-246.
// const names = Object.getOwnPropertyNames(value)
//
// for (const p of names) {
// const descriptor = Object.getOwnPropertyDescriptor(value, p)
// if (descriptor) Object.defineProperty(apply, p, descriptor)
// }
return apply
}
)
)