import { ExtractNever } from "@cfcs/core"; import { getKeys, isFunction } from "@daybrush/utils"; import EventEmitter from "@scena/event-emitter"; import Animator from "../Animator"; import { AnimatorState } from "../types"; export function getMethodNames(classConstructor: new (...args: any[]) => any) { const prototype = classConstructor.prototype; return getKeys(prototype).filter(name => { const descriptor = Object.getOwnPropertyDescriptor(prototype, name); if (name === "constructor") { return false; } return !descriptor.get && !descriptor.set && isFunction(descriptor.value || prototype[name]); }); } const EMITTER_METHODS = getMethodNames(EventEmitter); export const ANIMATOR_METHODS = [ ...EMITTER_METHODS, ...getMethodNames(Animator), ]; export type ReactiveMethods = ExtractNever<{ [key in (keyof Instance) & string]: Instance[key] extends (...args: any) => any ? Instance[key] : never; }>; /** * @typedef * @memberof Reactive */ export interface AnimatorReactiveState extends AnimatorState { /** * Total time the animation played */ totalDuration: number; }