ui5-tooling-modules
A set of UI5 tooling extensions that load and convert plain npm packages into UI5 AMD-like modules, so the UI5 module loader can consume them.
UI5 tooling extensions to load and convert node modules as UI5 AMD-like modules
Facts
Where it sits
Who is behind it
In the atlas: maintains 69@ui5-communitymaintainerAdrian BobevContributes to this
In the atlas: contributes to 10@adrian-bobevAttila BorosContributes to this
In the atlas: contributes to 6@attila-borosBenjamin ReimContributes to this
In the atlas: contributes to 9@BenReimChristian GeorgiContributes to this
In the atlas: maintains 1, contributes to 53@chgeoFrank WeigelContributes to this
In the atlas: contributes to 10@codeworriorDavid SooterContributes to this
In the atlas: contributes to 9@d-sooterYavor IvanovContributes to this
In the atlas: contributes to 17@d3xter666Austin DevineContributes to this
In the atlas: maintains 7, contributes to 25@devineaDimitar FenerskiContributes to this
In the atlas: contributes to 23@dfenerskiDominik FeiningerContributes to this
In the atlas: contributes to 11@dominikfeininger58 contributors
What it declares
Every artifact
- Type
- Build tool
- Origin
- By a community org
- Runtime
- Node.js
As a build tool
- Distributed through
- npm
Connections
Serving an app locally and building it for deployment
UI5 custom control wrapping Chart.js for line charts
Download
Install
npm add ui5-tooling-modulesDerived from the package name. No recipe recorded; the README has the configuration.
Learn more
- How to Use NPM Modules Like crypto-js in SAPUI5 Using UI5 Tooling ModulesHow to Use NPM Modules Like crypto-js in SAPUI5 Using UI5 Tooling ModulesWalks through adding ui5-tooling-modules to a SAPUI5 project on UI5 Tooling v3: installing the npm package crypto-js alongside it, then wiring a ui5-tooling-modules-task builder task and a ui5-tooling-modules-middleware dev-server middleware into ui5.yaml so the UI5 module loader can resolve it. A controller then loads crypto-js/sha256 through sap.ui.define and calls it like any other AMD dependency, with the stated limit that the pattern works only inside a controller or other AMD-style module, not through a top-level import or require().DakshKumarSingh, published 2025-09-04DakshKumarSingh, SAP Community
README
quoted from ui5-community/ui5-ecosystem-showcase under Apache-2.0, readUI5 CLI Extensions for NPM Package Consumption
👋 This is an open‑source, community‑driven project, developed and actively monitored by members of the UI5 community. You are welcome to use it, report issues, contribute enhancements, and support others in the community.
The UI5 CLI extensions include a custom middleware and a custom task which allow to use NPM package names for AMD-like dependencies, e.g.:
# Install a dev dependency to Chart.js (https://www.chartjs.org/)
npm install chart.js
// use Chart.js as a AMD-like dependency
sap.ui.define([
"chart.js"
], function(chartjs) {
[...]
alert(chartjs.version);
[...]
})
Once the UI5 application is finally built, the Chart.js dependency will be copied into the dist/resources folder with the proper namespace. In case of Chart.js above, there is no namespace and thus the location will be dist/resources/chart.js.js.
Prerequisites
- Requires at least
@ui5/cli@3.0.0(to supportspecVersion: "3.0")
⚠️ UI5 CLI Compatibility All releases of this UI5 CLI extension using the major version
3require UI5 CLI V3. Any previous releases below major version3(if available) also support older versions of the UI5 CLI. But the usage of the latest UI5 CLI is strongly recommended!
Install
npm install ui5-tooling-modules --save-dev
If you want the ui5-tooling-modules to add it's configuration to the UI5 YAML files, just add the command line argument -rte or --register-tooling-extension:
# Register in default file (ui5.yaml if it exists)
npm install ui5-tooling-modules --save-dev -rte
# Register in specific YAML files
npm install ui5-tooling-modules --save-dev -rte ui5.yaml,ui5-workspace.yaml
# Register in custom YAML files
npm install ui5-tooling-modules --save-dev -rte my-ui5.yaml,custom-workspace.yaml
When using -rte without specifying files, the extension will automatically register itself in ui5.yaml if it exists in the project directory.
When specifying file names (comma-separated), the extension will only register in those specific files.
Configuration options (in $yourapp/ui5.yaml)
The following configuration options are relevant for the task and the middleware:
-
debug:
boolean|stringEnables debug logging (defaults tofalse), by setting value to"verbose"the extension will log even more detailed -
skipCache:
booleanFor development scenarios, the module cache can be disabled by setting this option to true. Normally the cache is invalidated automatically whenever any of the following change: theui5-tooling-modulesversion itself, any of its source files, the resolved configuration (e.g.minify,inject,pluginOptions), the project'spackage.json/lockfile, or any file in the bundle's transitive module graph. This option just forces the regeneration always (defaults tofalse) -
persistentCache:
booleanexperimental feature With this option, the bundle information will be persistent and will be available again after the restart of the development server or for the next execution of your build task. The bundle information is stored in the working directory in the folder.ui5-tooling-modulesfolder. It's recommended to put this folder into.gitignore. On load, persisted entries are validated against the recorded transitive module graph (path + size + mtime) so a fresh checkout or CI run cannot silently reuse a stale bundle. (defaults tofalse) -
keepDynamicImports:
boolean|String[]experimental feature An arrays of NPM package names for which the dynamic imports with a generic target module (e.g.import(anyUrl)) will not be converted into arequirebased polyfill. If the value is a boolean, it activates/deactivates the feature for all modules (by default it is active!). This experimental feature is useful in scenarios loading ES modules dynamically from generic URLs. All dynamic imports resolving a concrete module (e.g.import("jspdf")) will be converted into chunks and loaded with arequirecall. -
skipTransform:
boolean|String[]experimental feature Array of glob patterns to verify whether the module transformation should be skipped for the modules which are matching the glob pattern. If the value is abooleanthen the transformation can be skipped in general by setting the value totrue. The configuration can be incorporated from thecustomConfigurationof a dependency using that middleware, e.g. a library can provide itscustomConfigurationfor the application project like this (and can reuse the configuration internally via YAML anchors):specVersion: "3.0" metadata: name: com.myorg.mylib type: library customConfiguration: ui5-tooling-modules: &cfgModules skipTransform: - "@luigi-project/container/dist/anypath/**" builder: customTasks: - name: ui5-tooling-modules-task afterTask: replaceVersion configuration: <<: *cfgModules -
inject:
Map<String, String|String[]>experimental feature A map of Globals which are injected as imports to an NPM package to handle cases in which functions need to be poly- or ponyfilled. The configuration is aligned with definition of the Globals in the @rollup/plugin-inject:configuration: inject: # import setImmediate from 'set-immediate-shim' setImmediate: set-immediate-shim # import { Promise } from 'es6-promise' Promise: - es6-promise - Promise # import { Promise as P } from 'es6-promise' P: - es6-promise - Promise # import $ from 'jquery' $: jquery # import * as fs from 'fs' fs: - 'fs' - '*' -
legacyDependencyResolution:
booleanRe-enables the legacy dependency resolution of the UI5 CLI extension which allows to use entry points fromdevDependenciesof the project. By default, only thedependenciesmaintained in the projects'package.jsonand the transitive dependencies are considered for the entry points and all other entry points are ignored. (available since new minor version3.7.0which introduces a new dependency resolution fordependenciesonly) -
additionalDependencies:
string[]List of additional dependency names to include into the bundling. By default all dependencies and their transitive dependencies are considered. In some cases it is useful to also include devDependencies, e.g. when re-packaging a thirdparty package. If you want to exclude this dependency from being a transitive dependency then you can put it into the devDependencies and list it in this configuration option (but keep in mind that this may exclude the dependency from some check tools!) -
entryPoints:
string[]experimental feature List of entry point modules to include into the bundling. By default the entry point modules are discovered from the sources (*.ts,*.tsx,*.js,*.jsx,*.xml) -
minify:
booleanexperimental feature Flag to indicate that the generated code should be minified (in case of excluding thirdparty resources from minification in general, this option can be used to minify just the generated code) -
sourcemap:
booleanexperimental feature Flag to indicate that the sourcemap generation should be enabled. By default the option is diabled. Possible values aretrue,false,"inline", andhidden.
The following configuration options are relevant for the task and the middleware which allow you to directly configure rollup plugins which is used as follows:
configuration:
pluginOptions: # map of plugin options
webcomponents: # the name of the rollup plugin
skip: true # configuration
The available plugin configuration options are:
-
pluginOptions.webcomponents.skip:
booleanFlag to skip the transformation of Web Components to UI5 Controls a.k.a. Seamless Web Components support. This allows to directly require the Web Components modules from NPM packages and use them as UI5 Controls. The NPM packages providing Web Components must include a Custom Elements Manifest declared in thecustomElementsfield in thepackage.json. (defaults tofalse) -
pluginOptions.webcomponents.force:
booleanFlag to force the transformation of Web Components to UI5 Controls a.k.a. Seamless Web Components support. In some cases, in which the framework version cannot be part of theui5.yaml, you can force the transformation. (defaults totrue) -
pluginOptions.webcomponents.scoping:
booleanFlag to disable the Custom Elements Scoping of UI5 Web Components. This allows to load multiple versions of UI5 Web Components into a single application without conflicts. This feature is enabled by default and can be disabled if needed. (defaults totrue) -
pluginOptions.webcomponents.namespace:
boolean|stringDefines the relative namespace for the Web Components modules (defaults to"gen"). If disabled, using the boolean valuefalse, the Web Components modules are put into the namespace specified byaddToNamespace. This is also relevant due to the JSDoc generation to allow a proper exclusion of the nested 3rd party namespace which could cause issues during the JSDoc build. The Web Components modules in thegennamespace are safe to be processed by the JSDoc generator to enable the generation of the API docu for the Web Components modules. -
pluginOptions.webcomponents.enrichBusyIndicator:
booleanexperimental flag Flag to include the BusyIndicator support from into the generated Web Components package module. (defaults tofalse) -
pluginOptions.webcomponents.includeAssets:
booleanexperimental flag Flag to include all assets into the thirdparty folder: such as all themes and languages. Although they will be lazily loaded the generation process will slow down and you will have many additional files. All dynamic imports will reside inside the_dynamicsfolder within the thirdparty folder. (defaults tofalse) -
pluginOptions.webcomponents.skipJSDoc:
booleanexperimental flag Flag to enable/disable the generation of the JSDoc for the UI5 control wrappers. (defaults totrueuntil the feature is fully implemented, in futurefalse) -
pluginOptions.webcomponents.skipDtsGeneration:
booleanexperimental flag Flag to enable/disable the generation of the *.d.ts files for the UI5 control wrappers, enabling basic TypeScript support. (defaults totrueuntil the feature is fully implemented, in futurefalse)
The following configuration options are just relevant for the task:
-
prependPathMappings:
booleanPrepends the path mappings for the UI5 loader to theComponent.jswhich allows to run the Component using 3rd party modules in e.g. Fiori launchpad environments (defaults tofalse) -
addToNamespace:
boolean|stringPuts 3rd party modules into the namespace of the Component to make them Component-local. All used 3rd party modules will be moved by default into the sub-namespacethirdpartyof the Component namespace at build time. If you use a string as value ofaddToNamespaceyou can define a custom namespace, e.g.my/namespace/for/libswhich will be nested in the Components' namespace. With that option you can run your application using 3rd party modules in a Fiori launchpad environment. In some cases (wrong dependency rewrite, wish to keep 3rd party modules in theresourcespath, ...) it might be necessary to disable this option. (defaults totrue, disables prependPathMappings when set totrue)⚠️ While this works great for any non-UI5 3rd party module, there are limitations for the consumption of UI5 modules from custom control 3rd party modules (NPM packages). The UI5 module names (used for
Object.extend(...), aggregation types, ...) are not rewritten and this may cause issues. UI5 assumes that the used module path (slash syntax) is matching the module name (dot syntax). This can lead to issues forObject.isA(...)checks, Renderer lookups (when not inlined or referenced by module), or for any other API which derives the module name from the module path or vice versa. If you encounter such issues you may consider to disable the option and instruct the loader viasap.ui.loader.config({ paths: ... })to load the resources properly. -
removeScopePrefix:
booleanRemoves the scope prefix@from the namespace/path of the 3rd party module when adding it to the namespace with the addToNamespace option. For Web Components packages, the same transformation is also applied to the generated UI5 qualified names (e.g.Object.extend("...")calls) so module paths and class names stay consistent. The aliasremoveScopePrecederis deprecated but still accepted. -
replaceDashes:
booleanReplaces dashes (-) with underscores (_) in the namespace/path of the 3rd party module when adding it to the namespace with the addToNamespace option. For Web Components packages, the same transformation is also applied to the generated UI5 qualified names so module paths and class names stay consistent (e.g. a package namedwebc-packageproduceswebc_package.MyControlinstead ofwebc-package.MyControl). Can be used standalone or is implied whensanitizeNpmPackageNameis set. -
sanitizeNpmPackageName:
booleanMaster flag that enables bothremoveScopePrefixandreplaceDashesat once: removes the leading@scope prefix and converts all-characters to_in module paths and generated UI5 qualified names. This is necessary to support JSDoc generation for Web Components properly. -
providedDependencies:
String[]An array of NPM package names which will be available in the development server via the middleware but will be ignored for the build process via the task. Provided dependencies are considered as being provided by the application runtime rather than it must be shipped with the current project. Provided dependencies will ignore any of the configurations above. -
includeAssets:
Map<String, String[]>experimental feature A map of NPM package names to list of glob patterns which defines the assets to be included. The list of glob patterns can be omitted in case of copying all resources of the NPM package.
The following configuration options are just relevant for the middleware:
-
useRelativeModulePaths:
booleanexperimental flag Usually, the middleware converts the module paths to absolute modules paths relative to theapplicationproject. In some special cases, in which the application doesn't register its namespace in the start page, it is better to use relative module paths for the local development (e.g. the UI5 testsuite application serving many test pages for different controls). Forlibraryprojects this option is always turned on as for library projects they are not served in the root context of the server, they are also served via theresources+ namespace URL. -
watch:
boolean|String[]experimental flag For development scenarios, the server is listening to changes of the source files of the project and its dependencies and triggers the generation of the bundle if the used NPM packages have been changed (defaults totrue) - additionally, you can pass a list of folders or files to watch for changes for special cases
Usage
- Define the dependency in
$yourapp/package.json:
"devDependencies": {
// ...
"ui5-tooling-modules": "*"
// ...
}
- Configure it in
$yourapp/ui5.yaml:
The configuration for the custom task:
builder:
customTasks:
- name: ui5-tooling-modules-task
afterTask: replaceVersion
The configuration for the custom middleware:
server:
customMiddleware:
- name: ui5-tooling-modules-middleware
afterMiddleware: compression
⚠️ In case your application is using a proxy such
fiori-tools-proxy, the proxy must run afterui5-tooling-modules-middlewaremiddleware. Otherwise proxy will try to serve the resources for your installed npm package instead ofui5-tooling-modules-middleware. You can achieve this by settingafterMiddleware: ui5-tooling-modules-middlewareinfiori-tools-proxymiddleware.
🔥 TIP 🔥
YAML anchors are a great feature to avoid redundancies in .yaml files. You can share the configuration of the task and the middleware in the following way:
ui5.yaml
customConfiguration:
ui5-tooling-modules: &cfgModules
debug: true
keepDynamicImports:
- "@luigi-project/container"
[...]
server:
customMiddleware:
- name: ui5-tooling-modules-middleware
afterMiddleware: compression
configuration:
<<: *cfgModules
[...]
builder:
customTasks:
- name: ui5-tooling-modules-task
afterTask: replaceVersion
configuration:
<<: *cfgModules
addToNamespace: true
With this approach you can ensure that you have a consistent configuration across your task and middleware.
How it works
The custom middleware is listening to incoming requests and checks those requests to match npm packages. E.g. a dependency to chart.js will cause a request to resource/chart.js.js. The middleware now derives the module name which is "chart.js" and uses require.resolve("chart.js") to lookup the npm package for it. If an npm package exists, the middleware is using rollup to create a custom AMD bundle for the npm package which uses sap.ui.define instead of define.
The custom task is scanning all AMD dependencies of all modules and tries to resolve the module names. If a module has been found a custom bundle will be created in the proper namespace of the module, e.g. @apollo/client/core will create a custom bundle at dist/resources/@apollo/client/core.js.
Web Components support
Besides plain NPM packages, the ui5-tooling-modules also has dedicated support for Web Components a.k.a. Seamless Web Components support. A package is recognized as a Web Components package when it ships a Custom Elements Manifest — either referenced via the customElements field in its package.json, or found at the conventional dist/custom-elements.json (or dist/custom-elements-internal.json) location. Based on that manifest, the tooling generates the glue code so the Web Components can be consumed like regular UI5 controls.
There are three different cases which are handled automatically depending on the nature of the package and its components:
1. UI5 Web Components
Packages whose components extend UI5Element from @ui5/webcomponents-base (detected because the package is @ui5/webcomponents-base or lists it in its dependencies), e.g. @ui5/webcomponents. For these, the tooling runs the full pipeline:
- a package module is generated (in the
gennamespace by default, seepluginOptions.webcomponents.namespace) which registers the library, applies the Custom Elements Scoping, and pulls in the base package - a UI5 control wrapper is generated per custom element so it can be used like a native UI5 control (incl. properties, aggregations, events, and — when enabled — JSDoc and
*.d.tsfiles) - the base package (
@ui5/webcomponents-base) is imported ahead of the component so scoping and shared features are initialized before any component is defined
2. Non-UI5 Web Components (with a package)
Packages that ship a Custom Elements Manifest but whose components do not extend UI5Element, e.g. @luigi-project/container. UI5 control wrappers are still generated for every custom element so they can be used as UI5 controls, but the UI5-specific package-chunk emission, scoping, and base-package import are skipped — those components neither need nor understand the @ui5/webcomponents-base runtime. Importing the package (e.g. @luigi-project/container) exposes the generated wrapper classes, and importing an individual component module (e.g. @luigi-project/container/LuigiContainer) resolves through its UI5 wrapper.
3. Native Web Components (load the component itself, no package)
This is the case where a Web Component module is imported directly and there is no package glue to load — the module simply is the Web Component and it only needs to register itself. This covers custom elements that do not extend UI5Element and that are imported as standalone modules rather than through their package entry point.
For such native Web Components the tooling neither prepends an import of the package nor of @ui5/webcomponents-base — the generated entry point loads only the Web Component module itself. Since the component does not rely on scoping or any other feature provided by a UI5 Web Components package, there is nothing else to bundle: the component defines its own custom element (customElements.define(...)) when its module is evaluated. A sap.ui.define re-export stub is still emitted for the imported module so that a direct import (e.g. an application importing a single component module from a Web Components package) resolves through the generated UI5 wrapper.
💡 All three cases are detected automatically from the package metadata and the component's superclass chain — no additional configuration is required. Use the
pluginOptions.webcomponents.*options (see above) to fine-tune the behavior (e.g.skip,scoping,namespace,includeAssets), andpluginOptions.webcomponents.force: trueto enable the transformation when the framework version cannot be derived from theui5.yaml.
How to obtain support
Please use the GitHub bug tracking system to post questions, bug reports or to create pull requests.
Contributing
Any type of contribution (code contributions, pull requests, issues) to this showcase will be equally appreciated.
License
This work is licensed under Apache 2.0.
Built with care (and a lot of caffeine). If this helped you build, test, or ship, the next coffee — or drink — is on you when you bump into a contributor.
History
Fixes 1
Notes
Patch Changes
-
#1473
e0a104dThanks @petermuessig! - fix(ui5-tooling-modules): prevent substitute collision when bare package name resolves directly to a componentFor Web Component packages whose
package.jsonexports["."](ormain/module) points directly at a single component file (e.g.@ui5/webcomponents-geomap), importing the bare package name caused a collision: the substitute mechanism claimed the package-level module slot (@ui5/webcomponents-geomap.js) before the UI5 library descriptor could be written there, resulting in an empty/missing library descriptor and a confusing substitute warning.lookupWebComponentsClassnow short-circuits whensource === npmPackage(bare package name, no sub-path), returningundefinedso the package-level resolver handles the slot correctly. An actionable error is logged telling the consumer which explicit sub-path to use instead.
Fixes 1
Notes
Patch Changes
-
#1468
ec56483Thanks @petermuessig! - fix(ui5-tooling-modules): restore rewriting of slashed qualified names in Web Component wrappersWhen
replaceDashes/removeScopePrefix/sanitizeNpmPackageNameis active, the generator now emits sanitized slashed qualified names (e.g.ui5/webcomponents_fiori). The post-processing rewrite loop inutil.jswas only searching for the raw npm package name (@ui5/webcomponents-fiori) in slashed positions, sodesigntimepaths and@alias/@type module:JSDoc comments were no longer prefixed with the project namespace.Adds a slashed-sanitized search pass (guarded against the no-sanitization default so output is byte-identical when sanitization flags are off) ordered before the raw-name pass to prevent double-prefixing.
-
Features 1
Notes
Minor Changes
-
#1466
fd8e7ffThanks @petermuessig! - feat: addreplaceDashesoption and consistently apply name-sanitization to generated UI5 qualified namesIntroduces a new standalone
replaceDashesboolean option (task-only) that replaces dashes with underscores in module paths when usingaddToNamespace. ThesanitizeNpmPackageNamemaster flag now explicitly enables bothremoveScopePrefixandreplaceDashes.Both flags are now forwarded into the Web Components plugin so the
WebComponentRegistryapplies the same transformations to the generated UI5 qualified names (.extend("...")calls) asrewriteDepapplies to module paths — keeping class names and file paths in sync (e.g.webc-package.MyControl→webc_package.MyControl).The deprecated alias
removeScopePrecederforremoveScopePrefixcontinues to be accepted.
-
Features 1, Fixes 1
Notes
Minor Changes
-
#1462
c2bba4aThanks @akudev! - feat(ui5-tooling-modules): replace@typescript-eslint/typescript-estreewithoxc-parserTypeScript 7 ships without a programmatic API, which breaks
@typescript-eslint/typescript-estree(and its transitivets-api-utilsdependency) at load time. Sinceui5-tooling-modulesonly uses the parser for syntactic AST generation — no type checking or TypeScript program creation — this replaces it withoxc-parser, a fast Rust-based ESTree-compatible parser that handles JS, TS, JSX and TSX natively without any dependency on thetypescriptpackage.This removes the implicit
typescript <6.1.0peer dependency constraint, allowing consumers to use any TypeScript version including TypeScript 7.
Patch Changes
-
#1464
22b68a7Thanks @petermuessig! - fix(ui5-tooling-modules): restore partial-AST dependency scanning after oxc-parser migrationoxc-parseralways performs error recovery and returns a (possibly partial) program even when errors are present — matching theallowInvalidAST: truebehaviour of the replaced@typescript-eslint/typescript-estree. An earlyreturnonerrors.length > 0introduced during the migration caused files with minor parse issues to be silently skipped entirely instead of having their dependencies extracted from the recovered AST.Also removes two dead AST mutations (
argument.raw/elDep.raw) in theisArewrite path oftask.jsthat used the already-mutated value as a map key (yielding"undefined") and were never read back since AST-based code generation was replaced by regex substitution.
-
Features 1
Notes
Minor Changes
-
#1460
4e8aac3Thanks @Thodd! - feat(ui5-tooling-modules): support_ui5mappinghint on custom element membersA CEM producer can now attach a
_ui5mappingobject to a field member. The object is merged over the mapping thatWebComponentRegistrycomputes for the generated UI5 property, allowing a package to refine the mapping — e.g. force atype: "none"mapping, set an explicitto, or declare asyncOnnative event that syncs the live DOM value back into the control. A plain"property"string mapping is normalized to object form before merging.
-
Fixes 1
Notes
Patch Changes
- #1454
cc14645Thanks @petermuessig! - fix(ui5-tooling-modules): route XML namespace deps to web components namespace
- #1454
Fixes 1
Notes
Patch Changes
- #1445
38f7867Thanks @thomas-laussegger! - Respect object-stylebrowsermappings when resolving a package's selected entry module.
- #1445
Fixes 1
Notes
Patch Changes
-
#1433
ef24543Thanks @H4ze! - Use meaningful variable names in generated UI5Control wrappersReplace generic
WebComponentBaseClasswith the actual base class name (e.g.WebComponent,HTMLElementBase) andWrapperClasswith the actual UI5 class simple name (e.g.Button,LuigiContainer) in generated AMD wrapper files. Applied to both the Rollup plugin and the CLI code path.
-
Fixes 1
Notes
Patch Changes
-
#1427
0d0762eThanks @H4ze! - fix(ui5-tooling-modules): keep metadata property keys quoted in generated control wrappersThe
create-webc-controlsCLI now formats the generated sources with prettier'squoteProps: "preserve", so metadata property names that are reserved words (e.g. HTML'sclass) stay quoted. Previously prettier's defaultas-neededemitted them unquoted which, although valid ES5+, was rejected by stricter validators (e.g. the OpenUI5 test setup).
-
Features 1
Notes
Minor Changes
-
#1424
a8a1113Thanks @Thodd! - feat(ui5-tooling-modules): addcreate-webc-controlsCLI to generate UI5 control wrappers from a custom-elements.jsonAdds a standalone, dependency-invocable CLI (
create-webc-controls) and a programmaticgenerateControls()API that process a custom elements manifest via theWebComponentRegistryand serialize the UI5 package glue plus one control wrapper per described class into an output folder. The generated UI5 namespace can be remapped independently from the npm package name (ui5Namespace) and a leading module path segment can be stripped (stripModulePrefix, e.g.dist), which enables generating wrappers for native HTML element packages such as@ui5/htmlunder a target namespace likesap.ui.core.html.elements.
-
Fixes 1
Notes
Patch Changes
-
#1418
93b881aThanks @petermuessig! - fix(webcomponents): avoid applying method-wrapping mixins twice in a wrapper inheritance chainMessageMixinandLabelEnablementinstall method wrappers (destroy,setLabelFor,exit,setRequired, ...) by capturing the previous method into a shared prototype slot that the wrapper resolves viathisat call time. Emitting them on both a class and its superclass (e.g.DateRangePicker extends DatePicker,MultiInput extends Input) made the wrapper capture the ancestor's already-wrapped method and call itself — an infinite recursion (RangeError: Maximum call stack size exceeded) the first time that method runs, e.g. ondestroy()during view re-instantiation or when routing away. These mixins are now emitted only on the topmost ancestor that introduces them; subclasses inherit the wrapped methods.EnabledPropagatoris intentionally left unchanged — it captures via a per-wrapper closure, so nested application is safe.
-
Fixes 1
Notes
Patch Changes
- #1412
6d989b3Thanks @petermuessig! - Fix recognition of native (non-UI5) Web Components whose components extendHTMLElementdirectly instead ofUI5Element(regression since3.36.0, #1410).- Guard the superclass lookup in
WebComponentRegistry#connectSuperclassagainst an undefinedsuperclassLookupName(?.startsWith), which previously crashed withCannot read properties of undefined (reading 'startsWith')for web components without a resolvable superclass. - In
rollup-plugin-webcomponents, treat a custom element without a UI5 superclass as a native Web Component: load only the component module itself instead of prepending animportof the package or of@ui5/webcomponents-base(which such components neither need nor understand — no scoping or package runtime is required). The generated UI5 control wrapper imports theWebComponentbase class accordingly and skips the JSDoc superclass serialization when the superclass metadata is missing. - Add a
webc-packageshowcase (a plainHTMLElement-basedCustomAlertButtonwith a Custom Elements Manifest) plus a regression test and snapshot, and consume it from theui5-tsappshowcase.
- Guard the superclass lookup in
- #1412
Fixes 1
Notes
Patch Changes
- #1406
535ec0fThanks @petermuessig! - SyncdefaultValueserialization betweenrollup-plugin-webcomponentsand the Handlebarsjsonhelper so the generated UI5 metadata is identical regardless of code path.- In
rollup-plugin-webcomponents, pass a replacer toJSON.stringifythat mirrors the Handlebars helper: dropundefined/"undefined"defaults, keep""as-is, andJSON.parseeverything else so booleans, numbers, objects, and quoted strings come out as proper JSON values (e.g.trueinstead of"true","Button"instead of'"Button"'). - Drop non-parseable values with a warning instead of emitting invalid JSON.
- Added cross-reference comments on both sides to keep the two implementations in sync.
- In
- #1406
Fixes 1
Notes
Patch Changes
- #1404
f3244a2Thanks @petermuessig! - Fix JSDoc generation for enum types anddefaultValuehandling in the generated UI5 metadata.- Use the derived UI5 class name (instead of the raw enum name) in the
@ui5-module-overridedirective emitted byJSDocSerializer, so the override matches the generated module. - Emit
moduleType: module:<slashed-qualified-name>for enum-typed properties so the downstream JSDoc build/validation can resolve enum references. - Track
_ui5QualifiedNameSlashesand_derivedUi5ClassNameon enum definitions when ingesting the custom-elements metadata. - Drop the ad-hoc
defaultValuecast and the string-escape stripping; pass the rawpropDef.defaultthrough so numeric, boolean, and object defaults survive code generation. - Special-case
defaultValuein the Handlebarsjsonhelper to inject literal values without quoting, and to omit the property when the default is"undefined".
- Use the derived UI5 class name (instead of the raw enum name) in the
- #1404
Fixes 1
Notes
Patch Changes
- #1401
55f9a53Thanks @petermuessig! - Restore emission of the replacement module for"module"-typed entry chunks in rollup-plugin-webcomponents.js. c61afbd6 introduced a re-export stub at the original module id so that consumers importing a Web Component module directly (rather than via its package) still resolve through the generated UI5 wrapper. #1310 later added the"module"type toresolveId/loadto prepend the@ui5/webcomponents-baseimport for such entries, but in doing so changed thegenerateBundleguard fromif (type)toif (type && type !== "module")— silently dropping the replacement stub and breaking direct imports of Web Component modules again. The guard is restored and the"module"branch now emits the samesap.ui.define([...])re-export the other types do.
- #1401
Fixes 2
Notes
Patch Changes
-
#1400
848bc70Thanks @petermuessig! - Detect custom Web Components via a newWebComponentRegistryHelper.isCustomElement(classDef)predicate that walks the full superclass chain (skipping theUI5Elementbase class itself, which is paradoxically flagged as a custom element in the metadata). Replaces an inlined check inrollup-plugin-webcomponents.jswhose hand-rolled superclass walk only looked at the direct superclass and could loop on aconst-bound class reference. When a class is recognized as a custom element only via inheritance, a warning is now logged so the upstreamcustom-elements.jsoncan be fixed to flag the subclass directly. -
#1398
b4153faThanks @petermuessig! - Guard the complex-type lookup in WebComponentRegistry#parseComplexType against type references that have nomodule.WebComponentRegistryHelper.deriveCacheKeyreturnsundefinedfor such references, which previously caused the cross-package lookup and "global import" fallback to misfire (e.g. loggingReference package '…' for complex type '…' not foundand producing unusable cache entries). WhentypeInfoRef.moduleis missing, skip the complex-type resolution entirely and fall through to theanyfallback.
-
Fixes 1
Notes
Patch Changes
-
#1386
f96206fThanks @petermuessig! - fix(ui5-tooling-modules): keep Node.js 20 support by holdingignore-walkat^8.0.0ignore-walk@9is a Node-engines-only bump (no API changes) that raises the required Node.js version to^22.22.2 || ^24.15.0 || >=26.0.0. Since the only usage site is unchanged between v8 and v9, downgrade to^8.0.0so the package keeps working on Node.js 20 (^20.17.0 || >=22.9.0). SeeDEPENDENCIES.mdfor the rationale and the conditions under which this hold-back can be lifted.
-
Fixes 1
Notes
Patch Changes
-
#1384
81eb56cThanks @petermuessig! - fix(ui5-tooling-modules): align@implementsJSDoc with theinterfacesmetadata declaration in generated WebComponent wrappersThe generated wrappers (
dist/gen/.../<Component>-dbg.js) emitted an@implementsJSDoc that did not match theinterfacesmetadata declaration it was meant to describe. The interfaces declaration was already correct (e.g.....dist.Button.IButton— the interface as a sibling of its host class module), but the JSDoc was hand-built from${this.namespace}.${interfaceDef.name}and dropped thedist/<Class>segment entirely.The JSDoc emission now reuses the precomputed
_ui5QualifiedNameSlashesso it is built from the same source of truth as the metadata, producing the proper named-export module shape (slashes in the module path, dot before the named export, e.g.module:.../dist/Button.IButton). JSDoc and metadata are now in lockstep by construction.
-
Fixes 1
Notes
Patch Changes
- #1373
3c544b7Thanks @petermuessig! - HardenrewriteDeppath-segment stripping to defeat crafted inputs like....//that previously left a residual../. Addresses CodeQL alertjs/incomplete-multi-character-sanitization(#268).
- #1373
Features 1, Fixes 2
Notes
Minor Changes
- #1370
dd71c42Thanks @petermuessig! - Replacenode-fetch/cross-fetch/isomorphic-fetch(and any of their subpath imports) with a virtual rollup shim that re-exportsglobalThis.fetch,Headers,Request,Response,Blob,File,FormData, plus inertAbortError/FetchError/isRedirectstubs. The shim is hooked into the rollup chain before commonjs/polyfill resolution so the Node-only sub-graph (fetch-blob,fs.promises,node:net, …) never enters the browser bundle. Fixes the"isIP" is not exported by "polyfill-node.net.js"error thatnode-fetch@3introduced.
Patch Changes
-
#1370
dd71c42Thanks @petermuessig! - Bumpminimatchfrom v7 to v10. v9 dropped the default export, so the fiverequire("minimatch")sites were switched to the named exportconst { minimatch } = require("minimatch"). The runtime call shapeminimatch(path, pattern)is unchanged. minimatch 8 raised the Node floor to 20+, which already matches the workspace engines (Node 22 in CI). -
#1370
dd71c42Thanks @petermuessig! - Augment the bundlednode:utilpolyfill withTextEncoder/TextDecoderexports out of the box (previously consumers had to drop a 720-line_polyfill-overrides_/util.jscopy of the upstream polyfill into every app). Augmentations are registered via aPOLYFILL_AUGMENTATIONSmap keyed by Node built-in name; entries are appended verbatim to the upstream polyfill source as the bundler loads it, and tree-shaking strips appended exports that nothing imports. Per-project_polyfill-overrides_/directories remain available for app-specific overrides that should not become global defaults.
All notable changes to this project will be documented in this file. See Conventional Commits for commit guidelines.
- #1370
Notes
Note: Version bump only for package ui5-tooling-modules
Notes
Note: Version bump only for package ui5-tooling-modules
Features 1, Fixes 2
Fixes 3
Notes
Note: Version bump only for package ui5-tooling-modules
Notes
Note: Version bump only for package ui5-tooling-modules
Notes
Note: Version bump only for package ui5-tooling-modules
Notes
Note: Version bump only for package ui5-tooling-modules
Notes
Note: Version bump only for package ui5-tooling-modules
Notes
Note: Version bump only for package ui5-tooling-modules
Breaking 1, Features 2, Fixes 1
Notes
Note: Version bump only for package ui5-tooling-modules
Notes
Note: Version bump only for package ui5-tooling-modules
Notes
Note: Version bump only for package ui5-tooling-modules
Notes
Note: Version bump only for package ui5-tooling-modules
Notes
Note: Version bump only for package ui5-tooling-modules
Notes
Note: Version bump only for package ui5-tooling-modules
Breaking 26, Features 1, Other 2
Notes
- Typedefs (#635) (841c6e4), closes #635 #617 #606
- adding Typedefs to packages (#634) (19a5b72), closes #634 #617 #606
Features
BREAKING CHANGES
-
new package manager
-
refactor: updated tests to pass with pnpm
-
refactor: iasync still failing
-
feat(ui5-tooling-modules): support pnpm / node_modules symlinks
-
fix(ui5-app): make Karma work with pnpm
-
chore(ui5-app): remove uiveri5 from sample
-
chore(ui5-app): add updated wdio.conf
-
fix: make prettier and eslint work with pnpm
-
fix: fix cf_dest tests
restructured tests and added node_modules as symlink
-
fix(ui5-app): adding eslint for wdio and mocha
-
chore(ui5-middleware-cfdestination): cleanup
-
feat(ui5-tooling-modules): add bundling support for AMD
-
chore(ui5-tooling-modules): cleanup
-
new package manager
-
refactor: updated tests to pass with pnpm
-
refactor: iasync still failing
-
feat(ui5-tooling-modules): support pnpm / node_modules symlinks
-
fix(ui5-app): make Karma work with pnpm
-
chore(ui5-app): remove uiveri5 from sample
-
chore(ui5-app): add updated wdio.conf
-
fix: make prettier and eslint work with pnpm
-
fix: fix cf_dest tests
restructured tests and added node_modules as symlink
-
fix(ui5-app): adding eslint for wdio and mocha
-
chore(ui5-middleware-cfdestination): cleanup
-
feat(ui5-tooling-modules): add bundling support for AMD
-
chore(ui5-tooling-modules): cleanup
Breaking 26, Features 1, Fixes 1
Notes
Bug Fixes
Features
BREAKING CHANGES
-
new package manager
-
refactor: updated tests to pass with pnpm
-
refactor: iasync still failing
-
feat(ui5-tooling-modules): support pnpm / node_modules symlinks
-
fix(ui5-app): make Karma work with pnpm
-
chore(ui5-app): remove uiveri5 from sample
-
chore(ui5-app): add updated wdio.conf
-
fix: make prettier and eslint work with pnpm
-
fix: fix cf_dest tests
restructured tests and added node_modules as symlink
-
fix(ui5-app): adding eslint for wdio and mocha
-
chore(ui5-middleware-cfdestination): cleanup
-
feat(ui5-tooling-modules): add bundling support for AMD
-
chore(ui5-tooling-modules): cleanup
-
chore: fix code style
-
fix(ui5-task-flatten-library): support files without extensions
-
refactor: updated tests to pass with pnpm
-
feat(ui5-tooling-modules): support pnpm / node_modules symlinks
-
fix: make prettier and eslint work with pnpm
-
fix: update actions, lerna, vscode for pnpm
-
chore: only run test on tooling extensions
-
chore: use sequential tests for ava
-
chore: add @ui5/cli dev dependency for ava tests
-
chore: enable support for local act GH action tests
-
chore: add docu for local GitHub action execution
-
chore: docu cleanup
-
chore: re-add ncu scripts
Co-authored-by: Peter Muessig peter.muessig@sap.com
-
Notes
Note: Version bump only for package ui5-tooling-modules
Notes
Note: Version bump only for package ui5-tooling-modules
Notes
Note: Version bump only for package ui5-tooling-modules
Notes
Note: Version bump only for package ui5-tooling-modules
Others providing
Compare all 42 on the Build and dev-server tooling page →- UI5 ToolsUI5 ToolsA VS Code extension for UI5 developers that serves, proxies, builds and deploys UI5 projects from one workspace-wide configuration, with live reload, a Gateway deployer and a BSP importer.independent, ui5VS Code extension to serve, proxy, build and deploy UI5 projects
- ui5-middleware-route-proxyui5-middleware-route-proxyA UI5 server middleware that forwards requests matching a route prefix to a backend host, configured per route in ui5.yaml, with credentials read from a .env file rather than the yaml.independent, ui5UI5 server middleware proxying route prefixes to a backend
- ui5-task-cachebuster-indexingui5-task-cachebuster-indexingA UI5 builder task that copies the build output into a timestamped folder inside dist so the UI5 cachebuster can resolve it; it supports timestamps only, not the hash mode.independent, ui5UI5 builder task preparing build output for the cachebuster
- ui5-task-transpile-genui5-task-transpile-genA UI5 builder task that transpiles ES6 to ES5, including async/await, with Babel at build time, registered in ui5.yaml with a bundle definition that includes the regenerator runtime.independent, ui5UI5 builder task transpiling ES6 to ES5 with Babel
- ui5-middleware-odata-recorderui5-middleware-odata-recorderA UI5 server middleware that records the OData traffic a running app makes against a real backend and writes entity JSON files and metadata.xml that the Fiori elements mock server can replay.independent, ui5UI5 middleware recording OData traffic as mock server datasets
- ui5-plugin-loaderui5-plugin-loaderA UI5 Tooling v4 extension that registers a project's other extensions itself: one entry in ui5.yaml, and every dependency carrying a ui5-plugin-loader.json manifest is mounted as middleware and as a build task.independent, ui5UI5 Tooling v4 extension that registers other extensions
- ui5-deployerui5-deployerA custom module for UI5 Tooling that deploys Fiori/UI5 apps to SAP NetWeaver ABAP, SAP Cloud Platform Neo or Cloud Foundry, configured in a deployer section of ui5.yaml.independent, ui5UI5 Tooling module deploying Fiori/UI5 apps to SAP systems
- ui5-task-dts-generatorui5-task-dts-generatorA UI5 builder task that generates d.ts files, TypeScript type declarations, during the build of a UI5 library written in JavaScript, by wrapping @ui5/dts-generator.independent, ui5UI5 builder task generating d.ts type declarations
- ui5-task-minifierui5-task-minifierA UI5 builder task that minifies the HTML, CSS and JSON files the UI5 builder leaves as they are, with one switch per file type, using html-minifier-terser and clean-css.independent, ui5UI5 builder task minifying HTML, CSS and JSON files
- ui5-middleware-oidcui5-middleware-oidcA UI5 Tooling server middleware that puts an OpenID Connect login in front of the UI5 dev server, built on express-openid-connect, which receives its configuration block as written.independent, ui5UI5 dev server middleware adding an OpenID Connect login
- generator-ui5-library-af-deploygenerator-ui5-library-af-deployA Yeoman generator that writes the SAP BTP Application Frontend deployment configuration, mta.yaml, ui5-deploy.yaml, xs-app.json and xs-security.json, into an existing UI5 library project.independent, ui5Yeoman generator for Application Frontend config in UI5 libraries
- ui5-middleware-destinationui5-middleware-destinationA UI5 Tooling server middleware that proxies requests to backends named in WebIDE-style destination files and serves the routes of a neo-app.json, with Basic Authentication only.independent, ui5UI5 Tooling middleware proxying destinations and neo-app.json routes
- ui5-task-check-eocpui5-task-check-eocpA UI5 builder task that matches the UI5 version in ui5.yaml against the versions retrieved from ui5.sap.com and warns during the build once that version's End of Cloud Provisioning quarter has been reached.independent, ui5UI5 build task warning when the app's UI5 version reaches EOCP
- @ui5/cli@ui5/cliThe UI5 Tooling command line for project setup, the local dev server and the build, which defines a UI5 project's shape and its two extension points, custom middleware and custom tasks.sap official, ui5UI5 Tooling command line for project setup, dev server and build
- ui5-task-btp-manifestui5-task-btp-manifestA UI5 Tooling custom task that writes the surrounding app's sap.cloud service name into the bundled Spreadsheet Importer's manifest at build time, so the two match on SAP BTP.community org, ui5UI5 Tooling task writing the service name into the importer manifest
- ui5-middleware-approuterui5-middleware-approuterA UI5 CLI middleware that puts @sap/approuter in front of the UI5 dev server, proxying it to Cloud Foundry or XS Advanced destinations during development.community org, ui5UI5 CLI middleware proxying the dev server through @sap/approuter
- ui5-middleware-capui5-middleware-capA UI5 CLI middleware that runs a CDS server inside the UI5 dev server, mounted at a path the UI5 project configures, so one command serves the app and its CAP services.community org, ui5UI5 CLI middleware running a CDS server inside the UI5 dev server
- ui5-middleware-hmrui5-middleware-hmrAn experimental UI5 middleware for hot module replacement, swapping a changed module in during development instead of reloading the whole page.community org, ui5Experimental UI5 middleware for hot module replacement
- ui5-middleware-iasyncui5-middleware-iasyncA UI5 dev-server middleware built on browsersync.io that syncs user interactions across connected browsers over a websocket, replaying an action from one browser in the others for manual testing.community org, ui5UI5 middleware syncing interactions across browsers over websocket
- ui5-middleware-indexui5-middleware-indexA UI5 dev-server middleware that delivers a configured welcome page, index.html by default, for the root path instead of the ui5-server directory listing.community org, ui5UI5 middleware serving a chosen welcome page at the root path
- ui5-middleware-livereloadui5-middleware-livereloadA dev-server middleware that adds live reload to the UI5 dev server, reloading the page when the sources in the app's webapp folder change.community org, ui5Live reload middleware for the UI5 dev server
- ui5-middleware-oneloginui5-middleware-oneloginA UI5 dev-server middleware that logs into a system such as SAP Gateway with headless Playwright on the first request and reuses the session cookie for every later request.community org, ui5UI5 middleware logging in with Playwright and reusing the session
- ui5-middleware-serveframeworkui5-middleware-serveframeworkA UI5 middleware that serves a UI5 framework built on the local machine to the dev server, in place of a framework version resolved another way.community org, ui5UI5 middleware serving a locally built UI5 framework
- ui5-middleware-servestaticui5-middleware-servestaticA UI5 dev-server middleware that serves static resources from a filesystem path or an installed npm package path, built on serve-static, with either path settable through an environment variable.community org, ui5UI5 middleware serving static resources from a path or npm package
- ui5-middleware-simpleproxyui5-middleware-simpleproxyA UI5 dev-server middleware that proxies requests from the local dev server to a backend system, so the app can reach the backend's services during development.community org, ui5Dev-server middleware proxying requests to a backend system
- ui5-middleware-ui5ui5-middleware-ui5A UI5 middleware that lets one UI5 application be included as a dependency of another and served through that application's dev server.community org, ui5UI5 middleware including one UI5 application in another
- ui5-middleware-webjarsui5-middleware-webjarsA UI5 dev-server middleware that loads JAR files from a configured path and serves the static resources bundled inside them, following the WebJars convention of META-INF/resources/.community org, ui5UI5 middleware serving static resources from JAR files (WebJars)
- ui5-middleware-websocketui5-middleware-websocketUI5 middleware utilities that add WebSocket support to Express-based dev servers such as the UI5 server, which has no WebSocket channel of its own.community org, ui5WebSocket support for Express-based dev servers such as UI5's
- ui5-task-cachebusterui5-task-cachebusterA UI5 builder task that cachebusts a standalone UI5 application by moving its build output into a timestamped subfolder and pointing index.html's resource roots at it.community org, ui5UI5 builder task cachebusting standalone UI5 applications
- ui5-task-copyrightui5-task-copyrightA UI5 builder task that appends copyright headers to TypeScript, JavaScript and XML files on every build, so the header is not added to each source file by hand.community org, ui5UI5 builder task appending copyright headers to source files
- ui5-task-flatten-libraryui5-task-flatten-libraryA UI5 builder task that flattens a library's build output, removing the project namespace and resources folder for deployment to SAP NetWeaver, now also offered by the UI5 CLI itself.community org, ui5UI5 builder task flattening library output for SAP NetWeaver
- ui5-task-i18ncheckui5-task-i18ncheckA UI5 builder task that cross-checks every XML view against the app's i18n properties files and logs a warning where a translation is missing; views created in JavaScript are not checked.community org, ui5UI5 builder task checking XML views for missing i18n texts
- ui5-task-minify-xmlui5-task-minify-xmlA UI5 builder task that minifies XML resources such as views and fragments, which a plain UI5 build otherwise ships unminified.community org, ui5UI5 builder task minifying XML views and fragments
- ui5-task-pwa-enablerui5-task-pwa-enablerA UI5 builder task that turns a UI5 application into a progressive web app by generating a web manifest and a service worker under one of five caching strategies.community org, ui5UI5 builder task turning a UI5 app into a progressive web app
- ui5-task-zipperui5-task-zipperA build task for the UI5 tooling that packages the UI5 build result, the webapp, as a zip archive at the end of the build.community org, ui5Build task packaging the UI5 build result as a zip archive
- ui5-tooling-lessui5-tooling-lessA UI5 CLI extension, a build task and a dev-server middleware, that compiles an app's Less files into CSS at build time and live while the UI5 server runs.community org, ui5UI5 CLI extension compiling Less files into CSS
- ui5-tooling-stringreplaceui5-tooling-stringreplaceA UI5 CLI extension for string replacement during the build, for placeholders or tokens in source files that have to be replaced at build time.community org, ui5UI5 CLI extension for string replacement during the build
- ui5-tooling-transpileui5-tooling-transpileA UI5 CLI extension that transpiles modern JavaScript or TypeScript during the UI5 build, with a transformJSX option that handles JSX and TSX in the same step.community org, ui5UI5 CLI extension transpiling code during the UI5 build
- @ui5/logger@ui5/loggerUI5 CLI's internal logger, described by its own readme as internal — it appears here because other UI5 tooling depends on it.sap official, ui5Internal logger of the UI5 CLI
- @ui5/middleware-code-coverage@ui5/middleware-code-coverageUI5 CLI server middleware that instruments a project's JavaScript files with Istanbul as the dev server sends them, and generates the coverage report from the records the OpenUI5 QUnit tests send back.sap official, ui5UI5 CLI middleware for Istanbul code coverage
- @ui5/tooling-webc@ui5/tooling-webcDeprecated UI5 Tooling extensions that generate UI5 library wrapper projects for UI5 Web Components and serve them during development; the README points to ui5-tooling-modules instead.sap official, ui5Deprecated UI5 Tooling extensions for UI5 Web Components wrappers
Details
Sources
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
Flavors
“This allows to load multiple versions of UI5 Web Components into a single application without conflicts.” — ui5-community/ui5-ecosystem-showcase — README (packages/ui5-tooling-modules)
Contributors
Show 34 more
History in the atlas
- First seen.
For your agent
- Ref
artifact:ui5-community-ui5-tooling-modules- JSON
- /artifacts/ui5-community-ui5-tooling-modules.json
- MCP
- Connecting an agent