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 →

@abap2ui5/embed-control

A UI5 custom control that runs an abap2UI5 app inside a host UI5 app, with the abap2UI5 frontend loaded from the backend the app talks to.

z2ui5.embed.Container puts an abap2UI5 app, an ABAP class implementing z2ui5_if_app, into a host UI5 app as an ordinary control, written in an XML view or created in code, with the ABAP class, the service path and the parameters as its properties. The package carries the control alone: the abap2UI5 frontend it wraps comes from the installation the app talks to, so the host app never ships a copy of it and the frontend always matches that backend. Setting it up is an npm install, an includeDependency entry in ui5.yaml and a resourceRoots entry in manifest.json; nothing is deployed to the ABAP system, because the control is a plain module with no component and no library. Every control is its own abap2UI5 session, and a change of app, endpoint or params, or a call to restart(), ends the running session and starts a new one.

Facts

Latestv0.3.0ReleasedLast pushLicenceMIT

Where it sits

Lives in
Provides
Custom controls and librariesUI5Custom controls and librariescapabilityExtending the set of controls an app is built from: a control of its own, a wrapper around a third-party widget, or an icon font registered with the framework, packaged so another app can reuse it. Distinct from [Web Components interop](capability:ui5-web-components), which brings in standard custom elements, and from [generators](capability:generators), which scaffold a control project rather than being one.
Add-on to
abap2UI5abap2UI5artifactOne ABAP class implementing z2ui5_if_app is the whole app: the browser loads a generic UI5 shell once, and every interaction after that is an HTTP roundtrip back into ABAP.
Serves
Requires
abap2UI5abap2UI5artifactThe abap2UI5 installation the embedded app runs on: its HTTP service serves the frontend the control loads and answers the roundtrips. 1.145.0 is the floor the package records.@ui5/cli@ui5/cliartifactThe host app's tooling reads the package's ui5.yaml, serves the control and copies it into the build.

Who is behind it

abap2UI5abap2UI5OrganisationMaintains this
In the atlas: maintains 18
@abap2UI5
oblomov-devoblomov-devPersonMaintains this
In the atlas: maintains 4, contributes to 44
@oblomov-dev
maintainers

Before choosing this

Conditions

PracticalFunctional boundary

The page and the abap2UI5 service have to share an origin: an endpoint that resolves to another origin is refused, and abap2UI5 rejects a POST whose Origin names another host. A host that routes by the URL hash, such as a Fiori elements app or an app with a UI5 router, needs abap2UI5 1.146.0 or later, because 1.145.0 clears the host's hash after every roundtrip. One frontend per page: the first control that starts decides which endpoint the frontend comes from.

What it declares

Every artifact

Type
Package
Origin
By a community org

As a package

Where it runs
Inside its host
Distributed through
npmabapGit

Connections4

@abap2ui5/embed-control connections@abap2ui5/embed-controlPROVIDES→ provides1provides stated Publishes one UI5 custom control, `z2ui5.embed.Container`, on npm as a UI5 CLI project of type module: the host app adds it as a dependency and registers the namespace `z2ui5.embed` under `thirdparty/`, and places the control in an XML view or creates it in code. abap2UI5/embed-control — repository: https://github.com/abap2ui5/embed-control @abap2ui5/embed-control — README: https://raw.githubusercontent.com/abap2UI5/embed-control/main/packages/embed-control/README.md @abap2ui5/embed-control — README: https://raw.githubusercontent.com/abap2UI5/embed-control/main/packages/embed-control/README.mdCustom controls and librariesNEEDS→ connects to1connects to stated Loads the abap2UI5 frontend once per page from the endpoint and sends each control's roundtrips to it, one session per control. @abap2ui5/embed-control — README: https://raw.githubusercontent.com/abap2UI5/embed-control/main/packages/embed-control/README.mdabap2UI5→ needs2needs stated The host app's tooling reads the package's `ui5.yaml`, serves the control and copies it into the build. @abap2ui5/embed-control — README: https://raw.githubusercontent.com/abap2UI5/embed-control/main/packages/embed-control/README.md@ui5/clineeds stated The abap2UI5 installation the embedded app runs on: its HTTP service serves the frontend the control loads and answers the roundtrips. 1.145.0 is the floor the package records. @abap2ui5/embed-control — README: https://raw.githubusercontent.com/abap2UI5/embed-control/main/packages/embed-control/README.mdabap2UI5

