ECMAScript Support¶
UI5 Tooling offers general support for ES2023
ECMAScript features. While a ui5 build
is executed, UI5 Tooling analyses a project's code. Depending on the project type, you have to consider some restrictions regarding the usage of certain ECMAScript syntax.
UI5 Tooling Version | Supported ECMAScript Version | Note |
---|---|---|
v3.11+ | ECMAScript 2023 | |
v3.0+ | ECMAScript 2022 | |
v2.0+ | ECMAScript 2009/ES5 | Note that code up to ECMAScript 2020 can be parsed, however required code analysis might not work correctly for specific language features |
The following section describes all restrictions grouped by the kind of ECMAScript language feature. To get more insights into the code analysing executed by UI5 Tooling check out Code Analysis.
Language Features with Restrictions¶
The following sections describe the restrictions grouped by the ECMAScript language feature.
JavaScript modules¶
In general, UI5 Tooling only analyzes JavaScript files of type script
. JavaScript Modules are not analyzed.
UI5 Tooling and the UI5 Runtime does not support the usage of export
and import
of JavaScript Modules. Therefore, sap.ui.define
has to be used.
sap.ui.define([
"ModuleA",
"ModuleB"
], function(ModuleA, ModuleB) {
return ModuleA.extend("ModuleC", {});
});
import ModuleA from "ModuleA";
import ModuleB from "ModuleB";
export default class ModuleC extends ModuleA {};
Template Literal¶
Template Literals without an expressions can be used in all places where string literals can be used. However, since UI5 Tooling will attempt a static code analysis for certain calls to UI5 API, Template Literals with one or more expressions (e.g. Hello ${planets[2]}
) can't be used in the scenarios described below.
Template Literal in sap.ui.define
or sap.ui.require
¶
Template Literals with one or more expressions inside a sap.ui.define
or sap.ui.require
call are not supported.
sap.ui.define([
`ModuleA`,
`ModuleB`
], function(ModuleA, ModuleB) {
});
const i = `B`;
sap.ui.define([
`ModuleA`,
`Module${i}`
], function(ModuleA, ModuleB) {
});
The same rule applies also for the usage of deprecated or no longer recommended APIs jQuery.sap.declare
, jQuery.sap.declare
, define
, require
, require.predefine
, sap.ui.predefine
, sap.ui.requireSync
and sap.ui.require.preload
.
Template Literal in Smart Template Declaration¶
When declaring a Smart Template using a Template Literal with one or more expressions in the name of the Smart Template is not supported.
sap.ui.define([
`sap/suite/ui/generic/template/lib/TemplateAssembler`
], function(TemplateAssembler) {
return TemplateAssembler.getTemplateComponent(getMethods,
`sap.suite.ui.generic.templates.Page.Component`, {
metadata: {
properties: {
templateName: {
type: `string`,
defaultValue: `sap.suite.ui.generic.templates.Page.view.Page`
}
},
manifest: `json`
}
}
);
});
sap.ui.define([
`sap/suite/ui/generic/template/lib/TemplateAssembler`
], function(TemplateAssembler) {
const name = `Component`;
return TemplateAssembler.getTemplateComponent(getMethods,
`sap.suite.ui.generic.templates.Page.${name}`, {
metadata: {
properties: {
templateName: {
type: `string`,
defaultValue: `sap.suite.ui.generic.templates.Page.view.Page`
}
},
manifest: `json`
}
}
);
});
Template Literal in XMLComposite Declaration¶
The XMLComposite control is deprecated since version UI5 1.88. Nevertheless UI5 Tooling will attempt to analyze the declaration of any such controls in a project.
Declaring an XMLComposite control using a Template Literal with one or more expressions in the name, is not supported.
sap.ui.define([
`sap/ui/core/XMLComposite`
], function(XMLComposite) {
return XMLComposite.extend(`composites.MyComposite`, {}
});
sap.ui.define([
`sap/ui/core/XMLComposite`
], function(XMLComposite) {
const name = `MyComposite`;
return XMLComposite.extend(`composites.${name}`, {});
});
Template Literal in sap/ui/core/Core#initLibrary Call¶
A library is typically initialized via an accompanying library.js
. Within that file, the object which is supplied to the sap/ui/core/Core#initLibrary
method, must not use a Template Literal with one or more expressions for the library name.
sap.ui.getCore().initLibrary({
name: `my.lib`
});
const libraryName = `lib`;
sap.ui.getCore().initLibrary({
name: `my.${libraryName}`
});
Reserved Variable Names in a Template Literal¶
While UI5 Tooling performs a build placeholders are replaced with a values offered by the build. For example ${version}
is replaced with the actual version defined in the package.json of the project. Therefore it is required to not use any Template Literal where any expression contains variable with following names:
version
project.version
buildtime
copyright
const myVersion = `1.2`;
const transformedVersion `v${myVersion}`
const version = `1.2`;
const transformedVersion `v${version}`
UI5 Tooling searches for the exact match of ${version}
, so with adding whitespaces before and after the variable name ${ version }
UI5 Tooling won't replace this occurence. This can be enforced by the dedicated ESLint config template-curly-spacing with option always
.
Spread Element¶
A Spread Element can be used in all places, except the following.
Spread Element in sap.ui.define
or sap.ui.require
¶
A Spread Element as a parameter in a sap.ui.define
or sap.ui.require
call is not supported.
sap.ui.define([
"ModuleA",
"ModuleB"
], function(ModuleA, ModuleB) {
});
const dependencies = ["ModuleA", "ModuleB"];
sap.ui.define([
...dependencies
], function(ModuleA, ModuleB) {
});
The same rule applies also for the usage of deprecated or no longer recommended APIs jQuery.sap.declare
, jQuery.sap.declare
, define
, require
, require.predefine
, sap.ui.predefine
, sap.ui.requireSync
and sap.ui.require.preload
.
Spread Element in Smart Template Declaration¶
When declaring a Smart Template, the usage of a Spread Element in the configuration is not supported.
sap.ui.define([
"sap/suite/ui/generic/template/lib/TemplateAssembler"
], function(TemplateAssembler) {
return TemplateAssembler.getTemplateComponent(getMethods,
"sap.suite.ui.generic.templates.Page.Component", {
metadata: {
properties: {
templateName: {
type: "string",
defaultValue: "sap.suite.ui.generic.templates.Page.view.Page"
}
},
manifest: "json"
}
}
);
});
sap.ui.define([
"sap/suite/ui/generic/template/lib/TemplateAssembler"
], function(TemplateAssembler) {
const myTemplate = {
templateName: {
type: "string",
defaultValue: "sap.suite.ui.generic.templates.Page.view.Page"
}
};
return TemplateAssembler.getTemplateComponent(getMethods,
"sap.suite.ui.generic.templates.Page.Component", {
metadata: {
properties: {
...myTemplate
}
manifest: "json"
}
}
);
});
Spread Element in XMLComposite Declaration¶
The XMLComposite control is deprecated since version UI5 1.88. Nevertheless UI5 Tooling will attempt to analyze the declaration of any such controls in a project.
When declaring an XMLComposite, the usage of a Spread Element in the configuration is not supported.
sap.ui.define([
"sap/ui/core/XMLComposite"
], function(XMLComposite) {
return XMLComposite.extend("composites.MyComposite", {
fragment: "composites.custom.MyComposite"
}
});
sap.ui.define([
"sap/ui/core/XMLComposite"
], function(XMLComposite) {
const myXMLComposite = {
fragment: "composites.custom.MyComposite"
};
return XMLComposite.extend(`composites.MyComposite`, {
...myXMLComposite
});
});
Spread Element in sap/ui/core/Core#initLibrary Call¶
A library is typically initialized via an accompanying library.js
. Within that file, the object which is supplied to the sap/ui/core/Core#initLibrary
method, must not use a Spread Element.
sap.ui.getCore().initLibrary({
name: "my.lib"
});
const mylib = {
name: "my.lib"
};
sap.ui.getCore().initLibrary({
...mylib
});
Object Expression¶
An Object Expression can be used in all places except in following places.
Object Expression in sap.ui.define
or sap.ui.require
¶
An Object Expression as a parameter in a sap.ui.define
or sap.ui.require
call is not supported.
sap.ui.define([
"Bar"
], function(Bar){
});
const dependency = "Bar";
sap.ui.define([
dependency
], function(Bar){
});
The same rule applies also for the usage of deprecated or no longer recommended APIs jQuery.sap.declare
, jQuery.sap.declare
, define
, require
, require.predefine
, sap.ui.predefine
, sap.ui.requireSync
and sap.ui.require.preload
.
Object Expression in Smart Template Declaration¶
When declaring a Smart Template, the usage of an Object Expression in the configuration is not supported.
sap.ui.define([
"sap/suite/ui/generic/template/lib/TemplateAssembler"
], function(TemplateAssembler) {
return TemplateAssembler.getTemplateComponent(getMethods,
"sap.suite.ui.generic.templates.Page.Component", {
metadata: {
properties: {
templateName: {
type: "string",
defaultValue: "sap.suite.ui.generic.templates.Page.view.Page"
}
},
manifest: "json"
}
}
);
});
sap.ui.define([
"sap/suite/ui/generic/template/lib/TemplateAssembler"
], function(TemplateAssembler) {
const key = "templateName"
return TemplateAssembler.getTemplateComponent(getMethods,
`sap.suite.ui.generic.templates.Page.${name}`, {
metadata: {
properties: {
[key]: {
type: "string",
defaultValue: "sap.suite.ui.generic.templates.Page.view.Page"
}
}
manifest: "json"
}
}
);
});
Object Expression in XMLComposite Declaration¶
The XMLComposite control is deprecated since version UI5 1.88. Nevertheless UI5 Tooling will attempt to analyze the declaration of any such controls in a project.
When declaring an XMLComposite, the usage of an Object Expression in the configuration is not supported.
sap.ui.define([
"sap/ui/core/XMLComposite"
], function(XMLComposite) {
return XMLComposite.extend("composites.MyComposite", {
fragment: "composites.custom.MyComposite"
}
});
sap.ui.define([
"sap/ui/core/XMLComposite"
], function(XMLComposite) {
const key = "fragment";
return XMLComposite.extend("composites.MyComposite", {
[key]: "composites.custom.MyComposite"
});
});
Object Expression in sap/ui/core/Core#initLibrary Call¶
A library is typically initialized via an accompanying library.js
. Within that file, the object which is supplied to the sap/ui/core/Core#initLibrary
method, must not use an Object Expression.
sap.ui.getCore().initLibrary({
name: "my.lib"
});
const key = "name";
sap.ui.getCore().initLibrary({
[key]: "my.lib"
});
Computed Property¶
A Computed Property can be used in all places except in following places.
Computed Property when using extend
¶
One or more Computed Property as a parameter in an UI5 Module extend
call is not supported.
sap.ui.define([
"Bar"
], function(Bar){
return Bar.extend("my.Bar" {});
});
const name = "my";
sap.ui.define([
"Bar"
], function(Bar){
return Bar.extend(name + ".Bar", {});
});
Computed Properties in sap/ui/core/Core#initLibrary Call¶
A library is typically initialized via an accompanying library.js
. Within that file, the object which is supplied to the sap/ui/core/Core#initLibrary
method, must not use an Computed Property.
sap.ui.getCore().initLibrary({
name: "my.lib"
});
const name = "my";
sap.ui.getCore().initLibrary({
name: name + ".lib"
});
Class Declaration¶
If you want to generate a JSDoc build of your project and using a Class Declaration the class declaration should not be returned directly. Declare the class and return the class in a separate statement. If not JSDoc treats the the class declaration as a return statement and does not recognize any JSDoc if such is provided right above the class declaration.
sap.ui.define([
"Bar"
], function(Bar){
/**
* JSDoc block here
*/
class Foo extends Bar {
make () {}
}
return Foo;
});
sap.ui.define([
"Bar"
], function(Bar){
/**
* JSDoc block here
*/
return class Foo extends Bar {
make () {}
}
});
Arrow Function Expression¶
If you want to generate a JSDoc build of your project and use an Arrow Function Expression the JSDoc has to be written above the arrow function and not above the sap.ui.define/sap.ui.require
command.
sap.ui.define([
"Bar"
],
/**
* JSDoc block here
*/
(Bar) => Bar.extends("Foo", {
}));
/**
* JSDoc block here
*/
sap.ui.define([
"Bar"
], (Bar) => Bar.extends("Foo", {
}));