Skip to content

Commit e16e53e

Browse files
authored
refactor: make gotoDefinition for classes possible without plugin (#12372)
* refactor: make gotoDefinition for classes possible without plugin * fix: preserve makeStyles callback typing
1 parent 51d7789 commit e16e53e

File tree

2 files changed

+68
-26
lines changed

2 files changed

+68
-26
lines changed
Lines changed: 67 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,74 @@
11
import { createMakeStyles, type CSSObject, type Css, type Cx } from 'tss-react'
22
import { useTheme, type Theme } from '@mui/material'
33

4-
// Note: type refinement, see https://github.com/garronej/tss-react/issues/128
5-
export const { makeStyles } = createMakeStyles({ useTheme }) as any as {
6-
makeStyles: <Params = void, RuleNameSubsetReferencedInNestedSelectors extends string = never>(params?: {
7-
name?: string | Record<string, unknown>
8-
uniqId?: string
9-
}) => <RuleName extends string>(
10-
cssObjectByRuleNameOrGetCssObjectByRuleName:
11-
| Record<RuleName, CSSObject>
12-
| ((
13-
theme: Theme,
14-
params: Params,
15-
classes: Record<RuleNameSubsetReferencedInNestedSelectors, string>,
16-
) => Record<RuleNameSubsetReferencedInNestedSelectors | RuleName, CSSObject>),
17-
) => <StyleOverrides extends { classes?: { [key in string]?: string | undefined } }>(
4+
const { makeStyles: baseMakeStyles } = createMakeStyles({ useTheme })
5+
6+
type MakeStylesOptions = {
7+
name?: string | Record<string, unknown>
8+
uniqId?: string
9+
}
10+
11+
type StyleRules = Record<string, CSSObject | { [key: string]: unknown }>
12+
// ^ conceal the complaint like `position: string` not satisfy `position: CSSProperties['position']`
13+
14+
type NestedSelectorClasses<RuleNameSubsetReferencedInNestedSelectors extends string> = Record<
15+
RuleNameSubsetReferencedInNestedSelectors,
16+
string
17+
>
18+
19+
type StyleOverrides = {
20+
classes?: { [key in string]?: string | undefined }
21+
}
22+
23+
type EmptyStyleOverrides = {
24+
classes?: Record<never, never>
25+
}
26+
27+
type StyleClassNames<Styles extends StyleRules> = {
28+
[Key in keyof Styles]: string
29+
}
30+
31+
type ExtraClassKeys<Overrides extends StyleOverrides> =
32+
Overrides extends { classes?: infer Classes } ? Extract<keyof NonNullable<Classes>, string> : never
33+
34+
type OverrideClassNames<ExtraKeys extends string, BaseKeys extends PropertyKey> =
35+
string extends ExtraKeys ? Record<string, string>
36+
: { [Key in Exclude<ExtraKeys, BaseKeys>]: string }
37+
38+
type MakeStylesResult<Styles extends StyleRules, Overrides extends StyleOverrides> = {
39+
classes: StyleClassNames<Styles> & OverrideClassNames<ExtraClassKeys<Overrides>, keyof Styles>
40+
theme: Theme
41+
css: Css
42+
cx: Cx
43+
}
44+
45+
type GetCssObjectByRuleName<Params, RuleNameSubsetReferencedInNestedSelectors extends string> = (
46+
theme: Theme,
47+
params: Params,
48+
classes: NestedSelectorClasses<RuleNameSubsetReferencedInNestedSelectors>,
49+
) => StyleRules
50+
51+
export interface UseStyles<Params, Styles extends StyleRules> {
52+
(params: Params): MakeStylesResult<Styles, EmptyStyleOverrides>
53+
<Overrides extends StyleOverrides>(
1854
params: Params,
19-
styleOverrides?: {
20-
props: StyleOverrides
55+
styleOverrides: {
56+
props: Overrides
2157
ownerState?: Record<string, unknown>
2258
},
23-
) => {
24-
classes: StyleOverrides extends { classes?: { [key in infer ExtraKeys]?: string | undefined } } ?
25-
Record<string extends ExtraKeys ? RuleName : ExtraKeys | RuleName, string>
26-
: Record<RuleName, string>
27-
theme: Theme
28-
css: Css
29-
cx: Cx
30-
}
59+
): MakeStylesResult<Styles, Overrides>
60+
}
61+
62+
interface MakeStylesHook<Params, RuleNameSubsetReferencedInNestedSelectors extends string> {
63+
<Styles extends StyleRules>(cssObjectByRuleName: Styles): UseStyles<Params, Styles>
64+
<T extends GetCssObjectByRuleName<Params, RuleNameSubsetReferencedInNestedSelectors>>(
65+
getCssObjectByRuleName: T,
66+
): UseStyles<Params, ReturnType<T>>
67+
}
68+
69+
// Note: type refinement, see https://github.com/garronej/tss-react/issues/128
70+
export function makeStyles<Params = void, RuleNameSubsetReferencedInNestedSelectors extends string = never>(
71+
params?: MakeStylesOptions,
72+
): MakeStylesHook<Params, RuleNameSubsetReferencedInNestedSelectors> {
73+
return baseMakeStyles(params) as unknown as MakeStylesHook<Params, RuleNameSubsetReferencedInNestedSelectors>
3174
}

tsconfig.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,8 +141,7 @@
141141
// @masknet/scripts: insert-here 3
142142
"@masknet/plugin-switch-logo": ["./packages/plugins/SwitchLogo/src/index.ts"],
143143
"@masknet/plugin-calendar": ["./packages/plugins/Calendar/src/index.ts"]
144-
},
145-
"plugins": [{ "name": "@masknet/typescript-plugin" }]
144+
}
146145
},
147146
"files": []
148147
}

0 commit comments

Comments
 (0)