Install

npm add @abap2ui5/embed-control

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

README

quoted from abap2UI5/embed-control under MIT, read
abap2UI5/embed-control/packages/embed-control/README.mdOn GitHub

@abap2ui5/embed-control

Run abap2UI5 apps inside any UI5 app.

abap2UI5 builds UI5 apps purely in ABAP: an ABAP class implementing z2ui5_if_app decides the view and handles every event. This package puts such an app into your UI5 app as an ordinary control, next to your own controls:

<mvc:View xmlns:mvc="sap.ui.core.mvc" xmlns:z2ui5="z2ui5.embed">
  <z2ui5:Container app="Z2UI5_CL_UI5_APP_HI_WORLD" height="400px"/>
</mvc:View>

The package is the control and nothing else. The abap2UI5 frontend it wraps comes from the abap2UI5 installation the app talks to - so it always has the version of that backend, and your app never carries a copy of it.

Install

npm install @abap2ui5/embed-control

Then two entries in your app. ui5.yaml - so ui5 build copies the control into your app (ui5 serve serves it anyway):

builder:
  settings:
    includeDependency:
      - "@abap2ui5/embed-control"

manifest.json - where the control's namespace lives:

"sap.ui5": {
  "resourceRoots": { "z2ui5.embed": "./thirdparty/z2ui5/embed/" }
}

The build puts it into dist/thirdparty/z2ui5/embed/ and your deployment takes it along like every other file of the app. Not under resources/: an app deployed to an ABAP system answers every <app>/resources/ path from the UI5 library of the system. The relative resource root holds in a standalone page and in the SAP Fiori launchpad alike.

Nothing else is deployed anywhere: the control is a plain module (no component, no library), so no app index entry of an ABAP system is involved, and any number of apps can carry their own copy.

Use

In an XML view, as above, or in code:

sap.ui.require(["z2ui5/embed/Container"], (Container) => {
  new Container({
    app: "ZCL_MY_ABAP2UI5_APP",
    params: { customer: "4711" },
    height: "600px",
  }).placeAt("content");
});
PropertyTypeDefault
appstringThe ABAP class to run. Nothing starts while it is empty
endpointstring/sap/bc/z2ui5Path of the abap2UI5 HTTP service on this server - absolute, or relative to the page's address (a <base> does not apply), without a query or a fragment. The frontend is loaded from it, the roundtrips go to it. See Backend
paramsobject{ name: "value" }, read by the app with client->get( )-t_comp_params; { name: ["a", "b"] } hands several values over under one name. A value that is null or undefined is left out; an object is handed over as JSON text
ownsPagebooleanfalseHands the page to the app - for a page that is this control and nothing else: the app then has what it has on a page of its own - the URL hash (hash routing, set_push_state, hash_replace, browser Back and Forward between routed apps, a route restored on reload), the document title and the favicon, the global busy indicator during a roundtrip, the browser's "leave page?" prompt for unsaved changes. Off, they are your app's: the embedded app leaves the title, the favicon and the hash alone, is busy on its own area and raises no prompt. Leave it off when your page has more than the control - a Fiori elements object page. One such control per page. A change starts the app anew, like one of app, endpoint or params. Needs abap2UI5 1.147.0, which reads it (the control passes ownsHash with it); an older one ignores it
ownsHashbooleanfalseThe older, narrower name of ownsPage: hands the page's URL hash to the app - for a page that is this control and nothing else, which routes by nothing: the app then routes as on a page of its own (hash routing, set_push_state, hash_replace, browser Back and Forward between routed apps, a route restored on reload). Leave it off when your app routes by the hash - a Fiori elements object page does. One such control per page. A change starts the app anew, like one of app, endpoint or params. Needs abap2UI5 1.147.0, which hands the whole page over for it, as for ownsPage; an older one ignores it
widthCSSSize100%
heightCSSSize100%The app fills its container - give it a height, or a parent that has one. A change of width or height resizes the area in place; the running app is not re-rendered
EventParameters
componentCreatedcomponentThe app's component exists (the first roundtrip is under way)
componentFailedreasonIt could not be created - the endpoint is not a path on this server, the frontend could not be loaded, or the component failed
Method
restart()Ends the running session and starts the app anew with the current app, endpoint and params - the app from scratch, or one more try after componentFailed

