@tanstack/devtools-utils
Version:
TanStack Devtools utilities for creating your own devtools.
72 lines (61 loc) • 1.97 kB
text/typescript
import type { TanStackDevtoolsPluginProps } from '@tanstack/devtools'
export interface DevtoolsPanelProps extends TanStackDevtoolsPluginProps {
[key: string]: any
}
interface BaseCorePanelClass {
[key: string]: any
mount: <T extends HTMLElement>(
el: T,
props: TanStackDevtoolsPluginProps,
) => void
unmount: () => void
}
type CoreClassConstructor<
TComponentProps extends DevtoolsPanelProps,
TCoreDevtoolsClass extends BaseCorePanelClass,
> = new (props: TComponentProps) => TCoreDevtoolsClass
function isPanelClassConstructor<
TComponentProps extends DevtoolsPanelProps,
TCoreDevtoolsClass extends BaseCorePanelClass,
>(o: any): o is CoreClassConstructor<TComponentProps, TCoreDevtoolsClass> {
return !!o.prototype
}
export function createAngularPanel<
TComponentProps extends DevtoolsPanelProps,
TCoreDevtoolsClass extends BaseCorePanelClass,
>(
CoreClass:
| CoreClassConstructor<TanStackDevtoolsPluginProps, TCoreDevtoolsClass>
| (() => Promise<
CoreClassConstructor<TanStackDevtoolsPluginProps, TCoreDevtoolsClass>
>),
) {
return [
() =>
(inputs: () => TComponentProps, host: HTMLElement): (() => void) => {
const panel = host.ownerDocument.createElement('div')
panel.style.height = '100%'
let unmount: null | (() => void) = null
function mount(instance: TCoreDevtoolsClass) {
instance.mount(panel, inputs())
unmount = () => instance.unmount()
}
host.appendChild(panel)
const isConstructor = isPanelClassConstructor<
TComponentProps,
TCoreDevtoolsClass
>(CoreClass)
if (isConstructor) {
mount(new CoreClass(inputs()))
} else {
CoreClass()
.then((ResolvedCoreClass) => new ResolvedCoreClass(inputs()))
.then(mount)
}
return () => {
unmount?.()
}
},
() => null,
] as const
}