{"ref":"artifact:abap2ui5-headless-frontend","page":"/artifacts/abap2ui5-headless-frontend","json":"/artifacts/abap2ui5-headless-frontend.json","generated":"2026-10-26","drafted_with_ai":true,"entity":{"id":"abap2ui5-headless-frontend","name":"abap2UI5 headless frontend","artifact_type":"package","ecosystem":"abap","domain":"developer-experience","secondary_domains":["ui-and-frontend-bridge"],"origin_ring":"community-org","use_as":"dependency","flavors":[{"key":"standard-abap","source":{"url":"https://github.com/abap2ui5/headless-frontend","title":"abap2UI5/headless-frontend — README","checked":"2026-10-17","quote":"Runs on ABAP Standard, ABAP Cloud and — via the downport in CI — 7.02."}},{"key":"abap-cloud","source":{"url":"https://github.com/abap2ui5/headless-frontend","title":"abap2UI5/headless-frontend — README","checked":"2026-10-17","quote":"Runs on ABAP Standard, ABAP Cloud and — via the downport in CI — 7.02."}}],"description":{"one_line":"Plays the frontend's side of the [abap2UI5](artifact:abap2ui5-abap2ui5) request/response contract in ABAP, so an app class is driven and asserted on from a plain ABAP Unit test.","short":"Drives abap2UI5 app classes from ABAP Unit tests","what_it_solves":"An abap2UI5 app is a class whose whole conversation with the outside world is one JSON request in and one JSON response out, and this repository answers the other side of that contract in ABAP: `z2ui5_cl_frontend_simulator` builds the request the UI5 frontend builds, hands it to `z2ui5_cl_ui5_handler` and replays the response the way the frontend does, in the same session and the same call stack as the test. A test addresses the app by the names its author already wrote, `MV_NAME` for an attribute bound with `client->_bind( )` and `GREET` for an event id, with no CSS selectors and no control ids, and reads the screen back with `get_view( )`, `get_model( )`, `get_messages( )` and `get_layers( )`. The frontend's five view slots are kept the same way: `MAIN`, the nested views `NEST` and `NEST2`, and the standalone `POPUP` and `POPOVER`, each of which keeps its own copy of the model, so an edit travels with the next event of the layer it was made in. A draft-based session continues in a later request, where `resume( id state )` posts the draft id the backend restores the app from and rebuilds each layer's view XML from the `get_state( )` string of the request before; a sticky session keeps the app in the handler instead of a draft and cannot be resumed.","when_not_to_use":"There is no control tree: visibility and enablement are not evaluated, and `set_value( )` is not checked against the bound paths. The frontend `CONFIG` (device, UI5 version, focus, scroll) is not sent at all, so an app that branches on device or theme sees initial values. It drives `z2ui5_cl_ui5_handler` and the draft service, which the README states are not part of abap2UI5's released API in `src/02`, so a core change there can require a change here.","to_build_on_it":"ROADMAP.md names the order: an injectable frontend `CONFIG` first, then a control tree parsed out of the view XML, which is what closes the bound-path check and the visibility and enablement assertions. The stage after that splits the simulator along the seam it implies, into `z2ui5_cl_frontend_session` for the protocol, `z2ui5_cl_frontend_view` for the control tree and `z2ui5_if_frontend` as the contract an alternative frontend implements, so a console renderer or a REST facade becomes a second consumer of the same base rather than a fork. The [agent addon](https://github.com/abap2UI5-addons/abap-agent-runtime), which exposes abap2UI5 apps over an ABAP-native MCP endpoint and uses the simulator as its engine, is the first such consumer, and the typed edits and `resume( )` were added for it."},"links":{"repo":"https://github.com/abap2UI5/headless-frontend"},"type_properties":{"distribution":{"value":["abapgit"],"sources":[{"url":"https://github.com/abap2ui5/headless-frontend","title":"abap2UI5/headless-frontend — README","checked":"2026-10-17","quote":"Install with [abapGit](https://abapgit.org)."}]}},"maintainers":["actor:abap2ui5"],"provides":[{"capability":"capability:abap-unit-testing","what_it_does":"Runs a whole abap2UI5 user session inside an ABAP Unit test — start the app, queue model edits, fire an event, read the view, model, messages and actions back — against the framework's own dispatch, event handling, model serialisation and draft handling, with no server, browser driver or network. Its `HARMLESS` test class installs an in-memory draft store through the core's store seam, so the draft path writes nothing to the database.","sources":[{"url":"https://github.com/abap2ui5/headless-frontend","title":"abap2UI5/headless-frontend — README","checked":"2026-10-17","quote":"`z2ui5_cl_frontend_simulator` builds the same request the UI5 frontend builds, hands it to `z2ui5_cl_ui5_handler`, and replays the response the way the frontend does — all in the same session, in the same call stack, in a plain ABAP Unit test."},{"url":"https://github.com/abap2ui5/headless-frontend","title":"abap2UI5/headless-frontend — README","checked":"2026-10-17","quote":"It exercises the real framework: the real `main( )` dispatch, the real event handling, the real model serialisation, the real draft handling."},{"url":"https://github.com/abap2ui5/headless-frontend","title":"abap2UI5/headless-frontend — README","checked":"2026-10-17","quote":"installs an in-memory draft store through the core's store seam (`z2ui5_cl_ui5_srv_draft=>set_instance`), so even the draft path writes nothing to the database."}]}],"requires":[{"ref":"artifact:abap2ui5-abap2ui5","for":"The framework the simulator drives, installed in the same system, at a version that speaks wire protocol 2 — a response naming another protocol is refused with `PROTOCOL_MISMATCH`.","requirement":"required","basis":"binding","role":"framework","sources":[{"url":"https://github.com/abap2ui5/headless-frontend","title":"abap2UI5/headless-frontend — README","checked":"2026-10-17","quote":"Requires [abap2UI5](https://github.com/abap2UI5/abap2UI5) in the same system, at a version that speaks wire protocol 2 (`S_FRONT.S_ACTION`) — a response that names another protocol is refused with `PROTOCOL_MISMATCH`."}]},{"ref":"artifact:abapgit-abapgit","for":"Installing the simulator and its example apps into the system.","requirement":"required","basis":"binding","role":"installation","sources":[{"url":"https://github.com/abap2ui5/headless-frontend","title":"abap2UI5/headless-frontend — README","checked":"2026-10-17","quote":"Install with [abapGit](https://abapgit.org)."}]}],"provenance":{"discovered_via":[{"source":"source:github"}],"first_seen":"2026-10-17"},"drafted_with_ai":true,"contributors":["actor:oblomov-dev"]},"effective_normative_relations":[],"readings":{"liveness":[{"label":"Maintenance","tier":"unknown","evidence":"no release data"},{"label":"Continuity","tier":"fair","evidence":"2 contributors, org-owned"},{"label":"Repository","tier":"good","evidence":"pushed 2026-10, not archived"}],"compatibility":[{"label":"Declared for","tier":"good","evidence":"SAP_BASIS 750 and up, in its abaplint config: includes every maintained line to 816"},{"label":"Survived majors","tier":"unknown","evidence":"not read on ABAP: its lines run side by side"},{"label":"Maintainer's CI","tier":"good","evidence":"ABAP_702 green, 2026-10-15"}],"practice":[{"label":"Tests","tier":"poor","evidence":"none found in the tree"},{"label":"Docs","tier":"good","evidence":"README 16 KB"},{"label":"Changelog","tier":"fair","evidence":"none in the repo"}],"reach":[{"value":null,"unit":"installs/week"},{"value":0,"unit":"watching"}]},"signals":{"crawled_at":"2026-10-24","npm":"not published under this name","stars":0,"forks":0,"open_issues":0,"archived":false,"pushed_at":"2026-10-15","license_spdx":"MIT","org_owned":true,"default_branch":"main","created_at":"2026-08-08T13:33:10Z","open_prs":0,"tree_truncated":false,"test_files":0,"workflows":4,"other_ci":false,"readme_bytes":16381,"docs_files":0,"changelog":false,"license_file":true,"dts_files":0,"first_commit":"2026-08-08","last_commit":"2026-10-15","commits":20,"contributors":2,"ci_status":"success","ci_run_at":"2026-10-15","ci_workflow":"ABAP_702","ci_event":"push","readme_path":"README.md","readme_sha":"848dd8095667bb4436a914f9ee7bc37866a8be67","repo_read":"2026-10-24","abap_syntax":{"repo":"abap2UI5/headless-frontend","file":"abaplint.jsonc","url":"https://github.com/abap2UI5/headless-frontend/blob/HEAD/abaplint.jsonc","version":"v750","floor":"750","checked":"2026-10-26"}},"edges":{"maintainers":[{"ref":"actor:abap2ui5","name":"abap2UI5","json":"/actors/abap2ui5.json"}],"contributors":[{"ref":"actor:oblomov-dev","name":"oblomov-dev","json":"/actors/oblomov-dev.json"}],"explained_by":[],"alternative_to_this":[],"needed_by":[{"ref":"artifact:abap2ui5-addons-abap-agent-runtime","name":"abap-agent-runtime","json":"/artifacts/abap2ui5-addons-abap-agent-runtime.json","requirement":"required","role":"frontend simulator"},{"ref":"artifact:abap2ui5-addons-admin-cockpit","name":"admin-cockpit","json":"/artifacts/abap2ui5-addons-admin-cockpit.json","requirement":"conditional","role":"reproduction","condition":"the headless frontend is installed"}],"available_via":[],"parts":[],"add_on_to":{"ref":"artifact:abap2ui5-abap2ui5","name":"abap2UI5","json":"/artifacts/abap2ui5-abap2ui5.json"},"add_ons":[],"answered_through_parts":[]}}