diff --git a/packages/jsx/src/index.ts b/packages/jsx/src/index.ts index f6434bf..178da13 100644 --- a/packages/jsx/src/index.ts +++ b/packages/jsx/src/index.ts @@ -1,25 +1,42 @@ import type { ConfirmOptions } from '@clack/prompts'; +import { confirm } from '@clack/prompts'; namespace JSX { export interface IntrinsicElements { - confirm: ConfirmOptions; } - export type Element = unknown; + export type Element = Promise; } export type { JSX }; -export function Confirm(_props: JSX.IntrinsicElements['confirm']): JSX.Element { - return 'foo'; +export function Confirm(props: ConfirmOptions): ReturnType { + return confirm(props); } -export function jsx( +export type Component = + | typeof Confirm; + +function jsx( tag: T, props: JSX.IntrinsicElements[T], _key?: string +): JSX.Element; +function jsx( + fn: T, + props: Parameters[0], + _key?: string +): JSX.Element; +function jsx( + tagOrFn: string | Component, + props: unknown, + _key?: string ): JSX.Element { - return 'foo'; + if (typeof tagOrFn === 'function') { + return (tagOrFn as (props: unknown) => JSX.Element)(props); + } + return Promise.resolve(null); } +export { jsx }; export const jsxDEV = jsx; diff --git a/packages/jsx/test/jsx.test.tsx b/packages/jsx/test/jsx.test.tsx index 369692b..57d19aa 100644 --- a/packages/jsx/test/jsx.test.tsx +++ b/packages/jsx/test/jsx.test.tsx @@ -12,16 +12,26 @@ describe('jsx', () => { }); test('can render', async () => { - const result = jsx('confirm', { + const task = jsx(Confirm, { message: 'foo?', input, output, }); - expect(result).to.equal('foo'); + input.emit('keypress', '', { name: 'return' }); + const result = await task; + expect(result).to.equal(true); }); - test('can render JSX', () => { - const result = ; - expect(result).to.equal('foo'); + test('can render JSX', async () => { + const task = (); + input.emit('keypress', '', { name: 'return' }); + const result = await task; + expect(result).to.equal(true); + }); + + test('unknown elements are null', async () => { + const task = jsx('unknown-nonsense' as never, {} as never); + const result = await task; + expect(result).to.equal(null); }); });