PackagePackagetypeA library you install and call yourself.See every one →What this type is →by a community orgby a community orgoriginPublished by a community organisation, so it outlives any one maintainer.See every one →

@ui5-community/jsx-runtime

A plugin-based JSX runtime for UI5: views are written as .tsx files with per-control typing, and the JSX compiles to plain new Control(settings) calls.

A UI5 view written as .view.xml is parsed at runtime and its attributes are strings the TypeScript compiler never sees. This runtime takes the same view as a .tsx file, where the compiler checks every control's props against that control's own type, and turns the _jsx calls Babel emits into plain new Control(settings) calls: no React, no VDOM, no reconciler, with reactivity still coming from UI5 bindings. Above the core directives (jsx, <Fragment>, <For>, <If>) sits a plugin SPI of five extension points, Renderer, IntrinsicHandler, PropertyApplier, ChildrenProcessor and Scope, and the shipped <Switch>/<Case>/<Default> plugin is its worked example. In a project it is a library dependency plus three pieces of configuration: transformJSX in ui5.yaml, jsx and jsxImportSource in tsconfig.json, and ui5.community.jsx.runtime in manifest.json. XML and TSX views coexist in one app because both produce sap.ui.core.mvc.View instances, so a conversion can go one view at a time. The documentation site labels the project Incubation, and the requirements spec, marked a draft proposal, puts the TypeScript floor at 5.0 and newer.

Facts

Latestv0.1.5ReleasedLast pushLicenceApache-2.0

Where it sits

Lives in
Provides
TypeScript supportUI5TypeScript supportcapabilityWriting apps and libraries in TypeScript — the type definitions, the module syntax the loader expects, and the build step that gets from one to the other.
Add-on to
@openui5/sap.ui.core@openui5/sap.ui.coreartifactThe OpenUI5 core: the module loader, the MVC runtime, data binding, routing, theming and the test stack, which is everything a UI5 app does before a single community package is added.
Requires
ui5-tooling-transpileui5-tooling-transpileartifactThe JSX transform in the consuming app's build and dev server. Its transformJSX option switches on the Babel JSX plugin and assembles the rest of the pipeline from tsconfig.json and browserslist, so no hand-written .babelrc.json is needed. Version 3.12 or later.@babel/plugin-transform-react-jsx@babel/plugin-transform-react-jsxoutside the atlasCompiling the JSX in an app's .tsx files into the _jsx and _jsxs calls the runtime consumes. The package README states version 7, because the v8 major changed the plugin API, and the requirements spec puts the floor at 7.20 with runtime: "automatic".@openui5/sap.ui.core@openui5/sap.ui.coreartifactThe framework it produces views for. The runtime's own imports are from sap.ui.core and sap.ui.base, its modules load under the ui5.community.jsx.runtime namespace, and what happens after a JSX expression is UI5's: metadata, applySettings, bindings, aggregations and events. The requirements spec, marked a draft proposal, states UI5 1.130 LTS and newer.

Who is behind it

UI5 CommunityUI5 CommunityOrganisationMaintains this
In the atlas: maintains 69
@ui5-community
maintainerPeter MuessigPersonContributes to this
In the atlas: maintains 14, contributes to 80, wrote 1
@petermuessig
1 contributor

Before choosing this

Conditions

PracticalFunctional boundary

Lowercase HTML tags such as <div> typecheck but throw: the default renderer constructs UI5 controls, and the HTML-aware renderer plugin is described as planned. withScope restores the previous scope on a synchronous return only, so an await inside its callback leaks the scope on runtimes without AsyncLocalStorage. A view that has to stay adaptable through UI5 flexibility has no path here yet: the project's Devtoberfest session states that flexibility support is not built in yet.

What it declares

Every artifact

Type
Package
Origin
By a community org

As a package

Where it runs
does not say
Distributed through
npm

Parts and add-ons2

Parts 2