Every control is its own abap2UI5 session - two controls with the same class do not share state. Changing app, endpoint or params ends the running session and starts a new one; restart() does the same with the values as they are; destroying the control ends it too. All three are ordinary properties, so they can be bound to your model - params is compared by value with what the running app was started with, so a binding that hands over the same parameters in a new object does not restart the app, and an endpoint that names the same place in another spelling (a trailing slash, a relative path) does not either.

Both events arrive asynchronously, after the rendering that started the app - a refused endpoint included. A start that failed is not repeated by itself: change one of the three properties, or call restart(). An invisible control (visible="false") starts nothing until it is shown; an app that runs keeps running, with its state, while its control is hidden.

Examples

Complete examples that use the package are in abap2UI5/samples-embed-control, on its branch standard, all taking the package from npm:

  • freestyle/ - a UI5 freestyle app with three controls, also as the BSP Z2UI5_HOST to try it on a system with a plain abapGit pull
  • fiori-elements/ - a Fiori elements app with the control in a custom section of its object page: the abap2UI5 app gets the key of the object on the page as a parameter
  • fiori-elements-v2/ - a Fiori elements app for OData V2 with the control in an object page extension, and the RAP service it reads; on the branch rap, all of it for one abapGit pull on a system with RAP
  • card/ - a UI Integration Card for SAP Build Work Zone that runs any abap2UI5 app: the class is a card parameter, the backend a card destination

Its README walks through the places the package is wired in.

Backend

The app runs on an ABAP system with abap2UI5 installed and its HTTP service (by default /sap/bc/z2ui5) active. The control needs abap2UI5 1.145.0 or later, whose service answers ?z2ui5-bundle - in Node that is @abap2ui5/node-runtime 1.145.0, in CAP @cap2ui5/cds-plugin 0.3.1, which runs on it:

GET  /sap/bc/z2ui5?z2ui5-bundle   the frontend as one script - loaded once per page
POST /sap/bc/z2ui5                the roundtrips, one session per control
GET  /sap/bc/z2ui5                abap2UI5's own page, unchanged

An older abap2UI5 answers with its page; the control then fires componentFailed ("no abap2UI5 frontend at ...") instead of starting.

What 1.145.0 does not do yet. abap2UI5 1.146.0 fixes all of these; with 1.145.0 itself plan for them:

  • The URL hash is the frontend's. 1.145.0 clears the host's hash with the first roundtrip and after every one: a Fiori elements object page goes back to its list, SAP Build Work Zone leaves the page a card sits on. And a host hash shaped like abap2UI5's own deep link, #/app/<CLASS>, wins over the app property - that class starts instead. A host that routes by the hash - a Fiori elements app, an app with a UI5 router, SAP Build Work Zone - needs 1.146.0 or later, whose frontend knows it is embedded and leaves the hash to your app (abap2UI5 677e71b, #2808).
  • No CSRF token handshake. An SAP approuter route checks CSRF tokens by default (cds add approuter generates such a route), and 1.145.0 sends none - every roundtrip is refused with 403 "X-CSRF-Token: Required". Give the route to the service "csrfProtection": false; abap2UI5's own origin check stays in place. 1.146.0 fetches the token on that 403 (abap2UI5 #2802).

Every release is tested against abap2UI5's main and against 1.145.0 (@abap2ui5/node-runtime 1.145.0) - there without what needs the hash. The package records the floor in its package.json (abap2ui5.minBackend), and that is the version the test installs.

The page and the service have to share an origin. abap2UI5 rejects a POST whose Origin names another host than its own (its CSRF defense), and the control loads the frontend only from a path on this server - an endpoint that resolves to another origin is refused, because what comes back is code that runs in your page. So the browser reaches the service through your app's origin:

  • deployed - the app is served from the same system (BSP, launchpad), or an approuter / destination routes /sap/bc/z2ui5 to it
  • ui5 serve - a proxy middleware forwards /sap to the system, like ui5-middleware-simpleproxy in the examples. It rewrites Host and tells the backend the dev server's host in X-Forwarded-Host, which abap2UI5 compares the browser's Origin with (trusted by default; check_trust_forwarded_host in the user exit)

