diff --git a/package-lock.json b/package-lock.json index cb478cc..8faa79e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@knighted/jsx", - "version": "1.13.0", + "version": "1.13.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@knighted/jsx", - "version": "1.13.0", + "version": "1.13.1", "license": "MIT", "dependencies": { "@napi-rs/wasm-runtime": "^1.1.1", diff --git a/package.json b/package.json index 888adc1..236164a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@knighted/jsx", - "version": "1.13.0", + "version": "1.13.1", "description": "Runtime JSX tagged template that renders DOM or React trees anywhere with or without a build step.", "keywords": [ "jsx runtime", diff --git a/src/debug/index.ts b/src/debug/index.ts index 7067e0b..6bd4eea 100644 --- a/src/debug/index.ts +++ b/src/debug/index.ts @@ -3,4 +3,4 @@ import { enableJsxDebugDiagnostics } from './diagnostics.js' enableJsxDebugDiagnostics({ mode: 'always' }) export { jsx } from '../jsx.js' -export type { JsxRenderable, JsxComponent } from '../jsx.js' +export type { JsxRenderable, JsxChildren, JsxComponent } from '../jsx.js' diff --git a/src/index.ts b/src/index.ts index 8f7b33c..27cf37e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,2 +1,2 @@ export { jsx } from './jsx.js' -export type { JsxRenderable, JsxComponent } from './jsx.js' +export type { JsxRenderable, JsxChildren, JsxComponent } from './jsx.js' diff --git a/src/internal/jsx-types.ts b/src/internal/jsx-types.ts index 7821ffd..b7150dc 100644 --- a/src/internal/jsx-types.ts +++ b/src/internal/jsx-types.ts @@ -9,7 +9,9 @@ export type JsxRenderable = | undefined | Iterable +export type JsxChildren = JsxRenderable | JsxRenderable[] + export type JsxComponent> = { - (props: Props & { children?: JsxRenderable | JsxRenderable[] }): JsxRenderable + (props: Props & { children?: JsxChildren }): JsxRenderable displayName?: string } diff --git a/src/jsx.ts b/src/jsx.ts index 2cb1589..40b892b 100644 --- a/src/jsx.ts +++ b/src/jsx.ts @@ -42,7 +42,7 @@ import type { JsxComponent, JsxRenderable } from './internal/jsx-types.js' type JsxContext = TemplateContext type ElementWithIndex = Element & Record -export type { JsxRenderable, JsxComponent } from './internal/jsx-types.js' +export type { JsxRenderable, JsxChildren, JsxComponent } from './internal/jsx-types.js' const ensureDomAvailable = () => { if (typeof document === 'undefined' || typeof document.createElement !== 'function') { diff --git a/src/node/debug/index.ts b/src/node/debug/index.ts index 6c70c81..e037d33 100644 --- a/src/node/debug/index.ts +++ b/src/node/debug/index.ts @@ -6,4 +6,4 @@ enableJsxDebugDiagnostics({ mode: 'always' }) ensureNodeDom() export const jsx = baseJsx -export type { JsxRenderable, JsxComponent } from '../../jsx.js' +export type { JsxRenderable, JsxChildren, JsxComponent } from '../../jsx.js' diff --git a/src/node/index.ts b/src/node/index.ts index ecc7b6d..b16aee4 100644 --- a/src/node/index.ts +++ b/src/node/index.ts @@ -4,4 +4,4 @@ import { jsx as baseJsx } from '../jsx.js' ensureNodeDom() export const jsx = baseJsx -export type { JsxRenderable, JsxComponent } from '../jsx.js' +export type { JsxRenderable, JsxChildren, JsxComponent } from '../jsx.js' diff --git a/src/react/index.ts b/src/react/index.ts index 6512956..4447cbf 100644 --- a/src/react/index.ts +++ b/src/react/index.ts @@ -1,5 +1,6 @@ export { reactJsx } from './react-jsx.js' export type { + ReactJsxChildren, ReactJsxComponent, ReactJsxDomAttributes, ReactJsxEventHandler, diff --git a/src/react/react-jsx.ts b/src/react/react-jsx.ts index 9d58d2f..bf00a18 100644 --- a/src/react/react-jsx.ts +++ b/src/react/react-jsx.ts @@ -36,6 +36,7 @@ export type ReactJsxComponent> = ComponentType< > export type ReactJsxRenderable = ReactNode +export type ReactJsxChildren = ReactJsxRenderable | ReactJsxRenderable[] export type ReactJsxRef = Ref export type ReactJsxEventHandler = EventHandler export type ReactJsxDomAttributes = DOMAttributes diff --git a/test/jsx.types.test-d.ts b/test/jsx.types.test-d.ts new file mode 100644 index 0000000..6c6ecb9 --- /dev/null +++ b/test/jsx.types.test-d.ts @@ -0,0 +1,23 @@ +/* + * This file is a type-only test suite: declarations are intentionally "unused" + * so TypeScript will fail the build if the jsx typings drift. Linting is + * secondary here, so we disable unused-var checks. + */ +/* eslint-disable @typescript-eslint/no-unused-vars */ +import type { JsxChildren, JsxComponent, JsxRenderable } from '../src/index.js' + +type Equal = + (() => T extends A ? 1 : 2) extends () => T extends B ? 1 : 2 ? true : false + +type Expect = T + +type ChildrenAliasMatchesRenderableUnion = Expect< + Equal +> + +type DemoProps = { label: string } +type DemoComponent = JsxComponent +type DemoComponentProps = Parameters[0] +type ComponentChildrenUsesAlias = Expect< + Equal +> diff --git a/test/react-jsx.types.test-d.ts b/test/react-jsx.types.test-d.ts index 898d635..e77307b 100644 --- a/test/react-jsx.types.test-d.ts +++ b/test/react-jsx.types.test-d.ts @@ -6,6 +6,7 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ import type * as React from 'react' import type { + ReactJsxChildren, ReactJsxComponent, ReactJsxDomAttributes, ReactJsxEventHandler, @@ -52,3 +53,6 @@ type DemoPropsArePropsWithChildren = Expect< > type RenderableAllowsNull = Expect +type ReactChildrenAliasMatchesRenderableUnion = Expect< + Equal +>