So spent some time today to put together a POC. The goal was to see if I could scan all tsx files and use that to build up the api. Its possible but man its a lot of ast processing. Given this file
I was able to find all uses of PatchComponent and extract their name as well as correct typing for props. This is just for the PluginApi.components section that will allow proper typing for say the patch namespace method (before,instead,after). With the code I have it would be easy to build out the reset of the typing from the pluginApi.tsx. Still a lot to do but lmk your thoughts. I’m using ts-morph and ts-query to help out with this. Wouldn’t be too hard to make this an automatic generator on say branch pushes and push to say github repo (free).
PatchComponent(
"GalleryCard.Popovers",
(props: IGalleryCardProps) => {
function maybeRenderScenePopoverButton() {
...snip...
return <>{maybeRenderPopoverButtonGroup()}</>;
}
)
{
name: 'GalleryCard.Popovers',
propsType: {
kind: 'object',
name: 'IGalleryCardProps',
props: {
gallery: { kind: 'importRef', name: 'GQL.SlimGalleryDataFragment' },
cardWidth: { kind: 'primitive', name: 'number | undefined' },
selecting: { kind: 'primitive', name: 'boolean | undefined' },
selected: { kind: 'primitive', name: 'boolean | undefined' },
zoomIndex: { kind: 'primitive', name: 'number | undefined' },
onSelectedChanged: {
kind: 'function',
name: '(selected: boolean, shiftKey: boolean) => void',
args: { selected: [Object], shiftKey: [Object] },
returns: { kind: 'primitive', name: 'void' }
}
}
}
}
PatchComponent(
"GalleryCard.Details",
(props: IGalleryCardProps) => {
return (
<div className="gallery-card__details">
...snip..
</div>
);
}
)
{
name: 'GalleryCard.Details',
propsType: {
kind: 'object',
name: 'IGalleryCardProps',
props: {
gallery: { kind: 'importRef', name: 'GQL.SlimGalleryDataFragment' },
cardWidth: { kind: 'primitive', name: 'number | undefined' },
selecting: { kind: 'primitive', name: 'boolean | undefined' },
selected: { kind: 'primitive', name: 'boolean | undefined' },
zoomIndex: { kind: 'primitive', name: 'number | undefined' },
onSelectedChanged: {
kind: 'function',
name: '(selected: boolean, shiftKey: boolean) => void',
args: { selected: [Object], shiftKey: [Object] },
returns: { kind: 'primitive', name: 'void' }
}
}
}
}
PatchComponent(
"GalleryCard.Overlays",
(props: IGalleryCardProps) => {
return <StudioOverlay studio={props.gallery.studio} />;
}
)
{
name: 'GalleryCard.Overlays',
propsType: {
kind: 'object',
name: 'IGalleryCardProps',
props: {
gallery: { kind: 'importRef', name: 'GQL.SlimGalleryDataFragment' },
cardWidth: { kind: 'primitive', name: 'number | undefined' },
selecting: { kind: 'primitive', name: 'boolean | undefined' },
selected: { kind: 'primitive', name: 'boolean | undefined' },
zoomIndex: { kind: 'primitive', name: 'number | undefined' },
onSelectedChanged: {
kind: 'function',
name: '(selected: boolean, shiftKey: boolean) => void',
args: { selected: [Object], shiftKey: [Object] },
returns: { kind: 'primitive', name: 'void' }
}
}
}
}
PatchComponent(
"GalleryCard.Image",
(props: IGalleryCardProps) => {
const history = useHistory();
return (
<>
<GalleryPreview
...snip..
</>
);
}
)
{
name: 'GalleryCard.Image',
propsType: {
kind: 'object',
name: 'IGalleryCardProps',
props: {
gallery: { kind: 'importRef', name: 'GQL.SlimGalleryDataFragment' },
cardWidth: { kind: 'primitive', name: 'number | undefined' },
selecting: { kind: 'primitive', name: 'boolean | undefined' },
selected: { kind: 'primitive', name: 'boolean | undefined' },
zoomIndex: { kind: 'primitive', name: 'number | undefined' },
onSelectedChanged: {
kind: 'function',
name: '(selected: boolean, shiftKey: boolean) => void',
args: { selected: [Object], shiftKey: [Object] },
returns: { kind: 'primitive', name: 'void' }
}
}
}
}
PatchComponent(
"GalleryCard",
(props: IGalleryCardProps) => {
return (
<GridCard
...snip..
/>
);
}
)
{
name: 'GalleryCard',
propsType: {
kind: 'object',
name: 'IGalleryCardProps',
props: {
gallery: { kind: 'importRef', name: 'GQL.SlimGalleryDataFragment' },
cardWidth: { kind: 'primitive', name: 'number | undefined' },
selecting: { kind: 'primitive', name: 'boolean | undefined' },
selected: { kind: 'primitive', name: 'boolean | undefined' },
zoomIndex: { kind: 'primitive', name: 'number | undefined' },
onSelectedChanged: {
kind: 'function',
name: '(selected: boolean, shiftKey: boolean) => void',
args: { selected: [Object], shiftKey: [Object] },
returns: { kind: 'primitive', name: 'void' }
}
}
}
}