Content-Security-Policy: the frontend is a <script src> of your own origin, and every module in it is a function - nothing is evaluated from a string. A host with script-src 'self' and no 'unsafe-eval' needs nothing extra (UI5 1.71 itself still needs 'unsafe-eval').

UI5 libraries

The embedded app loads whatever UI5 library its ABAP view names. With the UI5 CLI serving the framework (framework: in ui5.yaml), list every library your ABAP apps use there, not only the ones your own views use - the hello world app, for instance, needs sap.ui.layout - and sap.ui.codeeditor, which abap2UI5's developer tools (Ctrl+F12 in the embedded app) need. A library missing there fails in the browser console with a script load error; an app deployed to a system has every library of that system.

Supported UI5 versions

The same floor as abap2UI5: OpenUI5 / SAPUI5 1.71 and later. The freestyle example is tested on 1.71 and 1.136, the Fiori elements examples for OData V4 and V2 on SAPUI5 1.136, the card on OpenUI5 1.136.

Your app's tooling: UI5 CLI 3 or 4 - the package's ui5.yaml is specVersion 3.0, and every release is built with both.

Known limitations

  • One frontend per page: the first control that starts decides which endpoint the frontend comes from; every control still sends its roundtrips to its own endpoint. A control that shared that load with another endpoint of its own, and saw it fail, tries its own endpoint once. A bundle the host loaded itself - a <script src="<endpoint>?z2ui5-bundle"> of its page, to have it warm - is taken as it is, not loaded again.
  • The host page's mobile setup, with abap2UI5 1.146.0 and earlier. sap.m.App, the root of the embedded frontend, runs UI5's sap/ui/util/Mobile.init when it is created - once per page, with the settings of whoever calls it first. On a host page without a sap.m.App of its own that puts height: 100% on <html>, adds a viewport meta tag that disables zooming and a format-detection meta tag, and on iOS turns native scrolling off (position: fixed on <html>) and hides the browser's UI. abap2UI5 1.147.0 makes that call first, with everything off, so the host keeps its page; what stays on a phone or tablet is the web-app-capable meta tag sap.m.App sets on every rendering. From 1.147.0 on the root of an embedded app is a sap.m.NavContainer, which sets none of it; with ownsPage the root is the sap.m.App again, as on a page of the app's own. A host with a sap.m.App of its own is not affected on any release.
  • Custom controls from the sibling BSPs z2ui5_cci / z2ui5_ccc (abap2UI5-addons/custom-controls, the customer's own library) behind a proxy that puts the system under a prefix of its own - SAP Build Work Zone's destination proxy, an approuter route with a prefix - need abap2UI5 1.147.0. Until then the bundle names their paths as the system has them, /sap/bc/ui5_ui5/sap/z2ui5_cci, which the host's origin does not have; from then on its bundle names the node it was requested under, and the frontend puts the prefix of the control's endpoint in front of the roots. Nothing in the control changes with it.
  • abap2UI5 was built to own the whole page. Its embedded mode leaves the URL to your app (from 1.146.0 on) - unless ownsHash hands the hash back (from 1.147.0 on) - and, from 1.147.0 on as well, the document title, the favicon, the busy indicator and the "leave page?" prompt as well, unless ownsPage hands the page back; before that an embedded app shows the global busy indicator during a roundtrip and may set the document title and favicon when the ABAP app asks for it. The rest is still to come (backlog item). Up to 1.146.0 an embedded app renders its root as sap.m.App, the full-screen root: the theme's background of its own, and a height of 100% on every ancestor up to the control's area. From 1.147.0 on it is a sap.m.NavContainer that only fills the area, unless ownsPage hands the page back. Before 1.146.0 the app also takes the focus when it starts, from wherever it is in your app - the root focuses the first field of its first page, and the ABAP app may set the focus as well.
  • Page-wide behaviour of the embedded frontend. Its error dialog's "Restart" - and "Refresh" on its fatal error screen - reloads the whole page, your app included. Its developer tools wrap the window.console methods while an app runs (the browser console keeps working; its source links point to the wrapper) and listen for Ctrl+F12 on the document.
  • Keep-alive. The embedded app's component belongs to your app's component, the owner of the control, and the abap2UI5 frontend does not support keep-alive: an app that declares it (sap.ui5/keepAlive, UI5 1.88+) reports no keep-alive support while it has an embedded app, as UI5 does for every nested component without it.

What is inside

Path
src/Container.jsThe control, z2ui5.embed.Container
src/Container.cssIts stylesheet, loaded by the control
ui5.yamlServes src/ under /thirdparty/z2ui5/embed/
CHANGELOG.mdEvery release

License

MIT

MIT, read

History

Latest

v0.3.0

Other 3

Notes
  • ownsPage (boolean, default false): hands the page to the app, as componentData.ownsPage - for a host whose page is the control and nothing else (abap2UI5's embed app). The app then has the URL hash, the document title and the favicon, the global busy indicator and the browser's "leave page?" prompt as on a page of its own; without it abap2UI5 1.147.0 leaves all of them to the host. The control passes ownsHash with it, which 1.147.0 reads the same way. A change starts the app anew, like one of app, endpoint or params.
  • Docs: the embedded app's root is a sap.m.NavContainer from abap2UI5 1.147.0 on (abap2UI5/abap2UI5#2913); the README's notes on the mobile setup and on the root say so. Nothing in the control changes.
  • Docs: what 0.2.0 and these notes called "the release after 1.147.0" - ownsPage, the page left to the host, the sap.m.NavContainer root - is in 1.147.0: its tag went out on 2026-10-14 with all three in it.
  1. v0.2.0

    Other 22

    Notes
    • The component is created under the name the bundle's z2ui5/embed module gives (componentName) when it gives one - abap2UI5 1.147.0 registers the frontend as z2ui5.embed.frontend as well. That lets a page whose own component is z2ui5 embed it: the BSP Z2UI5 of abap2UI5's embed app (the standard_new and cloud_new branches of abap2UI5/frontend), which existing launchpad target mappings name. An older bundle names none, and the frontend runs as z2ui5 as before.
    • ownsHash (boolean, default false): hands the page's URL hash to the app, as componentData.ownsHash - for a host whose page is the control and nothing else (abap2UI5's embed app). The app then routes as on a page of its own: hash routing, set_push_state, hash_replace, browser Back and Forward between routed apps, a route restored on reload. A change starts the app anew, like one of app, endpoint or params. Needs abap2UI5 1.147.0, which reads it; an older one ignores it.
    • README: with the UI5 CLI serving the framework, sap.ui.codeeditor has to be among the libraries as well - abap2UI5's developer tools need it, and ui5 serve serves only what ui5.yaml names.
    • width and height are applied to the control's area without a rendering. A change re-rendered the ComponentContainer and with it every control of the running app - on UI5 1.71 a value the user was typing and the focus were lost with it, and a host that binds the height to the window size re-rendered the app on every resize.
    • A bundle the host loaded itself - a <script> of its page - is not loaded again: the control takes the z2ui5/embed module that is there. 0.1.1 loaded it a second time, and UI5 warned that the module was defined twice.
    • An object among the params - a structure, a nested array - is handed over as JSON text; 0.1.1 handed it over as the text [object Object].
    • An error thrown by a componentCreated or componentFailed handler is logged (sap/base/Log, with the control's id) instead of ending as an unhandled promise rejection that nothing attributes to the control.
    • Node tests of the control (npm test, test/container.test.mjs): the endpoints it accepts and what it requests, what the component gets, when it starts, restarts and gives up - without a browser or a backend. The examples' Playwright tests in abap2UI5/samples-embed-control keep covering the shipped control against a live abap2UI5.
    • README: the host page's mobile setup with abap2UI5 1.146.0 and earlier - sap/ui/util/Mobile.init through the embedded sap.m.App: height: 100% on <html>, a viewport meta tag, native scrolling off on iOS - listed under known limitations; abap2UI5 1.147.0 leaves the host's page alone. Nothing in the control changes with it.
    • restart(): ends the running session and starts the app anew with the current app, endpoint and params - the app from scratch, or one more try after componentFailed. A failed start was repeated only by a change of one of the three properties.
    • An endpoint that names the same place in another spelling - a trailing slash, a relative path, the default written out - no longer restarts the app: what a start is compared by is the endpoint as it is requested. Nor does an app_start in params, which app overrides anyway.
    • An invisible control (visible="false") starts nothing until it is shown. UI5 calls onBeforeRendering for the placeholder it renders, and 0.1.1 started the app - and its backend session - for a control nobody saw. An app that runs keeps running while its control is hidden.
    • componentFailed for a refused endpoint fired inside the rendering, every other failure after it. All of them arrive asynchronously now, so a handler that changes a model or the control never does so in the rendering phase.
    • An endpoint with a query or a fragment is refused as before, and the reason says so (carries a query or a fragment) instead of calling a path on this server another host.
    • params takes an array for a name, { ids: ["1", "2"] }, as several values of that name - the launchpad's shape, which the backend reads; 0.1.1 handed an array over as the text "1,2".
    • A control that shared the frontend load of another control's endpoint and saw it fail tries its own endpoint once, instead of failing for a backend it never talks to. The first control that starts still decides where the frontend comes from when that load succeeds.
    • README: a custom control from the sibling BSPs z2ui5_cci / z2ui5_ccc behind a prefixing proxy (SAP Build Work Zone, an approuter route with a prefix) needs abap2UI5 1.147.0, whose bundle names the node it was requested under and whose frontend puts the prefix of the control's endpoint in front of the roots - listed under known limitations; nothing in the control changes with it.
    • scripts/consumer-check.mjs runs npm through the node that started it (npm_execpath) instead of looking npm up on the PATH, which fails on Windows.
    • package.json names the author (abap2UI5), as npm and the Best of UI5 listing show it.
    • package.json records the backend floor, "abap2ui5": { "minBackend": "1.145.0" } - the first abap2UI5 whose service answers ?z2ui5-bundle, which the README names in prose. The CI's e2e leg against the floor installs the @abap2ui5/node-runtime of that version, so the two cannot drift. No engines: the package is a browser control with no Node code, and a UI5 CLI 3 consumer may install it on Node 16 or 18.
    • The README lists the Fiori elements example for OData V2, with the RAP service it reads, and names the UI5 release it is tested on.
    • The README links the proxy example in abap2UI5/samples-embed-control, where the examples are developed now.
  2. v0.1.1

    Other 11

    Notes
    • Security: an endpoint that the browser reads as another host - a tab or line break after the first slash ("/\t/evil.example/...") - no longer passes the same-origin check. The endpoint is parsed the way the browser parses it, refused unless it lands on the page's origin, and only the resolved URL is requested. A relative endpoint now resolves against the page's address.
    • An endpoint whose path begins with // once . and .. segments are resolved - "/.//evil.example/...", "..//evil.example/..." - is refused: no server has such a path, and on its own it names another host.
    • A page with a <base> that names another host no longer sends the frontend request and the roundtrips there: the control requested the checked endpoint as a path, which the browser resolves against the <base>. It requests, and hands to the frontend, the absolute URL on the page's origin now.
    • One failed load of the frontend - a backend that was down, a logon page instead of the bundle - no longer disables every control on the page for good. The failure is forgotten and the next start (a new control, or a change of app, endpoint or params) asks the backend again; the control no longer asks UI5's module loader for z2ui5/embed, which remembered the module as failed.
    • A change of app, endpoint or params, or the control destroyed, while the component was still being created left that component running unseen, with its backend session. The control creates the component itself now and destroys it when the start it belongs to is no longer the current one.
    • The component is created in the context of the control's owner - your app's component - as a ComponentContainer in a view creates it; 0.1.0 created it without an owner. An app that declares keep-alive (sap.ui5/keepAlive, UI5 1.88+) therefore reports no keep-alive support while it has an embedded app: the abap2UI5 frontend does not support it, and 0.1.0 left the embedded app running while its host was inactive. A host deactivated while its app is still starting gets the app all the same, created without the owner.
    • params are compared by value: a binding that hands over the same parameters in a new object (model.refresh(true), a formatter) no longer restarts the app and loses its state. They are compared with what the running app was started with, so a params object changed in place and handed over again - as a copy or as the same object - does restart it (0.1.0 missed the same object). A parameter whose value is null or undefined is left out instead of reaching the app as the text "null" or "undefined".
    • The control no longer leaves window.z2ui5.embed behind: UI5 exports every class it creates as a global, and abap2UI5 dropped its z2ui5 global on purpose (#2777). The module returns the class, which is all that views and sap.ui.require use.
    • README: the backend floor in Node and CAP too (@abap2ui5/node-runtime 1.145.0, @cap2ui5/cds-plugin 0.3.1), what 1.145.0 does not do yet (the URL hash, a #/app/<CLASS> hash that wins over app, no CSRF token for an approuter route), the page-wide behaviour of the embedded frontend and that a starting app takes the focus from the host.
    • The package carries this changelog.
    • README: abap2UI5 1.146.0 is out - it names the release that leaves the URL hash to the host and answers an approuter's CSRF check, where it said "the first release after 1.145.0".
  3. v0.1.0

    Other 4

    Notes

    The first release.

    • z2ui5.embed.Container runs an abap2UI5 app - an ABAP class implementing z2ui5_if_app - inside any UI5 app. Properties app, endpoint, params, width and height; events componentCreated and componentFailed. Every control is its own abap2UI5 session.
    • The abap2UI5 frontend is not in the package: the control loads it once per page from the backend it talks to (GET <endpoint>?z2ui5-bundle, abap2UI5 1.145.0 or later), and only from a path on the page's own server.
    • Served and built under thirdparty/z2ui5/embed/, so it is found in an app deployed to an ABAP system too. UI5 1.71 and later; UI5 CLI 3 and 4.
    • The control's area is the embedded app's root: sap.m.App and sap.m.Shell stop there instead of setting height: 100% on every ancestor up to <html> - the host's layout stays the host's, and a UI Integration Card keeps the height of its content.
311downloads per week, npm
Weekly downloads for @abap2ui5/embed-control26 complete calendar weeks from 2026-04-20 to 2026-10-18; the latest total is 311.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: 020 Jul – 26 Jul: 027 Jul – 2 Aug: 03 Aug – 9 Aug: 010 Aug – 16 Aug: 017 Aug – 23 Aug: 024 Aug – 30 Aug: 031 Aug – 6 Sept: 07 Sept – 13 Sept: 014 Sept – 20 Sept: 021 Sept – 27 Sept: 028 Sept – 4 Oct: 4115 Oct – 11 Oct: 41812 Oct – 18 Oct: 311
Custom controls and libraries
  1. custom-controlsThirteen custom UI5 controls for abap2UI5 apps
  2. ui5-cc-timerbuttonUI5 control library with a button that delays enabling or showing
  3. ui5-control-generatorCommand line generator of UI5 custom controls from html
  4. @marianfoo/ui5-cc-dayjsUI5 custom control formatting dates with Day.js
  5. ui5-cc-pdfviewerUI5 custom control rendering a PDF from a base64 data URI
  6. openui5-passwordOpenUI5 password input with strength scoring and rules
  7. openui5-tourOpenUI5 control library for guided app tours
  8. ui5-lib-visualizationUI5 control library wrapping C3.js charts as ui5.viz controls
  9. UI5XUI5 library of eight composite controls under the ui5x namespace
  10. openui5-cameraUI5 control for live camera preview and PNG capture
  11. ui5-cc-chartUI5 custom control wrapping Chart.js for line charts
  12. ui5-cc-mdUI5 custom control rendering Markdown to HTML
  13. ui5-fontawesome-libUI5 library adding Font Awesome icon sets to sap-icon://
  14. openui5-paginatorA UI5 custom control that pages through large data in a table, for backends that serve pages over REST rather than OData.

Details

Sources4
Added by handdiscovered herechecked
npm registry, @abap2ui5/embed-controlversion, releases, installschecked
github.com/git+https://github.com/abap2UI5/embed-control.gittree, pushes, contributors, CIchecked
packages/embed-control/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.3.0
first release
releases and cadence3, ~14d median
discovered viaAdded by hand
first seen in the atlas
ecosystem and domainui5, ui-and-frontend-bridge
Flavors2
Freestyle
“`freestyle/` - a UI5 freestyle app with three controls” — @abap2ui5/embed-control — READMEchecked
Fiori elements
“`fiori-elements/` - a Fiori elements app with the control in a **custom section of its object page**: the abap2UI5 app gets the key of the object on the page as a parameter” — @abap2ui5/embed-control — READMEchecked
History in the atlas1
  1. First seen.
For your agent
Ref
artifact:abap2ui5-embed-control
JSON
/artifacts/abap2ui5-embed-control.json
MCP
Connecting an agent