Samples2
@ui5-community/jsx-runtime-helloworldby a community orgA scaffolded UI5 TypeScript app in the jsx-runtime repository that consumes the runtime the way a project outside the repository would, with two views converted from XML.
ReferenceConsiderationFunctional boundaryIt shows the wiring and a converted view pair, not the runtime's API surface; the directives, the plugin SPI and the binding forms are demonstrated in [@ui5-community/jsx-runtime-showcase](artifact:ui5-community-jsx-runtime-showcase) instead.
@ui5-community/jsx-runtime-showcaseby a community orgThe showcase app of @ui5-community/jsx-runtime: it runs the library end-to-end and doubles as its documentation on GitHub Pages.
ReferenceConsiderationFunctional boundaryIts views are not a template for application code: every showcase view overrides `getController()` to return itself so a sample stays readable in one file, and the gotchas page says not to ship that in production, where a view keeps a separate `*.controller.ts`. Routing from a sample, an `ODataModel` v2 or v4, `sap.ui.mdc.Table`, forms and custom control authoring in TSX are absent by decision and documented as deferred.

Connections8

@ui5-community/jsx-runtime connections@ui5-community/jsx-runtimePROVIDES→ provides1provides stated Lets a UI5 view be authored in TypeScript rather than XML: `.tsx` files with per-control prop typing, checked bindings and events, read by the TypeScript checker through the runtime's `JSX` namespace before the transpile step erases the types and Babel emits `_jsx` calls. ui5-community/jsx-runtime — README: https://github.com/ui5-community/jsx-runtime jsx-runtime — showcase Learn page, What is JSX Runtime for UI5?: https://raw.githubusercontent.com/ui5-community/jsx-runtime/main/packages/jsx-runtime-showcase/webapp/docs/overview.mdTypeScript supportUSED BY← needed by2needed by derived The runtime its App and Main views are written against; the app exists to consume it the way a project outside the repository would. Through: inverted from its requires edge jsx-runtime — docs/xmlview-to-tsx.md, reference: https://raw.githubusercontent.com/ui5-community/jsx-runtime/main/docs/xmlview-to-tsx.md@ui5-community/jsx-runtime-helloworldneeded by derived The library it demonstrates, which it also serves as the dev harness for: editing the runtime's sources while the showcase's dev server runs reloads the browser through the workspace symlink. Through: inverted from its requires edge ui5-community/jsx-runtime — README, getting started: https://github.com/ui5-community/jsx-runtime@ui5-community/jsx-runtime-showcaseNEEDS→ needs3needs stated Compiling the JSX in an app's `.tsx` files into the `_jsx` and `_jsxs` calls the runtime consumes. The package README states version 7, because the v8 major changed the plugin API, and the requirements spec puts the floor at 7.20 with `runtime: "automatic"`. @ui5-community/jsx-runtime — package README, Install: https://raw.githubusercontent.com/ui5-community/jsx-runtime/main/packages/jsx-runtime/README.md jsx-runtime — docs/requirements.md, NFR-COMP: https://raw.githubusercontent.com/ui5-community/jsx-runtime/main/docs/requirements.md@babel/plugin-transform-react-jsxneeds stated The framework it produces views for. The runtime's own imports are from `sap.ui.core` and `sap.ui.base`, its modules load under the `ui5.community.jsx.runtime` namespace, and what happens after a JSX expression is UI5's: metadata, `applySettings`, bindings, aggregations and events. The requirements spec, marked a draft proposal, states UI5 1.130 LTS and newer. jsx-runtime — docs/gotchas.md, no dependencies from the core on sap.m / sap.f / sap.tnt: https://raw.githubusercontent.com/ui5-community/jsx-runtime/main/docs/gotchas.md jsx-runtime — docs/requirements.md, NFR-COMP: https://raw.githubusercontent.com/ui5-community/jsx-runtime/main/docs/requirements.md@openui5/sap.ui.coreneeds stated The JSX transform in the consuming app's build and dev server. Its `transformJSX` option switches on the Babel JSX plugin and assembles the rest of the pipeline from `tsconfig.json` and browserslist, so no hand-written `.babelrc.json` is needed. Version 3.12 or later. @ui5-community/jsx-runtime — package README, Install: https://raw.githubusercontent.com/ui5-community/jsx-runtime/main/packages/jsx-runtime/README.mdui5-tooling-transpileLINEAGE← has part2has part derived Through: inverted from its part_of edge@ui5-community/jsx-runtime-helloworldhas part derived Through: inverted from its part_of edge@ui5-community/jsx-runtime-showcase

