{}} />;',
+ '};',
+ ].join('\n'),
+ })
+
+ try {
+ const analyzer = createAnalyzer(project.host)
+ const filePath = project.filePath('Page.tsx')
+ const source = project.readFile('Page.tsx')
+ const scope: ScopeConfig = {
+ declaration: true,
+ element: false,
+ export: false,
+ import: false,
+ type: false,
+ }
+ const usages = await analyzer.analyzeDocument(
+ filePath,
+ source,
+ project.signature('Page.tsx'),
+ scope,
+ )
+
+ expect(usages.length).toBe(1)
+ expect(usages[0]?.kind).toBe('server')
+ } finally {
+ project[Symbol.dispose]()
+ }
+})
+
+test('arrow component infers client from function props', async () => {
+ const project = createProject({
+ 'Toggle.tsx': [
+ 'const Toggle = () => {',
+ ' return
{}} />;',
+ '};',
+ ].join('\n'),
+ })
+
+ try {
+ const analyzer = createAnalyzer(project.host)
+ const filePath = project.filePath('Toggle.tsx')
+ const source = project.readFile('Toggle.tsx')
+ const scope: ScopeConfig = {
+ declaration: true,
+ element: false,
+ export: false,
+ import: false,
+ type: false,
+ }
+ const usages = await analyzer.analyzeDocument(
+ filePath,
+ source,
+ project.signature('Toggle.tsx'),
+ scope,
+ )
+
+ expect(usages.length).toBe(1)
+ expect(usages[0]?.kind).toBe('client')
+ } finally {
+ project[Symbol.dispose]()
+ }
+})
+
+test('type inherits kind from enclosing component context', async () => {
+ const project = createProject({
+ 'Button.tsx': [
+ 'interface ThemeButtonProps {',
+ ' color?: string;',
+ '}',
+ '',
+ 'export function ThemeButton({ color }: ThemeButtonProps) {',
+ ' return