Skip to content

Commit 50be095

Browse files
d3xter666Copilot
andauthored
refactor: Support of referencing legacy middlewares in UI5 CLI middleware configuration (#1367)
JIRA: CPOUI5FOUNDATION-1206 --------- Co-authored-by: Copilot <copilot@github.com>
1 parent fb82fe9 commit 50be095

8 files changed

Lines changed: 283 additions & 632 deletions

File tree

internal/documentation/docs/pages/Server.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,12 @@ Please be aware of the following risks when using the server:
2525

2626
## Standard Middleware
2727

28+
::: info Removed Middleware
29+
The `serveThemes` middleware has been removed in UI5 CLI v5. Theme compilation is now handled by the `buildThemes` build task during the incremental build, which pre-compiles all theme CSS files. The resulting CSS files (including `library.css`, `library-RTL.css`, `library-parameters.json`, and CSS Variables resources) are served via the `serveResources` middleware, providing the same functionality with better performance through build-time compilation and caching.
30+
31+
Custom middleware previously referencing `serveThemes` via `beforeMiddleware` or `afterMiddleware` will continue to work with automatic remapping and a deprecation warning. See the [v5 migration guide](../updates/migrate-v5.md) for details.
32+
:::
33+
2834
All available standard middleware are listed below in the order of their execution.
2935

3036
A project can also add custom middleware to the server by using the [Custom Server Middleware Extensibility](./extensibility/CustomServerMiddleware.md).
@@ -37,7 +43,6 @@ A project can also add custom middleware to the server by using the [Custom Serv
3743
| `discovery` | See chapter [discovery](#discovery) |
3844
| `serveResources` | See chapter [serveResources](#serveresources) |
3945
| `testRunner` | See chapter [testRunner](#testrunner) |
40-
| `serveThemes` | See chapter [serveThemes](#servethemes) |
4146
| `versionInfo` | See chapter [versionInfo](#versioninfo) |
4247
| `nonReadRequests` | See chapter [nonReadRequests](#nonreadrequests) |
4348
| `serveIndex` | See chapter [serveIndex](#serveindex) |
@@ -73,11 +78,6 @@ The following file content transformations are executed:
7378
### testRunner
7479
Serves a static version of the UI5 QUnit TestRunner at `/test-resources/sap/ui/qunit/testrunner.html`.
7580

76-
### serveThemes
77-
Compiles CSS files for themes on-the-fly from the source `*.less` files.
78-
79-
Changes made to these `*.less` files while the server is running will automatically lead to the re-compilation of the relevant CSS files when requested again.
80-
8181
### versionInfo
8282
Generates and serves the version info file `/resources/sap-ui-version.json`, which is required for several framework functionalities.
8383

internal/documentation/docs/updates/migrate-v5.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,27 @@ Delete the custom `test/Test.qunit.html` file from your test directory. This fil
198198
Depending on your project setup, you might need to update additional paths in configuration files or test runners to reflect the new structure.
199199
The test suite is now served under the standard `/test-resources/` path with the component's full namespace (e.g. `/test-resources/sap/ui/demo/todo/testsuite.qunit.html`).
200200

201+
## Removal of Standard Server Middleware
202+
203+
The following middleware has been removed from the [standard middlewares list](../pages/Server.md#standard-middleware):
204+
205+
* `serveThemes` — Theme compilation (LESS to CSS) is now handled by the `buildThemes` build task during the incremental build, rather than on-demand during runtime. The resulting CSS files are served via the `serveResources` middleware. This change improves performance through build-time compilation and caching while maintaining the same functionality.
206+
207+
**Backward Compatibility:**
208+
If your project or any custom middleware references a removed middleware via `beforeMiddleware` or `afterMiddleware`, UI5 CLI will automatically remap the reference to the nearest remaining middleware and log a deprecation warning. Your custom middleware will still be executed in the expected order.
209+
210+
**What Changed:**
211+
- Theme CSS files (`library.css`, `library-RTL.css`, etc.) are now **pre-built** during the incremental build
212+
- Files are served via `serveResources` instead of being compiled on-demand
213+
- The same CSS files are available at the same URLs as before
214+
215+
**Recommended Action:**
216+
Update your `ui5.yaml` configuration to reference an existing middleware instead.
217+
218+
| Removed Middleware | Replacement Behavior | Recommended `afterMiddleware` |
219+
| ------------------ | -------------------- | ----------------------------- |
220+
| `serveThemes` | CSS files pre-built by `buildThemes` task and served via `serveResources` | `testRunner` |
221+
201222
## Learn More
202223

203224
- [Project: Type `component`](../pages/Project#component)

packages/server/lib/middleware/MiddlewareManager.js

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,16 @@ import middlewareRepository from "./middlewareRepository.js";
22
import MiddlewareUtil from "./MiddlewareUtil.js";
33
import {getLogger} from "@ui5/logger";
44
const hasOwn = Function.prototype.call.bind(Object.prototype.hasOwnProperty);
5+
const log = getLogger("server:MiddlewareManager");
6+
7+
/**
8+
* Mapping of removed standard middleware names to their predecessor and successor
9+
* in the original execution order. Used to remap custom middleware references
10+
* to the nearest remaining middleware when a removed middleware is referenced.
11+
*/
12+
const LEGACY_MIDDLEWARE_MAPPING = {
13+
serveThemes: {before: "testRunner", after: "versionInfo"}
14+
};
515

616
/**
717
* @private
@@ -25,7 +35,7 @@ class MiddlewareManager {
2535
sendSAPTargetCSP: false,
2636
serveCSPReports: false
2737
}}) {
28-
if (!graph || !rootProject || !sources || !resources || !resources.all ||
38+
if (!graph || !rootProject || !resources || !resources.all ||
2939
!resources.rootProject || !resources.dependencies) {
3040
throw new Error("[MiddlewareManager]: One or more mandatory parameters not provided");
3141
}
@@ -96,7 +106,8 @@ class MiddlewareManager {
96106
}
97107

98108
if (beforeMiddleware || afterMiddleware) {
99-
const refMiddlewareName = beforeMiddleware || afterMiddleware;
109+
let refMiddlewareName = beforeMiddleware || afterMiddleware;
110+
const originalRefMiddlewareName = refMiddlewareName; // Store original before any remapping
100111
let refMiddlewareIdx = this.middlewareExecutionOrder.indexOf(refMiddlewareName);
101112

102113
if (refMiddlewareName === "connectUi5Proxy") {
@@ -106,9 +117,34 @@ class MiddlewareManager {
106117
`has been removed in this version of UI5 CLI and can't be referenced anymore. ` +
107118
`Please see the migration guide at https://ui5.github.io/cli/updates/migrate-v3/`);
108119
}
120+
121+
// Handle legacy middleware with graceful fallback
122+
const legacyMapping = LEGACY_MIDDLEWARE_MAPPING[refMiddlewareName];
123+
if (legacyMapping) {
124+
// Replace with the appropriate fallback based on reference type
125+
refMiddlewareName = afterMiddleware ? legacyMapping.before : legacyMapping.after;
126+
127+
log.warn(
128+
`Standard middleware "${originalRefMiddlewareName}" has been removed. ` +
129+
`Custom middleware "${middlewareName}" defined in project ` +
130+
`"${this.middlewareUtil.getProject()}" references it and ` +
131+
`is now placed ${afterMiddleware ? "after" : "before"} ` +
132+
`"${refMiddlewareName}" instead. ` +
133+
`For details, see the migration guide at ` +
134+
`https://ui5.github.io/cli/next/updates/migrate-v5`);
135+
}
136+
137+
refMiddlewareIdx = this.middlewareExecutionOrder.indexOf(refMiddlewareName);
138+
109139
if (refMiddlewareIdx === -1) {
110-
throw new Error(`Could not find middleware ${refMiddlewareName}, referenced by custom ` +
111-
`middleware ${middlewareName}`);
140+
// Provide clear error message, including remapping context if applicable
141+
const errorMsg = legacyMapping ?
142+
`Could not find fallback middleware "${refMiddlewareName}" ` +
143+
`(mapped from removed middleware "${originalRefMiddlewareName}"), ` +
144+
`referenced by custom middleware "${middlewareName}"` :
145+
`Could not find middleware ${refMiddlewareName}, referenced by custom ` +
146+
`middleware ${middlewareName}`;
147+
throw new Error(errorMsg);
112148
}
113149
if (afterMiddleware) {
114150
// Insert after index of referenced middleware
@@ -220,8 +256,6 @@ class MiddlewareManager {
220256
});
221257
await this.addMiddleware("serveResources");
222258
await this.addMiddleware("testRunner");
223-
// TODO: Allow to still reference 'serveThemes' middleware in custom middleware
224-
// await this.addMiddleware("serveThemes");
225259
await this.addMiddleware("versionInfo", {
226260
mountPath: "/resources/sap-ui-version.json"
227261
});

packages/server/lib/middleware/middlewareRepository.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ const middlewareInfos = {
66
serveIndex: {path: "./serveIndex.js"},
77
discovery: {path: "./discovery.js"},
88
versionInfo: {path: "./versionInfo.js"},
9-
serveThemes: {path: "./serveThemes.js"},
109
testRunner: {path: "./testRunner.js"},
1110
nonReadRequests: {path: "./nonReadRequests.js"}
1211
};

packages/server/lib/middleware/serveThemes.js

Lines changed: 0 additions & 123 deletions
This file was deleted.

0 commit comments

Comments
 (0)