Install

npm add @ui5-community/jsx-runtime

Derived from the package name. No recipe recorded; the README has the configuration.

Learn more1

Readings
  1. UI5 Views, Reimagined: Type-Safe TSX for a Modern Dev ExperiencePeter Muessig, YouTube — SAP Developers playlists

Where it sits in your app

Download
Your UI5 applicationdocumentedrequiresdocumentedrequiresdocumentedrequires@babel/plugin-transform-react-jsx, system@babel/plugin-transform…system@ui5-community/jsx-runtime, module@ui5-community/jsx-r…ui5-tooling-transpile, moduleui5-tooling-transpile@openui5/sap.ui.core, module@openui5/sap.ui.core
SAPnot SAP's, or the project's owndocumented only

README

quoted from ui5-community/jsx-runtime under Apache-2.0, read
ui5-community/jsx-runtime/packages/jsx-runtime/README.mdOn GitHub

@ui5-community/jsx-runtime

A plugin-based JSX runtime for UI5, write UI5 views as .tsx files with per-control TypeScript typing. No React, no VDOM, no reconciler. JSX expressions compile to plain new Control(settings) calls.

import Page from "sap/m/Page";
import Button from "sap/m/Button";
import View from "sap/ui/core/mvc/View";

export default class Hello extends View {
    createContent() {
        return (
            <Page title="Hello">
                <Button text="Click me" press=".onPress" />
            </Page>
        );
    }
}

Install

pnpm add @ui5-community/jsx-runtime
pnpm add -D @babel/plugin-transform-react-jsx@^7

Pin the Babel plugin to v7 (@^7) — the v8 major changed the plugin API and the JSX transform fails against it. It's an optional peer dependency that ui5-tooling-transpile (≥ 3.12) loads for you.

Enable the JSX transform in ui5.yaml — no .babelrc.json needed. ui5-tooling-transpile assembles the TypeScript/UI5/env presets from your tsconfig.json + browserslist, and transformJSX adds the JSX plugin:

customConfiguration:
  config-ui5-tooling-transpile: &cfgTranspile
    transformJSX:
      runtime: automatic
      importSource: "ui5/community/jsx/runtime"

Configure TypeScript:

{
    "compilerOptions": {
        "jsx": "react-jsx",
        "jsxImportSource": "ui5/community/jsx/runtime",
        "types": ["@openui5/types", "@ui5-community/jsx-runtime"]
    }
}

Declare the library in your app's manifest.json:

{
    "sap.ui5": {
        "dependencies": {
            "libs": {
                "ui5.community.jsx.runtime": {}
            }
        }
    }
}

Finally, make sure UI5's loader can find the runtime's modules. When the UI5 tooling serves your app it resolves them automatically. If you bootstrap UI5 from a CDN, add an explicit resource root pointing the ui5.community.jsx.runtime namespace at wherever you serve the package's dist/resources:

<script id="sap-ui-bootstrap"
    src="https://sdk.openui5.org/resources/sap-ui-core.js"
    data-sap-ui-libs="sap.m,ui5.community.jsx.runtime"
    data-sap-ui-resource-roots='{
        "ui5.community.jsx.runtime": "./resources/ui5/community/jsx/runtime/"
    }'
    data-sap-ui-compat-version="edge"></script>

What you get

Three layers of API surface:

  1. Core: jsx, jsxs, Fragment, <For>, <If>. Always available.
  2. Plugin SPI: five extension points (Renderer, IntrinsicHandler, PropertyApplier, ChildrenProcessor, Scope) let plugins add directives, intrinsics, and output adapters without touching the core.
  3. Sample plugin: <Switch>/<Case>/<Default> in src/plugins/switch/ demonstrates the SPI on a non-trivial example.

Read the full concept documentation for the walkthrough.

Example: opting a plugin in

