diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2d5fa9f..d4722ec 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -88,7 +88,7 @@ jobs: uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: repository: abap2UI5/abap2UI5 - ref: 5d7e91f904bf37b282e8e1c0ecb2b3eeae4c5842 # main; app/webapp as at b812079 + ref: 1bbb9d47e9dce37015f2aa15f405689465f5b909 # main; carries the box-details fix (72c86cc) path: deps/abap2UI5 sparse-checkout: app/webapp persist-credentials: false diff --git a/CHANGELOG.md b/CHANGELOG.md index 322c245..41e2fd0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,11 @@ ## Unreleased +- **The UI5 SPA is conformant (ui5 profile).** CI's frontend job pins + abap2UI5 main `1bbb9d4`, which carries the fix of `portable.box-details` + (abap2UI5 `72c86cc`); `test/frontend.test.mjs` no longer accepts that + deviation, so a frontend that loses the fix fails the test. 77 pass, + 0 fail, 4 skip (RESULTS.md). - **Adaptive Cards: app text is never Markdown.** A `TextBlock` or `Fact` whose text has Markdown syntax is a `RichTextBlock` `TextRun` now: a model value or toast like `[verify your account](https://evil.example)` diff --git a/conformance/RESULTS.md b/conformance/RESULTS.md index e49f641..a828bd7 100644 --- a/conformance/RESULTS.md +++ b/conformance/RESULTS.md @@ -126,7 +126,7 @@ perform. | Frontend | Version | Profile | Pass | Fail | Warn | Skip | Verdict | |---|---|---|---:|---:|---:|---:|---| -| UI5 SPA (`ui5`) | abap2UI5 1.146.0 `b812079` `app/webapp` (identical at main `5d7e91f`, which CI pins), OpenUI5 1.144.0 (npm), Chromium 141 | ui5 | 76 | 1 | 0 | 4 | one MUST deviation: `portable.box-details` | +| UI5 SPA (`ui5`) | abap2UI5 main `1bbb9d4` `app/webapp` (which CI pins), OpenUI5 1.153.0 (npm), Chromium 141 | ui5 | 77 | 0 | 0 | 4 | conformant (ui5) - `portable.box-details` fixed in abap2UI5 `72c86cc` | | agent client (`agent`) | abap2UI5/mcp-server `lib/appclient.mjs` @ `a4d9f07` (main, PR #44; vendored) | semantic | 61 | 0 | 0 | 20 | conformant (semantic) - the five MUST deviations of `ea4e9fa` fixed | | Adaptive Cards renderer (`adaptive-cards`) | [`renderers/adaptive-cards/`](../renderers/adaptive-cards/README.md) of this repository (prototype), Adaptive Cards 1.5 | portable | 66 | 0 | 0 | 15 | every check it can be driven through holds | | terminal renderer (`terminal`) | [`renderers/terminal/`](../renderers/terminal/README.md) of this repository, driven with keys through its state machine | portable | 72 | 0 | 0 | 9 | every check it can be driven through holds, the router checks included | @@ -135,17 +135,18 @@ perform. The UI5 SPA run is stable (two consecutive runs, identical results) and takes about two minutes; `test/frontend.test.mjs` pins the UI5, the agent, -the Adaptive Cards and the terminal result check by check. The UI5 pin accepts -`portable.box-details` passing: the fix of the UI5 frontend is under way -(open question 7, decided: expanded), and a local run against an abap2UI5 -checkout that carries it (2026-10-03, abap2UI5 `ed8115b` on top of `833b5b8` "Show message box -details on UI5 1.120 and later", on its working branch, not on main yet) -passed it - every MUST held, 77 pass, 4 skip. +the Adaptive Cards and the terminal result check by check. Until 2026-10-10 +CI pinned abap2UI5 `5d7e91f` (`app/webapp` as at `b812079`, 1.146.0), where +the UI5 SPA failed `portable.box-details` (finding 1 below; 76 pass, 1 fail, +4 skip, with OpenUI5 1.144.0 and 1.153.0 alike). abap2UI5 fixed it on main in +`72c86cc` (open question 7, decided: expanded); CI pins a main that carries +the fix, and the pin is gone - every MUST holds, 77 pass, 4 skip. ### Findings - the UI5 SPA 1. **Message box details are not shown on OpenUI5 >= 1.120** - - `portable.box-details`, MUST; *the frontend is wrong.* A + `portable.box-details`, MUST; *the frontend is wrong* (fixed in abap2UI5 + `72c86cc`, after 1.146.0). A `MESSAGE_BOX` with `details` shows the text and an empty details area. Evidence (OpenUI5 1.144.0): the box's VBox holds `Text` (visible), `Link "View Details"` (hidden), `MessageStrip "Details could not be diff --git a/package-lock.json b/package-lock.json index 5011a6a..73e76ce 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,12 +14,12 @@ }, "devDependencies": { "@abap2ui5/node-runtime": "1.146.0", - "@abaplint/cli": "2.120.60", + "@abaplint/cli": "2.120.73", "@abaplint/transpiler-cli": "2.13.93", - "@openui5/sap.m": "1.144.0", + "@openui5/sap.m": "1.153.0", "ajv": "8.20.0", - "express": "5.2.1", - "playwright-core": "1.56.1" + "express": "5.3.0", + "playwright-core": "1.64.0" }, "engines": { "node": ">=22" @@ -51,9 +51,9 @@ } }, "node_modules/@abaplint/cli": { - "version": "2.120.60", - "resolved": "https://registry.npmjs.org/@abaplint/cli/-/cli-2.120.60.tgz", - "integrity": "sha512-GohYyKD6BTIiGuFQGCYgiDTt/1Uw39E4OtwXNiDSt/U+9mrT4Cfy3tvqfe3cHJPStrYjourHm9GW99arVtvDDw==", + "version": "2.120.73", + "resolved": "https://registry.npmjs.org/@abaplint/cli/-/cli-2.120.73.tgz", + "integrity": "sha512-/CxPAfc3noOvPiJX+GB99st8aN/TB5KmMVfrFDrPKrMuIlzRTv1+Yxs0QIgTj8taUNTZGdyBPriR3mHATZmlpQ==", "dev": true, "license": "MIT", "bin": { @@ -103,42 +103,42 @@ } }, "node_modules/@openui5/sap.m": { - "version": "1.144.0", - "resolved": "https://registry.npmjs.org/@openui5/sap.m/-/sap.m-1.144.0.tgz", - "integrity": "sha512-R1HwWJhM5k4TDttYA8wZqcPoZyNp8OiOgWvvAQH8/xzHnkP8m1Cam29V2HOHQ+Wa62R5tQpgBnKPwYSlIsfcbA==", + "version": "1.153.0", + "resolved": "https://registry.npmjs.org/@openui5/sap.m/-/sap.m-1.153.0.tgz", + "integrity": "sha512-afDAICMYaBBTGyjakB4tbWNSFW+4b6uyJubmUzoQIeZl0LqpH6Pf73XEUxz4NBCiNd8QSNiR7En7n3l5vvkD3w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@openui5/sap.ui.core": "1.144.0", - "@openui5/sap.ui.layout": "1.144.0", - "@openui5/sap.ui.unified": "1.144.0" + "@openui5/sap.ui.core": "1.153.0", + "@openui5/sap.ui.layout": "1.153.0", + "@openui5/sap.ui.unified": "1.153.0" } }, "node_modules/@openui5/sap.ui.core": { - "version": "1.144.0", - "resolved": "https://registry.npmjs.org/@openui5/sap.ui.core/-/sap.ui.core-1.144.0.tgz", - "integrity": "sha512-oiDNKuhvc4oL1wyd5ZZbnF3YzHBVeGkIIznBqXdemS3xzmb2a/hHqhuhlrEDD3PxBKctB9uXxUaZbD9paT8zOg==", + "version": "1.153.0", + "resolved": "https://registry.npmjs.org/@openui5/sap.ui.core/-/sap.ui.core-1.153.0.tgz", + "integrity": "sha512-kJQLIqfDCURHSNpUTJBgDEVCuH31FmXyc8xDvV/JwATQgyJGKMp3t1KIeUyLaOfSh5ux+iA7vHznSPZ0DVsNsA==", "dev": true, "license": "Apache-2.0" }, "node_modules/@openui5/sap.ui.layout": { - "version": "1.144.0", - "resolved": "https://registry.npmjs.org/@openui5/sap.ui.layout/-/sap.ui.layout-1.144.0.tgz", - "integrity": "sha512-KPtYvKadj58yHnN/Jdjb8eMrrwC0ogAqsuqTVtrORricLnmhIW45VaMUBITtpBthtK7e8x9L8Z1uJh6D0JDpGQ==", + "version": "1.153.0", + "resolved": "https://registry.npmjs.org/@openui5/sap.ui.layout/-/sap.ui.layout-1.153.0.tgz", + "integrity": "sha512-u4nVCwbl3Xq8EGShHyUqMj/Th9B6k7Vl50kNfz+YCsEnbnk0J3zZrzuHthCB2tyu8Y2RGVaMaNqMr0h/V6qN2w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@openui5/sap.ui.core": "1.144.0" + "@openui5/sap.ui.core": "1.153.0" } }, "node_modules/@openui5/sap.ui.unified": { - "version": "1.144.0", - "resolved": "https://registry.npmjs.org/@openui5/sap.ui.unified/-/sap.ui.unified-1.144.0.tgz", - "integrity": "sha512-oeu3j8uypHf9gL8aPdHZlGI5BpQ98BG59bY/1u3S49IOb+fvJmVfOgwvwkjwUHuaJz9D41p0n520FgZEuliQpg==", + "version": "1.153.0", + "resolved": "https://registry.npmjs.org/@openui5/sap.ui.unified/-/sap.ui.unified-1.153.0.tgz", + "integrity": "sha512-m0J4zy2m7IdbTYH7U3Ce1HQ3IC0SonP2Pq6V5K1cw5m3Rur8Jc9VU7RioGHbLA1TJJYrJmhiGw3Ad9KiBROvKw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@openui5/sap.ui.core": "1.144.0" + "@openui5/sap.ui.core": "1.153.0" } }, "node_modules/accepts": { @@ -197,20 +197,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/body-parser/node_modules/content-type": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz", - "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -253,9 +239,9 @@ } }, "node_modules/content-disposition": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz", - "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-2.0.1.tgz", + "integrity": "sha512-e+H0ZXHSWYrENhQzw1LPuP4oF5MzVKmDU6d3hxlvaPEYLLg62MxtQNPRx4SYSuYJSBUgnQIG4HIN2tEtNv7Dog==", "dev": true, "license": "MIT", "engines": { @@ -267,13 +253,17 @@ } }, "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz", + "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/cookie": { @@ -407,16 +397,16 @@ } }, "node_modules/express": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", - "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.3.0.tgz", + "integrity": "sha512-qCqy1xSoaugxOD4IVHb1ZWdkvCF2W3aE2okKouWj8VwJ+ztskSiXoBnCSJqfKT+cVPJhuJqe9YLbY425+Zh00g==", "dev": true, "license": "MIT", "dependencies": { "accepts": "^2.0.0", - "body-parser": "^2.2.1", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", + "body-parser": "^2.3.0", + "content-disposition": "^2.0.1", + "content-type": "^2.0.0", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", @@ -432,14 +422,14 @@ "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", + "proxy-addr": "^2.0.8", + "qs": "^6.16.0", "range-parser": "^1.2.1", "router": "^2.2.0", "send": "^1.1.0", "serve-static": "^2.2.0", "statuses": "^2.0.1", - "type-is": "^2.0.1", + "type-is": "^2.1.0", "vary": "^1.1.2" }, "engines": { @@ -761,20 +751,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/negotiator/node_modules/content-type": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz", - "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", @@ -833,16 +809,16 @@ } }, "node_modules/playwright-core": { - "version": "1.56.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.56.1.tgz", - "integrity": "sha512-hutraynyn31F+Bifme+Ps9Vq59hKuUCz7H1kDOcBs+2oGguKkWTU50bBWrtz34OUWmIwpBTWDxaRPXrIXkgvmQ==", + "version": "1.64.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.64.0.tgz", + "integrity": "sha512-T9r+MZkTECl2+oUcZ26YgZzTrYidTsIhYYkJix+6iDOymOb1FB2RLLSOxRGnZGv5DStt+aduIVbt+E8WygXYpg==", "dev": true, "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" }, "engines": { - "node": ">=18" + "node": ">=20" } }, "node_modules/proxy-addr": { @@ -1145,20 +1121,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/type-is/node_modules/content-type": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz", - "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", diff --git a/package.json b/package.json index 7270259..70e8d0b 100644 --- a/package.json +++ b/package.json @@ -72,11 +72,11 @@ ], "devDependencies": { "@abap2ui5/node-runtime": "1.146.0", - "@abaplint/cli": "2.120.60", + "@abaplint/cli": "2.120.73", "@abaplint/transpiler-cli": "2.13.93", - "@openui5/sap.m": "1.144.0", + "@openui5/sap.m": "1.153.0", "ajv": "8.20.0", - "express": "5.2.1", - "playwright-core": "1.56.1" + "express": "5.3.0", + "playwright-core": "1.64.0" } } diff --git a/spec/open-questions.md b/spec/open-questions.md index f710d50..2508fc4 100644 --- a/spec/open-questions.md +++ b/spec/open-questions.md @@ -214,8 +214,9 @@ structure *is* the message; behind a link it is easily never seen. fills the details text only when its "View Details" link is pressed - 1.120 does, 1.71 set it at creation) the UI5 frontend shows **no** details at all: `expandBoxDetails` makes the still-empty `FormattedText` visible and -hides the link that would have filled it. The UI5 frontend is being fixed -(abap2UI5 `app/webapp/core/actions/ControlCall.js`); filed in +hides the link that would have filled it. Fixed on abap2UI5's main in +`72c86cc` (`app/webapp/core/actions/ControlCall.js`, after 1.146.0), which +CI's frontend job runs; filed in [../conformance/RESULTS.md](../conformance/RESULTS.md#frontend-suite). **Alternatives considered.** diff --git a/test/frontend.test.mjs b/test/frontend.test.mjs index e5999c8..693f5c4 100644 --- a/test/frontend.test.mjs +++ b/test/frontend.test.mjs @@ -220,11 +220,11 @@ test("the terminal renderer: every portable-profile check it can be driven throu }); const skipBrowser = process.env.PROTOCOL_SKIP_BROWSER ? "PROTOCOL_SKIP_BROWSER is set" : false; -// The UI5 SPA's one deviation (RESULTS.md): message box details stay empty on -// OpenUI5 >= 1.120. The fix is under way in abap2UI5 (open question 7, decided -// in revision 0.3: expanded), so a checkout that carries it passes the check - -// the pin accepts both; every other failure fails the test. -const UI5_KNOWN_FAILS = ["portable.box-details"]; +// The UI5 SPA's known deviations (RESULTS.md) - none since CI's abap2UI5 +// commit carries the fix of portable.box-details (abap2UI5 72c86cc: message +// box details on OpenUI5 >= 1.120). A deviation found later goes here with +// the place of its fix; every other failure fails the test. +const UI5_KNOWN_FAILS = []; test("the UI5 SPA in Chromium: every MUST but the recorded deviation holds", { skip: skipBrowser, timeout: 900_000 }, async (t) => { if (!locateWebapp()) {