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 extra 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 you 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' }
}
}
}
}