import { withScope } from "ui5/community/jsx/runtime";
import { Switch, Case, Default, switchProcessor } from "ui5/community/jsx/runtime/plugins/switch";

createContent() {
    return withScope({ childrenProcessors: [switchProcessor] }, () => (
        <VBox>
            <Switch on={kind}>
                <Case when="info"><Title text="Info" /></Case>
                <Case when="warn"><Title text="Warning" /></Case>
                <Default>          <Title text="—"        /></Default>
            </Switch>
        </VBox>
    ));
}

License

Apache License 2.0.

Apache-2.0, read

History

Latest

v0.1.5

Fixes 1

Notes
Patch Changes
  • #17 6b026c2 Thanks @petermuessig! - Fix <If condition={binding}> throwing "expected boolean" when the bound model path resolves to a non-boolean value (e.g. a string). The ifProcessor now injects formatter: Boolean into the binding info so any truthy/falsy model value is coerced to boolean before UI5 sets visible on child controls.
  1. v0.1.4

    Fixes 1

    Notes
    Patch Changes
    • #15 b473e5c Thanks @petermuessig! - Fix string-syntax data binding for <For each> and <If condition>.

      Previously, using a binding string like each="{/items}" on <For> threw "requires a binding info", and condition="{/flag}" on <If> was silently treated as a literal truthy value instead of binding visible. Both now accept the idiomatic UI5 string form alongside the existing object form (each={{ path: "/items" }}), using the same BindingParser.complexParser pattern introduced in the aggregation-binding fix (commit 28f2e36).

  2. v0.1.3

    Fixes 2

    Notes
    Patch Changes
    • #10 2e704f8 Thanks @petermuessig! - Fix: auto-prefix-id no longer prefixes UI5-generated ids (closes #9).

      Controls like sap.m.Menu create internal helper controls (e.g. a MenuWrapper) whose ids are generated by UI5 (matching ManagedObjectMetadata.isGeneratedId). Previously, when JSX constructed such controls inside a view with getAutoPrefixId() === true, those generated ids were passed through view.createId(), making the internal control unresolvable at add-time and causing a TypeError.

      The runtime now guards the createId() call with !ManagedObjectMetadata.isGeneratedId(rawId) so only author-supplied (static) ids are prefixed. Generated ids pass through untouched. Closes #9.

    • #10 e9ffb68 Thanks @petermuessig! - JSX view-construction errors are now logged via sap/base/Log in addition to propagating. Previously, when createContent() threw (sync or async), the error was only visible as a rejected Promise and, in the showcase, as a text message rendered into the DOM. It was never written to the UI5 Log, making it invisible to log-scraping tooling and sap-ui-log-level debugging.

      installViewScopeBridge now wraps the createContent() call with a try/catch (sync) and a .catch on the returned Promise (async). On failure it calls Log.error with the full error message, the stack trace, and the component id "ui5.community.jsx.runtime", then re-throws / re-rejects so existing propagation behaviour is unchanged.

      The showcase's ExploreSample view also adds Log.error calls in both its demo-view and docs-load catch handlers so the exact user-facing message appears in the log as well.

  3. v0.1.2

    Fixes 1

    Notes
    Patch Changes
    • 28f2e36 Thanks @petermuessig! - Fix string-syntax aggregation bindings clobbering their row template. Binding an aggregation with the classic string form plus a JSX child, e.g. <VBox items="{view>/rows}"><FlexBox/></VBox>, now installs an aggregation binding whose template is the child — parity with the object form items={{ path: "view>/rows" }}. Childless string aggregation bindings are unaffected (UI5 already handled those). Fixes #6.
  4. v0.1.1

    Fixes 1

    Notes
    Patch Changes
    • #4 b464107 Thanks @petermuessig! - Fix key prop being silently dropped for controls that declare it as a property (e.g. sap.ui.core.CustomData).

      Babel's automatic JSX transform always extracts key from the element's attributes and passes it as the third argument to jsx(type, props, key) — it is never present in the props object. The runtime now detects this case and forwards the value to the control's key property when the control metadata declares one. For controls without a key property the behaviour is unchanged.

      Fixes #3.

  5. v0.1.0

    Features 1

    Notes
    Minor Changes
    • 7e382a2 Thanks @petermuessig! - Initial release of the plugin-based JSX runtime for UI5. Author UI5 views as .tsx — JSX compiles to plain new Control(settings) calls, with no React, no virtual DOM, and no reconciler. Ships the core directives (jsx, <Fragment>, <For>, <If>), a five-extension-point plugin SPI (Renderer, IntrinsicHandler, PropertyApplier, ChildrenProcessor, Scope), and the <Switch> sample plugin. Requires Node.js >=22.13.0 and, for the build, ui5-tooling-transpile >=3.12.0 with its transformJSX option.

    All notable changes to this package are documented here. This file is generated by changesets — the first entry is written when the initial release is versioned.

