Skip to content

Commit 1072bc6

Browse files
authored
feat: dynamic JSX interface inheritance (#71)
- Added `ReactHTMLProps` utility type to dynamically handle React HTML element type definitions. - Fixed incorrect type generation for some elements (e.g., `input`), ensuring appropriate attribute types are used.
1 parent 2d1036f commit 1072bc6

File tree

3 files changed

+16
-127
lines changed

3 files changed

+16
-127
lines changed

src/html.ts

Lines changed: 0 additions & 115 deletions
This file was deleted.

src/index.ts

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import { type PluginCreator } from 'postcss'
33
import selectorParser = require('postcss-selector-parser')
44
import atImport = require('postcss-import')
55
import path = require('node:path')
6-
const html = require('./html')
76
const key = require('./key')
87

98
declare module 'postcss-selector-parser' {
@@ -27,7 +26,11 @@ type Parsed = Record<
2726
>
2827

2928
function render(parsed: Parsed): string {
30-
let interfaceDefinitions = ''
29+
let interfaceDefinitions = `type ReactHTMLProps<
30+
Tag extends keyof React.ReactHTML
31+
> = React.ReactHTML[Tag] extends React.DetailedHTMLFactory<infer Attributes, infer Element>
32+
? React.DetailedHTMLProps<Attributes, Element>
33+
: React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>\n\n`
3134
const jsxElements: Record<string, string[]> = {}
3235

3336
// Normalize
@@ -101,12 +104,7 @@ function render(parsed: Parsed): string {
101104

102105
const attributeEntries = Object.entries(attributes)
103106

104-
let htmlElement = 'HTMLElement'
105-
if (tag in html) {
106-
htmlElement = html[tag as keyof typeof html]
107-
}
108-
109-
let interfaceDefinition = `interface ${interfaceName} extends React.DetailedHTMLProps<React.HTMLAttributes<${htmlElement}>, ${htmlElement}> {\n`
107+
let interfaceDefinition = `interface ${interfaceName} extends ReactHTMLProps<'${tag}'> {\n`
110108

111109
discriminatorAttributes.forEach((attr) => {
112110
interfaceDefinition += ` '${attr}'?: never\n`

test/mist.d.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,24 @@
1-
interface Mist_button extends React.DetailedHTMLProps<React.HTMLAttributes<HTMLButtonElement>, HTMLButtonElement> {
1+
type ReactHTMLProps<
2+
Tag extends keyof React.ReactHTML
3+
> = React.ReactHTML[Tag] extends React.DetailedHTMLFactory<infer Attributes, infer Element>
4+
? React.DetailedHTMLProps<Attributes, Element>
5+
: React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>
6+
7+
interface Mist_button extends ReactHTMLProps<'button'> {
28
'data-variant'?: 'primary' | 'secondary'
39
style?: { '--highlightColor'?: string } & React.CSSProperties
410
}
511

6-
interface Mist_div extends React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement> {
12+
interface Mist_div extends ReactHTMLProps<'div'> {
713
'data-component'?: never
814
}
915

10-
interface Mist_div_data_component_card extends React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement> {
16+
interface Mist_div_data_component_card extends ReactHTMLProps<'div'> {
1117
'data-component': 'card'
1218
'data-size'?: 'sm' | 'xl'
1319
}
1420

15-
interface Mist_div_data_component_card_title extends React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement> {
21+
interface Mist_div_data_component_card_title extends ReactHTMLProps<'div'> {
1622
'data-component': 'card-title'
1723
}
1824

0 commit comments

Comments
 (0)