UNPKG

@surface/core

Version:

Provides core functionality of many @surfaces modules.

31 lines (30 loc) 1.09 kB
import HookableMetadata from "./metadata/hookable-metadata.js"; export default class Hookable { constructor() { HookableMetadata.from(this.constructor).initialize(this); } static as(base) { return class HookableExtends extends base { // eslint-disable-next-line @typescript-eslint/no-explicit-any constructor(...args) { super(...args); HookableMetadata.from(this.constructor).initialize(this); } }; } static finisher(target) { const metadata = HookableMetadata.from(target); if (!metadata.hooked) { metadata.hooked = true; const handler = { construct: (target, args, newTarget) => { const instance = Reflect.construct(target, args, newTarget); HookableMetadata.from(target).finish(instance); return instance; }, }; return new Proxy(target, handler); } return target; } }