25downloads per week, npm
Weekly downloads for @ui5-community/jsx-runtime26 complete calendar weeks from 2026-04-20 to 2026-10-18; the latest total is 25.20 Apr – 26 Apr: 027 Apr – 3 May: 04 May – 10 May: 011 May – 17 May: 018 May – 24 May: 025 May – 31 May: 01 Jun – 7 Jun: 08 Jun – 14 Jun: 015 Jun – 21 Jun: 022 Jun – 28 Jun: 029 Jun – 5 Jul: 06 Jul – 12 Jul: 013 Jul – 19 Jul: 14020 Jul – 26 Jul: 927 Jul – 2 Aug: 43 Aug – 9 Aug: 410 Aug – 16 Aug: 817 Aug – 23 Aug: 724 Aug – 30 Aug: 3431 Aug – 6 Sept: 1467 Sept – 13 Sept: 20114 Sept – 20 Sept: 17021 Sept – 27 Sept: 8628 Sept – 4 Oct: 365 Oct – 11 Oct: 31912 Oct – 18 Oct: 25
TypeScript support
  1. ui5-task-dts-generatorUI5 builder task generating d.ts type declarationsfrom UI5
  2. @openui5/sap.ui.coreFramework core: module loader, MVC runtime, binding, routing, themingfrom UI5
  3. babel-preset-transform-ui5Babel transformer from modern ES or TypeScript to UI5 module syntaxfrom UI5
  4. ui5-task-transpileUI5 Tooling task transpiling TypeScript and ES modulesfrom UI5
  5. @ui5/mcp-serverMCP server for UI5 development with ten toolsfrom UI5
  6. @ui5/webcomponentsSAP's UI elements as standard custom elementsfrom UI5

Details

Sources4
GitHub APIdiscovered herechecked
npm registry, @ui5-community/jsx-runtimeversion, releases, installschecked
github.com/https://github.com/ui5-community/jsx-runtime.gittree, pushes, contributors, CIchecked
packages/jsx-runtime/README.mdquoted, and what the entry declareschecked

Sources are graph entities: the same page may back several entries, and an unreachable source flags every row that rests on it.

Compatibility and provenance
latestv0.1.5
first release
releases and cadence6, ~5d median
discovered viaGitHub API
first seen in the atlas
ecosystem and domainui5, developer-experience
Contributors1

From the repository’s contributor list, .

History in the atlas6
  1. the Incubation label the documentation site carries, and the TypeScript floor of 5.0 the requirements spec states
  2. both of those, and a view that has to stay adaptable through UI5 flexibility
  3. the Babel floor of 7.20 with `runtime: "automatic"`, and UI5 1.130 LTS and newer
  4. Both the root README and the package README end on "[Apache License 2.0](LICENSE).", and the crawled npm record for @ui5-community/jsx-runtime reports the same SPDX identifier.
  5. The type owns the key for a package (CONCEPT-038) and the record stated nothing, which reads as "does not say" while the README's repository layout says of this package "Publishable to npm." and the package README's install step is "pnpm add @ui5-community/jsx-runtime". The sibling packages in the same monorepo are each marked "Not published" and state no distribution.
  6. First seen.
For your agent
Ref
artifact:ui5-community-jsx-runtime
JSON
/artifacts/ui5-community-jsx-runtime.json
MCP
Connecting an agent