export const delegateTriggerEvent = ( eventName: string, target: T, value?: unknown, ) => { if (typeof window === 'undefined') { return; } const TAG_NAME_ELEMENT_CONSTRUCTOR = { 'INPUT': window.HTMLInputElement, 'SELECT': window.HTMLSelectElement, 'TEXTAREA': window.HTMLTextAreaElement, } as const; const { [target.tagName as keyof typeof TAG_NAME_ELEMENT_CONSTRUCTOR]: elementCtor, } = TAG_NAME_ELEMENT_CONSTRUCTOR; if (!elementCtor) { return; } if (eventName === 'change') { const nativeInputValueSetter = Object.getOwnPropertyDescriptor(elementCtor.prototype, 'value')?.set; if (nativeInputValueSetter) { if ( (target.tagName === 'INPUT' && (target as unknown as HTMLInputElement).type !== 'file') || target.tagName !== 'INPUT' ) { nativeInputValueSetter.call(target, value); } const simulatedEvent = new Event(eventName, {bubbles: true}); target.dispatchEvent(simulatedEvent); } } };